VirtualBox

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

Last change on this file since 50542 was 49591, checked in by vboxsync, 11 years ago

wddm: more on new comand mechanism, guest side almost done, some cleanup

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.1 KB
Line 
1/* $Id: VBoxMPWddm.h 49591 2013-11-20 17:53:55Z vboxsync $ */
2/** @file
3 * VBox WDDM Miniport driver
4 */
5
6/*
7 * Copyright (C) 2011-2013 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#ifdef VBOX_WDDM_WIN8
22# define VBOX_WDDM_DRIVERNAME L"VBoxVideoW8"
23#else
24# define VBOX_WDDM_DRIVERNAME L"VBoxVideoWddm"
25#endif
26
27#ifndef DEBUG_misha
28# ifdef Assert
29# error "VBoxMPWddm.h must be included first."
30# endif
31# define RT_NO_STRICT
32#endif
33#include "common/VBoxMPUtils.h"
34#include "common/VBoxMPDevExt.h"
35#include "../../common/VBoxVideoTools.h"
36
37//#define VBOXWDDM_DEBUG_VIDPN
38
39#define VBOXWDDM_CFG_DRV_DEFAULT 0
40#define VBOXWDDM_CFG_DRV_SECONDARY_TARGETS_CONNECTED 1
41
42#define VBOXWDDM_CFG_DRVTARGET_CONNECTED 1
43
44#define VBOXWDDM_CFG_LOG_UM_BACKDOOR 0x00000001
45#define VBOXWDDM_CFG_LOG_UM_DBGPRINT 0x00000002
46#define VBOXWDDM_CFG_STR_LOG_UM L"VBoxLogUm"
47
48#define VBOXWDDM_REG_DRV_FLAGS_NAME L"VBoxFlags"
49#define VBOXWDDM_REG_DRV_DISPFLAGS_PREFIX L"VBoxDispFlags"
50
51#define VBOXWDDM_REG_DRVKEY_PREFIX L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Class\\"
52
53#define VBOXWDDM_REG_DISPLAYSETTINGSVIDEOKEY L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Video\\"
54#define VBOXWDDM_REG_DISPLAYSETTINGSVIDEOKEY_SUBKEY L"\\Video"
55
56
57#define VBOXWDDM_REG_DISPLAYSETTINGSKEY_PREFIX_VISTA L"\\Registry\\Machine\\System\\CurrentControlSet\\Hardware Profiles\\Current\\System\\CurrentControlSet\\Control\\VIDEO\\"
58#define VBOXWDDM_REG_DISPLAYSETTINGSKEY_PREFIX_WIN7 L"\\Registry\\Machine\\System\\CurrentControlSet\\Hardware Profiles\\UnitedVideo\\CONTROL\\VIDEO\\"
59
60#define VBOXWDDM_REG_DISPLAYSETTINGS_ATTACH_RELX L"Attach.RelativeX"
61#define VBOXWDDM_REG_DISPLAYSETTINGS_ATTACH_RELY L"Attach.RelativeY"
62#define VBOXWDDM_REG_DISPLAYSETTINGS_ATTACH_DESKTOP L"Attach.ToDesktop"
63
64extern DWORD g_VBoxLogUm;
65
66RT_C_DECLS_BEGIN
67NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
68RT_C_DECLS_END
69
70PVOID vboxWddmMemAlloc(IN SIZE_T cbSize);
71PVOID vboxWddmMemAllocZero(IN SIZE_T cbSize);
72VOID vboxWddmMemFree(PVOID pvMem);
73
74NTSTATUS vboxWddmCallIsr(PVBOXMP_DEVEXT pDevExt);
75
76DECLINLINE(PVBOXWDDM_RESOURCE) vboxWddmResourceForAlloc(PVBOXWDDM_ALLOCATION pAlloc)
77{
78#if 0
79 if(pAlloc->iIndex == VBOXWDDM_ALLOCATIONINDEX_VOID)
80 return NULL;
81 PVBOXWDDM_RESOURCE pRc = (PVBOXWDDM_RESOURCE)(((uint8_t*)pAlloc) - RT_OFFSETOF(VBOXWDDM_RESOURCE, aAllocations[pAlloc->iIndex]));
82 return pRc;
83#else
84 return pAlloc->pResource;
85#endif
86}
87
88VOID vboxWddmAllocationDestroy(PVBOXWDDM_ALLOCATION pAllocation);
89
90DECLINLINE(VOID) vboxWddmAllocationRelease(PVBOXWDDM_ALLOCATION pAllocation)
91{
92 uint32_t cRefs = ASMAtomicDecU32(&pAllocation->cRefs);
93 Assert(cRefs < UINT32_MAX/2);
94 if (!cRefs)
95 {
96 vboxWddmAllocationDestroy(pAllocation);
97 }
98}
99
100DECLINLINE(VOID) vboxWddmAllocationRetain(PVBOXWDDM_ALLOCATION pAllocation)
101{
102 ASMAtomicIncU32(&pAllocation->cRefs);
103}
104
105DECLINLINE(BOOLEAN) vboxWddmAddrSetVram(PVBOXWDDM_ADDR pAddr, UINT SegmentId, VBOXVIDEOOFFSET offVram)
106{
107 if (pAddr->SegmentId == SegmentId && pAddr->offVram == offVram)
108 return FALSE;
109
110 pAddr->SegmentId = SegmentId;
111 pAddr->offVram = offVram;
112 return TRUE;
113}
114
115DECLINLINE(bool) vboxWddmAddrVramEqual(PVBOXWDDM_ADDR pAddr1, PVBOXWDDM_ADDR pAddr2)
116{
117 return pAddr1->SegmentId == pAddr2->SegmentId && pAddr1->offVram == pAddr2->offVram;
118}
119
120DECLINLINE(VBOXVIDEOOFFSET) vboxWddmVramAddrToOffset(PVBOXMP_DEVEXT pDevExt, PHYSICAL_ADDRESS Addr)
121{
122 PVBOXMP_COMMON pCommon = VBoxCommonFromDeviceExt(pDevExt);
123 AssertRelease(pCommon->phVRAM.QuadPart <= Addr.QuadPart);
124 return (VBOXVIDEOOFFSET)Addr.QuadPart - pCommon->phVRAM.QuadPart;
125}
126
127#ifdef VBOXWDDM_RENDER_FROM_SHADOW
128DECLINLINE(void) vboxWddmAssignShadow(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, PVBOXWDDM_ALLOCATION pAllocation, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
129{
130 if (pDevExt->fCmdVbvaEnabled)
131 {
132 WARN(("Trying to assign shadow surface for CmdVbva enabled mode!"));
133 return;
134 }
135
136 if (pSource->pShadowAllocation == pAllocation && pSource->fGhSynced > 0)
137 {
138 Assert(pAllocation->bAssigned);
139 return;
140 }
141
142 if (pSource->pShadowAllocation)
143 {
144 PVBOXWDDM_ALLOCATION pOldAlloc = pSource->pShadowAllocation;
145 /* clear the visibility info fo the current primary */
146 pOldAlloc->bVisible = FALSE;
147 pOldAlloc->bAssigned = FALSE;
148 Assert(pOldAlloc->AllocData.SurfDesc.VidPnSourceId == srcId);
149 /* release the shadow surface */
150 pOldAlloc->AllocData.SurfDesc.VidPnSourceId = D3DDDI_ID_UNINITIALIZED;
151 }
152
153 if (pAllocation)
154 {
155 Assert(!pAllocation->bAssigned);
156 Assert(!pAllocation->bVisible);
157 /* this check ensures the shadow is not used for other source simultaneously */
158 Assert(pAllocation->AllocData.SurfDesc.VidPnSourceId == D3DDDI_ID_UNINITIALIZED);
159 pAllocation->AllocData.SurfDesc.VidPnSourceId = srcId;
160 pAllocation->bAssigned = TRUE;
161 pAllocation->bVisible = pSource->bVisible;
162
163 if(!vboxWddmAddrVramEqual(&pSource->AllocData.Addr, &pAllocation->AllocData.Addr))
164 pSource->fGhSynced = 0; /* force guest->host notification */
165 pSource->AllocData.Addr = pAllocation->AllocData.Addr;
166 }
167
168 pSource->pShadowAllocation = pAllocation;
169
170 Assert(!pSource->AllocData.pSwapchain);
171 Assert(!pSource->AllocData.hostID);
172}
173#endif
174
175DECLINLINE(VOID) vboxWddmAssignPrimary(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, PVBOXWDDM_ALLOCATION pAllocation, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
176{
177 /* vboxWddmAssignPrimary can not be run in reentrant order, so safely do a direct unlocked check here */
178 if (pSource->pPrimaryAllocation == pAllocation)
179 return;
180
181 if (pSource->pPrimaryAllocation)
182 {
183 PVBOXWDDM_ALLOCATION pOldAlloc = pSource->pPrimaryAllocation;
184 /* clear the visibility info fo the current primary */
185 pOldAlloc->bVisible = FALSE;
186 pOldAlloc->bAssigned = FALSE;
187 Assert(pOldAlloc->AllocData.SurfDesc.VidPnSourceId == srcId);
188
189 vboxWddmAllocationRelease(pOldAlloc);
190 }
191
192 if (pAllocation)
193 {
194 Assert(pAllocation->AllocData.SurfDesc.VidPnSourceId == srcId);
195 pAllocation->bAssigned = TRUE;
196 pAllocation->bVisible = pSource->bVisible;
197
198 if(!vboxWddmAddrVramEqual(&pSource->AllocData.Addr, &pAllocation->AllocData.Addr))
199 pSource->fGhSynced = 0; /* force guest->host notification */
200 pSource->AllocData.Addr = pAllocation->AllocData.Addr;
201
202 vboxWddmAllocationRetain(pAllocation);
203 }
204
205 KIRQL OldIrql;
206 KeAcquireSpinLock(&pSource->AllocationLock, &OldIrql);
207 pSource->pPrimaryAllocation = pAllocation;
208 KeReleaseSpinLock(&pSource->AllocationLock, OldIrql);
209
210 Assert(!pSource->AllocData.pSwapchain);
211 Assert(!pSource->AllocData.hostID);
212}
213
214DECLINLINE(PVBOXWDDM_ALLOCATION) vboxWddmAquirePrimary(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
215{
216 PVBOXWDDM_ALLOCATION pPrimary;
217 KIRQL OldIrql;
218 KeAcquireSpinLock(&pSource->AllocationLock, &OldIrql);
219 pPrimary = pSource->pPrimaryAllocation;
220 if (pPrimary)
221 vboxWddmAllocationRetain(pPrimary);
222 KeReleaseSpinLock(&pSource->AllocationLock, OldIrql);
223 return pPrimary;
224}
225
226bool vboxWddmGhDisplayCheckSetInfoFromSource(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource);
227
228#define VBOXWDDMENTRY_2_SWAPCHAIN(_pE) ((PVBOXWDDM_SWAPCHAIN)((uint8_t*)(_pE) - RT_OFFSETOF(VBOXWDDM_SWAPCHAIN, DevExtListEntry)))
229
230BOOLEAN DxgkDdiInterruptRoutineNew(
231 IN CONST PVOID MiniportDeviceContext,
232 IN ULONG MessageNumber
233 );
234
235#ifdef VBOX_WDDM_WIN8
236# define VBOXWDDM_IS_DISPLAYONLY() (g_VBoxDisplayOnly)
237#else
238# define VBOXWDDM_IS_DISPLAYONLY() (FALSE)
239#endif
240
241#ifdef VBOXWDDM_RENDER_FROM_SHADOW
242
243# define VBOXWDDM_IS_FB_ALLOCATION(_pDevExt, _pAlloc) ( (_pAlloc)->bAssigned \
244 && ( (_pAlloc)->AllocData.hostID \
245 || (_pAlloc)->enmType == \
246 ((VBOXWDDM_IS_DISPLAYONLY() || (_pDevExt)->fRenderToShadowDisabled) ? VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE : VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE) \
247 ))
248
249# define VBOXWDDM_IS_REAL_FB_ALLOCATION(_pDevExt, _pAlloc) ( (_pAlloc)->bAssigned \
250 && ( (_pAlloc)->AllocData.hostID \
251 || (_pAlloc)->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE \
252 ))
253
254# define VBOXWDDM_FB_ALLOCATION(_pDevExt, _pSrc) ( ((_pSrc)->pPrimaryAllocation && VBOXWDDM_IS_FB_ALLOCATION(_pDevExt, (_pSrc)->pPrimaryAllocation)) ? \
255 (_pSrc)->pPrimaryAllocation : ( \
256 ((_pSrc)->pShadowAllocation && VBOXWDDM_IS_FB_ALLOCATION(_pDevExt, (_pSrc)->pShadowAllocation)) ? \
257 (_pSrc)->pShadowAllocation : NULL \
258 ) \
259 )
260# define VBOXWDDM_NONFB_ALLOCATION(_pDevExt, _pSrc) ( !((_pSrc)->pPrimaryAllocation && VBOXWDDM_IS_FB_ALLOCATION(_pDevExt, (_pSrc)->pPrimaryAllocation)) ? \
261 (_pSrc)->pPrimaryAllocation : ( \
262 ((_pSrc)->pShadowAllocation && VBOXWDDM_IS_FB_ALLOCATION(_pDevExt, (_pSrc)->pShadowAllocation)) ? \
263 (_pSrc)->pShadowAllocation : NULL \
264 ) \
265 )
266#else
267# define VBOXWDDM_FB_ALLOCATION(_pDevExt, _pSrc) ((_pSrc)->pPrimaryAllocation)
268#endif
269
270#define VBOXWDDM_CTXLOCK_INIT(_p) do { \
271 KeInitializeSpinLock(&(_p)->ContextLock); \
272 } while (0)
273#define VBOXWDDM_CTXLOCK_DATA KIRQL _ctxLockOldIrql;
274#define VBOXWDDM_CTXLOCK_LOCK(_p) do { \
275 KeAcquireSpinLock(&(_p)->ContextLock, &_ctxLockOldIrql); \
276 } while (0)
277#define VBOXWDDM_CTXLOCK_UNLOCK(_p) do { \
278 KeReleaseSpinLock(&(_p)->ContextLock, _ctxLockOldIrql); \
279 } while (0)
280
281#endif /* #ifndef ___VBoxMPWddm_h___ */
282
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