VirtualBox

Ignore:
Timestamp:
Apr 4, 2013 7:46:29 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
84764
Message:

crOpenGL: improved GPU data acwuisition mechanism for VRDP (disabled still)

File:
1 edited

Legend:

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

    r45248 r45348  
    136136#define CR_SERVER_REDIR_F_FBO           0x02
    137137/* used with CR_SERVER_REDIR_F_FBO only
    138  * makes a separate texture to be used for maintaining the window framebuffer presented data */
    139 #define CR_SERVER_REDIR_F_FBO_VMFB_TEX  0x04
    140 /* used with CR_SERVER_REDIR_F_FBO only
    141138 * indicates that FBO data should be copied to RAM for further processing */
    142 #define CR_SERVER_REDIR_F_FBO_RAM       0x08
     139#define CR_SERVER_REDIR_F_FBO_RAM       0x04
    143140/* used with CR_SERVER_REDIR_F_FBO_RAM only
    144141 * indicates that FBO data should be passed to VRDP backend */
    145 #define CR_SERVER_REDIR_F_FBO_RAM_VRDP  0x10
     142#define CR_SERVER_REDIR_F_FBO_RAM_VRDP  0x08
    146143/* used with CR_SERVER_REDIR_F_FBO_RAM only
    147144 * indicates that FBO data should be passed to VM Framebuffer */
    148 #define CR_SERVER_REDIR_F_FBO_RAM_VMFB  0x20
     145#define CR_SERVER_REDIR_F_FBO_RAM_VMFB  0x10
     146/* used with CR_SERVER_REDIR_F_FBO_RAM only
     147 * makes the RPW (Read Pixels Worker) mechanism to be used for GPU memory aquisition */
     148#define CR_SERVER_REDIR_F_FBO_RPW       0x20
     149
    149150
    150151#define CR_SERVER_REDIR_F_ALL           0x3f
    151152
    152153#define CR_SERVER_REDIR_FGROUP_REQUIRE_FBO     (CR_SERVER_REDIR_F_ALL & ~CR_SERVER_REDIR_F_DISPLAY)
    153 #define CR_SERVER_REDIR_FGROUP_REQUIRE_FBO_RAM (CR_SERVER_REDIR_F_FBO_RAM_VRDP | CR_SERVER_REDIR_F_FBO_RAM_VMFB)
     154#define CR_SERVER_REDIR_FGROUP_REQUIRE_FBO_RAM (CR_SERVER_REDIR_F_FBO_RAM_VRDP | CR_SERVER_REDIR_F_FBO_RAM_VMFB | CR_SERVER_REDIR_F_FBO_RPW)
    154155
    155156DECLINLINE(GLuint) crServerRedirModeAdjust(GLuint value)
     
    168169int32_t crServerSetOffscreenRenderingMode(GLuint value);
    169170void crServerRedirMuralFBO(CRMuralInfo *mural, GLuint redir);
    170 void crServerEnableDisplayMuralFBO(CRMuralInfo *mural, GLboolean fEnable);
    171171void crServerDeleteMuralFBO(CRMuralInfo *mural);
    172172void crServerPresentFBO(CRMuralInfo *mural);
     
    195195void crServerPerformMakeCurrent( CRMuralInfo *mural, CRContextInfo *ctxInfo );
    196196
     197PCR_BLITTER crServerVBoxBlitterGet();
     198
     199DECLINLINE(void) crServerVBoxBlitterWinInit(CR_BLITTER_WINDOW *win, CRMuralInfo *mural)
     200{
     201    win->Base.id = mural->spuWindow;
     202    win->Base.visualBits = mural->CreateInfo.visualBits;
     203    win->width = mural->width;
     204    win->height = mural->height;
     205}
     206
     207DECLINLINE(void) crServerVBoxBlitterCtxInit(CR_BLITTER_CONTEXT *ctx, CRContextInfo *ctxInfo)
     208{
     209    ctx->Base.id = ctxInfo->SpuContext;
     210    if (ctx->Base.id < 0)
     211        ctx->Base.id = cr_server.MainContextInfo.SpuContext;
     212    ctx->Base.visualBits = cr_server.curClient->currentCtxInfo->CreateInfo.visualBits;
     213}
     214
     215/* display worker thread.
     216 * see comments for CR_SERVER_RPW struct definition in cr_server.h */
     217DECLINLINE(void) crServerXchgI8(int8_t *pu8Val1, int8_t *pu8Val2)
     218{
     219    int8_t tmp;
     220    tmp = *pu8Val1;
     221    *pu8Val1 = *pu8Val2;
     222    *pu8Val2 = tmp;
     223}
     224
     225#ifdef DEBUG_misha
     226# define CR_SERVER_RPW_DEBUG
     227#endif
     228/* *
     229 * _name : Draw, Submitted, Worker, Gpu
     230 */
     231
     232#ifdef CR_SERVER_RPW_DEBUG
     233# define crServerRpwEntryDbgVerify(_pE) crServerRpwEntryDbgDoVerify(_pE)
     234#else
     235# define crServerRpwEntryDbgVerify(_pE) do {} while (0)
     236#endif
     237
     238
     239#define CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _name) ((_pEntry)->iTex##_name > 0)
     240
     241#define CR_SERVER_RPW_ENTRY_TEX_INVALIDATE(_pEntry, _name) do { \
     242        crServerRpwEntryDbgVerify(_pEntry); \
     243        Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _name)); \
     244        (_pEntry)->iTex##_name = -(_pEntry)->iTex##_name; \
     245        crServerRpwEntryDbgVerify(_pEntry); \
     246    } while (0)
     247
     248#define CR_SERVER_RPW_ENTRY_TEX_PROMOTE(_pEntry, _fromName, _toName) do { \
     249        crServerRpwEntryDbgVerify(_pEntry); \
     250        Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _fromName)); \
     251        Assert(!CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _toName)); \
     252        crServerXchgI8(&(_pEntry)->iTex##_fromName, &(_pEntry)->iTex##_toName); \
     253        crServerRpwEntryDbgVerify(_pEntry); \
     254    } while (0)
     255
     256#define CR_SERVER_RPW_ENTRY_TEX_XCHG_VALID(_pEntry, _fromName, _toName) do { \
     257        crServerRpwEntryDbgVerify(_pEntry); \
     258        Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _fromName)); \
     259        Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _toName)); \
     260        crServerXchgI8(&(_pEntry)->iTex##_fromName, &(_pEntry)->iTex##_toName); \
     261        Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _fromName)); \
     262        Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _toName)); \
     263        crServerRpwEntryDbgVerify(_pEntry); \
     264    } while (0)
     265
     266
     267#define CR_SERVER_RPW_ENTRY_TEX_PROMOTE_KEEPVALID(_pEntry, _fromName, _toName) do { \
     268        crServerRpwEntryDbgVerify(_pEntry); \
     269        Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _fromName)); \
     270        Assert(!CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _toName)); \
     271        crServerXchgI8(&(_pEntry)->iTex##_fromName, &(_pEntry)->iTex##_toName); \
     272        (_pEntry)->iTex##_fromName = -(_pEntry)->iTex##_fromName; \
     273        Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _fromName)); \
     274        Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _toName)); \
     275        crServerRpwEntryDbgVerify(_pEntry); \
     276    } while (0)
     277
     278#define CR_SERVER_RPW_ENTRY_TEX(_pEntry, _name) ((_pEntry)->aidWorkerTexs[(_pEntry)->iTex##_name - 1])
     279
     280#define CR_SERVER_RPW_ENTRY_PBO_NEXT_ID(_i) (((_i) + 1) % 2)
     281#define CR_SERVER_RPW_ENTRY_PBO_IS_ACTIVE(_pEntry) ((_pEntry)->iCurPBO >= 0)
     282#define CR_SERVER_RPW_ENTRY_PBO_CUR(_pEntry) ((_pEntry)->aidPBOs[(_pEntry)->iCurPBO])
     283#define CR_SERVER_RPW_ENTRY_PBO_COMPLETED(_pEntry) ((_pEntry)->aidPBOs[CR_SERVER_RPW_ENTRY_PBO_NEXT_ID((_pEntry)->iCurPBO)])
     284#define CR_SERVER_RPW_ENTRY_PBO_FLIP(_pEntry) do { \
     285        (_pEntry)->iCurPBO = CR_SERVER_RPW_ENTRY_PBO_NEXT_ID((_pEntry)->iCurPBO); \
     286    } while (0)
     287
     288#ifdef CR_SERVER_RPW_DEBUG
     289DECLINLINE(void) crServerRpwEntryDbgDoVerify(CR_SERVER_RPW_ENTRY *pEntry)
     290{
     291    int tstMask = 0;
     292    int8_t iVal;
     293    Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(pEntry, Draw));
     294
     295#define CR_VERVER_RPW_ENTRY_DBG_CHECKVAL(_v) do { \
     296        iVal = RT_ABS(_v); \
     297        Assert(iVal > 0); \
     298        Assert(iVal < 5); \
     299        Assert(!(tstMask & (1 << iVal))); \
     300        tstMask |= (1 << iVal); \
     301    } while (0)
     302
     303    CR_VERVER_RPW_ENTRY_DBG_CHECKVAL(pEntry->iTexDraw);
     304    CR_VERVER_RPW_ENTRY_DBG_CHECKVAL(pEntry->iTexSubmitted);
     305    CR_VERVER_RPW_ENTRY_DBG_CHECKVAL(pEntry->iTexWorker);
     306    CR_VERVER_RPW_ENTRY_DBG_CHECKVAL(pEntry->iTexGpu);
     307    Assert(tstMask == 0x1E);
     308}
     309#endif
     310
     311DECLINLINE(bool) crServerRpwIsInitialized(const CR_SERVER_RPW *pWorker)
     312{
     313    return !!pWorker->ctxId;
     314}
     315int crServerRpwInit(CR_SERVER_RPW *pWorker);
     316int crServerRpwTerm(CR_SERVER_RPW *pWorker);
     317DECLINLINE(bool) crServerRpwEntryIsInitialized(const CR_SERVER_RPW_ENTRY *pEntry)
     318{
     319    return !!pEntry->pfnData;
     320}
     321int crServerRpwEntryInit(CR_SERVER_RPW *pWorker, CR_SERVER_RPW_ENTRY *pEntry, uint32_t width, uint32_t height, PFNCR_SERVER_RPW_DATA pfnData);
     322int crServerRpwEntryCleanup(CR_SERVER_RPW *pWorker, CR_SERVER_RPW_ENTRY *pEntry);
     323int crServerRpwEntryResize(CR_SERVER_RPW *pWorker, CR_SERVER_RPW_ENTRY *pEntry, uint32_t width, uint32_t height);
     324int crServerRpwEntrySubmit(CR_SERVER_RPW *pWorker, CR_SERVER_RPW_ENTRY *pEntry);
     325int crServerRpwEntryWaitComplete(CR_SERVER_RPW *pWorker, CR_SERVER_RPW_ENTRY *pEntry);
     326int crServerRpwEntryCancel(CR_SERVER_RPW *pWorker, CR_SERVER_RPW_ENTRY *pEntry);
     327DECLINLINE(void) crServerRpwEntryDrawSettingsToTex(const CR_SERVER_RPW_ENTRY *pEntry, VBOXVR_TEXTURE *pTex)
     328{
     329    pTex->width = pEntry->Size.cx;
     330    pTex->height = pEntry->Size.cy;
     331    pTex->target = GL_TEXTURE_2D;
     332    CR_SERVER_RPW_ENTRY_TEX_IS_VALID(pEntry, Draw);
     333    pTex->hwid = CR_SERVER_RPW_ENTRY_TEX(pEntry, Draw);
     334}
     335/**/
     336
     337typedef struct CR_SERVER_CTX_SWITCH
     338{
     339    GLuint idDrawFBO, idReadFBO;
     340    CRContext *pNewCtx;
     341    CRContext *pOldCtx;
     342} CR_SERVER_CTX_SWITCH;
     343
     344DECLINLINE(void) cr_serverCtxSwitchPrepare(CR_SERVER_CTX_SWITCH *pData, CRContext *pNewCtx)
     345{
     346    CRMuralInfo *pCurrentMural = cr_server.currentMural;
     347    CRContextInfo *pCurCtxInfo = cr_server.currentCtxInfo;
     348    GLuint idDrawFBO, idReadFBO;
     349    CRContext *pCurCtx = pCurCtxInfo ? pCurCtxInfo->pContext : NULL;
     350
     351    CRASSERT(pCurCtx == crStateGetCurrent());
     352
     353    if (pCurrentMural)
     354    {
     355        idDrawFBO = pCurrentMural->aidFBOs[pCurrentMural->iCurDrawBuffer];
     356        idReadFBO = pCurrentMural->aidFBOs[pCurrentMural->iCurReadBuffer];
     357    }
     358    else
     359    {
     360        idDrawFBO = 0;
     361        idReadFBO = 0;
     362    }
     363
     364    crStateSwitchPrepare(pNewCtx, pCurCtx, idDrawFBO, idReadFBO);
     365
     366    pData->idDrawFBO = idDrawFBO;
     367    pData->idReadFBO = idReadFBO;
     368    pData->pNewCtx = pNewCtx;
     369    pData->pOldCtx = pCurCtx;
     370}
     371
     372DECLINLINE(void) cr_serverCtxSwitchPostprocess(CR_SERVER_CTX_SWITCH *pData)
     373{
     374    crStateSwitchPostprocess(pData->pOldCtx, pData->pNewCtx, pData->idDrawFBO, pData->idReadFBO);
     375}
    197376RT_C_DECLS_END
    198377
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