VirtualBox

Changeset 39815 in vbox


Ignore:
Timestamp:
Jan 20, 2012 9:32:29 AM (13 years ago)
Author:
vboxsync
Message:

crOpenGL: work around Ubuntu 11.04 FBO issues

Location:
trunk/src/VBox
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/OpenGL/include/cr_glstate.h

    r39602 r39815  
    207207DECLEXPORT(void) crStateDestroyContext(CRContext *ctx);
    208208
     209CRContext * crStateSwichPrepare(CRContext *toCtx);
     210void crStateSwichPostprocess(CRContext *fromCtx);
     211
    209212DECLEXPORT(void) crStateFlushFunc( CRStateFlushFunc ff );
    210213DECLEXPORT(void) crStateFlushArg( void *arg );
  • trunk/src/VBox/GuestHost/OpenGL/include/state/cr_framebuffer.h

    r34107 r39815  
    6767DECLEXPORT(void) STATE_APIENTRY crStateFramebufferObjectDestroy(CRContext *ctx);
    6868DECLEXPORT(void) STATE_APIENTRY crStateFramebufferObjectSwitch(CRContext *from, CRContext *to);
     69
     70DECLEXPORT(void) STATE_APIENTRY crStateFramebufferObjectDisableHW(CRContext *ctx);
     71DECLEXPORT(void) STATE_APIENTRY crStateFramebufferObjectReenableHW(CRContext *fromCtx, CRContext *toCtx);
     72
    6973DECLEXPORT(GLuint) STATE_APIENTRY crStateGetFramebufferHWID(GLuint id);
    7074DECLEXPORT(GLuint) STATE_APIENTRY crStateGetRenderbufferHWID(GLuint id);
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_diff.c

    r37613 r39815  
    345345#endif
    346346}
     347
     348CRContext * crStateSwichPrepare(CRContext *toCtx)
     349{
     350    CRContext *fromCtx = GetCurrentContext();
     351
     352#ifdef CR_EXT_framebuffer_object
     353    if (fromCtx)
     354        crStateFramebufferObjectDisableHW(fromCtx);
     355#endif
     356
     357    return fromCtx;
     358}
     359
     360void crStateSwichPostprocess(CRContext *fromCtx)
     361{
     362    CRContext *toCtx = GetCurrentContext();;
     363    if (!fromCtx || !toCtx)
     364        return;
     365
     366#ifdef CR_EXT_framebuffer_object
     367    crStateFramebufferObjectReenableHW(fromCtx, toCtx);
     368#endif
     369}
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_framebuffer.c

    r37394 r39815  
    748748}
    749749
     750
     751DECLEXPORT(void) STATE_APIENTRY
     752crStateFramebufferObjectDisableHW(CRContext *ctx)
     753{
     754    if (ctx->framebufferobject.drawFB)
     755        diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, 0);
     756
     757    if (ctx->framebufferobject.readFB)
     758        diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, 0);
     759
     760    if (ctx->framebufferobject.drawFB)
     761        diff_api.DrawBuffer(GL_BACK);
     762    if (ctx->framebufferobject.readFB)
     763        diff_api.ReadBuffer(GL_BACK);
     764
     765    if (ctx->framebufferobject.renderbuffer)
     766        diff_api.BindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
     767}
     768
     769DECLEXPORT(void) STATE_APIENTRY
     770crStateFramebufferObjectReenableHW(CRContext *fromCtx, CRContext *toCtx)
     771{
     772    GLboolean fAdjustDrawReadBuffers = GL_FALSE;
     773
     774    if (fromCtx->framebufferobject.drawFB
     775            && fromCtx->framebufferobject.drawFB == toCtx->framebufferobject.drawFB)
     776    {
     777        diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, toCtx->framebufferobject.drawFB->hwid);
     778        fAdjustDrawReadBuffers = GL_TRUE;
     779    }
     780
     781    if (fromCtx->framebufferobject.readFB
     782            && fromCtx->framebufferobject.readFB == toCtx->framebufferobject.readFB)
     783    {
     784        diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, toCtx->framebufferobject.readFB->hwid);
     785        fAdjustDrawReadBuffers = GL_TRUE;
     786    }
     787
     788    if (fAdjustDrawReadBuffers)
     789    {
     790        diff_api.DrawBuffer(toCtx->framebufferobject.drawFB?toCtx->framebufferobject.drawFB->drawbuffer[0]:toCtx->buffer.drawBuffer);
     791        diff_api.ReadBuffer(toCtx->framebufferobject.readFB?toCtx->framebufferobject.readFB->readbuffer:toCtx->buffer.readBuffer);
     792    }
     793}
     794
     795
    750796DECLEXPORT(GLuint) STATE_APIENTRY crStateGetFramebufferHWID(GLuint id)
    751797{
    752798    CRContext *g = GetCurrentContext();
    753799    CRFramebufferObject *pFBO = (CRFramebufferObject*) crHashtableSearch(g->shared->fbTable, id);
    754 
     800#ifdef DEBUG_misha
     801    crDebug("FB id(%d) hw(%d)", id, pFBO ? pFBO->hwid : 0);
     802#endif
    755803    return pFBO ? pFBO->hwid : 0;
    756804}
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_context.c

    r39265 r39815  
    231231{
    232232    CRMuralInfo *mural, *oldMural;
    233     CRContext *ctx;
     233    CRContext *ctx, *oldCtx;
    234234
    235235    if (context >= 0 && window >= 0) {
     
    267267        return;
    268268    }
     269
     270    /* Ubuntu 11.04 hosts misbehave if context window switch is
     271     * done with non-default framebuffer object settings.
     272     * crStateSwichPrepare & crStateSwichPostprocess are supposed to work around this problem
     273     * crStateSwichPrepare restores the FBO state to its default values before the context window switch,
     274     * while crStateSwichPostprocess restores it back to the original values */
     275    oldCtx = crStateSwichPrepare(ctx);
    269276
    270277    /*
     
    326333    crStateMakeCurrent( ctx );
    327334
     335    crStateSwichPostprocess(oldCtx);
     336
    328337    if (oldMural != mural && crServerSupportRedirMuralFBO())
    329338    {
  • trunk/src/VBox/HostServices/SharedOpenGL/unpacker/unpack.py

    r21781 r39815  
    227227    for (i = 0 ; i < num_opcodes ; i++)
    228228    {
     229   
     230        CRDBGPTR_CHECKZ(writeback_ptr);
     231        CRDBGPTR_CHECKZ(return_ptr);
     232   
    229233        /*crDebug(\"Unpacking opcode \%d\", *unpack_opcodes);*/
    230234        switch( *unpack_opcodes )
     
    263267                break;
    264268        }
     269       
     270        CRDBGPTR_CHECKZ(writeback_ptr);
     271        CRDBGPTR_CHECKZ(return_ptr);
     272       
    265273        unpack_opcodes--;
    266274    }
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette