VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.h@ 42083

Last change on this file since 42083 was 42083, checked in by vboxsync, 13 years ago

wddm/d-o: assertion bugfix

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.6 KB
Line 
1/* $Id: VBoxMPWddm.h 42083 2012-07-10 09:53:08Z vboxsync $ */
2/** @file
3 * VBox WDDM Miniport driver
4 */
5
6/*
7 * Copyright (C) 2011 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#ifndef ___VBoxMPWddm_h___
19#define ___VBoxMPWddm_h___
20
21#ifndef DEBUG_misha
22# ifdef Assert
23# error "VBoxMPWddm.h must be included first."
24# endif
25# define RT_NO_STRICT
26#endif
27#include "common/VBoxMPUtils.h"
28#include "common/VBoxMPDevExt.h"
29#include "../../common/VBoxVideoTools.h"
30
31//#define VBOXWDDM_DEBUG_VIDPN
32
33#define VBOXWDDM_CFG_LOG_UM_BACKDOOR 0x00000001
34#define VBOXWDDM_CFG_LOG_UM_DBGPRINT 0x00000002
35#define VBOXWDDM_CFG_STR_LOG_UM L"VBoxLogUm"
36extern DWORD g_VBoxLogUm;
37extern DWORD g_VBoxDisplayOnly;
38
39RT_C_DECLS_BEGIN
40NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
41RT_C_DECLS_END
42
43PVOID vboxWddmMemAlloc(IN SIZE_T cbSize);
44PVOID vboxWddmMemAllocZero(IN SIZE_T cbSize);
45VOID vboxWddmMemFree(PVOID pvMem);
46
47NTSTATUS vboxWddmCallIsr(PVBOXMP_DEVEXT pDevExt);
48
49DECLINLINE(PVBOXWDDM_RESOURCE) vboxWddmResourceForAlloc(PVBOXWDDM_ALLOCATION pAlloc)
50{
51#if 0
52 if(pAlloc->iIndex == VBOXWDDM_ALLOCATIONINDEX_VOID)
53 return NULL;
54 PVBOXWDDM_RESOURCE pRc = (PVBOXWDDM_RESOURCE)(((uint8_t*)pAlloc) - RT_OFFSETOF(VBOXWDDM_RESOURCE, aAllocations[pAlloc->iIndex]));
55 return pRc;
56#else
57 return pAlloc->pResource;
58#endif
59}
60
61VOID vboxWddmAllocationDestroy(PVBOXWDDM_ALLOCATION pAllocation);
62
63DECLINLINE(VOID) vboxWddmAllocationRelease(PVBOXWDDM_ALLOCATION pAllocation)
64{
65 uint32_t cRefs = ASMAtomicDecU32(&pAllocation->cRefs);
66 Assert(cRefs < UINT32_MAX/2);
67 if (!cRefs)
68 {
69 vboxWddmAllocationDestroy(pAllocation);
70 }
71}
72
73DECLINLINE(VOID) vboxWddmAllocationRetain(PVBOXWDDM_ALLOCATION pAllocation)
74{
75 ASMAtomicIncU32(&pAllocation->cRefs);
76}
77
78DECLINLINE(VOID) vboxWddmAddrSetVram(PVBOXWDDM_ADDR pAddr, UINT SegmentId, VBOXVIDEOOFFSET offVram)
79{
80 pAddr->SegmentId = SegmentId;
81 pAddr->offVram = offVram;
82}
83
84DECLINLINE(bool) vboxWddmAddrVramEqual(PVBOXWDDM_ADDR pAddr1, PVBOXWDDM_ADDR pAddr2)
85{
86 return pAddr1->SegmentId == pAddr2->SegmentId && pAddr1->offVram == pAddr2->offVram;
87}
88
89DECLINLINE(VBOXVIDEOOFFSET) vboxWddmVramAddrToOffset(PVBOXMP_DEVEXT pDevExt, PHYSICAL_ADDRESS Addr)
90{
91 PVBOXMP_COMMON pCommon = VBoxCommonFromDeviceExt(pDevExt);
92 AssertRelease(pCommon->phVRAM.QuadPart <= Addr.QuadPart);
93 return (VBOXVIDEOOFFSET)Addr.QuadPart - pCommon->phVRAM.QuadPart;
94}
95
96#ifdef VBOXWDDM_RENDER_FROM_SHADOW
97DECLINLINE(void) vboxWddmAssignShadow(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, PVBOXWDDM_ALLOCATION pAllocation, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
98{
99 if (pSource->pShadowAllocation == pAllocation)
100 {
101 Assert(pAllocation->bAssigned);
102 return;
103 }
104
105 if (pSource->pShadowAllocation)
106 {
107 PVBOXWDDM_ALLOCATION pOldAlloc = pSource->pShadowAllocation;
108 /* clear the visibility info fo the current primary */
109 pOldAlloc->bVisible = FALSE;
110 pOldAlloc->bAssigned = FALSE;
111 Assert(pOldAlloc->AllocData.SurfDesc.VidPnSourceId == srcId);
112 /* release the shadow surface */
113 pOldAlloc->AllocData.SurfDesc.VidPnSourceId = D3DDDI_ID_UNINITIALIZED;
114 }
115
116 if (pAllocation)
117 {
118 Assert(!pAllocation->bAssigned);
119 Assert(!pAllocation->bVisible);
120 pAllocation->bVisible = FALSE;
121 /* this check ensures the shadow is not used for other source simultaneously */
122 Assert(pAllocation->AllocData.SurfDesc.VidPnSourceId == D3DDDI_ID_UNINITIALIZED);
123 pAllocation->AllocData.SurfDesc.VidPnSourceId = srcId;
124 pAllocation->bAssigned = TRUE;
125 if(!vboxWddmAddrVramEqual(&pSource->AllocData.Addr, &pAllocation->AllocData.Addr))
126 pSource->bGhSynced = FALSE; /* force guest->host notification */
127 pSource->AllocData.Addr = pAllocation->AllocData.Addr;
128 }
129
130 pSource->pShadowAllocation = pAllocation;
131}
132#endif
133
134DECLINLINE(VOID) vboxWddmAssignPrimary(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, PVBOXWDDM_ALLOCATION pAllocation, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
135{
136 /* vboxWddmAssignPrimary can not be run in reentrant order, so safely do a direct unlocked check here */
137 if (pSource->pPrimaryAllocation == pAllocation)
138 return;
139
140 if (pSource->pPrimaryAllocation)
141 {
142 PVBOXWDDM_ALLOCATION pOldAlloc = pSource->pPrimaryAllocation;
143 /* clear the visibility info fo the current primary */
144 pOldAlloc->bVisible = FALSE;
145 pOldAlloc->bAssigned = FALSE;
146 Assert(pOldAlloc->AllocData.SurfDesc.VidPnSourceId == srcId);
147
148 vboxWddmAllocationRelease(pOldAlloc);
149 }
150
151 if (pAllocation)
152 {
153 pAllocation->bVisible = FALSE;
154 Assert(pAllocation->AllocData.SurfDesc.VidPnSourceId == srcId);
155 pAllocation->bAssigned = TRUE;
156
157 if(!vboxWddmAddrVramEqual(&pSource->AllocData.Addr, &pAllocation->AllocData.Addr))
158 pSource->bGhSynced = FALSE; /* force guest->host notification */
159 pSource->AllocData.Addr = pAllocation->AllocData.Addr;
160
161 vboxWddmAllocationRetain(pAllocation);
162 }
163
164 KIRQL OldIrql;
165 KeAcquireSpinLock(&pSource->AllocationLock, &OldIrql);
166 pSource->pPrimaryAllocation = pAllocation;
167 KeReleaseSpinLock(&pSource->AllocationLock, OldIrql);
168}
169
170DECLINLINE(PVBOXWDDM_ALLOCATION) vboxWddmAquirePrimary(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
171{
172 PVBOXWDDM_ALLOCATION pPrimary;
173 KIRQL OldIrql;
174 KeAcquireSpinLock(&pSource->AllocationLock, &OldIrql);
175 pPrimary = pSource->pPrimaryAllocation;
176 if (pPrimary)
177 vboxWddmAllocationRetain(pPrimary);
178 KeReleaseSpinLock(&pSource->AllocationLock, OldIrql);
179 return pPrimary;
180}
181
182#define VBOXWDDMENTRY_2_SWAPCHAIN(_pE) ((PVBOXWDDM_SWAPCHAIN)((uint8_t*)(_pE) - RT_OFFSETOF(VBOXWDDM_SWAPCHAIN, DevExtListEntry)))
183
184#ifdef VBOXWDDM_RENDER_FROM_SHADOW
185# ifdef VBOX_WDDM_WIN8
186# define VBOXWDDM_FB_ALLOCATION(_pDevExt, _pSrc) ( (g_VBoxDisplayOnly || (_pDevExt)->fRenderToShadowDisabled) ? (_pSrc)->pPrimaryAllocation : (_pSrc)->pShadowAllocation)
187# else
188# define VBOXWDDM_FB_ALLOCATION(_pDevExt, _pSrc) ((_pDevExt)->fRenderToShadowDisabled ? (_pSrc)->pPrimaryAllocation : (_pSrc)->pShadowAllocation)
189# endif
190#else
191# define VBOXWDDM_FB_ALLOCATION(_pDevExt, _pSrc) ((_pSrc)->pPrimaryAllocation)
192#endif
193
194#endif /* #ifndef ___VBoxMPWddm_h___ */
195
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette