DECLCALLBACK(int) vboxUhgsmiKmtBufferDestroy(PVBOXUHGSMI_BUFFER pBuf) { PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE pBuffer = VBOXUHGSMDXALLOCBASE_GET_BUFFER(pBuf); PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pBuffer->BasePrivate.pHgsmi); D3DKMT_DESTROYALLOCATION DdiDealloc; DdiDealloc.hDevice = pPrivate->Device.hDevice; DdiDealloc.hResource = NULL; DdiDealloc.phAllocationList = &pBuffer->hAllocation; DdiDealloc.AllocationCount = 1; NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTDestroyAllocation(&DdiDealloc); if (NT_SUCCESS(Status)) { #ifdef DEBUG_misha memset(pBuffer, 0, sizeof(*pBuffer)); #endif RTMemFree(pBuffer); return VINF_SUCCESS; } else { WARN(("pfnD3DKMTDestroyAllocation failed, Status (0x%x)", Status)); } return VERR_GENERAL_FAILURE; }
/* typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_LOCK(PVBOXUHGSMI_BUFFER pBuf, uint32_t offLock, uint32_t cbLock, VBOXUHGSMI_BUFFER_LOCK_FLAGS fFlags, void**pvLock); */ DECLCALLBACK(int) vboxUhgsmiD3DBufferLock(PVBOXUHGSMI_BUFFER pBuf, uint32_t offLock, uint32_t cbLock, VBOXUHGSMI_BUFFER_LOCK_FLAGS fFlags, void**pvLock) { PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE pBuffer = VBOXUHGSMDXALLOCBASE_GET_BUFFER(pBuf); struct VBOXWDDMDISP_DEVICE *pDevice = VBOXUHGSMID3D_GET(pBuffer->BasePrivate.pHgsmi)->pDevice; D3DDDICB_LOCK DdiLock = {0}; DdiLock.hAllocation = pBuffer->hAllocation; DdiLock.PrivateDriverData = 0; int rc = vboxUhgsmiBaseDxLockData(pBuffer, offLock, cbLock, fFlags, &DdiLock.Flags, &DdiLock.NumPages); if (!RT_SUCCESS(rc)) { WARN(("vboxUhgsmiBaseDxLockData failed rc %d", rc)); return rc; } if (DdiLock.NumPages) DdiLock.pPages = pBuffer->aLockPageIndices; else DdiLock.pPages = NULL; HRESULT hr = pDevice->RtCallbacks.pfnLockCb(pDevice->hDevice, &DdiLock); if (hr == S_OK) { *pvLock = (void*)(((uint8_t*)DdiLock.pData) + (offLock & 0xfff)); return VINF_SUCCESS; } WARN(("pfnLockCb failed, hr %#x", hr)); return VERR_GENERAL_FAILURE; }
DECLCALLBACK(int) vboxUhgsmiD3DBufferUnlock(PVBOXUHGSMI_BUFFER pBuf) { PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE pBuffer = VBOXUHGSMDXALLOCBASE_GET_BUFFER(pBuf); struct VBOXWDDMDISP_DEVICE *pDevice = VBOXUHGSMID3D_GET(pBuffer->BasePrivate.pHgsmi)->pDevice; D3DDDICB_UNLOCK DdiUnlock; DdiUnlock.NumAllocations = 1; DdiUnlock.phAllocations = &pBuffer->hAllocation; HRESULT hr = pDevice->RtCallbacks.pfnUnlockCb(pDevice->hDevice, &DdiUnlock); if (hr == S_OK) return VINF_SUCCESS; WARN(("pfnUnlockCb failed, hr %#x", hr)); return VERR_GENERAL_FAILURE; }
DECLCALLBACK(int) vboxUhgsmiKmtBufferUnlock(PVBOXUHGSMI_BUFFER pBuf) { PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE pBuffer = VBOXUHGSMDXALLOCBASE_GET_BUFFER(pBuf); D3DKMT_UNLOCK DdiUnlock; PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pBuffer->BasePrivate.pHgsmi); DdiUnlock.hDevice = pPrivate->Device.hDevice; DdiUnlock.NumAllocations = 1; DdiUnlock.phAllocations = &pBuffer->hAllocation; NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTUnlock(&DdiUnlock); if (NT_SUCCESS(Status)) return VINF_SUCCESS; else WARN(("pfnD3DKMTUnlock failed, Status (0x%x)", Status)); return VERR_GENERAL_FAILURE; }
DECLCALLBACK(int) vboxUhgsmiD3DBufferDestroy(PVBOXUHGSMI_BUFFER pBuf) { PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE pBuffer = VBOXUHGSMDXALLOCBASE_GET_BUFFER(pBuf); struct VBOXWDDMDISP_DEVICE *pDevice = VBOXUHGSMID3D_GET(pBuffer->BasePrivate.pHgsmi)->pDevice; D3DDDICB_DEALLOCATE DdiDealloc; DdiDealloc.hResource = 0; DdiDealloc.NumAllocations = 1; DdiDealloc.HandleList = &pBuffer->hAllocation; HRESULT hr = pDevice->RtCallbacks.pfnDeallocateCb(pDevice->hDevice, &DdiDealloc); if (hr == S_OK) { RTMemFree(pBuffer); return VINF_SUCCESS; } WARN(("pfnDeallocateCb failed, hr %#x", hr)); return VERR_GENERAL_FAILURE; }
DECLCALLBACK(int) vboxUhgsmiKmtBufferLock(PVBOXUHGSMI_BUFFER pBuf, uint32_t offLock, uint32_t cbLock, VBOXUHGSMI_BUFFER_LOCK_FLAGS fFlags, void**pvLock) { PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE pBuffer = VBOXUHGSMDXALLOCBASE_GET_BUFFER(pBuf); PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pBuffer->BasePrivate.pHgsmi); D3DKMT_LOCK DdiLock = {0}; DdiLock.hDevice = pPrivate->Device.hDevice; DdiLock.hAllocation = pBuffer->hAllocation; DdiLock.PrivateDriverData = NULL; int rc = vboxUhgsmiBaseDxLockData(pBuffer, offLock, cbLock, fFlags, &DdiLock.Flags, &DdiLock.NumPages); if (!RT_SUCCESS(rc)) { WARN(("vboxUhgsmiBaseDxLockData failed rc %d", rc)); return rc; } if (DdiLock.NumPages) DdiLock.pPages = pBuffer->aLockPageIndices; else DdiLock.pPages = NULL; NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTLock(&DdiLock); if (NT_SUCCESS(Status)) { *pvLock = (void*)(((uint8_t*)DdiLock.pData) + (offLock & 0xfff)); return VINF_SUCCESS; } else { WARN(("pfnD3DKMTLock failed, Status (0x%x)", Status)); } return VERR_GENERAL_FAILURE; }