9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* $Id$ */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** @file
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VBoxVideo Display D3D User mode dll
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2011-2012 Oracle Corporation
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * available from http://www.virtualbox.org. This file is free software;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * General Public License (GPL) as published by the Free Software
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "VBoxDispD3DCmn.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync#define VBOXUHGSMID3D_GET_PRIVATE(_p, _t) ((_t*)(((uint8_t*)_p) - RT_OFFSETOF(_t, BasePrivate.Base)))
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync#define VBOXUHGSMID3D_GET(_p) VBOXUHGSMID3D_GET_PRIVATE(_p, VBOXUHGSMI_PRIVATE_D3D)
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/mem.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/err.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLCALLBACK(int) vboxUhgsmiD3DBufferDestroy(PVBOXUHGSMI_BUFFER pBuf)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE pBuffer = VBOXUHGSMDXALLOCBASE_GET_BUFFER(pBuf);
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync struct VBOXWDDMDISP_DEVICE *pDevice = VBOXUHGSMID3D_GET(pBuffer->BasePrivate.pHgsmi)->pDevice;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DDDICB_DEALLOCATE DdiDealloc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DdiDealloc.hResource = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DdiDealloc.NumAllocations = 1;
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync DdiDealloc.HandleList = &pBuffer->hAllocation;
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync HRESULT hr = pDevice->RtCallbacks.pfnDeallocateCb(pDevice->hDevice, &DdiDealloc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (hr == S_OK)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
72774443050856dc9e820b971545ecc67a2d6871vboxsync#ifdef DEBUG_misha
72774443050856dc9e820b971545ecc67a2d6871vboxsync memset(pBuffer, 0, sizeof (*pBuffer));
72774443050856dc9e820b971545ecc67a2d6871vboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTMemFree(pBuffer);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync WARN(("pfnDeallocateCb failed, hr %#x", hr));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_GENERAL_FAILURE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync/* typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_LOCK(PVBOXUHGSMI_BUFFER pBuf, uint32_t offLock, uint32_t cbLock, VBOXUHGSMI_BUFFER_LOCK_FLAGS fFlags, void**pvLock); */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLCALLBACK(int) vboxUhgsmiD3DBufferLock(PVBOXUHGSMI_BUFFER pBuf, uint32_t offLock, uint32_t cbLock, VBOXUHGSMI_BUFFER_LOCK_FLAGS fFlags, void**pvLock)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE pBuffer = VBOXUHGSMDXALLOCBASE_GET_BUFFER(pBuf);
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync struct VBOXWDDMDISP_DEVICE *pDevice = VBOXUHGSMID3D_GET(pBuffer->BasePrivate.pHgsmi)->pDevice;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DDDICB_LOCK DdiLock = {0};
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync DdiLock.hAllocation = pBuffer->hAllocation;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DdiLock.PrivateDriverData = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync int rc = vboxUhgsmiBaseDxLockData(pBuffer, offLock, cbLock, fFlags,
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync &DdiLock.Flags, &DdiLock.NumPages);
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync if (!RT_SUCCESS(rc))
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync {
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync WARN(("vboxUhgsmiBaseDxLockData failed rc %d", rc));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (DdiLock.NumPages)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DdiLock.pPages = pBuffer->aLockPageIndices;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DdiLock.pPages = NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync HRESULT hr = pDevice->RtCallbacks.pfnLockCb(pDevice->hDevice, &DdiLock);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (hr == S_OK)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *pvLock = (void*)(((uint8_t*)DdiLock.pData) + (offLock & 0xfff));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync WARN(("pfnLockCb failed, hr %#x", hr));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_GENERAL_FAILURE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLCALLBACK(int) vboxUhgsmiD3DBufferUnlock(PVBOXUHGSMI_BUFFER pBuf)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE pBuffer = VBOXUHGSMDXALLOCBASE_GET_BUFFER(pBuf);
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync struct VBOXWDDMDISP_DEVICE *pDevice = VBOXUHGSMID3D_GET(pBuffer->BasePrivate.pHgsmi)->pDevice;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DDDICB_UNLOCK DdiUnlock;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DdiUnlock.NumAllocations = 1;
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync DdiUnlock.phAllocations = &pBuffer->hAllocation;
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync HRESULT hr = pDevice->RtCallbacks.pfnUnlockCb(pDevice->hDevice, &DdiUnlock);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (hr == S_OK)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_SUCCESS;
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync WARN(("pfnUnlockCb failed, hr %#x", hr));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_GENERAL_FAILURE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync/*typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_CREATE(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fType, PVBOXUHGSMI_BUFFER* ppBuf);*/
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsyncDECLCALLBACK(int) vboxUhgsmiD3DBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fType, PVBOXUHGSMI_BUFFER* ppBuf)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!cbBuf)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync int rc = VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync cbBuf = VBOXWDDM_ROUNDBOUND(cbBuf, 0x1000);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(cbBuf);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cPages = cbBuf >> 12;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(cPages);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXUHGSMI_PRIVATE_D3D pPrivate = VBOXUHGSMID3D_GET(pHgsmi);
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE pBuf = (PVBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE)RTMemAllocZ(RT_OFFSETOF(VBOXUHGSMI_BUFFER_PRIVATE_DX_ALLOC_BASE, aLockPageIndices[cPages]));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pBuf)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync D3DDDICB_ALLOCATE DdiAlloc;
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync D3DDDI_ALLOCATIONINFO DdiAllocInfo;
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync VBOXWDDM_ALLOCINFO AllocInfo;
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync memset(&DdiAlloc, 0, sizeof (DdiAlloc));
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync DdiAlloc.hResource = NULL;
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync DdiAlloc.hKMResource = NULL;
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync DdiAlloc.NumAllocations = 1;
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync DdiAlloc.pAllocationInfo = &DdiAllocInfo;
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync vboxUhgsmiBaseDxAllocInfoFill(&DdiAllocInfo, &AllocInfo, cbBuf, fType);
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync HRESULT hr = pPrivate->pDevice->RtCallbacks.pfnAllocateCb(pPrivate->pDevice->hDevice, &DdiAlloc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (hr == S_OK)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync Assert(DdiAllocInfo.hAllocation);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBuf->BasePrivate.Base.pfnLock = vboxUhgsmiD3DBufferLock;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBuf->BasePrivate.Base.pfnUnlock = vboxUhgsmiD3DBufferUnlock;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBuf->BasePrivate.Base.pfnDestroy = vboxUhgsmiD3DBufferDestroy;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync pBuf->BasePrivate.Base.fType = fType;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBuf->BasePrivate.Base.cbBuffer = cbBuf;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
11f8b3da5f2ead2461e7998b3b091bb0f7bd14d9vboxsync pBuf->BasePrivate.pHgsmi = &pPrivate->BasePrivate;
11f8b3da5f2ead2461e7998b3b091bb0f7bd14d9vboxsync
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync pBuf->hAllocation = DdiAllocInfo.hAllocation;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *ppBuf = &pBuf->BasePrivate.Base;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync else
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync {
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync WARN(("pfnAllocateCb failed hr %#x"));
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync rc = VERR_GENERAL_FAILURE;
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTMemFree(pBuf);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync {
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync WARN(("RTMemAllocZ failed"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_NO_MEMORY;
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync/* typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_SUBMIT(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers); */
521d8df5a1a304406b911c2e2c7bf9214d6d9200vboxsyncDECLCALLBACK(int) vboxUhgsmiD3DBufferSubmit(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXUHGSMI_PRIVATE_D3D pHg = VBOXUHGSMID3D_GET(pHgsmi);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDMDISP_DEVICE pDevice = pHg->pDevice;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT cbDmaCmd = pDevice->DefaultContext.ContextInfo.CommandBufferSize;
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync int rc = vboxUhgsmiBaseDxDmaFill(aBuffers, cBuffers,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevice->DefaultContext.ContextInfo.pCommandBuffer, &cbDmaCmd,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevice->DefaultContext.ContextInfo.pAllocationList, pDevice->DefaultContext.ContextInfo.AllocationListSize,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevice->DefaultContext.ContextInfo.pPatchLocationList, pDevice->DefaultContext.ContextInfo.PatchLocationListSize);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_FAILURE(rc))
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync {
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync WARN(("vboxUhgsmiBaseDxDmaFill failed, rc %d", rc));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DDDICB_RENDER DdiRender = {0};
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DdiRender.CommandLength = cbDmaCmd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(DdiRender.CommandLength);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(DdiRender.CommandLength < UINT32_MAX/2);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DdiRender.CommandOffset = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DdiRender.NumAllocations = cBuffers;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DdiRender.NumPatchLocations = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// DdiRender.NewCommandBufferSize = sizeof (VBOXVDMACMD) + 4 * (100);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// DdiRender.NewAllocationListSize = 100;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// DdiRender.NewPatchLocationListSize = 100;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DdiRender.hContext = pDevice->DefaultContext.ContextInfo.hContext;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HRESULT hr = pDevice->RtCallbacks.pfnRenderCb(pDevice->hDevice, &DdiRender);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (hr == S_OK)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevice->DefaultContext.ContextInfo.CommandBufferSize = DdiRender.NewCommandBufferSize;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevice->DefaultContext.ContextInfo.pCommandBuffer = DdiRender.pNewCommandBuffer;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevice->DefaultContext.ContextInfo.AllocationListSize = DdiRender.NewAllocationListSize;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevice->DefaultContext.ContextInfo.pAllocationList = DdiRender.pNewAllocationList;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevice->DefaultContext.ContextInfo.PatchLocationListSize = DdiRender.NewPatchLocationListSize;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevice->DefaultContext.ContextInfo.pPatchLocationList = DdiRender.pNewPatchLocationList;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
b4c150c76d00ac5b8957b0148e2be234e567cf9avboxsync WARN(("pfnRenderCb failed, hr %#x", hr));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_GENERAL_FAILURE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsyncstatic DECLCALLBACK(int) vboxCrHhgsmiDispEscape(struct VBOXUHGSMI_PRIVATE_BASE *pHgsmi, void *pvData, uint32_t cbData, BOOL fHwAccess)
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync{
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync PVBOXUHGSMI_PRIVATE_D3D pPrivate = VBOXUHGSMID3D_GET(pHgsmi);
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync PVBOXWDDMDISP_DEVICE pDevice = pPrivate->pDevice;
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync D3DDDICB_ESCAPE DdiEscape = {0};
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync DdiEscape.hContext = pDevice->DefaultContext.ContextInfo.hContext;
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync DdiEscape.hDevice = pDevice->hDevice;
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync DdiEscape.Flags.HardwareAccess = !!fHwAccess;
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync DdiEscape.pPrivateDriverData = pvData;
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync DdiEscape.PrivateDriverDataSize = cbData;
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync HRESULT hr = pDevice->RtCallbacks.pfnEscapeCb(pDevice->pAdapter->hAdapter, &DdiEscape);
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync if (SUCCEEDED(hr))
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync {
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync return VINF_SUCCESS;
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync }
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync WARN(("pfnEscapeCb failed, hr 0x%x", hr));
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync return VERR_GENERAL_FAILURE;
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync}
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync
11f8b3da5f2ead2461e7998b3b091bb0f7bd14d9vboxsyncvoid vboxUhgsmiD3DInit(PVBOXUHGSMI_PRIVATE_D3D pHgsmi, PVBOXWDDMDISP_DEVICE pDevice)
11f8b3da5f2ead2461e7998b3b091bb0f7bd14d9vboxsync{
11f8b3da5f2ead2461e7998b3b091bb0f7bd14d9vboxsync pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiD3DBufferCreate;
11f8b3da5f2ead2461e7998b3b091bb0f7bd14d9vboxsync pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiD3DBufferSubmit;
11f8b3da5f2ead2461e7998b3b091bb0f7bd14d9vboxsync /* escape is still needed, since Ugfsmi uses it e.g. to query connection id */
11f8b3da5f2ead2461e7998b3b091bb0f7bd14d9vboxsync pHgsmi->BasePrivate.pfnEscape = vboxCrHhgsmiDispEscape;
11f8b3da5f2ead2461e7998b3b091bb0f7bd14d9vboxsync pHgsmi->pDevice = pDevice;
11f8b3da5f2ead2461e7998b3b091bb0f7bd14d9vboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsyncvoid vboxUhgsmiD3DEscInit(PVBOXUHGSMI_PRIVATE_D3D pHgsmi, struct VBOXWDDMDISP_DEVICE *pDevice)
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync{
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync vboxUhgsmiBaseInit(&pHgsmi->BasePrivate, vboxCrHhgsmiDispEscape);
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync pHgsmi->pDevice = pDevice;
d10b60270f0c0eeb87f45002a010cff8ba2126b1vboxsync}