Changeset 49591 in vbox for trunk/src/VBox/Additions/WINNT/Graphics/Video
- Timestamp:
- Nov 20, 2013 5:53:55 PM (11 years ago)
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics/Video
- Files:
-
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Video/common/wddm/VBoxMPIf.h
r49244 r49591 35 35 36 36 /* One would increase this whenever definitions in this file are changed */ 37 #define VBOXVIDEOIF_VERSION 1937 #define VBOXVIDEOIF_VERSION 20 38 38 39 39 #define VBOXWDDM_NODE_ID_SYSTEM 0 … … 115 115 { 116 116 uint32_t cbBuffer; 117 uint64_t hSynch;118 117 VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType; 119 118 }; … … 183 182 typedef struct VBOXWDDM_UHGSMI_BUFFER_UI_SUBMIT_INFO 184 183 { 185 uint32_t bDoNotSignalCompletion;186 184 uint32_t offData; 187 185 uint32_t cbData; … … 193 191 VBOXWDDM_UHGSMI_BUFFER_UI_SUBMIT_INFO aBufInfos[1]; 194 192 } VBOXWDDM_DMA_PRIVATEDATA_UM_CHROMIUM_CMD, *PVBOXWDDM_DMA_PRIVATEDATA_UM_CHROMIUM_CMD; 193 195 194 196 195 #define VBOXVHWA_F_ENABLED 0x00000001 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxCrHgsmi.cpp
r44529 r49591 62 62 if (pHgsmiGL) 63 63 { 64 #if 065 64 HRESULT hr = vboxUhgsmiKmtCreate(pHgsmiGL, TRUE /* bD3D tmp for injection thread*/); 66 #else67 HRESULT hr = vboxUhgsmiKmtEscCreate(pHgsmiGL, TRUE /* bD3D tmp for injection thread*/);68 #endif69 65 Log(("CrHgsmi: faled to create KmtEsc VBOXUHGSMI instance, hr (0x%x)\n", hr)); 70 66 if (hr == S_OK) -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispCm.cpp
r45403 r49591 165 165 pContext->pDevice = pDevice; 166 166 if (fIsCrContext) 167 vboxUhgsmiD3DEscInit(&pDevice->Uhgsmi, pDevice); 167 { 168 if (pDevice->pAdapter->u32VBox3DCaps & CR_VBOX_CAP_CMDVBVA) 169 vboxUhgsmiD3DInit(&pDevice->Uhgsmi, pDevice); 170 else 171 vboxUhgsmiD3DEscInit(&pDevice->Uhgsmi, pDevice); 172 } 168 173 } 169 174 else -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispKmt.cpp
r48070 r49591 72 72 bSupported &= !!(pCallbacks->pfnD3DKMTEscape); 73 73 74 pCallbacks->pfnD3DKMTCreateDevice = (PFND3DKMT_CREATEDEVICE)GetProcAddress(pCallbacks->hGdi32, "D3DKMTCreateDevice"); 74 pCallbacks->pfnD3DKMTQueryAdapterInfo = (PFND3DKMT_QUERYADAPTERINFO)GetProcAddress(pCallbacks->hGdi32, "D3DKMTQueryAdapterInfo"); 75 Log((__FUNCTION__": pfnD3DKMTQueryAdapterInfo = %p\n", pCallbacks->pfnD3DKMTQueryAdapterInfo)); 76 bSupported &= !!(pCallbacks->pfnD3DKMTQueryAdapterInfo); 77 78 pCallbacks->pfnD3DKMTCreateDevice = (PFND3DKMT_CREATEDEVICE)GetProcAddress(pCallbacks->hGdi32, "D3DKMTCreateDevice"); 75 79 Log((__FUNCTION__": pfnD3DKMTCreateDevice = %p\n", pCallbacks->pfnD3DKMTCreateDevice)); 76 80 bSupported &= !!(pCallbacks->pfnD3DKMTCreateDevice); -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispKmt.h
r48070 r49591 71 71 PFND3DKMT_ESCAPE pfnD3DKMTEscape; 72 72 73 PFND3DKMT_QUERYADAPTERINFO pfnD3DKMTQueryAdapterInfo; 74 73 75 PFND3DKMT_CREATEDEVICE pfnD3DKMTCreateDevice; 74 76 PFND3DKMT_DESTROYDEVICE pfnD3DKMTDestroyDevice; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiBase.cpp
r49332 r49591 178 178 PVBOXUHGSMI_BUFFER_PRIVATE_ESC_BASE pBuf = VBOXUHGSMIESCBASE_GET_BUFFER(pBufInfo->pBuf); 179 179 pSubmInfo->hAlloc = pBuf->Alloc.hAlloc; 180 pSubmInfo->Info.bDoNotSignalCompletion = 0;181 180 if (pBufInfo->fFlags.bEntireBuffer) 182 181 { -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiBase.h
r49332 r49591 142 142 } 143 143 144 DECLINLINE(void) vboxUhgsmiBaseDxAllocInfoFill(D3DDDI_ALLOCATIONINFO *pDdiAllocInfo, VBOXWDDM_ALLOCINFO *pAllocInfo, uint32_t cbBuffer, VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType) 145 { 146 pDdiAllocInfo->pPrivateDriverData = pAllocInfo; 147 pDdiAllocInfo->PrivateDriverDataSize = sizeof (*pAllocInfo); 148 pAllocInfo->enmType = VBOXWDDM_ALLOC_TYPE_UMD_HGSMI_BUFFER; 149 pAllocInfo->cbBuffer = cbBuffer; 150 pAllocInfo->fUhgsmiType = fUhgsmiType; 151 152 } 153 144 154 DECLINLINE(int) vboxUhgsmiBaseDxDmaFill(PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers, 145 155 VOID* pCommandBuffer, UINT *pCommandBufferSize, … … 163 173 PVBOXWDDM_DMA_PRIVATEDATA_UM_CHROMIUM_CMD pHdr = (PVBOXWDDM_DMA_PRIVATEDATA_UM_CHROMIUM_CMD)pCommandBuffer; 164 174 pHdr->Base.enmCmd = VBOXVDMACMD_TYPE_CHROMIUM_CMD; 165 pHdr->Base.u32CmdReserved = cBuffers;175 pHdr->Base.u32CmdReserved = 0; 166 176 167 177 PVBOXWDDM_UHGSMI_BUFFER_UI_SUBMIT_INFO pBufSubmInfo = pHdr->aBufInfos; … … 177 187 pAllocationList->WriteOperation = !pBufInfo->fFlags.bHostReadOnly; 178 188 pAllocationList->DoNotRetireInstance = pBufInfo->fFlags.bDoNotRetire; 179 pBufSubmInfo->bDoNotSignalCompletion = 0;180 189 if (pBufInfo->fFlags.bEntireBuffer) 181 190 { -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiDisp.cpp
r49332 r49591 118 118 DdiAlloc.NumAllocations = 1; 119 119 DdiAlloc.pAllocationInfo = &DdiAllocInfo; 120 DdiAllocInfo.pPrivateDriverData = &AllocInfo; 121 DdiAllocInfo.PrivateDriverDataSize = sizeof (AllocInfo); 122 AllocInfo.enmType = VBOXWDDM_ALLOC_TYPE_UMD_HGSMI_BUFFER; 123 AllocInfo.cbBuffer = cbBuf; 124 AllocInfo.hSynch = 0; 125 AllocInfo.fUhgsmiType = fType; 120 vboxUhgsmiBaseDxAllocInfoFill(&DdiAllocInfo, &AllocInfo, cbBuf, fType); 126 121 127 122 HRESULT hr = pPrivate->pDevice->RtCallbacks.pfnAllocateCb(pPrivate->pDevice->hDevice, &DdiAlloc); -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.cpp
r49332 r49591 28 28 #endif 29 29 30 #if 031 typedef struct VBOXUHGSMI_BUFFER_PRIVATE_KMT32 {33 VBOXUHGSMI_BUFFER_PRIVATE_BASE BasePrivate;34 CRITICAL_SECTION CritSect;35 } VBOXUHGSMI_BUFFER_PRIVATE_KMT, *PVBOXUHGSMI_BUFFER_PRIVATE_KMT;36 37 38 #define VBOXUHGSMIKMT_GET_BUFFER(_p) VBOXUHGSMIKMT_GET_PRIVATE(_p, VBOXUHGSMI_BUFFER_PRIVATE_KMT)39 30 40 31 DECLCALLBACK(int) vboxUhgsmiKmtBufferDestroy(PVBOXUHGSMI_BUFFER pBuf) 41 32 { 42 PVBOXUHGSMI_BUFFER_PRIVATE_KMT pBuffer = VBOXUHGSMIKMT_GET_BUFFER(pBuf); 33 PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE pBuffer = VBOXUHGSMDXALLOCBASE_GET_BUFFER(pBuf); 34 PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pBuffer->BasePrivate.pHgsmi); 35 43 36 D3DKMT_DESTROYALLOCATION DdiDealloc; 44 DdiDealloc.hDevice = p Buffer->pHgsmi->Device.hDevice;37 DdiDealloc.hDevice = pPrivate->Device.hDevice; 45 38 DdiDealloc.hResource = NULL; 46 DdiDealloc.phAllocationList = &pBuffer-> BasePrivate.hAllocation;39 DdiDealloc.phAllocationList = &pBuffer->hAllocation; 47 40 DdiDealloc.AllocationCount = 1; 48 NTSTATUS Status = pBuffer->pHgsmi->Callbacks.pfnD3DKMTDestroyAllocation(&DdiDealloc); 49 if (NT_SUCCESS(Status)) 50 { 51 if (pBuffer->BasePrivate.hSynch) 52 CloseHandle(pBuffer->BasePrivate.hSynch); 41 NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTDestroyAllocation(&DdiDealloc); 42 if (NT_SUCCESS(Status)) 43 { 53 44 RTMemFree(pBuffer); 54 45 return VINF_SUCCESS; … … 63 54 DECLCALLBACK(int) vboxUhgsmiKmtBufferLock(PVBOXUHGSMI_BUFFER pBuf, uint32_t offLock, uint32_t cbLock, VBOXUHGSMI_BUFFER_LOCK_FLAGS fFlags, void**pvLock) 64 55 { 65 PVBOXUHGSMI_BUFFER_PRIVATE_KMT pBuffer = VBOXUHGSMIKMT_GET_BUFFER(pBuf); 56 PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE pBuffer = VBOXUHGSMDXALLOCBASE_GET_BUFFER(pBuf); 57 PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pBuffer->BasePrivate.pHgsmi); 66 58 D3DKMT_LOCK DdiLock = {0}; 67 DdiLock.hDevice = p Buffer->pHgsmi->Device.hDevice;68 DdiLock.hAllocation = pBuffer-> BasePrivate.hAllocation;59 DdiLock.hDevice = pPrivate->Device.hDevice; 60 DdiLock.hAllocation = pBuffer->hAllocation; 69 61 DdiLock.PrivateDriverData = NULL; 70 62 71 EnterCriticalSection(&pBuffer->CritSect); 72 73 int rc = vboxUhgsmiBaseDxLockData(&pBuffer->BasePrivate, offLock, cbLock, fFlags, 63 int rc = vboxUhgsmiBaseDxLockData(pBuffer, offLock, cbLock, fFlags, 74 64 &DdiLock.Flags, &DdiLock.NumPages); 75 AssertRC(rc); 76 if (RT_FAILURE(rc)) 65 if (!RT_SUCCESS(rc)) 66 { 67 WARN(("vboxUhgsmiBaseDxLockData failed rc %d", rc)); 77 68 return rc; 69 } 70 78 71 79 72 if (DdiLock.NumPages) … … 82 75 DdiLock.pPages = NULL; 83 76 84 NTSTATUS Status = pBuffer->pHgsmi->Callbacks.pfnD3DKMTLock(&DdiLock); 85 LeaveCriticalSection(&pBuffer->CritSect); 77 NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTLock(&DdiLock); 86 78 if (NT_SUCCESS(Status)) 87 79 { … … 99 91 DECLCALLBACK(int) vboxUhgsmiKmtBufferUnlock(PVBOXUHGSMI_BUFFER pBuf) 100 92 { 101 PVBOXUHGSMI_BUFFER_PRIVATE_ KMT pBuffer = VBOXUHGSMIKMT_GET_BUFFER(pBuf);93 PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE pBuffer = VBOXUHGSMDXALLOCBASE_GET_BUFFER(pBuf); 102 94 D3DKMT_UNLOCK DdiUnlock; 103 95 104 DdiUnlock.hDevice = pBuffer->pHgsmi->Device.hDevice; 96 PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pBuffer->BasePrivate.pHgsmi); 97 DdiUnlock.hDevice = pPrivate->Device.hDevice; 105 98 DdiUnlock.NumAllocations = 1; 106 DdiUnlock.phAllocations = &pBuffer-> BasePrivate.hAllocation;107 NTSTATUS Status = p Buffer->pHgsmi->Callbacks.pfnD3DKMTUnlock(&DdiUnlock);99 DdiUnlock.phAllocations = &pBuffer->hAllocation; 100 NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTUnlock(&DdiUnlock); 108 101 if (NT_SUCCESS(Status)) 109 102 return VINF_SUCCESS; … … 114 107 } 115 108 116 DECLCALLBACK(int) vboxUhgsmiKmtBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType, PVBOXUHGSMI_BUFFER* ppBuf) 117 { 118 HANDLE hSynch = NULL; 109 DECLCALLBACK(int) vboxUhgsmiKmtBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fType, PVBOXUHGSMI_BUFFER* ppBuf) 110 { 119 111 if (!cbBuf) 120 112 return VERR_INVALID_PARAMETER; 121 113 122 int rc = vboxUhgsmiBaseEventChkCreate(fUhgsmiType, &hSynch); 123 AssertRC(rc); 124 if (RT_FAILURE(rc)) 125 return rc; 114 int rc = VINF_SUCCESS; 126 115 127 116 cbBuf = VBOXWDDM_ROUNDBOUND(cbBuf, 0x1000); … … 131 120 132 121 PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pHgsmi); 133 PVBOXUHGSMI_BUFFER_PRIVATE_KMT pBuf = (PVBOXUHGSMI_BUFFER_PRIVATE_KMT)RTMemAllocZ(RT_OFFSETOF(VBOXUHGSMI_BUFFER_PRIVATE_KMT, aLockPageIndices[cPages])); 134 Assert(pBuf); 135 if (pBuf) 136 { 137 struct 138 { 139 D3DKMT_CREATEALLOCATION DdiAlloc; 140 D3DDDI_ALLOCATIONINFO DdiAllocInfo; 141 VBOXWDDM_ALLOCINFO AllocInfo; 142 } Buf; 143 memset(&Buf, 0, sizeof (Buf)); 144 Buf.DdiAlloc.hDevice = pPrivate->Device.hDevice; 145 Buf.DdiAlloc.NumAllocations = 1; 146 Buf.DdiAlloc.pAllocationInfo = &Buf.DdiAllocInfo; 147 Buf.DdiAllocInfo.pPrivateDriverData = &Buf.AllocInfo; 148 Buf.DdiAllocInfo.PrivateDriverDataSize = sizeof (Buf.AllocInfo); 149 Buf.AllocInfo.enmType = VBOXWDDM_ALLOC_TYPE_UMD_HGSMI_BUFFER; 150 Buf.AllocInfo.cbBuffer = cbBuf; 151 Buf.AllocInfo.hSynch = (uint64_t)hSynch; 152 Buf.AllocInfo.fUhgsmiType = fUhgsmiType; 153 154 NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTCreateAllocation(&Buf.DdiAlloc); 155 if (NT_SUCCESS(Status)) 156 { 157 InitializeCriticalSection(&pBuf->CritSect); 158 159 Assert(Buf.DdiAllocInfo.hAllocation); 160 pBuf->BasePrivate.Base.pfnLock = vboxUhgsmiKmtBufferLock; 161 pBuf->BasePrivate.Base.pfnUnlock = vboxUhgsmiKmtBufferUnlock; 162 // pBuf->Base.pfnAdjustValidDataRange = vboxUhgsmiKmtBufferAdjustValidDataRange; 163 pBuf->BasePrivate.Base.pfnDestroy = vboxUhgsmiKmtBufferDestroy; 164 165 pBuf->BasePrivate.Base.fType = fUhgsmiType; 166 pBuf->BasePrivate.Base.cbBuffer = cbBuf; 167 168 pBuf->pHgsmi = pPrivate; 169 pBuf->BasePrivate.hAllocation = Buf.DdiAllocInfo.hAllocation; 170 171 *ppBuf = &pBuf->BasePrivate.Base; 172 173 return VINF_SUCCESS; 174 } 175 else 176 { 177 WARN(("pfnD3DKMTCreateAllocation failes, Status(0x%x)", Status)); 178 rc = VERR_OUT_OF_RESOURCES; 179 } 180 181 RTMemFree(pBuf); 182 } 183 else 184 rc = VERR_NO_MEMORY; 185 186 if (hSynch) 187 CloseHandle(hSynch); 122 PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE pBuf = (PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE)RTMemAllocZ(RT_OFFSETOF(VBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE, aLockPageIndices[cPages])); 123 if (!pBuf) 124 { 125 WARN(("RTMemAllocZ failed")); 126 return VERR_NO_MEMORY; 127 } 128 129 D3DKMT_CREATEALLOCATION DdiAlloc; 130 D3DDDI_ALLOCATIONINFO DdiAllocInfo; 131 VBOXWDDM_ALLOCINFO AllocInfo; 132 133 memset(&DdiAlloc, 0, sizeof (DdiAlloc)); 134 DdiAlloc.hDevice = pPrivate->Device.hDevice; 135 DdiAlloc.NumAllocations = 1; 136 DdiAlloc.pAllocationInfo = &DdiAllocInfo; 137 138 vboxUhgsmiBaseDxAllocInfoFill(&DdiAllocInfo, &AllocInfo, cbBuf, fType); 139 140 NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTCreateAllocation(&DdiAlloc); 141 if (NT_SUCCESS(Status)) 142 { 143 Assert(DdiAllocInfo.hAllocation); 144 pBuf->BasePrivate.Base.pfnLock = vboxUhgsmiKmtBufferLock; 145 pBuf->BasePrivate.Base.pfnUnlock = vboxUhgsmiKmtBufferUnlock; 146 pBuf->BasePrivate.Base.pfnDestroy = vboxUhgsmiKmtBufferDestroy; 147 148 pBuf->BasePrivate.Base.fType = fType; 149 pBuf->BasePrivate.Base.cbBuffer = cbBuf; 150 151 pBuf->hAllocation = DdiAllocInfo.hAllocation; 152 153 *ppBuf = &pBuf->BasePrivate.Base; 154 155 return VINF_SUCCESS; 156 } 157 else 158 { 159 WARN(("pfnD3DKMTCreateAllocation failes, Status(0x%x)", Status)); 160 rc = VERR_OUT_OF_RESOURCES; 161 } 162 163 RTMemFree(pBuf); 188 164 189 165 return rc; … … 198 174 pHg->Context.pAllocationList, pHg->Context.AllocationListSize, 199 175 pHg->Context.pPatchLocationList, pHg->Context.PatchLocationListSize); 200 AssertRC(rc);201 176 if (RT_FAILURE(rc)) 177 { 178 WARN(("vboxUhgsmiBaseDxDmaFill failed, rc %d", rc)); 202 179 return rc; 180 } 203 181 204 182 D3DKMT_RENDER DdiRender = {0}; … … 228 206 return VERR_GENERAL_FAILURE; 229 207 } 230 #endif 208 231 209 232 210 static HRESULT vboxUhgsmiKmtEngineCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, BOOL bD3D) … … 297 275 } 298 276 277 static void vboxUhgsmiKmtSetupCallbacks(PVBOXUHGSMI_PRIVATE_KMT pHgsmi) 278 { 279 pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiKmtBufferCreate; 280 pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiKmtBufferSubmit; 281 /* no escapes (for now) */ 282 pHgsmi->BasePrivate.pfnEscape = NULL; 283 } 284 285 static void vboxUhgsmiKmtEscSetupCallbacks(PVBOXUHGSMI_PRIVATE_KMT pHgsmi) 286 { 287 vboxUhgsmiBaseInit(&pHgsmi->BasePrivate, vboxCrHhgsmiKmtEscape); 288 } 289 299 290 #if 0 300 291 HRESULT vboxUhgsmiKmtCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, BOOL bD3D) 301 292 { 302 vboxUhgsmiBaseInit(&pHgsmi->BasePrivate, vboxCrHhgsmiKmtEscape); 303 #error "port me!" 293 vboxUhgsmiKmtSetupCallbacks(pHgsmi); 304 294 return vboxUhgsmiKmtEngineCreate(pHgsmi, bD3D); 305 295 } 296 297 HRESULT vboxUhgsmiKmtEscCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, BOOL bD3D) 298 { 299 vboxUhgsmiKmtEscSetupCallbacks(pHgsmi); 300 return vboxUhgsmiKmtEngineCreate(pHgsmi, bD3D); 301 } 306 302 #endif 307 303 308 HRESULT vboxUhgsmiKmtEscCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, BOOL bD3D) 309 { 310 vboxUhgsmiBaseInit(&pHgsmi->BasePrivate, vboxCrHhgsmiKmtEscape); 311 return vboxUhgsmiKmtEngineCreate(pHgsmi, bD3D); 304 static HRESULT vboxUhgsmiKmtQueryCaps(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, uint32_t *pu32Caps) 305 { 306 VBOXWDDM_QI Query; 307 D3DKMT_QUERYADAPTERINFO Info; 308 Info.hAdapter = pHgsmi->Adapter.hAdapter; 309 Info.Type = KMTQAITYPE_UMDRIVERPRIVATE; 310 Info.pPrivateDriverData = &Query; 311 Info.PrivateDriverDataSize = sizeof (Query); 312 313 NTSTATUS Status = pHgsmi->Callbacks.pfnD3DKMTQueryAdapterInfo(&Info); 314 if (!NT_SUCCESS(Status)) 315 { 316 WARN(("pfnD3DKMTQueryAdapterInfo failed, Status %#x", Status)); 317 return Status; 318 } 319 320 if (Query.u32Version != VBOXVIDEOIF_VERSION) 321 { 322 WARN(("Version mismatch")); 323 return E_FAIL; 324 } 325 326 *pu32Caps = Query.u32VBox3DCaps; 327 328 return S_OK; 329 } 330 331 HRESULT vboxUhgsmiKmtCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, BOOL bD3D) 332 { 333 HRESULT hr = vboxUhgsmiKmtEngineCreate(pHgsmi, bD3D); 334 if (!SUCCEEDED(hr)) 335 return hr; 336 337 uint32_t u32Caps = 0; 338 hr = vboxUhgsmiKmtQueryCaps(pHgsmi, &u32Caps); 339 if (!SUCCEEDED(hr)) 340 { 341 WARN(("vboxUhgsmiKmtQueryCaps failed hr %#x", hr)); 342 return hr; 343 } 344 345 if (u32Caps & CR_VBOX_CAP_CMDVBVA) 346 vboxUhgsmiKmtSetupCallbacks(pHgsmi); 347 else 348 vboxUhgsmiKmtEscSetupCallbacks(pHgsmi); 349 350 return S_OK; 312 351 } 313 352 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.h
r44529 r49591 35 35 #define VBOXUHGSMIKMT_GET(_p) VBOXUHGSMIKMT_GET_PRIVATE(_p, VBOXUHGSMI_PRIVATE_KMT) 36 36 37 #if 038 HRESULT vboxUhgsmiKmtCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, BOOL bD3D);39 #endif40 37 HRESULT vboxUhgsmiKmtDestroy(PVBOXUHGSMI_PRIVATE_KMT pHgsmi); 41 38 42 HRESULT vboxUhgsmiKmtEscCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, BOOL bD3D); 43 39 HRESULT vboxUhgsmiKmtCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, BOOL bD3D); 44 40 45 41 #endif /* #ifndef ___VBoxUhgsmiKmt_h__ */ -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPDevExt.h
r49458 r49591 128 128 BOOLEAN f3DEnabled; 129 129 BOOLEAN fTexPresentEnabled; 130 BOOLEAN fCmdVbvaEnabled; 130 131 131 132 uint32_t u32CrConDefaultClientID; 133 134 VBOXCMDVBVA CmdVbva; 132 135 133 136 VBOXMP_CRCTLCON CrCtlCon; … … 213 216 DECLINLINE(ULONG) vboxWddmVramCpuVisibleSize(PVBOXMP_DEVEXT pDevExt) 214 217 { 215 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 218 if (pDevExt->fCmdVbvaEnabled) 219 { 220 /* all memory layout info should be initialized */ 221 Assert(pDevExt->CmdVbva.Vbva.offVRAMBuffer); 222 /* page aligned */ 223 Assert(!(pDevExt->CmdVbva.Vbva.offVRAMBuffer & 0xfff)); 224 225 return (ULONG)(pDevExt->CmdVbva.Vbva.offVRAMBuffer & ~0xfffULL); 226 } 216 227 /* all memory layout info should be initialized */ 217 228 Assert(pDevExt->aSources[0].Vbva.Vbva.offVRAMBuffer); … … 220 231 221 232 return (ULONG)(pDevExt->aSources[0].Vbva.Vbva.offVRAMBuffer & ~0xfffULL); 222 #else223 /* all memory layout info should be initialized */224 Assert(pDevExt->u.primary.Vdma.CmdHeap.Heap.area.offBase);225 /* page aligned */226 Assert(!(pDevExt->u.primary.Vdma.CmdHeap.Heap.area.offBase & 0xfff));227 228 return pDevExt->u.primary.Vdma.CmdHeap.Heap.area.offBase & ~0xfffUL;229 #endif230 233 } 231 234 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPCr.cpp
r47603 r49591 893 893 } 894 894 895 #if 1 /*def DEBUG_misha*/ 896 g_VBoxMpCrHostCaps &= ~CR_VBOX_CAP_CMDVBVA; 897 #endif 898 895 899 rc = VBoxMpCrCtlConDisconnect(&CrCtlCon, u32ClientID); 896 900 if (RT_FAILURE(rc)) -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.cpp
r48070 r49591 1375 1375 pBufCmd->offBuffer = pRef->pAlloc->offData + pBufInfo->Info.offData; 1376 1376 pBufCmd->cbBuffer = pBufInfo->Info.cbData; 1377 pBufCmd->u32GuestData = pBufInfo->Info.bDoNotSignalCompletion;1377 pBufCmd->u32GuestData = 0; 1378 1378 pBufCmd->u64GuestData = (uint64_t)pRef; 1379 1379 } -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h
r49244 r49591 183 183 #endif 184 184 VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType; 185 PKEVENT pSynchEvent;186 185 } VBOXWDDM_ALLOCATION, *PVBOXWDDM_ALLOCATION; 187 186 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.cpp
r49365 r49591 702 702 PVBOXMP_DEVEXT pDevExt; 703 703 VBOXCMDVBVA *pVbva; 704 UINTu32FenceId;704 volatile UINT *pu32FenceId; 705 705 DXGK_INTERRUPT_TYPE enmComplType; 706 706 } VBOXCMDVBVA_NOTIFYCOMPLETED_CB, *PVBOXCMDVBVA_NOTIFYCOMPLETED_CB; … … 709 709 { 710 710 PVBOXCMDVBVA_NOTIFYCOMPLETED_CB pData = (PVBOXCMDVBVA_NOTIFYCOMPLETED_CB)pvContext; 711 vboxCmdVbvaDdiNotifyCompleteIrq(pData->pDevExt, pData->pVbva, pData->u32FenceId, pData->enmComplType); 712 713 pData->pDevExt->u.primary.DxgkInterface.DxgkCbQueueDpc(pData->pDevExt->u.primary.DxgkInterface.DeviceHandle); 714 return TRUE; 715 } 716 717 static int vboxCmdVbvaDdiNotifyComplete(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, UINT u32FenceId, DXGK_INTERRUPT_TYPE enmComplType) 711 if (*pData->pu32FenceId) 712 { 713 UINT u32FenceId = *pData->pu32FenceId; 714 *pData->pu32FenceId = 0; 715 716 vboxCmdVbvaDdiNotifyCompleteIrq(pData->pDevExt, pData->pVbva, u32FenceId, pData->enmComplType); 717 718 pData->pDevExt->u.primary.DxgkInterface.DxgkCbQueueDpc(pData->pDevExt->u.primary.DxgkInterface.DeviceHandle); 719 720 return TRUE; 721 } 722 723 return FALSE; 724 } 725 726 static int vboxCmdVbvaDdiNotifyComplete(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, volatile UINT *pu32FenceId, DXGK_INTERRUPT_TYPE enmComplType) 718 727 { 719 728 VBOXCMDVBVA_NOTIFYCOMPLETED_CB Data; 720 729 Data.pDevExt = pDevExt; 721 730 Data.pVbva = pVbva; 722 Data. u32FenceId =u32FenceId;731 Data.pu32FenceId = pu32FenceId; 723 732 Data.enmComplType = enmComplType; 724 733 BOOLEAN bDummy; … … 759 768 } 760 769 761 static void vboxCmdVbvaCheckCompleted(PVBOXMP_DEVEXT pDevExt, bool fPingHost, HGSMIGUESTCOMMANDCONTEXT *pCtx, bool fBufferOverflow) 770 typedef struct VBOXCMDVBVA_CHECK_COMPLETED_CB 771 { 772 PVBOXMP_DEVEXT pDevExt; 773 VBOXCMDVBVA *pVbva; 774 uint32_t u32FenceID; 775 } VBOXCMDVBVA_CHECK_COMPLETED_CB; 776 777 static BOOLEAN vboxCmdVbvaCheckCompletedIrqCb(PVOID pContext) 778 { 779 VBOXCMDVBVA_CHECK_COMPLETED_CB *pCompleted = (VBOXCMDVBVA_CHECK_COMPLETED_CB*)pContext; 780 BOOLEAN bRc = DxgkDdiInterruptRoutineNew(pCompleted->pDevExt, 0); 781 if (pCompleted->pVbva) 782 pCompleted->u32FenceID = pCompleted->pVbva->u32FenceCompleted; 783 return bRc; 784 } 785 786 787 static uint32_t vboxCmdVbvaCheckCompleted(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, bool fPingHost, HGSMIGUESTCOMMANDCONTEXT *pCtx, bool fBufferOverflow) 762 788 { 763 789 if (fPingHost) 764 790 vboxCmdVbvaFlush(pDevExt, pCtx, fBufferOverflow); 765 791 766 vboxWddmCallIsr(pDevExt); 792 VBOXCMDVBVA_CHECK_COMPLETED_CB context; 793 context.pDevExt = pDevExt; 794 context.pVbva = pVbva; 795 context.u32FenceID = 0; 796 BOOLEAN bRet; 797 NTSTATUS Status = pDevExt->u.primary.DxgkInterface.DxgkCbSynchronizeExecution( 798 pDevExt->u.primary.DxgkInterface.DeviceHandle, 799 vboxCmdVbvaCheckCompletedIrqCb, 800 &context, 801 0, /* IN ULONG MessageNumber */ 802 &bRet); 803 Assert(Status == STATUS_SUCCESS); 804 805 return context.u32FenceID; 767 806 } 768 807 … … 771 810 PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)pvFlush; 772 811 773 vboxCmdVbvaCheckCompleted(pDevExt, true /*fPingHost*/, pHGSMICtx, true /*fBufferOverflow*/);812 vboxCmdVbvaCheckCompleted(pDevExt, NULL, true /*fPingHost*/, pHGSMICtx, true /*fBufferOverflow*/); 774 813 } 775 814 … … 899 938 900 939 if (!ASMAtomicCmpXchgU8(&pCmd->u8State, VBOXCMDVBVA_STATE_CANCELLED, VBOXCMDVBVA_STATE_SUBMITTED)) 940 { 901 941 Assert(pCmd->u8State == VBOXCMDVBVA_STATE_IN_PROGRESS); 902 903 /* we have cancelled the command successfully */ 904 vboxCmdVbvaDdiNotifyComplete(pDevExt, pVbva, u32FenceID, DXGK_INTERRUPT_DMA_PREEMPTED); 942 break; 943 } 944 945 /* we have canceled the command successfully */ 946 vboxCmdVbvaDdiNotifyComplete(pDevExt, pVbva, &pCmd->u32FenceID, DXGK_INTERRUPT_DMA_PREEMPTED); 905 947 return true; 906 948 } … … 939 981 if (u8State == VBOXCMDVBVA_STATE_IN_PROGRESS) 940 982 { 941 pVbva->u32FenceCompleted = u32FenceID; 983 if (u32FenceID) 984 pVbva->u32FenceCompleted = u32FenceID; 942 985 enmDdiNotify = DXGK_INTERRUPT_DMA_COMPLETED; 943 986 } 944 987 else 988 { 989 Assert(u8State == VBOXCMDVBVA_STATE_CANCELLED); 945 990 enmDdiNotify = DXGK_INTERRUPT_DMA_PREEMPTED; 946 947 vboxCmdVbvaDdiNotifyCompleteIrq(pDevExt, pVbva, pCmd->u32FenceID, enmDdiNotify); 991 /* to prevent concurrent notifications from DdiPreemptCommand */ 992 pCmd->u32FenceID = 0; 993 } 994 995 if (u32FenceID) 996 vboxCmdVbvaDdiNotifyCompleteIrq(pDevExt, pVbva, u32FenceID, enmDdiNotify); 948 997 949 998 fHasCommandsCompletedPreempted = true; … … 953 1002 } 954 1003 955 void VBoxCmdVbvaCheckCompleted(PVBOXMP_DEVEXT pDevExt, bool fPingHost) 956 { 957 vboxCmdVbvaCheckCompleted(pDevExt, fPingHost, &VBoxCommonFromDeviceExt(pDevExt)->guestCtx, false /* fBufferOverflow */); 958 } 1004 uint32_t VBoxCmdVbvaCheckCompleted(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, bool fPingHost) 1005 { 1006 return vboxCmdVbvaCheckCompleted(pDevExt, pVbva, fPingHost, &VBoxCommonFromDeviceExt(pDevExt)->guestCtx, false /* fBufferOverflow */); 1007 } 1008 1009 1010 static uint32_t vboxCVDdiSysMemElBuild(VBOXCMDVBVA_SYSMEMEL *pEl, PMDL pMdl, uint32_t iPfn, uint32_t cPages) 1011 { 1012 PFN_NUMBER cur = MmGetMdlPfnArray(pMdl)[iPfn]; 1013 uint32_t cbEl = sizeof (*pEl); 1014 uint32_t cStoredPages = 1; 1015 pEl->iPage = cur; 1016 --cPages; 1017 for ( ; cPages && cStoredPages < VBOXCMDVBVA_SYSMEMEL_CPAGES_MAX; --cPages, ++cStoredPages) 1018 { 1019 PFN_NUMBER next = MmGetMdlPfnArray(pMdl)[iPfn+cStoredPages]; 1020 if (next != cur+1) 1021 break; 1022 1023 cur = next; 1024 ++cStoredPages; 1025 --cPages; 1026 } 1027 1028 Assert(cStoredPages); 1029 pEl->cPagesAfterFirst = cStoredPages - 1; 1030 1031 return cPages; 1032 } 1033 1034 uint32_t VBoxCVDdiPTransferVRamSysBuildEls(VBOXCMDVBVA_PAGING_TRANSFER *pCmd, PMDL pMdl, uint32_t iPfn, uint32_t cPages, uint32_t cbBuffer, uint32_t *pcPagesWritten) 1035 { 1036 uint32_t cInitPages = cPages; 1037 uint32_t cbInitBuffer = cbBuffer; 1038 uint32_t cEls = 0; 1039 VBOXCMDVBVA_SYSMEMEL *pEl = pCmd->aSysMem; 1040 1041 if (cbBuffer < sizeof (VBOXCMDVBVA_PAGING_TRANSFER)) 1042 { 1043 WARN(("cbBuffer < sizeof (VBOXCMDVBVA_PAGING_TRANSFER)")); 1044 goto done; 1045 } 1046 1047 cbBuffer -= RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aSysMem); 1048 uint32_t i = 0; 1049 1050 for (; cPages && cbBuffer >= sizeof (VBOXCMDVBVA_PAGING_TRANSFER); ++cEls, cbBuffer-=sizeof (VBOXCMDVBVA_SYSMEMEL), ++pEl, ++i) 1051 { 1052 cPages = vboxCVDdiSysMemElBuild(pEl, pMdl, iPfn + cInitPages - cPages, cPages); 1053 } 1054 1055 pCmd->cSysMem = i; 1056 1057 done: 1058 *pcPagesWritten = cInitPages - cPages; 1059 return cbInitBuffer - cbBuffer; 1060 } 1061 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.h
r49365 r49591 115 115 } VBVAEXBUFFERBACKWARDITER, *PVBVAEXBUFFERBACKWARDITER; 116 116 117 #define VBOXCMDVBVA_BUFFERSIZE(_cbCmdApprox) (RT_OFFSETOF(VBVABUFFER, au8Data) + ((RT_SIZEOFMEMB(VBVABUFFER, aRecords)/RT_SIZEOFMEMB(VBVABUFFER, aRecords[0])) * (_cbCmdApprox))) 117 118 118 119 typedef struct VBOXCMDVBVA … … 203 204 int VBoxCmdVbvaSubmit(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, struct VBOXCMDVBVA_HDR *pCmd, uint32_t cbCmd); 204 205 bool VBoxCmdVbvaPreempt(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, uint32_t u32FenceID); 205 void VBoxCmdVbvaCheckCompleted(PVBOXMP_DEVEXT pDevExt, bool fPingHost);206 uint32_t VBoxCmdVbvaCheckCompleted(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, bool fPingHost); 206 207 bool VBoxCmdVbvaCheckCompletedIrq(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva); 207 208 209 /*helper functions for filling vbva commands */ 210 DECLINLINE(void) VBoxCVDdiPackRect(VBOXCMDVBVA_RECT *pVbvaRect, const RECT *pRect) 211 { 212 pVbvaRect->xLeft = (int16_t)pRect->left; 213 pVbvaRect->yTop = (int16_t)pRect->top; 214 pVbvaRect->xRight = (int16_t)pRect->right; 215 pVbvaRect->yBottom = (int16_t)pRect->bottom; 216 } 217 218 DECLINLINE(void) VBoxCVDdiPackRects(VBOXCMDVBVA_RECT *paVbvaRects, const RECT *paRects, uint32_t cRects) 219 { 220 for (uint32_t i = 0; i < cRects; ++i) 221 { 222 VBoxCVDdiPackRect(&paVbvaRects[i], &paRects[i]); 223 } 224 225 } 226 227 uint32_t VBoxCVDdiPTransferVRamSysBuildEls(VBOXCMDVBVA_PAGING_TRANSFER *pCmd, PMDL pMdl, uint32_t iPfn, uint32_t cPages, uint32_t cbBuffer, uint32_t *pcPagesWritten); 228 208 229 #endif /* #ifndef ___VBoxMPVbva_h___ */ -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
r49259 r49591 32 32 33 33 #include <stdio.h> 34 35 #define VBOXWDDM_DUMMY_DMABUFFER_SIZE sizeof (RECT) 34 36 35 37 DWORD g_VBoxLogUm = 0; … … 660 662 } 661 663 662 static void vboxWddmSetupDisplays (PVBOXMP_DEVEXT pDevExt)664 static void vboxWddmSetupDisplaysLegacy(PVBOXMP_DEVEXT pDevExt) 663 665 { 664 666 /* For WDDM, we simply store the number of monitors as we will deal with … … 770 772 VBoxCommonFromDeviceExt(pDevExt)->bHGSMI = FALSE; 771 773 } 774 } 775 776 static NTSTATUS vboxWddmSetupDisplaysNew(PVBOXMP_DEVEXT pDevExt) 777 { 778 if (!VBoxCommonFromDeviceExt(pDevExt)->bHGSMI) 779 return STATUS_UNSUCCESSFUL; 780 781 ULONG cbAvailable = VBoxCommonFromDeviceExt(pDevExt)->cbVRAM 782 - VBoxCommonFromDeviceExt(pDevExt)->cbMiniportHeap 783 - VBVA_ADAPTER_INFORMATION_SIZE; 784 785 ULONG cbCmdVbva = cbAvailable / 2; 786 ULONG cbCmdVbvaApprox = VBOXCMDVBVA_BUFFERSIZE(4096); 787 if (cbCmdVbvaApprox > cbCmdVbva) 788 { 789 WARN(("too few VRAM memory %d, cmdVbva %d, while approximately needed %d, trying to adjust", cbAvailable, cbCmdVbva, cbCmdVbvaApprox)); 790 cbCmdVbva = cbCmdVbvaApprox; 791 } 792 793 cbCmdVbva = VBOXWDDM_ROUNDBOUND(cbCmdVbva, 0x1000); 794 if (cbCmdVbva > cbAvailable - 0x1000) 795 { 796 WARN(("too few VRAM memory fatal, %d, requested for CmdVbva %d", cbAvailable, cbCmdVbva)); 797 return STATUS_UNSUCCESSFUL; 798 } 799 800 801 ULONG offCmdVbva = cbAvailable - cbCmdVbva; 802 803 int rc = VBoxCmdVbvaCreate(pDevExt, &pDevExt->CmdVbva, offCmdVbva, cbCmdVbva); 804 if (RT_SUCCESS(rc)) 805 { 806 rc = VBoxCmdVbvaEnable(pDevExt, &pDevExt->CmdVbva); 807 if (RT_SUCCESS(rc)) 808 { 809 rc = VBoxMPCmnMapAdapterMemory(VBoxCommonFromDeviceExt(pDevExt), (void**)&pDevExt->pvVisibleVram, 810 0, vboxWddmVramCpuVisibleSize(pDevExt)); 811 if (RT_SUCCESS(rc)) 812 return STATUS_SUCCESS; 813 else 814 WARN(("VBoxMPCmnMapAdapterMemory failed, rc %d", rc)); 815 816 VBoxCmdVbvaDisable(pDevExt, &pDevExt->CmdVbva); 817 } 818 else 819 WARN(("VBoxCmdVbvaEnable failed, rc %d", rc)); 820 821 VBoxCmdVbvaDestroy(pDevExt, &pDevExt->CmdVbva); 822 } 823 else 824 WARN(("VBoxCmdVbvaCreate failed, rc %d", rc)); 825 826 return STATUS_UNSUCCESSFUL; 827 } 828 829 static NTSTATUS vboxWddmSetupDisplays(PVBOXMP_DEVEXT pDevExt) 830 { 831 if (pDevExt->fCmdVbvaEnabled) 832 { 833 NTSTATUS Status = vboxWddmSetupDisplaysNew(pDevExt); 834 if (!NT_SUCCESS(Status)) 835 VBoxCommonFromDeviceExt(pDevExt)->bHGSMI = FALSE; 836 return Status; 837 } 838 839 vboxWddmSetupDisplaysLegacy(pDevExt); 840 return VBoxCommonFromDeviceExt(pDevExt)->bHGSMI ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; 841 return STATUS_UNSUCCESSFUL; 772 842 } 773 843 … … 899 969 if (Status == STATUS_SUCCESS) 900 970 { 971 pDevExt->f3DEnabled = VBoxMpCrCtlConIs3DSupported(); 972 973 if (pDevExt->f3DEnabled) 974 { 975 pDevExt->fTexPresentEnabled = !!(VBoxMpCrGetHostCaps() & CR_VBOX_CAP_TEX_PRESENT); 976 pDevExt->fCmdVbvaEnabled = !!(VBoxMpCrGetHostCaps() & CR_VBOX_CAP_CMDVBVA); 977 } 978 else 979 { 980 pDevExt->fTexPresentEnabled = FALSE; 981 pDevExt->fCmdVbvaEnabled = FALSE; 982 } 983 901 984 /* Guest supports only HGSMI, the old VBVA via VMMDev is not supported. 902 985 * The host will however support both old and new interface to keep compatibility … … 944 1027 VBoxMpCrShgsmiTransportCreate(&pDevExt->CrHgsmiTransport, pDevExt); 945 1028 946 pDevExt->f3DEnabled = VBoxMpCrCtlConIs3DSupported();947 948 if (pDevExt->f3DEnabled)949 {950 pDevExt->fTexPresentEnabled = !!(VBoxMpCrGetHostCaps() & CR_VBOX_CAP_TEX_PRESENT);951 }952 else953 pDevExt->fTexPresentEnabled = FALSE;954 1029 955 1030 for (UINT i = 0; i < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) … … 1227 1302 } 1228 1303 1229 BOOLEAN DxgkDdiInterruptRoutine( 1304 1305 BOOLEAN DxgkDdiInterruptRoutineNew( 1306 IN CONST PVOID MiniportDeviceContext, 1307 IN ULONG MessageNumber 1308 ) 1309 { 1310 // LOGF(("ENTER, context(0x%p), msg(0x%x)", MiniportDeviceContext, MessageNumber)); 1311 1312 vboxVDbgBreakFv(); 1313 1314 PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)MiniportDeviceContext; 1315 BOOLEAN bOur = FALSE; 1316 bool bNeedDpc = FALSE; 1317 if (!VBoxCommonFromDeviceExt(pDevExt)->hostCtx.pfHostFlags) /* If HGSMI is enabled at all. */ 1318 { 1319 WARN(("ISR called with hgsmi disabled!")); 1320 return FALSE; 1321 } 1322 1323 uint32_t flags = VBoxCommonFromDeviceExt(pDevExt)->hostCtx.pfHostFlags->u32HostFlags; 1324 bOur = (flags & HGSMIHOSTFLAGS_IRQ); 1325 1326 if (bOur) 1327 VBoxHGSMIClearIrq(&VBoxCommonFromDeviceExt(pDevExt)->hostCtx); 1328 1329 bNeedDpc |= VBoxCmdVbvaCheckCompletedIrq(pDevExt, &pDevExt->CmdVbva); 1330 1331 if (bNeedDpc) 1332 pDevExt->u.primary.DxgkInterface.DxgkCbQueueDpc(pDevExt->u.primary.DxgkInterface.DeviceHandle); 1333 1334 // LOGF(("LEAVE, context(0x%p), bOur(0x%x)", MiniportDeviceContext, (ULONG)bOur)); 1335 1336 return bOur; 1337 } 1338 1339 1340 static BOOLEAN DxgkDdiInterruptRoutineLegacy( 1230 1341 IN CONST PVOID MiniportDeviceContext, 1231 1342 IN ULONG MessageNumber … … 1450 1561 } 1451 1562 1452 VOID DxgkDdiDpcRoutine( 1563 static VOID DxgkDdiDpcRoutineNew( 1564 IN CONST PVOID MiniportDeviceContext 1565 ) 1566 { 1567 // LOGF(("ENTER, context(0x%p)", MiniportDeviceContext)); 1568 1569 vboxVDbgBreakFv(); 1570 1571 PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)MiniportDeviceContext; 1572 1573 pDevExt->u.primary.DxgkInterface.DxgkCbNotifyDpc(pDevExt->u.primary.DxgkInterface.DeviceHandle); 1574 1575 // LOGF(("LEAVE, context(0x%p)", MiniportDeviceContext)); 1576 } 1577 1578 1579 static VOID DxgkDdiDpcRoutineLegacy( 1453 1580 IN CONST PVOID MiniportDeviceContext 1454 1581 ) … … 2020 2147 case VBOXWDDM_ALLOC_TYPE_UMD_HGSMI_BUFFER: 2021 2148 { 2022 if (pAllocation->pSynchEvent)2023 ObDereferenceObject(pAllocation->pSynchEvent);2024 2149 break; 2025 2150 } … … 2215 2340 // pAllocationInfo->Flags.SynchronousPaging = 1; 2216 2341 pAllocationInfo->AllocationPriority = D3DDDI_ALLOCATIONPRIORITY_MAXIMUM; 2217 if (pAllocInfo->hSynch)2218 {2219 Status = ObReferenceObjectByHandle((HANDLE)pAllocInfo->hSynch, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode,2220 (PVOID*)&pAllocation->pSynchEvent,2221 NULL);2222 Assert(Status == STATUS_SUCCESS);2223 }2224 2342 break; 2225 2343 } … … 2561 2679 } 2562 2680 2563 NTSTATUS2681 static NTSTATUS 2564 2682 APIENTRY 2565 DxgkDdiPatch( 2683 DxgkDdiPatchNew( 2684 CONST HANDLE hAdapter, 2685 CONST DXGKARG_PATCH* pPatch) 2686 { 2687 /* DxgkDdiPatch should be made pageable. */ 2688 PAGED_CODE(); 2689 2690 LOGF(("ENTER, context(0x%x)", hAdapter)); 2691 2692 vboxVDbgBreakFv(); 2693 2694 uint8_t * pPrivateBuf = (uint8_t*)((uint8_t*)pPatch->pDmaBufferPrivateData + pPatch->DmaBufferPrivateDataSubmissionStartOffset); 2695 UINT cbPatchBuff = pPatch->DmaBufferPrivateDataSubmissionEndOffset - pPatch->DmaBufferPrivateDataSubmissionStartOffset; 2696 2697 for (UINT i = pPatch->PatchLocationListSubmissionStart; i < pPatch->PatchLocationListSubmissionLength; ++i) 2698 { 2699 const D3DDDI_PATCHLOCATIONLIST* pPatchList = &pPatch->pPatchLocationList[i]; 2700 Assert(pPatchList->AllocationIndex < pPatch->AllocationListSize); 2701 const DXGK_ALLOCATIONLIST *pAllocationList = &pPatch->pAllocationList[pPatchList->AllocationIndex]; 2702 if (!pAllocationList->SegmentId) 2703 { 2704 WARN(("no segment id specified")); 2705 continue; 2706 } 2707 2708 if (pPatchList->PatchOffset == ~0UL) 2709 { 2710 /* this is a dummy patch request, ignore */ 2711 continue; 2712 } 2713 2714 if (pPatchList->PatchOffset >= cbPatchBuff) 2715 { 2716 WARN(("pPatchList->PatchOffset(%d) >= cbPatchBuff(%d)", pPatchList->PatchOffset, cbPatchBuff)); 2717 return STATUS_INVALID_PARAMETER; 2718 } 2719 2720 VBOXCMDVBVAOFFSET *poffVram = (VBOXCMDVBVAOFFSET*)(pPrivateBuf + pPatchList->PatchOffset); 2721 Assert(pAllocationList->SegmentId); 2722 Assert(!pAllocationList->PhysicalAddress.HighPart); 2723 Assert(!(pAllocationList->PhysicalAddress.QuadPart & 0xfffUL)); /* <- just a check to ensure allocation offset does not go here */ 2724 *poffVram = pAllocationList->PhysicalAddress.LowPart + pPatchList->AllocationOffset;; 2725 } 2726 2727 return STATUS_SUCCESS; 2728 } 2729 2730 2731 static NTSTATUS 2732 APIENTRY 2733 DxgkDdiPatchLegacy( 2566 2734 CONST HANDLE hAdapter, 2567 2735 CONST DXGKARG_PATCH* pPatch) … … 2729 2897 { 2730 2898 PVBOXWDDM_CALL_ISR pdc = (PVBOXWDDM_CALL_ISR)Context; 2731 return DxgkDdiInterruptRoutine(pdc->pDevExt, pdc->MessageNumber); 2899 if (pdc->pDevExt->fCmdVbvaEnabled) 2900 return DxgkDdiInterruptRoutineNew(pdc->pDevExt, pdc->MessageNumber); 2901 return DxgkDdiInterruptRoutineLegacy(pdc->pDevExt, pdc->MessageNumber); 2732 2902 } 2733 2903 … … 2755 2925 VBOXVDMACMD_CHROMIUM_CMD *pBody = VBOXVDMACMD_BODY(pHdr, VBOXVDMACMD_CHROMIUM_CMD); 2756 2926 UINT cBufs = pBody->cBuffers; 2757 for (UINT i = 0; i < cBufs; ++i)2758 {2759 VBOXVDMACMD_CHROMIUM_BUFFER *pBufCmd = &pBody->aBuffers[i];2760 if (!pBufCmd->u32GuestData)2761 {2762 /* signal completion */2763 PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pBufCmd->u64GuestData;2764 if (pAlloc->pSynchEvent)2765 KeSetEvent(pAlloc->pSynchEvent, 3, FALSE);2766 }2767 }2768 2769 2927 vboxVdmaCBufDrFree(&pDevExt->u.primary.Vdma, pDr); 2770 2928 } 2771 2929 #endif 2772 2930 2773 NTSTATUS2931 static NTSTATUS 2774 2932 APIENTRY 2775 DxgkDdiSubmitCommand( 2933 DxgkDdiSubmitCommandNew( 2934 CONST HANDLE hAdapter, 2935 CONST DXGKARG_SUBMITCOMMAND* pSubmitCommand) 2936 { 2937 /* DxgkDdiSubmitCommand runs at dispatch, should not be pageable. */ 2938 2939 // LOGF(("ENTER, context(0x%x)", hAdapter)); 2940 2941 vboxVDbgBreakFv(); 2942 2943 PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)hAdapter; 2944 #ifdef DEBUG 2945 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pSubmitCommand->hContext; 2946 Assert(pContext); 2947 Assert(pContext->pDevice); 2948 Assert(pContext->pDevice->pAdapter == pDevExt); 2949 Assert(!pSubmitCommand->DmaBufferSegmentId); 2950 #endif 2951 2952 /* the DMA command buffer is located in system RAM, the host will need to pick it from there */ 2953 //BufInfo.fFlags = 0; /* see VBOXVDMACBUF_FLAG_xx */ 2954 uint32_t cbCmd = pSubmitCommand->DmaBufferPrivateDataSubmissionEndOffset - pSubmitCommand->DmaBufferPrivateDataSubmissionStartOffset; 2955 if (cbCmd < sizeof (VBOXCMDVBVA_HDR)) 2956 { 2957 WARN(("DmaBufferPrivateDataSubmissionEndOffset (%d) - DmaBufferPrivateDataSubmissionStartOffset (%d) < sizeof (VBOXCMDVBVA_HDR) (%d)", 2958 pSubmitCommand->DmaBufferPrivateDataSubmissionEndOffset, 2959 pSubmitCommand->DmaBufferPrivateDataSubmissionStartOffset, 2960 sizeof (VBOXWDDM_DMA_PRIVATEDATA_BASEHDR))); 2961 return STATUS_INVALID_PARAMETER; 2962 } 2963 2964 VBOXCMDVBVA_HDR *pHdr = (VBOXCMDVBVA_HDR*)((uint8_t*)pSubmitCommand->pDmaBufferPrivateData + pSubmitCommand->DmaBufferPrivateDataSubmissionStartOffset); 2965 pHdr->u32FenceID = pSubmitCommand->SubmissionFenceId; 2966 int rc = VBoxCmdVbvaSubmit(pDevExt, &pDevExt->CmdVbva, pHdr, cbCmd); 2967 if (RT_SUCCESS(rc)) 2968 return STATUS_SUCCESS; 2969 2970 WARN(("VBoxCmdVbvaSubmit failed rc %d", rc)); 2971 return STATUS_UNSUCCESSFUL; 2972 } 2973 2974 static NTSTATUS 2975 APIENTRY 2976 DxgkDdiSubmitCommandLegacy( 2776 2977 CONST HANDLE hAdapter, 2777 2978 CONST DXGKARG_SUBMITCOMMAND* pSubmitCommand) … … 2887 3088 break; 2888 3089 } 2889 case VBOXVDMACMD_TYPE_CHROMIUM_CMD:2890 {2891 #ifdef VBOX_WITH_CRHGSMI2892 VBOXWDDM_DMA_PRIVATEDATA_CHROMIUM_CMD *pChromiumCmd = (VBOXWDDM_DMA_PRIVATEDATA_CHROMIUM_CMD*)pPrivateDataBase;2893 UINT cbCmd = VBOXVDMACMD_SIZE_FROMBODYSIZE(RT_OFFSETOF(VBOXVDMACMD_CHROMIUM_CMD, aBuffers[pChromiumCmd->Base.u32CmdReserved]));2894 2895 PVBOXVDMACBUF_DR pDr = vboxVdmaCBufDrCreate (&pDevExt->u.primary.Vdma, cbCmd);2896 if (!pDr)2897 {2898 /* @todo: try flushing.. */2899 LOGREL(("vboxVdmaCBufDrCreate returned NULL"));2900 return STATUS_INSUFFICIENT_RESOURCES;2901 }2902 // vboxVdmaCBufDrCreate zero initializes the pDr2903 pDr->fFlags = VBOXVDMACBUF_FLAG_BUF_FOLLOWS_DR;2904 pDr->cbBuf = cbCmd;2905 pDr->rc = VERR_NOT_IMPLEMENTED;2906 2907 PVBOXVDMACMD pHdr = VBOXVDMACBUF_DR_TAIL(pDr, VBOXVDMACMD);2908 pHdr->enmType = VBOXVDMACMD_TYPE_CHROMIUM_CMD;2909 pHdr->u32CmdSpecific = 0;2910 VBOXVDMACMD_CHROMIUM_CMD *pBody = VBOXVDMACMD_BODY(pHdr, VBOXVDMACMD_CHROMIUM_CMD);2911 pBody->cBuffers = pChromiumCmd->Base.u32CmdReserved;2912 for (UINT i = 0; i < pChromiumCmd->Base.u32CmdReserved; ++i)2913 {2914 VBOXVDMACMD_CHROMIUM_BUFFER *pBufCmd = &pBody->aBuffers[i];2915 VBOXWDDM_UHGSMI_BUFFER_SUBMIT_INFO *pBufInfo = &pChromiumCmd->aBufInfos[i];2916 2917 pBufCmd->offBuffer = pBufInfo->Alloc.offAlloc;2918 pBufCmd->cbBuffer = pBufInfo->cbData;2919 pBufCmd->u32GuestData = pBufInfo->bDoNotSignalCompletion;2920 pBufCmd->u64GuestData = (uint64_t)pBufInfo->Alloc.pAlloc;2921 }2922 2923 PVBOXVDMADDI_CMD pDdiCmd = VBOXVDMADDI_CMD_FROM_BUF_DR(pDr);2924 vboxVdmaDdiCmdInit(pDdiCmd, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, vboxWddmDmaCompleteChromiumCmd, pDr);2925 NTSTATUS Status = vboxVdmaDdiCmdSubmitted(pDevExt, pDdiCmd);2926 Assert(Status == STATUS_SUCCESS);2927 if (Status == STATUS_SUCCESS)2928 {2929 int rc = vboxVdmaCBufDrSubmit(pDevExt, &pDevExt->u.primary.Vdma, pDr);2930 Assert(rc == VINF_SUCCESS);2931 }2932 else2933 {2934 vboxVdmaCBufDrFree(&pDevExt->u.primary.Vdma, pDr);2935 }2936 #else2937 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, DXGK_INTERRUPT_DMA_COMPLETED);2938 Assert(Status == STATUS_SUCCESS);2939 #endif2940 break;2941 }2942 3090 case VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP: 2943 3091 { … … 3005 3153 } 3006 3154 3007 NTSTATUS3155 static NTSTATUS 3008 3156 APIENTRY 3009 DxgkDdiPreemptCommand (3157 DxgkDdiPreemptCommandNew( 3010 3158 CONST HANDLE hAdapter, 3011 3159 CONST DXGKARG_PREEMPTCOMMAND* pPreemptCommand) … … 3013 3161 LOGF(("ENTER, hAdapter(0x%x)", hAdapter)); 3014 3162 3163 PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)hAdapter; 3164 3165 VBoxCmdVbvaPreempt(pDevExt, &pDevExt->CmdVbva, pPreemptCommand->PreemptionFenceId); 3166 3167 LOGF(("LEAVE, hAdapter(0x%x)", hAdapter)); 3168 3169 return STATUS_SUCCESS; 3170 } 3171 3172 3173 static NTSTATUS 3174 APIENTRY 3175 DxgkDdiPreemptCommandLegacy( 3176 CONST HANDLE hAdapter, 3177 CONST DXGKARG_PREEMPTCOMMAND* pPreemptCommand) 3178 { 3179 LOGF(("ENTER, hAdapter(0x%x)", hAdapter)); 3180 3015 3181 AssertFailed(); 3016 3182 /* @todo: fixme: implement */ … … 3021 3187 } 3022 3188 3023 #if 03024 static uint32_t vboxWddmSysMemElBuild(PVBOXVDMACMD_SYSMEMEL pEl, PMDL pMdl, uint32_t iPfn, uint32_t cPages, uint32_t cbBuffer, uint32_t *pcPagesRemaining)3025 {3026 uint32_t cbInitialBuffer = cbBuffer;3027 if (cbBuf >= sizeof (*pEl))3028 {3029 PFN_NUMBER cur = MmGetMdlPfnArray(pMdl)[iPfn];3030 uint32_t cbEl = sizeof (*pEl);3031 uint32_t cBufs = 1;3032 pEl->phBuf[0] = (cur << 12);3033 --cPages;3034 cbBuffer -= sizeof (*pEl);3035 bool bArrayMode = false;3036 while (cPages)3037 {3038 PFN_NUMBER next = MmGetMdlPfnArray(pMdl)[iPfn+cBufs];3039 if (!bArrayMode)3040 {3041 if (next == cur+1)3042 {3043 cur = next;3044 ++cBufs;3045 --cPages;3046 }3047 else if (cBufs > 1)3048 {3049 break;3050 }3051 else3052 {3053 bArrayMode = true;3054 }3055 }3056 3057 /* array mode */3058 if (cbBuffer < sizeof (pEl->phBuf[0]))3059 {3060 break;3061 }3062 3063 pEl->phBuf[cBufs] = (next << 12);3064 cbBuffer -= sizeof (pEl->phBuf[0]);3065 ++cBufs;3066 --cPages;3067 }3068 3069 pEl->cPages = cPages;3070 if (bArrayMode)3071 pEl->fFlags = VBOXVDMACMD_SYSMEMEL_F_PAGELIST;3072 else3073 pEl->fFlags = 0;3074 }3075 else3076 {3077 Assert(0);3078 }3079 3080 *pcPagesRemaining = cPages;3081 return cbInitialBuffer - cbBuffer;3082 }3083 3084 static uint32_t vboxWddmBpbTransferVRamSysBuildEls(PVBOXVDMACMD_DMA_BPB_TRANSFER_VRAMSYS pCmd, PMDL pMdl, uint32_t iPfn, uint32_t cPages, uint32_t cbBuffer, uint32_t *pcPagesRemaining)3085 {3086 uint32_t cInitPages = cPages;3087 uint32_t cbBufferUsed = vboxWddmSysMemElBuild(&pCmd->FirstEl, pMdl, iPfn, cPages, cbBuffer, &cPages);3088 if (cbBufferUsed)3089 {3090 uint32_t cEls = 1;3091 PVBOXVDMACMD_SYSMEMEL pEl = &pCmd->FirstEl;3092 while (cPages)3093 {3094 PVBOXVDMACMD_SYSMEMEL pEl = VBOXVDMACMD_SYSMEMEL_NEXT(pEl);3095 cbBufferUsed = vboxWddmSysMemElBuild(pEl, pMdl, iPfn + cInitPages - cPages, cPages, cbBuffer - cbBufferUsed, &cPages);3096 if (cbBufferUsed)3097 {3098 ++cEls;3099 }3100 else3101 break;3102 }3103 }3104 else3105 {3106 Assert(0);3107 }3108 3109 pCmd->cTransferPages = (cInitPages - cPages);3110 *pcPagesRemaining = cPages;3111 return cbBufferUsed;3112 }3113 #endif3114 3189 /* 3115 3190 * DxgkDdiBuildPagingBuffer 3116 3191 */ 3117 NTSTATUS3192 static NTSTATUS 3118 3193 APIENTRY 3119 DxgkDdiBuildPagingBuffer( 3194 DxgkDdiBuildPagingBufferNew( 3195 CONST HANDLE hAdapter, 3196 DXGKARG_BUILDPAGINGBUFFER* pBuildPagingBuffer) 3197 { 3198 /* DxgkDdiBuildPagingBuffer should be made pageable. */ 3199 PAGED_CODE(); 3200 3201 vboxVDbgBreakFv(); 3202 3203 PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)hAdapter; 3204 uint32_t cbBuffer = 0, cbPrivateData = 0; 3205 3206 LOGF(("ENTER, context(0x%x)", hAdapter)); 3207 3208 /* paging buffer transfer is nop for hostID allocations */ 3209 if (pBuildPagingBuffer->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_HDR)) 3210 { 3211 WARN(("pBuildPagingBuffer->DmaBufferPrivateDataSize(%d) < sizeof VBOXCMDVBVA_HDR (%d)", pBuildPagingBuffer->DmaBufferPrivateDataSize , sizeof (VBOXCMDVBVA_HDR))); 3212 /* @todo: can this actually happen? what status to return? */ 3213 return STATUS_INVALID_PARAMETER; 3214 } 3215 3216 switch (pBuildPagingBuffer->Operation) 3217 { 3218 case DXGK_OPERATION_TRANSFER: 3219 { 3220 VBOXCMDVBVA_HDR *pHdr = (VBOXCMDVBVA_HDR*)pBuildPagingBuffer->pDmaBuffer; 3221 pHdr->u8Flags = 0; 3222 pHdr->u8State = VBOXCMDVBVA_STATE_SUBMITTED; 3223 /* sanity */ 3224 pHdr->u32FenceID = 0; 3225 3226 if ((!pBuildPagingBuffer->Transfer.Source.SegmentId) == (!pBuildPagingBuffer->Transfer.Destination.SegmentId)) 3227 { 3228 WARN(("we only support RAM <-> VRAM moves, Src Seg(%d), Dst Seg(%d)", pBuildPagingBuffer->Transfer.Source.SegmentId, pBuildPagingBuffer->Transfer.Destination.SegmentId)); 3229 return STATUS_INVALID_PARAMETER; 3230 } 3231 3232 PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pBuildPagingBuffer->Transfer.hAllocation; 3233 if (!pAlloc) 3234 { 3235 WARN(("allocation is null")); 3236 return STATUS_INVALID_PARAMETER; 3237 } 3238 3239 if (pAlloc->AllocData.hostID) 3240 { 3241 pHdr->u8OpCode = VBOXCMDVBVA_OPTYPE_NOPCMD; 3242 cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE; 3243 cbPrivateData = sizeof (*pHdr); 3244 break; 3245 } 3246 3247 if (pBuildPagingBuffer->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_PAGING_TRANSFER)) 3248 { 3249 WARN(("pBuildPagingBuffer->DmaBufferPrivateDataSize(%d) < sizeof VBOXCMDVBVA_PAGING_TRANSFER (%d)", pBuildPagingBuffer->DmaBufferPrivateDataSize , sizeof (VBOXCMDVBVA_PAGING_TRANSFER))); 3250 /* @todo: can this actually happen? what status to return? */ 3251 return STATUS_INVALID_PARAMETER; 3252 } 3253 3254 VBOXCMDVBVA_PAGING_TRANSFER *pPaging = (VBOXCMDVBVA_PAGING_TRANSFER*)pBuildPagingBuffer->pDmaBuffer; 3255 pPaging->Hdr.u8OpCode = VBOXCMDVBVA_OPTYPE_PAGING_TRANSFER; 3256 3257 PMDL pMdl; 3258 uint32_t offVRAM; 3259 BOOLEAN fIn; 3260 3261 if (pBuildPagingBuffer->Transfer.Source.SegmentId) 3262 { 3263 Assert(!pBuildPagingBuffer->Transfer.Destination.SegmentId); 3264 Assert(!pBuildPagingBuffer->Transfer.Source.SegmentAddress.HighPart); 3265 offVRAM = pBuildPagingBuffer->Transfer.Source.SegmentAddress.LowPart; 3266 pMdl = pBuildPagingBuffer->Transfer.Destination.pMdl; 3267 fIn = FALSE; 3268 } 3269 else 3270 { 3271 Assert(pBuildPagingBuffer->Transfer.Destination.SegmentId); 3272 Assert(!pBuildPagingBuffer->Transfer.Source.SegmentId); 3273 Assert(!pBuildPagingBuffer->Transfer.Destination.SegmentAddress.HighPart); 3274 offVRAM = pBuildPagingBuffer->Transfer.Destination.SegmentAddress.LowPart; 3275 pMdl = pBuildPagingBuffer->Transfer.Source.pMdl; 3276 fIn = TRUE; 3277 } 3278 3279 uint32_t cPages = (uint32_t)((pBuildPagingBuffer->Transfer.TransferSize + 0xfff) >> PAGE_SHIFT); 3280 uint32_t cTotalPages = cPages; 3281 cPages -= pBuildPagingBuffer->MultipassOffset; 3282 uint32_t iFirstPage = pBuildPagingBuffer->Transfer.MdlOffset + pBuildPagingBuffer->MultipassOffset; 3283 uint32_t cPagesWritten; 3284 offVRAM += pBuildPagingBuffer->Transfer.TransferOffset + pBuildPagingBuffer->MultipassOffset; 3285 3286 pPaging->Alloc.offVRAM = offVRAM; 3287 if (fIn) 3288 pPaging->Hdr.u8Flags |= VBOXCMDVBVA_OPF_PAGING_TRANSFER_IN; 3289 cbPrivateData = VBoxCVDdiPTransferVRamSysBuildEls(pPaging, pMdl, iFirstPage, cPages, pBuildPagingBuffer->DmaBufferPrivateDataSize, &cPagesWritten); 3290 if (cPagesWritten != cPages) 3291 pBuildPagingBuffer->MultipassOffset += cPagesWritten; 3292 else 3293 pBuildPagingBuffer->MultipassOffset = 0; 3294 3295 cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE; 3296 break; 3297 } 3298 case DXGK_OPERATION_FILL: 3299 { 3300 Assert(pBuildPagingBuffer->Fill.FillPattern == 0); 3301 PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pBuildPagingBuffer->Fill.hAllocation; 3302 if (!pAlloc) 3303 { 3304 WARN(("allocation is null")); 3305 return STATUS_INVALID_PARAMETER; 3306 } 3307 /** @todo: add necessary bits */ 3308 break; 3309 } 3310 case DXGK_OPERATION_DISCARD_CONTENT: 3311 { 3312 PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pBuildPagingBuffer->DiscardContent.hAllocation; 3313 if (!pAlloc) 3314 { 3315 WARN(("allocation is null")); 3316 return STATUS_INVALID_PARAMETER; 3317 } 3318 break; 3319 } 3320 default: 3321 { 3322 WARN(("unsupported op (%d)", pBuildPagingBuffer->Operation)); 3323 break; 3324 } 3325 } 3326 3327 pBuildPagingBuffer->pDmaBuffer = ((uint8_t*)pBuildPagingBuffer->pDmaBuffer) + cbBuffer; 3328 pBuildPagingBuffer->pDmaBufferPrivateData = ((uint8_t*)pBuildPagingBuffer->pDmaBufferPrivateData) + cbPrivateData; 3329 3330 LOGF(("LEAVE, context(0x%x)", hAdapter)); 3331 3332 if (pBuildPagingBuffer->MultipassOffset) 3333 return STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER; 3334 return STATUS_SUCCESS; 3335 } 3336 3337 3338 static NTSTATUS 3339 APIENTRY 3340 DxgkDdiBuildPagingBufferLegacy( 3120 3341 CONST HANDLE hAdapter, 3121 3342 DXGKARG_BUILDPAGINGBUFFER* pBuildPagingBuffer) … … 3632 3853 case VBOXESC_UHGSMI_SUBMIT: 3633 3854 { 3855 if (pDevExt->fCmdVbvaEnabled) 3856 { 3857 WARN(("VBOXESC_UHGSMI_SUBMIT not supported for CmdVbva mode")); 3858 Status = STATUS_INVALID_PARAMETER; 3859 break; 3860 } 3634 3861 /* submit VBOXUHGSMI command */ 3635 3862 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext; … … 3652 3879 { 3653 3880 /* allocate VBOXUHGSMI buffer */ 3881 if (pDevExt->fCmdVbvaEnabled) 3882 { 3883 WARN(("VBOXESC_UHGSMI_ALLOCATE not supported for CmdVbva mode")); 3884 Status = STATUS_INVALID_PARAMETER; 3885 break; 3886 } 3887 3654 3888 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext; 3655 3889 PVBOXDISPIFESCAPE_UHGSMI_ALLOCATE pAlocate = (PVBOXDISPIFESCAPE_UHGSMI_ALLOCATE)pEscapeHdr; … … 3668 3902 case VBOXESC_UHGSMI_DEALLOCATE: 3669 3903 { 3904 if (pDevExt->fCmdVbvaEnabled) 3905 { 3906 WARN(("VBOXESC_UHGSMI_DEALLOCATE not supported for CmdVbva mode")); 3907 Status = STATUS_INVALID_PARAMETER; 3908 break; 3909 } 3670 3910 /* deallocate VBOXUHGSMI buffer */ 3671 3911 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext; … … 3685 3925 case VBOXESC_GETVBOXVIDEOCMCMD: 3686 3926 { 3927 if (pDevExt->fCmdVbvaEnabled || pDevExt->fTexPresentEnabled) 3928 { 3929 WARN(("VBOXESC_GETVBOXVIDEOCMCMD not supported for CmdVbva or TexPresent mode")); 3930 Status = STATUS_INVALID_PARAMETER; 3931 break; 3932 } 3933 3687 3934 /* get the list of r0->r3 commands (d3d window visible regions reporting )*/ 3688 3935 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext; … … 3710 3957 case VBOXESC_CRHGSMICTLCON_CALL: 3711 3958 { 3959 if (pDevExt->fCmdVbvaEnabled) 3960 { 3961 WARN(("VBOXESC_CRHGSMICTLCON_CALL not supported for CmdVbva mode")); 3962 Status = STATUS_INVALID_PARAMETER; 3963 break; 3964 } 3965 3712 3966 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext; 3713 3967 PVBOXDISPIFESCAPE_CRHGSMICTLCON_CALL pCall = (PVBOXDISPIFESCAPE_CRHGSMICTLCON_CALL)pEscapeHdr; … … 4288 4542 { 4289 4543 PVBOXWDDM_QUERYCURFENCE_CB pdc = (PVBOXWDDM_QUERYCURFENCE_CB)Context; 4290 BOOL bRc = DxgkDdiInterruptRoutine (pdc->pDevExt, pdc->MessageNumber);4544 BOOL bRc = DxgkDdiInterruptRoutineLegacy(pdc->pDevExt, pdc->MessageNumber); 4291 4545 pdc->uLastCompletedCmdFenceId = pdc->pDevExt->u.primary.Vdma.uLastCompletedPagingBufferCmdFenceId; 4292 4546 return bRc; 4293 4547 } 4294 4548 4295 NTSTATUS4549 static NTSTATUS 4296 4550 APIENTRY 4297 DxgkDdiQueryCurrentFence( 4551 DxgkDdiQueryCurrentFenceNew( 4552 CONST HANDLE hAdapter, 4553 DXGKARG_QUERYCURRENTFENCE* pCurrentFence) 4554 { 4555 LOGF(("ENTER, hAdapter(0x%x)", hAdapter)); 4556 4557 vboxVDbgBreakF(); 4558 4559 PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)hAdapter; 4560 pCurrentFence->CurrentFence = VBoxCmdVbvaCheckCompleted(pDevExt, &pDevExt->CmdVbva, false); 4561 4562 LOGF(("LEAVE, hAdapter(0x%x)", hAdapter)); 4563 4564 return STATUS_SUCCESS; 4565 } 4566 4567 4568 static NTSTATUS 4569 APIENTRY 4570 DxgkDdiQueryCurrentFenceLegacy( 4298 4571 CONST HANDLE hAdapter, 4299 4572 DXGKARG_QUERYCURRENTFENCE* pCurrentFence) … … 5254 5527 } 5255 5528 5256 NTSTATUS5529 static NTSTATUS 5257 5530 APIENTRY 5258 DxgkDdiRender( 5531 DxgkDdiRenderNew( 5532 CONST HANDLE hContext, 5533 DXGKARG_RENDER *pRender) 5534 { 5535 // LOGF(("ENTER, hContext(0x%x)", hContext)); 5536 5537 if (pRender->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_HDR)) 5538 { 5539 WARN(("pRender->DmaBufferPrivateDataSize(%d) < sizeof VBOXCMDVBVA_HDR (%d)", 5540 pRender->DmaBufferPrivateDataSize , sizeof (VBOXCMDVBVA_HDR))); 5541 /* @todo: can this actually happen? what status to return? */ 5542 return STATUS_INVALID_PARAMETER; 5543 } 5544 if (pRender->CommandLength < sizeof (VBOXWDDM_DMA_PRIVATEDATA_BASEHDR)) 5545 { 5546 WARN(("Present->DmaBufferPrivateDataSize(%d) < sizeof VBOXWDDM_DMA_PRIVATEDATA_BASEHDR (%d)", 5547 pRender->DmaBufferPrivateDataSize , sizeof (VBOXWDDM_DMA_PRIVATEDATA_BASEHDR))); 5548 /* @todo: can this actually happen? what status to return? */ 5549 return STATUS_INVALID_PARAMETER; 5550 } 5551 5552 PVBOXWDDM_DMA_PRIVATEDATA_BASEHDR pInputHdr = (PVBOXWDDM_DMA_PRIVATEDATA_BASEHDR)pRender->pCommand; 5553 NTSTATUS Status = STATUS_SUCCESS; 5554 5555 uint32_t cbBuffer = 0; 5556 uint32_t cbCmdDma = 0; 5557 VBOXCMDVBVA_HDR* pCmd = (VBOXCMDVBVA_HDR*)pRender->pDmaBufferPrivateData; 5558 5559 switch (pInputHdr->enmCmd) 5560 { 5561 case VBOXVDMACMD_TYPE_CHROMIUM_CMD: 5562 { 5563 if (pRender->AllocationListSize >= (UINT32_MAX - RT_OFFSETOF(VBOXWDDM_DMA_PRIVATEDATA_UM_CHROMIUM_CMD, aBufInfos))/ RT_SIZEOFMEMB(VBOXWDDM_DMA_PRIVATEDATA_UM_CHROMIUM_CMD, aBufInfos[0])) 5564 { 5565 WARN(("Invalid AllocationListSize %d", pRender->AllocationListSize)); 5566 return STATUS_INVALID_PARAMETER; 5567 } 5568 5569 if (pRender->CommandLength != RT_OFFSETOF(VBOXWDDM_DMA_PRIVATEDATA_UM_CHROMIUM_CMD, aBufInfos[pRender->AllocationListSize])) 5570 { 5571 WARN(("pRender->CommandLength (%d) != RT_OFFSETOF(VBOXWDDM_DMA_PRIVATEDATA_UM_CHROMIUM_CMD, aBufInfos[pRender->AllocationListSize](%d)", 5572 pRender->CommandLength, RT_OFFSETOF(VBOXWDDM_DMA_PRIVATEDATA_UM_CHROMIUM_CMD, aBufInfos[pRender->AllocationListSize]))); 5573 return STATUS_INVALID_PARAMETER; 5574 } 5575 5576 if (pRender->AllocationListSize >= (UINT32_MAX - RT_OFFSETOF(VBOXCMDVBVA_CRCMD, Cmd.aBuffers))/ RT_SIZEOFMEMB(VBOXCMDVBVA_CRCMD, Cmd.aBuffers[0])) 5577 { 5578 WARN(("Invalid AllocationListSize %d", pRender->AllocationListSize)); 5579 return STATUS_INVALID_PARAMETER; 5580 } 5581 5582 cbBuffer = RT_OFFSETOF(VBOXCMDVBVA_CRCMD, Cmd.aBuffers[pRender->AllocationListSize]); 5583 if (cbBuffer > 4096) 5584 { 5585 /* this should not be bigger actually */ 5586 WARN(("too big command buffer %d", cbBuffer)); 5587 return STATUS_INVALID_PARAMETER; 5588 } 5589 5590 cbCmdDma = VBOXWDDM_DUMMY_DMABUFFER_SIZE; 5591 5592 if (pRender->DmaBufferPrivateDataSize < cbBuffer) 5593 { 5594 WARN(("pRender->DmaBufferPrivateDataSize too small %d, requested %d", pRender->DmaBufferPrivateDataSize, cbBuffer)); 5595 return STATUS_INVALID_PARAMETER; 5596 } 5597 5598 if (pRender->DmaSize < cbCmdDma) 5599 { 5600 WARN(("dma buffer %d too small", pRender->DmaSize)); 5601 return STATUS_INVALID_PARAMETER; 5602 } 5603 5604 Assert(pRender->PatchLocationListOutSize == pRender->AllocationListSize); 5605 5606 if (pRender->PatchLocationListOutSize < pRender->AllocationListSize) 5607 { 5608 WARN(("pRender->PatchLocationListOutSize too small %d, requested %d", pRender->PatchLocationListOutSize, pRender->AllocationListSize)); 5609 return STATUS_INVALID_PARAMETER; 5610 } 5611 5612 PVBOXWDDM_DMA_PRIVATEDATA_UM_CHROMIUM_CMD pUmCmd = (PVBOXWDDM_DMA_PRIVATEDATA_UM_CHROMIUM_CMD)pInputHdr; 5613 VBOXCMDVBVA_CRCMD* pChromiumCmd = (VBOXCMDVBVA_CRCMD*)pRender->pDmaBufferPrivateData; 5614 5615 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)hContext; 5616 PVBOXWDDM_DEVICE pDevice = pContext->pDevice; 5617 PVBOXMP_DEVEXT pDevExt = pDevice->pAdapter; 5618 5619 pChromiumCmd->Hdr.u8OpCode = VBOXCMDVBVA_OPTYPE_CRCMD; 5620 pChromiumCmd->Hdr.u8Flags = 0; 5621 pChromiumCmd->Cmd.cBuffers = pRender->AllocationListSize; 5622 5623 DXGK_ALLOCATIONLIST *pAllocationList = pRender->pAllocationList; 5624 VBOXCMDVBVA_CRCMD_BUFFER *pSubmInfo = pChromiumCmd->Cmd.aBuffers; 5625 PVBOXWDDM_UHGSMI_BUFFER_UI_SUBMIT_INFO pSubmUmInfo = pUmCmd->aBufInfos; 5626 5627 for (UINT i = 0; i < pRender->AllocationListSize; ++i, ++pRender->pPatchLocationListOut, ++pAllocationList, ++pSubmInfo, ++pSubmUmInfo) 5628 { 5629 D3DDDI_PATCHLOCATIONLIST* pPLL = pRender->pPatchLocationListOut; 5630 PVBOXWDDM_ALLOCATION pAlloc = vboxWddmGetAllocationFromAllocList(pDevExt, pAllocationList); 5631 if (pSubmUmInfo->offData >= pAlloc->AllocData.SurfDesc.cbSize 5632 || pSubmUmInfo->cbData > pAlloc->AllocData.SurfDesc.cbSize 5633 || pSubmUmInfo->offData + pSubmUmInfo->cbData > pAlloc->AllocData.SurfDesc.cbSize) 5634 { 5635 WARN(("invalid data")); 5636 return STATUS_INVALID_PARAMETER; 5637 } 5638 5639 memset(pPLL, 0, sizeof (*pPLL)); 5640 5641 if (pAllocationList->SegmentId) 5642 pSubmInfo->offBuffer = pAllocationList->PhysicalAddress.LowPart + pSubmUmInfo->offData; 5643 5644 pSubmInfo->cbBuffer = pSubmUmInfo->cbData; 5645 5646 pPLL->AllocationIndex = i; 5647 pPLL->PatchOffset = RT_OFFSETOF(VBOXCMDVBVA_CRCMD, Cmd.aBuffers[i].offBuffer); 5648 pPLL->AllocationOffset = pSubmUmInfo->offData; 5649 } 5650 5651 break; 5652 } 5653 case VBOXVDMACMD_TYPE_DMA_NOP: 5654 { 5655 cbBuffer = sizeof (VBOXCMDVBVA_HDR); 5656 cbCmdDma = VBOXWDDM_DUMMY_DMABUFFER_SIZE; 5657 5658 if (pRender->DmaBufferPrivateDataSize < cbBuffer) 5659 { 5660 WARN(("pRender->DmaBufferPrivateDataSize too small %d, requested %d", pRender->DmaBufferPrivateDataSize, cbBuffer)); 5661 return STATUS_INVALID_PARAMETER; 5662 } 5663 5664 if (pRender->DmaSize < cbCmdDma) 5665 { 5666 WARN(("dma buffer %d too small", pRender->DmaSize)); 5667 return STATUS_INVALID_PARAMETER; 5668 } 5669 5670 pCmd->u8OpCode = VBOXCMDVBVA_OPTYPE_NOPCMD; 5671 pCmd->u8Flags = 0; 5672 5673 for (UINT i = 0; i < pRender->AllocationListSize; ++i, ++pRender->pPatchLocationListOut) 5674 { 5675 D3DDDI_PATCHLOCATIONLIST* pPLL = pRender->pPatchLocationListOut; 5676 memset(pPLL, 0, sizeof (*pPLL)); 5677 pPLL->AllocationIndex = i; 5678 pPLL->PatchOffset = ~0UL; 5679 pPLL->AllocationOffset = 0; 5680 } 5681 5682 break; 5683 } 5684 default: 5685 { 5686 WARN(("unsupported render command %d", pInputHdr->enmCmd)); 5687 return STATUS_INVALID_PARAMETER; 5688 } 5689 } 5690 5691 pRender->pDmaBufferPrivateData = ((uint8_t*)pRender->pDmaBufferPrivateData) + cbBuffer; 5692 pRender->pDmaBuffer = ((uint8_t*)pRender->pDmaBuffer) + cbCmdDma; 5693 5694 pCmd->u8State = VBOXCMDVBVA_STATE_SUBMITTED; 5695 /* sanity */ 5696 pCmd->u32FenceID = 0; 5697 5698 // LOGF(("LEAVE, hContext(0x%x)", hContext)); 5699 5700 return STATUS_SUCCESS; 5701 } 5702 5703 5704 static NTSTATUS 5705 APIENTRY 5706 DxgkDdiRenderLegacy( 5259 5707 CONST HANDLE hContext, 5260 5708 DXGKARG_RENDER *pRender) … … 5283 5731 switch (pInputHdr->enmCmd) 5284 5732 { 5285 case VBOXVDMACMD_TYPE_CHROMIUM_CMD:5286 {5287 if (pRender->CommandLength != RT_OFFSETOF(VBOXWDDM_DMA_PRIVATEDATA_UM_CHROMIUM_CMD, aBufInfos[pInputHdr->u32CmdReserved]))5288 {5289 Assert(0);5290 return STATUS_INVALID_PARAMETER;5291 }5292 PVBOXWDDM_DMA_PRIVATEDATA_UM_CHROMIUM_CMD pUmCmd = (PVBOXWDDM_DMA_PRIVATEDATA_UM_CHROMIUM_CMD)pInputHdr;5293 PVBOXWDDM_DMA_PRIVATEDATA_CHROMIUM_CMD pChromiumCmd = (PVBOXWDDM_DMA_PRIVATEDATA_CHROMIUM_CMD)pRender->pDmaBufferPrivateData;5294 const uint32_t cbDma = RT_OFFSETOF(VBOXWDDM_DMA_PRIVATEDATA_CHROMIUM_CMD, aBufInfos[pInputHdr->u32CmdReserved]);5295 if (pRender->DmaBufferPrivateDataSize < cbDma)5296 {5297 Assert(0);5298 return STATUS_INVALID_PARAMETER;5299 }5300 if (pRender->DmaSize < cbDma)5301 {5302 Assert(0);5303 return STATUS_INVALID_PARAMETER;5304 }5305 5306 if (pRender->PatchLocationListOutSize < pInputHdr->u32CmdReserved)5307 {5308 Assert(0);5309 return STATUS_INVALID_PARAMETER;5310 }5311 5312 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)hContext;5313 PVBOXWDDM_DEVICE pDevice = pContext->pDevice;5314 PVBOXMP_DEVEXT pDevExt = pDevice->pAdapter;5315 5316 pChromiumCmd->Base.enmCmd = VBOXVDMACMD_TYPE_CHROMIUM_CMD;5317 pChromiumCmd->Base.u32CmdReserved = pInputHdr->u32CmdReserved;5318 pRender->pDmaBufferPrivateData = (uint8_t*)pRender->pDmaBufferPrivateData + cbDma;5319 pRender->pDmaBuffer = ((uint8_t*)pRender->pDmaBuffer) + cbDma;5320 D3DDDI_PATCHLOCATIONLIST* pPLL = pRender->pPatchLocationListOut;5321 memset(pPLL, 0, sizeof (*pPLL) * pChromiumCmd->Base.u32CmdReserved);5322 pRender->pPatchLocationListOut += pInputHdr->u32CmdReserved;5323 PVBOXWDDM_UHGSMI_BUFFER_SUBMIT_INFO pSubmInfo = pChromiumCmd->aBufInfos;5324 PVBOXWDDM_UHGSMI_BUFFER_UI_SUBMIT_INFO pSubmUmInfo = pUmCmd->aBufInfos;5325 DXGK_ALLOCATIONLIST *pAllocationList = pRender->pAllocationList;5326 for (UINT i = 0; i < pChromiumCmd->Base.u32CmdReserved; ++i)5327 {5328 PVBOXWDDM_ALLOCATION pAlloc = vboxWddmGetAllocationFromAllocList(pDevExt, pAllocationList);5329 vboxWddmPopulateDmaAllocInfoWithOffset(&pSubmInfo->Alloc, pAlloc, pAllocationList, pSubmUmInfo->offData);5330 5331 pSubmInfo->cbData = pSubmUmInfo->cbData;5332 pSubmInfo->bDoNotSignalCompletion = pSubmUmInfo->bDoNotSignalCompletion;5333 5334 pPLL->AllocationIndex = i;5335 pPLL->PatchOffset = RT_OFFSETOF(VBOXWDDM_DMA_PRIVATEDATA_CHROMIUM_CMD, aBufInfos[i].Alloc);5336 pPLL->AllocationOffset = pSubmUmInfo->offData;5337 5338 ++pPLL;5339 ++pSubmInfo;5340 ++pSubmUmInfo;5341 ++pAllocationList;5342 }5343 5344 break;5345 }5346 5733 case VBOXVDMACMD_TYPE_DMA_NOP: 5347 5734 { … … 5359 5746 } 5360 5747 default: 5748 { 5749 WARN(("unsupported command %d", pInputHdr->enmCmd)); 5361 5750 return STATUS_INVALID_PARAMETER; 5751 } 5362 5752 } 5363 5753 … … 5403 5793 } 5404 5794 5795 DECLINLINE(bool) VBoxCVDdiFillAllocInfo(VBOXCMDVBVA_HDR* pHdr, 5796 VBOXCMDVBVA_ALLOCINFO *pInfo, PVBOXWDDM_ALLOCATION pAlloc, DXGK_ALLOCATIONLIST *pList, bool fDst) 5797 { 5798 if (pAlloc->AllocData.hostID) 5799 { 5800 pHdr->u8Flags |= (fDst ? VBOXCMDVBVA_OPF_ALLOC_DSTID : VBOXCMDVBVA_OPF_ALLOC_SRCID); 5801 pInfo->id = pAlloc->AllocData.hostID; 5802 return false; 5803 } 5804 5805 Assert(!pList->PhysicalAddress.HighPart); 5806 pInfo->offVRAM = pList->PhysicalAddress.LowPart; 5807 return true; 5808 } 5809 5405 5810 /** 5406 5811 * DxgkDdiPresent 5407 5812 */ 5408 NTSTATUS5813 static NTSTATUS 5409 5814 APIENTRY 5410 DxgkDdiPresent( 5815 DxgkDdiPresentNew( 5816 CONST HANDLE hContext, 5817 DXGKARG_PRESENT *pPresent) 5818 { 5819 PAGED_CODE(); 5820 5821 // LOGF(("ENTER, hContext(0x%x)", hContext)); 5822 5823 vboxVDbgBreakFv(); 5824 5825 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)hContext; 5826 PVBOXWDDM_DEVICE pDevice = pContext->pDevice; 5827 PVBOXMP_DEVEXT pDevExt = pDevice->pAdapter; 5828 5829 if (pPresent->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_HDR)) 5830 { 5831 WARN(("Present->DmaBufferPrivateDataSize(%d) < sizeof VBOXCMDVBVA_HDR (%d)", pPresent->DmaBufferPrivateDataSize , sizeof (VBOXCMDVBVA_HDR))); 5832 /* @todo: can this actually happen? what status to return? */ 5833 return STATUS_INVALID_PARAMETER; 5834 } 5835 5836 VBOXCMDVBVA_HDR* pHdr = (VBOXCMDVBVA_HDR*)pPresent->pDmaBufferPrivateData; 5837 5838 UINT u32SrcPatch = ~0UL; 5839 UINT u32DstPatch = ~0UL; 5840 BOOLEAN fPatchSrc = false; 5841 BOOLEAN fPatchDst = false; 5842 VBOXCMDVBVA_RECT *paRects = NULL; 5843 uint32_t cbMaxRects; 5844 5845 if (pPresent->DmaSize < VBOXWDDM_DUMMY_DMABUFFER_SIZE) 5846 { 5847 WARN(("Present->DmaSize(%d) < VBOXWDDM_DUMMY_DMABUFFER_SIZE (%d)", pPresent->DmaSize , VBOXWDDM_DUMMY_DMABUFFER_SIZE)); 5848 /* @todo: can this actually happen? what status to return? */ 5849 return STATUS_INVALID_PARAMETER; 5850 } 5851 5852 if (pPresent->Flags.Blt) 5853 { 5854 Assert(pPresent->Flags.Value == 1); /* only Blt is set, we do not support anything else for now */ 5855 DXGK_ALLOCATIONLIST *pSrc = &pPresent->pAllocationList[DXGK_PRESENT_SOURCE_INDEX]; 5856 DXGK_ALLOCATIONLIST *pDst = &pPresent->pAllocationList[DXGK_PRESENT_DESTINATION_INDEX]; 5857 PVBOXWDDM_ALLOCATION pSrcAlloc = vboxWddmGetAllocationFromAllocList(pDevExt, pSrc); 5858 if (!pSrcAlloc) 5859 { 5860 /* this should not happen actually */ 5861 WARN(("failed to get Src Allocation info for hDeviceSpecificAllocation(0x%x)",pSrc->hDeviceSpecificAllocation)); 5862 return STATUS_INVALID_HANDLE; 5863 } 5864 5865 PVBOXWDDM_ALLOCATION pDstAlloc = vboxWddmGetAllocationFromAllocList(pDevExt, pDst); 5866 if (!pDstAlloc) 5867 { 5868 /* this should not happen actually */ 5869 WARN(("failed to get Dst Allocation info for hDeviceSpecificAllocation(0x%x)",pDst->hDeviceSpecificAllocation)); 5870 return STATUS_INVALID_HANDLE; 5871 } 5872 5873 fPatchSrc = TRUE; 5874 fPatchDst = TRUE; 5875 5876 BOOLEAN fDstPrimary = (!pDstAlloc->AllocData.hostID 5877 && pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE 5878 && pDstAlloc->bAssigned); 5879 BOOLEAN fSrcPrimary = (!pSrcAlloc->AllocData.hostID 5880 && pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE 5881 && pSrcAlloc->bAssigned); 5882 5883 pHdr->u8OpCode = VBOXCMDVBVA_OPTYPE_BLT_OFFPRIMSZFMT_OR_ID; 5884 pHdr->u8Flags = 0; 5885 5886 if (fDstPrimary || fSrcPrimary) 5887 { 5888 if (pPresent->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_BLT_PRIMARY)) 5889 { 5890 WARN(("Present->DmaBufferPrivateDataSize(%d) < sizeof VBOXCMDVBVA_BLT_PRIMARY (%d)", pPresent->DmaBufferPrivateDataSize , sizeof (VBOXCMDVBVA_BLT_PRIMARY))); 5891 /* @todo: can this actually happen? what status to return? */ 5892 return STATUS_INVALID_PARAMETER; 5893 } 5894 5895 VBOXCMDVBVA_BLT_PRIMARY *pBlt = (VBOXCMDVBVA_BLT_PRIMARY*)pHdr; 5896 5897 /* this is the most common case, so we optimize it a bit with VBOXCMDVBVA_BLT_PRIMARY */ 5898 5899 if (fSrcPrimary) 5900 { 5901 pBlt->Hdr.u8Flags |= VBOXCMDVBVA_OPF_ALLOC_SRCPRIMARY; 5902 pBlt->Hdr.u8PrimaryID = pSrcAlloc->AllocData.SurfDesc.VidPnSourceId; 5903 5904 if (fDstPrimary) 5905 { 5906 pBlt->Hdr.u8Flags |= VBOXCMDVBVA_OPF_ALLOC_DSTPRIMARY; 5907 pBlt->alloc.id = pDstAlloc->AllocData.SurfDesc.VidPnSourceId; 5908 } 5909 else if (VBoxCVDdiFillAllocInfo(pHdr, &pBlt->alloc, pDstAlloc, pDst, true)) 5910 u32DstPatch = RT_OFFSETOF(VBOXCMDVBVA_BLT_PRIMARY, alloc.offVRAM); 5911 } 5912 else 5913 { 5914 Assert(fDstPrimary); 5915 pBlt->Hdr.u8Flags |= VBOXCMDVBVA_OPF_ALLOC_DSTPRIMARY; 5916 pBlt->Hdr.u8PrimaryID = pDstAlloc->AllocData.SurfDesc.VidPnSourceId; 5917 5918 if (VBoxCVDdiFillAllocInfo(pHdr, &pBlt->alloc, pSrcAlloc, pSrc, false)) 5919 u32SrcPatch = RT_OFFSETOF(VBOXCMDVBVA_BLT_PRIMARY, alloc.offVRAM); 5920 } 5921 5922 paRects = pBlt->aRects; 5923 cbMaxRects = pPresent->DmaBufferPrivateDataSize - RT_OFFSETOF(VBOXCMDVBVA_BLT_PRIMARY, aRects); 5924 } 5925 else 5926 { 5927 if (pPresent->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID)) 5928 { 5929 WARN(("Present->DmaBufferPrivateDataSize(%d) < sizeof VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID (%d)", pPresent->DmaBufferPrivateDataSize , sizeof (VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID))); 5930 /* @todo: can this actually happen? what status to return? */ 5931 return STATUS_INVALID_PARAMETER; 5932 } 5933 5934 VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID *pBlt = (VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID*)pHdr; 5935 5936 if (VBoxCVDdiFillAllocInfo(pHdr, &pBlt->src, pSrcAlloc, pSrc, false)) 5937 u32SrcPatch = RT_OFFSETOF(VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID, src.offVRAM); 5938 5939 if (VBoxCVDdiFillAllocInfo(pHdr, &pBlt->dst, pDstAlloc, pDst, true)) 5940 u32DstPatch = RT_OFFSETOF(VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID, dst.offVRAM); 5941 5942 paRects = pBlt->aRects; 5943 cbMaxRects = pPresent->DmaBufferPrivateDataSize - RT_OFFSETOF(VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID, aRects); 5944 } 5945 } 5946 else if (pPresent->Flags.Flip) 5947 { 5948 if (pPresent->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_FLIP)) 5949 { 5950 WARN(("Present->DmaBufferPrivateDataSize(%d) < sizeof VBOXCMDVBVA_FLIP (%d)", pPresent->DmaBufferPrivateDataSize , sizeof (VBOXCMDVBVA_FLIP))); 5951 /* @todo: can this actually happen? what status to return? */ 5952 return STATUS_INVALID_PARAMETER; 5953 } 5954 5955 fPatchSrc = TRUE; 5956 5957 Assert(pPresent->Flags.Value == 4); /* only Blt is set, we do not support anything else for now */ 5958 Assert(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D); 5959 DXGK_ALLOCATIONLIST *pSrc = &pPresent->pAllocationList[DXGK_PRESENT_SOURCE_INDEX]; 5960 PVBOXWDDM_ALLOCATION pSrcAlloc = vboxWddmGetAllocationFromAllocList(pDevExt, pSrc); 5961 5962 if (!pSrcAlloc) 5963 { 5964 /* this should not happen actually */ 5965 WARN(("failed to get pSrc Allocation info for hDeviceSpecificAllocation(0x%x)",pSrc->hDeviceSpecificAllocation)); 5966 return STATUS_INVALID_HANDLE; 5967 } 5968 5969 Assert(pDevExt->cContexts3D); 5970 pHdr->u8OpCode = VBOXCMDVBVA_OPTYPE_FLIP; 5971 pHdr->u8Flags = 0; 5972 VBOXCMDVBVA_FLIP *pFlip = (VBOXCMDVBVA_FLIP*)pHdr; 5973 5974 if (VBoxCVDdiFillAllocInfo(pHdr, &pFlip->src, pSrcAlloc, pSrc, false)) 5975 u32SrcPatch = RT_OFFSETOF(VBOXCMDVBVA_FLIP, src.offVRAM); 5976 } 5977 else if (pPresent->Flags.ColorFill) 5978 { 5979 if (pPresent->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_CLRFILL)) 5980 { 5981 WARN(("Present->DmaBufferPrivateDataSize(%d) < sizeof VBOXCMDVBVA_CLRFILL (%d)", pPresent->DmaBufferPrivateDataSize , sizeof (VBOXCMDVBVA_CLRFILL))); 5982 /* @todo: can this actually happen? what status to return? */ 5983 return STATUS_INVALID_PARAMETER; 5984 } 5985 5986 fPatchDst = TRUE; 5987 5988 Assert(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_2D); 5989 Assert(pPresent->Flags.Value == 2); /* only ColorFill is set, we do not support anything else for now */ 5990 DXGK_ALLOCATIONLIST *pDst = &pPresent->pAllocationList[DXGK_PRESENT_DESTINATION_INDEX]; 5991 PVBOXWDDM_ALLOCATION pDstAlloc = vboxWddmGetAllocationFromAllocList(pDevExt, pDst); 5992 if (!pDstAlloc) 5993 { 5994 /* this should not happen actually */ 5995 WARN(("failed to get pDst Allocation info for hDeviceSpecificAllocation(0x%x)",pDst->hDeviceSpecificAllocation)); 5996 return STATUS_INVALID_HANDLE; 5997 } 5998 5999 pHdr->u8OpCode = VBOXCMDVBVA_OPTYPE_CLRFILL; 6000 pHdr->u8Flags = 0; 6001 VBOXCMDVBVA_CLRFILL *pCFill = (VBOXCMDVBVA_CLRFILL*)pHdr; 6002 6003 if (VBoxCVDdiFillAllocInfo(pHdr, &pCFill->dst, pDstAlloc, pDst, true)) 6004 u32DstPatch = RT_OFFSETOF(VBOXCMDVBVA_CLRFILL, dst.offVRAM); 6005 6006 paRects = pCFill->aRects; 6007 cbMaxRects = pPresent->DmaBufferPrivateDataSize - RT_OFFSETOF(VBOXCMDVBVA_CLRFILL, aRects); 6008 } 6009 else 6010 { 6011 WARN(("cmd NOT IMPLEMENTED!! Flags(0x%x)", pPresent->Flags.Value)); 6012 return STATUS_NOT_SUPPORTED; 6013 } 6014 6015 if (paRects) 6016 { 6017 UINT iStartRect = pPresent->MultipassOffset; 6018 UINT cMaxRects = cbMaxRects / sizeof (VBOXCMDVBVA_RECT); 6019 Assert(pPresent->SubRectCnt > iStartRect); 6020 UINT cRects = pPresent->SubRectCnt - iStartRect; 6021 if (cRects > cMaxRects) 6022 { 6023 pPresent->MultipassOffset += cMaxRects; 6024 cRects = cMaxRects; 6025 } 6026 else 6027 pPresent->MultipassOffset = 0; 6028 6029 const RECT *paDstSubRects = &pPresent->pDstSubRects[iStartRect]; 6030 VBoxCVDdiPackRects(paRects, paDstSubRects, cRects); 6031 } 6032 6033 if (fPatchSrc) 6034 { 6035 memset(pPresent->pPatchLocationListOut, 0, sizeof (D3DDDI_PATCHLOCATIONLIST)); 6036 pPresent->pPatchLocationListOut->PatchOffset = u32SrcPatch; 6037 pPresent->pPatchLocationListOut->AllocationIndex = DXGK_PRESENT_SOURCE_INDEX; 6038 ++pPresent->pPatchLocationListOut; 6039 } 6040 6041 if (fPatchDst) 6042 { 6043 memset(pPresent->pPatchLocationListOut, 0, sizeof (D3DDDI_PATCHLOCATIONLIST)); 6044 pPresent->pPatchLocationListOut->PatchOffset = u32DstPatch; 6045 pPresent->pPatchLocationListOut->AllocationIndex = DXGK_PRESENT_DESTINATION_INDEX; 6046 ++pPresent->pPatchLocationListOut; 6047 } 6048 6049 pHdr->u8State = VBOXCMDVBVA_STATE_SUBMITTED; 6050 /* sanity */ 6051 pHdr->u32FenceID = 0; 6052 6053 pPresent->pDmaBuffer = ((uint8_t*)pPresent->pDmaBuffer) + VBOXWDDM_DUMMY_DMABUFFER_SIZE; 6054 6055 if (pPresent->MultipassOffset) 6056 return STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER; 6057 return STATUS_SUCCESS; 6058 } 6059 6060 /** 6061 * DxgkDdiPresent 6062 */ 6063 static NTSTATUS 6064 APIENTRY 6065 DxgkDdiPresentLegacy( 5411 6066 CONST HANDLE hContext, 5412 6067 DXGKARG_PRESENT *pPresent) … … 5434 6089 pPrivateData->BaseHdr.fFlags.Value = 0; 5435 6090 uint32_t cContexts2D = ASMAtomicReadU32(&pDevExt->cContexts2D); 5436 #define VBOXWDDM_DUMMY_DMABUFFER_SIZE sizeof(RECT)5437 6091 5438 6092 if (pPresent->Flags.Blt) … … 6218 6872 DriverInitializationData.DxgkDdiRemoveDevice = DxgkDdiRemoveDevice; 6219 6873 DriverInitializationData.DxgkDdiDispatchIoRequest = DxgkDdiDispatchIoRequest; 6220 DriverInitializationData.DxgkDdiInterruptRoutine = DxgkDdiInterruptRoutine ;6221 DriverInitializationData.DxgkDdiDpcRoutine = DxgkDdiDpcRoutine ;6874 DriverInitializationData.DxgkDdiInterruptRoutine = DxgkDdiInterruptRoutineNew; 6875 DriverInitializationData.DxgkDdiDpcRoutine = DxgkDdiDpcRoutineNew; 6222 6876 DriverInitializationData.DxgkDdiQueryChildRelations = DxgkDdiQueryChildRelations; 6223 6877 DriverInitializationData.DxgkDdiQueryChildStatus = DxgkDdiQueryChildStatus; … … 6265 6919 #endif 6266 6920 6267 static NTSTATUS vboxWddmInitFullGraphicsDriver(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath) 6268 { 6921 static NTSTATUS vboxWddmInitFullGraphicsDriver(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath, BOOLEAN fCmdVbva) 6922 { 6923 #define VBOXWDDM_CALLBACK_NAME(_base, _fCmdVbva) ((_fCmdVbva) ? _base##New : _base##Legacy) 6924 6269 6925 DRIVER_INITIALIZATION_DATA DriverInitializationData = {'\0'}; 6270 6926 … … 6277 6933 DriverInitializationData.DxgkDdiRemoveDevice = DxgkDdiRemoveDevice; 6278 6934 DriverInitializationData.DxgkDdiDispatchIoRequest = DxgkDdiDispatchIoRequest; 6279 DriverInitializationData.DxgkDdiInterruptRoutine = DxgkDdiInterruptRoutine;6280 DriverInitializationData.DxgkDdiDpcRoutine = DxgkDdiDpcRoutine;6935 DriverInitializationData.DxgkDdiInterruptRoutine = VBOXWDDM_CALLBACK_NAME(DxgkDdiInterruptRoutine, fCmdVbva); 6936 DriverInitializationData.DxgkDdiDpcRoutine = VBOXWDDM_CALLBACK_NAME(DxgkDdiDpcRoutine, fCmdVbva); 6281 6937 DriverInitializationData.DxgkDdiQueryChildRelations = DxgkDdiQueryChildRelations; 6282 6938 DriverInitializationData.DxgkDdiQueryChildStatus = DxgkDdiQueryChildStatus; … … 6297 6953 DriverInitializationData.DxgkDdiAcquireSwizzlingRange = DxgkDdiAcquireSwizzlingRange; 6298 6954 DriverInitializationData.DxgkDdiReleaseSwizzlingRange = DxgkDdiReleaseSwizzlingRange; 6299 DriverInitializationData.DxgkDdiPatch = DxgkDdiPatch;6300 DriverInitializationData.DxgkDdiSubmitCommand = DxgkDdiSubmitCommand;6301 DriverInitializationData.DxgkDdiPreemptCommand = DxgkDdiPreemptCommand;6302 DriverInitializationData.DxgkDdiBuildPagingBuffer = DxgkDdiBuildPagingBuffer;6955 DriverInitializationData.DxgkDdiPatch = VBOXWDDM_CALLBACK_NAME(DxgkDdiPatch, fCmdVbva); 6956 DriverInitializationData.DxgkDdiSubmitCommand = VBOXWDDM_CALLBACK_NAME(DxgkDdiSubmitCommand, fCmdVbva); 6957 DriverInitializationData.DxgkDdiPreemptCommand = VBOXWDDM_CALLBACK_NAME(DxgkDdiPreemptCommand, fCmdVbva); 6958 DriverInitializationData.DxgkDdiBuildPagingBuffer = VBOXWDDM_CALLBACK_NAME(DxgkDdiBuildPagingBuffer, fCmdVbva); 6303 6959 DriverInitializationData.DxgkDdiSetPalette = DxgkDdiSetPalette; 6304 6960 DriverInitializationData.DxgkDdiSetPointerPosition = DxgkDdiSetPointerPosition; … … 6308 6964 DriverInitializationData.DxgkDdiEscape = DxgkDdiEscape; 6309 6965 DriverInitializationData.DxgkDdiCollectDbgInfo = DxgkDdiCollectDbgInfo; 6310 DriverInitializationData.DxgkDdiQueryCurrentFence = DxgkDdiQueryCurrentFence;6966 DriverInitializationData.DxgkDdiQueryCurrentFence = VBOXWDDM_CALLBACK_NAME(DxgkDdiQueryCurrentFence, fCmdVbva); 6311 6967 DriverInitializationData.DxgkDdiIsSupportedVidPn = DxgkDdiIsSupportedVidPn; 6312 6968 DriverInitializationData.DxgkDdiRecommendFunctionalVidPn = DxgkDdiRecommendFunctionalVidPn; … … 6326 6982 DriverInitializationData.DxgkDdiOpenAllocation = DxgkDdiOpenAllocation; 6327 6983 DriverInitializationData.DxgkDdiCloseAllocation = DxgkDdiCloseAllocation; 6328 DriverInitializationData.DxgkDdiRender = DxgkDdiRender;6329 DriverInitializationData.DxgkDdiPresent = DxgkDdiPresent;6984 DriverInitializationData.DxgkDdiRender = VBOXWDDM_CALLBACK_NAME(DxgkDdiRender, fCmdVbva); 6985 DriverInitializationData.DxgkDdiPresent = VBOXWDDM_CALLBACK_NAME(DxgkDdiPresent, fCmdVbva); 6330 6986 6331 6987 DriverInitializationData.DxgkDdiUpdateOverlay = DxgkDdiUpdateOverlay; … … 6467 7123 #endif 6468 7124 { 6469 Status = vboxWddmInitFullGraphicsDriver(DriverObject, RegistryPath );7125 Status = vboxWddmInitFullGraphicsDriver(DriverObject, RegistryPath, !!(VBoxMpCrGetHostCaps() & CR_VBOX_CAP_CMDVBVA)); 6470 7126 } 6471 7127 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.h
r48070 r49591 128 128 DECLINLINE(void) vboxWddmAssignShadow(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, PVBOXWDDM_ALLOCATION pAllocation, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId) 129 129 { 130 if (pDevExt->fCmdVbvaEnabled) 131 { 132 WARN(("Trying to assign shadow surface for CmdVbva enabled mode!")); 133 return; 134 } 135 130 136 if (pSource->pShadowAllocation == pAllocation && pSource->fGhSynced > 0) 131 137 { … … 221 227 222 228 #define VBOXWDDMENTRY_2_SWAPCHAIN(_pE) ((PVBOXWDDM_SWAPCHAIN)((uint8_t*)(_pE) - RT_OFFSETOF(VBOXWDDM_SWAPCHAIN, DevExtListEntry))) 229 230 BOOLEAN DxgkDdiInterruptRoutineNew( 231 IN CONST PVOID MiniportDeviceContext, 232 IN ULONG MessageNumber 233 ); 223 234 224 235 #ifdef VBOX_WDDM_WIN8
Note:
See TracChangeset
for help on using the changeset viewer.