9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* $Id$ */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** @file
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VBox WDDM Miniport driver
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#ifndef ___VBoxMPShgsmi_h___
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define ___VBoxMPShgsmi_h___
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/cdefs.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <VBox/VBoxVideo.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsync#include "common/VBoxMPUtils.h"
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsync
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsynctypedef struct VBOXSHGSMI
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsync{
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsync KSPIN_LOCK HeapLock;
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsync HGSMIHEAP Heap;
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsync} VBOXSHGSMI, *PVBOXSHGSMI;
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsync
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsynctypedef DECLCALLBACK(void) FNVBOXSHGSMICMDCOMPLETION(PVBOXSHGSMI pHeap, void *pvCmd, void *pvContext);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef FNVBOXSHGSMICMDCOMPLETION *PFNVBOXSHGSMICMDCOMPLETION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
d9fec6d329252f6e5eb8f564690e582b2aea6624vboxsynctypedef DECLCALLBACK(PFNVBOXSHGSMICMDCOMPLETION) FNVBOXSHGSMICMDCOMPLETION_IRQ(PVBOXSHGSMI pHeap, void *pvCmd, void *pvContext, void **ppvCompletion);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef FNVBOXSHGSMICMDCOMPLETION_IRQ *PFNVBOXSHGSMICMDCOMPLETION_IRQ;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsyncconst VBOXSHGSMIHEADER* VBoxSHGSMICommandPrepAsynchEvent(PVBOXSHGSMI pHeap, PVOID pvBuff, RTSEMEVENT hEventSem);
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsyncconst VBOXSHGSMIHEADER* VBoxSHGSMICommandPrepSynch(PVBOXSHGSMI pHeap, PVOID pCmd);
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsyncconst VBOXSHGSMIHEADER* VBoxSHGSMICommandPrepAsynch(PVBOXSHGSMI pHeap, PVOID pvBuff, PFNVBOXSHGSMICMDCOMPLETION pfnCompletion, PVOID pvCompletion, uint32_t fFlags);
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsyncconst VBOXSHGSMIHEADER* VBoxSHGSMICommandPrepAsynchIrq(PVBOXSHGSMI pHeap, PVOID pvBuff, PFNVBOXSHGSMICMDCOMPLETION_IRQ pfnCompletion, PVOID pvCompletion, uint32_t fFlags);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsyncvoid VBoxSHGSMICommandDoneAsynch(PVBOXSHGSMI pHeap, const VBOXSHGSMIHEADER* pHeader);
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsyncint VBoxSHGSMICommandDoneSynch(PVBOXSHGSMI pHeap, const VBOXSHGSMIHEADER* pHeader);
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsyncvoid VBoxSHGSMICommandCancelAsynch(PVBOXSHGSMI pHeap, const VBOXSHGSMIHEADER* pHeader);
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsyncvoid VBoxSHGSMICommandCancelSynch(PVBOXSHGSMI pHeap, const VBOXSHGSMIHEADER* pHeader);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsyncDECLINLINE(HGSMIOFFSET) VBoxSHGSMICommandOffset(const PVBOXSHGSMI pHeap, const VBOXSHGSMIHEADER* pHeader)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsync return HGSMIHeapBufferOffset(&pHeap->Heap, (void*)pHeader);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync/* allows getting VRAM offset of arbitrary pointer within the SHGSMI command
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync * if invalid pointer is passed in, behavior is undefined */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsyncDECLINLINE(HGSMIOFFSET) VBoxSHGSMICommandPtrOffset(const PVBOXSHGSMI pHeap, const void * pvPtr)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync{
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync return HGSMIPointerToOffset (&pHeap->Heap.area, (const HGSMIBUFFERHEADER *)pvPtr);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync}
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
32b1164f35483be483177be7b5235002a4a5afbevboxsyncint VBoxSHGSMIInit(PVBOXSHGSMI pHeap, uint32_t u32HeapType, void *pvBase, HGSMISIZE cbArea, HGSMIOFFSET offBase, const HGSMIENV *pEnv);
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsyncvoid VBoxSHGSMITerm(PVBOXSHGSMI pHeap);
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsyncvoid* VBoxSHGSMIHeapAlloc(PVBOXSHGSMI pHeap, HGSMISIZE cbData, uint8_t u8Channel, uint16_t u16ChannelInfo);
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsyncvoid VBoxSHGSMIHeapFree(PVBOXSHGSMI pHeap, void *pvBuffer);
d0a71f63bd810b54e0359223fe53b07730154dc5vboxsyncvoid* VBoxSHGSMIHeapBufferAlloc(PVBOXSHGSMI pHeap, HGSMISIZE cbData);
d0a71f63bd810b54e0359223fe53b07730154dc5vboxsyncvoid VBoxSHGSMIHeapBufferFree(PVBOXSHGSMI pHeap, void *pvBuffer);
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsyncvoid* VBoxSHGSMICommandAlloc(PVBOXSHGSMI pHeap, HGSMISIZE cbData, uint8_t u8Channel, uint16_t u16ChannelInfo);
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsyncvoid VBoxSHGSMICommandFree(PVBOXSHGSMI pHeap, void *pvBuffer);
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsyncint VBoxSHGSMICommandProcessCompletion(PVBOXSHGSMI pHeap, VBOXSHGSMIHEADER* pCmd, bool bIrq, struct VBOXVTLIST * pPostProcessList);
dc959f60f6d3e0cba86f7da4d39aa475913a7e10vboxsyncint VBoxSHGSMICommandPostprocessCompletion(PVBOXSHGSMI pHeap, struct VBOXVTLIST * pPostProcessList);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif /* #ifndef ___VBoxMPShgsmi_h___ */