VirtualBox

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

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

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

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Id
檔案大小: 13.5 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);
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
132#define CR_SERVER_REDIR_F_NONE 0x00
133/* the data should be displayed on host (unset when is on or when CR_SERVER_REDIR_F_FBO_RAM_VMFB is set) */
134#define CR_SERVER_REDIR_F_DISPLAY 0x01
135/* guest window data get redirected to FBO on host */
136#define CR_SERVER_REDIR_F_FBO 0x02
137/* used with CR_SERVER_REDIR_F_FBO only
138 * indicates that FBO data should be copied to RAM for further processing */
139#define CR_SERVER_REDIR_F_FBO_RAM 0x04
140/* used with CR_SERVER_REDIR_F_FBO_RAM only
141 * indicates that FBO data should be passed to VRDP backend */
142#define CR_SERVER_REDIR_F_FBO_RAM_VRDP 0x08
143/* used with CR_SERVER_REDIR_F_FBO_RAM only
144 * indicates that FBO data should be passed to VM Framebuffer */
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
150
151#define CR_SERVER_REDIR_F_ALL 0x3f
152
153#define CR_SERVER_REDIR_FGROUP_REQUIRE_FBO (CR_SERVER_REDIR_F_ALL & ~CR_SERVER_REDIR_F_DISPLAY)
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)
155
156DECLINLINE(GLuint) crServerRedirModeAdjust(GLuint value)
157{
158 /* sanitize values */
159 value &= CR_SERVER_REDIR_F_ALL;
160
161 if (value & CR_SERVER_REDIR_FGROUP_REQUIRE_FBO)
162 value |= CR_SERVER_REDIR_F_FBO;
163 if (value & CR_SERVER_REDIR_FGROUP_REQUIRE_FBO_RAM)
164 value |= CR_SERVER_REDIR_F_FBO_RAM;
165
166 return value;
167}
168
169int32_t crServerSetOffscreenRenderingMode(GLuint value);
170void crServerRedirMuralFBO(CRMuralInfo *mural, GLuint redir);
171void crServerDeleteMuralFBO(CRMuralInfo *mural);
172void crServerPresentFBO(CRMuralInfo *mural);
173GLboolean crServerIsRedirectedToFBO();
174GLuint crServerMuralFBOIdxFromBufferName(CRMuralInfo *mural, GLenum buffer);
175void crServerMuralFBOSwapBuffers(CRMuralInfo *mural);
176
177void crServerVBoxCompositionDisableEnter(CRMuralInfo *mural);
178void crServerVBoxCompositionDisableLeave(CRMuralInfo *mural, GLboolean fForcePresentOnEnabled);
179void crServerVBoxCompositionPresent(CRMuralInfo *mural);
180DECLINLINE(GLboolean) crServerVBoxCompositionPresentNeeded(CRMuralInfo *mural)
181{
182 return mural->bVisible
183 && mural->width
184 && mural->height
185 && !mural->fRootVrOn ? CrVrScrCompositorEntryIsInList(&mural->CEntry) : CrVrScrCompositorEntryIsInList(&mural->RootVrCEntry);
186}
187
188#define CR_SERVER_FBO_BB_IDX(_mural) ((_mural)->iBbBuffer)
189#define CR_SERVER_FBO_FB_IDX(_mural) (((_mural)->iBbBuffer + 1) % ((_mural)->cBuffers))
190
191int32_t crVBoxServerInternalClientRead(CRClient *pClient, uint8_t *pBuffer, uint32_t *pcbBuffer);
192
193PCR_DISPLAY crServerDisplayGetInitialized(uint32_t idScreen);
194
195void crServerPerformMakeCurrent( CRMuralInfo *mural, CRContextInfo *ctxInfo );
196
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}
376RT_C_DECLS_END
377
378#endif /* CR_SERVER_H */
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

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