VirtualBox

Ignore:
Timestamp:
Aug 9, 2013 9:08:20 AM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
87829
Message:

crOpenGL: more output redirect enhance

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h

    r47623 r47628  
    421421
    422422void CrDpResize(PCR_DISPLAY pDisplay, int32_t xPos, int32_t yPos, uint32_t width, uint32_t height);
    423 void CrDpEntryInit(PCR_DISPLAY_ENTRY pEntry, const VBOXVR_TEXTURE *pTextureData, uint32_t fFlags);
    424 void CrDpEntryCleanup(PCR_DISPLAY pDisplay, PCR_DISPLAY_ENTRY pEntry);
     423void CrDpEntryInit(PCR_DISPLAY_ENTRY pEntry, const VBOXVR_TEXTURE *pTextureData, uint32_t fFlags, PFNVBOXVRSCRCOMPOSITOR_ENTRY_RELEASED pfnEntryReleased);
     424void CrDpEntryCleanup(PCR_DISPLAY_ENTRY pEntry);
    425425int CrDpEntryRegionsSet(PCR_DISPLAY pDisplay, PCR_DISPLAY_ENTRY pEntry, const RTPOINT *pPos, uint32_t cRegions, const RTRECT *paRegions);
    426426int CrDpEntryRegionsAdd(PCR_DISPLAY pDisplay, PCR_DISPLAY_ENTRY pEntry, const RTPOINT *pPos, uint32_t cRegions, const RTRECT *paRegions, CR_DISPLAY_ENTRY_MAP *pMap);
    427 void CrDpEntryRegionsClear(PCR_DISPLAY pDisplay);
     427void CrDpRegionsClear(PCR_DISPLAY pDisplay);
    428428DECLINLINE(bool) CrDpEntryIsUsed(PCR_DISPLAY_ENTRY pEntry)
    429429{
     
    455455void crServerDEntryVibleRegions(CRMuralInfo *pMural, CR_DISPLAY_ENTRY *pDEntry);
    456456void crServerDEntryCheckFBO(CRMuralInfo *pMural, CR_DISPLAY_ENTRY *pDEntry, CRContext *ctx);
    457 void crServerDEntryCleanup(CR_DISPLAY_ENTRY *pDEntry);
    458457
    459458void crServerDEntryAllResized(CRMuralInfo *pMural);
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_muralfbo.c

    r47623 r47628  
    5757    }
    5858
     59    if (pDEntry->idInvertTex)
     60    {
     61        cr_server.head_spu->dispatch_table.DeleteTextures(1, &pDEntry->idInvertTex);
     62        pDEntry->idInvertTex = 0;
     63    }
     64
    5965    if (pDEntry->pvORInstance)
    6066    {
     
    8288    }
    8389
    84 }
    85 
    86 void crServerDEntryCleanup(CR_DISPLAY_ENTRY *pDEntry)
    87 {
    88     if (pDEntry->pvORInstance)
    89     {
    90         cr_server.outputRedirect.CROREnd(pDEntry->pvORInstance);
    91         pDEntry->pvORInstance = NULL;
    92     }
    9390}
    9491
     
    175172    }
    176173}
     174
     175void crServerDEntryCheckInvertTex(CRMuralInfo *pMural, CR_DISPLAY_ENTRY *pDEntry, CRContext *ctx)
     176{
     177    CRContextInfo *pMuralContextInfo;
     178
     179    if (pDEntry->idInvertTex)
     180        return;
     181
     182    pMuralContextInfo = cr_server.currentCtxInfo;
     183    if (!pMuralContextInfo)
     184    {
     185        /* happens on saved state load */
     186        CRASSERT(cr_server.MainContextInfo.SpuContext);
     187        pMuralContextInfo = &cr_server.MainContextInfo;
     188        cr_server.head_spu->dispatch_table.MakeCurrent(pMural->spuWindow, 0, cr_server.MainContextInfo.SpuContext);
     189    }
     190
     191    if (pMuralContextInfo->CreateInfo.visualBits != pMural->CreateInfo.visualBits)
     192    {
     193        crWarning("mural visual bits do not match with current context visual bits!");
     194    }
     195
     196    if (crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB))
     197    {
     198        cr_server.head_spu->dispatch_table.BindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
     199    }
     200
     201    cr_server.head_spu->dispatch_table.GenTextures(1, &pDEntry->idInvertTex);
     202    CRASSERT(pDEntry->idInvertTex);
     203    cr_server.head_spu->dispatch_table.BindTexture(GL_TEXTURE_2D, pDEntry->idInvertTex);
     204    cr_server.head_spu->dispatch_table.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
     205    cr_server.head_spu->dispatch_table.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
     206    cr_server.head_spu->dispatch_table.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
     207    cr_server.head_spu->dispatch_table.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
     208    cr_server.head_spu->dispatch_table.TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,
     209            CrVrScrCompositorEntryTexGet(&pDEntry->CEntry)->width,
     210            CrVrScrCompositorEntryTexGet(&pDEntry->CEntry)->height,
     211            0, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
     212
     213
     214    /*Restore gl state*/
     215    cr_server.head_spu->dispatch_table.BindTexture(GL_TEXTURE_2D,
     216            ctx->texture.unit[ctx->texture.curTextureUnit].currentTexture2D->hwid);
     217
     218    if (crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB))
     219    {
     220        cr_server.head_spu->dispatch_table.BindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, ctx->bufferobject.unpackBuffer->hwid);
     221    }
     222
     223    if (crStateIsBufferBound(GL_PIXEL_PACK_BUFFER_ARB))
     224    {
     225        cr_server.head_spu->dispatch_table.BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, ctx->bufferobject.packBuffer->hwid);
     226    }
     227    else
     228    {
     229        cr_server.head_spu->dispatch_table.BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
     230    }
     231}
     232
     233void crServerDEntryImgRelease(CRMuralInfo *pMural, CR_DISPLAY_ENTRY *pDEntry, void*pvImg)
     234{
     235    GLuint idPBO;
     236    CRContext *ctx = crStateGetCurrent();
     237
     238    idPBO = cr_server.bUsePBOForReadback ? pDEntry->idPBO : 0;
     239
     240    CrHlpFreeTexImage(ctx, idPBO, pvImg);
     241}
     242
     243
     244void* crServerDEntryImgAcquire(CRMuralInfo *pMural, CR_DISPLAY_ENTRY *pDEntry, GLenum enmFormat)
     245{
     246    void* pvData;
     247    GLuint idPBO;
     248    VBOXVR_TEXTURE Tex;
     249    const VBOXVR_TEXTURE * pTex;
     250    CRContext *ctx = crStateGetCurrent();
     251
     252    crServerDEntryCheckFBO(pMural, pDEntry, ctx);
     253
     254    if (cr_server.bUsePBOForReadback && !pDEntry->idPBO)
     255    {
     256        crWarning("Mural doesn't have PBO even though bUsePBOForReadback is set!");
     257    }
     258
     259    idPBO = cr_server.bUsePBOForReadback ? pDEntry->idPBO : 0;
     260
     261    if (!(CrVrScrCompositorEntryFlagsGet(&pDEntry->CEntry) & CRBLT_F_INVERT_SRC_YCOORDS))
     262        pTex = CrVrScrCompositorEntryTexGet(&pDEntry->CEntry);
     263    else
     264    {
     265        CRMuralInfo *pCurrentMural = cr_server.currentMural;
     266        CRContextInfo *pCurCtxInfo = cr_server.currentCtxInfo;
     267        PCR_BLITTER pBlitter = crServerVBoxBlitterGet();
     268        CRMuralInfo *pBlitterMural;
     269        CR_SERVER_CTX_SWITCH CtxSwitch;
     270        RTRECT SrcRect, DstRect;
     271        CR_BLITTER_WINDOW BlitterBltInfo, CurrentBltInfo;
     272        CR_BLITTER_CONTEXT CtxBltInfo;
     273        int rc;
     274
     275        crServerDEntryCheckInvertTex(pMural, pDEntry, ctx);
     276        if (!pDEntry->idInvertTex)
     277        {
     278            crWarning("crServerDEntryCheckInvertTex failed");
     279            return NULL;
     280        }
     281
     282        Tex = *CrVrScrCompositorEntryTexGet(&pDEntry->CEntry);
     283        Tex.hwid = pDEntry->idInvertTex;
     284
     285        SrcRect.xLeft = 0;
     286        SrcRect.yTop = Tex.height;
     287        SrcRect.xRight = Tex.width;
     288        SrcRect.yBottom = 0;
     289
     290        DstRect.xLeft = 0;
     291        DstRect.yTop = 0;
     292        DstRect.xRight = Tex.width;
     293        DstRect.yBottom = Tex.height;
     294
     295        if (pCurrentMural && pCurrentMural->CreateInfo.visualBits == CrBltGetVisBits(pBlitter))
     296        {
     297            pBlitterMural = pCurrentMural;
     298        }
     299        else
     300        {
     301            pBlitterMural = crServerGetDummyMural(pCurrentMural->CreateInfo.visualBits);
     302            if (!pBlitterMural)
     303            {
     304                crWarning("crServerGetDummyMural failed for blitter mural");
     305                return NULL;
     306            }
     307        }
     308
     309        crServerCtxSwitchPrepare(&CtxSwitch, NULL);
     310
     311        crServerVBoxBlitterWinInit(&CurrentBltInfo, pCurrentMural);
     312        crServerVBoxBlitterWinInit(&BlitterBltInfo, pBlitterMural);
     313        crServerVBoxBlitterCtxInit(&CtxBltInfo, pCurCtxInfo);
     314
     315        CrBltMuralSetCurrent(pBlitter, &BlitterBltInfo);
     316
     317        rc =  CrBltEnter(pBlitter, &CtxBltInfo, &CurrentBltInfo);
     318        if (RT_SUCCESS(rc))
     319        {
     320            CrBltBlitTexTex(pBlitter, CrVrScrCompositorEntryTexGet(&pDEntry->CEntry), &SrcRect, &Tex, &DstRect, 1, 0);
     321            CrBltLeave(pBlitter);
     322        }
     323        else
     324        {
     325            crWarning("CrBltEnter failed rc %d", rc);
     326        }
     327
     328        crServerCtxSwitchPostprocess(&CtxSwitch);
     329
     330        pTex = &Tex;
     331    }
     332
     333    pvData = CrHlpGetTexImage(ctx, pTex, idPBO, enmFormat);
     334    if (!pvData)
     335        crWarning("CrHlpGetTexImage failed in crServerPresentFBO");
     336
     337    return pvData;
     338}
     339
    177340
    178341/* Called when a new CRMuralInfo is created
     
    9901153{
    9911154    char *pixels=NULL;
    992     GLuint idPBO;
    993     CRContext *ctx = crStateGetCurrent();
    9941155
    9951156    if (!pDEntry->pvORInstance)
     
    10021163        }
    10031164    }
    1004 
    1005     crServerDEntryCheckFBO(pMural, pDEntry, ctx);
    10061165
    10071166    if (pMural->fPresentMode & CR_SERVER_REDIR_F_FBO_RPW)
     
    10781237    }
    10791238
    1080     if (cr_server.bUsePBOForReadback && !pDEntry->idPBO)
    1081     {
    1082         crWarning("Mural doesn't have PBO even though bUsePBOForReadback is set!");
    1083     }
    1084 
    1085     idPBO = cr_server.bUsePBOForReadback ? pDEntry->idPBO : 0;
    1086 
    1087     pixels = CrHlpGetTexImage(ctx, CrVrScrCompositorEntryTexGet(&pDEntry->CEntry), idPBO, GL_BGRA);
     1239    pixels = crServerDEntryImgAcquire(pMural, pDEntry, GL_BGRA);
    10881240    if (!pixels)
    10891241    {
     
    10941246    crServerDentryPresentVRAM(pMural, pDEntry, pixels);
    10951247
    1096     CrHlpFreeTexImage(ctx, idPBO, pixels);
     1248    crServerDEntryImgRelease(pMural, pDEntry, pixels);
    10971249}
    10981250
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp

    r47623 r47628  
    252252}
    253253
    254 void CrDpEntryRegionsClear(PCR_DISPLAY pDisplay)
     254void CrDpRegionsClear(PCR_DISPLAY pDisplay)
    255255{
    256256    bool fChanged = false;
     
    269269}
    270270
    271 void CrDpEntryInit(PCR_DISPLAY_ENTRY pEntry, const VBOXVR_TEXTURE *pTextureData, uint32_t fFlags)
    272 {
    273     CrVrScrCompositorEntryInit(&pEntry->CEntry, pTextureData, crDpEntryCEntryReleaseCB);
     271void CrDpEntryInit(PCR_DISPLAY_ENTRY pEntry, const VBOXVR_TEXTURE *pTextureData, uint32_t fFlags, PFNVBOXVRSCRCOMPOSITOR_ENTRY_RELEASED pfnEntryReleased)
     272{
     273    CrVrScrCompositorEntryInit(&pEntry->CEntry, pTextureData, pfnEntryReleased);
    274274    CrVrScrCompositorEntryFlagsSet(&pEntry->CEntry, fFlags);
    275275    CrVrScrCompositorEntryInit(&pEntry->RootVrCEntry, pTextureData, NULL);
    276276    CrVrScrCompositorEntryFlagsSet(&pEntry->RootVrCEntry, fFlags);
    277277    pEntry->pvORInstance = NULL;
    278 }
    279 
    280 void CrDpEntryCleanup(PCR_DISPLAY pDisplay, PCR_DISPLAY_ENTRY pEntry)
    281 {
    282     CrVrScrCompositorEntryRemove(&pDisplay->Mural.Compositor, &pEntry->CEntry);
     278    pEntry->idPBO = 0;
     279    pEntry->idInvertTex = 0;
     280}
     281
     282void CrDpEntryCleanup(PCR_DISPLAY_ENTRY pDEntry)
     283{
     284    if (pDEntry->idPBO)
     285    {
     286        CRASSERT(cr_server.bUsePBOForReadback);
     287        cr_server.head_spu->dispatch_table.DeleteBuffersARB(1, &pDEntry->idPBO);
     288        pDEntry->idPBO = 0;
     289    }
     290
     291    if (pDEntry->idInvertTex)
     292    {
     293        cr_server.head_spu->dispatch_table.DeleteTextures(1, &pDEntry->idInvertTex);
     294        pDEntry->idInvertTex = 0;
     295    }
     296
     297    if (pDEntry->pvORInstance)
     298    {
     299        cr_server.outputRedirect.CROREnd(pDEntry->pvORInstance);
     300        pDEntry->pvORInstance = NULL;
     301    }
    283302}
    284303
     
    366385static void crDemEntryFree(CR_DEM_ENTRY* pDemEntry)
    367386{
    368     crServerDEntryCleanup(&pDemEntry->Entry);
     387    CrDpEntryCleanup(&pDemEntry->Entry);
    369388    RTMemCacheFree(g_VBoxCrDemLookasideList, pDemEntry);
    370389}
     
    545564    }
    546565
    547     CrDpEntryInit(&pDemEntry->Entry, &TextureData, fFlags);
     566    CrDpEntryInit(&pDemEntry->Entry, &TextureData, fFlags, crDpEntryCEntryReleaseCB);
    548567
    549568    CR_DEM_ENTRY_INFO *pInfo = (CR_DEM_ENTRY_INFO*)crHashtableSearch(pMap->pTexIdToDemInfoMap, pTobj->id);
     
    899918    else
    900919    {
    901         CrDpEntryRegionsClear(pDisplay);
     920        CrDpRegionsClear(pDisplay);
    902921    }
    903922
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_window.c

    r47623 r47628  
    116116{
    117117    CR_DISPLAY_ENTRY *pDEntry = CR_DENTRY_FROM_CENTRY(pEntry);
    118     crServerDEntryCleanup(pDEntry);
     118    CrDpEntryCleanup(pDEntry);
    119119}
    120120
     
    159159        Tex.target = GL_TEXTURE_2D;
    160160        Tex.hwid = 0;
    161         CrVrScrCompositorEntryInit(&mural->DefaultDEntry.CEntry, &Tex, crServerMuralDefaultEntryReleasedCB);
    162 
    163         if (cr_server.fRootVrOn)
    164         {
    165             CrVrScrCompositorEntryInit(&mural->DefaultDEntry.RootVrCEntry, &Tex, NULL);
    166             mural->fRootVrOn = GL_TRUE;
    167         }
    168 
    169         mural->DefaultDEntry.pvORInstance = NULL;
     161
     162        CrDpEntryInit(&mural->DefaultDEntry, &Tex, 0, crServerMuralDefaultEntryReleasedCB);
     163
     164        mural->fRootVrOn = cr_server.fRootVrOn;
    170165    }
    171166
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