1 /*
2 * Copyright 2011 Joakim Sindholt <opensource@zhasha.com>
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * on the rights to use, copy, modify, merge, publish, distribute, sub
8 * license, and/or sell copies of the Software, and to permit persons to whom
9 * the Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21 * USE OR OTHER DEALINGS IN THE SOFTWARE. */
22
23 #include "device9.h"
24 #include "device9ex.h"
25 #include "nine_pipe.h"
26 #include "swapchain9ex.h"
27
28 #include "nine_helpers.h"
29
30 #include "util/macros.h"
31
32 #define DBG_CHANNEL DBG_DEVICE
33
34 static HRESULT
NineDevice9Ex_ctor(struct NineDevice9Ex * This,struct NineUnknownParams * pParams,struct pipe_screen * pScreen,D3DDEVICE_CREATION_PARAMETERS * pCreationParameters,D3DCAPS9 * pCaps,D3DPRESENT_PARAMETERS * pPresentationParameters,D3DDISPLAYMODEEX * pFullscreenDisplayMode,IDirect3D9Ex * pD3D9Ex,ID3DPresentGroup * pPresentationGroup,struct d3dadapter9_context * pCTX,int minorVersionNum)35 NineDevice9Ex_ctor( struct NineDevice9Ex *This,
36 struct NineUnknownParams *pParams,
37 struct pipe_screen *pScreen,
38 D3DDEVICE_CREATION_PARAMETERS *pCreationParameters,
39 D3DCAPS9 *pCaps,
40 D3DPRESENT_PARAMETERS *pPresentationParameters,
41 D3DDISPLAYMODEEX *pFullscreenDisplayMode,
42 IDirect3D9Ex *pD3D9Ex,
43 ID3DPresentGroup *pPresentationGroup,
44 struct d3dadapter9_context *pCTX,
45 int minorVersionNum )
46 {
47 DBG("This=%p pParams=%p pScreen=%p pCreationParameters=%p pCaps=%p "
48 "pPresentationParameters=%p pFullscreenDisplayMode=%p "
49 "pD3D9Ex=%p pPresentationGroup=%p pCTX=%p\n",
50 This, pParams, pScreen, pCreationParameters, pCaps,
51 pPresentationParameters, pFullscreenDisplayMode,
52 pD3D9Ex, pPresentationGroup, pCTX);
53
54 return NineDevice9_ctor(&This->base, pParams,
55 pScreen, pCreationParameters, pCaps,
56 pPresentationParameters,
57 (IDirect3D9 *)pD3D9Ex, pPresentationGroup, pCTX,
58 TRUE, pFullscreenDisplayMode, minorVersionNum);
59 }
60
61 static void
NineDevice9Ex_dtor(struct NineDevice9Ex * This)62 NineDevice9Ex_dtor( struct NineDevice9Ex *This )
63 {
64 NineDevice9_dtor(&This->base);
65 }
66
67 HRESULT NINE_WINAPI
NineDevice9Ex_SetConvolutionMonoKernel(UNUSED struct NineDevice9Ex * This,UNUSED UINT width,UNUSED UINT height,UNUSED float * rows,UNUSED float * columns)68 NineDevice9Ex_SetConvolutionMonoKernel( UNUSED struct NineDevice9Ex *This,
69 UNUSED UINT width,
70 UNUSED UINT height,
71 UNUSED float *rows,
72 UNUSED float *columns )
73 {
74 DBG("This\n");
75 STUB(D3D_OK);
76 }
77
78 HRESULT NINE_WINAPI
NineDevice9Ex_ComposeRects(UNUSED struct NineDevice9Ex * This,UNUSED IDirect3DSurface9 * pSrc,UNUSED IDirect3DSurface9 * pDst,UNUSED IDirect3DVertexBuffer9 * pSrcRectDescs,UNUSED UINT NumRects,UNUSED IDirect3DVertexBuffer9 * pDstRectDescs,UNUSED D3DCOMPOSERECTSOP Operation,UNUSED int Xoffset,UNUSED int Yoffset)79 NineDevice9Ex_ComposeRects( UNUSED struct NineDevice9Ex *This,
80 UNUSED IDirect3DSurface9 *pSrc,
81 UNUSED IDirect3DSurface9 *pDst,
82 UNUSED IDirect3DVertexBuffer9 *pSrcRectDescs,
83 UNUSED UINT NumRects,
84 UNUSED IDirect3DVertexBuffer9 *pDstRectDescs,
85 UNUSED D3DCOMPOSERECTSOP Operation,
86 UNUSED int Xoffset,
87 UNUSED int Yoffset )
88 {
89 DBG("This\n");
90 STUB(D3D_OK);
91 }
92
93 HRESULT NINE_WINAPI
NineDevice9Ex_PresentEx(struct NineDevice9Ex * This,const RECT * pSourceRect,const RECT * pDestRect,HWND hDestWindowOverride,const RGNDATA * pDirtyRegion,DWORD dwFlags)94 NineDevice9Ex_PresentEx( struct NineDevice9Ex *This,
95 const RECT *pSourceRect,
96 const RECT *pDestRect,
97 HWND hDestWindowOverride,
98 const RGNDATA *pDirtyRegion,
99 DWORD dwFlags )
100 {
101 unsigned i;
102 HRESULT hr;
103
104 DBG("This=%p pSourceRect=%p pDestRect=%p hDestWindowOverride=%p "
105 "pDirtyRegion=%p dwFlags=%d\n",
106 This, pSourceRect, pDestRect, hDestWindowOverride,
107 pDirtyRegion, dwFlags);
108
109 for (i = 0; i < This->base.nswapchains; i++) {
110 hr = NineSwapChain9_Present(This->base.swapchains[i], pSourceRect, pDestRect,
111 hDestWindowOverride, pDirtyRegion, dwFlags);
112 if (FAILED(hr)) { return hr; }
113 }
114
115 return D3D_OK;
116 }
117
118 HRESULT NINE_WINAPI
NineDevice9Ex_GetGPUThreadPriority(struct NineDevice9Ex * This,INT * pPriority)119 NineDevice9Ex_GetGPUThreadPriority( struct NineDevice9Ex *This,
120 INT *pPriority )
121 {
122 DBG("This\n");
123 user_assert(pPriority != NULL, D3DERR_INVALIDCALL);
124 *pPriority = This->base.gpu_priority;
125 return D3D_OK;
126 }
127
128 HRESULT NINE_WINAPI
NineDevice9Ex_SetGPUThreadPriority(struct NineDevice9Ex * This,INT Priority)129 NineDevice9Ex_SetGPUThreadPriority( struct NineDevice9Ex *This,
130 INT Priority )
131 {
132 DBG("This\n");
133 user_assert(Priority >= -7 && Priority <= 7, D3DERR_INVALIDCALL);
134 This->base.gpu_priority = Priority;
135 return D3D_OK;
136 }
137
138 HRESULT NINE_WINAPI
NineDevice9Ex_WaitForVBlank(UNUSED struct NineDevice9Ex * This,UNUSED UINT iSwapChain)139 NineDevice9Ex_WaitForVBlank( UNUSED struct NineDevice9Ex *This,
140 UNUSED UINT iSwapChain )
141 {
142 DBG("This\n");
143 STUB(D3D_OK);
144 }
145
146 HRESULT NINE_WINAPI
NineDevice9Ex_CheckResourceResidency(UNUSED struct NineDevice9Ex * This,UNUSED IDirect3DResource9 ** pResourceArray,UNUSED UINT32 NumResources)147 NineDevice9Ex_CheckResourceResidency( UNUSED struct NineDevice9Ex *This,
148 UNUSED IDirect3DResource9 **pResourceArray,
149 UNUSED UINT32 NumResources )
150 {
151 DBG("This\n");
152 STUB(D3D_OK);
153 }
154
155 HRESULT NINE_WINAPI
NineDevice9Ex_SetMaximumFrameLatency(struct NineDevice9Ex * This,UINT MaxLatency)156 NineDevice9Ex_SetMaximumFrameLatency( struct NineDevice9Ex *This,
157 UINT MaxLatency )
158 {
159 DBG("This\n");
160 This->base.max_frame_latency = MaxLatency;
161 return D3D_OK;
162 }
163
164 HRESULT NINE_WINAPI
NineDevice9Ex_GetMaximumFrameLatency(struct NineDevice9Ex * This,UINT * pMaxLatency)165 NineDevice9Ex_GetMaximumFrameLatency( struct NineDevice9Ex *This,
166 UINT *pMaxLatency )
167 {
168 DBG("This\n");
169 user_assert(pMaxLatency != NULL, D3DERR_INVALIDCALL);
170 *pMaxLatency = This->base.max_frame_latency;
171 return D3D_OK;
172 }
173
174 HRESULT NINE_WINAPI
NineDevice9Ex_CheckDeviceState(struct NineDevice9Ex * This,HWND hDestinationWindow)175 NineDevice9Ex_CheckDeviceState( struct NineDevice9Ex *This,
176 HWND hDestinationWindow )
177 {
178 DBG("This=%p hDestinationWindow=%p\n",
179 This, hDestinationWindow);
180
181 user_assert(!This->base.swapchains[0]->params.Windowed, D3D_OK);
182
183 if (This->base.params.hFocusWindow == hDestinationWindow) {
184 if (NineSwapChain9_GetOccluded(This->base.swapchains[0]))
185 return S_PRESENT_OCCLUDED;
186 } else if(!NineSwapChain9_GetOccluded(This->base.swapchains[0])) {
187 return S_PRESENT_OCCLUDED;
188 }
189 /* TODO: handle the other return values */
190 return D3D_OK;
191 }
192
193 HRESULT NINE_WINAPI
NineDevice9Ex_CreateRenderTargetEx(struct NineDevice9Ex * This,UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Lockable,IDirect3DSurface9 ** ppSurface,HANDLE * pSharedHandle,UNUSED DWORD Usage)194 NineDevice9Ex_CreateRenderTargetEx( struct NineDevice9Ex *This,
195 UINT Width,
196 UINT Height,
197 D3DFORMAT Format,
198 D3DMULTISAMPLE_TYPE MultiSample,
199 DWORD MultisampleQuality,
200 BOOL Lockable,
201 IDirect3DSurface9 **ppSurface,
202 HANDLE *pSharedHandle,
203 UNUSED DWORD Usage )
204 {
205 DBG("This\n");
206 /* The Create*Ex functions only purpose seem to introduce the
207 * Usage field, to pass the new d3d9ex flags on secure/restricted
208 * content.
209 * TODO: Return error on invalid Usage.
210 * TODO: Store Usage in the surface descriptor, in case the
211 * app checks */
212 return NineDevice9_CreateRenderTarget(&This->base,
213 Width,
214 Height,
215 Format,
216 MultiSample,
217 MultisampleQuality,
218 Lockable,
219 ppSurface,
220 pSharedHandle);
221 }
222
223 HRESULT NINE_WINAPI
NineDevice9Ex_CreateOffscreenPlainSurfaceEx(struct NineDevice9Ex * This,UINT Width,UINT Height,D3DFORMAT Format,D3DPOOL Pool,IDirect3DSurface9 ** ppSurface,HANDLE * pSharedHandle,UNUSED DWORD Usage)224 NineDevice9Ex_CreateOffscreenPlainSurfaceEx( struct NineDevice9Ex *This,
225 UINT Width,
226 UINT Height,
227 D3DFORMAT Format,
228 D3DPOOL Pool,
229 IDirect3DSurface9 **ppSurface,
230 HANDLE *pSharedHandle,
231 UNUSED DWORD Usage )
232 {
233 DBG("This\n");
234 /* The Create*Ex functions only purpose seem to introduce the
235 * Usage field, to pass the new d3d9ex flags on secure/restricted
236 * content.
237 * TODO: Return error on invalid Usage.
238 * TODO: Store Usage in the surface descriptor, in case the
239 * app checks */
240 return NineDevice9_CreateOffscreenPlainSurface(&This->base,
241 Width,
242 Height,
243 Format,
244 Pool,
245 ppSurface,
246 pSharedHandle);
247 }
248
249 HRESULT NINE_WINAPI
NineDevice9Ex_CreateDepthStencilSurfaceEx(struct NineDevice9Ex * This,UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Discard,IDirect3DSurface9 ** ppSurface,HANDLE * pSharedHandle,UNUSED DWORD Usage)250 NineDevice9Ex_CreateDepthStencilSurfaceEx( struct NineDevice9Ex *This,
251 UINT Width,
252 UINT Height,
253 D3DFORMAT Format,
254 D3DMULTISAMPLE_TYPE MultiSample,
255 DWORD MultisampleQuality,
256 BOOL Discard,
257 IDirect3DSurface9 **ppSurface,
258 HANDLE *pSharedHandle,
259 UNUSED DWORD Usage )
260 {
261 DBG("This\n");
262 /* The Create*Ex functions only purpose seem to introduce the
263 * Usage field, to pass the new d3d9ex flags on secure/restricted
264 * content.
265 * TODO: Return error on invalid Usage.
266 * TODO: Store Usage in the surface descriptor, in case the
267 * app checks */
268 return NineDevice9_CreateDepthStencilSurface(&This->base,
269 Width,
270 Height,
271 Format,
272 MultiSample,
273 MultisampleQuality,
274 Discard,
275 ppSurface,
276 pSharedHandle);
277 }
278
279 HRESULT NINE_WINAPI
NineDevice9Ex_ResetEx(struct NineDevice9Ex * This,D3DPRESENT_PARAMETERS * pPresentationParameters,D3DDISPLAYMODEEX * pFullscreenDisplayMode)280 NineDevice9Ex_ResetEx( struct NineDevice9Ex *This,
281 D3DPRESENT_PARAMETERS *pPresentationParameters,
282 D3DDISPLAYMODEEX *pFullscreenDisplayMode )
283 {
284 HRESULT hr = D3D_OK;
285 float MinZ, MaxZ;
286 unsigned i;
287
288 DBG("This=%p pPresentationParameters=%p pFullscreenDisplayMode=%p\n", This, pPresentationParameters, pFullscreenDisplayMode);
289
290 for (i = 0; i < This->base.nswapchains; ++i) {
291 D3DDISPLAYMODEEX *mode = NULL;
292 D3DPRESENT_PARAMETERS *params = &pPresentationParameters[i];
293 if (pFullscreenDisplayMode) mode = &(pFullscreenDisplayMode[i]);
294 hr = NineSwapChain9_Resize(This->base.swapchains[i], params, mode);
295 if (FAILED(hr))
296 break;
297 }
298
299 MinZ = This->base.state.viewport.MinZ; /* These are preserved */
300 MaxZ = This->base.state.viewport.MaxZ;
301 NineDevice9_SetRenderTarget(
302 (struct NineDevice9 *)This, 0, (IDirect3DSurface9 *)This->base.swapchains[0]->buffers[0]);
303 This->base.state.viewport.MinZ = MinZ;
304 This->base.state.viewport.MaxZ = MaxZ;
305 nine_context_set_viewport(&This->base, &This->base.state.viewport);
306
307 if (This->base.nswapchains && This->base.swapchains[0]->params.EnableAutoDepthStencil)
308 NineDevice9_SetDepthStencilSurface(
309 &This->base, (IDirect3DSurface9 *)This->base.swapchains[0]->zsbuf);
310
311 return hr;
312 }
313
314 HRESULT NINE_WINAPI
NineDevice9Ex_Reset(struct NineDevice9Ex * This,D3DPRESENT_PARAMETERS * pPresentationParameters)315 NineDevice9Ex_Reset( struct NineDevice9Ex *This,
316 D3DPRESENT_PARAMETERS *pPresentationParameters )
317 {
318 HRESULT hr = D3D_OK;
319 float MinZ, MaxZ;
320 unsigned i;
321
322 DBG("This=%p pPresentationParameters=%p\n", This, pPresentationParameters);
323
324 for (i = 0; i < This->base.nswapchains; ++i) {
325 D3DPRESENT_PARAMETERS *params = &pPresentationParameters[i];
326 hr = NineSwapChain9_Resize(This->base.swapchains[i], params, NULL);
327 if (FAILED(hr))
328 break;
329 }
330
331 MinZ = This->base.state.viewport.MinZ; /* These are preserved */
332 MaxZ = This->base.state.viewport.MaxZ;
333 NineDevice9_SetRenderTarget(
334 (struct NineDevice9 *)This, 0, (IDirect3DSurface9 *)This->base.swapchains[0]->buffers[0]);
335 This->base.state.viewport.MinZ = MinZ;
336 This->base.state.viewport.MaxZ = MaxZ;
337 nine_context_set_viewport(&This->base, &This->base.state.viewport);
338
339 if (This->base.nswapchains && This->base.swapchains[0]->params.EnableAutoDepthStencil)
340 NineDevice9_SetDepthStencilSurface(
341 &This->base, (IDirect3DSurface9 *)This->base.swapchains[0]->zsbuf);
342
343 return hr;
344 }
345
346 HRESULT NINE_WINAPI
NineDevice9Ex_GetDisplayModeEx(struct NineDevice9Ex * This,UINT iSwapChain,D3DDISPLAYMODEEX * pMode,D3DDISPLAYROTATION * pRotation)347 NineDevice9Ex_GetDisplayModeEx( struct NineDevice9Ex *This,
348 UINT iSwapChain,
349 D3DDISPLAYMODEEX *pMode,
350 D3DDISPLAYROTATION *pRotation )
351 {
352 struct NineSwapChain9Ex *swapchain;
353
354 DBG("This=%p iSwapChain=%u pMode=%p pRotation=%p\n",
355 This, iSwapChain, pMode, pRotation);
356
357 user_assert(iSwapChain < This->base.nswapchains, D3DERR_INVALIDCALL);
358
359 swapchain = NineSwapChain9Ex(This->base.swapchains[iSwapChain]);
360 return NineSwapChain9Ex_GetDisplayModeEx(swapchain, pMode, pRotation);
361 }
362
363 HRESULT NINE_WINAPI
NineDevice9Ex_TestCooperativeLevel(UNUSED struct NineDevice9Ex * This)364 NineDevice9Ex_TestCooperativeLevel( UNUSED struct NineDevice9Ex *This )
365 {
366 DBG("This\n");
367 return D3D_OK;
368 }
369
370
371 IDirect3DDevice9ExVtbl NineDevice9Ex_vtable = {
372 (void *)NineUnknown_QueryInterface,
373 (void *)NineUnknown_AddRef,
374 (void *)NineUnknown_Release,
375 (void *)NineDevice9Ex_TestCooperativeLevel,
376 (void *)NineDevice9_GetAvailableTextureMem,
377 (void *)NineDevice9_EvictManagedResources,
378 (void *)NineDevice9_GetDirect3D,
379 (void *)NineDevice9_GetDeviceCaps,
380 (void *)NineDevice9_GetDisplayMode,
381 (void *)NineDevice9_GetCreationParameters,
382 (void *)NineDevice9_SetCursorProperties,
383 (void *)NineDevice9_SetCursorPosition,
384 (void *)NineDevice9_ShowCursor,
385 (void *)NineDevice9_CreateAdditionalSwapChain,
386 (void *)NineDevice9_GetSwapChain,
387 (void *)NineDevice9_GetNumberOfSwapChains,
388 (void *)NineDevice9Ex_Reset,
389 (void *)NineDevice9_Present,
390 (void *)NineDevice9_GetBackBuffer,
391 (void *)NineDevice9_GetRasterStatus,
392 (void *)NineDevice9_SetDialogBoxMode,
393 (void *)NineDevice9_SetGammaRamp,
394 (void *)NineDevice9_GetGammaRamp,
395 (void *)NineDevice9_CreateTexture,
396 (void *)NineDevice9_CreateVolumeTexture,
397 (void *)NineDevice9_CreateCubeTexture,
398 (void *)NineDevice9_CreateVertexBuffer,
399 (void *)NineDevice9_CreateIndexBuffer,
400 (void *)NineDevice9_CreateRenderTarget,
401 (void *)NineDevice9_CreateDepthStencilSurface,
402 (void *)NineDevice9_UpdateSurface,
403 (void *)NineDevice9_UpdateTexture,
404 (void *)NineDevice9_GetRenderTargetData,
405 (void *)NineDevice9_GetFrontBufferData,
406 (void *)NineDevice9_StretchRect,
407 (void *)NineDevice9_ColorFill,
408 (void *)NineDevice9_CreateOffscreenPlainSurface,
409 (void *)NineDevice9_SetRenderTarget,
410 (void *)NineDevice9_GetRenderTarget,
411 (void *)NineDevice9_SetDepthStencilSurface,
412 (void *)NineDevice9_GetDepthStencilSurface,
413 (void *)NineDevice9_BeginScene,
414 (void *)NineDevice9_EndScene,
415 (void *)NineDevice9_Clear,
416 (void *)NineDevice9_SetTransform,
417 (void *)NineDevice9_GetTransform,
418 (void *)NineDevice9_MultiplyTransform,
419 (void *)NineDevice9_SetViewport,
420 (void *)NineDevice9_GetViewport,
421 (void *)NineDevice9_SetMaterial,
422 (void *)NineDevice9_GetMaterial,
423 (void *)NineDevice9_SetLight,
424 (void *)NineDevice9_GetLight,
425 (void *)NineDevice9_LightEnable,
426 (void *)NineDevice9_GetLightEnable,
427 (void *)NineDevice9_SetClipPlane,
428 (void *)NineDevice9_GetClipPlane,
429 (void *)NineDevice9_SetRenderState,
430 (void *)NineDevice9_GetRenderState,
431 (void *)NineDevice9_CreateStateBlock,
432 (void *)NineDevice9_BeginStateBlock,
433 (void *)NineDevice9_EndStateBlock,
434 (void *)NineDevice9_SetClipStatus,
435 (void *)NineDevice9_GetClipStatus,
436 (void *)NineDevice9_GetTexture,
437 (void *)NineDevice9_SetTexture,
438 (void *)NineDevice9_GetTextureStageState,
439 (void *)NineDevice9_SetTextureStageState,
440 (void *)NineDevice9_GetSamplerState,
441 (void *)NineDevice9_SetSamplerState,
442 (void *)NineDevice9_ValidateDevice,
443 (void *)NineDevice9_SetPaletteEntries,
444 (void *)NineDevice9_GetPaletteEntries,
445 (void *)NineDevice9_SetCurrentTexturePalette,
446 (void *)NineDevice9_GetCurrentTexturePalette,
447 (void *)NineDevice9_SetScissorRect,
448 (void *)NineDevice9_GetScissorRect,
449 (void *)NineDevice9_SetSoftwareVertexProcessing,
450 (void *)NineDevice9_GetSoftwareVertexProcessing,
451 (void *)NineDevice9_SetNPatchMode,
452 (void *)NineDevice9_GetNPatchMode,
453 (void *)NineDevice9_DrawPrimitive,
454 (void *)NineDevice9_DrawIndexedPrimitive,
455 (void *)NineDevice9_DrawPrimitiveUP,
456 (void *)NineDevice9_DrawIndexedPrimitiveUP,
457 (void *)NineDevice9_ProcessVertices,
458 (void *)NineDevice9_CreateVertexDeclaration,
459 (void *)NineDevice9_SetVertexDeclaration,
460 (void *)NineDevice9_GetVertexDeclaration,
461 (void *)NineDevice9_SetFVF,
462 (void *)NineDevice9_GetFVF,
463 (void *)NineDevice9_CreateVertexShader,
464 (void *)NineDevice9_SetVertexShader,
465 (void *)NineDevice9_GetVertexShader,
466 (void *)NineDevice9_SetVertexShaderConstantF,
467 (void *)NineDevice9_GetVertexShaderConstantF,
468 (void *)NineDevice9_SetVertexShaderConstantI,
469 (void *)NineDevice9_GetVertexShaderConstantI,
470 (void *)NineDevice9_SetVertexShaderConstantB,
471 (void *)NineDevice9_GetVertexShaderConstantB,
472 (void *)NineDevice9_SetStreamSource,
473 (void *)NineDevice9_GetStreamSource,
474 (void *)NineDevice9_SetStreamSourceFreq,
475 (void *)NineDevice9_GetStreamSourceFreq,
476 (void *)NineDevice9_SetIndices,
477 (void *)NineDevice9_GetIndices,
478 (void *)NineDevice9_CreatePixelShader,
479 (void *)NineDevice9_SetPixelShader,
480 (void *)NineDevice9_GetPixelShader,
481 (void *)NineDevice9_SetPixelShaderConstantF,
482 (void *)NineDevice9_GetPixelShaderConstantF,
483 (void *)NineDevice9_SetPixelShaderConstantI,
484 (void *)NineDevice9_GetPixelShaderConstantI,
485 (void *)NineDevice9_SetPixelShaderConstantB,
486 (void *)NineDevice9_GetPixelShaderConstantB,
487 (void *)NineDevice9_DrawRectPatch,
488 (void *)NineDevice9_DrawTriPatch,
489 (void *)NineDevice9_DeletePatch,
490 (void *)NineDevice9_CreateQuery,
491 (void *)NineDevice9Ex_SetConvolutionMonoKernel,
492 (void *)NineDevice9Ex_ComposeRects,
493 (void *)NineDevice9Ex_PresentEx,
494 (void *)NineDevice9Ex_GetGPUThreadPriority,
495 (void *)NineDevice9Ex_SetGPUThreadPriority,
496 (void *)NineDevice9Ex_WaitForVBlank,
497 (void *)NineDevice9Ex_CheckResourceResidency,
498 (void *)NineDevice9Ex_SetMaximumFrameLatency,
499 (void *)NineDevice9Ex_GetMaximumFrameLatency,
500 (void *)NineDevice9Ex_CheckDeviceState,
501 (void *)NineDevice9Ex_CreateRenderTargetEx,
502 (void *)NineDevice9Ex_CreateOffscreenPlainSurfaceEx,
503 (void *)NineDevice9Ex_CreateDepthStencilSurfaceEx,
504 (void *)NineDevice9Ex_ResetEx,
505 (void *)NineDevice9Ex_GetDisplayModeEx
506 };
507
508 static const GUID *NineDevice9Ex_IIDs[] = {
509 &IID_IDirect3DDevice9Ex,
510 &IID_IDirect3DDevice9,
511 &IID_IUnknown,
512 NULL
513 };
514
515 HRESULT
NineDevice9Ex_new(struct pipe_screen * pScreen,D3DDEVICE_CREATION_PARAMETERS * pCreationParameters,D3DCAPS9 * pCaps,D3DPRESENT_PARAMETERS * pPresentationParameters,D3DDISPLAYMODEEX * pFullscreenDisplayMode,IDirect3D9Ex * pD3D9Ex,ID3DPresentGroup * pPresentationGroup,struct d3dadapter9_context * pCTX,struct NineDevice9Ex ** ppOut,int minorVersionNum)516 NineDevice9Ex_new( struct pipe_screen *pScreen,
517 D3DDEVICE_CREATION_PARAMETERS *pCreationParameters,
518 D3DCAPS9 *pCaps,
519 D3DPRESENT_PARAMETERS *pPresentationParameters,
520 D3DDISPLAYMODEEX *pFullscreenDisplayMode,
521 IDirect3D9Ex *pD3D9Ex,
522 ID3DPresentGroup *pPresentationGroup,
523 struct d3dadapter9_context *pCTX,
524 struct NineDevice9Ex **ppOut,
525 int minorVersionNum )
526 {
527 BOOL lock;
528 lock = !!(pCreationParameters->BehaviorFlags & D3DCREATE_MULTITHREADED);
529
530 NINE_NEW(Device9Ex, ppOut, lock,
531 pScreen, pCreationParameters, pCaps, pPresentationParameters,
532 pFullscreenDisplayMode, pD3D9Ex, pPresentationGroup, pCTX, minorVersionNum );
533 }
534
535