1 /**************************************************************************
2  *
3  * Copyright 2012-2021 VMware, Inc.
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the
8  * "Software"), to deal in the Software without restriction, including
9  * without limitation the rights to use, copy, modify, merge, publish,
10  * distribute, sub license, and/or sell copies of the Software, and to
11  * permit persons to whom the Software is furnished to do so, subject to
12  * the following conditions:
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
18  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20  * USE OR OTHER DEALINGS IN THE SOFTWARE.
21  *
22  * The above copyright notice and this permission notice (including the
23  * next paragraph) shall be included in all copies or substantial portions
24  * of the Software.
25  *
26  **************************************************************************/
27 
28 /*
29  * Device.cpp --
30  *    Functions that provide the 3D device functionality.
31  */
32 
33 
34 #include "Draw.h"
35 #include "Dxgi.h"
36 #include "InputAssembly.h"
37 #include "OutputMerger.h"
38 #include "Query.h"
39 #include "Rasterizer.h"
40 #include "Resource.h"
41 #include "Shader.h"
42 #include "State.h"
43 #include "Format.h"
44 
45 #include "Debug.h"
46 
47 #include "util/u_sampler.h"
48 
49 
50 static void APIENTRY DestroyDevice(D3D10DDI_HDEVICE hDevice);
51 static void APIENTRY RelocateDeviceFuncs(D3D10DDI_HDEVICE hDevice,
52                                 __in struct D3D10DDI_DEVICEFUNCS *pDeviceFunctions);
53 static void APIENTRY RelocateDeviceFuncs1(D3D10DDI_HDEVICE hDevice,
54                                 __in struct D3D10_1DDI_DEVICEFUNCS *pDeviceFunctions);
55 static void APIENTRY Flush(D3D10DDI_HDEVICE hDevice);
56 static void APIENTRY CheckFormatSupport(D3D10DDI_HDEVICE hDevice, DXGI_FORMAT Format,
57                                __out UINT *pFormatCaps);
58 static void APIENTRY CheckMultisampleQualityLevels(D3D10DDI_HDEVICE hDevice,
59                                           DXGI_FORMAT Format,
60                                           UINT SampleCount,
61                                           __out UINT *pNumQualityLevels);
62 static void APIENTRY SetTextFilterSize(D3D10DDI_HDEVICE hDevice, UINT Width, UINT Height);
63 
64 
65 /*
66  * ----------------------------------------------------------------------
67  *
68  * CalcPrivateDeviceSize --
69  *
70  *    The CalcPrivateDeviceSize function determines the size of a memory
71  *    region that the user-mode display driver requires from the Microsoft
72  *    Direct3D runtime to store frequently-accessed data.
73  *
74  * ----------------------------------------------------------------------
75  */
76 
77 SIZE_T APIENTRY
CalcPrivateDeviceSize(D3D10DDI_HADAPTER hAdapter,__in const D3D10DDIARG_CALCPRIVATEDEVICESIZE * pData)78 CalcPrivateDeviceSize(D3D10DDI_HADAPTER hAdapter,                          // IN
79                       __in const D3D10DDIARG_CALCPRIVATEDEVICESIZE *pData) // IN
80 {
81    return sizeof(Device);
82 }
83 
84 /*
85  * ----------------------------------------------------------------------
86  *
87  * CreateDevice --
88  *
89  *    The CreateDevice function creates a graphics context that is
90  *    referenced in subsequent calls.
91  *
92  * ----------------------------------------------------------------------
93  */
94 
95 HRESULT APIENTRY
CreateDevice(D3D10DDI_HADAPTER hAdapter,__in D3D10DDIARG_CREATEDEVICE * pCreateData)96 CreateDevice(D3D10DDI_HADAPTER hAdapter,                 // IN
97              __in D3D10DDIARG_CREATEDEVICE *pCreateData) // IN
98 {
99    LOG_ENTRYPOINT();
100 
101    if (0) {
102       DebugPrintf("hAdapter = %p\n", hAdapter);
103       DebugPrintf("pKTCallbacks = %p\n", pCreateData->pKTCallbacks);
104       DebugPrintf("p10_1DeviceFuncs = %p\n", pCreateData->p10_1DeviceFuncs);
105       DebugPrintf("hDrvDevice = %p\n", pCreateData->hDrvDevice);
106       DebugPrintf("DXGIBaseDDI = %p\n", pCreateData->DXGIBaseDDI);
107       DebugPrintf("hRTCoreLayer = %p\n", pCreateData->hRTCoreLayer);
108       DebugPrintf("pUMCallbacks = %p\n", pCreateData->pUMCallbacks);
109    }
110 
111    switch (pCreateData->Interface) {
112    case D3D10_0_DDI_INTERFACE_VERSION:
113    case D3D10_0_x_DDI_INTERFACE_VERSION:
114    case D3D10_0_7_DDI_INTERFACE_VERSION:
115 #if SUPPORT_D3D10_1
116    case D3D10_1_DDI_INTERFACE_VERSION:
117    case D3D10_1_x_DDI_INTERFACE_VERSION:
118    case D3D10_1_7_DDI_INTERFACE_VERSION:
119 #endif
120       break;
121    default:
122       DebugPrintf("%s: unsupported interface version 0x%08x\n",
123                   __FUNCTION__, pCreateData->Interface);
124       return E_FAIL;
125    }
126 
127    Adapter *pAdapter = CastAdapter(hAdapter);
128 
129    Device *pDevice = CastDevice(pCreateData->hDrvDevice);
130    memset(pDevice, 0, sizeof *pDevice);
131 
132    struct pipe_screen *screen = pAdapter->screen;
133    struct pipe_context *pipe = screen->context_create(screen, NULL, 0);
134    pDevice->pipe = pipe;
135 
136    pDevice->empty_vs = CreateEmptyShader(pDevice, PIPE_SHADER_VERTEX);
137    pDevice->empty_fs = CreateEmptyShader(pDevice, PIPE_SHADER_FRAGMENT);
138 
139    pipe->bind_vs_state(pipe, pDevice->empty_vs);
140    pipe->bind_fs_state(pipe, pDevice->empty_fs);
141 
142    pDevice->max_dual_source_render_targets =
143          screen->get_param(screen, PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS);
144 
145    pDevice->hRTCoreLayer = pCreateData->hRTCoreLayer;
146    pDevice->hDevice = (HANDLE)pCreateData->hRTDevice.handle;
147    pDevice->KTCallbacks = *pCreateData->pKTCallbacks;
148    pDevice->UMCallbacks = *pCreateData->pUMCallbacks;
149    pDevice->pDXGIBaseCallbacks = pCreateData->DXGIBaseDDI.pDXGIBaseCallbacks;
150 
151    pDevice->draw_so_target = NULL;
152 
153    if (0) {
154       DebugPrintf("pDevice = %p\n", pDevice);
155    }
156 
157    st_debug_parse();
158 
159    /*
160     * Fill in the D3D10 DDI functions
161     */
162    D3D10DDI_DEVICEFUNCS *pDeviceFuncs = pCreateData->pDeviceFuncs;
163    pDeviceFuncs->pfnDefaultConstantBufferUpdateSubresourceUP = ResourceUpdateSubResourceUP;
164    pDeviceFuncs->pfnVsSetConstantBuffers = VsSetConstantBuffers;
165    pDeviceFuncs->pfnPsSetShaderResources = PsSetShaderResources;
166    pDeviceFuncs->pfnPsSetShader = PsSetShader;
167    pDeviceFuncs->pfnPsSetSamplers = PsSetSamplers;
168    pDeviceFuncs->pfnVsSetShader = VsSetShader;
169    pDeviceFuncs->pfnDrawIndexed = DrawIndexed;
170    pDeviceFuncs->pfnDraw = Draw;
171    pDeviceFuncs->pfnDynamicIABufferMapNoOverwrite = ResourceMap;
172    pDeviceFuncs->pfnDynamicIABufferUnmap = ResourceUnmap;
173    pDeviceFuncs->pfnDynamicConstantBufferMapDiscard = ResourceMap;
174    pDeviceFuncs->pfnDynamicIABufferMapDiscard = ResourceMap;
175    pDeviceFuncs->pfnDynamicConstantBufferUnmap = ResourceUnmap;
176    pDeviceFuncs->pfnPsSetConstantBuffers = PsSetConstantBuffers;
177    pDeviceFuncs->pfnIaSetInputLayout = IaSetInputLayout;
178    pDeviceFuncs->pfnIaSetVertexBuffers = IaSetVertexBuffers;
179    pDeviceFuncs->pfnIaSetIndexBuffer = IaSetIndexBuffer;
180    pDeviceFuncs->pfnDrawIndexedInstanced = DrawIndexedInstanced;
181    pDeviceFuncs->pfnDrawInstanced = DrawInstanced;
182    pDeviceFuncs->pfnDynamicResourceMapDiscard = ResourceMap;
183    pDeviceFuncs->pfnDynamicResourceUnmap = ResourceUnmap;
184    pDeviceFuncs->pfnGsSetConstantBuffers = GsSetConstantBuffers;
185    pDeviceFuncs->pfnGsSetShader = GsSetShader;
186    pDeviceFuncs->pfnIaSetTopology = IaSetTopology;
187    pDeviceFuncs->pfnStagingResourceMap = ResourceMap;
188    pDeviceFuncs->pfnStagingResourceUnmap = ResourceUnmap;
189    pDeviceFuncs->pfnVsSetShaderResources = VsSetShaderResources;
190    pDeviceFuncs->pfnVsSetSamplers = VsSetSamplers;
191    pDeviceFuncs->pfnGsSetShaderResources = GsSetShaderResources;
192    pDeviceFuncs->pfnGsSetSamplers = GsSetSamplers;
193    pDeviceFuncs->pfnSetRenderTargets = SetRenderTargets;
194    pDeviceFuncs->pfnShaderResourceViewReadAfterWriteHazard = ShaderResourceViewReadAfterWriteHazard;
195    pDeviceFuncs->pfnResourceReadAfterWriteHazard = ResourceReadAfterWriteHazard;
196    pDeviceFuncs->pfnSetBlendState = SetBlendState;
197    pDeviceFuncs->pfnSetDepthStencilState = SetDepthStencilState;
198    pDeviceFuncs->pfnSetRasterizerState = SetRasterizerState;
199    pDeviceFuncs->pfnQueryEnd = QueryEnd;
200    pDeviceFuncs->pfnQueryBegin = QueryBegin;
201    pDeviceFuncs->pfnResourceCopyRegion = ResourceCopyRegion;
202    pDeviceFuncs->pfnResourceUpdateSubresourceUP = ResourceUpdateSubResourceUP;
203    pDeviceFuncs->pfnSoSetTargets = SoSetTargets;
204    pDeviceFuncs->pfnDrawAuto = DrawAuto;
205    pDeviceFuncs->pfnSetViewports = SetViewports;
206    pDeviceFuncs->pfnSetScissorRects = SetScissorRects;
207    pDeviceFuncs->pfnClearRenderTargetView = ClearRenderTargetView;
208    pDeviceFuncs->pfnClearDepthStencilView = ClearDepthStencilView;
209    pDeviceFuncs->pfnSetPredication = SetPredication;
210    pDeviceFuncs->pfnQueryGetData = QueryGetData;
211    pDeviceFuncs->pfnFlush = Flush;
212    pDeviceFuncs->pfnGenMips = GenMips;
213    pDeviceFuncs->pfnResourceCopy = ResourceCopy;
214    pDeviceFuncs->pfnResourceResolveSubresource = ResourceResolveSubResource;
215    pDeviceFuncs->pfnResourceMap = ResourceMap;
216    pDeviceFuncs->pfnResourceUnmap = ResourceUnmap;
217    pDeviceFuncs->pfnResourceIsStagingBusy = ResourceIsStagingBusy;
218    pDeviceFuncs->pfnRelocateDeviceFuncs = RelocateDeviceFuncs;
219    pDeviceFuncs->pfnCalcPrivateResourceSize = CalcPrivateResourceSize;
220    pDeviceFuncs->pfnCalcPrivateOpenedResourceSize = CalcPrivateOpenedResourceSize;
221    pDeviceFuncs->pfnCreateResource = CreateResource;
222    pDeviceFuncs->pfnOpenResource = OpenResource;
223    pDeviceFuncs->pfnDestroyResource = DestroyResource;
224    pDeviceFuncs->pfnCalcPrivateShaderResourceViewSize = CalcPrivateShaderResourceViewSize;
225    pDeviceFuncs->pfnCreateShaderResourceView = CreateShaderResourceView;
226    pDeviceFuncs->pfnDestroyShaderResourceView = DestroyShaderResourceView;
227    pDeviceFuncs->pfnCalcPrivateRenderTargetViewSize = CalcPrivateRenderTargetViewSize;
228    pDeviceFuncs->pfnCreateRenderTargetView = CreateRenderTargetView;
229    pDeviceFuncs->pfnDestroyRenderTargetView = DestroyRenderTargetView;
230    pDeviceFuncs->pfnCalcPrivateDepthStencilViewSize = CalcPrivateDepthStencilViewSize;
231    pDeviceFuncs->pfnCreateDepthStencilView = CreateDepthStencilView;
232    pDeviceFuncs->pfnDestroyDepthStencilView = DestroyDepthStencilView;
233    pDeviceFuncs->pfnCalcPrivateElementLayoutSize = CalcPrivateElementLayoutSize;
234    pDeviceFuncs->pfnCreateElementLayout = CreateElementLayout;
235    pDeviceFuncs->pfnDestroyElementLayout = DestroyElementLayout;
236    pDeviceFuncs->pfnCalcPrivateBlendStateSize = CalcPrivateBlendStateSize;
237    pDeviceFuncs->pfnCreateBlendState = CreateBlendState;
238    pDeviceFuncs->pfnDestroyBlendState = DestroyBlendState;
239    pDeviceFuncs->pfnCalcPrivateDepthStencilStateSize = CalcPrivateDepthStencilStateSize;
240    pDeviceFuncs->pfnCreateDepthStencilState = CreateDepthStencilState;
241    pDeviceFuncs->pfnDestroyDepthStencilState = DestroyDepthStencilState;
242    pDeviceFuncs->pfnCalcPrivateRasterizerStateSize = CalcPrivateRasterizerStateSize;
243    pDeviceFuncs->pfnCreateRasterizerState = CreateRasterizerState;
244    pDeviceFuncs->pfnDestroyRasterizerState = DestroyRasterizerState;
245    pDeviceFuncs->pfnCalcPrivateShaderSize = CalcPrivateShaderSize;
246    pDeviceFuncs->pfnCreateVertexShader = CreateVertexShader;
247    pDeviceFuncs->pfnCreateGeometryShader = CreateGeometryShader;
248    pDeviceFuncs->pfnCreatePixelShader = CreatePixelShader;
249    pDeviceFuncs->pfnCalcPrivateGeometryShaderWithStreamOutput = CalcPrivateGeometryShaderWithStreamOutput;
250    pDeviceFuncs->pfnCreateGeometryShaderWithStreamOutput = CreateGeometryShaderWithStreamOutput;
251    pDeviceFuncs->pfnDestroyShader = DestroyShader;
252    pDeviceFuncs->pfnCalcPrivateSamplerSize = CalcPrivateSamplerSize;
253    pDeviceFuncs->pfnCreateSampler = CreateSampler;
254    pDeviceFuncs->pfnDestroySampler = DestroySampler;
255    pDeviceFuncs->pfnCalcPrivateQuerySize = CalcPrivateQuerySize;
256    pDeviceFuncs->pfnCreateQuery = CreateQuery;
257    pDeviceFuncs->pfnDestroyQuery = DestroyQuery;
258    pDeviceFuncs->pfnCheckFormatSupport = CheckFormatSupport;
259    pDeviceFuncs->pfnCheckMultisampleQualityLevels = CheckMultisampleQualityLevels;
260    pDeviceFuncs->pfnCheckCounterInfo = CheckCounterInfo;
261    pDeviceFuncs->pfnCheckCounter = CheckCounter;
262    pDeviceFuncs->pfnDestroyDevice = DestroyDevice;
263    pDeviceFuncs->pfnSetTextFilterSize = SetTextFilterSize;
264    if (pCreateData->Interface == D3D10_1_DDI_INTERFACE_VERSION ||
265        pCreateData->Interface == D3D10_1_x_DDI_INTERFACE_VERSION ||
266        pCreateData->Interface == D3D10_1_7_DDI_INTERFACE_VERSION) {
267       D3D10_1DDI_DEVICEFUNCS *p10_1DeviceFuncs = pCreateData->p10_1DeviceFuncs;
268       p10_1DeviceFuncs->pfnRelocateDeviceFuncs = RelocateDeviceFuncs1;
269       p10_1DeviceFuncs->pfnCalcPrivateShaderResourceViewSize = CalcPrivateShaderResourceViewSize1;
270       p10_1DeviceFuncs->pfnCreateShaderResourceView = CreateShaderResourceView1;
271       p10_1DeviceFuncs->pfnCalcPrivateBlendStateSize = CalcPrivateBlendStateSize1;
272       p10_1DeviceFuncs->pfnCreateBlendState = CreateBlendState1;
273       p10_1DeviceFuncs->pfnResourceConvert = ResourceCopy;
274       p10_1DeviceFuncs->pfnResourceConvertRegion = ResourceCopyRegion;
275    }
276 
277    /*
278     * Fill in DXGI DDI functions
279     */
280    pCreateData->DXGIBaseDDI.pDXGIDDIBaseFunctions->pfnPresent =
281       _Present;
282    pCreateData->DXGIBaseDDI.pDXGIDDIBaseFunctions->pfnGetGammaCaps =
283       _GetGammaCaps;
284    pCreateData->DXGIBaseDDI.pDXGIDDIBaseFunctions->pfnSetDisplayMode =
285       _SetDisplayMode;
286    pCreateData->DXGIBaseDDI.pDXGIDDIBaseFunctions->pfnSetResourcePriority =
287       _SetResourcePriority;
288    pCreateData->DXGIBaseDDI.pDXGIDDIBaseFunctions->pfnQueryResourceResidency =
289       _QueryResourceResidency;
290    pCreateData->DXGIBaseDDI.pDXGIDDIBaseFunctions->pfnRotateResourceIdentities =
291       _RotateResourceIdentities;
292    pCreateData->DXGIBaseDDI.pDXGIDDIBaseFunctions->pfnBlt =
293       _Blt;
294 
295    if (0) {
296       return S_OK;
297    } else {
298       // Tell DXGI to not use the shared resource presentation path when
299       // communicating with DWM:
300       // http://msdn.microsoft.com/en-us/library/windows/hardware/ff569887(v=vs.85).aspx
301       return DXGI_STATUS_NO_REDIRECTION;
302    }
303 }
304 
305 
306 /*
307  * ----------------------------------------------------------------------
308  *
309  * DestroyDevice --
310  *
311  *    The DestroyDevice function destroys a graphics context.
312  *
313  * ----------------------------------------------------------------------
314  */
315 
316 void APIENTRY
DestroyDevice(D3D10DDI_HDEVICE hDevice)317 DestroyDevice(D3D10DDI_HDEVICE hDevice)   // IN
318 {
319    unsigned i;
320 
321    LOG_ENTRYPOINT();
322 
323    Device *pDevice = CastDevice(hDevice);
324    struct pipe_context *pipe = pDevice->pipe;
325 
326    pipe->flush(pipe, NULL, 0);
327 
328    for (i = 0; i < PIPE_MAX_SO_BUFFERS; ++i) {
329       pipe_so_target_reference(&pDevice->so_targets[i], NULL);
330    }
331    if (pDevice->draw_so_target) {
332       pipe_so_target_reference(&pDevice->draw_so_target, NULL);
333    }
334 
335    pipe->bind_fs_state(pipe, NULL);
336    pipe->bind_vs_state(pipe, NULL);
337 
338    DeleteEmptyShader(pDevice, PIPE_SHADER_FRAGMENT, pDevice->empty_fs);
339    DeleteEmptyShader(pDevice, PIPE_SHADER_VERTEX, pDevice->empty_vs);
340 
341    pipe_surface_reference(&pDevice->fb.zsbuf, NULL);
342    for (i = 0; i < PIPE_MAX_COLOR_BUFS; ++i) {
343       pipe_surface_reference(&pDevice->fb.cbufs[i], NULL);
344    }
345 
346    for (i = 0; i < PIPE_MAX_ATTRIBS; ++i) {
347       if (!pDevice->vertex_buffers[i].is_user_buffer) {
348          pipe_resource_reference(&pDevice->vertex_buffers[i].buffer.resource, NULL);
349       }
350    }
351 
352    pipe_resource_reference(&pDevice->index_buffer, NULL);
353 
354    static struct pipe_sampler_view * sampler_views[PIPE_MAX_SHADER_SAMPLER_VIEWS];
355    memset(sampler_views, 0, sizeof sampler_views);
356    pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0,
357                            PIPE_MAX_SHADER_SAMPLER_VIEWS, 0, sampler_views);
358    pipe->set_sampler_views(pipe, PIPE_SHADER_VERTEX, 0,
359                            PIPE_MAX_SHADER_SAMPLER_VIEWS, 0, sampler_views);
360    pipe->set_sampler_views(pipe, PIPE_SHADER_GEOMETRY, 0,
361                            PIPE_MAX_SHADER_SAMPLER_VIEWS, 0, sampler_views);
362 
363    pipe->destroy(pipe);
364 }
365 
366 
367 /*
368  * ----------------------------------------------------------------------
369  *
370  * RelocateDeviceFuncs --
371  *
372  *    The RelocateDeviceFuncs function notifies the user-mode
373  *    display driver about the new location of the driver function table.
374  *
375  * ----------------------------------------------------------------------
376  */
377 
378 void APIENTRY
RelocateDeviceFuncs(D3D10DDI_HDEVICE hDevice,__in struct D3D10DDI_DEVICEFUNCS * pDeviceFunctions)379 RelocateDeviceFuncs(D3D10DDI_HDEVICE hDevice,                           // IN
380                     __in struct D3D10DDI_DEVICEFUNCS *pDeviceFunctions) // IN
381 {
382    LOG_ENTRYPOINT();
383 
384    /*
385     * Nothing to do as we don't store a pointer to this entity.
386     */
387 }
388 
389 
390 /*
391  * ----------------------------------------------------------------------
392  *
393  * RelocateDeviceFuncs1 --
394  *
395  *    The RelocateDeviceFuncs function notifies the user-mode
396  *    display driver about the new location of the driver function table.
397  *
398  * ----------------------------------------------------------------------
399  */
400 
401 void APIENTRY
RelocateDeviceFuncs1(D3D10DDI_HDEVICE hDevice,__in struct D3D10_1DDI_DEVICEFUNCS * pDeviceFunctions)402 RelocateDeviceFuncs1(D3D10DDI_HDEVICE hDevice,                           // IN
403                     __in struct D3D10_1DDI_DEVICEFUNCS *pDeviceFunctions) // IN
404 {
405    LOG_ENTRYPOINT();
406 
407    /*
408     * Nothing to do as we don't store a pointer to this entity.
409     */
410 }
411 
412 
413 /*
414  * ----------------------------------------------------------------------
415  *
416  * Flush --
417  *
418  *    The Flush function submits outstanding hardware commands that
419  *    are in the hardware command buffer to the display miniport driver.
420  *
421  * ----------------------------------------------------------------------
422  */
423 
424 void APIENTRY
Flush(D3D10DDI_HDEVICE hDevice)425 Flush(D3D10DDI_HDEVICE hDevice)  // IN
426 {
427    LOG_ENTRYPOINT();
428 
429    struct pipe_context *pipe = CastPipeContext(hDevice);
430 
431    pipe->flush(pipe, NULL, 0);
432 }
433 
434 
435 /*
436  * ----------------------------------------------------------------------
437  *
438  * CheckFormatSupport --
439  *
440  *    The CheckFormatSupport function retrieves the capabilites that
441  *    the device has with the specified format.
442  *
443  * ----------------------------------------------------------------------
444  */
445 
446 void APIENTRY
CheckFormatSupport(D3D10DDI_HDEVICE hDevice,DXGI_FORMAT Format,__out UINT * pFormatCaps)447 CheckFormatSupport(D3D10DDI_HDEVICE hDevice, // IN
448                    DXGI_FORMAT Format,       // IN
449                    __out UINT *pFormatCaps)  // OUT
450 {
451    //LOG_ENTRYPOINT();
452 
453    struct pipe_context *pipe = CastPipeContext(hDevice);
454    struct pipe_screen *screen = pipe->screen;
455 
456    *pFormatCaps = 0;
457 
458    enum pipe_format format = FormatTranslate(Format, FALSE);
459    if (format == PIPE_FORMAT_NONE) {
460       *pFormatCaps = D3D10_DDI_FORMAT_SUPPORT_NOT_SUPPORTED;
461       return;
462    }
463 
464    if (Format == DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM) {
465       /*
466        * We only need to support creation.
467        * http://msdn.microsoft.com/en-us/library/windows/hardware/ff552818.aspx
468        */
469       return;
470    }
471 
472    if (screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, 0,
473                                    PIPE_BIND_RENDER_TARGET)) {
474       *pFormatCaps |= D3D10_DDI_FORMAT_SUPPORT_RENDERTARGET;
475       *pFormatCaps |= D3D10_DDI_FORMAT_SUPPORT_BLENDABLE;
476 
477 #if SUPPORT_MSAA
478       if (screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 4, 4,
479                                       PIPE_BIND_RENDER_TARGET)) {
480          *pFormatCaps |= D3D10_DDI_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET;
481       }
482 #endif
483    }
484 
485    if (screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, 0,
486                                    PIPE_BIND_SAMPLER_VIEW)) {
487       *pFormatCaps |= D3D10_DDI_FORMAT_SUPPORT_SHADER_SAMPLE;
488 
489 #if SUPPORT_MSAA
490       if (screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 4, 4,
491                                       PIPE_BIND_RENDER_TARGET)) {
492          *pFormatCaps |= D3D10_DDI_FORMAT_SUPPORT_MULTISAMPLE_LOAD;
493       }
494 #endif
495    }
496 }
497 
498 
499 /*
500  * ----------------------------------------------------------------------
501  *
502  * CheckMultisampleQualityLevels --
503  *
504  *    The CheckMultisampleQualityLevels function retrieves the number
505  *    of quality levels that the device supports for the specified
506  *    number of samples.
507  *
508  * ----------------------------------------------------------------------
509  */
510 
511 void APIENTRY
CheckMultisampleQualityLevels(D3D10DDI_HDEVICE hDevice,DXGI_FORMAT Format,UINT SampleCount,__out UINT * pNumQualityLevels)512 CheckMultisampleQualityLevels(D3D10DDI_HDEVICE hDevice,        // IN
513                               DXGI_FORMAT Format,              // IN
514                               UINT SampleCount,                // IN
515                               __out UINT *pNumQualityLevels)   // OUT
516 {
517    //LOG_ENTRYPOINT();
518 
519    /* XXX: Disable MSAA */
520    *pNumQualityLevels = 0;
521 }
522 
523 
524 /*
525  * ----------------------------------------------------------------------
526  *
527  * SetTextFilterSize --
528  *
529  *    The SetTextFilterSize function sets the width and height
530  *    of the monochrome convolution filter.
531  *
532  * ----------------------------------------------------------------------
533  */
534 
535 void APIENTRY
SetTextFilterSize(D3D10DDI_HDEVICE hDevice,UINT Width,UINT Height)536 SetTextFilterSize(D3D10DDI_HDEVICE hDevice,  // IN
537                   UINT Width,                // IN
538                   UINT Height)               // IN
539 {
540    LOG_ENTRYPOINT();
541 
542    LOG_UNSUPPORTED(Width != 1 || Height != 1);
543 }
544