VBoxMPDevExt.h revision 4c98b8b05f3783351cf256cc90cd4478fb28b62b
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync/* $Id$ */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync/** @file
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * VBox Miniport device extension header
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
c58f1213e628a545081c70e26c6b67a841cff880vboxsync/*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * Copyright (C) 2011 Oracle Corporation
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync *
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * available from http://www.virtualbox.org. This file is free software;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * you can redistribute it and/or modify it under the terms of the GNU
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * General Public License (GPL) as published by the Free Software
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#ifndef VBOXMPDEVEXT_H
c4bfe32373c55416bf49dc29ebf45dfa560b4692vboxsync#define VBOXMPDEVEXT_H
2cb8d6f5cd0c9bf435c2d3fadd9ad873590e384bvboxsync
c4bfe32373c55416bf49dc29ebf45dfa560b4692vboxsync#include "VBoxMPUtils.h"
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#include <VBox/VBoxVideoGuest.h>
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#ifdef VBOX_XPDM_MINIPORT
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync# include <miniport.h>
61f058cfcc81ec889fc17ac84c25a118a91d1423vboxsync# include <ntddvdeo.h>
90fd0059d671978f9db54fab8d5daa3635a4b25avboxsync# include <video.h>
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync# include "common/xpdm/VBoxVideoPortAPI.h"
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync#ifdef VBOX_WDDM_MINIPORT
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync# include "wddm/VBoxMPTypes.h"
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync#endif
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsynctypedef struct VBOXMP_COMMON
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync int cDisplays; /* Number of displays. */
7cfcbe810de5334cdc2e8b92e77db705da143adavboxsync
7cfcbe810de5334cdc2e8b92e77db705da143adavboxsync uint32_t cbVRAM; /* The VRAM size. */
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync PHYSICAL_ADDRESS phVRAM; /* Physical VRAM base. */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync ULONG ulApertureSize; /* Size of the LFB aperture (>= VRAM size). */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync uint32_t cbMiniportHeap; /* The size of reserved VRAM for miniport driver heap.
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * It is at offset:
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * cbAdapterMemorySize - VBOX_VIDEO_ADAPTER_INFORMATION_SIZE - cbMiniportHeap
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync void *pvMiniportHeap; /* The pointer to the miniport heap VRAM.
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * This is mapped by miniport separately.
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync void *pvAdapterInformation; /* The pointer to the last 4K of VRAM.
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * This is mapped by miniport separately.
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync /** Whether HGSMI is enabled. */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync bool bHGSMI;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync /** Context information needed to receive commands from the host. */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync HGSMIHOSTCOMMANDCONTEXT hostCtx;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync /** Context information needed to submit commands to the host. */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync HGSMIGUESTCOMMANDCONTEXT guestCtx;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync} VBOXMP_COMMON, *PVBOXMP_COMMON;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsynctypedef struct _VBOXMP_DEVEXT
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync{
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync struct _VBOXMP_DEVEXT *pNext; /* Next extension in the DualView extension list.
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * The primary extension is the first one.
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync#ifdef VBOX_XPDM_MINIPORT
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync struct _VBOXMP_DEVEXT *pPrimary; /* Pointer to the primary device extension. */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync ULONG iDevice; /* Device index: 0 for primary, otherwise a secondary device. */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync ULONG CurrentMode; /* Saved information about video modes */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync ULONG CurrentModeWidth;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync ULONG CurrentModeHeight;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync ULONG CurrentModeBPP;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync ULONG ulFrameBufferOffset; /* The framebuffer position in the VRAM. */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync ULONG ulFrameBufferSize; /* The size of the current framebuffer. */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync#endif /*VBOX_XPDM_MINIPORT*/
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync#ifdef VBOX_WDDM_MINIPORT
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync PDEVICE_OBJECT pPDO;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync UNICODE_STRING RegKeyName;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync UNICODE_STRING VideoGuid;
730f8be51b729e8a3c1e32c756cd0f4ec088dd4dvboxsync
abb9f29bd46d8a8bab57155229f583db28b18f8dvboxsync uint8_t * pvVisibleVram;
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync VBOXVIDEOCM_MGR CmMgr;
730f8be51b729e8a3c1e32c756cd0f4ec088dd4dvboxsync /* hgsmi allocation manager */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync VBOXVIDEOCM_ALLOC_MGR AllocMgr;
77db08a24f69bca943d5abc40b1930ee97f593edvboxsync VBOXVDMADDI_NODE aNodes[VBOXWDDM_NUM_NODES];
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync LIST_ENTRY DpcCmdQueue;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync LIST_ENTRY SwapchainList3D;
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync /* mutex for context list operations */
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync FAST_MUTEX ContextMutex;
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync KSPIN_LOCK SynchLock;
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync volatile uint32_t cContexts3D;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync volatile uint32_t cUnlockedVBVADisabled;
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync HVBOXCRCTL hCrCtl;
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync uint32_t cCrCtlRefs;
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync VBOXWDDM_GLOBAL_POINTER_INFO PointerInfo;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync VBOXVTLIST CtlList;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync VBOXVTLIST DmaCmdList;
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync#ifdef VBOX_WITH_VIDEOHWACCEL
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync VBOXVTLIST VhwaCmdList;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync BOOL bNotifyDxDpc;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#if 0
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync FAST_MUTEX ShRcTreeMutex;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync AVLPVTREE ShRcTree;
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync VBOXWDDM_SOURCE aSources[VBOX_VIDEO_MAX_SCREENS];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync VBOXWDDM_TARGET aTargets[VBOX_VIDEO_MAX_SCREENS];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif /*VBOX_WDDM_MINIPORT*/
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync union {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Information that is only relevant to the primary device or is the same for all devices. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync struct {
aa131431882ca8e44b0480d4af0b5d139f1bde21vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync void *pvReqFlush; /* Pointer to preallocated generic request structure for
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * VMMDevReq_VideoAccelFlush. Allocated when VBVA status
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * is changed. Deallocated on HwReset.
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync ULONG ulVbvaEnabled; /* Indicates that VBVA mode is enabled. */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync ULONG ulMaxFrameBufferSize; /* The size of the VRAM allocated for the a single framebuffer. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync BOOLEAN fMouseHidden; /* Has the mouse cursor been hidden by the guest? */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync VBOXMP_COMMON commonInfo;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync#ifdef VBOX_XPDM_MINIPORT
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync /* Video Port API dynamically picked up at runtime for binary backwards compatibility with older NT versions */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync VBOXVIDEOPORTPROCS VideoPortProcs;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#ifdef VBOX_WDDM_MINIPORT
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync VBOXVDMAINFO Vdma;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync# ifdef VBOXVDMA_WITH_VBVA
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync VBOXVBVAINFO Vbva;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync# endif
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync D3DKMDT_HVIDPN hCommittedVidPn; /* committed VidPn handle */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DXGKRNL_INTERFACE DxgkInterface; /* Display Port handle and callbacks */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync } primary;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync /* Secondary device information. */
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync struct {
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync BOOLEAN bEnabled; /* Device enabled flag */
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync } secondary;
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync } u;
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync HGSMIAREA areaDisplay; /* Entire VRAM chunk for this display device. */
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync BOOLEAN fAnyX; /* Unrestricted horizontal resolution flag. */
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync} VBOXMP_DEVEXT, *PVBOXMP_DEVEXT;
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsyncDECLINLINE(PVBOXMP_DEVEXT) VBoxCommonToPrimaryExt(PVBOXMP_COMMON pCommon)
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync{
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync return RT_FROM_MEMBER(pCommon, VBOXMP_DEVEXT, u.primary.commonInfo);
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncDECLINLINE(PVBOXMP_COMMON) VBoxCommonFromDeviceExt(PVBOXMP_DEVEXT pExt)
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync{
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync#ifdef VBOX_XPDM_MINIPORT
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync return &pExt->pPrimary->u.primary.commonInfo;
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync#else
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync return &pExt->u.primary.commonInfo;
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync#endif
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync}
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync#ifdef VBOX_WDDM_MINIPORT
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsyncDECLINLINE(ULONG) vboxWddmVramCpuVisibleSize(PVBOXMP_DEVEXT pDevExt)
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync{
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync#ifdef VBOXWDDM_RENDER_FROM_SHADOW
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync /* all memory layout info should be initialized */
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync Assert(pDevExt->aSources[0].Vbva.offVBVA);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync /* page aligned */
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync Assert(!(pDevExt->aSources[0].Vbva.offVBVA & 0xfff));
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync return (ULONG)(pDevExt->aSources[0].Vbva.offVBVA & ~0xfffULL);
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync#else
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync /* all memory layout info should be initialized */
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync Assert(pDevExt->u.primary.Vdma.CmdHeap.Heap.area.offBase);
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync /* page aligned */
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync Assert(!(pDevExt->u.primary.Vdma.CmdHeap.Heap.area.offBase & 0xfff));
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync return pDevExt->u.primary.Vdma.CmdHeap.Heap.area.offBase & ~0xfffUL;
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync#endif
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncDECLINLINE(ULONG) vboxWddmVramCpuVisibleSegmentSize(PVBOXMP_DEVEXT pDevExt)
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync{
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync return vboxWddmVramCpuVisibleSize(pDevExt);
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync}
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync#ifdef VBOXWDDM_RENDER_FROM_SHADOW
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsyncDECLINLINE(ULONG) vboxWddmVramCpuInvisibleSegmentSize(PVBOXMP_DEVEXT pDevExt)
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync{
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync return vboxWddmVramCpuVisibleSegmentSize(pDevExt);
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync}
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsyncDECLINLINE(bool) vboxWddmCmpSurfDescsBase(VBOXWDDM_SURFACE_DESC *pDesc1, VBOXWDDM_SURFACE_DESC *pDesc2)
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync{
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync if (pDesc1->width != pDesc2->width)
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync return false;
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync if (pDesc1->height != pDesc2->height)
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync return false;
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync if (pDesc1->format != pDesc2->format)
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync return false;
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync if (pDesc1->bpp != pDesc2->bpp)
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync return false;
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync if (pDesc1->pitch != pDesc2->pitch)
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync return false;
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync return true;
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync}
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncDECLINLINE(void) vboxWddmAssignShadow(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, PVBOXWDDM_ALLOCATION pAllocation, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync{
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync if (pSource->pShadowAllocation == pAllocation)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync {
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync Assert(pAllocation->bAssigned);
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync return;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync }
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync if (pSource->pShadowAllocation)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync {
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync PVBOXWDDM_ALLOCATION pOldAlloc = pSource->pShadowAllocation;
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync /* clear the visibility info fo the current primary */
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pOldAlloc->bVisible = FALSE;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pOldAlloc->bAssigned = FALSE;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync Assert(pOldAlloc->SurfDesc.VidPnSourceId == srcId);
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync /* release the shadow surface */
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pOldAlloc->SurfDesc.VidPnSourceId = D3DDDI_ID_UNINITIALIZED;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync }
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync if (pAllocation)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync {
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync Assert(!pAllocation->bAssigned);
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync Assert(!pAllocation->bVisible);
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pAllocation->bVisible = FALSE;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync /* this check ensures the shadow is not used for other source simultaneously */
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync Assert(pAllocation->SurfDesc.VidPnSourceId == D3DDDI_ID_UNINITIALIZED);
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pAllocation->SurfDesc.VidPnSourceId = srcId;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pAllocation->bAssigned = TRUE;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync if (!vboxWddmCmpSurfDescsBase(&pSource->SurfDesc, &pAllocation->SurfDesc))
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pSource->offVram = VBOXVIDEOOFFSET_VOID; /* force guest->host notification */
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pSource->SurfDesc = pAllocation->SurfDesc;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync }
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pSource->pShadowAllocation = pAllocation;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync}
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync#endif
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsyncDECLINLINE(VOID) vboxWddmAssignPrimary(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, PVBOXWDDM_ALLOCATION pAllocation, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync{
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync if (pSource->pPrimaryAllocation == pAllocation)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync return;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync if (pSource->pPrimaryAllocation)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync {
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync PVBOXWDDM_ALLOCATION pOldAlloc = pSource->pPrimaryAllocation;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync /* clear the visibility info fo the current primary */
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pOldAlloc->bVisible = FALSE;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pOldAlloc->bAssigned = FALSE;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync Assert(pOldAlloc->SurfDesc.VidPnSourceId == srcId);
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync }
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync if (pAllocation)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync {
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pAllocation->bVisible = FALSE;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync Assert(pAllocation->SurfDesc.VidPnSourceId == srcId);
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pAllocation->SurfDesc.VidPnSourceId = srcId;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pAllocation->bAssigned = TRUE;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync }
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pSource->pPrimaryAllocation = pAllocation;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync}
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync#endif /*VBOX_WDDM_MINIPORT*/
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync#endif /*VBOXMPDEVEXT_H*/
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync