VBoxMPMisc.h revision 441b60f8b0601cc1718368c9c3ef082223ad12a2
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync/* $Id$ */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync/** @file
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * VBox WDDM Miniport driver
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync/*
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * Copyright (C) 2011 Oracle Corporation
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync *
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * available from http://www.virtualbox.org. This file is free software;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * you can redistribute it and/or modify it under the terms of the GNU
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * General Public License (GPL) as published by the Free Software
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync#ifndef ___VBoxMPMisc_h__
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync#define ___VBoxMPMisc_h__
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncDECLINLINE(void) vboxVideoLeDetach(LIST_ENTRY *pList, LIST_ENTRY *pDstList)
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync{
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync if (IsListEmpty(pList))
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync {
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync InitializeListHead(pDstList);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync }
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync else
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync {
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync *pDstList = *pList;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync Assert(pDstList->Flink->Blink == pList);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync Assert(pDstList->Blink->Flink == pList);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync /* pDstList->Flink & pDstList->Blink point to the "real| entries, never to pList
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync * since we've checked IsListEmpty(pList) above */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync pDstList->Flink->Blink = pDstList;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync pDstList->Blink->Flink = pDstList;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync InitializeListHead(pList);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync }
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync}
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsynctypedef uint32_t VBOXWDDM_HANDLE;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync#define VBOXWDDM_HANDLE_INVALID 0UL
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsynctypedef struct VBOXWDDM_HTABLE
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync{
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync uint32_t cData;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync uint32_t iNext2Search;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync uint32_t cSize;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync PVOID *paData;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync} VBOXWDDM_HTABLE, *PVBOXWDDM_HTABLE;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsynctypedef struct VBOXWDDM_HTABLE_ITERATOR
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync{
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync PVBOXWDDM_HTABLE pTbl;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync uint32_t iCur;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync uint32_t cLeft;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync} VBOXWDDM_HTABLE_ITERATOR, *PVBOXWDDM_HTABLE_ITERATOR;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncVOID vboxWddmHTableIterInit(PVBOXWDDM_HTABLE pTbl, PVBOXWDDM_HTABLE_ITERATOR pIter);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncPVOID vboxWddmHTableIterNext(PVBOXWDDM_HTABLE_ITERATOR pIter, VBOXWDDM_HANDLE *phHandle);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncBOOL vboxWddmHTableIterHasNext(PVBOXWDDM_HTABLE_ITERATOR pIter);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncPVOID vboxWddmHTableIterRemoveCur(PVBOXWDDM_HTABLE_ITERATOR pIter);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncNTSTATUS vboxWddmHTableCreate(PVBOXWDDM_HTABLE pTbl, uint32_t cSize);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncVOID vboxWddmHTableDestroy(PVBOXWDDM_HTABLE pTbl);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncNTSTATUS vboxWddmHTableRealloc(PVBOXWDDM_HTABLE pTbl, uint32_t cNewSize);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncVBOXWDDM_HANDLE vboxWddmHTablePut(PVBOXWDDM_HTABLE pTbl, PVOID pvData);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncPVOID vboxWddmHTableRemove(PVBOXWDDM_HTABLE pTbl, VBOXWDDM_HANDLE hHandle);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncPVOID vboxWddmHTableGet(PVBOXWDDM_HTABLE pTbl, VBOXWDDM_HANDLE hHandle);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncPVBOXWDDM_SWAPCHAIN vboxWddmSwapchainCreate();
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncDECLINLINE(BOOLEAN) vboxWddmSwapchainRetain(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SWAPCHAIN pSwapchain);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncDECLINLINE(VOID) vboxWddmSwapchainRelease(PVBOXWDDM_SWAPCHAIN pSwapchain);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncPVBOXWDDM_SWAPCHAIN vboxWddmSwapchainRetainByAlloc(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pAlloc);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncVOID vboxWddmSwapchainAllocRemove(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SWAPCHAIN pSwapchain, PVBOXWDDM_ALLOCATION pAlloc);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncBOOLEAN vboxWddmSwapchainAllocAdd(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SWAPCHAIN pSwapchain, PVBOXWDDM_ALLOCATION pAlloc);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncVOID vboxWddmSwapchainAllocRemoveAll(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SWAPCHAIN pSwapchain);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncVOID vboxWddmSwapchainDestroy(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SWAPCHAIN pSwapchain);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncVOID vboxWddmSwapchainCtxDestroyAll(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncNTSTATUS vboxWddmSwapchainCtxEscape(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext, PVBOXDISPIFESCAPE_SWAPCHAININFO pSwapchainInfo, UINT cbSize);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncNTSTATUS vboxWddmSwapchainCtxInit(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncVOID vboxWddmSwapchainCtxTerm(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncNTSTATUS vboxWddmRegQueryDisplaySettingsKeyName(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId,
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync ULONG cbBuf, PWCHAR pBuf, PULONG pcbResult);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncNTSTATUS vboxWddmRegOpenDisplaySettingsKey(IN PVBOXMP_DEVEXT pDeviceExtension, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, OUT PHANDLE phKey);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncNTSTATUS vboxWddmRegDisplaySettingsQueryRelX(HANDLE hKey, int * pResult);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncNTSTATUS vboxWddmRegDisplaySettingsQueryRelY(HANDLE hKey, int * pResult);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncNTSTATUS vboxWddmDisplaySettingsQueryPos(IN PVBOXMP_DEVEXT pDeviceExtension, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, POINT * pPos);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncNTSTATUS vboxWddmRegQueryVideoGuidString(ULONG cbBuf, PWCHAR pBuf, PULONG pcbResult);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncNTSTATUS vboxWddmRegQueryDrvKeyName(PVBOXMP_DEVEXT pDevExt, ULONG cbBuf, PWCHAR pBuf, PULONG pcbResult);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncNTSTATUS vboxWddmRegOpenKey(OUT PHANDLE phKey, IN PWCHAR pName, IN ACCESS_MASK fAccess);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncNTSTATUS vboxWddmRegQueryValueDword(IN HANDLE hKey, IN PWCHAR pName, OUT PDWORD pDword);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncNTSTATUS vboxWddmRegSetValueDword(IN HANDLE hKey, IN PWCHAR pName, OUT DWORD val);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncUNICODE_STRING* vboxWddmVGuidGet(PVBOXMP_DEVEXT pDevExt);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncVOID vboxWddmVGuidFree(PVBOXMP_DEVEXT pDevExt);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync#define VBOXWDDM_MM_VOID 0xffffffffUL
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsynctypedef struct VBOXWDDM_MM
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync{
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync RTL_BITMAP BitMap;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync UINT cPages;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync UINT cAllocs;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync PULONG pBuffer;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync} VBOXWDDM_MM, *PVBOXWDDM_MM;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncNTSTATUS vboxMmInit(PVBOXWDDM_MM pMm, UINT cPages);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncULONG vboxMmAlloc(PVBOXWDDM_MM pMm, UINT cPages);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncVOID vboxMmFree(PVBOXWDDM_MM pMm, UINT iPage, UINT cPages);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsyncNTSTATUS vboxMmTerm(PVBOXWDDM_MM pMm);
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsynctypedef struct VBOXVIDEOCM_ALLOC_MGR
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync{
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync /* synch lock */
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync FAST_MUTEX Mutex;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync VBOXWDDM_HTABLE AllocTable;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync VBOXWDDM_MM Mm;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync// PHYSICAL_ADDRESS PhData;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync uint8_t *pvData;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync uint32_t offData;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync uint32_t cbData;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync} VBOXVIDEOCM_ALLOC_MGR, *PVBOXVIDEOCM_ALLOC_MGR;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsynctypedef struct VBOXVIDEOCM_ALLOC_CONTEXT
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync{
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync PVBOXVIDEOCM_ALLOC_MGR pMgr;
a3f3701cea1ba388e7c877955252bb7375eedebdvboxsync /* synch lock */
FAST_MUTEX Mutex;
VBOXWDDM_HTABLE AllocTable;
} VBOXVIDEOCM_ALLOC_CONTEXT, *PVBOXVIDEOCM_ALLOC_CONTEXT;
NTSTATUS vboxVideoAMgrCreate(PVBOXMP_DEVEXT pDevExt, PVBOXVIDEOCM_ALLOC_MGR pMgr, uint32_t offData, uint32_t cbData);
NTSTATUS vboxVideoAMgrDestroy(PVBOXMP_DEVEXT pDevExt, PVBOXVIDEOCM_ALLOC_MGR pMgr);
NTSTATUS vboxVideoAMgrCtxCreate(PVBOXVIDEOCM_ALLOC_MGR pMgr, PVBOXVIDEOCM_ALLOC_CONTEXT pCtx);
NTSTATUS vboxVideoAMgrCtxDestroy(PVBOXVIDEOCM_ALLOC_CONTEXT pCtx);
NTSTATUS vboxVideoAMgrCtxAllocCreate(PVBOXVIDEOCM_ALLOC_CONTEXT pContext, PVBOXVIDEOCM_UM_ALLOC pUmAlloc);
NTSTATUS vboxVideoAMgrCtxAllocDestroy(PVBOXVIDEOCM_ALLOC_CONTEXT pContext, VBOXDISP_KMHANDLE hSesionHandle);
#ifdef VBOX_WITH_CRHGSMI
NTSTATUS vboxVideoAMgrCtxAllocSubmit(PVBOXMP_DEVEXT pDevExt, PVBOXVIDEOCM_ALLOC_CONTEXT pContext, UINT cBuffers, VBOXWDDM_UHGSMI_BUFFER_UI_INFO_ESCAPE *paBuffers);
#endif
#endif /* #ifndef ___VBoxMPMisc_h__ */