VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.h@ 70052

Last change on this file since 70052 was 70052, checked in by vboxsync, 7 years ago

WDDM: more minor changes to make the code more generic

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.1 KB
Line 
1/* $Id: VBoxDispD3D.h 70052 2017-12-10 22:10:01Z vboxsync $ */
2/** @file
3 * VBoxVideo Display D3D User mode dll
4 */
5
6/*
7 * Copyright (C) 2011-2017 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 ___VBoxDispD3D_h___
19#define ___VBoxDispD3D_h___
20
21#include "VBoxDispD3DIf.h"
22#include "../../common/wddm/VBoxMPIf.h"
23#ifdef VBOX_WITH_CRHGSMI
24#include "VBoxUhgsmiDisp.h"
25#endif
26
27#ifdef VBOX_WDDMDISP_WITH_PROFILE
28#include <iprt/asm.h>
29extern volatile uint32_t g_u32VBoxDispProfileFunctionLoggerIndex;
30# define VBOXDISPPROFILE_FUNCTION_LOGGER_INDEX_GEN() ASMAtomicIncU32(&g_u32VBoxDispProfileFunctionLoggerIndex);
31# include "VBoxDispProfile.h"
32#endif
33
34#include <iprt/cdefs.h>
35#include <iprt/list.h>
36
37#define VBOXWDDMDISP_MAX_VERTEX_STREAMS 16
38#define VBOXWDDMDISP_MAX_SWAPCHAIN_SIZE 16
39#define VBOXWDDMDISP_MAX_TEX_SAMPLERS 16
40#define VBOXWDDMDISP_TOTAL_SAMPLERS VBOXWDDMDISP_MAX_TEX_SAMPLERS + 5
41#define VBOXWDDMDISP_SAMPLER_IDX_IS_SPECIAL(_i) ((_i) >= D3DDMAPSAMPLER && (_i) <= D3DVERTEXTEXTURESAMPLER3)
42#define VBOXWDDMDISP_SAMPLER_IDX_SPECIAL(_i) (VBOXWDDMDISP_SAMPLER_IDX_IS_SPECIAL(_i) ? (int)((_i) - D3DDMAPSAMPLER + VBOXWDDMDISP_MAX_TEX_SAMPLERS) : (int)-1)
43#define VBOXWDDMDISP_SAMPLER_IDX(_i) (((_i) < VBOXWDDMDISP_MAX_TEX_SAMPLERS) ? (int)(_i) : VBOXWDDMDISP_SAMPLER_IDX_SPECIAL(_i))
44
45
46/* maximum number of direct render targets to be used before
47 * switching to offscreen rendering */
48#ifdef VBOXWDDMDISP_DEBUG
49# define VBOXWDDMDISP_MAX_DIRECT_RTS g_VBoxVDbgCfgMaxDirectRts
50#else
51# define VBOXWDDMDISP_MAX_DIRECT_RTS 3
52#endif
53
54#define VBOXWDDMDISP_IS_TEXTURE(_f) ((_f).Texture || (_f).Value == 0)
55
56#ifdef VBOX_WITH_VIDEOHWACCEL
57typedef struct VBOXDISPVHWA_INFO
58{
59 VBOXVHWA_INFO Settings;
60}VBOXDISPVHWA_INFO;
61
62/* represents settings secific to
63 * display device (head) on the multiple-head graphics card
64 * currently used for 2D (overlay) only since in theory its settings
65 * can differ per each frontend's framebuffer. */
66typedef struct VBOXWDDMDISP_HEAD
67{
68 VBOXDISPVHWA_INFO Vhwa;
69} VBOXWDDMDISP_HEAD;
70#endif
71
72typedef struct VBOXWDDMDISP_ADAPTER
73{
74 HANDLE hAdapter;
75 UINT uIfVersion;
76 UINT uRtVersion;
77 D3DDDI_ADAPTERCALLBACKS RtCallbacks;
78 VBOXWDDMDISP_D3D D3D;
79 VBOXWDDMDISP_FORMATS Formats;
80 uint32_t u32VBox3DCaps;
81 bool f3D;
82#ifdef VBOX_WDDMDISP_WITH_PROFILE
83 VBoxDispProfileFpsCounter ProfileDdiFps;
84 VBoxDispProfileSet ProfileDdiFunc;
85#endif
86#ifdef VBOX_WITH_VIDEOHWACCEL
87 uint32_t cHeads;
88 VBOXWDDMDISP_HEAD aHeads[1];
89#endif
90} VBOXWDDMDISP_ADAPTER, *PVBOXWDDMDISP_ADAPTER;
91
92typedef struct VBOXWDDMDISP_CONTEXT
93{
94 RTLISTNODE ListNode;
95 struct VBOXWDDMDISP_DEVICE *pDevice;
96 D3DDDICB_CREATECONTEXT ContextInfo;
97} VBOXWDDMDISP_CONTEXT, *PVBOXWDDMDISP_CONTEXT;
98
99typedef struct VBOXWDDMDISP_STREAMSOURCEUM
100{
101 CONST VOID* pvBuffer;
102 UINT cbStride;
103} VBOXWDDMDISP_STREAMSOURCEUM, *PVBOXWDDMDISP_STREAMSOURCEUM;
104
105typedef struct VBOXWDDMDISP_INDICIESUM
106{
107 CONST VOID* pvBuffer;
108 UINT cbSize;
109} VBOXWDDMDISP_INDICIESUM, *PVBOXWDDMDISP_INDICIESUM;
110
111struct VBOXWDDMDISP_ALLOCATION;
112
113typedef struct VBOXWDDMDISP_STREAM_SOURCE_INFO
114{
115 UINT uiOffset;
116 UINT uiStride;
117} VBOXWDDMDISP_STREAM_SOURCE_INFO;
118
119typedef struct VBOXWDDMDISP_INDICES_INFO
120{
121 struct VBOXWDDMDISP_ALLOCATION *pIndicesAlloc;
122 const void *pvIndicesUm;
123 UINT uiStride;
124} VBOXWDDMDISP_INDICES_INFO;
125
126typedef struct VBOXWDDMDISP_RENDERTGT_FLAGS
127{
128 union
129 {
130 struct
131 {
132 UINT bAdded : 1;
133 UINT bRemoved : 1;
134 UINT Reserved : 30;
135 };
136 uint32_t Value;
137 };
138}VBOXWDDMDISP_RENDERTGT_FLAGS;
139
140typedef struct VBOXWDDMDISP_RENDERTGT
141{
142 struct VBOXWDDMDISP_ALLOCATION *pAlloc;
143 UINT cNumFlips;
144 VBOXWDDMDISP_RENDERTGT_FLAGS fFlags;
145} VBOXWDDMDISP_RENDERTGT, *PVBOXWDDMDISP_RENDERTGT;
146
147#define VBOXWDDMDISP_INDEX_UNDEFINED (~0U)
148typedef struct VBOXWDDMDISP_SWAPCHAIN_FLAGS
149{
150 union
151 {
152 struct
153 {
154 UINT bChanged : 1;
155 UINT bRtReportingPresent : 1; /* use VBox extension method for performing present */
156 UINT bSwitchReportingPresent : 1; /* switch to use VBox extension method for performing present on next present */
157 UINT Reserved : 29;
158 };
159 uint32_t Value;
160 };
161}VBOXWDDMDISP_SWAPCHAIN_FLAGS;
162
163typedef struct VBOXWDDMDISP_SWAPCHAIN
164{
165 RTLISTNODE ListEntry;
166 UINT iBB; /* Backbuffer index */
167 UINT cRTs; /* Number of render targets in the swapchain */
168 VBOXWDDMDISP_SWAPCHAIN_FLAGS fFlags;
169#ifndef VBOXWDDM_WITH_VISIBLE_FB
170 IDirect3DSurface9 *pRenderTargetFbCopy;
171 BOOL bRTFbCopyUpToDate;
172#endif
173 IDirect3DSwapChain9 *pSwapChainIf;
174 /* a read-only hWnd we receive from wine
175 * we use it for visible region notifications only,
176 * it MUST NOT be destroyed on swapchain destruction,
177 * wine will handle that for us */
178 HWND hWnd;
179 VBOXDISP_KMHANDLE hSwapchainKm;
180 VBOXWDDMDISP_RENDERTGT aRTs[VBOXWDDMDISP_MAX_SWAPCHAIN_SIZE];
181} VBOXWDDMDISP_SWAPCHAIN, *PVBOXWDDMDISP_SWAPCHAIN;
182
183typedef HRESULT FNVBOXWDDMCREATEDIRECT3DDEVICE(PVBOXWDDMDISP_DEVICE pDevice);
184typedef FNVBOXWDDMCREATEDIRECT3DDEVICE *PFNVBOXWDDMCREATEDIRECT3DDEVICE;
185
186typedef IUnknown* FNVBOXWDDMCREATESHAREDPRIMARY(struct VBOXWDDMDISP_ALLOCATION *pAlloc);
187typedef FNVBOXWDDMCREATESHAREDPRIMARY *PFNVBOXWDDMCREATESHAREDPRIMARY;
188
189typedef struct VBOXWDDMDISP_DEVICE
190{
191 HANDLE hDevice;
192 PVBOXWDDMDISP_ADAPTER pAdapter;
193 PFNVBOXWDDMCREATEDIRECT3DDEVICE pfnCreateDirect3DDevice;
194 PFNVBOXWDDMCREATESHAREDPRIMARY pfnCreateSharedPrimary;
195 IDirect3DDevice9 *pDevice9If;
196 RTLISTANCHOR SwapchainList;
197 UINT u32IfVersion;
198 UINT uRtVersion;
199 D3DDDI_DEVICECALLBACKS RtCallbacks;
200 VOID *pvCmdBuffer;
201 UINT cbCmdBuffer;
202 D3DDDI_CREATEDEVICEFLAGS fFlags;
203 /* number of StreamSources set */
204 UINT cStreamSources;
205 UINT cStreamSourcesUm;
206 VBOXWDDMDISP_STREAMSOURCEUM aStreamSourceUm[VBOXWDDMDISP_MAX_VERTEX_STREAMS];
207 struct VBOXWDDMDISP_ALLOCATION *aStreamSource[VBOXWDDMDISP_MAX_VERTEX_STREAMS];
208 VBOXWDDMDISP_STREAM_SOURCE_INFO StreamSourceInfo[VBOXWDDMDISP_MAX_VERTEX_STREAMS];
209 VBOXWDDMDISP_INDICES_INFO IndiciesInfo;
210 /* need to cache the ViewPort data because IDirect3DDevice9::SetViewport
211 * is split into two calls : SetViewport & SetZRange */
212 D3DVIEWPORT9 ViewPort;
213 VBOXWDDMDISP_CONTEXT DefaultContext;
214#ifdef VBOX_WITH_CRHGSMI
215 VBOXUHGSMI_PRIVATE_D3D Uhgsmi;
216#endif
217
218 /* no lock is needed for this since we're guaranteed the per-device calls are not reentrant */
219 RTLISTANCHOR DirtyAllocList;
220
221 UINT cSamplerTextures;
222 struct VBOXWDDMDISP_RESOURCE *aSamplerTextures[VBOXWDDMDISP_TOTAL_SAMPLERS];
223
224 struct VBOXWDDMDISP_RESOURCE *pDepthStencilRc;
225
226 HMODULE hHgsmiTransportModule;
227
228#ifdef VBOX_WDDMDISP_WITH_PROFILE
229 VBoxDispProfileFpsCounter ProfileDdiFps;
230 VBoxDispProfileSet ProfileDdiFunc;
231
232 VBoxDispProfileSet ProfileDdiPresentCb;
233#endif
234
235#ifdef VBOXWDDMDISP_DEBUG_TIMER
236 HANDLE hTimerQueue;
237#endif
238
239 UINT cRTs;
240 struct VBOXWDDMDISP_ALLOCATION * apRTs[1];
241} VBOXWDDMDISP_DEVICE, *PVBOXWDDMDISP_DEVICE;
242
243typedef struct VBOXWDDMDISP_LOCKINFO
244{
245 uint32_t cLocks;
246 union {
247 D3DDDIRANGE Range;
248 RECT Area;
249 D3DDDIBOX Box;
250 };
251 D3DDDI_LOCKFLAGS fFlags;
252 union {
253 D3DLOCKED_RECT LockedRect;
254 D3DLOCKED_BOX LockedBox;
255 };
256#ifdef VBOXWDDMDISP_DEBUG
257 PVOID pvData;
258#endif
259} VBOXWDDMDISP_LOCKINFO;
260
261typedef enum
262{
263 VBOXDISP_D3DIFTYPE_UNDEFINED = 0,
264 VBOXDISP_D3DIFTYPE_SURFACE,
265 VBOXDISP_D3DIFTYPE_TEXTURE,
266 VBOXDISP_D3DIFTYPE_CUBE_TEXTURE,
267 VBOXDISP_D3DIFTYPE_VOLUME_TEXTURE,
268 VBOXDISP_D3DIFTYPE_VERTEXBUFFER,
269 VBOXDISP_D3DIFTYPE_INDEXBUFFER
270} VBOXDISP_D3DIFTYPE;
271
272typedef struct VBOXWDDMDISP_ALLOCATION
273{
274 D3DKMT_HANDLE hAllocation;
275 VBOXWDDM_ALLOC_TYPE enmType;
276 UINT iAlloc;
277 struct VBOXWDDMDISP_RESOURCE *pRc;
278 void* pvMem;
279 /* object type is defined by enmD3DIfType enum */
280 IUnknown *pD3DIf;
281 VBOXDISP_D3DIFTYPE enmD3DIfType;
282 /* list entry used to add allocation to the dirty alloc list */
283 RTLISTNODE DirtyAllocListEntry;
284 BOOLEAN fEverWritten;
285 BOOLEAN fDirtyWrite;
286 BOOLEAN fAllocLocked;
287 HANDLE hSharedHandle;
288 VBOXWDDMDISP_LOCKINFO LockInfo;
289 VBOXWDDM_DIRTYREGION DirtyRegion; /* <- dirty region to notify host about */
290 VBOXWDDM_SURFACE_DESC SurfDesc;
291 PVBOXWDDMDISP_SWAPCHAIN pSwapchain;
292} VBOXWDDMDISP_ALLOCATION, *PVBOXWDDMDISP_ALLOCATION;
293
294typedef struct VBOXWDDMDISP_RESOURCE
295{
296 HANDLE hResource;
297 D3DKMT_HANDLE hKMResource;
298 PVBOXWDDMDISP_DEVICE pDevice;
299 VBOXWDDMDISP_RESOURCE_FLAGS fFlags;
300 VBOXWDDM_RC_DESC RcDesc;
301 UINT cAllocations;
302 VBOXWDDMDISP_ALLOCATION aAllocations[1];
303} VBOXWDDMDISP_RESOURCE, *PVBOXWDDMDISP_RESOURCE;
304
305typedef struct VBOXWDDMDISP_QUERY
306{
307 D3DDDIQUERYTYPE enmType;
308 D3DDDI_ISSUEQUERYFLAGS fQueryState;
309 IDirect3DQuery9 *pQueryIf;
310} VBOXWDDMDISP_QUERY, *PVBOXWDDMDISP_QUERY;
311
312typedef struct VBOXWDDMDISP_TSS_LOOKUP
313{
314 BOOL bSamplerState;
315 DWORD dType;
316} VBOXWDDMDISP_TSS_LOOKUP;
317
318typedef struct VBOXWDDMDISP_OVERLAY
319{
320 D3DKMT_HANDLE hOverlay;
321 D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
322 PVBOXWDDMDISP_RESOURCE *pResource;
323} VBOXWDDMDISP_OVERLAY, *PVBOXWDDMDISP_OVERLAY;
324
325#define VBOXDISP_CUBEMAP_LEVELS_COUNT(pRc) (((pRc)->cAllocations)/6)
326#define VBOXDISP_CUBEMAP_INDEX_TO_FACE(pRc, idx) ((D3DCUBEMAP_FACES)(D3DCUBEMAP_FACE_POSITIVE_X+(idx)/VBOXDISP_CUBEMAP_LEVELS_COUNT(pRc)))
327#define VBOXDISP_CUBEMAP_INDEX_TO_LEVEL(pRc, idx) ((idx)%VBOXDISP_CUBEMAP_LEVELS_COUNT(pRc))
328
329DECLINLINE(PVBOXWDDMDISP_SWAPCHAIN) vboxWddmSwapchainForAlloc(PVBOXWDDMDISP_ALLOCATION pAlloc)
330{
331 return pAlloc->pSwapchain;
332}
333
334DECLINLINE(UINT) vboxWddmSwapchainIdxFb(PVBOXWDDMDISP_SWAPCHAIN pSwapchain)
335{
336 return (pSwapchain->iBB + pSwapchain->cRTs - 1) % pSwapchain->cRTs;
337}
338
339/* if swapchain contains only one surface returns this surface */
340DECLINLINE(PVBOXWDDMDISP_RENDERTGT) vboxWddmSwapchainGetBb(PVBOXWDDMDISP_SWAPCHAIN pSwapchain)
341{
342 if (pSwapchain->cRTs)
343 {
344 Assert(pSwapchain->iBB < pSwapchain->cRTs);
345 return &pSwapchain->aRTs[pSwapchain->iBB];
346 }
347 return NULL;
348}
349
350DECLINLINE(PVBOXWDDMDISP_RENDERTGT) vboxWddmSwapchainGetFb(PVBOXWDDMDISP_SWAPCHAIN pSwapchain)
351{
352 if (pSwapchain->cRTs)
353 {
354 UINT iFb = vboxWddmSwapchainIdxFb(pSwapchain);
355 return &pSwapchain->aRTs[iFb];
356 }
357 return NULL;
358}
359
360void vboxWddmResourceInit(PVBOXWDDMDISP_RESOURCE pRc, UINT cAllocs);
361
362#ifndef IN_VBOXCRHGSMI
363PVBOXWDDMDISP_SWAPCHAIN vboxWddmSwapchainFindCreate(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pBbAlloc, BOOL *pbNeedPresent);
364HRESULT vboxWddmSwapchainChkCreateIf(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain);
365VOID vboxWddmSwapchainDestroy(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain);
366
367#endif
368
369#endif /* #ifndef ___VBoxDispD3D_h___ */
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