Changeset 42499 in vbox
- Timestamp:
- Aug 1, 2012 10:26:43 AM (12 years ago)
- Location:
- trunk/src/VBox
- Files:
-
- 1 added
- 56 edited
-
Additions/WINNT/Graphics/Video/disp/wddm/VBoxCrHgsmi.cpp (modified) (7 diffs)
-
Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispCm.cpp (modified) (3 diffs)
-
Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.def (modified) (1 diff)
-
Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.h (modified) (2 diffs)
-
Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispMp.cpp (modified) (2 diffs)
-
Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiBase.cpp (added)
-
Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiBase.h (modified) (6 diffs)
-
Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiDisp.cpp (modified) (3 diffs)
-
Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.cpp (modified) (4 diffs)
-
Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.h (modified) (1 diff)
-
Additions/WINNT/Graphics/Wine/d3d9/d3d9_private.h (modified) (1 diff)
-
Additions/WINNT/Graphics/Wine/d3d9/device.c (modified) (3 diffs)
-
Additions/WINNT/Graphics/Wine/d3d9/directx.c (modified) (1 diff)
-
Additions/WINNT/Graphics/Wine/vbox/VBoxWineEx.h (modified) (1 diff)
-
Additions/WINNT/Graphics/Wine/vbox/libWineStub/include/wine/wined3d.h (modified) (1 diff)
-
Additions/WINNT/Graphics/Wine/wined3d/context.c (modified) (4 diffs)
-
Additions/WINNT/Graphics/Wine/wined3d/device.c (modified) (3 diffs)
-
Additions/WINNT/Graphics/Wine/wined3d/directx.c (modified) (9 diffs)
-
Additions/WINNT/Graphics/Wine/wined3d/swapchain.c (modified) (1 diff)
-
Additions/WINNT/Graphics/Wine/wined3d/vboxext.c (modified) (3 diffs)
-
Additions/WINNT/Graphics/Wine/wined3d/wined3d_gl.h (modified) (4 diffs)
-
Additions/WINNT/Graphics/Wine/wined3d/wined3d_private.h (modified) (2 diffs)
-
Additions/common/crOpenGL/Makefile.kmk (modified) (5 diffs)
-
Additions/common/crOpenGL/context.c (modified) (10 diffs)
-
Additions/common/crOpenGL/defs.py (modified) (1 diff)
-
Additions/common/crOpenGL/defs64.py (modified) (1 diff)
-
Additions/common/crOpenGL/feedback/feedback_context.c (modified) (3 diffs)
-
Additions/common/crOpenGL/feedback/feedback_state.py (modified) (1 diff)
-
Additions/common/crOpenGL/feedback/feedback_state_special (modified) (1 diff)
-
Additions/common/crOpenGL/icd_drv.c (modified) (1 diff)
-
Additions/common/crOpenGL/load.c (modified) (5 diffs)
-
Additions/common/crOpenGL/pack/packspu.h (modified) (4 diffs)
-
Additions/common/crOpenGL/pack/packspu_bufferobject.c (modified) (1 diff)
-
Additions/common/crOpenGL/pack/packspu_client.c (modified) (1 diff)
-
Additions/common/crOpenGL/pack/packspu_context.c (modified) (15 diffs)
-
Additions/common/crOpenGL/pack/packspu_framebuffer.c (modified) (1 diff)
-
Additions/common/crOpenGL/pack/packspu_get.py (modified) (2 diffs)
-
Additions/common/crOpenGL/pack/packspu_getshaders.c (modified) (8 diffs)
-
Additions/common/crOpenGL/pack/packspu_getstring.c (modified) (2 diffs)
-
Additions/common/crOpenGL/pack/packspu_glsl.c (modified) (4 diffs)
-
Additions/common/crOpenGL/pack/packspu_init.c (modified) (1 diff)
-
Additions/common/crOpenGL/pack/packspu_misc.c (modified) (18 diffs)
-
Additions/common/crOpenGL/pack/packspu_net.c (modified) (1 diff)
-
Additions/common/crOpenGL/pack/packspu_pixel.c (modified) (3 diffs)
-
Additions/common/crOpenGL/pack/packspu_special (modified) (1 diff)
-
Additions/common/crOpenGL/pack/packspu_swapbuf.c (modified) (1 diff)
-
Additions/common/crOpenGL/stub.c (modified) (5 diffs)
-
Additions/common/crOpenGL/stub.h (modified) (3 diffs)
-
Additions/common/crOpenGL/wgl.c (modified) (2 diffs)
-
GuestHost/OpenGL/Makefile.kmk (modified) (5 diffs)
-
GuestHost/OpenGL/glapi_parser/APIspec.txt (modified) (3 diffs)
-
GuestHost/OpenGL/include/cr_net.h (modified) (3 diffs)
-
GuestHost/OpenGL/include/cr_netserver.h (modified) (1 diff)
-
GuestHost/OpenGL/state_tracker/state_init.c (modified) (1 diff)
-
GuestHost/OpenGL/util/net.c (modified) (11 diffs)
-
GuestHost/OpenGL/util/net_internals.h (modified) (1 diff)
-
GuestHost/OpenGL/util/vboxhgcm.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxCrHgsmi.cpp
r41374 r42499 24 24 static VBOXDISPKMT_CALLBACKS g_VBoxCrHgsmiKmtCallbacks; 25 25 static int g_bVBoxKmtCallbacksInited = 0; 26 static uint32_t g_VBoxCrVersionMajor;27 static uint32_t g_VBoxCrVersionMinor;28 26 29 #ifdef VBOX_CRHGSMI_WITH_D3DDEV30 static VBOXCRHGSMI_CALLBACKS g_VBoxCrHgsmiCallbacks;31 static HMODULE g_hVBoxCrHgsmiProvider = NULL;32 static uint32_t g_cVBoxCrHgsmiProvider = 0;33 34 35 typedef VBOXWDDMDISP_DECL(int) FNVBOXDISPCRHGSMI_INIT(PVBOXCRHGSMI_CALLBACKS pCallbacks);36 typedef FNVBOXDISPCRHGSMI_INIT *PFNVBOXDISPCRHGSMI_INIT;37 38 typedef VBOXWDDMDISP_DECL(int) FNVBOXDISPCRHGSMI_TERM();39 typedef FNVBOXDISPCRHGSMI_TERM *PFNVBOXDISPCRHGSMI_TERM;40 41 typedef VBOXWDDMDISP_DECL(HVBOXCRHGSMI_CLIENT) FNVBOXDISPCRHGSMI_QUERY_CLIENT();42 typedef FNVBOXDISPCRHGSMI_QUERY_CLIENT *PFNVBOXDISPCRHGSMI_QUERY_CLIENT;43 44 static PFNVBOXDISPCRHGSMI_INIT g_pfnVBoxDispCrHgsmiInit = NULL;45 static PFNVBOXDISPCRHGSMI_TERM g_pfnVBoxDispCrHgsmiTerm = NULL;46 static PFNVBOXDISPCRHGSMI_QUERY_CLIENT g_pfnVBoxDispCrHgsmiQueryClient = NULL;47 48 VBOXCRHGSMI_DECL(int) VBoxCrHgsmiInit(PVBOXCRHGSMI_CALLBACKS pCallbacks)49 {50 if (!g_bVBoxKmtCallbacksInited)51 {52 HRESULT hr = vboxDispKmtCallbacksInit(&g_VBoxCrHgsmiKmtCallbacks);53 Assert(hr == S_OK);54 if (hr == S_OK)55 g_bVBoxKmtCallbacksInited = 1;56 else57 g_bVBoxKmtCallbacksInited = -1;58 }59 60 Assert(g_bVBoxKmtCallbacksInited);61 if (g_bVBoxKmtCallbacksInited < 0)62 {63 Assert(0);64 return VERR_NOT_SUPPORTED;65 }66 67 g_VBoxCrHgsmiCallbacks = *pCallbacks;68 if (!g_hVBoxCrHgsmiProvider)69 {70 g_hVBoxCrHgsmiProvider = GetModuleHandle(L"VBoxDispD3D");71 if (g_hVBoxCrHgsmiProvider)72 {73 g_hVBoxCrHgsmiProvider = LoadLibrary(L"VBoxDispD3D");74 }75 76 if (g_hVBoxCrHgsmiProvider)77 {78 g_pfnVBoxDispCrHgsmiInit = (PFNVBOXDISPCRHGSMI_INIT)GetProcAddress(g_hVBoxCrHgsmiProvider, "VBoxDispCrHgsmiInit");79 Assert(g_pfnVBoxDispCrHgsmiInit);80 if (g_pfnVBoxDispCrHgsmiInit)81 {82 g_pfnVBoxDispCrHgsmiInit(pCallbacks);83 }84 85 g_pfnVBoxDispCrHgsmiTerm = (PFNVBOXDISPCRHGSMI_TERM)GetProcAddress(g_hVBoxCrHgsmiProvider, "VBoxDispCrHgsmiTerm");86 Assert(g_pfnVBoxDispCrHgsmiTerm);87 88 g_pfnVBoxDispCrHgsmiQueryClient = (PFNVBOXDISPCRHGSMI_QUERY_CLIENT)GetProcAddress(g_hVBoxCrHgsmiProvider, "VBoxDispCrHgsmiQueryClient");89 Assert(g_pfnVBoxDispCrHgsmiQueryClient);90 }91 #ifdef DEBUG_misha92 else93 {94 DWORD winEr = GetLastError();95 Assert(0);96 }97 #endif98 }99 100 if (g_hVBoxCrHgsmiProvider)101 {102 if (g_pfnVBoxDispCrHgsmiInit)103 {104 g_pfnVBoxDispCrHgsmiInit(pCallbacks);105 }106 ++g_cVBoxCrHgsmiProvider;107 return VINF_SUCCESS;108 }109 110 /* we're called from ogl ICD driver*/111 Assert(0);112 113 return VINF_SUCCESS;114 }115 116 static __declspec(thread) PVBOXUHGSMI_PRIVATE_KMT gt_pHgsmiGL = NULL;117 118 VBOXCRHGSMI_DECL(HVBOXCRHGSMI_CLIENT) VBoxCrHgsmiQueryClient()119 {120 121 HVBOXCRHGSMI_CLIENT hClient;122 if (g_pfnVBoxDispCrHgsmiQueryClient)123 {124 hClient = g_pfnVBoxDispCrHgsmiQueryClient();125 //#ifdef DEBUG_misha126 // Assert(hClient);127 //#endif128 if (hClient)129 return hClient;130 }131 PVBOXUHGSMI_PRIVATE_KMT pHgsmiGL = gt_pHgsmiGL;132 if (pHgsmiGL)133 {134 Assert(pHgsmiGL->BasePrivate.hClient);135 return pHgsmiGL->BasePrivate.hClient;136 }137 pHgsmiGL = (PVBOXUHGSMI_PRIVATE_KMT)RTMemAllocZ(sizeof (*pHgsmiGL));138 if (pHgsmiGL)139 {140 #if 0141 HRESULT hr = vboxUhgsmiKmtCreate(pHgsmiGL, TRUE /* bD3D tmp for injection thread*/);142 #else143 HRESULT hr = vboxUhgsmiKmtEscCreate(pHgsmiGL, TRUE /* bD3D tmp for injection thread*/);144 #endif145 Assert(hr == S_OK);146 if (hr == S_OK)147 {148 hClient = g_VBoxCrHgsmiCallbacks.pfnClientCreate(&pHgsmiGL->BasePrivate.Base);149 Assert(hClient);150 if (hClient)151 {152 pHgsmiGL->BasePrivate.hClient = hClient;153 gt_pHgsmiGL = pHgsmiGL;154 return hClient;155 }156 vboxUhgsmiKmtDestroy(pHgsmiGL);157 }158 RTMemFree(pHgsmiGL);159 }160 161 return NULL;162 }163 #else164 27 static int vboxCrHgsmiInitPerform(VBOXDISPKMT_CALLBACKS *pCallbacks) 165 28 { … … 183 46 } 184 47 185 VBOXCRHGSMI_DECL(int) VBoxCrHgsmiInit( uint32_t crVersionMajor, uint32_t crVersionMinor)48 VBOXCRHGSMI_DECL(int) VBoxCrHgsmiInit() 186 49 { 187 50 if (!g_bVBoxKmtCallbacksInited) … … 189 52 g_bVBoxKmtCallbacksInited = vboxCrHgsmiInitPerform(&g_VBoxCrHgsmiKmtCallbacks); 190 53 Assert(g_bVBoxKmtCallbacksInited); 191 if (g_bVBoxKmtCallbacksInited)192 {193 g_VBoxCrVersionMajor = crVersionMajor;194 g_VBoxCrVersionMinor = crVersionMinor;195 }196 54 } 197 55 … … 205 63 { 206 64 #if 0 207 HRESULT hr = vboxUhgsmiKmtCreate(pHgsmiGL, g_VBoxCrVersionMajor, g_VBoxCrVersionMinor,TRUE /* bD3D tmp for injection thread*/);65 HRESULT hr = vboxUhgsmiKmtCreate(pHgsmiGL, TRUE /* bD3D tmp for injection thread*/); 208 66 #else 209 HRESULT hr = vboxUhgsmiKmtEscCreate(pHgsmiGL, g_VBoxCrVersionMajor, g_VBoxCrVersionMinor,TRUE /* bD3D tmp for injection thread*/);67 HRESULT hr = vboxUhgsmiKmtEscCreate(pHgsmiGL, TRUE /* bD3D tmp for injection thread*/); 210 68 #endif 211 Log(("CrHgsmi: faled to create KmtEsc UHGSMI instance, hr (0x%x)\n", hr));69 Log(("CrHgsmi: faled to create KmtEsc VBOXUHGSMI instance, hr (0x%x)\n", hr)); 212 70 if (hr == S_OK) 213 71 { … … 230 88 } 231 89 } 232 #endif233 90 234 91 VBOXCRHGSMI_DECL(int) VBoxCrHgsmiTerm() … … 256 113 { 257 114 PVBOXUHGSMI_PRIVATE_BASE pHgsmiPrivate = (PVBOXUHGSMI_PRIVATE_BASE)pHgsmi; 258 int rc = VBoxCrHgsmiPrivateCtlConGetClientID(pHgsmiPrivate, pu32ClientID);115 int rc = vboxCrHgsmiPrivateCtlConGetClientID(pHgsmiPrivate, pu32ClientID); 259 116 if (!RT_SUCCESS(rc)) 260 117 { … … 267 124 { 268 125 PVBOXUHGSMI_PRIVATE_BASE pHgsmiPrivate = (PVBOXUHGSMI_PRIVATE_BASE)pHgsmi; 269 int rc = VBoxCrHgsmiPrivateCtlConCall(pHgsmiPrivate, pCallInfo, cbCallInfo);126 int rc = vboxCrHgsmiPrivateCtlConCall(pHgsmiPrivate, pCallInfo, cbCallInfo); 270 127 if (!RT_SUCCESS(rc)) 271 128 { -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispCm.cpp
r40483 r42499 23 23 #include <iprt/list.h> 24 24 25 #include <cr_protocol.h> 25 26 26 27 typedef struct VBOXDISPCM_SESSION … … 114 115 HRESULT vboxDispCmCtxCreate(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_CONTEXT pContext) 115 116 { 117 BOOL fIsCrContext; 116 118 VBOXWDDM_CREATECONTEXT_INFO Info = {0}; 117 119 Info.u32IfVersion = pDevice->u32IfVersion; 118 Info.enmType = VBOXDISPMODE_IS_3D(pDevice->pAdapter) ? VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D : VBOXWDDM_CONTEXT_TYPE_CUSTOM_2D; 120 if (VBOXDISPMODE_IS_3D(pDevice->pAdapter)) 121 { 122 Info.enmType = VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D; 123 Info.crVersionMajor = CR_PROTOCOL_VERSION_MAJOR; 124 Info.crVersionMinor = CR_PROTOCOL_VERSION_MINOR; 125 fIsCrContext = TRUE; 126 } 127 else 128 { 129 Info.enmType = VBOXWDDM_CONTEXT_TYPE_CUSTOM_2D; 130 fIsCrContext = FALSE; 131 } 119 132 Info.hUmEvent = (uint64_t)g_pVBoxCmMgr.Session.hEvent; 120 133 Info.u64UmInfo = (uint64_t)pContext; … … 151 164 vboxDispCmSessionCtxAdd(&g_pVBoxCmMgr.Session, pContext); 152 165 pContext->pDevice = pDevice; 166 if (fIsCrContext) 167 vboxUhgsmiD3DEscInit(&pDevice->Uhgsmi, pDevice); 153 168 } 154 169 else -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.def
r36867 r42499 18 18 OpenAdapter 19 19 VBoxDispMpGetCallbacks 20 VBoxDispCrHgsmiInit21 VBoxDispCrHgsmiTerm22 VBoxDispCrHgsmiQueryClient -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.h
r41858 r42499 207 207 D3DVIEWPORT9 ViewPort; 208 208 VBOXWDDMDISP_CONTEXT DefaultContext; 209 #ifdef VBOX_WITH_CRHGSMI210 209 VBOXUHGSMI_PRIVATE_D3D Uhgsmi; 211 #endif212 210 213 211 /* no lock is needed for this since we're guaranteed the per-device calls are not reentrant */ … … 312 310 #define VBOXDISP_CUBEMAP_INDEX_TO_FACE(pRc, idx) ((D3DCUBEMAP_FACES)(D3DCUBEMAP_FACE_POSITIVE_X+(idx)%VBOXDISP_CUBEMAP_LEVELS_COUNT(pRc))) 313 311 #define VBOXDISP_CUBEMAP_INDEX_TO_LEVEL(pRc, idx) ((idx)%VBOXDISP_CUBEMAP_LEVELS_COUNT(pRc)) 314 315 #ifdef VBOX_WITH_CRHGSMI316 HRESULT vboxUhgsmiGlobalSetCurrent();317 HRESULT vboxUhgsmiGlobalClearCurrent();318 #endif319 312 320 313 DECLINLINE(PVBOXWDDMDISP_SWAPCHAIN) vboxWddmSwapchainForAlloc(PVBOXWDDMDISP_ALLOCATION pAlloc) -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispMp.cpp
r41374 r42499 74 74 g_VBoxDispMp.cbEscapeCmd = 0; 75 75 vboxVideoCmIterInit(&g_VBoxDispMp.Iterator, NULL, 0); 76 #ifdef VBOX_WITH_CRHGSMI77 vboxUhgsmiGlobalSetCurrent();78 #endif79 76 LeaveCriticalSection(&g_VBoxDispMp.CritSect); 80 77 return S_OK; … … 90 87 g_VBoxDispMp.pEscapeCmd = NULL; 91 88 } 92 #ifdef VBOX_WITH_CRHGSMI93 vboxUhgsmiGlobalClearCurrent();94 #endif95 89 LeaveCriticalSection(&g_VBoxDispMp.CritSect); 96 90 return S_OK; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiBase.h
r41058 r42499 33 33 #endif 34 34 35 #if 0 35 36 typedef DECLCALLBACK(int) FNVBOXCRHGSMI_CTLCON_CALL(struct VBOXUHGSMI_PRIVATE_BASE *pHgsmi, struct VBoxGuestHGCMCallInfo *pCallInfo, int cbCallInfo); 36 37 typedef FNVBOXCRHGSMI_CTLCON_CALL *PFNVBOXCRHGSMI_CTLCON_CALL; 37 38 38 #define VBoxCrHgsmiPrivateCtlConCall(_pHgsmi, _pCallInfo, _cbCallInfo) (_pHgsmi->pfnCtlConCall((_pHgsmi), (_pCallInfo), (_cbCallInfo)))39 #define vboxCrHgsmiPrivateCtlConCall(_pHgsmi, _pCallInfo, _cbCallInfo) (_pHgsmi->pfnCtlConCall((_pHgsmi), (_pCallInfo), (_cbCallInfo))) 39 40 40 41 … … 42 43 typedef FNVBOXCRHGSMI_CTLCON_GETCLIENTID *PFNVBOXCRHGSMI_CTLCON_GETCLIENTID; 43 44 44 #define VBoxCrHgsmiPrivateCtlConGetClientID(_pHgsmi, _pu32ClientID) (_pHgsmi->pfnCtlConGetClientID((_pHgsmi), (_pu32ClientID))) 45 45 #define vboxCrHgsmiPrivateCtlConGetClientID(_pHgsmi, _pu32ClientID) (_pHgsmi->pfnCtlConGetClientID((_pHgsmi), (_pu32ClientID))) 46 #else 47 int vboxCrHgsmiPrivateCtlConCall(struct VBOXUHGSMI_PRIVATE_BASE *pHgsmi, struct VBoxGuestHGCMCallInfo *pCallInfo, int cbCallInfo); 48 int vboxCrHgsmiPrivateCtlConGetClientID(struct VBOXUHGSMI_PRIVATE_BASE *pHgsmi, uint32_t *pu32ClientID); 49 #endif 50 51 typedef DECLCALLBACK(int) FNVBOXCRHGSMI_ESCAPE(struct VBOXUHGSMI_PRIVATE_BASE *pHgsmi, void *pvData, uint32_t cbData, BOOL fHwAccess); 52 typedef FNVBOXCRHGSMI_ESCAPE *PFNVBOXCRHGSMI_ESCAPE; 53 54 #define vboxCrHgsmiPrivateEscape(_pHgsmi, _pvData, _cbData, _fHwAccess) (_pHgsmi->pfnEscape((_pHgsmi), (_pvData), (_cbData), (_fHwAccess))) 46 55 47 56 typedef struct VBOXUHGSMI_PRIVATE_BASE 48 57 { 49 58 VBOXUHGSMI Base; 50 PFNVBOXCRHGSMI_CTLCON_CALL pfnCtlConCall; 51 PFNVBOXCRHGSMI_CTLCON_GETCLIENTID pfnCtlConGetClientID; 52 #ifdef VBOX_CRHGSMI_WITH_D3DDEV 53 HVBOXCRHGSMI_CLIENT hClient; 54 #endif 59 PFNVBOXCRHGSMI_ESCAPE pfnEscape; 55 60 } VBOXUHGSMI_PRIVATE_BASE, *PVBOXUHGSMI_PRIVATE_BASE; 56 61 … … 58 63 { 59 64 VBOXUHGSMI_BUFFER Base; 65 PVBOXUHGSMI_PRIVATE_BASE pHgsmi; 66 } VBOXUHGSMI_BUFFER_PRIVATE_BASE, *PVBOXUHGSMI_BUFFER_PRIVATE_BASE; 67 68 typedef struct VBOXUHGSMI_BUFFER_PRIVATE_ESC_BASE 69 { 70 VBOXUHGSMI_BUFFER_PRIVATE_BASE PrivateBase; 71 VBOXVIDEOCM_UM_ALLOC Alloc; 60 72 HANDLE hSynch; 73 } VBOXUHGSMI_BUFFER_PRIVATE_ESC_BASE, *PVBOXUHGSMI_BUFFER_PRIVATE_ESC_BASE; 74 75 typedef struct VBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE 76 { 77 VBOXUHGSMI_BUFFER_PRIVATE_BASE PrivateBase; 61 78 D3DKMT_HANDLE hAllocation; 62 } VBOXUHGSMI_BUFFER_PRIVATE_BASE, *PVBOXUHGSMI_BUFFER_PRIVATE_BASE; 79 UINT aLockPageIndices[1]; 80 } VBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE, *PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE; 63 81 64 82 #define VBOXUHGSMIBASE_GET_PRIVATE(_p, _t) ((_t*)(((uint8_t*)_p) - RT_OFFSETOF(_t, Base))) … … 66 84 #define VBOXUHGSMIBASE_GET_BUFFER(_p) VBOXUHGSMIBASE_GET_PRIVATE(_p, VBOXUHGSMI_BUFFER_PRIVATE_BASE) 67 85 86 #define VBOXUHGSMIPRIVATEBASE_GET_PRIVATE(_p, _t) ((_t*)(((uint8_t*)_p) - RT_OFFSETOF(_t, PrivateBase.Base))) 87 #define VBOXUHGSMIESCBASE_GET_BUFFER(_p) VBOXUHGSMIPRIVATEBASE_GET_PRIVATE(_p, VBOXUHGSMI_BUFFER_PRIVATE_ESC_BASE) 88 #define VBOXUHGSMDXALLOCBASE_GET_BUFFER(_p) VBOXUHGSMIPRIVATEBASE_GET_PRIVATE(_p, VBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE) 68 89 69 90 DECLINLINE(int) vboxUhgsmiBaseLockData(PVBOXUHGSMI_BUFFER pBuf, uint32_t offLock, uint32_t cbLock, VBOXUHGSMI_BUFFER_LOCK_FLAGS fFlags, … … 120 141 } 121 142 122 DECLINLINE(int) vboxUhgsmiBaseEventChkCreate(VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType, HANDLE *phSynch) 123 { 124 *phSynch = NULL; 125 126 if (fUhgsmiType.fCommand) 127 { 128 *phSynch = CreateEvent( 129 NULL, /* LPSECURITY_ATTRIBUTES lpEventAttributes */ 130 FALSE, /* BOOL bManualReset */ 131 FALSE, /* BOOL bInitialState */ 132 NULL /* LPCTSTR lpName */ 133 ); 134 Assert(*phSynch); 135 if (!*phSynch) 136 { 137 DWORD winEr = GetLastError(); 138 /* todo: translate winer */ 139 return VERR_GENERAL_FAILURE; 140 } 141 } 142 return VINF_SUCCESS; 143 } 144 143 #if 0 145 144 DECLINLINE(int) vboxUhgsmiBaseDmaFill(PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers, 146 145 VOID* pCommandBuffer, UINT *pCommandBufferSize, … … 196 195 return VINF_SUCCESS; 197 196 } 197 #endif 198 199 DECLCALLBACK(int) vboxUhgsmiBaseEscBufferLock(PVBOXUHGSMI_BUFFER pBuf, uint32_t offLock, uint32_t cbLock, VBOXUHGSMI_BUFFER_LOCK_FLAGS fFlags, void**pvLock); 200 DECLCALLBACK(int) vboxUhgsmiBaseEscBufferUnlock(PVBOXUHGSMI_BUFFER pBuf); 201 int vboxUhgsmiBaseBufferTerm(PVBOXUHGSMI_BUFFER_PRIVATE_ESC_BASE pBuffer); 202 static int vboxUhgsmiBaseEventChkCreate(VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType, HANDLE *phSynch); 203 int vboxUhgsmiKmtEscBufferInit(PVBOXUHGSMI_PRIVATE_BASE pPrivate, PVBOXUHGSMI_BUFFER_PRIVATE_ESC_BASE pBuffer, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType, PFNVBOXUHGSMI_BUFFER_DESTROY pfnDestroy); 204 DECLCALLBACK(int) vboxUhgsmiBaseEscBufferSubmit(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers); 205 DECLCALLBACK(int) vboxUhgsmiBaseEscBufferDestroy(PVBOXUHGSMI_BUFFER pBuf); 206 DECLCALLBACK(int) vboxUhgsmiBaseEscBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType, PVBOXUHGSMI_BUFFER* ppBuf); 207 DECLINLINE(void) vboxUhgsmiBaseInit(PVBOXUHGSMI_PRIVATE_BASE pHgsmi, PFNVBOXCRHGSMI_ESCAPE pfnEscape) 208 { 209 pHgsmi->Base.pfnBufferCreate = vboxUhgsmiBaseEscBufferCreate; 210 pHgsmi->Base.pfnBufferSubmit = vboxUhgsmiBaseEscBufferSubmit; 211 pHgsmi->pfnEscape = pfnEscape; 212 } 198 213 199 214 #endif /* #ifndef ___VBoxUhgsmiBase_h__ */ -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiDisp.cpp
r41058 r42499 19 19 #include "VBoxDispD3DCmn.h" 20 20 21 #define VBOXUHGSMID3D_GET_PRIVATE(_p, _t) ((_t*)(((uint8_t*)_p) - RT_OFFSETOF(_t, BasePrivate.Base))) 22 #define VBOXUHGSMID3D_GET(_p) VBOXUHGSMID3D_GET_PRIVATE(_p, VBOXUHGSMI_PRIVATE_D3D) 23 24 #if 0 25 #define VBOXUHGSMID3D_GET_BUFFER(_p) VBOXUHGSMID3D_GET_PRIVATE(_p, VBOXUHGSMI_BUFFER_PRIVATE_D3D) 26 21 27 #include <iprt/mem.h> 22 28 #include <iprt/err.h> … … 29 35 } VBOXUHGSMI_BUFFER_PRIVATE_D3D, *PVBOXUHGSMI_BUFFER_PRIVATE_D3D; 30 36 31 #define VBOXUHGSMID3D_GET_PRIVATE(_p, _t) ((_t*)(((uint8_t*)_p) - RT_OFFSETOF(_t, BasePrivate.Base))) 32 #define VBOXUHGSMID3D_GET(_p) VBOXUHGSMID3D_GET_PRIVATE(_p, VBOXUHGSMI_PRIVATE_D3D) 33 #define VBOXUHGSMID3D_GET_BUFFER(_p) VBOXUHGSMID3D_GET_PRIVATE(_p, VBOXUHGSMI_BUFFER_PRIVATE_D3D) 37 34 38 35 39 DECLCALLBACK(int) vboxUhgsmiD3DBufferDestroy(PVBOXUHGSMI_BUFFER pBuf) … … 210 214 pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiD3DBufferCreate; 211 215 pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiD3DBufferSubmit; 212 pHgsmi->BasePrivate.hClient = NULL;213 216 pHgsmi->pDevice = pDevice; 214 217 return S_OK; 215 218 } 216 219 #endif 220 221 static DECLCALLBACK(int) vboxCrHhgsmiDispEscape(struct VBOXUHGSMI_PRIVATE_BASE *pHgsmi, void *pvData, uint32_t cbData, BOOL fHwAccess) 222 { 223 PVBOXUHGSMI_PRIVATE_D3D pPrivate = VBOXUHGSMID3D_GET(pHgsmi); 224 PVBOXWDDMDISP_DEVICE pDevice = pPrivate->pDevice; 225 D3DDDICB_ESCAPE DdiEscape = {0}; 226 DdiEscape.hContext = pDevice->DefaultContext.ContextInfo.hContext; 227 DdiEscape.hDevice = pDevice->hDevice; 228 DdiEscape.Flags.HardwareAccess = !!fHwAccess; 229 DdiEscape.pPrivateDriverData = pvData; 230 DdiEscape.PrivateDriverDataSize = cbData; 231 HRESULT hr = pDevice->RtCallbacks.pfnEscapeCb(pDevice->pAdapter->hAdapter, &DdiEscape); 232 if (SUCCEEDED(hr)) 233 { 234 return VINF_SUCCESS; 235 } 236 237 WARN(("pfnEscapeCb failed, hr 0x%x", hr)); 238 return VERR_GENERAL_FAILURE; 239 } 240 241 242 void vboxUhgsmiD3DEscInit(PVBOXUHGSMI_PRIVATE_D3D pHgsmi, struct VBOXWDDMDISP_DEVICE *pDevice) 243 { 244 vboxUhgsmiBaseInit(&pHgsmi->BasePrivate, vboxCrHhgsmiDispEscape); 245 pHgsmi->pDevice = pDevice; 246 } -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.cpp
r41058 r42499 22 22 #include <iprt/err.h> 23 23 24 #include <cr_protocol.h> 25 24 26 #ifndef NT_SUCCESS 25 27 # define NT_SUCCESS(_Status) (((NTSTATUS)(_Status)) >= 0) 26 28 #endif 27 29 30 #if 0 28 31 typedef struct VBOXUHGSMI_BUFFER_PRIVATE_KMT 29 32 { 30 33 VBOXUHGSMI_BUFFER_PRIVATE_BASE BasePrivate; 31 PVBOXUHGSMI_PRIVATE_KMT pHgsmi;32 34 CRITICAL_SECTION CritSect; 33 UINT aLockPageIndices[1];34 35 } VBOXUHGSMI_BUFFER_PRIVATE_KMT, *PVBOXUHGSMI_BUFFER_PRIVATE_KMT; 35 36 36 typedef struct VBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC37 {38 VBOXUHGSMI_BUFFER Base;39 PVBOXUHGSMI_PRIVATE_KMT pHgsmi;40 VBOXVIDEOCM_UM_ALLOC Alloc;41 HANDLE hSynch;42 } VBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC, *PVBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC;43 37 44 38 #define VBOXUHGSMIKMT_GET_BUFFER(_p) VBOXUHGSMIKMT_GET_PRIVATE(_p, VBOXUHGSMI_BUFFER_PRIVATE_KMT) 45 #define VBOXUHGSMIKMTESC_GET_PRIVATE(_p, _t) ((_t*)(((uint8_t*)_p) - RT_OFFSETOF(_t, Base)))46 #define VBOXUHGSMIKMTESC_GET_BUFFER(_p) VBOXUHGSMIKMTESC_GET_PRIVATE(_p, VBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC)47 39 48 40 DECLCALLBACK(int) vboxUhgsmiKmtBufferDestroy(PVBOXUHGSMI_BUFFER pBuf) … … 236 228 return VERR_GENERAL_FAILURE; 237 229 } 238 239 240 DECLCALLBACK(int) vboxUhgsmiKmtEscBufferLock(PVBOXUHGSMI_BUFFER pBuf, uint32_t offLock, uint32_t cbLock, VBOXUHGSMI_BUFFER_LOCK_FLAGS fFlags, void**pvLock) 241 { 242 PVBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC pBuffer = VBOXUHGSMIKMTESC_GET_BUFFER(pBuf); 243 *pvLock = (void*)(pBuffer->Alloc.pvData + offLock); 244 return VINF_SUCCESS; 245 } 246 247 DECLCALLBACK(int) vboxUhgsmiKmtEscBufferUnlock(PVBOXUHGSMI_BUFFER pBuf) 248 { 249 return VINF_SUCCESS; 250 } 251 252 DECLCALLBACK(int) vboxUhgsmiKmtEscBufferDestroy(PVBOXUHGSMI_BUFFER pBuf) 253 { 254 PVBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC pBuffer = VBOXUHGSMIKMTESC_GET_BUFFER(pBuf); 255 PVBOXUHGSMI_PRIVATE_KMT pPrivate = pBuffer->pHgsmi; 256 D3DKMT_ESCAPE DdiEscape = {0}; 257 VBOXDISPIFESCAPE_UHGSMI_DEALLOCATE DeallocInfo = {0}; 258 DdiEscape.hAdapter = pPrivate->Adapter.hAdapter; 259 DdiEscape.hDevice = pPrivate->Device.hDevice; 260 DdiEscape.Type = D3DKMT_ESCAPE_DRIVERPRIVATE; 261 //Buf.DdiEscape.Flags.HardwareAccess = 1; 262 DdiEscape.pPrivateDriverData = &DeallocInfo; 263 DdiEscape.PrivateDriverDataSize = sizeof (DeallocInfo); 264 DdiEscape.hContext = pPrivate->Context.hContext; 265 266 DeallocInfo.EscapeHdr.escapeCode = VBOXESC_UHGSMI_DEALLOCATE; 267 DeallocInfo.hAlloc = pBuffer->Alloc.hAlloc; 268 269 NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTEscape(&DdiEscape); 270 if (NT_SUCCESS(Status)) 271 { 272 if (pBuffer->hSynch) 273 CloseHandle(pBuffer->hSynch); 274 RTMemFree(pBuffer); 275 return VINF_SUCCESS; 276 } 277 else 278 { 279 WARN(("pfnD3DKMTEscape failed, Status (0x%x)", Status)); 280 } 281 282 return VERR_GENERAL_FAILURE; 283 } 284 285 DECLCALLBACK(int) vboxUhgsmiKmtEscBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType, PVBOXUHGSMI_BUFFER* ppBuf) 286 { 287 HANDLE hSynch = NULL; 288 if (!cbBuf) 289 return VERR_INVALID_PARAMETER; 290 291 int rc = vboxUhgsmiBaseEventChkCreate(fUhgsmiType, &hSynch); 292 AssertRC(rc); 293 if (RT_FAILURE(rc)) 294 return rc; 295 296 cbBuf = VBOXWDDM_ROUNDBOUND(cbBuf, 0x1000); 297 Assert(cbBuf); 298 uint32_t cPages = cbBuf >> 12; 299 Assert(cPages); 300 301 PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pHgsmi); 302 PVBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC pBuf = (PVBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC)RTMemAllocZ(sizeof (VBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC)); 303 Assert(pBuf); 304 if (pBuf) 305 { 306 struct 307 { 308 D3DKMT_ESCAPE DdiEscape; 309 VBOXDISPIFESCAPE_UHGSMI_ALLOCATE AllocInfo; 310 } Buf; 311 memset(&Buf, 0, sizeof (Buf)); 312 Buf.DdiEscape.hAdapter = pPrivate->Adapter.hAdapter; 313 Buf.DdiEscape.hDevice = pPrivate->Device.hDevice; 314 Buf.DdiEscape.Type = D3DKMT_ESCAPE_DRIVERPRIVATE; 315 //Buf.DdiEscape.Flags.HardwareAccess = 1; 316 Buf.DdiEscape.pPrivateDriverData = &Buf.AllocInfo; 317 Buf.DdiEscape.PrivateDriverDataSize = sizeof (Buf.AllocInfo); 318 Buf.DdiEscape.hContext = pPrivate->Context.hContext; 319 320 Buf.AllocInfo.EscapeHdr.escapeCode = VBOXESC_UHGSMI_ALLOCATE; 321 Buf.AllocInfo.Alloc.cbData = cbBuf; 322 Buf.AllocInfo.Alloc.hSynch = (uint64_t)hSynch; 323 Buf.AllocInfo.Alloc.fUhgsmiType = fUhgsmiType; 324 325 NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTEscape(&Buf.DdiEscape); 326 if (NT_SUCCESS(Status)) 327 { 328 pBuf->Alloc = Buf.AllocInfo.Alloc; 329 Assert(pBuf->Alloc.pvData); 330 pBuf->pHgsmi = pPrivate; 331 pBuf->Base.pfnLock = vboxUhgsmiKmtEscBufferLock; 332 pBuf->Base.pfnUnlock = vboxUhgsmiKmtEscBufferUnlock; 333 pBuf->Base.pfnDestroy = vboxUhgsmiKmtEscBufferDestroy; 334 335 pBuf->Base.fType = fUhgsmiType; 336 pBuf->Base.cbBuffer = Buf.AllocInfo.Alloc.cbData; 337 338 pBuf->hSynch = hSynch; 339 340 *ppBuf = &pBuf->Base; 341 342 return VINF_SUCCESS; 343 } 344 else 345 { 346 WARN(("pfnD3DKMTEscape failed, Status (0x%x)", Status)); 347 rc = VERR_OUT_OF_RESOURCES; 348 } 349 350 RTMemFree(pBuf); 351 } 352 else 353 rc = VERR_NO_MEMORY; 354 355 if (hSynch) 356 CloseHandle(hSynch); 357 358 return rc; 359 } 360 361 DECLCALLBACK(int) vboxUhgsmiKmtEscBufferSubmit(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers) 362 { 363 /* we no chromium will not submit more than three buffers actually, 364 * for simplicity allocate it statically on the stack */ 365 struct 366 { 367 VBOXDISPIFESCAPE_UHGSMI_SUBMIT SubmitInfo; 368 VBOXWDDM_UHGSMI_BUFFER_UI_INFO_ESCAPE aBufInfos[3]; 369 } Buf; 370 371 if (!cBuffers || cBuffers > RT_ELEMENTS(Buf.aBufInfos) + 1) 372 { 373 WARN(("invalid cBuffers!")); 374 return VERR_INVALID_PARAMETER; 375 } 376 377 HANDLE hSynch = VBOXUHGSMIKMTESC_GET_BUFFER(aBuffers[0].pBuf)->hSynch; 378 if (!hSynch) 379 { 380 WARN(("the fist buffer is not command!")); 381 return VERR_INVALID_PARAMETER; 382 } 383 PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pHgsmi); 384 D3DKMT_ESCAPE DdiEscape = {0}; 385 386 DdiEscape.hAdapter = pPrivate->Adapter.hAdapter; 387 DdiEscape.hDevice = pPrivate->Device.hDevice; 388 DdiEscape.Type = D3DKMT_ESCAPE_DRIVERPRIVATE; 389 //Buf.DdiEscape.Flags.HardwareAccess = 1; 390 DdiEscape.pPrivateDriverData = &Buf.SubmitInfo; 391 DdiEscape.PrivateDriverDataSize = RT_OFFSETOF(VBOXDISPIFESCAPE_UHGSMI_SUBMIT, aBuffers[cBuffers]); 392 DdiEscape.hContext = pPrivate->Context.hContext; 393 394 Buf.SubmitInfo.EscapeHdr.escapeCode = VBOXESC_UHGSMI_SUBMIT; 395 Buf.SubmitInfo.EscapeHdr.u32CmdSpecific = cBuffers; 396 for (UINT i = 0; i < cBuffers; ++i) 397 { 398 VBOXWDDM_UHGSMI_BUFFER_UI_INFO_ESCAPE *pSubmInfo = &Buf.SubmitInfo.aBuffers[i]; 399 PVBOXUHGSMI_BUFFER_SUBMIT pBufInfo = &aBuffers[i]; 400 PVBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC pBuf = VBOXUHGSMIKMTESC_GET_BUFFER(pBufInfo->pBuf); 401 pSubmInfo->hAlloc = pBuf->Alloc.hAlloc; 402 pSubmInfo->Info.bDoNotSignalCompletion = 0; 403 if (pBufInfo->fFlags.bEntireBuffer) 404 { 405 pSubmInfo->Info.offData = 0; 406 pSubmInfo->Info.cbData = pBuf->Base.cbBuffer; 407 } 408 else 409 { 410 pSubmInfo->Info.offData = pBufInfo->offData; 411 pSubmInfo->Info.cbData = pBufInfo->cbData; 412 } 413 } 414 415 NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTEscape(&DdiEscape); 416 if (NT_SUCCESS(Status)) 417 { 418 DWORD dwResult = WaitForSingleObject(hSynch, INFINITE); 419 if (dwResult == WAIT_OBJECT_0) 420 return VINF_SUCCESS; 421 WARN(("wait failed, (0x%x)", dwResult)); 422 return VERR_GENERAL_FAILURE; 423 } 424 else 425 { 426 WARN(("pfnD3DKMTEscape failed, Status (0x%x)", Status)); 427 } 428 429 return VERR_GENERAL_FAILURE; 430 } 431 432 static HRESULT vboxUhgsmiKmtEngineCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, 433 uint32_t crVersionMajor, uint32_t crVersionMinor, BOOL bD3D) 230 #endif 231 232 static HRESULT vboxUhgsmiKmtEngineCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, BOOL bD3D) 434 233 { 435 234 HRESULT hr = vboxDispKmtCallbacksInit(&pHgsmi->Callbacks); … … 444 243 hr = vboxDispKmtCreateContext(&pHgsmi->Device, &pHgsmi->Context, 445 244 bD3D ? VBOXWDDM_CONTEXT_TYPE_CUSTOM_UHGSMI_3D : VBOXWDDM_CONTEXT_TYPE_CUSTOM_UHGSMI_GL, 446 crVersionMajor, crVersionMinor,245 CR_PROTOCOL_VERSION_MAJOR, CR_PROTOCOL_VERSION_MINOR, 447 246 NULL, 0); 448 247 if (hr == S_OK) … … 476 275 } 477 276 478 /* Cr calls have <= 3args, we try to allocate it on stack first */ 479 typedef struct VBOXCRHGSMI_CALLDATA 480 { 481 VBOXDISPIFESCAPE_CRHGSMICTLCON_CALL CallHdr; 482 HGCMFunctionParameter aArgs[3]; 483 } VBOXCRHGSMI_CALLDATA, *PVBOXCRHGSMI_CALLDATA; 484 485 static DECLCALLBACK(int) vboxCrHhgsmiKmtEscCtlConCall(struct VBOXUHGSMI_PRIVATE_BASE *pHgsmi, struct VBoxGuestHGCMCallInfo *pCallInfo, int cbCallInfo) 486 { 487 VBOXCRHGSMI_CALLDATA Buf; 488 PVBOXCRHGSMI_CALLDATA pBuf; 489 int cbBuffer = cbCallInfo + RT_OFFSETOF(VBOXCRHGSMI_CALLDATA, CallHdr.CallInfo); 490 491 if (cbBuffer <= sizeof (Buf)) 492 pBuf = &Buf; 493 else 494 { 495 pBuf = (PVBOXCRHGSMI_CALLDATA)RTMemAlloc(cbBuffer); 496 if (!pBuf) 497 { 498 WARN(("RTMemAlloc failed!")); 499 return VERR_NO_MEMORY; 500 } 501 } 502 277 static DECLCALLBACK(int) vboxCrHhgsmiKmtEscape(struct VBOXUHGSMI_PRIVATE_BASE *pHgsmi, void *pvData, uint32_t cbData, BOOL fHwAccess) 278 { 503 279 PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pHgsmi); 504 280 D3DKMT_ESCAPE DdiEscape = {0}; 505 506 281 DdiEscape.hAdapter = pPrivate->Adapter.hAdapter; 507 282 DdiEscape.hDevice = pPrivate->Device.hDevice; 508 283 DdiEscape.Type = D3DKMT_ESCAPE_DRIVERPRIVATE; 509 //Buf.DdiEscape.Flags.HardwareAccess = 1;510 DdiEscape.pPrivateDriverData = p Buf;511 DdiEscape.PrivateDriverDataSize = cb Buffer;284 DdiEscape.Flags.HardwareAccess = !!fHwAccess; 285 DdiEscape.pPrivateDriverData = pvData; 286 DdiEscape.PrivateDriverDataSize = cbData; 512 287 DdiEscape.hContext = pPrivate->Context.hContext; 513 288 514 pBuf->CallHdr.EscapeHdr.escapeCode = VBOXESC_CRHGSMICTLCON_CALL;515 pBuf->CallHdr.EscapeHdr.u32CmdSpecific = 0;516 memcpy(&pBuf->CallHdr.CallInfo, pCallInfo, cbCallInfo);517 518 int rc;519 289 NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTEscape(&DdiEscape); 520 290 if (NT_SUCCESS(Status)) 521 291 { 522 memcpy(pCallInfo, &pBuf->CallHdr.CallInfo, cbCallInfo); 523 rc = VINF_SUCCESS; 524 } 525 else 526 { 527 WARN(("pfnD3DKMTEscape failed, Status (0x%x)", Status)); 528 rc = VERR_GENERAL_FAILURE; 529 } 530 /* cleanup */ 531 if (pBuf != &Buf) 532 RTMemFree(pBuf); 533 534 return rc; 535 } 536 537 static DECLCALLBACK(int) vboxCrHhgsmiKmtEscCtlConGetClientID(struct VBOXUHGSMI_PRIVATE_BASE *pHgsmi, uint32_t *pu32ClientID) 538 { 539 VBOXDISPIFESCAPE GetId = {0}; 540 PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pHgsmi); 541 D3DKMT_ESCAPE DdiEscape = {0}; 542 543 DdiEscape.hAdapter = pPrivate->Adapter.hAdapter; 544 DdiEscape.hDevice = pPrivate->Device.hDevice; 545 DdiEscape.Type = D3DKMT_ESCAPE_DRIVERPRIVATE; 546 //Buf.DdiEscape.Flags.HardwareAccess = 1; 547 DdiEscape.pPrivateDriverData = &GetId; 548 DdiEscape.PrivateDriverDataSize = sizeof (GetId); 549 DdiEscape.hContext = pPrivate->Context.hContext; 550 551 GetId.escapeCode = VBOXESC_CRHGSMICTLCON_GETCLIENTID; 552 553 NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTEscape(&DdiEscape); 554 if (NT_SUCCESS(Status)) 555 { 556 Assert(GetId.u32CmdSpecific); 557 *pu32ClientID = GetId.u32CmdSpecific; 558 return VINF_SUCCESS; 559 } 560 else 561 { 562 *pu32ClientID = 0; 563 WARN(("pfnD3DKMTEscape failed, Status (0x%x)", Status)); 564 } 565 return VERR_GENERAL_FAILURE; 566 } 567 568 HRESULT vboxUhgsmiKmtCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, uint32_t crVersionMajor, uint32_t crVersionMinor, BOOL bD3D) 569 { 570 pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiKmtBufferCreate; 571 pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiKmtBufferSubmit; 572 pHgsmi->BasePrivate.pfnCtlConCall = vboxCrHhgsmiKmtEscCtlConCall; 573 pHgsmi->BasePrivate.pfnCtlConGetClientID = vboxCrHhgsmiKmtEscCtlConGetClientID; 574 #ifdef VBOX_CRHGSMI_WITH_D3DDEV 575 pHgsmi->BasePrivate.hClient = NULL; 292 return VINF_SUCCESS; 293 } 294 295 WARN(("pfnD3DKMTEscape failed, Status (0x%x)", Status)); 296 return VERR_GENERAL_FAILURE; 297 } 298 299 #if 0 300 HRESULT vboxUhgsmiKmtCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, BOOL bD3D) 301 { 302 vboxUhgsmiBaseInit(&pHgsmi->BasePrivate, vboxCrHhgsmiKmtEscape); 303 #error "port me!" 304 return vboxUhgsmiKmtEngineCreate(pHgsmi, bD3D); 305 } 576 306 #endif 577 return vboxUhgsmiKmtEngineCreate(pHgsmi, crVersionMajor, crVersionMinor, bD3D); 578 } 579 580 HRESULT vboxUhgsmiKmtEscCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, uint32_t crVersionMajor, uint32_t crVersionMinor, BOOL bD3D) 581 { 582 pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiKmtEscBufferCreate; 583 pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiKmtEscBufferSubmit; 584 pHgsmi->BasePrivate.pfnCtlConCall = vboxCrHhgsmiKmtEscCtlConCall; 585 pHgsmi->BasePrivate.pfnCtlConGetClientID = vboxCrHhgsmiKmtEscCtlConGetClientID; 586 #ifdef VBOX_CRHGSMI_WITH_D3DDEV 587 pHgsmi->BasePrivate.hClient = NULL; 588 #endif 589 return vboxUhgsmiKmtEngineCreate(pHgsmi, crVersionMajor, crVersionMinor, bD3D); 307 308 HRESULT vboxUhgsmiKmtEscCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, BOOL bD3D) 309 { 310 vboxUhgsmiBaseInit(&pHgsmi->BasePrivate, vboxCrHhgsmiKmtEscape); 311 return vboxUhgsmiKmtEngineCreate(pHgsmi, bD3D); 590 312 } 591 313 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.h
r40483 r42499 36 36 #define VBOXUHGSMIKMT_GET(_p) VBOXUHGSMIKMT_GET_PRIVATE(_p, VBOXUHGSMI_PRIVATE_KMT) 37 37 38 HRESULT vboxUhgsmiKmtCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, uint32_t crVersionMajor, uint32_t crVersionMinor, BOOL bD3D); 38 #if 0 39 HRESULT vboxUhgsmiKmtCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, BOOL bD3D); 40 #endif 39 41 HRESULT vboxUhgsmiKmtDestroy(PVBOXUHGSMI_PRIVATE_KMT pHgsmi); 40 42 41 HRESULT vboxUhgsmiKmtEscCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, uint32_t crVersionMajor, uint32_t crVersionMinor,BOOL bD3D);43 HRESULT vboxUhgsmiKmtEscCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, BOOL bD3D); 42 44 43 45 -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/d3d9/d3d9_private.h
r40388 r42499 192 192 193 193 HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapter, D3DDEVTYPE device_type, 194 HWND focus_window, DWORD flags, D3DPRESENT_PARAMETERS *parameters) DECLSPEC_HIDDEN; 194 HWND focus_window, DWORD flags 195 #ifdef VBOX_WITH_WDDM 196 , VBOXWINEEX_D3DPRESENT_PARAMETERS *parameters 197 #else 198 , D3DPRESENT_PARAMETERS *parameters 199 #endif 200 ) DECLSPEC_HIDDEN; 195 201 196 202 /* IDirect3DDevice9: */ -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/d3d9/device.c
r40388 r42499 3153 3153 }; 3154 3154 3155 #ifdef VBOX_WITH_WDDM 3156 # define PP_BASE(_p) (&(_p)->Base) 3157 #else 3158 # define PP_BASE(_p) (_p) 3159 #endif 3155 3160 HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapter, D3DDEVTYPE device_type, 3156 HWND focus_window, DWORD flags, D3DPRESENT_PARAMETERS *parameters) 3161 HWND focus_window, DWORD flags 3162 #ifdef VBOX_WITH_WDDM 3163 , VBOXWINEEX_D3DPRESENT_PARAMETERS *parameters 3164 #else 3165 , D3DPRESENT_PARAMETERS *parameters 3166 #endif 3167 ) 3157 3168 { 3158 3169 WINED3DPRESENT_PARAMETERS *wined3d_parameters; … … 3209 3220 for (i = 0; i < count; ++i) 3210 3221 { 3211 wined3d_parameters[i].BackBufferWidth = parameters[i].BackBufferWidth;3212 wined3d_parameters[i].BackBufferHeight = parameters[i].BackBufferHeight;3213 wined3d_parameters[i].BackBufferFormat = wined3dformat_from_d3dformat( parameters[i].BackBufferFormat);3214 wined3d_parameters[i].BackBufferCount = parameters[i].BackBufferCount;3215 wined3d_parameters[i].MultiSampleType = parameters[i].MultiSampleType;3216 wined3d_parameters[i].MultiSampleQuality = parameters[i].MultiSampleQuality;3217 wined3d_parameters[i].SwapEffect = parameters[i].SwapEffect;3218 wined3d_parameters[i].hDeviceWindow = parameters[i].hDeviceWindow;3219 wined3d_parameters[i].Windowed = parameters[i].Windowed;3220 wined3d_parameters[i].EnableAutoDepthStencil = parameters[i].EnableAutoDepthStencil;3222 wined3d_parameters[i].BackBufferWidth = PP_BASE(¶meters[i])->BackBufferWidth; 3223 wined3d_parameters[i].BackBufferHeight =PP_BASE(¶meters[i])->BackBufferHeight; 3224 wined3d_parameters[i].BackBufferFormat = wined3dformat_from_d3dformat(PP_BASE(¶meters[i])->BackBufferFormat); 3225 wined3d_parameters[i].BackBufferCount = PP_BASE(¶meters[i])->BackBufferCount; 3226 wined3d_parameters[i].MultiSampleType =PP_BASE(¶meters[i])->MultiSampleType; 3227 wined3d_parameters[i].MultiSampleQuality =PP_BASE(¶meters[i])->MultiSampleQuality; 3228 wined3d_parameters[i].SwapEffect =PP_BASE(¶meters[i])->SwapEffect; 3229 wined3d_parameters[i].hDeviceWindow =PP_BASE(¶meters[i])->hDeviceWindow; 3230 wined3d_parameters[i].Windowed =PP_BASE(¶meters[i])->Windowed; 3231 wined3d_parameters[i].EnableAutoDepthStencil =PP_BASE(¶meters[i])->EnableAutoDepthStencil; 3221 3232 wined3d_parameters[i].AutoDepthStencilFormat = 3222 wined3dformat_from_d3dformat( parameters[i].AutoDepthStencilFormat);3223 wined3d_parameters[i].Flags = parameters[i].Flags;3224 wined3d_parameters[i].FullScreen_RefreshRateInHz = parameters[i].FullScreen_RefreshRateInHz;3225 wined3d_parameters[i].PresentationInterval = parameters[i].PresentationInterval;3233 wined3dformat_from_d3dformat(PP_BASE(¶meters[i])->AutoDepthStencilFormat); 3234 wined3d_parameters[i].Flags =PP_BASE(¶meters[i])->Flags; 3235 wined3d_parameters[i].FullScreen_RefreshRateInHz =PP_BASE(¶meters[i])->FullScreen_RefreshRateInHz; 3236 wined3d_parameters[i].PresentationInterval =PP_BASE(¶meters[i])->PresentationInterval; 3226 3237 wined3d_parameters[i].AutoRestoreDisplayMode = TRUE; 3238 #ifdef VBOX_WITH_WDDM 3239 wined3d_parameters[i].pHgsmi = parameters[i].pHgsmi; 3240 #endif 3227 3241 } 3228 3242 … … 3244 3258 for (i = 0; i < count; ++i) 3245 3259 { 3246 parameters[i].BackBufferWidth = wined3d_parameters[i].BackBufferWidth;3247 parameters[i].BackBufferHeight = wined3d_parameters[i].BackBufferHeight;3248 parameters[i].BackBufferFormat = d3dformat_from_wined3dformat(wined3d_parameters[i].BackBufferFormat);3249 parameters[i].BackBufferCount = wined3d_parameters[i].BackBufferCount;3250 parameters[i].MultiSampleType = wined3d_parameters[i].MultiSampleType;3251 parameters[i].MultiSampleQuality = wined3d_parameters[i].MultiSampleQuality;3252 parameters[i].SwapEffect = wined3d_parameters[i].SwapEffect;3253 parameters[i].hDeviceWindow = wined3d_parameters[i].hDeviceWindow;3254 parameters[i].Windowed = wined3d_parameters[i].Windowed;3255 parameters[i].EnableAutoDepthStencil = wined3d_parameters[i].EnableAutoDepthStencil;3256 parameters[i].AutoDepthStencilFormat =3260 PP_BASE(¶meters[i])->BackBufferWidth = wined3d_parameters[i].BackBufferWidth; 3261 PP_BASE(¶meters[i])->BackBufferHeight = wined3d_parameters[i].BackBufferHeight; 3262 PP_BASE(¶meters[i])->BackBufferFormat = d3dformat_from_wined3dformat(wined3d_parameters[i].BackBufferFormat); 3263 PP_BASE(¶meters[i])->BackBufferCount = wined3d_parameters[i].BackBufferCount; 3264 PP_BASE(¶meters[i])->MultiSampleType = wined3d_parameters[i].MultiSampleType; 3265 PP_BASE(¶meters[i])->MultiSampleQuality = wined3d_parameters[i].MultiSampleQuality; 3266 PP_BASE(¶meters[i])->SwapEffect = wined3d_parameters[i].SwapEffect; 3267 PP_BASE(¶meters[i])->hDeviceWindow = wined3d_parameters[i].hDeviceWindow; 3268 PP_BASE(¶meters[i])->Windowed = wined3d_parameters[i].Windowed; 3269 PP_BASE(¶meters[i])->EnableAutoDepthStencil = wined3d_parameters[i].EnableAutoDepthStencil; 3270 PP_BASE(¶meters[i])->AutoDepthStencilFormat = 3257 3271 d3dformat_from_wined3dformat(wined3d_parameters[i].AutoDepthStencilFormat); 3258 parameters[i].Flags = wined3d_parameters[i].Flags;3259 parameters[i].FullScreen_RefreshRateInHz = wined3d_parameters[i].FullScreen_RefreshRateInHz;3260 parameters[i].PresentationInterval = wined3d_parameters[i].PresentationInterval;3272 PP_BASE(¶meters[i])->Flags = wined3d_parameters[i].Flags; 3273 PP_BASE(¶meters[i])->FullScreen_RefreshRateInHz = wined3d_parameters[i].FullScreen_RefreshRateInHz; 3274 PP_BASE(¶meters[i])->PresentationInterval = wined3d_parameters[i].PresentationInterval; 3261 3275 } 3262 3276 HeapFree(GetProcessHeap(), 0, wined3d_parameters); -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/d3d9/directx.c
r40389 r42499 523 523 } 524 524 525 hr = device_init(object, This->WineD3D, adapter, device_type, focus_window, flags, parameters); 525 hr = device_init(object, This->WineD3D, adapter, device_type, focus_window, flags, 526 #ifdef VBOX_WITH_WDDM 527 (VBOXWINEEX_D3DPRESENT_PARAMETERS *) 528 #endif 529 parameters); 526 530 if (FAILED(hr)) 527 531 { -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/vbox/VBoxWineEx.h
r40388 r42499 84 84 VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DSwapchain9Present(IDirect3DSwapChain9 *iface, 85 85 IDirect3DSurface9 *surf); /* use the given surface as a frontbuffer content source */ 86 87 typedef struct VBOXWINEEX_D3DPRESENT_PARAMETERS 88 { 89 D3DPRESENT_PARAMETERS Base; 90 struct VBOXUHGSMI *pHgsmi; 91 } VBOXWINEEX_D3DPRESENT_PARAMETERS, *PVBOXWINEEX_D3DPRESENT_PARAMETERS; 86 92 #ifdef __cplusplus 87 93 } -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/vbox/libWineStub/include/wine/wined3d.h
r42285 r42499 2262 2262 UINT PresentationInterval; 2263 2263 BOOL AutoRestoreDisplayMode; 2264 #ifdef VBOX_WITH_WDDM 2265 struct VBOXUHGSMI *pHgsmi; 2266 #endif 2264 2267 } WINED3DPRESENT_PARAMETERS; 2265 2268 typedef struct _WINED3DSURFACE_DESC { -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/context.c
r42285 r42499 1532 1532 *****************************************************************************/ 1533 1533 struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3DSurfaceImpl *target, 1534 const struct wined3d_format_desc *ds_format_desc) 1534 const struct wined3d_format_desc *ds_format_desc 1535 #ifdef VBOX_WITH_WDDM 1536 , struct VBOXUHGSMI *pHgsmi 1537 #endif 1538 ) 1535 1539 { 1536 1540 IWineD3DDeviceImpl *device = swapchain->device; … … 1549 1553 TRACE("swapchain %p, target %p, window %p.\n", swapchain, target, swapchain->win_handle); 1550 1554 1555 #ifdef VBOX_WITH_WDDM 1556 if (!pHgsmi) 1557 { 1558 ERR("HGSMI should be specified!"); 1559 return NULL; 1560 } 1561 #endif 1562 1551 1563 ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ret)); 1552 1564 if (!ret) … … 1644 1656 } 1645 1657 1646 ctx = pwglCreateContext(hdc); 1658 ctx = pVBoxCreateContext(hdc 1659 #ifdef VBOX_WITH_WDDM 1660 , pHgsmi 1661 #else 1662 , NULL 1663 #endif 1664 ); 1647 1665 if (device->numContexts) 1648 1666 { … … 1955 1973 { 1956 1974 Assert(!device->NumberOfSwapChains); 1957 context = context_create(swapchain, target, ds_format_desc); 1975 context = context_create(swapchain, target, ds_format_desc 1976 #ifdef VBOX_WITH_WDDM 1977 , device->pHgsmi 1978 #endif 1979 ); 1958 1980 } 1959 1981 else -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/device.c
r42408 r42499 1605 1605 if(!This->adapter->opengl) return WINED3DERR_INVALIDCALL; 1606 1606 1607 #ifdef VBOX_WITH_WDDM 1608 if (!pPresentationParameters->pHgsmi) 1609 { 1610 ERR("hgsmi not specified!"); 1611 return WINED3DERR_INVALIDCALL; 1612 } 1613 This->pHgsmi = pPresentationParameters->pHgsmi; 1614 #endif 1607 1615 TRACE("(%p) : Creating stateblock\n", This); 1608 1616 /* Creating the startup stateBlock - Note Special Case: 0 => Don't fill in yet! */ … … 6456 6464 IWineD3DSurfaceImpl *target; 6457 6465 6466 #ifdef VBOX_WITH_WDDM 6467 ERR("Should not be here!"); 6468 #endif 6469 6458 6470 #ifndef VBOX_WITH_WDDM 6459 6471 /* Recreate the primary swapchain's context */ … … 6467 6479 6468 6480 target = (IWineD3DSurfaceImpl *)(swapchain->backBuffer ? swapchain->backBuffer[0] : swapchain->frontBuffer); 6469 if (!(context = context_create(swapchain, target, swapchain->ds_format))) 6481 if (!(context = context_create(swapchain, target, swapchain->ds_format 6482 #ifdef VBOX_WITH_WDDM 6483 , This->pHgsmi 6484 #endif 6485 ))) 6470 6486 { 6471 6487 WARN("Failed to create context.\n"); -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/directx.c
r42285 r42499 36 36 #include <stdio.h> 37 37 #include "wined3d_private.h" 38 39 #ifdef VBOX_WITH_WDDM 40 # include <VBox/VBoxCrHgsmi.h> 41 #endif 38 42 39 43 WINE_DEFAULT_DEBUG_CHANNEL(d3d); … … 254 258 } 255 259 256 static BOOL WineD3D_CreateFakeGLContext(struct wined3d_fake_gl_ctx *ctx )260 static BOOL WineD3D_CreateFakeGLContext(struct wined3d_fake_gl_ctx *ctx, struct VBOXUHGSMI *pHgsmi) 257 261 { 258 262 PIXELFORMATDESCRIPTOR pfd; … … 300 304 301 305 /* Create a GL context. */ 302 ctx->gl_ctx = p wglCreateContext(ctx->dc);306 ctx->gl_ctx = pVBoxCreateContext(ctx->dc, pHgsmi); 303 307 if (!ctx->gl_ctx) 304 308 { … … 5309 5313 BOOL ret; 5310 5314 int ps_selected_mode, vs_selected_mode; 5315 struct VBOXUHGSMI *pHgsmi = NULL; 5311 5316 5312 5317 /* No need to hold any lock. The calling library makes sure only one thread calls … … 5355 5360 #define USE_WGL_FUNC(pfn) p##pfn = (void*)GetProcAddress(mod_gl, #pfn); 5356 5361 WGL_FUNCS_GEN; 5362 VBOX_FUNCS_GEN; 5357 5363 #undef USE_WGL_FUNC 5358 5364 … … 5380 5386 glDisableWINE = glDisable; 5381 5387 5388 #ifdef VBOX_WITH_WDDM 5389 pHgsmi = VBoxCrHgsmiCreate(); 5390 if (!pHgsmi) 5391 { 5392 ERR("VBoxCrHgsmiCreate failed"); 5393 goto nogl_adapter; 5394 } 5395 #endif 5396 5382 5397 /* For now only one default adapter */ 5383 5398 { … … 5406 5421 adapter->luid.HighPart, adapter->luid.LowPart); 5407 5422 5408 if (!WineD3D_CreateFakeGLContext(&fake_gl_ctx ))5423 if (!WineD3D_CreateFakeGLContext(&fake_gl_ctx, pHgsmi)) 5409 5424 { 5410 5425 ERR("Failed to get a gl context for default adapter\n"); … … 5595 5610 TRACE("%u adapters successfully initialized\n", This->adapter_count); 5596 5611 5612 #ifdef VBOX_WITH_WDDM 5613 VBoxCrHgsmiDestroy(pHgsmi); 5614 pHgsmi = NULL; 5615 #endif 5616 5597 5617 return TRUE; 5598 5618 … … 5615 5635 #endif 5616 5636 initPixelFormatsNoGL(&This->adapters[0].gl_info); 5637 5638 #ifdef VBOX_WITH_WDDM 5639 if (pHgsmi) 5640 { 5641 VBoxCrHgsmiDestroy(pHgsmi); 5642 pHgsmi = NULL; 5643 } 5644 #endif 5617 5645 5618 5646 This->adapter_count = 1; -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/swapchain.c
r39869 r42499 1233 1233 TRACE("Creating a new context for swapchain %p, thread %d\n", This, GetCurrentThreadId()); 1234 1234 1235 if (!(ctx = context_create(This, (IWineD3DSurfaceImpl *)This->frontBuffer, This->ds_format))) 1235 #ifdef VBOX_WITH_WDDM 1236 ERR("Should not be here"); 1237 #endif 1238 1239 if (!(ctx = context_create(This, (IWineD3DSurfaceImpl *)This->frontBuffer, This->ds_format 1240 #ifdef VBOX_WITH_WDDM 1241 , This->device->pHgsmi 1242 #endif 1243 ))) 1236 1244 { 1237 1245 ERR("Failed to create a new context for the swapchain\n"); -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/vboxext.c
r42408 r42499 18 18 #include "wined3d_private.h" 19 19 #include "vboxext.h" 20 #ifdef VBOX_WITH_WDDM 21 #include <VBox/VBoxCrHgsmi.h> 22 #include <iprt/err.h> 23 #endif 20 24 21 25 WINE_DEFAULT_DEBUG_CHANNEL(d3d_vbox); … … 282 286 { 283 287 HRESULT hr = S_OK; 288 #ifdef VBOX_WITH_WDDM 289 int rc = VBoxCrHgsmiInit(); 290 if (!RT_SUCCESS(rc)) 291 { 292 ERR("VBoxCrHgsmiInit failed rc %d", rc); 293 return E_FAIL; 294 } 295 #endif 284 296 memset(&g_VBoxExtGlobal, 0, sizeof (g_VBoxExtGlobal)); 285 297 hr = VBoxExtWorkerCreate(&g_VBoxExtGlobal.Worker); 298 if (SUCCEEDED(hr)) 299 return S_OK; 300 301 /* failure branch */ 302 #ifdef VBOX_WITH_WDDM 303 VBoxCrHgsmiTerm(); 304 #endif 286 305 return hr; 287 306 } … … 305 324 return hr; 306 325 } 326 327 #ifdef VBOX_WITH_WDDM 328 VBoxCrHgsmiTerm(); 329 #endif 330 307 331 return S_OK; 308 332 } -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/wined3d_gl.h
r41929 r42499 1374 1374 1375 1375 /* WGL functions */ 1376 HGLRC (WINAPI *pwglCreateContext)(HDC) DECLSPEC_HIDDEN;1377 1376 BOOL (WINAPI *pwglDeleteContext)(HGLRC) DECLSPEC_HIDDEN; 1378 1377 HGLRC (WINAPI *pwglGetCurrentContext)(void) DECLSPEC_HIDDEN; … … 1382 1381 BOOL (WINAPI *pwglSwapLayerBuffers)(HDC, UINT) DECLSPEC_HIDDEN; 1383 1382 BOOL (WINAPI *pwglShareLists)(HGLRC, HGLRC) DECLSPEC_HIDDEN; 1383 1384 HGLRC (WINAPI *pVBoxCreateContext)(HDC, struct VBOXUHGSMI*) DECLSPEC_HIDDEN; 1384 1385 1385 1386 #define GL_FUNCS_GEN \ … … 1721 1722 1722 1723 #define WGL_FUNCS_GEN \ 1723 USE_WGL_FUNC(wglCreateContext) \1724 1724 USE_WGL_FUNC(wglDeleteContext) \ 1725 1725 USE_WGL_FUNC(wglGetCurrentContext) \ … … 1729 1729 USE_WGL_FUNC(wglShareLists) \ 1730 1730 USE_WGL_FUNC(wglSwapLayerBuffers) 1731 1732 #define VBOX_FUNCS_GEN \ 1733 USE_WGL_FUNC(VBoxCreateContext) 1731 1734 1732 1735 /* OpenGL extensions. */ -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/wined3d_private.h
r42408 r42499 1283 1283 GLenum fbo_target, DWORD idx, IWineD3DSurfaceImpl *surface) DECLSPEC_HIDDEN; 1284 1284 struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3DSurfaceImpl *target, 1285 const struct wined3d_format_desc *ds_format_desc) DECLSPEC_HIDDEN; 1285 const struct wined3d_format_desc *ds_format_desc 1286 #ifdef VBOX_WITH_WDDM 1287 , struct VBOXUHGSMI *pHgsmi 1288 #endif 1289 ) DECLSPEC_HIDDEN; 1286 1290 struct IWineD3DDeviceImpl *context_get_device(const struct wined3d_context *context); DECLSPEC_HIDDEN; 1287 1291 #ifdef VBOX_WITH_WDDM … … 1800 1804 struct wined3d_context **contexts; 1801 1805 UINT numContexts; 1806 1807 #ifdef VBOX_WITH_WDDM 1808 struct VBOXUHGSMI *pHgsmi; 1809 #endif 1802 1810 1803 1811 #ifdef VBOX_WINE_WITH_SHADER_CACHE -
trunk/src/VBox/Additions/common/crOpenGL/Makefile.kmk
r42220 r42499 212 212 endif 213 213 endif 214 ifdef VBOX_WITH_CRHGSMI 215 VBoxOGL_DEFS.win += VBOX_WITH_CRHGSMI 216 endif 217 ifdef VBOX_WITH_WDDM 218 VBoxOGL_DEFS.win += VBOX_WITH_WDDM 219 endif 214 220 215 221 ifdef VBOX_WITH_WDDM … … 402 408 $(PATH_STAGE_LIB)/additions/VBoxOGLspuload$(VBOX_SUFF_LIB) \ 403 409 $(PATH_STAGE_LIB)/additions/VBoxOGLcrstate$(VBOX_SUFF_LIB) 410 ifdef VBOX_WITH_CRHGSMI 411 VBoxOGLarrayspu_DEFS.win += VBOX_WITH_CRHGSMI 412 endif 413 ifdef VBOX_WITH_WDDM 414 VBoxOGLarrayspu_DEFS.win += VBOX_WITH_WDDM 415 endif 404 416 405 417 ifdef VBOX_WITH_WDDM … … 440 452 VBoxOGLpassthroughspu_LIBS = \ 441 453 $(VBOX_LIB_OGL_CRUTIL) 454 ifdef VBOX_WITH_CRHGSMI 455 VBoxOGLpassthroughspu_DEFS.win += VBOX_WITH_CRHGSMI 456 endif 457 ifdef VBOX_WITH_WDDM 458 VBoxOGLpassthroughspu_DEFS.win += VBOX_WITH_WDDM 459 endif 442 460 443 461 ifdef VBOX_WITH_WDDM … … 510 528 $(PATH_STAGE_LIB)/additions/VBoxOGLcrstate$(VBOX_SUFF_LIB) \ 511 529 $(PATH_STAGE_LIB)/additions/VBoxOGLcrpacker$(VBOX_SUFF_LIB) 530 ifdef VBOX_WITH_CRHGSMI 531 VBoxOGLpackspu_DEFS.win += VBOX_WITH_CRHGSMI 532 endif 533 ifdef VBOX_WITH_WDDM 534 VBoxOGLpackspu_DEFS.win += VBOX_WITH_WDDM 535 endif 512 536 513 537 ifdef VBOX_WITH_WDDM … … 581 605 $(PATH_STAGE_LIB)/additions/VBoxOGLspuload$(VBOX_SUFF_LIB) \ 582 606 $(PATH_STAGE_LIB)/additions/VBoxOGLcrstate$(VBOX_SUFF_LIB) 607 ifdef VBOX_WITH_CRHGSMI 608 VBoxOGLfeedbackspu_DEFS.win += VBOX_WITH_CRHGSMI 609 endif 610 ifdef VBOX_WITH_WDDM 611 VBoxOGLfeedbackspu_DEFS.win += VBOX_WITH_WDDM 612 endif 583 613 584 614 ifdef VBOX_WITH_WDDM -
trunk/src/VBox/Additions/common/crOpenGL/context.c
r41963 r42499 123 123 #ifdef VBOX_WITH_WDDM 124 124 if (stub.bRunningUnderWDDM) 125 { 126 crError("Should not be here: WindowCreate/Destroy & VBoxPackGetInjectID recuire connection id!"); 125 127 winInfo->mapped = 0; 128 } 126 129 else 127 130 #endif … … 148 151 #endif 149 152 #ifdef CR_NEWWINTRACK 150 winInfo->u32ClientID = stub.spu->dispatch_table.VBoxPackGetInjectID( );153 winInfo->u32ClientID = stub.spu->dispatch_table.VBoxPackGetInjectID(0); 151 154 #endif 152 155 winInfo->spuWindow = spuWin; … … 347 350 stub.spu->dispatch_table.DestroyContext( context->spuContext ); 348 351 crHashtableWalk(stub.windowTable, stubWindowCheckOwnerCB, context); 352 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 353 if (context->spuConnection) 354 { 355 stub.spu->dispatch_table.VBoxConDestroy(context->spuConnection); 356 context->spuConnection = 0; 357 } 358 #endif 349 359 } 350 360 … … 379 389 ContextInfo * 380 390 stubNewContext( const char *dpyName, GLint visBits, ContextType type, 381 unsigned long shareCtx ) 382 { 383 GLint spuContext = -1, spuShareCtx = 0; 391 unsigned long shareCtx 392 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 393 , struct VBOXUHGSMI *pHgsmi 394 #endif 395 ) 396 { 397 GLint spuContext = -1, spuShareCtx = 0, spuConnection = 0; 384 398 ContextInfo *context; 385 399 … … 393 407 394 408 if (type == CHROMIUM) { 409 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 410 if (pHgsmi) 411 { 412 spuConnection = stub.spu->dispatch_table.VBoxConCreate(pHgsmi); 413 if (!spuConnection) 414 { 415 crWarning("VBoxConCreate failed"); 416 return NULL; 417 } 418 } 419 #endif 395 420 spuContext 396 = stub.spu->dispatch_table. CreateContext(dpyName, visBits, spuShareCtx);421 = stub.spu->dispatch_table.VBoxCreateContext(spuConnection, dpyName, visBits, spuShareCtx); 397 422 if (spuContext < 0) 423 { 424 crWarning("VBoxCreateContext failed"); 425 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 426 if (spuConnection) 427 stub.spu->dispatch_table.VBoxConDestroy(spuConnection); 428 #endif 398 429 return NULL; 430 } 399 431 } 400 432 … … 402 434 if (!context) { 403 435 stub.spu->dispatch_table.DestroyContext(spuContext); 436 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 437 if (spuConnection) 438 stub.spu->dispatch_table.VBoxConDestroy(spuConnection); 439 #endif 404 440 return NULL; 405 441 } … … 415 451 crStrncpy(context->dpyName, dpyName, MAX_DPY_NAME); 416 452 context->dpyName[MAX_DPY_NAME-1] = 0; 453 454 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 455 context->spuConnection = spuConnection; 456 context->pHgsmi = pHgsmi; 457 #endif 417 458 418 459 #ifdef CHROMIUM_THREADSAFE … … 1019 1060 GLint spuShareCtx = 0; 1020 1061 #endif 1021 1062 GLint spuConnection = 0; 1022 1063 CRASSERT(stub.spu); 1023 1064 CRASSERT(stub.spu->dispatch_table.CreateContext); 1024 1065 context->type = CHROMIUM; 1025 1066 1067 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 1068 if (context->pHgsmi) 1069 { 1070 spuConnection = stub.spu->dispatch_table.VBoxConCreate(context->pHgsmi); 1071 if (!spuConnection) 1072 { 1073 crWarning("VBoxConCreate failed"); 1074 return GL_FALSE; 1075 } 1076 context->spuConnection = spuConnection; 1077 } 1078 #endif 1079 1026 1080 context->spuContext 1027 = stub.spu->dispatch_table. CreateContext(context->dpyName,1028 context->visBits,1029 spuShareCtx);1081 = stub.spu->dispatch_table.VBoxCreateContext(spuConnection, context->dpyName, 1082 context->visBits, 1083 spuShareCtx); 1030 1084 if (window->spuWindow == -1) 1031 1085 { 1032 1086 /*crDebug("(1)stubMakeCurrent ctx=%p(%i) window=%p(%i)", context, context->spuContext, window, window->spuWindow);*/ 1033 window->spuWindow = stub.spu->dispatch_table.WindowCreate( window->dpyName, context->visBits ); 1087 window->spuWindow = stub.spu->dispatch_table.VBoxWindowCreate( 1088 spuConnection, 1089 window->dpyName, context->visBits ); 1034 1090 #ifdef CR_NEWWINTRACK 1035 window->u32ClientID = stub.spu->dispatch_table.VBoxPackGetInjectID( );1091 window->u32ClientID = stub.spu->dispatch_table.VBoxPackGetInjectID(spuConnection); 1036 1092 #endif 1037 1093 } … … 1089 1145 { 1090 1146 /*crDebug("(2)stubMakeCurrent ctx=%p(%i) window=%p(%i)", context, context->spuContext, window, window->spuWindow);*/ 1091 window->spuWindow = stub.spu->dispatch_table.WindowCreate( window->dpyName, context->visBits ); 1147 window->spuWindow = stub.spu->dispatch_table.VBoxWindowCreate( 1148 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 1149 context->spuConnection, 1150 #else 1151 0, 1152 #endif 1153 window->dpyName, context->visBits ); 1092 1154 #ifdef CR_NEWWINTRACK 1093 window->u32ClientID = stub.spu->dispatch_table.VBoxPackGetInjectID(); 1155 window->u32ClientID = stub.spu->dispatch_table.VBoxPackGetInjectID( 1156 # if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 1157 context->spuConnection 1158 # else 1159 0 1160 # endif 1161 ); 1094 1162 #endif 1095 1163 if (context->currentDrawable && context->currentDrawable->type==CHROMIUM … … 1128 1196 window->type = context->type; 1129 1197 window->pOwner = context; 1198 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 1199 window->spuConnection = context->spuConnection; 1200 #endif 1130 1201 context->currentDrawable = window; 1131 1202 stubSetCurrentContext(context); -
trunk/src/VBox/Additions/common/crOpenGL/defs.py
r20635 r42499 495 495 crMakeCurrent 496 496 crSwapBuffers 497 crGetProcAddress""" 497 crGetProcAddress 498 VBoxCreateContext""" 498 499 #print "DllMain" -
trunk/src/VBox/Additions/common/crOpenGL/defs64.py
r29790 r42499 476 476 crMakeCurrent 477 477 crSwapBuffers 478 crGetProcAddress""" 478 crGetProcAddress 479 VBoxCreateContext""" 479 480 #print "DllMain" -
trunk/src/VBox/Additions/common/crOpenGL/feedback/feedback_context.c
r28800 r42499 24 24 25 25 GLint FEEDBACKSPU_APIENTRY 26 feedbackspu_ CreateContext(const char *dpyName, GLint visual, GLint shareCtx )26 feedbackspu_VBoxCreateContext( GLint con, const char *dpyName, GLint visual, GLint shareCtx ) 27 27 { 28 28 GLint ctx, slot; … … 32 32 #endif 33 33 34 ctx = feedback_spu.child. CreateContext(dpyName, visual, shareCtx);34 ctx = feedback_spu.child.VBoxCreateContext(con, dpyName, visual, shareCtx); 35 35 36 36 /* find an empty context slot */ … … 53 53 54 54 return ctx; 55 } 56 57 GLint FEEDBACKSPU_APIENTRY 58 feedbackspu_CreateContext( const char *dpyName, GLint visual, GLint shareCtx ) 59 { 60 return feedbackspu_VBoxCreateContext( 0, dpyName, visual, shareCtx ); 55 61 } 56 62 -
trunk/src/VBox/Additions/common/crOpenGL/feedback/feedback_state.py
r19099 r42499 16 16 #include "feedbackspu_proto.h" 17 17 """ 18 custom = ["CreateContext", " MakeCurrent", "DestroyContext"]18 custom = ["CreateContext", "VBoxCreateContext", "MakeCurrent", "DestroyContext"] 19 19 20 20 keys = apiutil.GetDispatchedFunctions(sys.argv[1]+"/APIspec.txt") -
trunk/src/VBox/Additions/common/crOpenGL/feedback/feedback_state_special
r40431 r42499 64 64 VBoxAttachThread 65 65 VBoxDetachThread 66 VBoxCreateContext -
trunk/src/VBox/Additions/common/crOpenGL/icd_drv.c
r41971 r42499 164 164 #endif 165 165 166 context = stubNewContext(dpyName, desiredVisual, UNDECIDED, 0); 166 context = stubNewContext(dpyName, desiredVisual, UNDECIDED, 0 167 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 168 , NULL 169 #endif 170 ); 167 171 if (!context) 168 172 return 0; -
trunk/src/VBox/Additions/common/crOpenGL/load.c
r41963 r42499 1015 1015 VBOXCR_UPDATEWNDCB RegionsData; 1016 1016 HRESULT hr; 1017 GLint spuConnection = 0; 1017 1018 # endif 1018 1019 #endif … … 1061 1062 } 1062 1063 } 1063 # endif 1064 #endif 1064 # endif /* VBOX_WITH_WDDM */ 1065 #endif /* WINDOWS */ 1065 1066 1066 1067 crLockMutex(&stub.mutex); 1067 stub.spu->dispatch_table.VBoxPackSetInjectThread(); 1068 #if defined(WINDOWS) && defined(VBOX_WITH_WDDM) 1069 spuConnection = 1070 #endif 1071 stub.spu->dispatch_table.VBoxPackSetInjectThread(NULL); 1072 #if defined(WINDOWS) && defined(VBOX_WITH_WDDM) 1073 if (!spuConnection) 1074 { 1075 crError("VBoxPackSetInjectThread failed!"); 1076 } 1077 #endif 1068 1078 crUnlockMutex(&stub.mutex); 1069 1079 … … 1142 1152 VBoxDispMpTstCallbacks.pfnDisableEvents(); 1143 1153 } 1154 if (spuConnection) 1155 { 1156 stub.spu->dispatch_table.VBoxConDestroy(spuConnection); 1157 } 1144 1158 if (hVBoxD3D) 1145 1159 { … … 1203 1217 ns.name = "vboxhgcm://host:0"; 1204 1218 ns.buffer_size = 1024; 1205 crNetServerConnect(&ns); 1219 crNetServerConnect(&ns 1220 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 1221 , NULL 1222 #endif 1223 ); 1206 1224 if (!ns.conn) 1207 1225 { … … 1414 1432 ns.name = "vboxhgcm://host:0"; 1415 1433 ns.buffer_size = 1024; 1416 crNetServerConnect(&ns); 1434 crNetServerConnect(&ns 1435 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 1436 , NULL 1437 #endif 1438 ); 1417 1439 if (!ns.conn) 1418 1440 { -
trunk/src/VBox/Additions/common/crOpenGL/pack/packspu.h
r38143 r42499 67 67 int idxThreadInUse; /*index of any used thread*/ 68 68 69 #if defined(WINDOWS) && defined(VBOX_WITH_WDDM) 70 bool bRunningUnderWDDM; 71 #endif 72 69 73 int numContexts; 70 74 ContextInfo context[CR_MAX_CONTEXTS]; … … 73 77 extern PackSPU pack_spu; 74 78 79 #define THREAD_OFFSET_MAGIC 2000 80 75 81 #ifdef CHROMIUM_THREADSAFE 76 82 extern CRmutex _PackMutex; 77 83 extern CRtsd _PackTSD; 78 #define GET_THREAD(T) ThreadInfo *T = crGetTSD(&_PackTSD) 84 #define GET_THREAD_VAL() (crGetTSD(&_PackTSD)) 85 #define GET_THREAD_VAL_ID(_id) (&(pack_spu.thread[(_id) - THREAD_OFFSET_MAGIC])) 79 86 #else 80 #define GET_THREAD (T) ThreadInfo *T = &(pack_spu.thread[0])87 #define GET_THREAD_VAL() (&(pack_spu.thread[0])) 81 88 #endif 89 #define GET_THREAD(T) ThreadInfo *T = GET_THREAD_VAL() 90 #define GET_THREAD_ID(T, _id) ThreadInfo *T = GET_THREAD_VAL_ID(_id) 91 92 82 93 83 94 #define GET_CONTEXT(C) \ … … 85 96 ContextInfo *C = thread->currentContext 86 97 98 #define CRPACKSPU_WRITEBACK_WAIT(_thread, _writeback) CR_WRITEBACK_WAIT((_thread)->netServer.conn, _writeback) 99 #if defined(WINDOWS) && defined(VBOX_WITH_WDDM) && defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 100 # define CRPACKSPU_IS_WDDM_CRHGSMI() (pack_spu.bRunningUnderWDDM) 101 #else 102 # define CRPACKSPU_IS_WDDM_CRHGSMI() (GL_FALSE) 103 #endif 104 87 105 extern void packspuCreateFunctions( void ); 88 106 extern void packspuSetVBoxConfiguration( const SPU *child_spu ); 89 extern void packspuConnectToServer( CRNetServer *server ); 107 extern void packspuConnectToServer( CRNetServer *server 108 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 109 , struct VBOXUHGSMI *pHgsmi 110 #endif 111 ); 90 112 extern void packspuFlush( void *arg ); 91 113 extern void packspuHuge( CROpcode opcode, void *buf ); … … 93 115 extern GLboolean packspuSyncOnFlushes(); 94 116 95 extern ThreadInfo *packspuNewThread( unsigned long id ); 117 extern ThreadInfo *packspuNewThread( 118 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 119 struct VBOXUHGSMI *pHgsmi 120 #endif 121 ); 96 122 123 extern ThreadInfo *packspuNewCtxThread( struct VBOXUHGSMI *pHgsmi ); 97 124 98 125 #endif /* CR_PACKSPU_H */ -
trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_bufferobject.c
r27091 r42499 20 20 packspuFlush((void *) thread); 21 21 22 while (writeback) 23 crNetRecv(); 22 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 24 23 } 25 24 -
trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_client.c
r35912 r42499 560 560 crPackIsEnabled(cap, &return_val, &writeback); 561 561 packspuFlush( (void *) thread ); 562 while (writeback) 563 crNetRecv(); 562 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 564 563 CRASSERT(return_val==res); 565 564 } -
trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_context.c
r39288 r42499 12 12 13 13 #define MAGIC_OFFSET 3000 14 15 14 16 15 /* … … 21 20 * using threads. 22 21 */ 23 ThreadInfo *packspuNewThread( unsigned long id ) 22 ThreadInfo *packspuNewThread( 23 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 24 struct VBOXUHGSMI *pHgsmi 25 #endif 26 ) 24 27 { 25 28 ThreadInfo *thread=NULL; … … 32 35 #endif 33 36 37 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 38 CRASSERT(!CRPACKSPU_IS_WDDM_CRHGSMI() == !pHgsmi); 39 #endif 40 34 41 CRASSERT(pack_spu.numThreads < MAX_THREADS); 35 42 for (i=0; i<MAX_THREADS; ++i) … … 44 51 45 52 thread->inUse = GL_TRUE; 46 thread->id = id; 53 if (!CRPACKSPU_IS_WDDM_CRHGSMI()) 54 thread->id = crThreadID(); 55 else 56 thread->id = THREAD_OFFSET_MAGIC + i; 47 57 thread->currentContext = NULL; 48 58 thread->bInjectThread = GL_FALSE; … … 52 62 thread->netServer.buffer_size = pack_spu.buffer_size; 53 63 if (pack_spu.numThreads == 0) { 54 packspuConnectToServer( &(thread->netServer) ); 64 packspuConnectToServer( &(thread->netServer) 65 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 66 , pHgsmi 67 #endif 68 ); 55 69 if (!thread->netServer.conn) { 56 70 return NULL; … … 60 74 else { 61 75 /* a new pthread */ 62 crNetNewClient(pack_spu.thread[pack_spu.idxThreadInUse].netServer.conn, &(thread->netServer)); 76 crNetNewClient(pack_spu.thread[pack_spu.idxThreadInUse].netServer.conn, &(thread->netServer) 77 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 78 , pHgsmi 79 #endif 80 ); 63 81 CRASSERT(thread->netServer.conn); 64 82 } … … 75 93 crPackFlushArg( thread->packer, (void *) thread ); 76 94 crPackSendHugeFunc( thread->packer, packspuHuge ); 77 crPackSetContext( thread->packer ); 78 79 #ifdef CHROMIUM_THREADSAFE 80 crSetTSD(&_PackTSD, thread); 95 96 if (!CRPACKSPU_IS_WDDM_CRHGSMI()) 97 { 98 crPackSetContext( thread->packer ); 99 } 100 101 102 #ifdef CHROMIUM_THREADSAFE 103 if (!CRPACKSPU_IS_WDDM_CRHGSMI()) 104 { 105 crSetTSD(&_PackTSD, thread); 106 } 81 107 #endif 82 108 … … 89 115 } 90 116 91 92 117 GLint PACKSPU_APIENTRY 93 packspu_CreateContext( const char *dpyName, GLint visual, GLint shareCtx ) 118 packspu_VBoxConCreate(struct VBOXUHGSMI *pHgsmi) 119 { 120 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 121 ThreadInfo * thread; 122 CRASSERT(CRPACKSPU_IS_WDDM_CRHGSMI()); 123 CRASSERT(pHgsmi); 124 125 thread = packspuNewThread(pHgsmi); 126 127 if (thread) 128 { 129 CRASSERT(thread->id); 130 CRASSERT(thread->id - THREAD_OFFSET_MAGIC < RT_ELEMENTS(pack_spu.thread) 131 && GET_THREAD_VAL_ID(thread->id) == thread); 132 return thread->id; 133 } 134 crError("packspuNewThread failed"); 135 #endif 136 return 0; 137 } 138 139 void PACKSPU_APIENTRY 140 packspu_VBoxConFlush(GLint con) 141 { 142 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 143 GET_THREAD_ID(thread, con); 144 CRASSERT(con); 145 CRASSERT(CRPACKSPU_IS_WDDM_CRHGSMI()); 146 CRASSERT(thread->packer); 147 packspuFlush((void *) thread); 148 #endif 149 } 150 151 void PACKSPU_APIENTRY 152 packspu_VBoxConDestroy(GLint con) 153 { 154 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 155 GET_THREAD_ID(thread, con); 156 CRASSERT(con); 157 CRASSERT(CRPACKSPU_IS_WDDM_CRHGSMI()); 158 CRASSERT(pack_spu.numThreads>0); 159 CRASSERT(thread->packer); 160 packspuFlush((void *) thread); 161 162 crLockMutex(&_PackMutex); 163 164 crPackDeleteContext(thread->packer); 165 166 crNetFreeConnection(thread->netServer.conn); 167 168 pack_spu.numThreads--; 169 /*note can't shift the array here, because other threads have TLS references to array elements*/ 170 crMemZero(thread, sizeof(ThreadInfo)); 171 172 #if 0 173 if (&pack_spu.thread[pack_spu.idxThreadInUse]==thread) 174 { 175 int i; 176 crError("Should not be here since idxThreadInUse should be always 0 for the dummy connection created in packSPUInit!"); 177 for (i=0; i<MAX_THREADS; ++i) 178 { 179 if (pack_spu.thread[i].inUse) 180 { 181 pack_spu.idxThreadInUse=i; 182 break; 183 } 184 } 185 } 186 #endif 187 crUnlockMutex(&_PackMutex); 188 #endif 189 } 190 191 192 GLint PACKSPU_APIENTRY 193 packspu_VBoxCreateContext( GLint con, const char *dpyName, GLint visual, GLint shareCtx ) 94 194 { 95 195 GET_THREAD(thread); 196 CRPackContext * curPacker = crPackGetContext(); 197 ThreadInfo *curThread = thread; 96 198 int writeback = 1; 97 199 GLint serverCtx = (GLint) -1; 98 200 int slot; 99 201 202 CRASSERT(!curThread == !curPacker); 203 CRASSERT(!curThread || !curPacker || curThread->packer == curPacker); 100 204 #ifdef CHROMIUM_THREADSAFE 101 205 crLockMutex(&_PackMutex); 102 206 #endif 103 207 104 if (!thread) { 105 thread = packspuNewThread(crThreadID()); 208 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 209 CRASSERT(!con == !CRPACKSPU_IS_WDDM_CRHGSMI()); 210 #endif 211 212 if (CRPACKSPU_IS_WDDM_CRHGSMI()) 213 { 214 if (!con) 215 { 216 crError("connection should be specified!"); 217 return -1; 218 } 219 thread = GET_THREAD_VAL_ID(con); 220 } 221 else 222 { 223 CRASSERT(!con); 224 if (!thread) 225 { 226 thread = packspuNewThread( 227 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 228 NULL 229 #endif 230 ); 231 } 106 232 } 107 233 CRASSERT(thread); … … 145 271 } 146 272 else { 147 while (writeback) 148 crNetRecv(); 273 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 149 274 150 275 if (pack_spu.swap) { … … 156 281 #endif 157 282 crWarning("Failure in packspu_CreateContext"); 283 284 if (CRPACKSPU_IS_WDDM_CRHGSMI()) 285 { 286 /* restore the packer context to the tls */ 287 crPackSetContext(curPacker); 288 } 158 289 return -1; /* failed */ 159 290 } … … 171 302 } 172 303 304 if (CRPACKSPU_IS_WDDM_CRHGSMI()) 305 { 306 thread->currentContext = &pack_spu.context[slot]; 307 pack_spu.context[slot].currentThread = thread; 308 } 309 173 310 /* Fill in the new context info */ 174 311 /* XXX fix-up sharedCtx param here */ … … 181 318 #endif 182 319 320 if (CRPACKSPU_IS_WDDM_CRHGSMI()) 321 { 322 /* restore the packer context to the tls */ 323 crPackSetContext(curPacker); 324 } 325 183 326 return MAGIC_OFFSET + slot; 184 327 } 185 328 329 GLint PACKSPU_APIENTRY 330 packspu_CreateContext( const char *dpyName, GLint visual, GLint shareCtx ) 331 { 332 return packspu_VBoxCreateContext( 0, dpyName, visual, shareCtx ); 333 } 334 186 335 187 336 void PACKSPU_APIENTRY packspu_DestroyContext( GLint ctx ) 188 337 { 338 GET_THREAD(thread); 339 ThreadInfo *curThread = thread; 189 340 const int slot = ctx - MAGIC_OFFSET; 190 ContextInfo *context ;191 GET_THREAD(thread);341 ContextInfo *context, *curContext; 342 CRPackContext * curPacker = crPackGetContext(); 192 343 193 344 CRASSERT(slot >= 0); 194 345 CRASSERT(slot < pack_spu.numContexts); 346 347 context = &(pack_spu.context[slot]); 348 349 if (CRPACKSPU_IS_WDDM_CRHGSMI()) 350 { 351 thread = context->currentThread; 352 crPackSetContext(thread->packer); 353 CRASSERT(!(thread->packer == curPacker) == !(thread == curThread)); 354 } 195 355 CRASSERT(thread); 196 197 context = &(pack_spu.context[slot]); 356 curContext = curThread ? curThread->currentContext : NULL; 198 357 199 358 if (pack_spu.swap) … … 206 365 context->clientState = NULL; 207 366 context->serverCtx = 0; 208 209 if (thread->currentContext == context) { 210 thread->currentContext = NULL; 367 context->currentThread = NULL; 368 369 if (curContext == context) 370 { 371 if (!CRPACKSPU_IS_WDDM_CRHGSMI()) 372 { 373 curThread->currentContext = NULL; 374 } 375 else 376 { 377 CRASSERT(thread == curThread); 378 crSetTSD(&_PackTSD, NULL); 379 crPackSetContext(NULL); 380 } 211 381 crStateMakeCurrent( NULL ); 212 382 } 383 else 384 { 385 if (CRPACKSPU_IS_WDDM_CRHGSMI()) 386 { 387 crPackSetContext(curPacker); 388 } 389 } 213 390 } 214 391 215 392 void PACKSPU_APIENTRY packspu_MakeCurrent( GLint window, GLint nativeWindow, GLint ctx ) 216 393 { 217 GET_THREAD(thread);394 ThreadInfo *thread; 218 395 GLint serverCtx; 219 396 ContextInfo *newCtx; 220 397 221 if (!thread) { 222 thread = packspuNewThread( crThreadID() ); 223 } 224 CRASSERT(thread); 225 CRASSERT(thread->packer); 398 if (!CRPACKSPU_IS_WDDM_CRHGSMI()) 399 { 400 thread = GET_THREAD_VAL(); 401 if (!thread) { 402 thread = packspuNewThread( 403 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 404 NULL 405 #endif 406 ); 407 } 408 CRASSERT(thread); 409 CRASSERT(thread->packer); 410 } 226 411 227 412 if (ctx) { … … 234 419 CRASSERT(newCtx->clientState); /* verify valid */ 235 420 236 if (newCtx->fAutoFlush) 237 { 238 if (newCtx->currentThread && newCtx->currentThread != thread) 421 if (CRPACKSPU_IS_WDDM_CRHGSMI()) 422 { 423 thread = newCtx->currentThread; 424 CRASSERT(thread); 425 crSetTSD(&_PackTSD, thread); 426 crPackSetContext( thread->packer ); 427 } 428 else 429 { 430 if (!newCtx->fAutoFlush) 239 431 { 240 crLockMutex(&_PackMutex); 241 /* do a flush for the previously assigned thread 242 * to ensure all commands issued there are submitted */ 243 if (newCtx->currentThread 244 && newCtx->currentThread->inUse 245 && newCtx->currentThread->netServer.conn 246 && newCtx->currentThread->packer && newCtx->currentThread->packer->currentBuffer) 432 if (newCtx->currentThread && newCtx->currentThread != thread) 247 433 { 248 packspuFlush((void *) newCtx->currentThread); 434 crLockMutex(&_PackMutex); 435 /* do a flush for the previously assigned thread 436 * to ensure all commands issued there are submitted */ 437 if (newCtx->currentThread 438 && newCtx->currentThread->inUse 439 && newCtx->currentThread->netServer.conn 440 && newCtx->currentThread->packer && newCtx->currentThread->packer->currentBuffer) 441 { 442 packspuFlush((void *) newCtx->currentThread); 443 } 444 crUnlockMutex(&_PackMutex); 249 445 } 250 crUnlockMutex(&_PackMutex);446 newCtx->currentThread = thread; 251 447 } 252 newCtx->currentThread = thread; 253 } 254 255 thread->currentContext = newCtx; 256 257 crPackSetContext( thread->packer ); 448 449 thread->currentContext = newCtx; 450 crPackSetContext( thread->packer ); 451 } 452 258 453 crStateMakeCurrent( newCtx->clientState ); 259 454 //crStateSetCurrentPointers(newCtx->clientState, &thread->packer->current); … … 261 456 } 262 457 else { 263 thread->currentContext = NULL;264 458 crStateMakeCurrent( NULL ); 459 if (CRPACKSPU_IS_WDDM_CRHGSMI()) 460 { 461 thread = GET_THREAD_VAL(); 462 if (!thread) 463 { 464 CRASSERT(crPackGetContext() == NULL); 465 return; 466 } 467 CRASSERT(thread->currentContext); 468 CRASSERT(thread->packer == crPackGetContext()); 469 } 470 else 471 { 472 thread->currentContext = NULL; 473 } 265 474 newCtx = NULL; 266 475 serverCtx = 0; -
trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_framebuffer.c
r28800 r42499 93 93 94 94 packspuFlush((void *) thread); 95 while (writeback) 96 crNetRecv(); 95 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 97 96 98 97 crStateSetFramebufferStatus(target, status); -
trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_get.py
r37216 r42499 132 132 crPack%s(%s, &writeback); 133 133 packspuFlush( (void *) thread ); 134 while (writeback) 135 crNetRecv(); 134 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 136 135 for (i=0; i<__numValues(pname); ++i) 137 136 { … … 164 163 print '\t}' 165 164 print '\tpackspuFlush( (void *) thread );' 166 print '\twhile (writeback)' 167 print '\t\tcrNetRecv();' 165 print '\tCRPACKSPU_WRITEBACK_WAIT(thread, writeback);' 168 166 169 167 -
trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_getshaders.c
r40479 r42499 46 46 47 47 packspuFlush((void *) thread); 48 while (writeback) 49 crNetRecv(); 48 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 50 49 51 50 if (length) *length = pLocal->length; … … 70 69 71 70 packspuFlush((void *) thread); 72 while (writeback) 73 crNetRecv(); 71 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 74 72 75 73 if (length) *length = pLocal->length; … … 94 92 95 93 packspuFlush((void *) thread); 96 while (writeback) 97 crNetRecv(); 94 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 98 95 99 96 if (count) *count=*pLocal; … … 116 113 117 114 packspuFlush((void *) thread); 118 while (writeback) 119 crNetRecv(); 115 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 120 116 121 117 if (count) *count=*pLocal; … … 140 136 141 137 packspuFlush((void *) thread); 142 while (writeback) 143 crNetRecv(); 138 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 144 139 145 140 CRASSERT((pLocal[0]) <= maxLength); … … 164 159 165 160 packspuFlush((void *) thread); 166 while (writeback) 167 crNetRecv(); 161 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 168 162 169 163 if (length) *length=*pLocal; … … 186 180 187 181 packspuFlush((void *) thread); 188 while (writeback) 189 crNetRecv(); 182 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 190 183 191 184 if (length) *length=*pLocal; … … 208 201 209 202 packspuFlush((void *) thread); 210 while (writeback) 211 crNetRecv(); 203 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 212 204 213 205 if (length) *length=*pLocal; -
trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_getstring.c
r37830 r42499 29 29 packspuFlush( (void *) thread ); 30 30 31 while (writeback) 32 crNetRecv(); 31 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 33 32 } 34 33 … … 66 65 packspuFlush( (void *) thread ); 67 66 68 while (writeback) 69 crNetRecv(); 67 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 70 68 71 69 CRASSERT(crStrlen((char *)return_value) < 10*1000); -
trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_glsl.c
r39012 r42499 42 42 } 43 43 packspuFlush((void *) thread); 44 while (writeback) 45 crNetRecv(); 44 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 46 45 if (pack_spu.swap) 47 46 { … … 72 71 } 73 72 packspuFlush((void *) thread); 74 while (writeback) 75 crNetRecv(); 73 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 76 74 if (pack_spu.swap) 77 75 { … … 104 102 105 103 packspuFlush((void *) thread); 106 while (writeback) 107 crNetRecv(); 104 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 108 105 109 106 crStateGLSLProgramCacheUniforms(program, pData[0], &pData[1]); … … 137 134 GLuint hwid = crStateGetProgramHWID(obj); 138 135 136 CRASSERT(obj); 137 139 138 if (hwid) 140 139 { -
trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_init.c
r39061 r42499 47 47 packspuSetVBoxConfiguration( child ); 48 48 49 #if defined(WINDOWS) && defined(VBOX_WITH_WDDM) 50 pack_spu.bRunningUnderWDDM = !!GetModuleHandle("VBoxDispD3D"); 51 #endif 52 49 53 /* This connects to the server, sets up the packer, etc. */ 50 thread = packspuNewThread( crThreadID() ); 54 thread = packspuNewThread( 55 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 56 NULL 57 #endif 58 ); 51 59 52 60 if (!thread) { -
trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_misc.c
r41109 r42499 98 98 packspuFlush( (void *) thread ); 99 99 100 while (writeback) 101 crNetRecv(); 100 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 102 101 } 103 102 } … … 117 116 crPackWriteback(&writeback); 118 117 packspuFlush( (void *) thread ); 119 while (writeback) 120 crNetRecv(); 118 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 121 119 } 122 120 } … … 158 156 } 159 157 160 GLint PACKSPU_APIENTRY packspu_WindowCreate( const char *dpyName, GLint visBits ) 158 void PACKSPU_APIENTRY packspu_VBoxWindowDestroy( GLint con, GLint window ) 159 { 160 if (CRPACKSPU_IS_WDDM_CRHGSMI()) 161 { 162 ThreadInfo *thread; 163 CRPackContext * curPacker = crPackGetContext(); 164 if (!con) 165 { 166 crError("connection expected!!"); 167 return; 168 } 169 thread = GET_THREAD_VAL_ID(con); 170 crPackSetContext(thread->packer); 171 crPackWindowDestroy(window); 172 if (curPacker != thread->packer) 173 crPackSetContext(curPacker); 174 return; 175 } 176 crPackWindowDestroy(window); 177 } 178 179 GLint PACKSPU_APIENTRY packspu_VBoxWindowCreate( GLint con, const char *dpyName, GLint visBits ) 161 180 { 162 181 GET_THREAD(thread); … … 164 183 int writeback = pack_spu.thread[pack_spu.idxThreadInUse].netServer.conn->actual_network; 165 184 GLint return_val = (GLint) 0; 166 167 if (!thread) { 168 thread = packspuNewThread( crThreadID() ); 185 ThreadInfo *curThread = thread; 186 GLint retVal; 187 188 if (CRPACKSPU_IS_WDDM_CRHGSMI()) 189 { 190 if (!con) 191 { 192 crError("connection expected!"); 193 return 0; 194 } 195 thread = GET_THREAD_VAL_ID(con); 196 } 197 else 198 { 199 CRASSERT(!con); 200 if (!thread) { 201 thread = packspuNewThread( 202 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 203 NULL 204 #endif 205 ); 206 } 169 207 } 170 208 CRASSERT(thread); 171 209 CRASSERT(thread->packer); 210 CRASSERT(crPackGetContext() == (curThread ? curThread->packer : NULL)); 172 211 173 212 crPackSetContext(thread->packer); … … 184 223 if (!(thread->netServer.conn->actual_network)) 185 224 { 186 return num_calls++; 187 } 188 else 189 { 190 while (writeback) 191 crNetRecv(); 225 retVal = num_calls++; 226 } 227 else 228 { 229 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 192 230 if (pack_spu.swap) 193 231 { 194 232 return_val = (GLint) SWAP32(return_val); 195 233 } 196 return return_val; 197 } 198 } 199 200 234 retVal = return_val; 235 } 236 237 if (CRPACKSPU_IS_WDDM_CRHGSMI()) 238 { 239 if (thread != curThread) 240 { 241 if (curThread) 242 crPackSetContext(curThread->packer); 243 else 244 crPackSetContext(NULL); 245 } 246 } 247 248 return retVal; 249 } 250 251 GLint PACKSPU_APIENTRY packspu_WindowCreate( const char *dpyName, GLint visBits ) 252 { 253 return packspu_VBoxWindowCreate( 0, dpyName, visBits ); 254 } 201 255 202 256 GLboolean PACKSPU_APIENTRY … … 224 278 packspuFlush( (void *) thread ); 225 279 226 while (writeback) 227 crNetRecv(); 280 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 228 281 229 282 /* Since the Chromium packer/unpacker can't return both 'residences' … … 264 317 packspuFlush( (void *) thread ); 265 318 266 while (writeback) 267 crNetRecv(); 319 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 268 320 269 321 /* Since the Chromium packer/unpacker can't return both 'residences' … … 299 351 { 300 352 packspuFlush( (void *) thread ); 301 while (writeback) 302 crNetRecv(); 353 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 303 354 } 304 355 } … … 323 374 { 324 375 packspuFlush( (void *) thread ); 325 while (writeback) 326 crNetRecv(); 376 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 327 377 } 328 378 } … … 347 397 { 348 398 packspuFlush( (void *) thread ); 349 while (writeback) 350 crNetRecv(); 399 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 351 400 } 352 401 } … … 371 420 { 372 421 packspuFlush( (void *) thread ); 373 while (writeback) 374 crNetRecv(); 422 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 375 423 } 376 424 } … … 410 458 411 459 #ifdef CHROMIUM_THREADSAFE 412 void PACKSPU_APIENTRY packspu_VBoxPackSetInjectThread(void) 413 { 460 GLint PACKSPU_APIENTRY packspu_VBoxPackSetInjectThread(struct VBOXUHGSMI *pHgsmi) 461 { 462 GLint con = 0; 463 int i; 464 GET_THREAD(thread); 465 CRASSERT(!thread); 414 466 crLockMutex(&_PackMutex); 415 467 { 416 int i;417 GET_THREAD(thread);418 CRASSERT(!thread);419 468 CRASSERT((pack_spu.numThreads>0) && (pack_spu.numThreads<MAX_THREADS)); 420 469 … … 430 479 431 480 thread->inUse = GL_TRUE; 432 thread->id = crThreadID(); 481 if (!CRPACKSPU_IS_WDDM_CRHGSMI()) 482 thread->id = crThreadID(); 483 else 484 thread->id = THREAD_OFFSET_MAGIC + i; 433 485 thread->currentContext = NULL; 434 486 thread->bInjectThread = GL_TRUE; … … 437 489 thread->netServer.buffer_size = 64 * 1024; 438 490 439 crNetNewClient(pack_spu.thread[pack_spu.idxThreadInUse].netServer.conn, &(thread->netServer)); 491 crNetNewClient(pack_spu.thread[pack_spu.idxThreadInUse].netServer.conn, &(thread->netServer) 492 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 493 , pHgsmi 494 #endif 495 ); 440 496 CRASSERT(thread->netServer.conn); 441 497 … … 458 514 } 459 515 crUnlockMutex(&_PackMutex); 460 } 461 462 GLuint PACKSPU_APIENTRY packspu_VBoxPackGetInjectID(void) 516 517 if (CRPACKSPU_IS_WDDM_CRHGSMI()) 518 { 519 CRASSERT(thread->id - THREAD_OFFSET_MAGIC < RT_ELEMENTS(pack_spu.thread) 520 && GET_THREAD_VAL_ID(thread->id) == thread); 521 con = thread->id; 522 } 523 return con; 524 } 525 526 GLuint PACKSPU_APIENTRY packspu_VBoxPackGetInjectID(GLint con) 463 527 { 464 528 GLuint ret; … … 466 530 crLockMutex(&_PackMutex); 467 531 { 468 GET_THREAD(thread); 532 ThreadInfo *thread = NULL; 533 if (CRPACKSPU_IS_WDDM_CRHGSMI()) 534 { 535 if (!con) 536 { 537 crError("connection expected!"); 538 return 0; 539 } 540 thread = GET_THREAD_VAL_ID(con); 541 } 542 else 543 { 544 CRASSERT(!con); 545 thread = GET_THREAD_VAL(); 546 } 469 547 CRASSERT(thread && thread->netServer.conn && thread->netServer.conn->type==CR_VBOXHGCM); 470 548 ret = thread->netServer.conn->u32ClientID; … … 514 592 if (thread) 515 593 { 516 crLockMutex(&_PackMutex); 517 518 for (i=0; i<MAX_THREADS; ++i) 519 { 520 if (pack_spu.thread[i].inUse && thread==&pack_spu.thread[i] 521 && thread->id==crThreadID() && thread->netServer.conn) 594 if (CRPACKSPU_IS_WDDM_CRHGSMI()) 595 { 596 crPackSetContext(NULL); 597 crSetTSD(&_PackTSD, NULL); 598 } 599 else 600 { 601 crLockMutex(&_PackMutex); 602 603 for (i=0; i<MAX_THREADS; ++i) 522 604 { 523 CRASSERT(pack_spu.numThreads>0); 524 525 packspuFlush((void *) thread); 526 527 if (pack_spu.thread[i].packer) 605 if (pack_spu.thread[i].inUse && thread==&pack_spu.thread[i] 606 && thread->id==crThreadID() && thread->netServer.conn) 528 607 { 529 CR_LOCK_PACKER_CONTEXT(thread->packer); 530 crPackSetContext(NULL); 531 CR_UNLOCK_PACKER_CONTEXT(thread->packer); 532 crPackDeleteContext(pack_spu.thread[i].packer); 533 } 534 crNetFreeConnection(pack_spu.thread[i].netServer.conn); 535 536 pack_spu.numThreads--; 537 /*note can't shift the array here, because other threads have TLS references to array elements*/ 538 crMemZero(&pack_spu.thread[i], sizeof(ThreadInfo)); 539 540 crSetTSD(&_PackTSD, NULL); 541 542 if (i==pack_spu.idxThreadInUse) 543 { 544 for (i=0; i<MAX_THREADS; ++i) 608 CRASSERT(pack_spu.numThreads>0); 609 610 packspuFlush((void *) thread); 611 612 if (pack_spu.thread[i].packer) 545 613 { 546 if (pack_spu.thread[i].inUse) 614 CR_LOCK_PACKER_CONTEXT(thread->packer); 615 crPackSetContext(NULL); 616 CR_UNLOCK_PACKER_CONTEXT(thread->packer); 617 crPackDeleteContext(pack_spu.thread[i].packer); 618 } 619 crNetFreeConnection(pack_spu.thread[i].netServer.conn); 620 621 pack_spu.numThreads--; 622 /*note can't shift the array here, because other threads have TLS references to array elements*/ 623 crMemZero(&pack_spu.thread[i], sizeof(ThreadInfo)); 624 625 crSetTSD(&_PackTSD, NULL); 626 627 if (i==pack_spu.idxThreadInUse) 628 { 629 for (i=0; i<MAX_THREADS; ++i) 547 630 { 548 pack_spu.idxThreadInUse=i; 549 break; 631 if (pack_spu.thread[i].inUse) 632 { 633 pack_spu.idxThreadInUse=i; 634 break; 635 } 550 636 } 551 637 } 638 639 break; 552 640 } 553 554 break;555 641 } 556 } 557 558 for (i=0; i<CR_MAX_CONTEXTS; ++i) 559 { 560 ContextInfo *ctx = &pack_spu.context[i]; 561 if (ctx->currentThread == thread) 642 643 for (i=0; i<CR_MAX_CONTEXTS; ++i) 562 644 { 563 CRASSERT(ctx->fAutoFlush); 564 ctx->currentThread = NULL; 645 ContextInfo *ctx = &pack_spu.context[i]; 646 if (ctx->currentThread == thread) 647 { 648 CRASSERT(ctx->fAutoFlush); 649 ctx->currentThread = NULL; 650 } 565 651 } 566 } 567 568 crUnlockMutex(&_PackMutex);652 653 crUnlockMutex(&_PackMutex); 654 } 569 655 } 570 656 … … 605 691 606 692 #else /*ifdef CHROMIUM_THREADSAFE*/ 607 void PACKSPU_APIENTRY packspu_VBoxPackSetInjectThread(void)608 { 609 } 610 611 GLuint PACKSPU_APIENTRY packspu_VBoxPackGetInjectID( void)693 GLint PACKSPU_APIENTRY packspu_VBoxPackSetInjectThread(struct VBOXUHGSMI *pHgsmi) 694 { 695 } 696 697 GLuint PACKSPU_APIENTRY packspu_VBoxPackGetInjectID(GLint con) 612 698 { 613 699 return 0; -
trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_net.c
r35845 r42499 230 230 } 231 231 232 void packspuConnectToServer( CRNetServer *server ) 232 void packspuConnectToServer( CRNetServer *server 233 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 234 , struct VBOXUHGSMI *pHgsmi 235 #endif 236 ) 233 237 { 234 238 crNetInit( packspuReceiveData, NULL ); 235 crNetServerConnect( server ); 236 } 239 crNetServerConnect( server 240 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 241 , pHgsmi 242 #endif 243 ); 244 } -
trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_pixel.c
r38772 r42499 322 322 323 323 packspuFlush((void *) thread); 324 while (pack_spu.ReadPixels) 325 crNetRecv(); 324 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 326 325 } 327 326 } … … 588 587 { 589 588 packspuFlush( (void *) thread ); 590 while (writeback) 591 crNetRecv(); 589 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 592 590 } 593 591 } … … 622 620 { 623 621 packspuFlush( (void *) thread ); 624 while (writeback) 625 crNetRecv(); 622 CRPACKSPU_WRITEBACK_WAIT(thread, writeback); 626 623 } 627 624 } -
trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_special
r40431 r42499 107 107 VBoxAttachThread 108 108 VBoxDetachThread 109 VBoxCreateContext 110 VBoxWindowCreate 111 VBoxWindowDestroy 112 VBoxConCreate 113 VBoxConDestroy 114 VBoxConFlush 109 115 ChromiumParameteriCR 110 116 CompressedTexImage1DARB -
trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_swapbuf.c
r33540 r42499 85 85 /* Make sure writeback from previous frame has been received. 86 86 */ 87 while (thread->writeback) 88 { 89 crNetRecv(); 90 } 87 CRPACKSPU_WRITEBACK_WAIT(thread, thread->writeback); 91 88 break; 92 89 } -
trunk/src/VBox/Additions/common/crOpenGL/stub.c
r41963 r42499 11 11 #include <iprt/thread.h> 12 12 13 static void crForcedFlush() 13 static void crForcedFlush( 14 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 15 GLint con 16 #endif 17 ) 14 18 { 15 19 #if 0 … … 20 24 stub.spu->dispatch_table.DrawBuffer(buffer); 21 25 #else 22 stub.spu->dispatch_table.Flush(); 26 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 27 if (con) 28 { 29 stub.spu->dispatch_table.VBoxConFlush(con); 30 } 31 else 32 #endif 33 { 34 stub.spu->dispatch_table.Flush(); 35 } 23 36 #endif 24 37 } … … 63 76 * That didn't seem right so it was changed to CHROMIUM. (Brian) 64 77 */ 65 context = stubNewContext(dpyName, visBits, CHROMIUM, 0); 78 context = stubNewContext(dpyName, visBits, CHROMIUM, 0 79 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 80 , NULL 81 #endif 82 ); 66 83 return context ? (int) context->id : -1; 67 84 } … … 143 160 crHashtableLock(stub.windowTable); 144 161 145 stub.spu->dispatch_table.WindowDestroy( winInfo->spuWindow ); 162 stub.spu->dispatch_table.VBoxWindowDestroy( 163 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 164 winInfo->spuConnection, 165 #else 166 0 167 #endif 168 winInfo->spuWindow ); 146 169 147 170 #ifdef WINDOWS … … 162 185 # endif 163 186 #endif 164 crForcedFlush(); 165 187 crForcedFlush( 188 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 189 winInfo->spuConnection 190 #endif 191 ); 192 193 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 194 winInfo->spuConnection = 0; 195 #endif 166 196 crHashtableWalk(stub.contextTable, stubWindowCleanupForContextsCB, winInfo); 167 197 -
trunk/src/VBox/Additions/common/crOpenGL/stub.h
r39602 r42499 115 115 WindowInfo *currentDrawable; 116 116 117 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 118 GLint spuConnection; 119 struct VBOXUHGSMI *pHgsmi; 120 #endif 121 117 122 #ifdef CHROMIUM_THREADSAFE 118 123 VBOXTLSREFDATA … … 165 170 ContextInfo *pOwner; /* ctx which created this window */ 166 171 GLboolean mapped; 172 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 173 GLint spuConnection; 174 #endif 167 175 #ifdef WINDOWS 168 176 HDC drawable; … … 329 337 330 338 331 extern ContextInfo *stubNewContext( const char *dpyName, GLint visBits, ContextType type, unsigned long shareCtx ); 339 extern ContextInfo *stubNewContext( const char *dpyName, GLint visBits, ContextType type, unsigned long shareCtx 340 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 341 , struct VBOXUHGSMI *pHgsmi 342 #endif 343 ); 332 344 extern void stubDestroyContext( unsigned long contextId ); 333 345 extern GLboolean stubMakeCurrent( WindowInfo *window, ContextInfo *context ); -
trunk/src/VBox/Additions/common/crOpenGL/wgl.c
r41971 r42499 295 295 296 296 297 HGLRC WINAPI wglCreateContext_prox( HDC hdc)297 HGLRC WINAPI VBoxCreateContext( HDC hdc, struct VBOXUHGSMI *pHgsmi ) 298 298 { 299 299 char dpyName[MAX_DPY_NAME]; … … 312 312 #endif 313 313 314 context = stubNewContext(dpyName, desiredVisual, UNDECIDED, 0); 314 context = stubNewContext(dpyName, desiredVisual, UNDECIDED, 0 315 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 316 , pHgsmi 317 #else 318 , NULL 319 #endif 320 ); 315 321 if (!context) 316 322 return 0; 317 323 318 324 return (HGLRC) context->id; 325 } 326 327 HGLRC WINAPI wglCreateContext_prox( HDC hdc ) 328 { 329 return VBoxCreateContext(hdc, NULL); 319 330 } 320 331 -
trunk/src/VBox/GuestHost/OpenGL/Makefile.kmk
r42311 r42499 93 93 endif 94 94 ifdef VBOX_WITH_WDDM 95 VBoxOGLcrutil_DEFS.win += VBOX_WITH_WDDM 95 96 VBoxOGLcrutil_DEFS.win += CR_DEBUG_BACKDOOR_ENABLE 96 97 VBoxOGLcrutil_INCS.win += $(PATH_ROOT)/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm … … 252 253 $(VBOX_PATH_CROGL_GENFILES)/cr_opcodes.h \ 253 254 $(VBOX_PATH_CROGL_GENFILES)/state/cr_currentpointers.h 255 ifdef VBOX_WITH_CRHGSMI 256 VBoxOGLcrpacker_DEFS.win += VBOX_WITH_CRHGSMI 257 endif 258 ifdef VBOX_WITH_WDDM 259 VBoxOGLcrpacker_DEFS.win += VBOX_WITH_WDDM 260 endif 254 261 255 262 if defined(VBOX_WITH_WDDM) && defined(VBOX_WITH_ADDITIONS) … … 330 337 $(VBOX_PATH_CROGL_GENFILES)/glloader.c \ 331 338 $(VBOX_PATH_CROGL_GENFILES)/spu_dispatch_table.h 332 339 ifdef VBOX_WITH_CRHGSMI 340 VBoxOGLspuload_DEFS.win += VBOX_WITH_CRHGSMI 341 endif 342 ifdef VBOX_WITH_WDDM 343 VBoxOGLspuload_DEFS.win += VBOX_WITH_WDDM 344 endif 333 345 334 346 if defined(VBOX_WITH_WDDM) && defined(VBOX_WITH_ADDITIONS) … … 459 471 VBoxOGLcrstate_CFLAGS += 460 472 endif 461 473 ifdef VBOX_WITH_CRHGSMI 474 VBoxOGLcrstate_DEFS.win += VBOX_WITH_CRHGSMI 475 endif 476 ifdef VBOX_WITH_WDDM 477 VBoxOGLcrstate_DEFS.win += VBOX_WITH_WDDM 478 endif 462 479 463 480 if defined(VBOX_WITH_WDDM) && defined(VBOX_WITH_ADDITIONS) … … 582 599 VBoxOGLerrorspu_LIBS = \ 583 600 $(VBOX_LIB_OGL_CRUTIL) 601 ifdef VBOX_WITH_CRHGSMI 602 VBoxOGLerrorspu_DEFS.win += VBOX_WITH_CRHGSMI 603 endif 604 ifdef VBOX_WITH_WDDM 605 VBoxOGLerrorspu_DEFS.win += VBOX_WITH_WDDM 606 endif 607 584 608 585 609 if defined(VBOX_WITH_WDDM) && defined(VBOX_WITH_ADDITIONS) -
trunk/src/VBox/GuestHost/OpenGL/glapi_parser/APIspec.txt
r40431 r42499 8501 8501 8502 8502 name VBoxPackSetInjectThread 8503 return void 8503 return GLint 8504 param pHgsmi struct VBOXUHGSMI * 8504 8505 category VBox 8505 8506 chromium nopack … … 8507 8508 name VBoxPackGetInjectID 8508 8509 return GLuint 8510 param con GLint 8509 8511 category VBox 8510 8512 chromium nopack … … 8523 8525 name VBoxDetachThread 8524 8526 return void 8527 category VBox 8528 chromium nopack 8529 8530 name VBoxCreateContext 8531 return GLint 8532 param con GLint 8533 param dpyName const char * 8534 param visual GLint 8535 param shareCtx GLint 8536 category VBox 8537 chromium nopack 8538 8539 name VBoxWindowCreate 8540 return GLint 8541 param con GLint 8542 param dpyName const char * 8543 param visBits GLint 8544 category VBox 8545 chromium nopack 8546 8547 name VBoxWindowDestroy 8548 return void 8549 param con GLint 8550 param window GLint 8551 category VBox 8552 chromium nopack 8553 8554 name VBoxConCreate 8555 return GLint 8556 param pHgsmi struct VBOXUHGSMI * 8557 category VBox 8558 chromium nopack 8559 8560 name VBoxConDestroy 8561 return void 8562 param con GLint 8563 category VBox 8564 chromium nopack 8565 8566 name VBoxConFlush 8567 return void 8568 param con GLint 8525 8569 category VBox 8526 8570 chromium nopack -
trunk/src/VBox/GuestHost/OpenGL/include/cr_net.h
r39288 r42499 35 35 36 36 #include <iprt/types.h> 37 #include <iprt/thread.h> 37 38 38 39 #ifdef __cplusplus … … 236 237 uint32_t u32InjectClientID; 237 238 # ifdef VBOX_WITH_CRHGSMI 238 # ifndef VBOX_CRHGSMI_WITH_D3DDEV239 239 CRVBOXHGSMI_CLIENT HgsmiClient; 240 # endif 240 struct VBOXUHGSMI *pExternalHgsmi; 241 241 # endif 242 242 #else … … 283 283 extern DECLEXPORT(int) crNetNumMessages(CRConnection *conn); 284 284 extern DECLEXPORT(void) crNetReadline( CRConnection *conn, void *buf ); 285 extern DECLEXPORT(int) crNetRecv( void ); 286 #define CR_WRITEBACK_WAIT() do { \ 287 while (writeback) { \ 288 crNetRecv(); \ 289 } \ 285 extern DECLEXPORT(int) crNetRecv( 286 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 287 CRConnection *conn 288 #endif 289 ); 290 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 291 #define CR_WRITEBACK_WAIT(_conn, _writeback) do { \ 292 while (_writeback) { \ 293 RTThreadYield(); \ 294 crNetRecv(_conn); \ 295 } \ 290 296 } while (0) 297 #else 298 #define CR_WRITEBACK_WAIT(_conn, _writeback) do { \ 299 while (_writeback) { \ 300 RTThreadYield(); \ 301 crNetRecv(); \ 302 } \ 303 } while (0) 304 305 #endif 291 306 extern DECLEXPORT(void) crNetDefaultRecv( CRConnection *conn, CRMessage *msg, unsigned int len ); 292 307 extern DECLEXPORT(void) crNetDispatchMessage( CRNetReceiveFuncList *rfl, CRConnection *conn, CRMessage *msg, unsigned int len ); 293 308 294 extern DECLEXPORT(CRConnection *) crNetConnectToServer( const char *server, unsigned short default_port, int mtu, int broker ); 309 extern DECLEXPORT(CRConnection *) crNetConnectToServer( const char *server, unsigned short default_port, int mtu, int broker 310 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 311 , struct VBOXUHGSMI *pHgsmi 312 #endif 313 ); 295 314 extern DECLEXPORT(CRConnection *) crNetAcceptClient( const char *protocol, const char *hostname, unsigned short port, unsigned int mtu, int broker ); 296 315 -
trunk/src/VBox/GuestHost/OpenGL/include/cr_netserver.h
r15532 r42499 22 22 } CRNetServer; 23 23 24 DECLEXPORT(void) crNetServerConnect( CRNetServer *ns ); 25 DECLEXPORT(void) crNetNewClient( CRConnection *conn, CRNetServer *ns ); 24 DECLEXPORT(void) crNetServerConnect( CRNetServer *ns 25 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 26 , struct VBOXUHGSMI *pHgsmi 27 #endif 28 ); 29 DECLEXPORT(void) crNetNewClient( CRConnection *conn, CRNetServer *ns 30 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 31 , struct VBOXUHGSMI *pHgsmi 32 #endif 33 ); 26 34 27 35 #ifdef __cplusplus -
trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_init.c
r41109 r42499 664 664 { 665 665 } 666 667 GLint crStateVBoxCreateContext( GLint con, const char * dpyName, GLint visual, GLint shareCtx ) 668 { 669 return 0; 670 } 671 672 GLint crStateVBoxWindowCreate( GLint con, const char *dpyName, GLint visBits ) 673 { 674 return 0; 675 } 676 677 void crStateVBoxWindowDestroy( GLint con, GLint window ) 678 { 679 } 680 681 GLint crStateVBoxConCreate(struct VBOXUHGSMI *pHgsmi) 682 { 683 return 0; 684 } 685 686 void crStateVBoxConDestroy(GLint con) 687 { 688 } 689 690 void crStateVBoxConFlush(GLint con) 691 { 692 } -
trunk/src/VBox/GuestHost/OpenGL/util/net.c
r40124 r42499 73 73 */ 74 74 static void 75 InitConnection(CRConnection *conn, const char *protocol, unsigned int mtu) 75 InitConnection(CRConnection *conn, const char *protocol, unsigned int mtu 76 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 77 , struct VBOXUHGSMI *pHgsmi 78 #endif 79 ) 76 80 { 77 81 if (!crStrcmp(protocol, "devnull")) … … 111 115 cr_net.use_hgcm++; 112 116 crVBoxHGCMInit(cr_net.recv_list, cr_net.close_list, mtu); 113 crVBoxHGCMConnection(conn); 117 crVBoxHGCMConnection(conn 118 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 119 , pHgsmi 120 #endif 121 ); 114 122 } 115 123 #endif … … 184 192 * the mothership 185 193 */ 186 CRConnection * 187 crNetConnectToServer( const char *server, unsigned short default_port, 188 int mtu, int broker ) 194 CRConnection * crNetConnectToServer( const char *server, unsigned short default_port, int mtu, int broker 195 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 196 , struct VBOXUHGSMI *pHgsmi 197 #endif 198 ) 189 199 { 190 200 char hostname[4096], protocol[4096]; … … 270 280 271 281 /* now, just dispatch to the appropriate protocol's initialization functions. */ 272 InitConnection(conn, protocol, mtu); 282 InitConnection(conn, protocol, mtu 283 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 284 , pHgsmi 285 #endif 286 ); 273 287 274 288 if (!crNetConnect( conn )) … … 287 301 } 288 302 289 290 303 /** 291 304 * Send a message to the receiver that another connection is needed. 292 305 * We send a CR_MESSAGE_NEWCLIENT packet, then call crNetServerConnect. 293 306 */ 294 void crNetNewClient( CRConnection *conn, CRNetServer *ns ) 307 void crNetNewClient( CRConnection *conn, CRNetServer *ns 308 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 309 , struct VBOXUHGSMI *pHgsmi 310 #endif 311 ) 295 312 { 296 313 /* … … 308 325 */ 309 326 310 crNetServerConnect( ns ); 327 crNetServerConnect( ns 328 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 329 , pHgsmi 330 #endif 331 ); 311 332 } 312 333 … … 368 389 369 390 /* call the protocol-specific init routines */ // ktd (add) 370 InitConnection(conn, protocol_only, mtu); // ktd (add) 391 InitConnection(conn, protocol_only, mtu 392 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 393 , NULL 394 #endif 395 ); // ktd (add) 371 396 } 372 397 else { 373 398 /* call the protocol-specific init routines */ 374 InitConnection(conn, protocol, mtu); 399 InitConnection(conn, protocol, mtu 400 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 401 , NULL 402 #endif 403 ); 375 404 } 376 405 … … 834 863 * When done, the CrNetServer's conn field will be initialized. 835 864 */ 836 void crNetServerConnect( CRNetServer *ns ) 865 void crNetServerConnect( CRNetServer *ns 866 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 867 , struct VBOXUHGSMI *pHgsmi 868 #endif 869 ) 837 870 { 838 871 ns->conn = crNetConnectToServer( ns->name, DEFAULT_SERVER_PORT, 839 ns->buffer_size, 0 ); 840 } 841 872 ns->buffer_size, 0 873 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 874 , pHgsmi 875 #endif 876 ); 877 } 842 878 843 879 /** … … 1186 1222 if (len) 1187 1223 return len; 1188 crNetRecv(); 1224 crNetRecv( 1225 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 1226 conn 1227 #endif 1228 ); 1189 1229 } 1190 1230 … … 1234 1274 * is assumed to be placed on queues for processing by the handler. 1235 1275 */ 1236 int crNetRecv( void ) 1276 int crNetRecv( 1277 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 1278 CRConnection *conn 1279 #endif 1280 ) 1237 1281 { 1238 1282 int found_work = 0; … … 1242 1286 #ifdef VBOX_WITH_HGCM 1243 1287 if ( cr_net.use_hgcm ) 1244 found_work += crVBoxHGCMRecv(); 1288 found_work += crVBoxHGCMRecv( 1289 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 1290 conn 1291 #endif 1292 ); 1245 1293 #endif 1246 1294 #ifdef SDP_SUPPORT -
trunk/src/VBox/GuestHost/OpenGL/util/net_internals.h
r33561 r42499 92 92 #ifdef VBOX_WITH_HGCM 93 93 extern void crVBoxHGCMInit( CRNetReceiveFuncList *rfl, CRNetCloseFuncList *cfl, unsigned int mtu ); 94 extern void crVBoxHGCMConnection( CRConnection *conn ); 95 extern int crVBoxHGCMRecv( void ); 94 extern void crVBoxHGCMConnection( CRConnection *conn 95 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 96 , struct VBOXUHGSMI *pHgsmi 97 #endif 98 ); 99 extern int crVBoxHGCMRecv( 100 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 101 CRConnection *conn 102 #endif 103 ); 96 104 extern CRConnection** crVBoxHGCMDump( int *num ); 97 105 extern void crVBoxHGCMTearDown(void); -
trunk/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c
r41912 r42499 345 345 return &conn->HgsmiClient; 346 346 { 347 PVBOXUHGSMI pHgsmi = VBoxCrHgsmiCreate();347 PVBOXUHGSMI pHgsmi = conn->pExternalHgsmi ? conn->pExternalHgsmi : VBoxCrHgsmiCreate(); 348 348 if (pHgsmi) 349 349 { … … 356 356 else 357 357 crWarning("_crVBoxHGSMIClientGet: _crVBoxHGSMIClientInit failed rc %d", rc); 358 VBoxCrHgsmiDestroy(pHgsmi); 358 if (!conn->pExternalHgsmi) 359 VBoxCrHgsmiDestroy(pHgsmi); 359 360 } 360 361 else … … 2333 2334 _crVBoxHGSMIClientTerm(&conn->HgsmiClient, &pHgsmi); 2334 2335 CRASSERT(pHgsmi); 2335 VBoxCrHgsmiDestroy(pHgsmi); 2336 if (!conn->pExternalHgsmi) 2337 VBoxCrHgsmiDestroy(pHgsmi); 2336 2338 } 2337 2339 #else … … 2498 2500 } 2499 2501 2500 void crVBoxHGCMConnection(CRConnection *conn) 2502 void crVBoxHGCMConnection(CRConnection *conn 2503 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 2504 , struct VBOXUHGSMI *pHgsmi 2505 #endif 2506 ) 2501 2507 { 2502 2508 int i, found = 0; … … 2520 2526 conn->InstantReclaim = crVBoxHGSMIInstantReclaim; 2521 2527 conn->HandleNewMessage = crVBoxHGSMIHandleNewMessage; 2528 conn->pExternalHgsmi = pHgsmi; 2522 2529 } 2523 2530 else … … 2577 2584 } 2578 2585 2579 int crVBoxHGCMRecv(void) 2586 #if defined(IN_GUEST) 2587 void _crVBoxHGCMPerformPollHost(CRConnection *conn) 2588 { 2589 if (conn->type == CR_NO_CONNECTION ) 2590 return; 2591 2592 if (!conn->pBuffer) 2593 { 2594 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 2595 PCRVBOXHGSMI_CLIENT pClient; 2596 if (g_crvboxhgcm.bHgsmiOn && !!(pClient = _crVBoxHGSMIClientGet(conn))) 2597 { 2598 _crVBoxHGSMIPollHost(conn, pClient); 2599 } 2600 else 2601 #endif 2602 { 2603 crVBoxHGCMPollHost(conn); 2604 } 2605 } 2606 } 2607 #endif 2608 2609 void _crVBoxHGCMPerformReceiveMessage(CRConnection *conn) 2610 { 2611 if ( conn->type == CR_NO_CONNECTION ) 2612 return; 2613 2614 if (conn->cbBuffer>0) 2615 { 2616 _crVBoxHGCMReceiveMessage(conn); 2617 } 2618 } 2619 2620 int crVBoxHGCMRecv( 2621 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 2622 CRConnection *conn 2623 #endif 2624 ) 2580 2625 { 2581 2626 int32_t i; … … 2588 2633 2589 2634 #ifdef IN_GUEST 2635 # if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 2636 CRASSERT(!g_crvboxhgcm.bHgsmiOn == !conn); 2637 if (conn && g_crvboxhgcm.bHgsmiOn) 2638 { 2639 _crVBoxHGCMPerformPollHost(conn); 2640 _crVBoxHGCMPerformReceiveMessage(conn); 2641 VBOXCRHGSMIPROFILE_FUNC_EPILOGUE(); 2642 return 0; 2643 } 2644 # endif 2590 2645 /* we're on guest side, poll host if it got something for us */ 2591 2646 for (i=0; i<g_crvboxhgcm.num_conns; i++) … … 2593 2648 CRConnection *conn = g_crvboxhgcm.conns[i]; 2594 2649 2595 if ( !conn || conn->type == CR_NO_CONNECTION)2650 if ( !conn ) 2596 2651 continue; 2597 2652 2598 if (!conn->pBuffer) 2599 { 2600 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 2601 PCRVBOXHGSMI_CLIENT pClient; 2602 if (g_crvboxhgcm.bHgsmiOn && !!(pClient = _crVBoxHGSMIClientGet(conn))) 2603 { 2604 _crVBoxHGSMIPollHost(conn, pClient); 2605 } 2606 else 2607 #endif 2608 { 2609 crVBoxHGCMPollHost(conn); 2610 } 2611 } 2653 _crVBoxHGCMPerformPollHost(conn); 2612 2654 } 2613 2655 #endif … … 2617 2659 CRConnection *conn = g_crvboxhgcm.conns[i]; 2618 2660 2619 if ( !conn || conn->type == CR_NO_CONNECTION)2661 if ( !conn ) 2620 2662 continue; 2621 2663 2622 if (conn->cbBuffer>0) 2623 { 2624 _crVBoxHGCMReceiveMessage(conn); 2625 } 2664 _crVBoxHGCMPerformReceiveMessage(conn); 2626 2665 } 2627 2666
Note:
See TracChangeset
for help on using the changeset viewer.

