VBoxUhgsmiKmt.cpp revision cb0578a5309e1fc264e5a4acc30543bea075be43
2beebed98b4fc7f018fb224a1e4a3ab6103a4c0bCraig McDonnell * VBoxVideo Display D3D User mode dll
2beebed98b4fc7f018fb224a1e4a3ab6103a4c0bCraig McDonnell * Copyright (C) 2011-2012 Oracle Corporation
2beebed98b4fc7f018fb224a1e4a3ab6103a4c0bCraig McDonnell * This file is part of VirtualBox Open Source Edition (OSE), as
2beebed98b4fc7f018fb224a1e4a3ab6103a4c0bCraig McDonnell * available from http://www.virtualbox.org. This file is free software;
2beebed98b4fc7f018fb224a1e4a3ab6103a4c0bCraig McDonnell * you can redistribute it and/or modify it under the terms of the GNU
2beebed98b4fc7f018fb224a1e4a3ab6103a4c0bCraig McDonnell * General Public License (GPL) as published by the Free Software
2beebed98b4fc7f018fb224a1e4a3ab6103a4c0bCraig McDonnell * Foundation, in version 2 as it comes in the "COPYING" file of the
2beebed98b4fc7f018fb224a1e4a3ab6103a4c0bCraig McDonnell * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
2beebed98b4fc7f018fb224a1e4a3ab6103a4c0bCraig McDonnell * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
6a2ae9c7fb4d2c40d75cab0edaf940f22c18224fDiego Colantoni# define NT_SUCCESS(_Status) (((NTSTATUS)(_Status)) >= 0)
2beebed98b4fc7f018fb224a1e4a3ab6103a4c0bCraig McDonnellDECLCALLBACK(int) vboxUhgsmiKmtBufferDestroy(PVBOXUHGSMI_BUFFER pBuf)
2beebed98b4fc7f018fb224a1e4a3ab6103a4c0bCraig McDonnell PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE pBuffer = VBOXUHGSMDXALLOCBASE_GET_BUFFER(pBuf);
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pBuffer->BasePrivate.pHgsmi);
6a2ae9c7fb4d2c40d75cab0edaf940f22c18224fDiego Colantoni DdiDealloc.hDevice = pPrivate->Device.hDevice;
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni DdiDealloc.phAllocationList = &pBuffer->hAllocation;
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTDestroyAllocation(&DdiDealloc);
6a2ae9c7fb4d2c40d75cab0edaf940f22c18224fDiego Colantoni WARN(("pfnD3DKMTDestroyAllocation failed, Status (0x%x)", Status));
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnellDECLCALLBACK(int) vboxUhgsmiKmtBufferLock(PVBOXUHGSMI_BUFFER pBuf, uint32_t offLock, uint32_t cbLock, VBOXUHGSMI_BUFFER_LOCK_FLAGS fFlags, void**pvLock)
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE pBuffer = VBOXUHGSMDXALLOCBASE_GET_BUFFER(pBuf);
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pBuffer->BasePrivate.pHgsmi);
6a2ae9c7fb4d2c40d75cab0edaf940f22c18224fDiego Colantoni int rc = vboxUhgsmiBaseDxLockData(pBuffer, offLock, cbLock, fFlags,
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell WARN(("vboxUhgsmiBaseDxLockData failed rc %d", rc));
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTLock(&DdiLock);
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell *pvLock = (void*)(((uint8_t*)DdiLock.pData) + (offLock & 0xfff));
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell WARN(("pfnD3DKMTLock failed, Status (0x%x)", Status));
f877f6ca2428244a6d0954a1dbef471577b32c60Diego ColantoniDECLCALLBACK(int) vboxUhgsmiKmtBufferUnlock(PVBOXUHGSMI_BUFFER pBuf)
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE pBuffer = VBOXUHGSMDXALLOCBASE_GET_BUFFER(pBuf);
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pBuffer->BasePrivate.pHgsmi);
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott DdiUnlock.hDevice = pPrivate->Device.hDevice;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott DdiUnlock.phAllocations = &pBuffer->hAllocation;
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTUnlock(&DdiUnlock);
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni WARN(("pfnD3DKMTUnlock failed, Status (0x%x)", Status));
f877f6ca2428244a6d0954a1dbef471577b32c60Diego ColantoniDECLCALLBACK(int) vboxUhgsmiKmtBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fType, PVBOXUHGSMI_BUFFER* ppBuf)
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pHgsmi);
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE pBuf = (PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE)RTMemAllocZ(RT_OFFSETOF(VBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE, aLockPageIndices[cPages]));
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell DdiAlloc.hDevice = pPrivate->Device.hDevice;
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell vboxUhgsmiBaseDxAllocInfoFill(&DdiAllocInfo, &AllocInfo, cbBuf, fType);
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTCreateAllocation(&DdiAlloc);
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni pBuf->BasePrivate.Base.pfnLock = vboxUhgsmiKmtBufferLock;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott pBuf->BasePrivate.Base.pfnUnlock = vboxUhgsmiKmtBufferUnlock;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott pBuf->BasePrivate.Base.pfnDestroy = vboxUhgsmiKmtBufferDestroy;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott pBuf->hAllocation = DdiAllocInfo.hAllocation;
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell WARN(("pfnD3DKMTCreateAllocation failes, Status(0x%x)", Status));
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert WapshottDECLCALLBACK(int) vboxUhgsmiKmtBufferSubmit(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott PVBOXUHGSMI_PRIVATE_KMT pHg = VBOXUHGSMIKMT_GET(pHgsmi);
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott UINT cbDmaCmd = pHg->Context.CommandBufferSize;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott int rc = vboxUhgsmiBaseDxDmaFill(aBuffers, cBuffers,
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott pHg->Context.pAllocationList, pHg->Context.AllocationListSize,
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott pHg->Context.pPatchLocationList, pHg->Context.PatchLocationListSize);
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott WARN(("vboxUhgsmiBaseDxDmaFill failed, rc %d", rc));
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni Assert(DdiRender.CommandLength < UINT32_MAX/2);
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni NTSTATUS Status = pHg->Callbacks.pfnD3DKMTRender(&DdiRender);
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni pHg->Context.CommandBufferSize = DdiRender.NewCommandBufferSize;
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni pHg->Context.pCommandBuffer = DdiRender.pNewCommandBuffer;
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni pHg->Context.AllocationListSize = DdiRender.NewAllocationListSize;
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni pHg->Context.pAllocationList = DdiRender.pNewAllocationList;
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni pHg->Context.PatchLocationListSize = DdiRender.NewPatchLocationListSize;
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni pHg->Context.pPatchLocationList = DdiRender.pNewPatchLocationList;
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni WARN(("pfnD3DKMTRender failed, Status (0x%x)", Status));
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantonistatic HRESULT vboxUhgsmiKmtEngineCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, BOOL bD3D)
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni HRESULT hr = vboxDispKmtCallbacksInit(&pHgsmi->Callbacks);
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni hr = vboxDispKmtOpenAdapter(&pHgsmi->Callbacks, &pHgsmi->Adapter);
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott hr = vboxDispKmtCreateDevice(&pHgsmi->Adapter, &pHgsmi->Device);
2beebed98b4fc7f018fb224a1e4a3ab6103a4c0bCraig McDonnell hr = vboxDispKmtCreateContext(&pHgsmi->Device, &pHgsmi->Context,
2beebed98b4fc7f018fb224a1e4a3ab6103a4c0bCraig McDonnell bD3D ? VBOXWDDM_CONTEXT_TYPE_CUSTOM_UHGSMI_3D : VBOXWDDM_CONTEXT_TYPE_CUSTOM_UHGSMI_GL,
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott CR_PROTOCOL_VERSION_MAJOR, CR_PROTOCOL_VERSION_MINOR,
78c07714ec1113f7f21c75b818f2bf6a7021618aDiego Colantoni WARN(("vboxDispKmtCreateContext failed, hr(0x%x)", hr));
78c07714ec1113f7f21c75b818f2bf6a7021618aDiego Colantoni WARN(("vboxDispKmtCreateDevice failed, hr(0x%x)", hr));
78c07714ec1113f7f21c75b818f2bf6a7021618aDiego Colantoni// WARN(("vboxDispKmtOpenAdapter failed, hr(0x%x)", hr));
78c07714ec1113f7f21c75b818f2bf6a7021618aDiego Colantoni vboxDispKmtCallbacksTerm(&pHgsmi->Callbacks);
78c07714ec1113f7f21c75b818f2bf6a7021618aDiego Colantoni WARN(("vboxDispKmtCallbacksInit failed, hr(0x%x)", hr));
78c07714ec1113f7f21c75b818f2bf6a7021618aDiego Colantonistatic DECLCALLBACK(int) vboxCrHhgsmiKmtEscape(struct VBOXUHGSMI_PRIVATE_BASE *pHgsmi, void *pvData, uint32_t cbData, BOOL fHwAccess)
78c07714ec1113f7f21c75b818f2bf6a7021618aDiego Colantoni PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pHgsmi);
78c07714ec1113f7f21c75b818f2bf6a7021618aDiego Colantoni DdiEscape.hAdapter = pPrivate->Adapter.hAdapter;
78c07714ec1113f7f21c75b818f2bf6a7021618aDiego Colantoni DdiEscape.hDevice = pPrivate->Device.hDevice;
78c07714ec1113f7f21c75b818f2bf6a7021618aDiego Colantoni DdiEscape.Type = D3DKMT_ESCAPE_DRIVERPRIVATE;
78c07714ec1113f7f21c75b818f2bf6a7021618aDiego Colantoni DdiEscape.Flags.HardwareAccess = !!fHwAccess;
78c07714ec1113f7f21c75b818f2bf6a7021618aDiego Colantoni DdiEscape.hContext = pPrivate->Context.hContext;
return VINF_SUCCESS;
return VERR_GENERAL_FAILURE;
return Status;
return E_FAIL;
return S_OK;
return hr;
return hr;
return S_OK;
return S_OK;
return hr;