VirtualBox

source: vbox/trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h@ 46801

最後變更 在這個檔案從46801是 46801,由 vboxsync 提交於 12 年 前

wddm/crOpenGL: more TexPresent fixes

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Id
檔案大小: 26.4 KB
 
1/* Copyright (c) 2001, Stanford University
2 * All rights reserved.
3 *
4 * See the file LICENSE.txt for information on redistributing this software.
5 */
6
7#ifndef CR_SERVER_H
8#define CR_SERVER_H
9
10#include "cr_protocol.h"
11#include "cr_glstate.h"
12#include "spu_dispatch_table.h"
13
14#include "state/cr_currentpointers.h"
15
16#include "cr_server.h"
17
18#ifdef VBOX_WITH_CRHGSMI
19# include <VBox/VBoxVideo.h>
20
21#include <iprt/cdefs.h>
22
23RT_C_DECLS_BEGIN
24
25extern uint8_t* g_pvVRamBase;
26extern uint32_t g_cbVRam;
27extern HCRHGSMICMDCOMPLETION g_hCrHgsmiCompletion;
28extern PFNCRHGSMICMDCOMPLETION g_pfnCrHgsmiCompletion;
29
30#define VBOXCRHGSMI_PTR(_off, _t) ((_t*)(g_pvVRamBase + (_off)))
31#define VBOXCRHGSMI_PTR_SAFE(_off, _cb, _t) ((_t*)crServerCrHgsmiPtrGet(_off, _cb))
32
33DECLINLINE(void*) crServerCrHgsmiPtrGet(VBOXVIDEOOFFSET offBuffer, uint32_t cbBuffer)
34{
35 return ((offBuffer) + (cbBuffer) <= g_cbVRam ? VBOXCRHGSMI_PTR(offBuffer, void) : NULL);
36}
37
38DECLINLINE(void) crServerCrHgsmiCmdComplete(struct VBOXVDMACMD_CHROMIUM_CMD *pCmd, int cmdProcessingRc)
39{
40 g_pfnCrHgsmiCompletion(g_hCrHgsmiCompletion, pCmd, cmdProcessingRc);
41}
42
43#define VBOXCRHGSMI_CMD_COMPLETE(_pData, _rc) do { \
44 CRVBOXHGSMI_CMDDATA_ASSERT_ISSET(_pData); \
45 CRVBOXHGSMI_CMDDATA_RC(_pData, _rc); \
46 crServerCrHgsmiCmdComplete((_pData)->pCmd, VINF_SUCCESS); \
47 } while (0)
48
49#define VBOXCRHGSMI_CMD_CHECK_COMPLETE(_pData, _rc) do { \
50 if (CRVBOXHGSMI_CMDDATA_IS_SET(_pData)) { \
51 VBOXCRHGSMI_CMD_COMPLETE(_pData, _rc); \
52 } \
53 } while (0)
54
55#endif
56
57/*
58 * This is the base number for window and context IDs
59 */
60#define MAGIC_OFFSET 5000
61
62extern CRServer cr_server;
63
64/* Semaphore wait queue node */
65typedef struct _wqnode {
66 RunQueue *q;
67 struct _wqnode *next;
68} wqnode;
69
70typedef struct {
71 GLuint count;
72 GLuint num_waiting;
73 RunQueue **waiting;
74} CRServerBarrier;
75
76typedef struct {
77 GLuint count;
78 wqnode *waiting, *tail;
79} CRServerSemaphore;
80
81typedef struct {
82 GLuint id;
83 GLint projParamStart;
84 GLfloat projMat[16]; /* projection matrix, accumulated via calls to */
85 /* glProgramLocalParameterARB, glProgramParameterNV */
86} CRServerProgram;
87
88void crServerSetVBoxConfiguration();
89void crServerSetVBoxConfigurationHGCM();
90void crServerInitDispatch(void);
91void crServerReturnValue( const void *payload, unsigned int payload_len );
92void crServerWriteback(void);
93int crServerRecv( CRConnection *conn, CRMessage *msg, unsigned int len );
94void crServerSerializeRemoteStreams(void);
95void crServerAddToRunQueue( CRClient *client );
96void crServerDeleteClient( CRClient *client );
97
98
99void crServerApplyBaseProjection( const CRmatrix *baseProj );
100void crServerApplyViewMatrix( const CRmatrix *view );
101void crServerSetOutputBounds( const CRMuralInfo *mural, int extNum );
102void crServerComputeViewportBounds( const CRViewportState *v, CRMuralInfo *mural );
103
104GLboolean crServerInitializeBucketing(CRMuralInfo *mural);
105
106void crComputeOverlapGeom(double *quads, int nquad, CRPoly ***res);
107void crComputeKnockoutGeom(double *quads, int nquad, int my_quad_idx, CRPoly **res);
108
109int crServerGetCurrentEye(void);
110
111GLboolean crServerClientInBeginEnd(const CRClient *client);
112
113GLint crServerDispatchCreateContextEx(const char *dpyName, GLint visualBits, GLint shareCtx, GLint preloadCtxID, int32_t internalID);
114GLint crServerDispatchWindowCreateEx(const char *dpyName, GLint visBits, GLint preloadWinID);
115GLint crServerMuralInit(CRMuralInfo *mural, const char *dpyName, GLint visBits, GLint preloadWinID, GLboolean fSetVRegs);
116void crServerMuralTerm(CRMuralInfo *mural);
117void crServerMuralSize(CRMuralInfo *mural, GLint width, GLint height);
118int crServerMuralSynchRootVr(CRMuralInfo *mural, uint32_t *pcRects, const RTRECT **ppRects);
119
120GLint crServerGenerateID(GLint *pCounter);
121
122GLint crServerSPUWindowID(GLint serverWindow);
123
124GLuint crServerTranslateProgramID(GLuint id);
125
126CRMuralInfo * crServerGetDummyMural(GLint visualBits);
127
128void crServerSetupOutputRedirect(CRMuralInfo *mural);
129void crServerCheckMuralGeometry(CRMuralInfo *mural);
130GLboolean crServerSupportRedirMuralFBO(void);
131
132void crVBoxServerNotifyEvent(int32_t idScreen);
133void crServerDisplayTermAll();
134
135#define CR_SERVER_REDIR_F_NONE 0x00
136/* the data should be displayed on host (unset when is on or when CR_SERVER_REDIR_F_FBO_RAM_VMFB is set) */
137#define CR_SERVER_REDIR_F_DISPLAY 0x01
138/* guest window data get redirected to FBO on host */
139#define CR_SERVER_REDIR_F_FBO 0x02
140/* used with CR_SERVER_REDIR_F_FBO only
141 * indicates that FBO data should be copied to RAM for further processing */
142#define CR_SERVER_REDIR_F_FBO_RAM 0x04
143/* used with CR_SERVER_REDIR_F_FBO_RAM only
144 * indicates that FBO data should be passed to VRDP backend */
145#define CR_SERVER_REDIR_F_FBO_RAM_VRDP 0x08
146/* used with CR_SERVER_REDIR_F_FBO_RAM only
147 * indicates that FBO data should be passed to VM Framebuffer */
148#define CR_SERVER_REDIR_F_FBO_RAM_VMFB 0x10
149/* used with CR_SERVER_REDIR_F_FBO_RAM only
150 * makes the RPW (Read Pixels Worker) mechanism to be used for GPU memory aquisition */
151#define CR_SERVER_REDIR_F_FBO_RPW 0x20
152
153
154#define CR_SERVER_REDIR_F_ALL 0x3f
155
156#define CR_SERVER_REDIR_FGROUP_REQUIRE_FBO (CR_SERVER_REDIR_F_ALL & ~CR_SERVER_REDIR_F_DISPLAY)
157#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)
158
159DECLINLINE(GLuint) crServerRedirModeAdjust(GLuint value)
160{
161 /* sanitize values */
162 value &= CR_SERVER_REDIR_F_ALL;
163
164 if (value & CR_SERVER_REDIR_FGROUP_REQUIRE_FBO)
165 value |= CR_SERVER_REDIR_F_FBO;
166 if (value & CR_SERVER_REDIR_FGROUP_REQUIRE_FBO_RAM)
167 value |= CR_SERVER_REDIR_F_FBO_RAM;
168
169 return value;
170}
171
172int32_t crServerSetOffscreenRenderingMode(GLuint value);
173void crServerRedirMuralFBO(CRMuralInfo *mural, GLuint redir);
174void crServerDeleteMuralFBO(CRMuralInfo *mural);
175void crServerPresentFBO(CRMuralInfo *mural);
176GLboolean crServerIsRedirectedToFBO();
177GLint crServerMuralFBOIdxFromBufferName(CRMuralInfo *mural, GLenum buffer);
178void crServerMuralFBOSwapBuffers(CRMuralInfo *mural);
179
180void crServerVBoxCompositionDisableEnter(CRMuralInfo *mural);
181void crServerVBoxCompositionDisableLeave(CRMuralInfo *mural, GLboolean fForcePresentOnEnabled);
182void crServerVBoxCompositionPresent(CRMuralInfo *mural);
183DECLINLINE(GLboolean) crServerVBoxCompositionPresentNeeded(CRMuralInfo *mural)
184{
185 return mural->bVisible
186 && mural->width
187 && mural->height
188 && !mural->fRootVrOn ? CrVrScrCompositorEntryIsInList(&mural->CEntry) : CrVrScrCompositorEntryIsInList(&mural->RootVrCEntry);
189}
190
191#define CR_SERVER_FBO_BB_IDX(_mural) ((_mural)->iBbBuffer)
192#define CR_SERVER_FBO_FB_IDX(_mural) (((_mural)->iBbBuffer + 1) % ((_mural)->cBuffers))
193/* returns a valid index to be used for negative _idx, i.e. for GL_NONE cases */
194//#define CR_SERVER_FBO_ADJUST_IDX(_mural, _idx) ((_idx) >= 0 ? (_idx) : CR_SERVER_FBO_BB_IDX(_mural))
195/* just a helper that uses CR_SERVER_FBO_ADJUST_IDX for getting mural's FBO id for buffer index*/
196//#define CR_SERVER_FBO_FOR_IDX(_mural, _idx) ((_mural)->aidFBOs[CR_SERVER_FBO_ADJUST_IDX((_mural), (_idx))])
197//#define CR_SERVER_FBO_TEX_FOR_IDX(_mural, _idx) ((_mural)->aidColorTexs[CR_SERVER_FBO_ADJUST_IDX((_mural), (_idx))])
198#define CR_SERVER_FBO_FOR_IDX(_mural, _idx) ((_idx) >= 0 ? (_mural)->aidFBOs[(_idx)] : 0)
199#define CR_SERVER_FBO_TEX_FOR_IDX(_mural, _idx) ((_idx) >= 0 ? (_mural)->aidColorTexs[(_idx)] : 0)
200
201int32_t crVBoxServerInternalClientRead(CRClient *pClient, uint8_t *pBuffer, uint32_t *pcbBuffer);
202
203PCR_DISPLAY crServerDisplayGetInitialized(uint32_t idScreen);
204
205void crServerPerformMakeCurrent( CRMuralInfo *mural, CRContextInfo *ctxInfo );
206
207PCR_BLITTER crServerVBoxBlitterGet();
208
209DECLINLINE(void) crServerVBoxBlitterWinInit(CR_BLITTER_WINDOW *win, CRMuralInfo *mural)
210{
211 win->Base.id = mural->spuWindow;
212 win->Base.visualBits = mural->CreateInfo.visualBits;
213 win->width = mural->width;
214 win->height = mural->height;
215}
216
217DECLINLINE(void) crServerVBoxBlitterCtxInit(CR_BLITTER_CONTEXT *ctx, CRContextInfo *ctxInfo)
218{
219 ctx->Base.id = ctxInfo->SpuContext;
220 if (ctx->Base.id < 0)
221 ctx->Base.id = cr_server.MainContextInfo.SpuContext;
222 ctx->Base.visualBits = cr_server.curClient->currentCtxInfo->CreateInfo.visualBits;
223}
224
225/* display worker thread.
226 * see comments for CR_SERVER_RPW struct definition in cr_server.h */
227DECLINLINE(void) crServerXchgI8(int8_t *pu8Val1, int8_t *pu8Val2)
228{
229 int8_t tmp;
230 tmp = *pu8Val1;
231 *pu8Val1 = *pu8Val2;
232 *pu8Val2 = tmp;
233}
234
235#ifdef DEBUG_misha
236# define CR_SERVER_RPW_DEBUG
237#endif
238/* *
239 * _name : Draw, Submitted, Worker, Gpu
240 */
241
242#ifdef CR_SERVER_RPW_DEBUG
243# define crServerRpwEntryDbgVerify(_pE) crServerRpwEntryDbgDoVerify(_pE)
244#else
245# define crServerRpwEntryDbgVerify(_pE) do {} while (0)
246#endif
247
248
249#define CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _name) ((_pEntry)->iTex##_name > 0)
250
251#define CR_SERVER_RPW_ENTRY_TEX_INVALIDATE(_pEntry, _name) do { \
252 crServerRpwEntryDbgVerify(_pEntry); \
253 Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _name)); \
254 (_pEntry)->iTex##_name = -(_pEntry)->iTex##_name; \
255 crServerRpwEntryDbgVerify(_pEntry); \
256 } while (0)
257
258#define CR_SERVER_RPW_ENTRY_TEX_PROMOTE(_pEntry, _fromName, _toName) do { \
259 crServerRpwEntryDbgVerify(_pEntry); \
260 Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _fromName)); \
261 Assert(!CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _toName)); \
262 crServerXchgI8(&(_pEntry)->iTex##_fromName, &(_pEntry)->iTex##_toName); \
263 crServerRpwEntryDbgVerify(_pEntry); \
264 } while (0)
265
266#define CR_SERVER_RPW_ENTRY_TEX_XCHG_VALID(_pEntry, _fromName, _toName) do { \
267 crServerRpwEntryDbgVerify(_pEntry); \
268 Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _fromName)); \
269 Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _toName)); \
270 crServerXchgI8(&(_pEntry)->iTex##_fromName, &(_pEntry)->iTex##_toName); \
271 Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _fromName)); \
272 Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _toName)); \
273 crServerRpwEntryDbgVerify(_pEntry); \
274 } while (0)
275
276
277#define CR_SERVER_RPW_ENTRY_TEX_PROMOTE_KEEPVALID(_pEntry, _fromName, _toName) do { \
278 crServerRpwEntryDbgVerify(_pEntry); \
279 Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _fromName)); \
280 Assert(!CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _toName)); \
281 crServerXchgI8(&(_pEntry)->iTex##_fromName, &(_pEntry)->iTex##_toName); \
282 (_pEntry)->iTex##_fromName = -(_pEntry)->iTex##_fromName; \
283 Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _fromName)); \
284 Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(_pEntry, _toName)); \
285 crServerRpwEntryDbgVerify(_pEntry); \
286 } while (0)
287
288#define CR_SERVER_RPW_ENTRY_TEX(_pEntry, _name) ((_pEntry)->aidWorkerTexs[(_pEntry)->iTex##_name - 1])
289
290#define CR_SERVER_RPW_ENTRY_PBO_NEXT_ID(_i) (((_i) + 1) % 2)
291#define CR_SERVER_RPW_ENTRY_PBO_IS_ACTIVE(_pEntry) ((_pEntry)->iCurPBO >= 0)
292#define CR_SERVER_RPW_ENTRY_PBO_CUR(_pEntry) ((_pEntry)->aidPBOs[(_pEntry)->iCurPBO])
293#define CR_SERVER_RPW_ENTRY_PBO_COMPLETED(_pEntry) ((_pEntry)->aidPBOs[CR_SERVER_RPW_ENTRY_PBO_NEXT_ID((_pEntry)->iCurPBO)])
294#define CR_SERVER_RPW_ENTRY_PBO_FLIP(_pEntry) do { \
295 (_pEntry)->iCurPBO = CR_SERVER_RPW_ENTRY_PBO_NEXT_ID((_pEntry)->iCurPBO); \
296 } while (0)
297
298#ifdef CR_SERVER_RPW_DEBUG
299DECLINLINE(void) crServerRpwEntryDbgDoVerify(CR_SERVER_RPW_ENTRY *pEntry)
300{
301 int tstMask = 0;
302 int8_t iVal;
303 Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(pEntry, Draw));
304
305#define CR_VERVER_RPW_ENTRY_DBG_CHECKVAL(_v) do { \
306 iVal = RT_ABS(_v); \
307 Assert(iVal > 0); \
308 Assert(iVal < 5); \
309 Assert(!(tstMask & (1 << iVal))); \
310 tstMask |= (1 << iVal); \
311 } while (0)
312
313 CR_VERVER_RPW_ENTRY_DBG_CHECKVAL(pEntry->iTexDraw);
314 CR_VERVER_RPW_ENTRY_DBG_CHECKVAL(pEntry->iTexSubmitted);
315 CR_VERVER_RPW_ENTRY_DBG_CHECKVAL(pEntry->iTexWorker);
316 CR_VERVER_RPW_ENTRY_DBG_CHECKVAL(pEntry->iTexGpu);
317 Assert(tstMask == 0x1E);
318}
319#endif
320
321DECLINLINE(bool) crServerRpwIsInitialized(const CR_SERVER_RPW *pWorker)
322{
323 return !!pWorker->ctxId;
324}
325int crServerRpwInit(CR_SERVER_RPW *pWorker);
326int crServerRpwTerm(CR_SERVER_RPW *pWorker);
327DECLINLINE(bool) crServerRpwEntryIsInitialized(const CR_SERVER_RPW_ENTRY *pEntry)
328{
329 return !!pEntry->pfnData;
330}
331int crServerRpwEntryInit(CR_SERVER_RPW *pWorker, CR_SERVER_RPW_ENTRY *pEntry, uint32_t width, uint32_t height, PFNCR_SERVER_RPW_DATA pfnData);
332int crServerRpwEntryCleanup(CR_SERVER_RPW *pWorker, CR_SERVER_RPW_ENTRY *pEntry);
333int crServerRpwEntryResize(CR_SERVER_RPW *pWorker, CR_SERVER_RPW_ENTRY *pEntry, uint32_t width, uint32_t height);
334int crServerRpwEntrySubmit(CR_SERVER_RPW *pWorker, CR_SERVER_RPW_ENTRY *pEntry);
335int crServerRpwEntryWaitComplete(CR_SERVER_RPW *pWorker, CR_SERVER_RPW_ENTRY *pEntry);
336int crServerRpwEntryCancel(CR_SERVER_RPW *pWorker, CR_SERVER_RPW_ENTRY *pEntry);
337DECLINLINE(void) crServerRpwEntryDrawSettingsToTex(const CR_SERVER_RPW_ENTRY *pEntry, VBOXVR_TEXTURE *pTex)
338{
339 pTex->width = pEntry->Size.cx;
340 pTex->height = pEntry->Size.cy;
341 pTex->target = GL_TEXTURE_2D;
342 Assert(CR_SERVER_RPW_ENTRY_TEX_IS_VALID(pEntry, Draw));
343 pTex->hwid = CR_SERVER_RPW_ENTRY_TEX(pEntry, Draw);
344}
345/**/
346
347typedef struct CR_SERVER_CTX_SWITCH
348{
349 GLuint idDrawFBO, idReadFBO;
350 CRContext *pNewCtx;
351 CRContext *pOldCtx;
352} CR_SERVER_CTX_SWITCH;
353
354DECLINLINE(void) crServerCtxSwitchPrepare(CR_SERVER_CTX_SWITCH *pData, CRContext *pNewCtx)
355{
356 CRMuralInfo *pCurrentMural = cr_server.currentMural;
357 CRContextInfo *pCurCtxInfo = cr_server.currentCtxInfo;
358 GLuint idDrawFBO, idReadFBO;
359 CRContext *pCurCtx = pCurCtxInfo ? pCurCtxInfo->pContext : NULL;
360
361 CRASSERT(pCurCtx == crStateGetCurrent());
362
363 if (pCurrentMural)
364 {
365 idDrawFBO = CR_SERVER_FBO_FOR_IDX(pCurrentMural, pCurrentMural->iCurDrawBuffer);
366 idReadFBO = CR_SERVER_FBO_FOR_IDX(pCurrentMural, pCurrentMural->iCurReadBuffer);
367 }
368 else
369 {
370 idDrawFBO = 0;
371 idReadFBO = 0;
372 }
373
374 crStateSwitchPrepare(pNewCtx, pCurCtx, idDrawFBO, idReadFBO);
375
376 pData->idDrawFBO = idDrawFBO;
377 pData->idReadFBO = idReadFBO;
378 pData->pNewCtx = pNewCtx;
379 pData->pOldCtx = pCurCtx;
380}
381
382DECLINLINE(void) crServerCtxSwitchPostprocess(CR_SERVER_CTX_SWITCH *pData)
383{
384 crStateSwitchPostprocess(pData->pOldCtx, pData->pNewCtx, pData->idDrawFBO, pData->idReadFBO);
385}
386
387void crServerInitTmpCtxDispatch();
388
389//#define VBOX_WITH_CRSERVER_DUMPER
390#ifdef VBOX_WITH_CRSERVER_DUMPER
391void crServerDumpCheckTerm();
392int crServerDumpCheckInit();
393void crServerDumpBuffer(int idx);
394void crServerDumpTextures();
395void crServerDumpShader(GLint id);
396void crServerDumpProgram(GLint id);
397void crServerDumpCurrentProgram();
398void crServerDumpRecompileDumpCurrentProgram();
399void crServerRecompileCurrentProgram();
400void crServerDumpCurrentProgramUniforms();
401void crServerDumpCurrentProgramAttribs();
402void crServerDumpFramesCheck();
403void crServerDumpState();
404void crServerDumpDrawel(const char*pszFormat, ...);
405void crServerDumpDrawelv(GLuint idx, const char*pszElFormat, uint32_t cbEl, const void *pvVal, uint32_t cVal);
406int crServerVBoxParseNumerics(const char *pszStr, const int defaultVal);
407void CrDpEnter(PCR_DISPLAY pDisplay);
408void CrDpLeave(PCR_DISPLAY pDisplay);
409
410extern unsigned long g_CrDbgDumpEnabled;
411extern unsigned long g_CrDbgDumpDraw;
412extern unsigned long g_CrDbgDumpDrawFramesSettings;
413extern unsigned long g_CrDbgDumpDrawFramesAppliedSettings;
414extern unsigned long g_CrDbgDumpDrawFramesCount;
415
416bool crServerDumpFilterDmp(unsigned long event, CR_DUMPER *pDumper);
417bool crServerDumpFilterOp(unsigned long event, CR_DUMPER *pDumper);
418
419//#define CR_SERVER_DUMP_MASK_OP 0x0000fffc
420//#define CR_SERVER_DUMP_OFF_OP 2
421//
422//#define CR_SERVER_DUMP_MASK_DIR 0x00000003
423//#define CR_SERVER_DUMP_OFF_DIR 0
424//
425//#define CR_SERVER_DUMP_MASK_DMP 0xffff0000
426//#define CR_SERVER_DUMP_OFF_DMP 16
427//
428//#define CR_SERVER_DUMP_MAKE_OP(_v) (1 << ((_v) + CR_SERVER_DUMP_OFF_OP))
429//#define CR_SERVER_DUMP_MAKE_DIR(_v) (1 << ((_v) + CR_SERVER_DUMP_OFF_DIR))
430//#define CR_SERVER_DUMP_MAKE_DMP(_v) (1 << ((_v) + CR_SERVER_DUMP_OFF_DMP))
431//
432//#define CR_SERVER_DUMP_GET_OP(_v) ((_v) & CR_SERVER_DUMP_MASK_OP)
433//#define CR_SERVER_DUMP_GET_DMP(_v) ((_v) & CR_SERVER_DUMP_MASK_DMP)
434//#define CR_SERVER_DUMP_GET_DIR(_v) ((_v) & CR_SERVER_DUMP_MASK_DIR)
435//
436//#define CR_SERVER_DUMP_ISANY_OP(_v1, _v2) (!!(CR_SERVER_DUMP_GET_OP(_v1) & CR_SERVER_DUMP_GET_OP(_v2)))
437//#define CR_SERVER_DUMP_ISANY_DIR(_v1, _v2) (!!(CR_SERVER_DUMP_GET_DIR(_v1) & CR_SERVER_DUMP_GET_DIR(_v2)))
438//#define CR_SERVER_DUMP_ISANY_DMP(_v1, _v2) (!!(CR_SERVER_DUMP_GET_DMP(_v1) & CR_SERVER_DUMP_GET_DMP(_v2)))
439//
440//#define CR_SERVER_DUMP_ISANY_OP(_v1, _v2) ((CR_SERVER_DUMP_GET_OP(_v1) & CR_SERVER_DUMP_GET_OP(_v2)) == CR_SERVER_DUMP_GET_OP(_v2))
441//#define CR_SERVER_DUMP_ISANY_DIR(_v1, _v2) ((CR_SERVER_DUMP_GET_DIR(_v1) & CR_SERVER_DUMP_GET_DIR(_v2)) == CR_SERVER_DUMP_GET_DIR(_v2))
442//#define CR_SERVER_DUMP_ISANY_DMP(_v1, _v2) ((CR_SERVER_DUMP_GET_DMP(_v1) & CR_SERVER_DUMP_GET_DMP(_v2)) == CR_SERVER_DUMP_GET_DMP(_v2))
443//
444//#define CR_SERVER_DUMP_F_DIR_ENTER CR_SERVER_DUMP_MAKE_DIR(0)
445//#define CR_SERVER_DUMP_F_DIR_LEAVE CR_SERVER_DUMP_MAKE_DIR(1)
446//
447//#define CR_SERVER_DUMP_F_OP_DRAW CR_SERVER_DUMP_MAKE_OP(0)
448//#define CR_SERVER_DUMP_F_OP_SWAPBUFFERS CR_SERVER_DUMP_MAKE_OP(1)
449//#define CR_SERVER_DUMP_F_OP_LINK_PROGRAM CR_SERVER_DUMP_MAKE_OP(2)
450//#define CR_SERVER_DUMP_F_OP_COMPILE_PROGRAM CR_SERVER_DUMP_MAKE_OP(3)
451//
452//#define CR_SERVER_DUMP_F_DMP_BUFF CR_SERVER_DUMP_MAKE_DMP(0)
453//#define CR_SERVER_DUMP_F_DMP_TEX CR_SERVER_DUMP_MAKE_DMP(0)
454//#define CR_SERVER_DUMP_F_DMP_PROGRAM CR_SERVER_DUMP_MAKE_DMP(0)
455//#define CR_SERVER_DUMP_F_DMP_PROGRAM_UNIFORMS CR_SERVER_DUMP_MAKE_DMP(0)
456//#define CR_SERVER_DUMP_F_DMP_STATE CR_SERVER_DUMP_MAKE_DMP(0)
457//
458//#define CR_SERVER_DUMP_GET_OP(_v) ((_v) & CR_SERVER_DUMP_MASK_OP)
459//#define CR_SERVER_DUMP_GET_DMP(_v) ((_v) & CR_SERVER_DUMP_MASK_DMP)
460//#define CR_SERVER_DUMP_GET_DIR(_v) ((_v) & CR_SERVER_DUMP_MASK_DIR)
461
462#define CR_SERVER_DUMP_F_DRAW_BUFF_ENTER 0x00000001
463#define CR_SERVER_DUMP_F_DRAW_BUFF_LEAVE 0x00000002
464#define CR_SERVER_DUMP_F_DRAW_STATE_ENTER 0x00000004
465#define CR_SERVER_DUMP_F_DRAW_STATE_LEAVE 0x00000008
466#define CR_SERVER_DUMP_F_DRAW_TEX_ENTER 0x00000010
467#define CR_SERVER_DUMP_F_DRAW_TEX_LEAVE 0x00000020
468#define CR_SERVER_DUMP_F_DRAW_PROGRAM_ENTER 0x00000040
469#define CR_SERVER_DUMP_F_DRAW_PROGRAM_LEAVE 0x00000080
470#define CR_SERVER_DUMP_F_DRAW_PROGRAM_UNIFORMS_ENTER 0x00000100
471#define CR_SERVER_DUMP_F_DRAW_PROGRAM_UNIFORMS_LEAVE 0x00000200
472#define CR_SERVER_DUMP_F_DRAW_PROGRAM_ATTRIBS_ENTER 0x00000400
473#define CR_SERVER_DUMP_F_DRAW_PROGRAM_ATTRIBS_LEAVE 0x00000800
474
475#define CR_SERVER_DUMP_F_DRAW_ENTER_ALL (CR_SERVER_DUMP_F_DRAW_BUFF_ENTER \
476 | CR_SERVER_DUMP_F_DRAW_TEX_ENTER \
477 | CR_SERVER_DUMP_F_DRAW_PROGRAM_ENTER \
478 | CR_SERVER_DUMP_F_DRAW_PROGRAM_UNIFORMS_ENTER \
479 | CR_SERVER_DUMP_F_DRAW_STATE_ENTER \
480 | CR_SERVER_DUMP_F_DRAW_PROGRAM_ATTRIBS_ENTER)
481
482#define CR_SERVER_DUMP_F_DRAW_LEAVE_ALL (CR_SERVER_DUMP_F_DRAW_BUFF_LEAVE \
483 | CR_SERVER_DUMP_F_DRAW_TEX_LEAVE \
484 | CR_SERVER_DUMP_F_DRAW_PROGRAM_LEAVE \
485 | CR_SERVER_DUMP_F_DRAW_PROGRAM_UNIFORMS_LEAVE \
486 | CR_SERVER_DUMP_F_DRAW_STATE_LEAVE \
487 | CR_SERVER_DUMP_F_DRAW_PROGRAM_ATTRIBS_LEAVE)
488
489#define CR_SERVER_DUMP_F_DRAW_ALL (CR_SERVER_DUMP_F_DRAW_ENTER_ALL | CR_SERVER_DUMP_F_DRAW_LEAVE_ALL)
490
491#define CR_SERVER_DUMP_F_SWAPBUFFERS_ENTER 0x00010000
492#define CR_SERVER_DUMP_F_SWAPBUFFERS_LEAVE 0x00020000
493#define CR_SERVER_DUMP_F_DRAWEL 0x00100000
494#define CR_SERVER_DUMP_F_COMPILE_SHADER 0x01000000
495#define CR_SERVER_DUMP_F_SHADER_SOURCE 0x02000000
496#define CR_SERVER_DUMP_F_LINK_PROGRAM 0x04000000
497
498
499#define CR_SERVER_DUMP_DEFAULT_FILTER_OP(_ev) ((((_ev) & g_CrDbgDumpDraw) != 0) \
500 || ((_ev) == CR_SERVER_DUMP_F_SWAPBUFFERS_ENTER && g_CrDbgDumpDrawFramesCount))
501
502#define CR_SERVER_DUMP_DEFAULT_FILTER_DMP(_ev) (((_ev) & g_CrDbgDumpDraw) != 0)
503
504#define CR_SERVER_DUMP_FILTER_OP(_ev, _pDumper) (g_CrDbgDumpEnabled && crServerDumpFilterOp((_ev), (_pDumper)))
505#define CR_SERVER_DUMP_FILTER_DMP(_ev, _pDumper) (crServerDumpFilterDmp((_ev), (_pDumper)))
506
507#define CR_SERVER_DUMP_DRAW_ENTER() do { \
508 if (!CR_SERVER_DUMP_FILTER_OP(CR_SERVER_DUMP_F_DRAW_ENTER_ALL, cr_server.Recorder.pDumper)) break; \
509 crServerDumpCheckInit(); \
510 crDmpStrF(cr_server.Recorder.pDumper, "==ENTER %s==", __FUNCTION__); \
511 if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_STATE_ENTER, cr_server.Recorder.pDumper)) { crServerDumpState(); } \
512 if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_PROGRAM_ENTER, cr_server.Recorder.pDumper)) { crServerDumpCurrentProgram(); } \
513 if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_PROGRAM_UNIFORMS_ENTER, cr_server.Recorder.pDumper)) { crServerDumpCurrentProgramUniforms(); } \
514 if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_PROGRAM_ATTRIBS_ENTER, cr_server.Recorder.pDumper)) { crServerDumpCurrentProgramAttribs(); } \
515 if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_TEX_ENTER, cr_server.Recorder.pDumper)) { crServerDumpTextures(); } \
516 if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_BUFF_ENTER, cr_server.Recorder.pDumper)) { crServerDumpBuffer(-1); } \
517 crDmpStrF(cr_server.Recorder.pDumper, "==Done ENTER %s==", __FUNCTION__); \
518 } while (0)
519
520#define CR_SERVER_DUMP_DRAW_LEAVE() do { \
521 if (!CR_SERVER_DUMP_FILTER_OP(CR_SERVER_DUMP_F_DRAW_LEAVE_ALL, cr_server.Recorder.pDumper)) break; \
522 crServerDumpCheckInit(); \
523 crDmpStrF(cr_server.Recorder.pDumper, "==LEAVE %s==", __FUNCTION__); \
524 if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_TEX_LEAVE, cr_server.Recorder.pDumper)) { crServerDumpTextures(); } \
525 if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_BUFF_LEAVE, cr_server.Recorder.pDumper)) { crServerDumpBuffer(-1); } \
526 if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_PROGRAM_UNIFORMS_LEAVE, cr_server.Recorder.pDumper)) { crServerDumpCurrentProgramUniforms(); } \
527 if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_PROGRAM_ATTRIBS_LEAVE, cr_server.Recorder.pDumper)) { crServerDumpCurrentProgramAttribs(); } \
528 if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_PROGRAM_LEAVE, cr_server.Recorder.pDumper)) { crServerDumpCurrentProgram(); } \
529 if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_STATE_LEAVE, cr_server.Recorder.pDumper)) { crServerDumpState(); } \
530 crDmpStrF(cr_server.Recorder.pDumper, "==Done LEAVE %s==", __FUNCTION__); \
531 } while (0)
532
533#define CR_SERVER_DUMP_COMPILE_SHADER(_id) do { \
534 if (!CR_SERVER_DUMP_FILTER_OP(CR_SERVER_DUMP_F_COMPILE_SHADER, cr_server.Recorder.pDumper)) break; \
535 crServerDumpCheckInit(); \
536 crDmpStrF(cr_server.Recorder.pDumper, "== %s", __FUNCTION__); \
537 crServerDumpShader((_id)); \
538 crDmpStrF(cr_server.Recorder.pDumper, "====="); \
539 } while (0)
540
541#define CR_SERVER_DUMP_SHADER_SOURCE(_id) do { \
542 if (!CR_SERVER_DUMP_FILTER_OP(CR_SERVER_DUMP_F_SHADER_SOURCE, cr_server.Recorder.pDumper)) break; \
543 crServerDumpCheckInit(); \
544 crDmpStrF(cr_server.Recorder.pDumper, "==%s==", __FUNCTION__); \
545 crServerDumpShader((_id)); \
546 crDmpStrF(cr_server.Recorder.pDumper, "==Done %s==", __FUNCTION__); \
547 } while (0)
548
549#define CR_SERVER_DUMP_LINK_PROGRAM(_id) do { \
550 if (!CR_SERVER_DUMP_FILTER_OP(CR_SERVER_DUMP_F_LINK_PROGRAM, cr_server.Recorder.pDumper)) break; \
551 crServerDumpCheckInit(); \
552 crDmpStrF(cr_server.Recorder.pDumper, "==%s==", __FUNCTION__); \
553 crServerDumpProgram((_id)); \
554 crDmpStrF(cr_server.Recorder.pDumper, "==Done %s==", __FUNCTION__); \
555 } while (0)
556
557#define CR_SERVER_DUMP_SWAPBUFFERS_ENTER() do { \
558 if (!CR_SERVER_DUMP_FILTER_OP(CR_SERVER_DUMP_F_SWAPBUFFERS_ENTER, cr_server.Recorder.pDumper)) break; \
559 crServerDumpCheckInit(); \
560 crDmpStrF(cr_server.Recorder.pDumper, "==ENTER %s==", __FUNCTION__); \
561 if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_SWAPBUFFERS_ENTER, cr_server.Recorder.pDumper)) { crServerDumpBuffer(CR_SERVER_FBO_BB_IDX(cr_server.currentMural)); } \
562 if (g_CrDbgDumpDrawFramesCount) { crServerDumpFramesCheck(); } \
563 crDmpStrF(cr_server.Recorder.pDumper, "==Done ENTER %s==", __FUNCTION__); \
564 } while (0)
565
566#define CR_SERVER_DUMP_SWAPBUFFERS_LEAVE() do { \
567 if (!CR_SERVER_DUMP_FILTER_OP(CR_SERVER_DUMP_F_SWAPBUFFERS_LEAVE, cr_server.Recorder.pDumper)) break; \
568 crDmpStrF(cr_server.Recorder.pDumper, "==LEAVE %s==", __FUNCTION__); \
569 crServerDumpCheckInit(); \
570 crDmpStrF(cr_server.Recorder.pDumper, "==Done LEAVE %s==", __FUNCTION__); \
571 } while (0)
572
573#define CR_SERVER_DUMP_DRAWEL_F(_msg) do { \
574 if (!CR_SERVER_DUMP_FILTER_OP(CR_SERVER_DUMP_F_DRAWEL, cr_server.Recorder.pDumper)) break; \
575 crServerDumpCheckInit(); \
576 crDmpStrF(cr_server.Recorder.pDumper, "==%s==", __FUNCTION__); \
577 crServerDumpDrawel _msg; \
578 } while (0)
579
580#define CR_SERVER_DUMP_DRAWEL_V(_index, _pszElFormat, _cbEl, _pvVal, _cVal) do { \
581 if (!CR_SERVER_DUMP_FILTER_OP(CR_SERVER_DUMP_F_DRAWEL, cr_server.Recorder.pDumper)) break; \
582 crServerDumpCheckInit(); \
583 crDmpStrF(cr_server.Recorder.pDumper, "==%s==", __FUNCTION__); \
584 crServerDumpDrawelv((_index), (_pszElFormat), (_cbEl), (_pvVal), (_cVal)); \
585 } while (0)
586#else /* if !defined VBOX_WITH_CRSERVER_DUMPER */
587#define CR_SERVER_DUMP_DRAW_ENTER() do {} while (0)
588#define CR_SERVER_DUMP_DRAW_LEAVE() do {} while (0)
589#define CR_SERVER_DUMP_COMPILE_SHADER(_id) do {} while (0)
590#define CR_SERVER_DUMP_LINK_PROGRAM(_id) do {} while (0)
591#define CR_SERVER_DUMP_SWAPBUFFERS_ENTER() do {} while (0)
592#define CR_SERVER_DUMP_SWAPBUFFERS_LEAVE() do {} while (0)
593#define CR_SERVER_DUMP_SHADER_SOURCE(_id) do {} while (0)
594#define CR_SERVER_DUMP_DRAWEL_F(_msg) do {} while (0)
595#define CR_SERVER_DUMP_DRAWEL_V(_index, _pszElFormat, _cbEl, _pvVal, _cVal) do {} while (0)
596#endif /* !VBOX_WITH_CRSERVER_DUMPER */
597
598RT_C_DECLS_END
599
600#endif /* CR_SERVER_H */
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

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