VirtualBox

Ignore:
Timestamp:
May 21, 2012 7:22:05 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
78074
Message:

VRDP+3D: 3D rendering speedup: avoid unnecessary host GPU->guest VRAM->VRDP data transfers

Location:
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_clear.c

    r32940 r41380  
    195195{
    196196  CRMuralInfo *mural;
     197  CRContext *ctx;
     198
    197199#ifdef VBOXCR_LOGFPS
    198200  static VBOXCRFPS Fps;
     
    424426                window = 0;
    425427
     428        ctx = crStateGetCurrent();
     429
     430    if (ctx->framebufferobject.drawFB
     431            || (ctx->buffer.drawBuffer != GL_FRONT && ctx->buffer.drawBuffer != GL_FRONT_LEFT))
     432        cr_server.curClient->currentMural->bFbDraw = GL_FALSE;
     433
    426434    if (crServerIsRedirectedToFBO())
    427435    {
     
    437445crServerDispatchFlush(void)
    438446{
     447    CRContext *ctx = crStateGetCurrent();
    439448    cr_server.head_spu->dispatch_table.Flush();
    440449
    441     if (crServerIsRedirectedToFBO())
    442     {
     450    if (!cr_server.curClient->currentMural) /* <- on window destroy this will be zero */
     451        return;
     452
     453    if (cr_server.curClient->currentMural->bFbDraw && crServerIsRedirectedToFBO())
     454    {
     455#ifdef DEBUG_misha
     456        CRASSERT(0);
     457#endif
    443458        crServerPresentFBO(cr_server.curClient->currentMural);
    444459    }
     460
     461    if (ctx->framebufferobject.drawFB
     462            || (ctx->buffer.drawBuffer != GL_FRONT && ctx->buffer.drawBuffer != GL_FRONT_LEFT))
     463        cr_server.curClient->currentMural->bFbDraw = GL_FALSE;
    445464}
    446465
     
    448467crServerDispatchFinish(void)
    449468{
     469    CRContext *ctx = crStateGetCurrent();
     470
    450471    cr_server.head_spu->dispatch_table.Finish();
    451472
    452     if (crServerIsRedirectedToFBO())
    453     {
     473    if (cr_server.curClient->currentMural->bFbDraw && crServerIsRedirectedToFBO())
     474    {
     475#ifdef DEBUG_misha
     476        CRASSERT(0);
     477#endif
    454478        crServerPresentFBO(cr_server.curClient->currentMural);
    455479    }
    456 }
     480
     481    if (ctx->framebufferobject.drawFB
     482            || (ctx->buffer.drawBuffer != GL_FRONT && ctx->buffer.drawBuffer != GL_FRONT_LEFT))
     483        cr_server.curClient->currentMural->bFbDraw = GL_FALSE;
     484}
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_context.c

    r41258 r41380  
    389389    crStateSwichPostprocess(oldCtx, cr_server.bUseMultipleContexts, mural->bUseFBO && crServerSupportRedirMuralFBO() ? mural->idFBO : 0);
    390390
     391    if (!ctx->framebufferobject.drawFB
     392            && (ctx->buffer.drawBuffer == GL_FRONT || ctx->buffer.drawBuffer == GL_FRONT_LEFT))
     393        cr_server.curClient->currentMural->bFbDraw = GL_TRUE;
     394
    391395    if (!mural->bUseFBO)
    392396    {
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_framebuffer.c

    r31808 r41380  
    6464void SERVER_DISPATCH_APIENTRY crServerDispatchBindFramebufferEXT(GLenum target, GLuint framebuffer)
    6565{
     66#ifdef DEBUG_misha
     67    GLint rfb = 0, dfb = 0;
     68#endif
    6669        crStateBindFramebufferEXT(target, framebuffer);
     70
     71    if (0==framebuffer)
     72    {
     73        CRContext *ctx = crStateGetCurrent();
     74        if (ctx->buffer.drawBuffer == GL_FRONT || ctx->buffer.drawBuffer == GL_FRONT_LEFT)
     75            cr_server.curClient->currentMural->bFbDraw = GL_TRUE;
     76    }
    6777
    6878    if (0==framebuffer && crServerIsRedirectedToFBO())
    6979    {
    7080        cr_server.head_spu->dispatch_table.BindFramebufferEXT(target, cr_server.curClient->currentMural->idFBO);
     81#ifdef DEBUG_misha
     82        Assert(0);
     83        cr_server.head_spu->dispatch_table.GetIntegerv(GL_READ_FRAMEBUFFER_BINDING_EXT, &rfb);
     84        cr_server.head_spu->dispatch_table.GetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, &dfb);
     85        if (GL_FRAMEBUFFER_EXT == target)
     86        {
     87            Assert(rfb == cr_server.curClient->currentMural->idFBO);
     88            Assert(dfb == cr_server.curClient->currentMural->idFBO);
     89        }
     90        else if (GL_READ_FRAMEBUFFER_EXT == target)
     91        {
     92            Assert(rfb == cr_server.curClient->currentMural->idFBO);
     93        }
     94        else if (GL_DRAW_FRAMEBUFFER_EXT == target)
     95        {
     96            Assert(dfb == cr_server.curClient->currentMural->idFBO);
     97        }
     98        else
     99        {
     100            Assert(0);
     101        }
     102#endif
    71103    }
    72104    else
    73105    {
    74106        cr_server.head_spu->dispatch_table.BindFramebufferEXT(target, crStateGetFramebufferHWID(framebuffer));
     107#ifdef DEBUG_misha
     108        cr_server.head_spu->dispatch_table.GetIntegerv(GL_READ_FRAMEBUFFER_BINDING_EXT, &rfb);
     109        cr_server.head_spu->dispatch_table.GetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, &dfb);
     110        if (GL_FRAMEBUFFER_EXT == target)
     111        {
     112            Assert(rfb == crStateGetFramebufferHWID(framebuffer));
     113            Assert(dfb == crStateGetFramebufferHWID(framebuffer));
     114        }
     115        else if (GL_READ_FRAMEBUFFER_EXT == target)
     116        {
     117            Assert(rfb == crStateGetFramebufferHWID(framebuffer));
     118        }
     119        else if (GL_DRAW_FRAMEBUFFER_EXT == target)
     120        {
     121            Assert(dfb == crStateGetFramebufferHWID(framebuffer));
     122        }
     123        else
     124        {
     125            Assert(0);
     126        }
     127#endif
    75128    }
    76129}
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c

    r41258 r41380  
    10351035        AssertRCReturn(rc, rc);
    10361036
     1037        if (version <= SHCROGL_SSM_VERSION_BEFORE_FRONT_DRAW_TRACKING)
     1038            muralInfo.bFbDraw = GL_TRUE;
     1039
    10371040        if (muralInfo.pVisibleRects)
    10381041        {
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_misc.c

    r41258 r41380  
    872872    crStateDrawBuffer( mode );
    873873
    874     if (cr_server.curClient->currentMural->bUseFBO && crServerIsRedirectedToFBO()
    875             && cr_server.curClient->currentMural->idFBO
    876             && !crStateGetCurrent()->framebufferobject.drawFB)
     874    if (!crStateGetCurrent()->framebufferobject.drawFB)
    877875    {
    878         switch (mode)
    879         {
    880             case GL_BACK:
    881             case GL_BACK_LEFT:
    882                 mode = GL_COLOR_ATTACHMENT0;
    883                 break;
    884             case GL_FRONT:
    885             case GL_FRONT_LEFT:
    886                 crWarning("GL_FRONT not supported for FBO mode! (0x%x)", mode);
    887                 mode = GL_COLOR_ATTACHMENT0;
    888                 break;
    889             default:
    890                 crWarning("unexpected mode! 0x%x", mode);
    891                 break;
     876        if (mode == GL_FRONT || mode == GL_FRONT_LEFT)
     877            cr_server.curClient->currentMural->bFbDraw = GL_TRUE;
     878
     879        if (cr_server.curClient->currentMural->bUseFBO && crServerIsRedirectedToFBO()
     880                && cr_server.curClient->currentMural->idFBO)
     881        {
     882            switch (mode)
     883            {
     884                case GL_BACK:
     885                case GL_BACK_LEFT:
     886                    mode = GL_COLOR_ATTACHMENT0;
     887                    break;
     888                case GL_FRONT:
     889                case GL_FRONT_LEFT:
     890                    crDebug("Setting GL_FRONT with FBO mode! (0x%x)", mode);
     891                    mode = GL_COLOR_ATTACHMENT0;
     892                    break;
     893                default:
     894                    crWarning("unexpected mode! 0x%x", mode);
     895                    break;
     896            }
    892897        }
    893898    }
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_window.c

    r41258 r41380  
    276276
    277277    /* Work-around Intel driver bug */
    278     CRASSERT(cr_server.curClient->currentMural == mural);
    279     if (cr_server.curClient->currentMural == mural)
     278    CRASSERT(!cr_server.curClient
     279            || cr_server.curClient->currentMural == mural);
     280    if (cr_server.curClient && cr_server.curClient->currentMural == mural)
    280281    {
    281282        CRContextInfo * ctxInfo = cr_server.currentCtxInfo;
Note: See TracChangeset for help on using the changeset viewer.

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