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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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
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