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