VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.cpp@ 46757

Last change on this file since 46757 was 46757, checked in by vboxsync, 12 years ago

wddm/crOpenGL: r0-based visible regions handling, r0-based chromium commands submission debugged, more on new presentation mechanism, cleanup, etc.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 38.0 KB
Line 
1/* $Id: VBoxDispD3DIf.cpp 46757 2013-06-24 14:30:18Z vboxsync $ */
2
3/** @file
4 * VBoxVideo Display D3D User mode dll
5 */
6
7/*
8 * Copyright (C) 2011-2012 Oracle Corporation
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License (GPL) as published by the Free Software
14 * Foundation, in version 2 as it comes in the "COPYING" file of the
15 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17 */
18
19#include "VBoxDispD3DIf.h"
20#include "VBoxDispD3DCmn.h"
21
22#include <iprt/assert.h>
23
24void VBoxDispD3DClose(VBOXDISPD3D *pD3D)
25{
26 FreeLibrary(pD3D->hD3DLib);
27 pD3D->hD3DLib = NULL;
28}
29
30/**
31 * Loads a system DLL.
32 *
33 * @returns Module handle or NULL
34 * @param pszName The DLL name.
35 */
36static HMODULE loadSystemDll(const char *pszName)
37{
38 char szPath[MAX_PATH];
39 UINT cchPath = GetSystemDirectoryA(szPath, sizeof(szPath));
40 size_t cbName = strlen(pszName) + 1;
41 if (cchPath + 1 + cbName > sizeof(szPath))
42 {
43 SetLastError(ERROR_FILENAME_EXCED_RANGE);
44 return NULL;
45 }
46 szPath[cchPath] = '\\';
47 memcpy(&szPath[cchPath + 1], pszName, cbName);
48 return LoadLibraryA(szPath);
49}
50
51HRESULT VBoxDispD3DOpen(VBOXDISPD3D *pD3D)
52{
53#ifdef VBOX_WDDM_WOW64
54 pD3D->hD3DLib = loadSystemDll("VBoxD3D9wddm-x86.dll");
55#else
56 pD3D->hD3DLib = loadSystemDll("VBoxD3D9wddm.dll");
57#endif
58 if (!pD3D->hD3DLib)
59 {
60 DWORD winErr = GetLastError();
61 WARN((__FUNCTION__": LoadLibrary failed, winErr = (%d)", winErr));
62 return E_FAIL;
63 }
64
65 do
66 {
67 pD3D->pfnDirect3DCreate9Ex = (PFNVBOXDISPD3DCREATE9EX)GetProcAddress(pD3D->hD3DLib, "Direct3DCreate9Ex");
68 if (!pD3D->pfnDirect3DCreate9Ex)
69 {
70 WARN(("no Direct3DCreate9Ex"));
71 break;
72 }
73
74 pD3D->pfnVBoxWineExD3DDev9CreateTexture = (PFNVBOXWINEEXD3DDEV9_CREATETEXTURE)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9CreateTexture");
75 if (!pD3D->pfnVBoxWineExD3DDev9CreateTexture)
76 {
77 WARN(("no VBoxWineExD3DDev9CreateTexture"));
78 break;
79 }
80
81 pD3D->pfnVBoxWineExD3DDev9CreateCubeTexture = (PFNVBOXWINEEXD3DDEV9_CREATECUBETEXTURE)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9CreateCubeTexture");
82 if (!pD3D->pfnVBoxWineExD3DDev9CreateCubeTexture)
83 {
84 WARN(("no VBoxWineExD3DDev9CreateCubeTexture"));
85 break;
86 }
87
88 pD3D->pfnVBoxWineExD3DDev9CreateVolumeTexture = (PFNVBOXWINEEXD3DDEV9_CREATEVOLUMETEXTURE)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9CreateVolumeTexture");
89 if (!pD3D->pfnVBoxWineExD3DDev9CreateVolumeTexture)
90 {
91 WARN(("no VBoxWineExD3DDev9CreateVolumeTexture"));
92 break;
93 }
94
95 pD3D->pfnVBoxWineExD3DDev9Flush = (PFNVBOXWINEEXD3DDEV9_FLUSH)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9Flush");
96 if (!pD3D->pfnVBoxWineExD3DDev9Flush)
97 {
98 WARN(("no VBoxWineExD3DDev9Flush"));
99 break;
100 }
101
102 pD3D->pfnVBoxWineExD3DDev9FlushToHost = (PFNVBOXWINEEXD3DDEV9_FLUSHTOHOST)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9FlushToHost");
103 if (!pD3D->pfnVBoxWineExD3DDev9FlushToHost)
104 {
105 WARN(("no VBoxWineExD3DDev9FlushToHost"));
106 break;
107 }
108
109 pD3D->pfnVBoxWineExD3DDev9Finish = (PFNVBOXWINEEXD3DDEV9_FINISH)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9Finish");
110 if (!pD3D->pfnVBoxWineExD3DDev9Finish)
111 {
112 WARN(("no VBoxWineExD3DDev9Finish"));
113 break;
114 }
115
116 pD3D->pfnVBoxWineExD3DDev9VolBlt = (PFNVBOXWINEEXD3DDEV9_VOLBLT)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9VolBlt");
117 if (!pD3D->pfnVBoxWineExD3DDev9VolBlt)
118 {
119 WARN(("no VBoxWineExD3DDev9VolBlt"));
120 break;
121 }
122
123 pD3D->pfnVBoxWineExD3DDev9VolTexBlt = (PFNVBOXWINEEXD3DDEV9_VOLTEXBLT)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9VolTexBlt");
124 if (!pD3D->pfnVBoxWineExD3DDev9VolTexBlt)
125 {
126 WARN(("no VBoxWineExD3DDev9VolTexBlt"));
127 break;
128 }
129
130 pD3D->pfnVBoxWineExD3DDev9Term = (PFNVBOXWINEEXD3DDEV9_TERM)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9Term");
131 if (!pD3D->pfnVBoxWineExD3DDev9Term)
132 {
133 WARN(("no VBoxWineExD3DDev9Term"));
134 break;
135 }
136
137 pD3D->pfnVBoxWineExD3DSwapchain9Present = (PFNVBOXWINEEXD3DSWAPCHAIN9_PRESENT)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DSwapchain9Present");
138 if (!pD3D->pfnVBoxWineExD3DSwapchain9Present)
139 {
140 WARN(("no VBoxWineExD3DSwapchain9Present"));
141 break;
142 }
143
144 pD3D->pfnVBoxWineExD3DSurf9GetHostId = (PFNVBOXWINEEXD3DSURF9_GETHOSTID)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DSurf9GetHostId");
145 if (!pD3D->pfnVBoxWineExD3DSurf9GetHostId)
146 {
147 WARN(("no VBoxWineExD3DSurf9GetHostId"));
148 break;
149 }
150
151 pD3D->pfnVBoxWineExD3DSwapchain9GetHostWinID = (PFNVBOXWINEEXD3DSWAPCHAIN9_GETHOSTWINID)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DSwapchain9GetHostWinID");
152 if (!pD3D->pfnVBoxWineExD3DSwapchain9GetHostWinID)
153 {
154 WARN(("no VBoxWineExD3DSwapchain9GetHostWinID"));
155 break;
156 }
157
158 return S_OK;
159
160 } while (0);
161
162 VBoxDispD3DClose(pD3D);
163
164 return E_FAIL;
165}
166
167
168
169static FORMATOP gVBoxFormatOps3D[] = {
170 {D3DDDIFMT_A8R8G8B8,
171 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
172 FORMATOP_SAME_FORMAT_RENDERTARGET|
173 FORMATOP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET|
174 FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
175 FORMATOP_MEMBEROFGROUP_ARGB|
176 FORMATOP_SRGBWRITE|FORMATOP_VERTEXTEXTURE, 0, 0, 0},
177
178 {D3DDDIFMT_X8R8G8B8,
179 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
180 FORMATOP_SAME_FORMAT_RENDERTARGET|
181 FORMATOP_DISPLAYMODE|FORMATOP_3DACCELERATION|
182 FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
183 FORMATOP_MEMBEROFGROUP_ARGB|
184 FORMATOP_SRGBWRITE|FORMATOP_VERTEXTEXTURE, 0, 0, 0},
185
186 {D3DDDIFMT_A2R10G10B10,
187 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
188 FORMATOP_SAME_FORMAT_RENDERTARGET|
189 0|
190 FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
191 FORMATOP_MEMBEROFGROUP_ARGB|
192 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
193
194 {D3DDDIFMT_X1R5G5B5,
195 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
196 FORMATOP_SAME_FORMAT_RENDERTARGET|
197 0|
198 FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
199 FORMATOP_MEMBEROFGROUP_ARGB|
200 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
201
202 {D3DDDIFMT_A1R5G5B5,
203 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
204 FORMATOP_SAME_FORMAT_RENDERTARGET|
205 FORMATOP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET|
206 FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
207 FORMATOP_MEMBEROFGROUP_ARGB|
208 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
209
210 {D3DDDIFMT_A4R4G4B4,
211 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
212 FORMATOP_SAME_FORMAT_RENDERTARGET|
213 FORMATOP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET|
214 FORMATOP_OFFSCREENPLAIN|
215 0|
216 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
217
218 {D3DDDIFMT_R5G6B5,
219 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
220 FORMATOP_SAME_FORMAT_RENDERTARGET|
221 FORMATOP_DISPLAYMODE|FORMATOP_3DACCELERATION|
222 FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
223 FORMATOP_MEMBEROFGROUP_ARGB|
224 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
225
226 {D3DDDIFMT_L16,
227 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
228 0|
229 0|
230 FORMATOP_OFFSCREENPLAIN|
231 0|
232 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
233
234 {D3DDDIFMT_A8L8,
235 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
236 0|
237 0|
238 FORMATOP_OFFSCREENPLAIN|
239 0|
240 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
241
242 {D3DDDIFMT_A8,
243 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
244 0|
245 0|
246 FORMATOP_OFFSCREENPLAIN|
247 0|
248 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
249
250 {D3DDDIFMT_L8,
251 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
252 0|
253 0|
254 FORMATOP_OFFSCREENPLAIN|
255 0|
256 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
257
258 {D3DDDIFMT_D16, FORMATOP_TEXTURE|FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
259 {D3DDDIFMT_D24S8, FORMATOP_TEXTURE|FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
260 {D3DDDIFMT_D24X8, FORMATOP_TEXTURE|FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
261 {D3DDDIFMT_D16_LOCKABLE, FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
262 {D3DDDIFMT_X8D24, FORMATOP_TEXTURE|FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
263 {D3DDDIFMT_D32F_LOCKABLE, FORMATOP_TEXTURE|FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
264 {D3DDDIFMT_S8D24, FORMATOP_TEXTURE|FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
265
266 {D3DDDIFMT_DXT1,
267 FORMATOP_TEXTURE|FORMATOP_CUBETEXTURE|
268 0|
269 0|
270 FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
271 0|
272 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
273
274 {D3DDDIFMT_DXT2,
275 FORMATOP_TEXTURE|FORMATOP_CUBETEXTURE|
276 0|
277 0|
278 FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
279 0|
280 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
281
282 {D3DDDIFMT_DXT3,
283 FORMATOP_TEXTURE|FORMATOP_CUBETEXTURE|
284 0|
285 0|
286 FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
287 0|
288 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
289
290 {D3DDDIFMT_DXT4,
291 FORMATOP_TEXTURE|FORMATOP_CUBETEXTURE|
292 0|
293 0|
294 FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
295 0|
296 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
297
298 {D3DDDIFMT_DXT5,
299 FORMATOP_TEXTURE|FORMATOP_CUBETEXTURE|
300 0|
301 0|
302 FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
303 0|
304 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
305
306 {D3DDDIFMT_X8L8V8U8,
307 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
308 0|
309 0|
310 0|
311 FORMATOP_BUMPMAP|
312 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
313
314 {D3DDDIFMT_A2W10V10U10,
315 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
316 0|
317 0|
318 0|
319 FORMATOP_BUMPMAP|
320 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
321
322 {D3DDDIFMT_V8U8,
323 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
324 0|
325 0|
326 0|
327 FORMATOP_BUMPMAP|
328 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
329
330 {D3DDDIFMT_Q8W8V8U8,
331 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
332 0|
333 0|
334 FORMATOP_OFFSCREENPLAIN|
335 FORMATOP_BUMPMAP|
336 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
337
338 {D3DDDIFMT_CxV8U8, FORMATOP_NOFILTER|FORMATOP_NOALPHABLEND|FORMATOP_NOTEXCOORDWRAPNORMIP, 0, 0, 0},
339
340 {D3DDDIFMT_R16F,
341 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
342 FORMATOP_SAME_FORMAT_RENDERTARGET|
343 0|
344 FORMATOP_OFFSCREENPLAIN|
345 0|
346 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
347
348 {D3DDDIFMT_R32F,
349 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
350 FORMATOP_SAME_FORMAT_RENDERTARGET|
351 0|
352 FORMATOP_OFFSCREENPLAIN|
353 0|
354 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
355
356 {D3DDDIFMT_G16R16F,
357 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
358 FORMATOP_SAME_FORMAT_RENDERTARGET|
359 0|
360 FORMATOP_OFFSCREENPLAIN|
361 0|
362 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
363
364 {D3DDDIFMT_G32R32F,
365 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
366 FORMATOP_SAME_FORMAT_RENDERTARGET|
367 0|
368 FORMATOP_OFFSCREENPLAIN|
369 0|
370 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
371
372 {D3DDDIFMT_A16B16G16R16F,
373 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
374 FORMATOP_SAME_FORMAT_RENDERTARGET|
375 0|
376 FORMATOP_OFFSCREENPLAIN|
377 0|
378 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
379
380 {D3DDDIFMT_A32B32G32R32F,
381 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
382 FORMATOP_SAME_FORMAT_RENDERTARGET|
383 0|
384 FORMATOP_OFFSCREENPLAIN|
385 0|
386 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
387
388 {D3DDDIFMT_G16R16,
389 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
390 FORMATOP_SAME_FORMAT_RENDERTARGET|
391 0|
392 FORMATOP_OFFSCREENPLAIN|
393 0|
394 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
395
396 {D3DDDIFMT_A16B16G16R16,
397 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
398 FORMATOP_SAME_FORMAT_RENDERTARGET|
399 0|
400 FORMATOP_OFFSCREENPLAIN|
401 0|
402 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
403
404 {D3DDDIFMT_V16U16,
405 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
406 0|
407 0|
408 0|
409 FORMATOP_BUMPMAP|
410 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
411
412 {D3DDDIFMT_P8, FORMATOP_DISPLAYMODE|FORMATOP_3DACCELERATION|FORMATOP_OFFSCREENPLAIN, 0, 0, 0},
413
414 {D3DDDIFMT_UYVY,
415 0|
416 0|
417 0|
418 FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
419 FORMATOP_NOFILTER|
420 FORMATOP_NOALPHABLEND|
421 FORMATOP_NOTEXCOORDWRAPNORMIP, 0, 0, 0},
422
423 {D3DDDIFMT_YUY2,
424 0|
425 0|
426 0|
427 FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
428 FORMATOP_NOFILTER|
429 FORMATOP_NOALPHABLEND|
430 FORMATOP_NOTEXCOORDWRAPNORMIP, 0, 0, 0},
431
432 {D3DDDIFMT_Q16W16V16U16,
433 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
434 FORMATOP_SAME_FORMAT_RENDERTARGET|
435 0|
436 FORMATOP_OFFSCREENPLAIN|
437 FORMATOP_BUMPMAP|FORMATOP_DMAP|
438 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
439
440 {D3DDDIFMT_X8B8G8R8,
441 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
442 FORMATOP_SAME_FORMAT_RENDERTARGET|
443 FORMATOP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET|
444 FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
445 FORMATOP_DMAP|FORMATOP_MEMBEROFGROUP_ARGB|
446 FORMATOP_SRGBWRITE|FORMATOP_AUTOGENMIPMAP|FORMATOP_VERTEXTEXTURE|
447 FORMATOP_OVERLAY, 0, 0, 0},
448
449 {D3DDDIFMT_BINARYBUFFER, FORMATOP_OFFSCREENPLAIN, 0, 0, 0},
450
451 {D3DDDIFMT_A4L4,
452 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
453 0|
454 0|
455 FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
456 FORMATOP_DMAP|
457 FORMATOP_VERTEXTEXTURE, 0, 0, 0},
458
459 {D3DDDIFMT_A2B10G10R10,
460 FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
461 FORMATOP_SAME_FORMAT_RENDERTARGET|
462 0|
463 FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
464 FORMATOP_DMAP|FORMATOP_MEMBEROFGROUP_ARGB|
465 FORMATOP_AUTOGENMIPMAP|FORMATOP_VERTEXTEXTURE, 0, 0, 0},
466};
467
468static FORMATOP gVBoxFormatOpsBase[] = {
469 {D3DDDIFMT_X8R8G8B8, FORMATOP_DISPLAYMODE, 0, 0, 0},
470
471 {D3DDDIFMT_R8G8B8, FORMATOP_DISPLAYMODE, 0, 0, 0},
472
473 {D3DDDIFMT_R5G6B5, FORMATOP_DISPLAYMODE, 0, 0, 0},
474
475 {D3DDDIFMT_P8, FORMATOP_DISPLAYMODE, 0, 0, 0},
476};
477
478static DDSURFACEDESC gVBoxSurfDescsBase[] = {
479 {
480 sizeof (DDSURFACEDESC), /* DWORD dwSize; */
481 DDSD_CAPS | DDSD_PIXELFORMAT, /* DWORD dwFlags; */
482 0, /* DWORD dwHeight; */
483 0, /* DWORD dwWidth; */
484 {
485 0, /* Union */
486 /* LONG lPitch; */
487 /* DWORD dwLinearSize; */
488 },
489 0, /* DWORD dwBackBufferCount; */
490 {
491 0, /* Union */
492 /* DWORD dwMipMapCount; */
493 /* DWORD dwZBufferBitDepth; */
494 /* DWORD dwRefreshRate; */
495 },
496 0, /* DWORD dwAlphaBitDepth; */
497 0, /* DWORD dwReserved; */
498 NULL, /* LPVOID lpSurface; */
499 {
500 0, /* DWORD dwColorSpaceLowValue; */
501 0, /* DWORD dwColorSpaceHighValue; */
502 }, /* DDCOLORKEY ddckCKDestOverlay; */
503 {
504 0, /* DWORD dwColorSpaceLowValue; */
505 0, /* DWORD dwColorSpaceHighValue; */
506 }, /* DDCOLORKEY ddckCKDestBlt; */
507 {
508 0, /* DWORD dwColorSpaceLowValue; */
509 0, /* DWORD dwColorSpaceHighValue; */
510 }, /* DDCOLORKEY ddckCKSrcOverlay; */
511 {
512 0, /* DWORD dwColorSpaceLowValue; */
513 0, /* DWORD dwColorSpaceHighValue; */
514 }, /* DDCOLORKEY ddckCKSrcBlt; */
515 {
516 sizeof (DDPIXELFORMAT), /* DWORD dwSize; */
517 DDPF_RGB, /* DWORD dwFlags; */
518 0, /* DWORD dwFourCC; */
519 {
520 32, /* union */
521 /* DWORD dwRGBBitCount; */
522 /* DWORD dwYUVBitCount; */
523 /* DWORD dwZBufferBitDepth; */
524 /* DWORD dwAlphaBitDepth; */
525 /* DWORD dwLuminanceBitCount; */
526 /* DWORD dwBumpBitCount; */
527 },
528 {
529 0xff0000, /* union */
530 /* DWORD dwRBitMask; */
531 /* DWORD dwYBitMask; */
532 /* DWORD dwStencilBitDepth; */
533 /* DWORD dwLuminanceBitMask; */
534 /* DWORD dwBumpDuBitMask; */
535 },
536 {
537 0xff00,
538 /* DWORD dwGBitMask; */
539 /* DWORD dwUBitMask; */
540 /* DWORD dwZBitMask; */
541 /* DWORD dwBumpDvBitMask; */
542 },
543 {
544 0xff,
545 /* DWORD dwBBitMask; */
546 /* DWORD dwVBitMask; */
547 /* DWORD dwStencilBitMask; */
548 /* DWORD dwBumpLuminanceBitMask; */
549 },
550 {
551 0,
552 /* DWORD dwRGBAlphaBitMask; */
553 /* DWORD dwYUVAlphaBitMask; */
554 /* DWORD dwLuminanceAlphaBitMask; */
555 /* DWORD dwRGBZBitMask; */
556 /* DWORD dwYUVZBitMask; */
557 },
558 }, /* DDPIXELFORMAT ddpfPixelFormat; */
559 {
560 DDSCAPS_BACKBUFFER
561 | DDSCAPS_COMPLEX
562 | DDSCAPS_FLIP
563 | DDSCAPS_FRONTBUFFER
564 | DDSCAPS_LOCALVIDMEM
565 | DDSCAPS_PRIMARYSURFACE
566 | DDSCAPS_VIDEOMEMORY
567 | DDSCAPS_VISIBLE /* DWORD dwCaps; */
568 } /* DDSCAPS ddsCaps; */
569 },
570 {
571 sizeof (DDSURFACEDESC), /* DWORD dwSize; */
572 DDSD_CAPS | DDSD_PIXELFORMAT, /* DWORD dwFlags; */
573 0, /* DWORD dwHeight; */
574 0, /* DWORD dwWidth; */
575 {
576 0, /* Union */
577 /* LONG lPitch; */
578 /* DWORD dwLinearSize; */
579 },
580 0, /* DWORD dwBackBufferCount; */
581 {
582 0, /* Union */
583 /* DWORD dwMipMapCount; */
584 /* DWORD dwZBufferBitDepth; */
585 /* DWORD dwRefreshRate; */
586 },
587 0, /* DWORD dwAlphaBitDepth; */
588 0, /* DWORD dwReserved; */
589 NULL, /* LPVOID lpSurface; */
590 {
591 0, /* DWORD dwColorSpaceLowValue; */
592 0, /* DWORD dwColorSpaceHighValue; */
593 }, /* DDCOLORKEY ddckCKDestOverlay; */
594 {
595 0, /* DWORD dwColorSpaceLowValue; */
596 0, /* DWORD dwColorSpaceHighValue; */
597 }, /* DDCOLORKEY ddckCKDestBlt; */
598 {
599 0, /* DWORD dwColorSpaceLowValue; */
600 0, /* DWORD dwColorSpaceHighValue; */
601 }, /* DDCOLORKEY ddckCKSrcOverlay; */
602 {
603 0, /* DWORD dwColorSpaceLowValue; */
604 0, /* DWORD dwColorSpaceHighValue; */
605 }, /* DDCOLORKEY ddckCKSrcBlt; */
606 {
607 sizeof (DDPIXELFORMAT), /* DWORD dwSize; */
608 DDPF_RGB, /* DWORD dwFlags; */
609 0, /* DWORD dwFourCC; */
610 {
611 24, /* union */
612 /* DWORD dwRGBBitCount; */
613 /* DWORD dwYUVBitCount; */
614 /* DWORD dwZBufferBitDepth; */
615 /* DWORD dwAlphaBitDepth; */
616 /* DWORD dwLuminanceBitCount; */
617 /* DWORD dwBumpBitCount; */
618 },
619 {
620 0xff0000, /* union */
621 /* DWORD dwRBitMask; */
622 /* DWORD dwYBitMask; */
623 /* DWORD dwStencilBitDepth; */
624 /* DWORD dwLuminanceBitMask; */
625 /* DWORD dwBumpDuBitMask; */
626 },
627 {
628 0xff00,
629 /* DWORD dwGBitMask; */
630 /* DWORD dwUBitMask; */
631 /* DWORD dwZBitMask; */
632 /* DWORD dwBumpDvBitMask; */
633 },
634 {
635 0xff,
636 /* DWORD dwBBitMask; */
637 /* DWORD dwVBitMask; */
638 /* DWORD dwStencilBitMask; */
639 /* DWORD dwBumpLuminanceBitMask; */
640 },
641 {
642 0,
643 /* DWORD dwRGBAlphaBitMask; */
644 /* DWORD dwYUVAlphaBitMask; */
645 /* DWORD dwLuminanceAlphaBitMask; */
646 /* DWORD dwRGBZBitMask; */
647 /* DWORD dwYUVZBitMask; */
648 },
649 }, /* DDPIXELFORMAT ddpfPixelFormat; */
650 {
651 DDSCAPS_BACKBUFFER
652 | DDSCAPS_COMPLEX
653 | DDSCAPS_FLIP
654 | DDSCAPS_FRONTBUFFER
655 | DDSCAPS_LOCALVIDMEM
656 | DDSCAPS_PRIMARYSURFACE
657 | DDSCAPS_VIDEOMEMORY
658 | DDSCAPS_VISIBLE /* DWORD dwCaps; */
659 } /* DDSCAPS ddsCaps; */
660 },
661 {
662 sizeof (DDSURFACEDESC), /* DWORD dwSize; */
663 DDSD_CAPS | DDSD_PIXELFORMAT, /* DWORD dwFlags; */
664 0, /* DWORD dwHeight; */
665 0, /* DWORD dwWidth; */
666 {
667 0, /* Union */
668 /* LONG lPitch; */
669 /* DWORD dwLinearSize; */
670 },
671 0, /* DWORD dwBackBufferCount; */
672 {
673 0, /* Union */
674 /* DWORD dwMipMapCount; */
675 /* DWORD dwZBufferBitDepth; */
676 /* DWORD dwRefreshRate; */
677 },
678 0, /* DWORD dwAlphaBitDepth; */
679 0, /* DWORD dwReserved; */
680 NULL, /* LPVOID lpSurface; */
681 {
682 0, /* DWORD dwColorSpaceLowValue; */
683 0, /* DWORD dwColorSpaceHighValue; */
684 }, /* DDCOLORKEY ddckCKDestOverlay; */
685 {
686 0, /* DWORD dwColorSpaceLowValue; */
687 0, /* DWORD dwColorSpaceHighValue; */
688 }, /* DDCOLORKEY ddckCKDestBlt; */
689 {
690 0, /* DWORD dwColorSpaceLowValue; */
691 0, /* DWORD dwColorSpaceHighValue; */
692 }, /* DDCOLORKEY ddckCKSrcOverlay; */
693 {
694 0, /* DWORD dwColorSpaceLowValue; */
695 0, /* DWORD dwColorSpaceHighValue; */
696 }, /* DDCOLORKEY ddckCKSrcBlt; */
697 {
698 sizeof (DDPIXELFORMAT), /* DWORD dwSize; */
699 DDPF_RGB, /* DWORD dwFlags; */
700 0, /* DWORD dwFourCC; */
701 {
702 16, /* union */
703 /* DWORD dwRGBBitCount; */
704 /* DWORD dwYUVBitCount; */
705 /* DWORD dwZBufferBitDepth; */
706 /* DWORD dwAlphaBitDepth; */
707 /* DWORD dwLuminanceBitCount; */
708 /* DWORD dwBumpBitCount; */
709 },
710 {
711 0xf800, /* union */
712 /* DWORD dwRBitMask; */
713 /* DWORD dwYBitMask; */
714 /* DWORD dwStencilBitDepth; */
715 /* DWORD dwLuminanceBitMask; */
716 /* DWORD dwBumpDuBitMask; */
717 },
718 {
719 0x7e0,
720 /* DWORD dwGBitMask; */
721 /* DWORD dwUBitMask; */
722 /* DWORD dwZBitMask; */
723 /* DWORD dwBumpDvBitMask; */
724 },
725 {
726 0x1f,
727 /* DWORD dwBBitMask; */
728 /* DWORD dwVBitMask; */
729 /* DWORD dwStencilBitMask; */
730 /* DWORD dwBumpLuminanceBitMask; */
731 },
732 {
733 0,
734 /* DWORD dwRGBAlphaBitMask; */
735 /* DWORD dwYUVAlphaBitMask; */
736 /* DWORD dwLuminanceAlphaBitMask; */
737 /* DWORD dwRGBZBitMask; */
738 /* DWORD dwYUVZBitMask; */
739 },
740 }, /* DDPIXELFORMAT ddpfPixelFormat; */
741 {
742 DDSCAPS_BACKBUFFER
743 | DDSCAPS_COMPLEX
744 | DDSCAPS_FLIP
745 | DDSCAPS_FRONTBUFFER
746 | DDSCAPS_LOCALVIDMEM
747 | DDSCAPS_PRIMARYSURFACE
748 | DDSCAPS_VIDEOMEMORY
749 | DDSCAPS_VISIBLE /* DWORD dwCaps; */
750 } /* DDSCAPS ddsCaps; */
751 },
752};
753
754#ifdef VBOX_WITH_VIDEOHWACCEL
755
756static void vboxVhwaPopulateOverlayFourccSurfDesc(DDSURFACEDESC *pDesc, uint32_t fourcc)
757{
758 memset(pDesc, 0, sizeof (DDSURFACEDESC));
759
760 pDesc->dwSize = sizeof (DDSURFACEDESC);
761 pDesc->dwFlags = DDSD_CAPS | DDSD_PIXELFORMAT;
762 pDesc->ddpfPixelFormat.dwSize = sizeof (DDPIXELFORMAT);
763 pDesc->ddpfPixelFormat.dwFlags = DDPF_FOURCC;
764 pDesc->ddpfPixelFormat.dwFourCC = fourcc;
765 pDesc->ddsCaps.dwCaps = DDSCAPS_BACKBUFFER
766 | DDSCAPS_COMPLEX
767 | DDSCAPS_FLIP
768 | DDSCAPS_FRONTBUFFER
769 | DDSCAPS_LOCALVIDMEM
770 | DDSCAPS_OVERLAY
771 | DDSCAPS_VIDEOMEMORY
772 | DDSCAPS_VISIBLE;
773}
774
775static bool vboxPixFormatMatch(DDPIXELFORMAT *pFormat1, DDPIXELFORMAT *pFormat2)
776{
777 return !memcmp(pFormat1, pFormat2, sizeof (DDPIXELFORMAT));
778}
779
780HRESULT vboxSurfDescMerge(DDSURFACEDESC *paDescs, uint32_t *pcDescs, uint32_t cMaxDescs, DDSURFACEDESC *pDesc)
781{
782 uint32_t cDescs = *pcDescs;
783
784 Assert(cMaxDescs >= cDescs);
785 Assert(pDesc->dwFlags == (DDSD_CAPS | DDSD_PIXELFORMAT));
786 if (pDesc->dwFlags != (DDSD_CAPS | DDSD_PIXELFORMAT))
787 return E_INVALIDARG;
788
789 for (uint32_t i = 0; i < cDescs; ++i)
790 {
791 DDSURFACEDESC *pCur = &paDescs[i];
792 if (vboxPixFormatMatch(&pCur->ddpfPixelFormat, &pDesc->ddpfPixelFormat))
793 {
794 if (pDesc->dwFlags & DDSD_CAPS)
795 {
796 pCur->dwFlags |= DDSD_CAPS;
797 pCur->ddsCaps.dwCaps |= pDesc->ddsCaps.dwCaps;
798 }
799 return S_OK;
800 }
801 }
802
803 if (cMaxDescs > cDescs)
804 {
805 paDescs[cDescs] = *pDesc;
806 ++cDescs;
807 *pcDescs = cDescs;
808 return VINF_SUCCESS;
809 }
810 return E_FAIL;
811}
812
813HRESULT vboxFormatOpsMerge(FORMATOP *paOps, uint32_t *pcOps, uint32_t cMaxOps, FORMATOP *pOp)
814{
815 uint32_t cOps = *pcOps;
816
817 Assert(cMaxOps >= cOps);
818
819 for (uint32_t i = 0; i < cOps; ++i)
820 {
821 FORMATOP *pCur = &paOps[i];
822 if (pCur->Format == pOp->Format)
823 {
824 pCur->Operations |= pOp->Operations;
825 Assert(pCur->FlipMsTypes == pOp->FlipMsTypes);
826 Assert(pCur->BltMsTypes == pOp->BltMsTypes);
827 Assert(pCur->PrivateFormatBitCount == pOp->PrivateFormatBitCount);
828 return S_OK;
829 }
830 }
831
832 if (cMaxOps > cOps)
833 {
834 paOps[cOps] = *pOp;
835 ++cOps;
836 *pcOps = cOps;
837 return VINF_SUCCESS;
838 }
839 return E_FAIL;
840}
841
842HRESULT VBoxDispD3DGlobal2DFormatsInit(PVBOXWDDMDISP_ADAPTER pAdapter)
843{
844 HRESULT hr = S_OK;
845 memset(&pAdapter->D3D, 0, sizeof (pAdapter->D3D));
846 memset(&pAdapter->Formats, 0, sizeof (pAdapter->Formats));
847
848 /* just calc the max number of formats */
849 uint32_t cFormats = RT_ELEMENTS(gVBoxFormatOpsBase);
850 uint32_t cSurfDescs = RT_ELEMENTS(gVBoxSurfDescsBase);
851 uint32_t cOverlayFormats = 0;
852 for (uint32_t i = 0; i < pAdapter->cHeads; ++i)
853 {
854 VBOXDISPVHWA_INFO *pVhwa = &pAdapter->aHeads[i].Vhwa;
855 if (pVhwa->Settings.fFlags & VBOXVHWA_F_ENABLED)
856 {
857 cOverlayFormats += pVhwa->Settings.cFormats;
858 }
859 }
860
861 cFormats += cOverlayFormats;
862 cSurfDescs += cOverlayFormats;
863
864 uint32_t cbFormatOps = cFormats * sizeof (FORMATOP);
865 cbFormatOps = (cbFormatOps + 7) & ~3;
866 /* ensure the surf descs are 8 byte aligned */
867 uint32_t offSurfDescs = (cbFormatOps + 7) & ~3;
868 uint32_t cbSurfDescs = cSurfDescs * sizeof (DDSURFACEDESC);
869 uint32_t cbBuf = offSurfDescs + cbSurfDescs;
870 uint8_t* pvBuf = (uint8_t*)RTMemAllocZ(cbBuf);
871 if (pvBuf)
872 {
873 pAdapter->Formats.paFormstOps = (FORMATOP*)pvBuf;
874 memcpy ((void*)pAdapter->Formats.paFormstOps , gVBoxFormatOpsBase, sizeof (gVBoxFormatOpsBase));
875 pAdapter->Formats.cFormstOps = RT_ELEMENTS(gVBoxFormatOpsBase);
876
877 FORMATOP fo = {D3DDDIFMT_UNKNOWN, 0, 0, 0, 0};
878 for (uint32_t i = 0; i < pAdapter->cHeads; ++i)
879 {
880 VBOXDISPVHWA_INFO *pVhwa = &pAdapter->aHeads[i].Vhwa;
881 if (pVhwa->Settings.fFlags & VBOXVHWA_F_ENABLED)
882 {
883 for (uint32_t j = 0; j < pVhwa->Settings.cFormats; ++j)
884 {
885 fo.Format = pVhwa->Settings.aFormats[j];
886 fo.Operations = FORMATOP_OVERLAY;
887 hr = vboxFormatOpsMerge((FORMATOP *)pAdapter->Formats.paFormstOps, &pAdapter->Formats.cFormstOps, cFormats, &fo);
888 if (FAILED(hr))
889 {
890 WARN(("vboxFormatOpsMerge failed, hr 0x%x", hr));
891 }
892 }
893 }
894 }
895
896 pAdapter->Formats.paSurfDescs = (DDSURFACEDESC*)(pvBuf + offSurfDescs);
897 memcpy ((void*)pAdapter->Formats.paSurfDescs , gVBoxSurfDescsBase, sizeof (gVBoxSurfDescsBase));
898 pAdapter->Formats.cSurfDescs = RT_ELEMENTS(gVBoxSurfDescsBase);
899
900 DDSURFACEDESC sd;
901 for (uint32_t i = 0; i < pAdapter->cHeads; ++i)
902 {
903 VBOXDISPVHWA_INFO *pVhwa = &pAdapter->aHeads[i].Vhwa;
904 if (pVhwa->Settings.fFlags & VBOXVHWA_F_ENABLED)
905 {
906 for (uint32_t j = 0; j < pVhwa->Settings.cFormats; ++j)
907 {
908 uint32_t fourcc = vboxWddmFormatToFourcc(pVhwa->Settings.aFormats[j]);
909 if (fourcc)
910 {
911 vboxVhwaPopulateOverlayFourccSurfDesc(&sd, fourcc);
912 hr = vboxSurfDescMerge((DDSURFACEDESC *)pAdapter->Formats.paSurfDescs, &pAdapter->Formats.cSurfDescs, cSurfDescs, &sd);
913 if (FAILED(hr))
914 {
915 WARN(("vboxFormatOpsMerge failed, hr 0x%x", hr));
916 }
917 }
918 }
919 }
920 }
921 }
922 else
923 {
924 WARN(("RTMemAllocZ failed"));
925 return E_FAIL;
926 }
927 return S_OK;
928}
929
930void VBoxDispD3DGlobal2DFormatsTerm(PVBOXWDDMDISP_ADAPTER pAdapter)
931{
932 if (pAdapter->Formats.paFormstOps)
933 RTMemFree((void *)pAdapter->Formats.paFormstOps);
934}
935
936#endif
937
938static CRITICAL_SECTION g_VBoxDispD3DGlobalCritSect;
939static VBOXWDDMDISP_D3D g_VBoxDispD3DGlobalD3D;
940static VBOXWDDMDISP_FORMATS g_VBoxDispD3DGlobalD3DFormats;
941static uint32_t g_cVBoxDispD3DGlobalOpens;
942
943void vboxDispD3DGlobalLock()
944{
945 EnterCriticalSection(&g_VBoxDispD3DGlobalCritSect);
946}
947
948void vboxDispD3DGlobalUnlock()
949{
950 LeaveCriticalSection(&g_VBoxDispD3DGlobalCritSect);
951}
952
953void VBoxDispD3DGlobalInit()
954{
955 g_cVBoxDispD3DGlobalOpens = 0;
956 InitializeCriticalSection(&g_VBoxDispD3DGlobalCritSect);
957}
958
959void VBoxDispD3DGlobalTerm()
960{
961 DeleteCriticalSection(&g_VBoxDispD3DGlobalCritSect);
962}
963
964static void vboxDispD3DGlobalD3DFormatsInit(PVBOXWDDMDISP_FORMATS pFormats)
965{
966 memset(pFormats, 0, sizeof (pFormats));
967 pFormats->paFormstOps = gVBoxFormatOps3D;
968 pFormats->cFormstOps = RT_ELEMENTS(gVBoxFormatOps3D);
969}
970
971static HRESULT vboxWddmGetD3D9Caps(PVBOXWDDMDISP_D3D pD3D, D3DCAPS9 *pCaps)
972{
973 HRESULT hr = pD3D->pD3D9If->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, pCaps);
974 if (FAILED(hr))
975 {
976 WARN(("GetDeviceCaps failed hr(0x%x)",hr));
977 return hr;
978 }
979
980 /* needed for Windows Media Player to work properly */
981 pCaps->Caps |= D3DCAPS_READ_SCANLINE;
982 pCaps->Caps2 |= 0x00080000 /*D3DCAPS2_CANRENDERWINDOWED*/;
983 pCaps->Caps2 |= D3DCAPS2_CANSHARERESOURCE;
984 pCaps->DevCaps |= D3DDEVCAPS_FLOATTLVERTEX /* <- must be set according to the docs */
985 /*| D3DDEVCAPS_HWVERTEXBUFFER | D3DDEVCAPS_HWINDEXBUFFER | D3DDEVCAPS_SUBVOLUMELOCK */;
986 pCaps->PrimitiveMiscCaps |= D3DPMISCCAPS_INDEPENDENTWRITEMASKS
987 | D3DPMISCCAPS_FOGINFVF
988 | D3DPMISCCAPS_SEPARATEALPHABLEND | D3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS;
989 pCaps->RasterCaps |= D3DPRASTERCAPS_SUBPIXEL | D3DPRASTERCAPS_STIPPLE | D3DPRASTERCAPS_ZBIAS | D3DPRASTERCAPS_COLORPERSPECTIVE /* keep */;
990 pCaps->TextureCaps |= D3DPTEXTURECAPS_TRANSPARENCY | D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE;
991 pCaps->TextureAddressCaps |= D3DPTADDRESSCAPS_MIRRORONCE;
992 pCaps->VolumeTextureAddressCaps |= D3DPTADDRESSCAPS_MIRRORONCE;
993 pCaps->StencilCaps |= D3DSTENCILCAPS_TWOSIDED;
994 pCaps->DeclTypes |= D3DDTCAPS_FLOAT16_2 | D3DDTCAPS_FLOAT16_4;
995 pCaps->VertexTextureFilterCaps |= D3DPTFILTERCAPS_MINFPOINT | D3DPTFILTERCAPS_MAGFPOINT;
996 pCaps->GuardBandLeft = -8192.;
997 pCaps->GuardBandTop = -8192.;
998 pCaps->GuardBandRight = 8192.;
999 pCaps->GuardBandBottom = 8192.;
1000 pCaps->VS20Caps.DynamicFlowControlDepth = 24;
1001 pCaps->VS20Caps.NumTemps = D3DVS20_MAX_NUMTEMPS;
1002 pCaps->PS20Caps.DynamicFlowControlDepth = 24;
1003 pCaps->PS20Caps.NumTemps = D3DVS20_MAX_NUMTEMPS;
1004
1005 /* workaround for wine not returning InstructionSlots correctly for shaders v3.0 */
1006 if ((pCaps->VertexShaderVersion & 0xff00) == 0x0300)
1007 {
1008 pCaps->MaxVertexShader30InstructionSlots = RT_MIN(32768, pCaps->MaxVertexShader30InstructionSlots);
1009 pCaps->MaxPixelShader30InstructionSlots = RT_MIN(32768, pCaps->MaxPixelShader30InstructionSlots);
1010 }
1011#if defined(DEBUG)
1012 if ((pCaps->VertexShaderVersion & 0xff00) == 0x0300)
1013 {
1014 Assert(pCaps->MaxVertexShader30InstructionSlots >= 512);
1015 Assert(pCaps->MaxVertexShader30InstructionSlots <= 32768);
1016 Assert(pCaps->MaxPixelShader30InstructionSlots >= 512);
1017 Assert(pCaps->MaxPixelShader30InstructionSlots <= 32768);
1018 }
1019 else if ((pCaps->VertexShaderVersion & 0xff00) == 0x0200)
1020 {
1021 Assert(pCaps->MaxVertexShader30InstructionSlots == 0);
1022 Assert(pCaps->MaxPixelShader30InstructionSlots == 0);
1023 }
1024 else
1025 {
1026 WARN(("incorect shader caps!"));
1027 }
1028#endif
1029
1030 vboxDispDumpD3DCAPS9(pCaps);
1031
1032 return S_OK;
1033}
1034
1035static void vboxDispD3DGlobalDoClose(PVBOXWDDMDISP_D3D pD3D)
1036{
1037 pD3D->pD3D9If->Release();
1038 VBoxDispD3DClose(&pD3D->D3D);
1039}
1040
1041static HRESULT vboxDispD3DGlobalDoOpen(PVBOXWDDMDISP_D3D pD3D)
1042{
1043 memset(pD3D, 0, sizeof (*pD3D));
1044 HRESULT hr = VBoxDispD3DOpen(&pD3D->D3D);
1045 if (SUCCEEDED(hr))
1046 {
1047 hr = pD3D->D3D.pfnDirect3DCreate9Ex(D3D_SDK_VERSION, &pD3D->pD3D9If);
1048 if (SUCCEEDED(hr))
1049 {
1050 hr = vboxWddmGetD3D9Caps(pD3D, &pD3D->Caps);
1051 if (SUCCEEDED(hr))
1052 {
1053 pD3D->cMaxSimRTs = pD3D->Caps.NumSimultaneousRTs;
1054 Assert(pD3D->cMaxSimRTs);
1055 Assert(pD3D->cMaxSimRTs < UINT32_MAX/2);
1056 LOG(("SUCCESS 3D Enabled, pD3D (0x%p)", pD3D));
1057 return S_OK;
1058 }
1059 else
1060 {
1061 WARN(("vboxWddmGetD3D9Caps failed hr = 0x%x", hr));
1062 }
1063 pD3D->pD3D9If->Release();
1064 }
1065 else
1066 {
1067 WARN(("pfnDirect3DCreate9Ex failed hr = 0x%x", hr));
1068 }
1069 VBoxDispD3DClose(&pD3D->D3D);
1070 }
1071 else
1072 {
1073 WARN(("VBoxDispD3DOpen failed hr = 0x%x", hr));
1074 }
1075 return hr;
1076}
1077
1078HRESULT VBoxDispD3DGlobalOpen(PVBOXWDDMDISP_D3D pD3D, PVBOXWDDMDISP_FORMATS pFormats)
1079{
1080 vboxDispD3DGlobalLock();
1081 if (!g_cVBoxDispD3DGlobalOpens)
1082 {
1083 HRESULT hr = vboxDispD3DGlobalDoOpen(&g_VBoxDispD3DGlobalD3D);
1084 if (!SUCCEEDED(hr))
1085 {
1086 WARN(("vboxDispD3DGlobalDoOpen failed hr = 0x%x", hr));
1087 return hr;
1088 }
1089
1090 vboxDispD3DGlobalD3DFormatsInit(&g_VBoxDispD3DGlobalD3DFormats);
1091 }
1092 ++g_cVBoxDispD3DGlobalOpens;
1093 vboxDispD3DGlobalUnlock();
1094
1095 *pD3D = g_VBoxDispD3DGlobalD3D;
1096 *pFormats = g_VBoxDispD3DGlobalD3DFormats;
1097 return S_OK;
1098}
1099
1100void VBoxDispD3DGlobalClose(PVBOXWDDMDISP_D3D pD3D, PVBOXWDDMDISP_FORMATS pFormats)
1101{
1102 vboxDispD3DGlobalLock();
1103 --g_cVBoxDispD3DGlobalOpens;
1104 if (!g_cVBoxDispD3DGlobalOpens)
1105 {
1106 vboxDispD3DGlobalDoClose(&g_VBoxDispD3DGlobalD3D);
1107 }
1108 vboxDispD3DGlobalUnlock();
1109}
Note: See TracBrowser for help on using the repository browser.

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