Changeset 33714 in vbox
- Timestamp:
- Nov 2, 2010 11:36:10 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 67340
- Location:
- trunk
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/VBoxCrHgsmi.h
r33656 r33714 39 39 #endif 40 40 41 #ifdef VBOX_CRHGSMI_WITH_D3DDEV 41 42 typedef void * HVBOXCRHGSMI_CLIENT; 42 43 … … 54 55 55 56 VBOXCRHGSMI_DECL(int) VBoxCrHgsmiInit(PVBOXCRHGSMI_CALLBACKS pCallbacks); 57 VBOXCRHGSMI_DECL(HVBOXCRHGSMI_CLIENT) VBoxCrHgsmiQueryClient(); 58 #else 59 VBOXCRHGSMI_DECL(int) VBoxCrHgsmiInit(); 60 VBOXCRHGSMI_DECL(PVBOXUHGSMI) VBoxCrHgsmiCreate(); 61 VBOXCRHGSMI_DECL(void) VBoxCrHgsmiDestroy(PVBOXUHGSMI pHgsmi); 62 #endif 56 63 VBOXCRHGSMI_DECL(int) VBoxCrHgsmiTerm(); 57 VBOXCRHGSMI_DECL(HVBOXCRHGSMI_CLIENT) VBoxCrHgsmiQueryClient();58 64 59 65 VBOXCRHGSMI_DECL(void) VBoxCrHgsmiLog(char * szString); -
trunk/include/VBox/VBoxVideo.h
r33575 r33714 740 740 VBOXVHWA_OVERLAYFX desc; 741 741 VBOXVHWA_RECTL xUpdatedSrcMemRect; 742 VBOXVHWA_RECTL xUpdatedDstMemRect; 742 743 } in; 743 744 } u; -
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxCrHgsmi.cpp
r33684 r33714 4 4 #include "VBoxUhgsmiKmt.h" 5 5 6 static VBOXDISPKMT_CALLBACKS g_VBoxCrHgsmiKmtCallbacks; 7 static int g_bVBoxKmtCallbacksInited = 0; 8 9 #ifdef VBOX_CRHGSMI_WITH_D3DDEV 6 10 static VBOXCRHGSMI_CALLBACKS g_VBoxCrHgsmiCallbacks; 7 11 static HMODULE g_hVBoxCrHgsmiProvider = NULL; 8 12 static uint32_t g_cVBoxCrHgsmiProvider = 0; 9 13 10 static VBOXDISPKMT_CALLBACKS g_VBoxCrHgsmiKmtCallbacks;11 14 12 15 typedef VBOXWDDMDISP_DECL(int) FNVBOXDISPCRHGSMI_INIT(PVBOXCRHGSMI_CALLBACKS pCallbacks); … … 25 28 VBOXCRHGSMI_DECL(int) VBoxCrHgsmiInit(PVBOXCRHGSMI_CALLBACKS pCallbacks) 26 29 { 27 static int bKmtCallbacksInited = 0; 28 if (!bKmtCallbacksInited) 30 if (!g_bVBoxKmtCallbacksInited) 29 31 { 30 32 HRESULT hr = vboxDispKmtCallbacksInit(&g_VBoxCrHgsmiKmtCallbacks); 31 33 Assert(hr == S_OK); 32 34 if (hr == S_OK) 33 bKmtCallbacksInited = 1;35 g_bVBoxKmtCallbacksInited = 1; 34 36 else 35 bKmtCallbacksInited = -1;36 } 37 38 Assert( bKmtCallbacksInited);39 if ( bKmtCallbacksInited < 0)37 g_bVBoxKmtCallbacksInited = -1; 38 } 39 40 Assert(g_bVBoxKmtCallbacksInited); 41 if (g_bVBoxKmtCallbacksInited < 0) 40 42 { 41 43 Assert(0); … … 135 137 return NULL; 136 138 } 139 #else 140 VBOXCRHGSMI_DECL(int) VBoxCrHgsmiInit() 141 { 142 if (!g_bVBoxKmtCallbacksInited) 143 { 144 HRESULT hr = vboxDispKmtCallbacksInit(&g_VBoxCrHgsmiKmtCallbacks); 145 Assert(hr == S_OK); 146 if (hr == S_OK) 147 g_bVBoxKmtCallbacksInited = 1; 148 else 149 g_bVBoxKmtCallbacksInited = -1; 150 } 151 152 Assert(g_bVBoxKmtCallbacksInited); 153 if (g_bVBoxKmtCallbacksInited < 0) 154 { 155 Assert(0); 156 return VERR_NOT_SUPPORTED; 157 } 158 159 return VINF_SUCCESS; 160 } 161 162 VBOXCRHGSMI_DECL(PVBOXUHGSMI) VBoxCrHgsmiCreate() 163 { 164 PVBOXUHGSMI_PRIVATE_KMT pHgsmiGL = (PVBOXUHGSMI_PRIVATE_KMT)RTMemAllocZ(sizeof (*pHgsmiGL)); 165 if (pHgsmiGL) 166 { 167 #if 0 168 HRESULT hr = vboxUhgsmiKmtCreate(pHgsmiGL, TRUE /* bD3D tmp for injection thread*/); 169 #else 170 HRESULT hr = vboxUhgsmiKmtEscCreate(pHgsmiGL, TRUE /* bD3D tmp for injection thread*/); 171 #endif 172 Assert(hr == S_OK); 173 if (hr == S_OK) 174 { 175 return &pHgsmiGL->BasePrivate.Base; 176 } 177 RTMemFree(pHgsmiGL); 178 } 179 180 return NULL; 181 } 182 183 VBOXCRHGSMI_DECL(void) VBoxCrHgsmiDestroy(PVBOXUHGSMI pHgsmi) 184 { 185 PVBOXUHGSMI_PRIVATE_KMT pHgsmiGL = VBOXUHGSMIKMT_GET(pHgsmi); 186 HRESULT hr = vboxUhgsmiKmtDestroy(pHgsmiGL); 187 Assert(hr == S_OK); 188 if (hr == S_OK) 189 { 190 RTMemFree(pHgsmiGL); 191 } 192 } 193 #endif 137 194 138 195 VBOXCRHGSMI_DECL(int) VBoxCrHgsmiTerm() 139 196 { 140 Assert(0);141 197 #if 0 142 198 PVBOXUHGSMI_PRIVATE_KMT pHgsmiGL = gt_pHgsmiGL; … … 151 207 g_pfnVBoxDispCrHgsmiTerm(); 152 208 #endif 209 if (g_bVBoxKmtCallbacksInited > 0) 210 { 211 vboxDispKmtCallbacksTerm(&g_VBoxCrHgsmiKmtCallbacks); 212 } 153 213 return VINF_SUCCESS; 154 214 } -
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp
r33684 r33714 740 740 #ifdef VBOX_WITH_CRHGSMI 741 741 static __declspec(thread) PVBOXUHGSMI_PRIVATE_BASE gt_pHgsmi = NULL; 742 #endif743 742 744 743 VBOXWDDMDISP_DECL(int) VBoxDispCrHgsmiInit(PVBOXCRHGSMI_CALLBACKS pCallbacks) … … 786 785 } 787 786 788 #ifdef VBOX_WITH_CRHGSMI789 787 static HRESULT vboxUhgsmiGlobalRetain() 790 788 { … … 876 874 #define VBOXDISPCRHGSMI_SCOPE_SET_DEV(_pDev) do {} while(0) 877 875 #define VBOXDISPCRHGSMI_SCOPE_SET_GLOBAL() do {} while(0) 876 877 VBOXWDDMDISP_DECL(int) VBoxDispCrHgsmiInit(void*) 878 { 879 return VERR_NOT_IMPLEMENTED; 880 } 881 882 VBOXWDDMDISP_DECL(int) VBoxDispCrHgsmiTerm() 883 { 884 return VERR_NOT_IMPLEMENTED; 885 } 886 887 VBOXWDDMDISP_DECL(void*) VBoxDispCrHgsmiQueryClient() 888 { 889 return NULL; 890 } 878 891 #endif 879 892 -
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxUhgsmiBase.h
r33241 r33714 32 32 { 33 33 VBOXUHGSMI Base; 34 #ifdef VBOX_CRHGSMI_WITH_D3DDEV 34 35 HVBOXCRHGSMI_CLIENT hClient; 36 #endif 35 37 } VBOXUHGSMI_PRIVATE_BASE, *PVBOXUHGSMI_PRIVATE_BASE; 36 38 -
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxUhgsmiKmt.cpp
r33684 r33714 437 437 pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiKmtBufferCreate; 438 438 pHgsmi->BasePrivate.Base.pfnBufferSubmitAsynch = vboxUhgsmiKmtBufferSubmitAsynch; 439 #ifdef VBOX_CRHGSMI_WITH_D3DDEV 439 440 pHgsmi->BasePrivate.hClient = NULL; 441 #endif 440 442 return vboxUhgsmiKmtEngineCreate(pHgsmi, bD3D); 441 443 } … … 445 447 pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiKmtEscBufferCreate; 446 448 pHgsmi->BasePrivate.Base.pfnBufferSubmitAsynch = vboxUhgsmiKmtEscBufferSubmitAsynch; 449 #ifdef VBOX_CRHGSMI_WITH_D3DDEV 447 450 pHgsmi->BasePrivate.hClient = NULL; 451 #endif 448 452 return vboxUhgsmiKmtEngineCreate(pHgsmi, bD3D); 449 453 } -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.cpp
r33540 r33714 920 920 } 921 921 922 static void vboxVhwaHlpOverlayListAdd(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_OVERLAY pOverlay) 923 { 924 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pOverlay->VidPnSourceId]; 925 KIRQL OldIrql; 926 KeAcquireSpinLock(&pSource->OverlayListLock, &OldIrql); 927 ASMAtomicIncU32(&pSource->cOverlays); 928 InsertHeadList(&pSource->OverlayList, &pOverlay->ListEntry); 929 KeReleaseSpinLock(&pSource->OverlayListLock, OldIrql); 930 } 931 932 static void vboxVhwaHlpOverlayListRemove(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_OVERLAY pOverlay) 933 { 934 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pOverlay->VidPnSourceId]; 935 KIRQL OldIrql; 936 KeAcquireSpinLock(&pSource->OverlayListLock, &OldIrql); 937 ASMAtomicDecU32(&pSource->cOverlays); 938 RemoveEntryList(&pOverlay->ListEntry); 939 KeReleaseSpinLock(&pSource->OverlayListLock, OldIrql); 940 } 941 922 942 AssertCompile(sizeof (RECT) == sizeof (VBOXVHWA_RECTL)); 923 943 AssertCompile(RT_SIZEOFMEMB(RECT, left) == RT_SIZEOFMEMB(VBOXVHWA_RECTL, left)); … … 930 950 AssertCompile(RT_OFFSETOF(RECT, bottom) == RT_OFFSETOF(VBOXVHWA_RECTL, bottom)); 931 951 932 int vboxVhwaHlpOverlayUpdate(PVBOXWDDM_OVERLAY pOverlay, const DXGK_OVERLAYINFO *pOverlayInfo )952 int vboxVhwaHlpOverlayUpdate(PVBOXWDDM_OVERLAY pOverlay, const DXGK_OVERLAYINFO *pOverlayInfo, RECT * pDstUpdateRect) 933 953 { 934 954 PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pOverlayInfo->hAllocation; … … 982 1002 if (pOurInfo->DirtyRegion.fFlags & VBOXWDDM_DIRTYREGION_F_VALID) 983 1003 { 984 pBody->u.in.xUpdatedSrcMemValid = 1;985 1004 if (pOurInfo->DirtyRegion.fFlags & VBOXWDDM_DIRTYREGION_F_RECT_VALID) 986 1005 pBody->u.in.xUpdatedSrcMemRect = *(VBOXVHWA_RECTL*)((void*)&pOurInfo->DirtyRegion.Rect); … … 993 1012 } 994 1013 1014 if (pDstUpdateRect) 1015 { 1016 pBody->u.in.xUpdatedDstMemRect = *(VBOXVHWA_RECTL*)((void*)pDstUpdateRect); 1017 } 1018 995 1019 /* we're not interested in completion, just send the command */ 996 1020 vboxVhwaCommandSubmitAsynchAndComplete(pOverlay->pDevExt, pCmd); … … 1011 1035 } 1012 1036 1037 int vboxVhwaHlpOverlayUpdate(PVBOXWDDM_OVERLAY pOverlay, const DXGK_OVERLAYINFO *pOverlayInfo) 1038 { 1039 return vboxVhwaHlpOverlayUpdate(pOverlay, pOverlayInfo, NULL); 1040 } 1041 1013 1042 int vboxVhwaHlpOverlayDestroy(PVBOXWDDM_OVERLAY pOverlay) 1014 1043 { 1015 1044 int rc = VINF_SUCCESS; 1045 1046 vboxVhwaHlpOverlayListRemove(pOverlay->pDevExt, pOverlay); 1047 1016 1048 for (uint32_t i = 0; i < pOverlay->pResource->cAllocations; ++i) 1017 1049 { … … 1066 1098 pOverlay->pResource = pRc; 1067 1099 pOverlay->VidPnSourceId = VidPnSourceId; 1068 rc = vboxVhwaHlpOverlayUpdate(pOverlay, pOverlayInfo); 1100 1101 vboxVhwaHlpOverlayListAdd(pDevExt, pOverlay); 1102 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 1103 RECT DstRect; 1104 vboxVhwaHlpOverlayDstRectGet(pDevExt, pOverlay, &DstRect); 1105 NTSTATUS Status = vboxVdmaHlpUpdatePrimary(pDevExt, VidPnSourceId, &DstRect); 1106 Assert(Status == STATUS_SUCCESS); 1107 /* ignore primary update failure */ 1108 Status = STATUS_SUCCESS; 1109 #endif 1110 rc = vboxVhwaHlpOverlayUpdate(pOverlay, pOverlayInfo, &DstRect); 1069 1111 if (!RT_SUCCESS(rc)) 1070 1112 { … … 1089 1131 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[VidPnSourceId]; 1090 1132 return !ASMAtomicReadU32(&pSource->cOverlays); 1091 }1092 1093 void vboxVhwaHlpOverlayListAdd(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_OVERLAY pOverlay)1094 {1095 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pOverlay->VidPnSourceId];1096 KIRQL OldIrql;1097 KeAcquireSpinLock(&pSource->OverlayListLock, &OldIrql);1098 ASMAtomicIncU32(&pSource->cOverlays);1099 InsertHeadList(&pSource->OverlayList, &pOverlay->ListEntry);1100 KeReleaseSpinLock(&pSource->OverlayListLock, OldIrql);1101 }1102 1103 void vboxVhwaHlpOverlayListRemove(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_OVERLAY pOverlay)1104 {1105 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pOverlay->VidPnSourceId];1106 KIRQL OldIrql;1107 KeAcquireSpinLock(&pSource->OverlayListLock, &OldIrql);1108 ASMAtomicDecU32(&pSource->cOverlays);1109 RemoveEntryList(&pOverlay->ListEntry);1110 KeReleaseSpinLock(&pSource->OverlayListLock, OldIrql);1111 1133 } 1112 1134 -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.h
r32823 r33714 64 64 65 65 BOOLEAN vboxVhwaHlpOverlayListIsEmpty(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId); 66 void vboxVhwaHlpOverlayListAdd(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_OVERLAY pOverlay);67 void vboxVhwaHlpOverlayListRemove(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_OVERLAY pOverlay);66 //void vboxVhwaHlpOverlayListAdd(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_OVERLAY pOverlay); 67 //void vboxVhwaHlpOverlayListRemove(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_OVERLAY pOverlay); 68 68 void vboxVhwaHlpOverlayDstRectUnion(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, RECT *pRect); 69 69 void vboxVhwaHlpOverlayDstRectGet(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_OVERLAY pOverlay, RECT *pRect); -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVidPn.cpp
r33540 r33714 533 533 { 534 534 D3DKMDT_VIDPN_SOURCE_MODE *pNewVidPnSourceModeInfo; 535 /* disable 24 bpp for now */ 536 if (pModes[i].BitsPerPlane == 24) 537 continue; 538 535 539 Status = pNewVidPnSourceModeSetInterface->pfnCreateNewModeInfo(hNewVidPnSourceModeSet, &pNewVidPnSourceModeInfo); 536 540 Assert(Status == STATUS_SUCCESS); -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp
r33711 r33714 4311 4311 if (RT_SUCCESS(rc)) 4312 4312 { 4313 vboxVhwaHlpOverlayListAdd(pDevExt, pOverlay);4314 #ifdef VBOXWDDM_RENDER_FROM_SHADOW4315 RECT DstRect;4316 vboxVhwaHlpOverlayDstRectGet(pDevExt, pOverlay, &DstRect);4317 Status = vboxVdmaHlpUpdatePrimary(pDevExt, pCreateOverlay->VidPnSourceId, &DstRect);4318 Assert(Status == STATUS_SUCCESS);4319 /* ignore primary update failure */4320 Status = STATUS_SUCCESS;4321 #endif4322 4313 pCreateOverlay->hOverlay = pOverlay; 4323 4314 } … … 5147 5138 PVBOXWDDM_OVERLAY pOverlay = (PVBOXWDDM_OVERLAY)hOverlay; 5148 5139 Assert(pOverlay); 5149 vboxVhwaHlpOverlayListRemove(pOverlay->pDevExt, pOverlay);5150 5140 int rc = vboxVhwaHlpOverlayDestroy(pOverlay); 5151 5141 AssertRC(rc); -
trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.cpp
r33540 r33714 2739 2739 2740 2740 #ifdef VBOX_WITH_WDDM 2741 if(pCmd->u.in.xUpdatedSrcMem Valid)2741 if(pCmd->u.in.xUpdatedSrcMemRect.right) 2742 2742 { 2743 2743 QRect r = VBOXVHWA_CONSTRUCT_QRECT_FROM_RECTL_WH(&pCmd->u.in.xUpdatedSrcMemRect); 2744 2744 pSrcSurf->updatedMem(&r); 2745 } 2746 if(pCmd->u.in.xUpdatedDstMemRect.right) 2747 { 2748 QRect r = VBOXVHWA_CONSTRUCT_QRECT_FROM_RECTL_WH(&pCmd->u.in.xUpdatedDstMemRect); 2749 pDstSurf->updatedMem(&r); 2745 2750 } 2746 2751 #endif -
trunk/src/VBox/GuestHost/OpenGL/include/cr_net.h
r33540 r33714 106 106 } CRMultiBuffer; 107 107 108 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 109 typedef struct CRVBOXHGSMI_CLIENT { 110 struct VBOXUHGSMI *pHgsmi; 111 struct VBOXUHGSMI_BUFFER *pCmdBuffer; 112 struct VBOXUHGSMI_BUFFER *pHGBuffer; 113 void *pvHGBuffer; 114 struct CRBufferPool_t *bufpool; 115 } CRVBOXHGSMI_CLIENT, *PCRVBOXHGSMI_CLIENT; 116 #endif 108 117 /** 109 118 * Chromium network connection (bidirectional). … … 224 233 #ifdef IN_GUEST 225 234 uint32_t u32InjectClientID; 235 # ifdef VBOX_WITH_CRHGSMI 236 # ifndef VBOX_CRHGSMI_WITH_D3DDEV 237 CRVBOXHGSMI_CLIENT HgsmiClient; 238 # endif 239 # endif 226 240 #endif 227 241 /* Used on host side to indicate that we are not allowed to store above pointers for later use -
trunk/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c
r33684 r33714 16 16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. 17 17 */ 18 19 18 #ifdef RT_OS_WINDOWS 20 19 #include <windows.h> … … 226 225 227 226 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 228 typedef struct CRVBOXHGSMI_CLIENT {229 PVBOXUHGSMI pHgsmi;230 PVBOXUHGSMI_BUFFER pCmdBuffer;231 PVBOXUHGSMI_BUFFER pHGBuffer;232 void *pvHGBuffer;233 CRBufferPool *bufpool;234 } CRVBOXHGSMI_CLIENT, *PCRVBOXHGSMI_CLIENT;235 227 236 228 /* add sizeof header + page align */ … … 243 235 #define CRVBOXHGSMI_BUF_OFFSET(_st2, _st1) ((uint32_t)(((uint8_t*)(_st2)) - ((uint8_t*)(_st1)))) 244 236 237 static int _crVBoxHGSMIClientInit(PCRVBOXHGSMI_CLIENT pClient, PVBOXUHGSMI pHgsmi) 238 { 239 int rc; 240 pClient->pHgsmi = pHgsmi; 241 rc = pHgsmi->pfnBufferCreate(pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(1), 242 VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT, 243 NULL, 244 &pClient->pCmdBuffer); 245 AssertRC(rc); 246 if (RT_SUCCESS(rc)) 247 { 248 rc = pHgsmi->pfnBufferCreate(pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(1), 249 VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT, 250 NULL, 251 &pClient->pHGBuffer); 252 AssertRC(rc); 253 if (RT_SUCCESS(rc)) 254 { 255 pClient->pvHGBuffer = NULL; 256 pClient->bufpool = crBufferPoolInit(16); 257 return VINF_SUCCESS; 258 } 259 pClient->pCmdBuffer->pfnDestroy(pClient->pCmdBuffer); 260 } 261 pClient->pHgsmi = NULL; 262 return rc; 263 } 264 265 void _crVBoxHGSMIBufferFree(void *data) 266 { 267 PVBOXUHGSMI_BUFFER pBuffer = (PVBOXUHGSMI_BUFFER)data; 268 pBuffer->pfnDestroy(pBuffer); 269 } 270 271 static int _crVBoxHGSMIClientTerm(PCRVBOXHGSMI_CLIENT pClient, PVBOXUHGSMI *ppHgsmi) 272 { 273 if (pClient->bufpool) 274 crBufferPoolCallbackFree(pClient->bufpool, _crVBoxHGSMIBufferFree); 275 pClient->bufpool = NULL; 276 277 if (pClient->pHGBuffer) 278 { 279 pClient->pHGBuffer->pfnDestroy(pClient->pHGBuffer); 280 pClient->pHGBuffer = NULL; 281 } 282 283 if (pClient->pCmdBuffer) 284 { 285 pClient->pCmdBuffer->pfnDestroy(pClient->pCmdBuffer); 286 pClient->pCmdBuffer = NULL; 287 } 288 289 if (ppHgsmi) 290 { 291 *ppHgsmi = pClient->pHgsmi; 292 } 293 pClient->pHgsmi = NULL; 294 295 return VINF_SUCCESS; 296 } 297 298 299 #ifdef VBOX_CRHGSMI_WITH_D3DDEV 300 301 DECLCALLBACK(HVBOXCRHGSMI_CLIENT) _crVBoxHGSMIClientCreate(PVBOXUHGSMI pHgsmi) 302 { 303 PCRVBOXHGSMI_CLIENT pClient = crAlloc(sizeof (CRVBOXHGSMI_CLIENT)); 304 305 if (pClient) 306 { 307 int rc = _crVBoxHGSMIClientInit(pClient, pHgsmi); 308 AssertRC(rc); 309 if (RT_SUCCESS(rc)) 310 return (HVBOXCRHGSMI_CLIENT)pClient; 311 312 crFree(pCLient); 313 } 314 315 return NULL; 316 } 317 318 DECLCALLBACK(void) _crVBoxHGSMIClientDestroy(HVBOXCRHGSMI_CLIENT hClient) 319 { 320 PCRVBOXHGSMI_CLIENT pClient = (PCRVBOXHGSMI_CLIENT)hClient; 321 _crVBoxHGSMIClientTerm(pClient, NULL); 322 crFree(pClient); 323 } 324 #endif 325 245 326 DECLINLINE(PCRVBOXHGSMI_CLIENT) _crVBoxHGSMIClientGet(CRConnection *conn) 246 327 { 328 #ifdef VBOX_CRHGSMI_WITH_D3DDEV 247 329 PCRVBOXHGSMI_CLIENT pClient = (PCRVBOXHGSMI_CLIENT)VBoxCrHgsmiQueryClient(); 248 330 Assert(pClient); 249 331 return pClient; 332 #else 333 if (conn->HgsmiClient.pHgsmi) 334 return &conn->HgsmiClient; 335 { 336 PVBOXUHGSMI pHgsmi = VBoxCrHgsmiCreate(); 337 Assert(pHgsmi); 338 if (pHgsmi) 339 { 340 int rc = _crVBoxHGSMIClientInit(&conn->HgsmiClient, pHgsmi); 341 AssertRC(rc); 342 if (RT_SUCCESS(rc)) 343 { 344 Assert(conn->HgsmiClient.pHgsmi); 345 return &conn->HgsmiClient; 346 } 347 VBoxCrHgsmiDestroy(pHgsmi); 348 } 349 } 350 return NULL; 351 #endif 250 352 } 251 353 … … 1369 1471 1370 1472 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 1371 DECLCALLBACK(HVBOXCRHGSMI_CLIENT) _crVBoxHGSMIClientCreate(PVBOXUHGSMI pHgsmi) 1372 { 1373 PCRVBOXHGSMI_CLIENT pClient = crAlloc(sizeof (CRVBOXHGSMI_CLIENT)); 1374 1375 if (pClient) 1473 1474 bool _crVBoxHGSMIInit() 1475 { 1476 #ifndef VBOX_CRHGSMI_WITH_D3DDEV 1477 static 1478 #endif 1479 int bHasHGSMI = -1; 1480 1481 if (bHasHGSMI < 0) 1376 1482 { 1377 1483 int rc; 1378 pClient->pHgsmi = pHgsmi; 1379 rc = pHgsmi->pfnBufferCreate(pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(1), 1380 VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT, 1381 NULL, 1382 &pClient->pCmdBuffer); 1383 AssertRC(rc); 1384 if (RT_SUCCESS(rc)) 1385 { 1386 rc = pHgsmi->pfnBufferCreate(pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(1), 1387 VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT, 1388 NULL, 1389 &pClient->pHGBuffer); 1390 AssertRC(rc); 1391 if (RT_SUCCESS(rc)) 1392 { 1393 pClient->pvHGBuffer = NULL; 1394 pClient->bufpool = crBufferPoolInit(16); 1395 return (HVBOXCRHGSMI_CLIENT) pClient; 1396 } 1397 pClient->pCmdBuffer->pfnDestroy(pClient->pCmdBuffer); 1398 } 1399 } 1400 1401 return NULL; 1402 } 1403 1404 DECLCALLBACK(void) _crVBoxHGSMIClientDestroy(HVBOXCRHGSMI_CLIENT hClient) 1405 { 1406 Assert(0); 1407 1408 /* @todo */ 1409 } 1410 1411 bool _crVBoxHGSMIInit() 1412 { 1413 int bHasHGSMI = -1; 1414 1415 if (bHasHGSMI < 0) 1416 { 1417 int rc; 1484 #ifndef VBOX_CRHGSMI_WITH_D3DDEV 1485 rc = VBoxCrHgsmiInit(); 1486 #else 1418 1487 VBOXCRHGSMI_CALLBACKS Callbacks; 1419 1488 Callbacks.pfnClientCreate = _crVBoxHGSMIClientCreate; 1420 1489 Callbacks.pfnClientDestroy = _crVBoxHGSMIClientDestroy; 1421 1490 rc = VBoxCrHgsmiInit(&Callbacks); 1491 #endif 1422 1492 AssertRC(rc); 1423 1493 if (RT_SUCCESS(rc)) … … 2004 2074 static void crVBoxHGSMIDoDisconnect( CRConnection *conn ) 2005 2075 { 2076 #ifndef VBOX_CRHGSMI_WITH_D3DDEV 2077 if (conn->HgsmiClient.pHgsmi) 2078 { 2079 PVBOXUHGSMI pHgsmi; 2080 _crVBoxHGSMIClientTerm(&conn->HgsmiClient, &pHgsmi); 2081 Assert(pHgsmi); 2082 VBoxCrHgsmiDestroy(pHgsmi); 2083 } 2084 2085 #endif 2006 2086 crVBoxHGCMDoDisconnect(conn); 2007 2087 }
Note:
See TracChangeset
for help on using the changeset viewer.