VBoxUhgsmiKmt.cpp revision 7704ab3cf2fe38a3307d6abee1f097fa4346e20e
/** @file
*
* VBoxVideo Display D3D User mode dll
*
* Copyright (C) 2010 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
#include "VBoxDispD3DCmn.h"
typedef struct VBOXUHGSMI_BUFFER_PRIVATE_KMT
{
typedef struct VBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC
{
#define VBOXUHGSMIKMTESC_GET_BUFFER(_p) VBOXUHGSMIKMTESC_GET_PRIVATE(_p, VBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC)
{
if (!Status)
{
{
}
return VINF_SUCCESS;
}
return VERR_GENERAL_FAILURE;
}
DECLCALLBACK(int) vboxUhgsmiKmtBufferLock(PVBOXUHGSMI_BUFFER pBuf, uint32_t offLock, uint32_t cbLock, VBOXUHGSMI_BUFFER_LOCK_FLAGS fFlags, void**pvLock)
{
D3DKMT_LOCK DdiLock = {0};
if (RT_FAILURE(rc))
return rc;
else
if (!Status)
{
return VINF_SUCCESS;
}
return VERR_GENERAL_FAILURE;
}
{
if (!Status)
return VINF_SUCCESS;
return VERR_GENERAL_FAILURE;
}
{
bool bSynchCreated = false;
if (!cbBuf)
return VERR_INVALID_PARAMETER;
if (RT_FAILURE(rc))
return rc;
PVBOXUHGSMI_BUFFER_PRIVATE_KMT pBuf = (PVBOXUHGSMI_BUFFER_PRIVATE_KMT)RTMemAllocZ(RT_OFFSETOF(VBOXUHGSMI_BUFFER_PRIVATE_KMT, aLockPageIndices[cPages]));
if (pBuf)
{
struct
{
} Buf;
{
// pBuf->Base.pfnAdjustValidDataRange = vboxUhgsmiKmtBufferAdjustValidDataRange;
return VINF_SUCCESS;
}
else
{
}
}
else
rc = VERR_NO_MEMORY;
if (bSynchCreated)
return rc;
}
DECLCALLBACK(int) vboxUhgsmiKmtBufferSubmitAsynch(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)
{
if (RT_FAILURE(rc))
return rc;
D3DKMT_RENDER DdiRender = {0};
{
return VINF_SUCCESS;
}
return VERR_GENERAL_FAILURE;
}
DECLCALLBACK(int) vboxUhgsmiKmtEscBufferLock(PVBOXUHGSMI_BUFFER pBuf, uint32_t offLock, uint32_t cbLock, VBOXUHGSMI_BUFFER_LOCK_FLAGS fFlags, void**pvLock)
{
return VINF_SUCCESS;
}
{
return VINF_SUCCESS;
}
{
D3DKMT_ESCAPE DdiEscape = {0};
//Buf.DdiEscape.Flags.HardwareAccess = 1;
{
{
}
return VINF_SUCCESS;
}
return VERR_GENERAL_FAILURE;
}
{
bool bSynchCreated = false;
if (!cbBuf)
return VERR_INVALID_PARAMETER;
if (RT_FAILURE(rc))
return rc;
PVBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC pBuf = (PVBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC)RTMemAllocZ(RT_OFFSETOF(VBOXUHGSMI_BUFFER_PRIVATE_KMT, aLockPageIndices[cPages]));
if (pBuf)
{
struct
{
} Buf;
//Buf.DdiEscape.Flags.HardwareAccess = 1;
{
// pBuf->Base.pfnAdjustValidDataRange = vboxUhgsmiKmtBufferAdjustValidDataRange;
return VINF_SUCCESS;
}
else
{
}
}
else
rc = VERR_NO_MEMORY;
if (bSynchCreated)
return rc;
}
DECLCALLBACK(int) vboxUhgsmiKmtEscBufferSubmitAsynch(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)
{
/* we no chromium will not submit more than three buffers actually,
* for simplicity allocate it statically on the stack */
struct
{
} Buf;
{
Assert(0);
return VERR_INVALID_PARAMETER;
}
D3DKMT_ESCAPE DdiEscape = {0};
//Buf.DdiEscape.Flags.HardwareAccess = 1;
{
{
}
else
{
}
}
{
return VINF_SUCCESS;
}
return VERR_GENERAL_FAILURE;
}
{
{
{
{
{
return S_OK;
}
}
}
}
return hr;
}
{
#ifdef VBOX_CRHGSMI_WITH_D3DDEV
#endif
}
{
#ifdef VBOX_CRHGSMI_WITH_D3DDEV
#endif
}
{
Assert(0);
{
{
{
return S_OK;
}
}
}
return hr;
}
{
{
bool bSupported = true;
pCallbacks->pfnD3DKMTOpenAdapterFromHdc = (PFND3DKMT_OPENADAPTERFROMHDC)GetProcAddress(pCallbacks->hGdi32, "D3DKMTOpenAdapterFromHdc");
pCallbacks->pfnD3DKMTOpenAdapterFromGdiDisplayName = (PFND3DKMT_OPENADAPTERFROMGDIDISPLAYNAME)GetProcAddress(pCallbacks->hGdi32, "D3DKMTOpenAdapterFromGdiDisplayName");
Log((__FUNCTION__": pfnD3DKMTOpenAdapterFromGdiDisplayName = %p\n", pCallbacks->pfnD3DKMTOpenAdapterFromGdiDisplayName));
pCallbacks->pfnD3DKMTCloseAdapter = (PFND3DKMT_CLOSEADAPTER)GetProcAddress(pCallbacks->hGdi32, "D3DKMTCloseAdapter");
pCallbacks->pfnD3DKMTCreateDevice = (PFND3DKMT_CREATEDEVICE)GetProcAddress(pCallbacks->hGdi32, "D3DKMTCreateDevice");
pCallbacks->pfnD3DKMTDestroyDevice = (PFND3DKMT_DESTROYDEVICE)GetProcAddress(pCallbacks->hGdi32, "D3DKMTDestroyDevice");
pCallbacks->pfnD3DKMTCreateContext = (PFND3DKMT_CREATECONTEXT)GetProcAddress(pCallbacks->hGdi32, "D3DKMTCreateContext");
pCallbacks->pfnD3DKMTDestroyContext = (PFND3DKMT_DESTROYCONTEXT)GetProcAddress(pCallbacks->hGdi32, "D3DKMTDestroyContext");
pCallbacks->pfnD3DKMTCreateAllocation = (PFND3DKMT_CREATEALLOCATION)GetProcAddress(pCallbacks->hGdi32, "D3DKMTCreateAllocation");
pCallbacks->pfnD3DKMTDestroyAllocation = (PFND3DKMT_DESTROYALLOCATION)GetProcAddress(pCallbacks->hGdi32, "D3DKMTDestroyAllocation");
if (bSupported)
{
return S_OK;
}
else
{
hr = E_NOINTERFACE;
}
}
else
{
Assert(0);
}
return hr;
}
{
return S_OK;
}
{
wcsncpy(OpenAdapterData.DeviceName, L"\\\\.\\DISPLAY1", RT_ELEMENTS(OpenAdapterData.DeviceName) - 1 /* the last one is always \0 */);
if (!Status)
{
return S_OK;
}
else
{
}
return hr;
}
{
if (!Status)
{
return S_OK;
}
/* ignore */
Status = 0;
return E_FAIL;
}
{
if (!Status)
{
return S_OK;
}
return E_FAIL;
}
{
if (!Status)
{
return S_OK;
}
return E_FAIL;
}
HRESULT vboxDispKmtCreateContext(PVBOXDISPKMT_DEVICE pDevice, PVBOXDISPKMT_CONTEXT pContext, BOOL bD3D)
{
VBOXWDDM_CREATECONTEXT_INFO Info = {0};
Info.enmType = bD3D ? VBOXWDDM_CONTEXT_TYPE_CUSTOM_UHGSMI_3D : VBOXWDDM_CONTEXT_TYPE_CUSTOM_UHGSMI_GL;
D3DKMT_CREATECONTEXT ContextData = {0};
ContextData.NodeOrdinal = 0;
if (!Status)
{
return S_OK;
}
return E_FAIL;
}
{
NTSTATUS Status = pContext->pDevice->pAdapter->pCallbacks->pfnD3DKMTDestroyContext(&DestroyContextData);
if (!Status)
return S_OK;
return E_FAIL;
}