Changeset 41058 in vbox
- Timestamp:
- Apr 25, 2012 9:42:29 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 77623
- Location:
- trunk
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/VBoxUhgsmi.h
r36536 r41058 33 33 34 34 typedef struct VBOXUHGSMI_BUFFER *PVBOXUHGSMI_BUFFER; 35 typedef void* HVBOXUHGSMI_SYNCHOBJECT;36 35 37 typedef enum36 typedef struct VBOXUHGSMI_BUFFER_TYPE_FLAGS 38 37 { 39 VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE = 0, 40 VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT, 41 VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE 42 } VBOXUHGSMI_SYNCHOBJECT_TYPE; 38 union 39 { 40 struct 41 { 42 uint32_t fCommand : 1; 43 uint32_t Reserved : 31; 44 }; 45 uint32_t Value; 46 }; 47 } VBOXUHGSMI_BUFFER_TYPE_FLAGS; 43 48 44 49 typedef struct VBOXUHGSMI_BUFFER_LOCK_FLAGS … … 67 72 uint32_t bHostReadOnly : 1; 68 73 uint32_t bHostWriteOnly : 1; 69 uint32_t bDoNotRetire : 1; /**< the buffer will be uset in a subsequent command */ 70 uint32_t bDoNotSignalCompletion : 1; /**< do not signal notification object on completion for this alloc */ 74 uint32_t bDoNotRetire : 1; /**< the buffer will be used in a subsequent command */ 71 75 uint32_t bEntireBuffer : 1; 72 uint32_t Reserved : 2 7;76 uint32_t Reserved : 28; 73 77 }; 74 78 uint32_t Value; … … 78 82 /* the caller can specify NULL as a hSynch and specify a valid enmSynchType to make UHGSMI create a proper object itself, 79 83 * */ 80 typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_CREATE(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, 81 VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType, HVBOXUHGSMI_SYNCHOBJECT hSynch, 82 PVBOXUHGSMI_BUFFER* ppBuf); 84 typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_CREATE(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fType, PVBOXUHGSMI_BUFFER* ppBuf); 83 85 typedef FNVBOXUHGSMI_BUFFER_CREATE *PFNVBOXUHGSMI_BUFFER_CREATE; 84 86 … … 91 93 } VBOXUHGSMI_BUFFER_SUBMIT, *PVBOXUHGSMI_BUFFER_SUBMIT; 92 94 93 typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_SUBMIT _ASYNCH(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers);94 typedef FNVBOXUHGSMI_BUFFER_SUBMIT _ASYNCH *PFNVBOXUHGSMI_BUFFER_SUBMIT_ASYNCH;95 typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_SUBMIT(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers); 96 typedef FNVBOXUHGSMI_BUFFER_SUBMIT *PFNVBOXUHGSMI_BUFFER_SUBMIT; 95 97 96 98 typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_DESTROY(PVBOXUHGSMI_BUFFER pBuf); … … 106 108 { 107 109 PFNVBOXUHGSMI_BUFFER_CREATE pfnBufferCreate; 108 PFNVBOXUHGSMI_BUFFER_SUBMIT _ASYNCH pfnBufferSubmitAsynch;110 PFNVBOXUHGSMI_BUFFER_SUBMIT pfnBufferSubmit; 109 111 /** User custom data. */ 110 112 void *pvUserData; … … 119 121 /* r/o data added for ease of access and simplicity 120 122 * modifying it leads to unpredictable behavior */ 121 HVBOXUHGSMI_SYNCHOBJECT hSynch; 122 VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType; 123 VBOXUHGSMI_BUFFER_TYPE_FLAGS fType; 123 124 uint32_t cbBuffer; 124 bool bSynchCreated;125 125 /** User custom data. */ 126 126 void *pvUserData; 127 127 } VBOXUHGSMI_BUFFER; 128 128 129 #define VBoxUhgsmiBufferCreate(_pUhgsmi, _cbBuf, _fType, _ppBuf) ((_pUhgsmi)->pfnBufferCreate(_pUhgsmi, _cbBuf, _fType, _ppBuf)) 130 #define VBoxUhgsmiBufferSubmit(_pUhgsmi, _aBuffers, _cBuffers) ((_pUhgsmi)->pfnBufferSubmit(_pUhgsmi, _aBuffers, _cBuffers)) 131 132 #define VBoxUhgsmiBufferLock(_pBuf, _offLock, _cbLock, _fFlags, _pvLock) ((_pBuf)->pfnLock(_pBuf, _offLock, _cbLock, _fFlags, _pvLock)) 133 #define VBoxUhgsmiBufferUnlock(_pBuf) ((_pBuf)->pfnUnlock(_pBuf)) 134 #define VBoxUhgsmiBufferDestroy(_pBuf) ((_pBuf)->pfnDestroy(_pBuf)) 135 129 136 #endif 130 137 -
trunk/include/VBox/VBoxVideo.h
r39603 r41058 1374 1374 VBOXVIDEOOFFSET offBuffer; 1375 1375 uint32_t cbBuffer; 1376 uint32_t u32Gues Data;1377 uint64_t u64Gues Data;1376 uint32_t u32GuestData; 1377 uint64_t u64GuestData; 1378 1378 } VBOXVDMACMD_CHROMIUM_BUFFER, *PVBOXVDMACMD_CHROMIUM_BUFFER; 1379 1379 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/common/wddm/VBoxMPIf.h
r40747 r41058 35 35 36 36 /* One would increase this whenever definitions in this file are changed */ 37 #define VBOXVIDEOIF_VERSION 1 237 #define VBOXVIDEOIF_VERSION 13 38 38 39 39 #define VBOXWDDM_NODE_ID_SYSTEM 0 … … 113 113 uint32_t cbBuffer; 114 114 uint64_t hSynch; 115 VBOXUHGSMI_ SYNCHOBJECT_TYPE enmSynchType;115 VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType; 116 116 }; 117 117 }; … … 180 180 typedef struct VBOXWDDM_UHGSMI_BUFFER_UI_SUBMIT_INFO 181 181 { 182 VBOXUHGSMI_BUFFER_SUBMIT_FLAGS fSubFlags;182 uint32_t bDoNotSignalCompletion; 183 183 uint32_t offData; 184 184 uint32_t cbData; … … 438 438 uint64_t pvData; 439 439 uint64_t hSynch; 440 VBOXUHGSMI_ SYNCHOBJECT_TYPE enmSynchType;440 VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType; 441 441 } VBOXVIDEOCM_UM_ALLOC, *PVBOXVIDEOCM_UM_ALLOC; 442 442 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp
r40716 r41058 5716 5716 } 5717 5717 } 5718 5719 VBOXVDBG_BREAK_SHARED(pRc); 5718 5720 5719 5721 if (hr == S_OK) -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiBase.h
r40483 r41058 58 58 { 59 59 VBOXUHGSMI_BUFFER Base; 60 HANDLE hSynch; 60 61 D3DKMT_HANDLE hAllocation; 61 62 } VBOXUHGSMI_BUFFER_PRIVATE_BASE, *PVBOXUHGSMI_BUFFER_PRIVATE_BASE; … … 119 120 } 120 121 121 DECLINLINE(int) vboxUhgsmiBaseEventChkCreate(VBOXUHGSMI_ SYNCHOBJECT_TYPE enmSynchType, HVBOXUHGSMI_SYNCHOBJECT *phSynch, bool *pbSynchCreated)122 DECLINLINE(int) vboxUhgsmiBaseEventChkCreate(VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType, HANDLE *phSynch) 122 123 { 123 bool bSynchCreated = false;124 *phSynch = NULL; 124 125 125 switch (enmSynchType)126 if (fUhgsmiType.fCommand) 126 127 { 127 case VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT: 128 if (!*phSynch) 129 { 130 *phSynch = CreateEvent( 128 *phSynch = CreateEvent( 131 129 NULL, /* LPSECURITY_ATTRIBUTES lpEventAttributes */ 132 130 FALSE, /* BOOL bManualReset */ 133 131 FALSE, /* BOOL bInitialState */ 134 132 NULL /* LPCTSTR lpName */ 135 ); 136 Assert(*phSynch); 137 if (!*phSynch) 138 { 139 DWORD winEr = GetLastError(); 140 /* todo: translate winer */ 141 return VERR_GENERAL_FAILURE; 142 } 143 bSynchCreated = true; 144 } 145 break; 146 case VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE: 147 if (!*phSynch) 148 { 149 *phSynch = CreateSemaphore( 150 NULL, /* LPSECURITY_ATTRIBUTES lpSemaphoreAttributes */ 151 0, /* LONG lInitialCount */ 152 (LONG)((~0UL) >> 1), /* LONG lMaximumCount */ 153 NULL /* LPCTSTR lpName */ 154 ); 155 Assert(*phSynch); 156 if (!*phSynch) 157 { 158 DWORD winEr = GetLastError(); 159 /* todo: translate winer */ 160 return VERR_GENERAL_FAILURE; 161 } 162 bSynchCreated = true; 163 } 164 break; 165 case VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE: 166 Assert(!*phSynch); 167 if (*phSynch) 168 return VERR_INVALID_PARAMETER; 169 break; 170 default: 171 Assert(0); 172 return VERR_INVALID_PARAMETER; 133 ); 134 Assert(*phSynch); 135 if (!*phSynch) 136 { 137 DWORD winEr = GetLastError(); 138 /* todo: translate winer */ 139 return VERR_GENERAL_FAILURE; 140 } 173 141 } 174 *pbSynchCreated = bSynchCreated;175 142 return VINF_SUCCESS; 176 143 } … … 211 178 pAllocationList->WriteOperation = !pBufInfo->fFlags.bHostReadOnly; 212 179 pAllocationList->DoNotRetireInstance = pBufInfo->fFlags.bDoNotRetire; 213 pBufSubmInfo-> fSubFlags = pBufInfo->fFlags;180 pBufSubmInfo->bDoNotSignalCompletion = 0; 214 181 if (pBufInfo->fFlags.bEntireBuffer) 215 182 { -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiDisp.cpp
r36867 r41058 44 44 if (hr == S_OK) 45 45 { 46 if (pBuffer->BasePrivate.Base.bSynchCreated) 47 { 48 CloseHandle(pBuffer->BasePrivate.Base.hSynch); 49 } 46 if (pBuffer->BasePrivate.hSynch) 47 CloseHandle(pBuffer->BasePrivate.hSynch); 50 48 RTMemFree(pBuffer); 51 49 return VINF_SUCCESS; … … 95 93 } 96 94 97 DECLCALLBACK(int) vboxUhgsmiD3DBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, 98 VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType, HVBOXUHGSMI_SYNCHOBJECT hSynch, 99 PVBOXUHGSMI_BUFFER* ppBuf) 100 { 101 bool bSynchCreated = false; 95 DECLCALLBACK(int) vboxUhgsmiD3DBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType, PVBOXUHGSMI_BUFFER* ppBuf) 96 { 97 HANDLE hSynch = NULL; 102 98 if (!cbBuf) 103 99 return VERR_INVALID_PARAMETER; 104 100 105 int rc = vboxUhgsmiBaseEventChkCreate( enmSynchType, &hSynch, &bSynchCreated);101 int rc = vboxUhgsmiBaseEventChkCreate(fUhgsmiType, &hSynch); 106 102 AssertRC(rc); 107 103 if (RT_FAILURE(rc)) … … 134 130 Buf.AllocInfo.cbBuffer = cbBuf; 135 131 Buf.AllocInfo.hSynch = hSynch; 136 Buf.AllocInfo. enmSynchType = enmSynchType;132 Buf.AllocInfo.fUhgsmiType = fUhgsmiType; 137 133 138 134 HRESULT hr = pPrivate->pDevice->RtCallbacks.pfnAllocateCb(pPrivate->pDevice->hDevice, &Buf.DdiAlloc); … … 146 142 pBuf->BasePrivate.Base.pfnDestroy = vboxUhgsmiD3DBufferDestroy; 147 143 148 pBuf->BasePrivate.Base.hSynch = hSynch; 149 pBuf->BasePrivate.Base.enmSynchType = enmSynchType; 144 pBuf->BasePrivate.Base.fType = fUhgsmiType; 150 145 pBuf->BasePrivate.Base.cbBuffer = cbBuf; 151 pBuf->BasePrivate.Base.bSynchCreated = bSynchCreated;152 146 153 147 pBuf->pDevice = pPrivate->pDevice; … … 164 158 rc = VERR_NO_MEMORY; 165 159 166 if ( bSynchCreated)160 if (hSynch) 167 161 CloseHandle(hSynch); 168 162 … … 170 164 } 171 165 172 DECLCALLBACK(int) vboxUhgsmiD3DBufferSubmit Asynch(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)166 DECLCALLBACK(int) vboxUhgsmiD3DBufferSubmit(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers) 173 167 { 174 168 PVBOXUHGSMI_PRIVATE_D3D pHg = VBOXUHGSMID3D_GET(pHgsmi); … … 215 209 { 216 210 pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiD3DBufferCreate; 217 pHgsmi->BasePrivate.Base.pfnBufferSubmit Asynch = vboxUhgsmiD3DBufferSubmitAsynch;211 pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiD3DBufferSubmit; 218 212 pHgsmi->BasePrivate.hClient = NULL; 219 213 pHgsmi->pDevice = pDevice; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.cpp
r40483 r41058 39 39 PVBOXUHGSMI_PRIVATE_KMT pHgsmi; 40 40 VBOXVIDEOCM_UM_ALLOC Alloc; 41 HANDLE hSynch; 41 42 } VBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC, *PVBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC; 42 43 … … 56 57 if (NT_SUCCESS(Status)) 57 58 { 58 if (pBuffer->BasePrivate.Base.bSynchCreated) 59 { 60 CloseHandle(pBuffer->BasePrivate.Base.hSynch); 61 } 59 if (pBuffer->BasePrivate.hSynch) 60 CloseHandle(pBuffer->BasePrivate.hSynch); 62 61 RTMemFree(pBuffer); 63 62 return VINF_SUCCESS; … … 123 122 } 124 123 125 DECLCALLBACK(int) vboxUhgsmiKmtBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, 126 VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType, HVBOXUHGSMI_SYNCHOBJECT hSynch, 127 PVBOXUHGSMI_BUFFER* ppBuf) 128 { 129 bool bSynchCreated = false; 124 DECLCALLBACK(int) vboxUhgsmiKmtBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType, PVBOXUHGSMI_BUFFER* ppBuf) 125 { 126 HANDLE hSynch = NULL; 130 127 if (!cbBuf) 131 128 return VERR_INVALID_PARAMETER; 132 129 133 int rc = vboxUhgsmiBaseEventChkCreate( enmSynchType, &hSynch, &bSynchCreated);130 int rc = vboxUhgsmiBaseEventChkCreate(fUhgsmiType, &hSynch); 134 131 AssertRC(rc); 135 132 if (RT_FAILURE(rc)) … … 161 158 Buf.AllocInfo.cbBuffer = cbBuf; 162 159 Buf.AllocInfo.hSynch = (uint64_t)hSynch; 163 Buf.AllocInfo. enmSynchType = enmSynchType;160 Buf.AllocInfo.fUhgsmiType = fUhgsmiType; 164 161 165 162 NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTCreateAllocation(&Buf.DdiAlloc); … … 174 171 pBuf->BasePrivate.Base.pfnDestroy = vboxUhgsmiKmtBufferDestroy; 175 172 176 pBuf->BasePrivate.Base.hSynch = hSynch; 177 pBuf->BasePrivate.Base.enmSynchType = enmSynchType; 173 pBuf->BasePrivate.Base.fType = fUhgsmiType; 178 174 pBuf->BasePrivate.Base.cbBuffer = cbBuf; 179 pBuf->BasePrivate.Base.bSynchCreated = bSynchCreated;180 175 181 176 pBuf->pHgsmi = pPrivate; … … 197 192 rc = VERR_NO_MEMORY; 198 193 199 if ( bSynchCreated)194 if (hSynch) 200 195 CloseHandle(hSynch); 201 196 … … 203 198 } 204 199 205 DECLCALLBACK(int) vboxUhgsmiKmtBufferSubmit Asynch(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)200 DECLCALLBACK(int) vboxUhgsmiKmtBufferSubmit(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers) 206 201 { 207 202 PVBOXUHGSMI_PRIVATE_KMT pHg = VBOXUHGSMIKMT_GET(pHgsmi); … … 275 270 if (NT_SUCCESS(Status)) 276 271 { 277 if (pBuffer->Base.bSynchCreated) 278 { 279 CloseHandle(pBuffer->Base.hSynch); 280 } 272 if (pBuffer->hSynch) 273 CloseHandle(pBuffer->hSynch); 281 274 RTMemFree(pBuffer); 282 275 return VINF_SUCCESS; … … 290 283 } 291 284 292 DECLCALLBACK(int) vboxUhgsmiKmtEscBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, 293 VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType, HVBOXUHGSMI_SYNCHOBJECT hSynch, 294 PVBOXUHGSMI_BUFFER* ppBuf) 295 { 296 bool bSynchCreated = false; 285 DECLCALLBACK(int) vboxUhgsmiKmtEscBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType, PVBOXUHGSMI_BUFFER* ppBuf) 286 { 287 HANDLE hSynch = NULL; 297 288 if (!cbBuf) 298 289 return VERR_INVALID_PARAMETER; 299 290 300 int rc = vboxUhgsmiBaseEventChkCreate( enmSynchType, &hSynch, &bSynchCreated);291 int rc = vboxUhgsmiBaseEventChkCreate(fUhgsmiType, &hSynch); 301 292 AssertRC(rc); 302 293 if (RT_FAILURE(rc)) … … 330 321 Buf.AllocInfo.Alloc.cbData = cbBuf; 331 322 Buf.AllocInfo.Alloc.hSynch = (uint64_t)hSynch; 332 Buf.AllocInfo.Alloc. enmSynchType = enmSynchType;323 Buf.AllocInfo.Alloc.fUhgsmiType = fUhgsmiType; 333 324 334 325 NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTEscape(&Buf.DdiEscape); … … 340 331 pBuf->Base.pfnLock = vboxUhgsmiKmtEscBufferLock; 341 332 pBuf->Base.pfnUnlock = vboxUhgsmiKmtEscBufferUnlock; 342 // pBuf->Base.pfnAdjustValidDataRange = vboxUhgsmiKmtBufferAdjustValidDataRange;343 333 pBuf->Base.pfnDestroy = vboxUhgsmiKmtEscBufferDestroy; 344 334 345 pBuf->Base.hSynch = hSynch; 346 pBuf->Base.enmSynchType = enmSynchType; 335 pBuf->Base.fType = fUhgsmiType; 347 336 pBuf->Base.cbBuffer = Buf.AllocInfo.Alloc.cbData; 348 pBuf->Base.bSynchCreated = bSynchCreated; 337 338 pBuf->hSynch = hSynch; 349 339 350 340 *ppBuf = &pBuf->Base; … … 363 353 rc = VERR_NO_MEMORY; 364 354 365 if ( bSynchCreated)355 if (hSynch) 366 356 CloseHandle(hSynch); 367 357 … … 369 359 } 370 360 371 DECLCALLBACK(int) vboxUhgsmiKmtEscBufferSubmit Asynch(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)361 DECLCALLBACK(int) vboxUhgsmiKmtEscBufferSubmit(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers) 372 362 { 373 363 /* we no chromium will not submit more than three buffers actually, … … 379 369 } Buf; 380 370 381 if ( cBuffers > RT_ELEMENTS(Buf.aBufInfos) + 1)382 { 383 Assert(0);371 if (!cBuffers || cBuffers > RT_ELEMENTS(Buf.aBufInfos) + 1) 372 { 373 WARN(("invalid cBuffers!")); 384 374 return VERR_INVALID_PARAMETER; 385 375 } 386 376 387 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 } 388 383 PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pHgsmi); 389 384 D3DKMT_ESCAPE DdiEscape = {0}; … … 405 400 PVBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC pBuf = VBOXUHGSMIKMTESC_GET_BUFFER(pBufInfo->pBuf); 406 401 pSubmInfo->hAlloc = pBuf->Alloc.hAlloc; 407 pSubmInfo->Info. fSubFlags = pBufInfo->fFlags;402 pSubmInfo->Info.bDoNotSignalCompletion = 0; 408 403 if (pBufInfo->fFlags.bEntireBuffer) 409 404 { … … 421 416 if (NT_SUCCESS(Status)) 422 417 { 423 return VINF_SUCCESS; 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; 424 423 } 425 424 else … … 570 569 { 571 570 pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiKmtBufferCreate; 572 pHgsmi->BasePrivate.Base.pfnBufferSubmit Asynch = vboxUhgsmiKmtBufferSubmitAsynch;571 pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiKmtBufferSubmit; 573 572 pHgsmi->BasePrivate.pfnCtlConCall = vboxCrHhgsmiKmtEscCtlConCall; 574 573 pHgsmi->BasePrivate.pfnCtlConGetClientID = vboxCrHhgsmiKmtEscCtlConGetClientID; … … 582 581 { 583 582 pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiKmtEscBufferCreate; 584 pHgsmi->BasePrivate.Base.pfnBufferSubmit Asynch = vboxUhgsmiKmtEscBufferSubmitAsynch;583 pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiKmtEscBufferSubmit; 585 584 pHgsmi->BasePrivate.pfnCtlConCall = vboxCrHhgsmiKmtEscCtlConCall; 586 585 pHgsmi->BasePrivate.pfnCtlConGetClientID = vboxCrHhgsmiKmtEscCtlConGetClientID; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.cpp
r40566 r41058 949 949 VBOXWDDM_HANDLE hSessionHandle; 950 950 PVBOXVIDEOCM_ALLOC pAlloc; 951 union 952 { 953 PKEVENT pSynchEvent; 954 PRKSEMAPHORE pSynchSemaphore; 955 }; 956 VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType; 951 PKEVENT pSynchEvent; 952 VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType; 957 953 volatile uint32_t cRefs; 958 954 MDL Mdl; … … 1038 1034 PVBOXVIDEOCM_ALLOC_MGR pMgr = pContext->pMgr; 1039 1035 NTSTATUS Status = STATUS_SUCCESS; 1040 1041 union 1042 { 1043 PKEVENT pSynchEvent; 1044 PRKSEMAPHORE pSynchSemaphore; 1045 }; 1046 1047 switch (pUmAlloc->enmSynchType) 1048 { 1049 case VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT: 1050 Status = ObReferenceObjectByHandle((HANDLE)pUmAlloc->hSynch, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode, 1051 (PVOID*)&pSynchEvent, 1052 NULL); 1053 Assert(Status == STATUS_SUCCESS); 1054 Assert(pSynchEvent); 1055 break; 1056 case VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE: 1057 Status = ObReferenceObjectByHandle((HANDLE)pUmAlloc->hSynch, EVENT_MODIFY_STATE, *ExSemaphoreObjectType, UserMode, 1058 (PVOID*)&pSynchSemaphore, 1059 NULL); 1060 Assert(Status == STATUS_SUCCESS); 1061 Assert(pSynchSemaphore); 1062 break; 1063 case VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE: 1064 pSynchEvent = NULL; 1065 Status = STATUS_SUCCESS; 1066 break; 1067 default: 1068 LOGREL(("ERROR: invalid synch info type(%d)", pUmAlloc->enmSynchType)); 1069 AssertBreakpoint(); 1070 Status = STATUS_INVALID_PARAMETER; 1071 break; 1036 PKEVENT pSynchEvent = NULL; 1037 1038 if (pUmAlloc->hSynch) 1039 { 1040 Status = ObReferenceObjectByHandle((HANDLE)pUmAlloc->hSynch, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode, 1041 (PVOID*)&pSynchEvent, 1042 NULL); 1043 Assert(Status == STATUS_SUCCESS); 1044 Assert(pSynchEvent); 1072 1045 } 1073 1046 … … 1102 1075 pAllocRef->pContext = pContext; 1103 1076 pAllocRef->pAlloc = pAlloc; 1104 pAllocRef-> enmSynchType = pUmAlloc->enmSynchType;1077 pAllocRef->fUhgsmiType = pUmAlloc->fUhgsmiType; 1105 1078 pAllocRef->pSynchEvent = pSynchEvent; 1106 1079 ExAcquireFastMutex(&pContext->Mutex); … … 1133 1106 1134 1107 if (pSynchEvent) 1135 {1136 1108 ObDereferenceObject(pSynchEvent); 1137 }1138 1109 } 1139 1110 else … … 1160 1131 *ppAlloc = pAllocRef->pAlloc; 1161 1132 if (pAllocRef->pSynchEvent) 1162 {1163 1133 ObDereferenceObject(pAllocRef->pSynchEvent); 1164 }1165 1134 vboxWddmMemFree(pAllocRef); 1166 1135 } … … 1244 1213 { 1245 1214 VBOXVDMACMD_CHROMIUM_BUFFER *pBufCmd = &pBody->aBuffers[i]; 1246 PVBOXVIDEOCM_ALLOC_REF pRef = (PVBOXVIDEOCM_ALLOC_REF)pBufCmd->u64Gues Data;1247 if (!pBufCmd->u32Gues Data)1215 PVBOXVIDEOCM_ALLOC_REF pRef = (PVBOXVIDEOCM_ALLOC_REF)pBufCmd->u64GuestData; 1216 if (!pBufCmd->u32GuestData) 1248 1217 { 1249 1218 /* signal completion */ 1250 switch (pRef->enmSynchType) 1251 { 1252 case VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT: 1253 KeSetEvent(pRef->pSynchEvent, 3, FALSE); 1254 break; 1255 case VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE: 1256 KeReleaseSemaphore(pRef->pSynchSemaphore, 1257 3, 1258 1, 1259 FALSE); 1260 break; 1261 case VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE: 1262 break; 1263 default: 1264 Assert(0); 1265 } 1219 if (pRef->pSynchEvent) 1220 KeSetEvent(pRef->pSynchEvent, 3, FALSE); 1266 1221 } 1267 1222 … … 1310 1265 pBufCmd->offBuffer = pRef->pAlloc->offData + pBufInfo->Info.offData; 1311 1266 pBufCmd->cbBuffer = pBufInfo->Info.cbData; 1312 pBufCmd->u32Gues Data = pBufInfo->Info.fSubFlags.bDoNotSignalCompletion;1313 pBufCmd->u64Gues Data = (uint64_t)pRef;1267 pBufCmd->u32GuestData = pBufInfo->Info.bDoNotSignalCompletion; 1268 pBufCmd->u64GuestData = (uint64_t)pRef; 1314 1269 } 1315 1270 else -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h
r40842 r41058 150 150 AVLPVNODECORE ShRcTreeEntry; 151 151 #endif 152 VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType; 153 union 154 { 155 PKEVENT pSynchEvent; 156 PRKSEMAPHORE pSynchSemaphore; 157 }; 152 VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType; 153 PKEVENT pSynchEvent; 158 154 } VBOXWDDM_ALLOCATION, *PVBOXWDDM_ALLOCATION; 159 155 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
r40897 r41058 1962 1962 { 1963 1963 if (pAllocation->pSynchEvent) 1964 {1965 1964 ObDereferenceObject(pAllocation->pSynchEvent); 1966 }1967 1965 break; 1968 1966 } … … 2151 2149 { 2152 2150 pAllocationInfo->Size = pAllocInfo->cbBuffer; 2153 pAllocation-> enmSynchType = pAllocInfo->enmSynchType;2151 pAllocation->fUhgsmiType = pAllocInfo->fUhgsmiType; 2154 2152 pAllocation->SurfDesc.cbSize = pAllocInfo->cbBuffer; 2155 2153 pAllocationInfo->Flags.CpuVisible = 1; 2156 2154 // pAllocationInfo->Flags.SynchronousPaging = 1; 2157 2155 pAllocationInfo->AllocationPriority = D3DDDI_ALLOCATIONPRIORITY_MAXIMUM; 2158 switch (pAllocInfo->enmSynchType)2156 if (pAllocInfo->hSynch) 2159 2157 { 2160 case VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT: 2161 Status = ObReferenceObjectByHandle((HANDLE)pAllocInfo->hSynch, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode, 2162 (PVOID*)&pAllocation->pSynchEvent, 2163 NULL); 2164 Assert(Status == STATUS_SUCCESS); 2165 break; 2166 case VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE: 2167 Status = ObReferenceObjectByHandle((HANDLE)pAllocInfo->hSynch, EVENT_MODIFY_STATE, *ExSemaphoreObjectType, UserMode, 2168 (PVOID*)&pAllocation->pSynchSemaphore, 2169 NULL); 2170 Assert(Status == STATUS_SUCCESS); 2171 break; 2172 case VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE: 2173 pAllocation->pSynchEvent = NULL; 2174 Status = STATUS_SUCCESS; 2175 break; 2176 default: 2177 LOGREL(("ERROR: invalid synch info type(%d)", pAllocInfo->enmSynchType)); 2178 AssertBreakpoint(); 2179 Status = STATUS_INVALID_PARAMETER; 2180 break; 2158 Status = ObReferenceObjectByHandle((HANDLE)pAllocInfo->hSynch, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode, 2159 (PVOID*)&pAllocation->pSynchEvent, 2160 NULL); 2161 Assert(Status == STATUS_SUCCESS); 2181 2162 } 2182 2163 break; … … 2763 2744 { 2764 2745 VBOXVDMACMD_CHROMIUM_BUFFER *pBufCmd = &pBody->aBuffers[i]; 2765 if (!pBufCmd->u32Gues Data)2746 if (!pBufCmd->u32GuestData) 2766 2747 { 2767 2748 /* signal completion */ 2768 PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pBufCmd->u64GuesData; 2769 switch (pAlloc->enmSynchType) 2770 { 2771 case VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT: 2772 KeSetEvent(pAlloc->pSynchEvent, 3, FALSE); 2773 break; 2774 case VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE: 2775 KeReleaseSemaphore(pAlloc->pSynchSemaphore, 2776 3, 2777 1, 2778 FALSE); 2779 break; 2780 case VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE: 2781 break; 2782 default: 2783 Assert(0); 2784 } 2749 PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pBufCmd->u64GuestData; 2750 if (pAlloc->pSynchEvent) 2751 KeSetEvent(pAlloc->pSynchEvent, 3, FALSE); 2785 2752 } 2786 2753 } … … 3035 3002 pBufCmd->offBuffer = pBufInfo->Alloc.offAlloc; 3036 3003 pBufCmd->cbBuffer = pBufInfo->cbData; 3037 pBufCmd->u32Gues Data = pBufInfo->bDoNotSignalCompletion;3038 pBufCmd->u64Gues Data = (uint64_t)pBufInfo->Alloc.pAlloc;3004 pBufCmd->u32GuestData = pBufInfo->bDoNotSignalCompletion; 3005 pBufCmd->u64GuestData = (uint64_t)pBufInfo->Alloc.pAlloc; 3039 3006 } 3040 3007 … … 5136 5103 5137 5104 pSubmInfo->cbData = pSubmUmInfo->cbData; 5138 pSubmInfo->bDoNotSignalCompletion = pSubmUmInfo-> fSubFlags.bDoNotSignalCompletion;5105 pSubmInfo->bDoNotSignalCompletion = pSubmUmInfo->bDoNotSignalCompletion; 5139 5106 5140 5107 pPLL->AllocationIndex = i; -
trunk/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c
r40961 r41058 247 247 { 248 248 int rc; 249 VBOXUHGSMI_BUFFER_TYPE_FLAGS Flags = {0}; 249 250 pClient->pHgsmi = pHgsmi; 250 rc = pHgsmi->pfnBufferCreate(pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(1), 251 VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT, 252 NULL, 253 &pClient->pCmdBuffer); 251 Flags.fCommand = 1; 252 rc = pHgsmi->pfnBufferCreate(pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(1), Flags, &pClient->pCmdBuffer); 254 253 AssertRC(rc); 255 254 if (RT_SUCCESS(rc)) 256 255 { 257 rc = pHgsmi->pfnBufferCreate(pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(1), 258 VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT, 259 NULL, 260 &pClient->pHGBuffer); 256 Flags.Value = 0; 257 rc = pHgsmi->pfnBufferCreate(pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(1), Flags, &pClient->pHGBuffer); 261 258 AssertRC(rc); 262 259 if (RT_SUCCESS(rc)) … … 373 370 if (!buf) 374 371 { 372 VBOXUHGSMI_BUFFER_TYPE_FLAGS Flags = {0}; 375 373 crDebug("Buffer pool %p was empty; allocating new %d byte buffer.", 376 374 (void *) pClient->bufpool, 377 375 cbSize); 378 rc = pClient->pHgsmi->pfnBufferCreate(pClient->pHgsmi, cbSize, 379 VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE, NULL, 380 &buf); 376 rc = pClient->pHgsmi->pfnBufferCreate(pClient->pHgsmi, cbSize, Flags, &buf); 381 377 AssertRC(rc); 382 378 if (RT_FAILURE(rc)) … … 529 525 // * which is needed for getting the result */ 530 526 } 531 532 #ifdef RT_OS_WINDOWS533 #define CRVBOXHGSMI_BUF_WAIT(_pBub) WaitForSingleObject((_pBub)->hSynch, INFINITE);534 #else535 # error "Port Me!!"536 #endif537 538 DECLINLINE(void) _crVBoxHGSMIWaitCmd(PCRVBOXHGSMI_CLIENT pClient)539 {540 int rc = CRVBOXHGSMI_BUF_WAIT(pClient->pCmdBuffer);541 CRASSERT(rc == 0);542 }543 527 #endif 544 528 … … 1845 1829 aSubmit[1].fFlags.bHostWriteOnly = 1; 1846 1830 1847 rc = pClient->pHgsmi->pfnBufferSubmit Asynch(pClient->pHgsmi, aSubmit, 2);1831 rc = pClient->pHgsmi->pfnBufferSubmit(pClient->pHgsmi, aSubmit, 2); 1848 1832 AssertRC(rc); 1849 1833 if (RT_FAILURE(rc)) 1850 1834 { 1851 crError("pfnBufferSubmit Asynchfailed with %d \n", rc);1835 crError("pfnBufferSubmit failed with %d \n", rc); 1852 1836 return; 1853 1837 } 1854 1855 _crVBoxHGSMIWaitCmd(pClient);1856 1838 1857 1839 parms = (CRVBOXHGSMIREAD *)_crVBoxHGSMICmdBufferLockRo(pClient, sizeof (*parms)); … … 1979 1961 aSubmit[2].fFlags.Value = 0; 1980 1962 1981 rc = pClient->pHgsmi->pfnBufferSubmit Asynch(pClient->pHgsmi, aSubmit, 3);1963 rc = pClient->pHgsmi->pfnBufferSubmit(pClient->pHgsmi, aSubmit, 3); 1982 1964 AssertRC(rc); 1983 1965 if (RT_FAILURE(rc)) 1984 1966 { 1985 crError("pfnBufferSubmit Asynchfailed with %d \n", rc);1967 crError("pfnBufferSubmit failed with %d \n", rc); 1986 1968 break; 1987 1969 } 1988 1989 _crVBoxHGSMIWaitCmd(pClient);1990 1970 1991 1971 parms = (CRVBOXHGSMIWRITEREAD *)_crVBoxHGSMICmdBufferLockRo(pClient, sizeof (*parms)); … … 2015 1995 else if (VERR_BUFFER_OVERFLOW == rc) 2016 1996 { 1997 VBOXUHGSMI_BUFFER_TYPE_FLAGS Flags = {0}; 2017 1998 PVBOXUHGSMI_BUFFER pOldBuf = pClient->pHGBuffer; 2018 1999 CRASSERT(!pClient->pvHGBuffer); … … 2020 2001 crDebug("Reallocating host buffer from %d to %d bytes", conn->cbHostBufferAllocated, cbWriteback); 2021 2002 2022 rc = pClient->pHgsmi->pfnBufferCreate(pClient->pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(cbWriteback), 2023 VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE, NULL, &pClient->pHGBuffer); 2003 rc = pClient->pHgsmi->pfnBufferCreate(pClient->pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(cbWriteback), Flags, &pClient->pHGBuffer); 2024 2004 AssertRC(rc); 2025 2005 if (RT_SUCCESS(rc)) … … 2090 2070 aSubmit[1].fFlags.bHostReadOnly = 1; 2091 2071 2092 rc = pClient->pHgsmi->pfnBufferSubmit Asynch(pClient->pHgsmi, aSubmit, 2);2072 rc = pClient->pHgsmi->pfnBufferSubmit(pClient->pHgsmi, aSubmit, 2); 2093 2073 AssertRC(rc); 2094 2074 if (RT_SUCCESS(rc)) 2095 2075 { 2096 _crVBoxHGSMIWaitCmd(pClient);2097 /* @todo: do we need to wait for completion actually?2098 * NOTE: in case we do not need completion,2099 * we MUST specify bDoNotSignalCompletion flag for the command buffer */2100 // CRVBOXHGSMI_BUF_WAIT(pClient->pCmdBuffer);2101 2102 2076 callRes = _crVBoxHGSMICmdBufferGetRc(pClient); 2103 2077 } … … 2105 2079 { 2106 2080 /* we can not recover at this point, report error & exit */ 2107 crError("pfnBufferSubmit Asynchfailed with %d \n", rc);2081 crError("pfnBufferSubmit failed with %d \n", rc); 2108 2082 } 2109 2083 } … … 2129 2103 aSubmit[1].fFlags.bHostReadOnly = 1; 2130 2104 2131 rc = pClient->pHgsmi->pfnBufferSubmit Asynch(pClient->pHgsmi, aSubmit, 2);2105 rc = pClient->pHgsmi->pfnBufferSubmit(pClient->pHgsmi, aSubmit, 2); 2132 2106 AssertRC(rc); 2133 2107 if (RT_SUCCESS(rc)) 2134 2108 { 2135 _crVBoxHGSMIWaitCmd(pClient);2136 /* @todo: do we need to wait for completion actually?2137 * NOTE: in case we do not need completion,2138 * we MUST specify bDoNotSignalCompletion flag for the command buffer */2139 // CRVBOXHGSMI_BUF_WAIT(pClient->pCmdBuffer);2140 2141 2109 callRes = _crVBoxHGSMICmdBufferGetRc(pClient); 2142 2110 }
Note:
See TracChangeset
for help on using the changeset viewer.