VirtualBox

Ignore:
Timestamp:
Feb 22, 2013 2:34:46 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
83921
Message:

crOpenGL: saved state: save depth and stencil buffer data (still needs more testing)

Location:
trunk/src/VBox/GuestHost/OpenGL/state_tracker
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_diff.c

    r44290 r44802  
    123123}
    124124
    125 void crStateFreeFBImage(CRContext *to)
     125void crStateFreeFBImageLegacy(CRContext *to)
    126126{
    127127    if (to->buffer.pFrontImg)
     
    140140}
    141141
    142 int crStateAcquireFBImage(CRContext *to)
     142int crStateAcquireFBImage(CRContext *to, CRFBData *data)
    143143{
    144144    CRBufferState *pBuf = &to->buffer;
    145145    CRPixelPackState packing = to->client.pack;
    146     GLint cbData;
    147     void *pFbData, *pBbData;
    148 
    149     crStateFreeFBImage(to);
    150 
    151     if (!to->buffer.width || !to->buffer.height)
    152         return VINF_SUCCESS;
    153 
    154     cbData = crPixelSize(GL_RGBA, GL_UNSIGNED_BYTE) * pBuf->width * pBuf->height;
    155     pFbData = crAlloc(cbData);
    156     if (!pFbData)
    157         return VERR_NO_MEMORY;
    158     pBbData = crAlloc(cbData);
    159     if (!pBbData)
    160     {
    161         crFree(pFbData);
    162         return VERR_NO_MEMORY;
    163     }
     146    uint32_t i;
    164147
    165148    diff_api.PixelStorei(GL_PACK_SKIP_ROWS, 0);
     
    172155    diff_api.PixelStorei(GL_PACK_LSB_FIRST, 0);
    173156
     157    if (to->bufferobject.packBuffer->hwid>0)
     158    {
     159        diff_api.BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
     160    }
     161
     162    for (i = 0; i < data->cElements; ++i)
     163    {
     164        CRFBDataElement *el = &data->aElements[i];
     165
     166        diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, el->idFBO);
     167
     168        if (el->enmBuffer)
     169            diff_api.ReadBuffer(el->enmBuffer);
     170
     171        diff_api.ReadPixels(el->posX, el->posY, el->width, el->height, el->enmFormat, el->enmType, el->pvData);
     172        crDebug("Acquired %d;%d;%d;%d;%d;0x%p fb image", el->enmBuffer, el->width, el->height, el->enmFormat, el->enmType, el->pvData);
     173    }
     174
     175    if (to->bufferobject.packBuffer->hwid>0)
     176    {
     177        diff_api.BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, to->bufferobject.packBuffer->hwid);
     178    }
    174179    if (to->framebufferobject.readFB)
    175180    {
     181        CRASSERT(to->framebufferobject.readFB->hwid);
     182        diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, to->framebufferobject.readFB->hwid);
     183        diff_api.ReadBuffer(to->framebufferobject.readFB->readbuffer);
     184
     185    }
     186    else if (data->idFBO)
     187    {
     188        diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, data->idFBO);
     189        diff_api.ReadBuffer(GL_COLOR_ATTACHMENT0);
     190    }
     191    else
     192    {
    176193        diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, 0);
    177     }
    178     if (to->bufferobject.packBuffer->hwid>0)
    179     {
    180         diff_api.BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
    181     }
    182 
    183     pBuf->storedWidth = pBuf->width;
    184     pBuf->storedHeight = pBuf->height;
    185     diff_api.ReadBuffer(GL_FRONT);
    186     diff_api.ReadPixels(0, 0, pBuf->width, pBuf->height, GL_RGBA, GL_UNSIGNED_BYTE, pFbData);
    187     to->buffer.pFrontImg = pFbData;
    188 
    189     diff_api.ReadBuffer(GL_BACK);
    190     diff_api.ReadPixels(0, 0, pBuf->width, pBuf->height, GL_RGBA, GL_UNSIGNED_BYTE, pBbData);
    191     to->buffer.pBackImg = pBbData;
    192 
    193     if (to->bufferobject.packBuffer->hwid>0)
    194     {
    195         diff_api.BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, to->bufferobject.packBuffer->hwid);
    196     }
    197     if (to->framebufferobject.readFB)
    198     {
    199         diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, to->framebufferobject.readFB->hwid);
    200     }
    201     diff_api.ReadBuffer(to->framebufferobject.readFB ?
    202                         to->framebufferobject.readFB->readbuffer : to->buffer.readBuffer);
     194        diff_api.ReadBuffer(to->buffer.readBuffer);
     195    }
    203196
    204197    diff_api.PixelStorei(GL_PACK_SKIP_ROWS, packing.skipRows);
     
    213206}
    214207
    215 void crStateApplyFBImage(CRContext *to)
    216 {
    217     if (to->buffer.pFrontImg || to->buffer.pBackImg)
     208void crStateApplyFBImage(CRContext *to, CRFBData *data)
     209{
    218210    {
    219211        CRBufferState *pBuf = &to->buffer;
    220212        CRPixelPackState unpack = to->client.unpack;
     213        uint32_t i;
    221214
    222215        diff_api.PixelStorei(GL_UNPACK_SKIP_ROWS, 0);
     
    229222        diff_api.PixelStorei(GL_UNPACK_LSB_FIRST, 0);
    230223
    231         if (to->framebufferobject.drawFB)
    232         {
    233             diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, 0);
    234         }
    235 
    236224        if (to->bufferobject.unpackBuffer->hwid>0)
    237225        {
     
    244232        diff_api.Disable(GL_COLOR_LOGIC_OP);
    245233
    246         if (pBuf->pFrontImg)
    247         {
    248             diff_api.DrawBuffer(GL_FRONT);
    249             diff_api.WindowPos2iARB(0, 0);
    250             diff_api.DrawPixels(pBuf->storedWidth, pBuf->storedHeight, GL_RGBA, GL_UNSIGNED_BYTE, pBuf->pFrontImg);
    251             crDebug("Applied %ix%i fb image", pBuf->storedWidth, pBuf->storedHeight);
    252             crFree(pBuf->pFrontImg);
    253             pBuf->pFrontImg = NULL;
    254         }
    255 
    256         if (pBuf->pBackImg)
    257         {
    258             diff_api.DrawBuffer(GL_BACK);
    259             diff_api.WindowPos2iARB(0, 0);
    260             diff_api.DrawPixels(pBuf->storedWidth, pBuf->storedHeight, GL_RGBA, GL_UNSIGNED_BYTE, pBuf->pBackImg);
    261             crDebug("Applied %ix%i bb image", pBuf->storedWidth, pBuf->storedHeight);
    262             crFree(pBuf->pBackImg);
    263             pBuf->pBackImg = NULL;
     234        for (i = 0; i < data->cElements; ++i)
     235        {
     236            CRFBDataElement *el = &data->aElements[i];
     237
     238            switch (el->enmFormat)
     239            {
     240                case GL_DEPTH_COMPONENT:
     241                    diff_api.Enable(GL_DEPTH_TEST);
     242                    break;
     243                case GL_STENCIL_INDEX:
     244                    diff_api.Enable(GL_STENCIL_TEST);
     245                    break;
     246                default:
     247                    break;
     248            }
     249
     250            diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, el->idFBO);
     251
     252            if (el->enmBuffer)
     253                diff_api.DrawBuffer(el->enmBuffer);
     254
     255            diff_api.WindowPos2iARB(el->posX, el->posY);
     256            diff_api.DrawPixels(el->width, el->height, el->enmFormat, el->enmType, el->pvData);
     257            crDebug("Applied %d;%d;%d;%d;%d;0x%p fb image", el->enmBuffer, el->width, el->height, el->enmFormat, el->enmType, el->pvData);
     258
     259            switch (el->enmFormat)
     260            {
     261                case GL_DEPTH_COMPONENT:
     262                    if (!to->buffer.depthTest)
     263                    {
     264                        diff_api.Disable(GL_DEPTH_TEST);
     265                    }
     266                    break;
     267                case GL_STENCIL_INDEX:
     268                    if (!to->stencil.stencilTest)
     269                    {
     270                        diff_api.Disable(GL_STENCIL_TEST);
     271                    }
     272                    break;
     273                default:
     274                    break;
     275            }
     276
    264277        }
    265278
     
    271284        if (to->framebufferobject.drawFB)
    272285        {
     286            CRASSERT(to->framebufferobject.drawFB->hwid);
    273287            diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, to->framebufferobject.drawFB->hwid);
    274         }
    275         diff_api.DrawBuffer(to->framebufferobject.drawFB ?
    276                             to->framebufferobject.drawFB->drawbuffer[0] : to->buffer.drawBuffer);
     288            diff_api.DrawBuffer(to->framebufferobject.drawFB->drawbuffer[0]);
     289        }
     290        else if (data->idFBO)
     291        {
     292            diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, data->idFBO);
     293            diff_api.DrawBuffer(GL_COLOR_ATTACHMENT0);
     294        }
     295        else
     296        {
     297            diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, 0);
     298            diff_api.DrawBuffer(to->buffer.drawBuffer);
     299        }
    277300        if (to->buffer.alphaTest)
    278301        {
     
    433456
    434457#ifdef WINDOWS
    435     crStateApplyFBImage(to);
     458        if (to->buffer.pFrontImg)
     459        {
     460            CRFBData *pLazyData = (CRFBData *)to->buffer.pFrontImg;
     461            crStateApplyFBImage(to, pLazyData);
     462            crStateFreeFBImageLegacy(to);
     463        }
    436464#endif
    437465}
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_snapshot.c

    r44529 r44802  
    13981398    CRASSERT(pContext && pSSM);
    13991399
    1400     pContext->buffer.storedWidth = pContext->buffer.width;
    1401     pContext->buffer.storedHeight = pContext->buffer.height;
     1400    /* this stuff is not used anymore, zero it up for sanity */
     1401    pContext->buffer.storedWidth = 0;
     1402    pContext->buffer.storedHeight = 0;
    14021403
    14031404    CRASSERT(VBoxTlsRefIsFunctional(pContext));
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