1*61046927SAndroid Build Coastguard Worker /**************************************************************************
2*61046927SAndroid Build Coastguard Worker *
3*61046927SAndroid Build Coastguard Worker * Copyright 2012-2021 VMware, Inc.
4*61046927SAndroid Build Coastguard Worker * All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker *
6*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
7*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the
8*61046927SAndroid Build Coastguard Worker * "Software"), to deal in the Software without restriction, including
9*61046927SAndroid Build Coastguard Worker * without limitation the rights to use, copy, modify, merge, publish,
10*61046927SAndroid Build Coastguard Worker * distribute, sub license, and/or sell copies of the Software, and to
11*61046927SAndroid Build Coastguard Worker * permit persons to whom the Software is furnished to do so, subject to
12*61046927SAndroid Build Coastguard Worker * the following conditions:
13*61046927SAndroid Build Coastguard Worker *
14*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
17*61046927SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
18*61046927SAndroid Build Coastguard Worker * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19*61046927SAndroid Build Coastguard Worker * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20*61046927SAndroid Build Coastguard Worker * USE OR OTHER DEALINGS IN THE SOFTWARE.
21*61046927SAndroid Build Coastguard Worker *
22*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the
23*61046927SAndroid Build Coastguard Worker * next paragraph) shall be included in all copies or substantial portions
24*61046927SAndroid Build Coastguard Worker * of the Software.
25*61046927SAndroid Build Coastguard Worker *
26*61046927SAndroid Build Coastguard Worker **************************************************************************/
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker /*
29*61046927SAndroid Build Coastguard Worker * OutputMerger.cpp --
30*61046927SAndroid Build Coastguard Worker * Functions that manipulate the output merger state.
31*61046927SAndroid Build Coastguard Worker */
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard Worker
34*61046927SAndroid Build Coastguard Worker #include "OutputMerger.h"
35*61046927SAndroid Build Coastguard Worker #include "State.h"
36*61046927SAndroid Build Coastguard Worker
37*61046927SAndroid Build Coastguard Worker #include "Debug.h"
38*61046927SAndroid Build Coastguard Worker #include "Format.h"
39*61046927SAndroid Build Coastguard Worker
40*61046927SAndroid Build Coastguard Worker #include "util/u_framebuffer.h"
41*61046927SAndroid Build Coastguard Worker #include "util/format/u_format.h"
42*61046927SAndroid Build Coastguard Worker
43*61046927SAndroid Build Coastguard Worker
44*61046927SAndroid Build Coastguard Worker /*
45*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
46*61046927SAndroid Build Coastguard Worker *
47*61046927SAndroid Build Coastguard Worker * CalcPrivateRenderTargetViewSize --
48*61046927SAndroid Build Coastguard Worker *
49*61046927SAndroid Build Coastguard Worker * The CalcPrivateRenderTargetViewSize function determines the size
50*61046927SAndroid Build Coastguard Worker * of the user-mode display driver's private region of memory
51*61046927SAndroid Build Coastguard Worker * (that is, the size of internal driver structures, not the size
52*61046927SAndroid Build Coastguard Worker * of the resource video memory) for a render target view.
53*61046927SAndroid Build Coastguard Worker *
54*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
55*61046927SAndroid Build Coastguard Worker */
56*61046927SAndroid Build Coastguard Worker
57*61046927SAndroid Build Coastguard Worker
58*61046927SAndroid Build Coastguard Worker SIZE_T APIENTRY
CalcPrivateRenderTargetViewSize(D3D10DDI_HDEVICE hDevice,__in const D3D10DDIARG_CREATERENDERTARGETVIEW * pCreateRenderTargetView)59*61046927SAndroid Build Coastguard Worker CalcPrivateRenderTargetViewSize(
60*61046927SAndroid Build Coastguard Worker D3D10DDI_HDEVICE hDevice, // IN
61*61046927SAndroid Build Coastguard Worker __in const D3D10DDIARG_CREATERENDERTARGETVIEW *pCreateRenderTargetView) // IN
62*61046927SAndroid Build Coastguard Worker {
63*61046927SAndroid Build Coastguard Worker return sizeof(RenderTargetView);
64*61046927SAndroid Build Coastguard Worker }
65*61046927SAndroid Build Coastguard Worker
66*61046927SAndroid Build Coastguard Worker
67*61046927SAndroid Build Coastguard Worker /*
68*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
69*61046927SAndroid Build Coastguard Worker *
70*61046927SAndroid Build Coastguard Worker * CreateRenderTargetView --
71*61046927SAndroid Build Coastguard Worker *
72*61046927SAndroid Build Coastguard Worker * The CreateRenderTargetView function creates a render target view.
73*61046927SAndroid Build Coastguard Worker *
74*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
75*61046927SAndroid Build Coastguard Worker */
76*61046927SAndroid Build Coastguard Worker
77*61046927SAndroid Build Coastguard Worker void APIENTRY
CreateRenderTargetView(D3D10DDI_HDEVICE hDevice,__in const D3D10DDIARG_CREATERENDERTARGETVIEW * pCreateRenderTargetView,D3D10DDI_HRENDERTARGETVIEW hRenderTargetView,D3D10DDI_HRTRENDERTARGETVIEW hRTRenderTargetView)78*61046927SAndroid Build Coastguard Worker CreateRenderTargetView(
79*61046927SAndroid Build Coastguard Worker D3D10DDI_HDEVICE hDevice, // IN
80*61046927SAndroid Build Coastguard Worker __in const D3D10DDIARG_CREATERENDERTARGETVIEW *pCreateRenderTargetView, // IN
81*61046927SAndroid Build Coastguard Worker D3D10DDI_HRENDERTARGETVIEW hRenderTargetView, // IN
82*61046927SAndroid Build Coastguard Worker D3D10DDI_HRTRENDERTARGETVIEW hRTRenderTargetView) // IN
83*61046927SAndroid Build Coastguard Worker {
84*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = CastPipeContext(hDevice);
87*61046927SAndroid Build Coastguard Worker struct pipe_resource *resource = CastPipeResource(pCreateRenderTargetView->hDrvResource);
88*61046927SAndroid Build Coastguard Worker RenderTargetView *pRTView = CastRenderTargetView(hRenderTargetView);
89*61046927SAndroid Build Coastguard Worker
90*61046927SAndroid Build Coastguard Worker struct pipe_surface desc;
91*61046927SAndroid Build Coastguard Worker
92*61046927SAndroid Build Coastguard Worker memset(&desc, 0, sizeof desc);
93*61046927SAndroid Build Coastguard Worker desc.format = FormatTranslate(pCreateRenderTargetView->Format, false);
94*61046927SAndroid Build Coastguard Worker
95*61046927SAndroid Build Coastguard Worker switch (pCreateRenderTargetView->ResourceDimension) {
96*61046927SAndroid Build Coastguard Worker case D3D10DDIRESOURCE_BUFFER:
97*61046927SAndroid Build Coastguard Worker desc.u.buf.first_element = pCreateRenderTargetView->Buffer.FirstElement;
98*61046927SAndroid Build Coastguard Worker desc.u.buf.last_element = pCreateRenderTargetView->Buffer.NumElements - 1 +
99*61046927SAndroid Build Coastguard Worker desc.u.buf.first_element;
100*61046927SAndroid Build Coastguard Worker break;
101*61046927SAndroid Build Coastguard Worker case D3D10DDIRESOURCE_TEXTURE1D:
102*61046927SAndroid Build Coastguard Worker ASSERT(pCreateRenderTargetView->Tex1D.ArraySize != (UINT)-1);
103*61046927SAndroid Build Coastguard Worker desc.u.tex.level = pCreateRenderTargetView->Tex1D.MipSlice;
104*61046927SAndroid Build Coastguard Worker desc.u.tex.first_layer = pCreateRenderTargetView->Tex1D.FirstArraySlice;
105*61046927SAndroid Build Coastguard Worker desc.u.tex.last_layer = pCreateRenderTargetView->Tex1D.ArraySize - 1 +
106*61046927SAndroid Build Coastguard Worker desc.u.tex.first_layer;
107*61046927SAndroid Build Coastguard Worker break;
108*61046927SAndroid Build Coastguard Worker case D3D10DDIRESOURCE_TEXTURE2D:
109*61046927SAndroid Build Coastguard Worker ASSERT(pCreateRenderTargetView->Tex2D.ArraySize != (UINT)-1);
110*61046927SAndroid Build Coastguard Worker desc.u.tex.level = pCreateRenderTargetView->Tex2D.MipSlice;
111*61046927SAndroid Build Coastguard Worker desc.u.tex.first_layer = pCreateRenderTargetView->Tex2D.FirstArraySlice;
112*61046927SAndroid Build Coastguard Worker desc.u.tex.last_layer = pCreateRenderTargetView->Tex2D.ArraySize - 1 +
113*61046927SAndroid Build Coastguard Worker desc.u.tex.first_layer;
114*61046927SAndroid Build Coastguard Worker break;
115*61046927SAndroid Build Coastguard Worker case D3D10DDIRESOURCE_TEXTURE3D:
116*61046927SAndroid Build Coastguard Worker desc.u.tex.level = pCreateRenderTargetView->Tex3D.MipSlice;
117*61046927SAndroid Build Coastguard Worker desc.u.tex.first_layer = pCreateRenderTargetView->Tex3D.FirstW;
118*61046927SAndroid Build Coastguard Worker desc.u.tex.last_layer = pCreateRenderTargetView->Tex3D.WSize - 1 +
119*61046927SAndroid Build Coastguard Worker desc.u.tex.first_layer;
120*61046927SAndroid Build Coastguard Worker break;
121*61046927SAndroid Build Coastguard Worker case D3D10DDIRESOURCE_TEXTURECUBE:
122*61046927SAndroid Build Coastguard Worker ASSERT(pCreateRenderTargetView->TexCube.ArraySize != (UINT)-1);
123*61046927SAndroid Build Coastguard Worker desc.u.tex.level = pCreateRenderTargetView->TexCube.MipSlice;
124*61046927SAndroid Build Coastguard Worker desc.u.tex.first_layer = pCreateRenderTargetView->TexCube.FirstArraySlice;
125*61046927SAndroid Build Coastguard Worker desc.u.tex.last_layer = pCreateRenderTargetView->TexCube.ArraySize - 1 +
126*61046927SAndroid Build Coastguard Worker desc.u.tex.first_layer;;
127*61046927SAndroid Build Coastguard Worker break;
128*61046927SAndroid Build Coastguard Worker default:
129*61046927SAndroid Build Coastguard Worker ASSERT(0);
130*61046927SAndroid Build Coastguard Worker return;
131*61046927SAndroid Build Coastguard Worker }
132*61046927SAndroid Build Coastguard Worker
133*61046927SAndroid Build Coastguard Worker pRTView->surface = pipe->create_surface(pipe, resource, &desc);
134*61046927SAndroid Build Coastguard Worker assert(pRTView->surface);
135*61046927SAndroid Build Coastguard Worker }
136*61046927SAndroid Build Coastguard Worker
137*61046927SAndroid Build Coastguard Worker
138*61046927SAndroid Build Coastguard Worker /*
139*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
140*61046927SAndroid Build Coastguard Worker *
141*61046927SAndroid Build Coastguard Worker * DestroyRenderTargetView --
142*61046927SAndroid Build Coastguard Worker *
143*61046927SAndroid Build Coastguard Worker * The DestroyRenderTargetView function destroys the specified
144*61046927SAndroid Build Coastguard Worker * render target view object. The render target view object can
145*61046927SAndroid Build Coastguard Worker * be destoyed only if it is not currently bound to a display device.
146*61046927SAndroid Build Coastguard Worker *
147*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
148*61046927SAndroid Build Coastguard Worker */
149*61046927SAndroid Build Coastguard Worker
150*61046927SAndroid Build Coastguard Worker void APIENTRY
DestroyRenderTargetView(D3D10DDI_HDEVICE hDevice,D3D10DDI_HRENDERTARGETVIEW hRenderTargetView)151*61046927SAndroid Build Coastguard Worker DestroyRenderTargetView(D3D10DDI_HDEVICE hDevice, // IN
152*61046927SAndroid Build Coastguard Worker D3D10DDI_HRENDERTARGETVIEW hRenderTargetView) // IN
153*61046927SAndroid Build Coastguard Worker {
154*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
155*61046927SAndroid Build Coastguard Worker
156*61046927SAndroid Build Coastguard Worker RenderTargetView *pRTView = CastRenderTargetView(hRenderTargetView);
157*61046927SAndroid Build Coastguard Worker
158*61046927SAndroid Build Coastguard Worker pipe_surface_reference(&pRTView->surface, NULL);
159*61046927SAndroid Build Coastguard Worker }
160*61046927SAndroid Build Coastguard Worker
161*61046927SAndroid Build Coastguard Worker
162*61046927SAndroid Build Coastguard Worker /*
163*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
164*61046927SAndroid Build Coastguard Worker *
165*61046927SAndroid Build Coastguard Worker * ClearRenderTargetView --
166*61046927SAndroid Build Coastguard Worker *
167*61046927SAndroid Build Coastguard Worker * The ClearRenderTargetView function clears the specified
168*61046927SAndroid Build Coastguard Worker * render target view by setting it to a constant value.
169*61046927SAndroid Build Coastguard Worker *
170*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
171*61046927SAndroid Build Coastguard Worker */
172*61046927SAndroid Build Coastguard Worker
173*61046927SAndroid Build Coastguard Worker void APIENTRY
ClearRenderTargetView(D3D10DDI_HDEVICE hDevice,D3D10DDI_HRENDERTARGETVIEW hRenderTargetView,FLOAT pColorRGBA[4])174*61046927SAndroid Build Coastguard Worker ClearRenderTargetView(D3D10DDI_HDEVICE hDevice, // IN
175*61046927SAndroid Build Coastguard Worker D3D10DDI_HRENDERTARGETVIEW hRenderTargetView, // IN
176*61046927SAndroid Build Coastguard Worker FLOAT pColorRGBA[4]) // IN
177*61046927SAndroid Build Coastguard Worker {
178*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
179*61046927SAndroid Build Coastguard Worker
180*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = CastPipeContext(hDevice);
181*61046927SAndroid Build Coastguard Worker struct pipe_surface *surface = CastPipeRenderTargetView(hRenderTargetView);
182*61046927SAndroid Build Coastguard Worker union pipe_color_union clear_color;
183*61046927SAndroid Build Coastguard Worker
184*61046927SAndroid Build Coastguard Worker /*
185*61046927SAndroid Build Coastguard Worker * DX10 always uses float clear color but gallium does not.
186*61046927SAndroid Build Coastguard Worker * Conversion should just be ordinary conversion. Actual clamping will
187*61046927SAndroid Build Coastguard Worker * be done later but need to make sure values exceeding int/uint range
188*61046927SAndroid Build Coastguard Worker * are handled correctly.
189*61046927SAndroid Build Coastguard Worker */
190*61046927SAndroid Build Coastguard Worker if (util_format_is_pure_integer(surface->format)) {
191*61046927SAndroid Build Coastguard Worker if (util_format_is_pure_sint(surface->format)) {
192*61046927SAndroid Build Coastguard Worker unsigned i;
193*61046927SAndroid Build Coastguard Worker /* If only MIN_INT/UINT32 in c++ code would work... */
194*61046927SAndroid Build Coastguard Worker int min_int32 = 0x80000000;
195*61046927SAndroid Build Coastguard Worker int max_int32 = 0x7fffffff;
196*61046927SAndroid Build Coastguard Worker for (i = 0; i < 4; i++) {
197*61046927SAndroid Build Coastguard Worker float value = pColorRGBA[i];
198*61046927SAndroid Build Coastguard Worker /* This is an expanded clamp to handle NaN and integer conversion. */
199*61046927SAndroid Build Coastguard Worker if (util_is_nan(value)) {
200*61046927SAndroid Build Coastguard Worker clear_color.i[i] = 0;
201*61046927SAndroid Build Coastguard Worker } else if (value <= (float)min_int32) {
202*61046927SAndroid Build Coastguard Worker clear_color.i[i] = min_int32;
203*61046927SAndroid Build Coastguard Worker } else if (value >= (float)max_int32) {
204*61046927SAndroid Build Coastguard Worker clear_color.i[i] = max_int32;
205*61046927SAndroid Build Coastguard Worker } else {
206*61046927SAndroid Build Coastguard Worker clear_color.i[i] = value;
207*61046927SAndroid Build Coastguard Worker }
208*61046927SAndroid Build Coastguard Worker }
209*61046927SAndroid Build Coastguard Worker }
210*61046927SAndroid Build Coastguard Worker else {
211*61046927SAndroid Build Coastguard Worker assert(util_format_is_pure_uint(surface->format));
212*61046927SAndroid Build Coastguard Worker unsigned i;
213*61046927SAndroid Build Coastguard Worker unsigned max_uint32 = 0xffffffffU;
214*61046927SAndroid Build Coastguard Worker for (i = 0; i < 4; i++) {
215*61046927SAndroid Build Coastguard Worker float value = pColorRGBA[i];
216*61046927SAndroid Build Coastguard Worker /* This is an expanded clamp to handle NaN and integer conversion. */
217*61046927SAndroid Build Coastguard Worker if (!(value >= 0.0f)) {
218*61046927SAndroid Build Coastguard Worker /* Handles NaN. */
219*61046927SAndroid Build Coastguard Worker clear_color.ui[i] = 0;
220*61046927SAndroid Build Coastguard Worker } else if (value >= (float)max_uint32) {
221*61046927SAndroid Build Coastguard Worker clear_color.ui[i] = max_uint32;
222*61046927SAndroid Build Coastguard Worker } else {
223*61046927SAndroid Build Coastguard Worker clear_color.ui[i] = value;
224*61046927SAndroid Build Coastguard Worker }
225*61046927SAndroid Build Coastguard Worker }
226*61046927SAndroid Build Coastguard Worker }
227*61046927SAndroid Build Coastguard Worker }
228*61046927SAndroid Build Coastguard Worker else {
229*61046927SAndroid Build Coastguard Worker clear_color.f[0] = pColorRGBA[0];
230*61046927SAndroid Build Coastguard Worker clear_color.f[1] = pColorRGBA[1];
231*61046927SAndroid Build Coastguard Worker clear_color.f[2] = pColorRGBA[2];
232*61046927SAndroid Build Coastguard Worker clear_color.f[3] = pColorRGBA[3];
233*61046927SAndroid Build Coastguard Worker }
234*61046927SAndroid Build Coastguard Worker
235*61046927SAndroid Build Coastguard Worker pipe->clear_render_target(pipe,
236*61046927SAndroid Build Coastguard Worker surface,
237*61046927SAndroid Build Coastguard Worker &clear_color,
238*61046927SAndroid Build Coastguard Worker 0, 0,
239*61046927SAndroid Build Coastguard Worker surface->width,
240*61046927SAndroid Build Coastguard Worker surface->height,
241*61046927SAndroid Build Coastguard Worker true);
242*61046927SAndroid Build Coastguard Worker }
243*61046927SAndroid Build Coastguard Worker
244*61046927SAndroid Build Coastguard Worker
245*61046927SAndroid Build Coastguard Worker /*
246*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
247*61046927SAndroid Build Coastguard Worker *
248*61046927SAndroid Build Coastguard Worker * CalcPrivateDepthStencilViewSize --
249*61046927SAndroid Build Coastguard Worker *
250*61046927SAndroid Build Coastguard Worker * The CalcPrivateDepthStencilViewSize function determines the size
251*61046927SAndroid Build Coastguard Worker * of the user-mode display driver's private region of memory
252*61046927SAndroid Build Coastguard Worker * (that is, the size of internal driver structures, not the size
253*61046927SAndroid Build Coastguard Worker * of the resource video memory) for a depth stencil view.
254*61046927SAndroid Build Coastguard Worker *
255*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
256*61046927SAndroid Build Coastguard Worker */
257*61046927SAndroid Build Coastguard Worker
258*61046927SAndroid Build Coastguard Worker SIZE_T APIENTRY
CalcPrivateDepthStencilViewSize(D3D10DDI_HDEVICE hDevice,__in const D3D10DDIARG_CREATEDEPTHSTENCILVIEW * pCreateDepthStencilView)259*61046927SAndroid Build Coastguard Worker CalcPrivateDepthStencilViewSize(
260*61046927SAndroid Build Coastguard Worker D3D10DDI_HDEVICE hDevice, // IN
261*61046927SAndroid Build Coastguard Worker __in const D3D10DDIARG_CREATEDEPTHSTENCILVIEW *pCreateDepthStencilView) // IN
262*61046927SAndroid Build Coastguard Worker {
263*61046927SAndroid Build Coastguard Worker return sizeof(DepthStencilView);
264*61046927SAndroid Build Coastguard Worker }
265*61046927SAndroid Build Coastguard Worker
266*61046927SAndroid Build Coastguard Worker
267*61046927SAndroid Build Coastguard Worker /*
268*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
269*61046927SAndroid Build Coastguard Worker *
270*61046927SAndroid Build Coastguard Worker * CreateDepthStencilView --
271*61046927SAndroid Build Coastguard Worker *
272*61046927SAndroid Build Coastguard Worker * The CreateDepthStencilView function creates a depth stencil view.
273*61046927SAndroid Build Coastguard Worker *
274*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
275*61046927SAndroid Build Coastguard Worker */
276*61046927SAndroid Build Coastguard Worker
277*61046927SAndroid Build Coastguard Worker void APIENTRY
CreateDepthStencilView(D3D10DDI_HDEVICE hDevice,__in const D3D10DDIARG_CREATEDEPTHSTENCILVIEW * pCreateDepthStencilView,D3D10DDI_HDEPTHSTENCILVIEW hDepthStencilView,D3D10DDI_HRTDEPTHSTENCILVIEW hRTDepthStencilView)278*61046927SAndroid Build Coastguard Worker CreateDepthStencilView(
279*61046927SAndroid Build Coastguard Worker D3D10DDI_HDEVICE hDevice, // IN
280*61046927SAndroid Build Coastguard Worker __in const D3D10DDIARG_CREATEDEPTHSTENCILVIEW *pCreateDepthStencilView, // IN
281*61046927SAndroid Build Coastguard Worker D3D10DDI_HDEPTHSTENCILVIEW hDepthStencilView, // IN
282*61046927SAndroid Build Coastguard Worker D3D10DDI_HRTDEPTHSTENCILVIEW hRTDepthStencilView) // IN
283*61046927SAndroid Build Coastguard Worker {
284*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
285*61046927SAndroid Build Coastguard Worker
286*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = CastPipeContext(hDevice);
287*61046927SAndroid Build Coastguard Worker struct pipe_resource *resource = CastPipeResource(pCreateDepthStencilView->hDrvResource);
288*61046927SAndroid Build Coastguard Worker DepthStencilView *pDSView = CastDepthStencilView(hDepthStencilView);
289*61046927SAndroid Build Coastguard Worker
290*61046927SAndroid Build Coastguard Worker struct pipe_surface desc;
291*61046927SAndroid Build Coastguard Worker
292*61046927SAndroid Build Coastguard Worker memset(&desc, 0, sizeof desc);
293*61046927SAndroid Build Coastguard Worker desc.format = FormatTranslate(pCreateDepthStencilView->Format, true);
294*61046927SAndroid Build Coastguard Worker
295*61046927SAndroid Build Coastguard Worker switch (pCreateDepthStencilView->ResourceDimension) {
296*61046927SAndroid Build Coastguard Worker case D3D10DDIRESOURCE_TEXTURE1D:
297*61046927SAndroid Build Coastguard Worker ASSERT(pCreateDepthStencilView->Tex1D.ArraySize != (UINT)-1);
298*61046927SAndroid Build Coastguard Worker desc.u.tex.level = pCreateDepthStencilView->Tex1D.MipSlice;
299*61046927SAndroid Build Coastguard Worker desc.u.tex.first_layer = pCreateDepthStencilView->Tex1D.FirstArraySlice;
300*61046927SAndroid Build Coastguard Worker desc.u.tex.last_layer = pCreateDepthStencilView->Tex1D.ArraySize - 1 +
301*61046927SAndroid Build Coastguard Worker desc.u.tex.first_layer;
302*61046927SAndroid Build Coastguard Worker break;
303*61046927SAndroid Build Coastguard Worker case D3D10DDIRESOURCE_TEXTURE2D:
304*61046927SAndroid Build Coastguard Worker ASSERT(pCreateDepthStencilView->Tex2D.ArraySize != (UINT)-1);
305*61046927SAndroid Build Coastguard Worker desc.u.tex.level = pCreateDepthStencilView->Tex2D.MipSlice;
306*61046927SAndroid Build Coastguard Worker desc.u.tex.first_layer = pCreateDepthStencilView->Tex2D.FirstArraySlice;
307*61046927SAndroid Build Coastguard Worker desc.u.tex.last_layer = pCreateDepthStencilView->Tex2D.ArraySize - 1 +
308*61046927SAndroid Build Coastguard Worker desc.u.tex.first_layer;
309*61046927SAndroid Build Coastguard Worker break;
310*61046927SAndroid Build Coastguard Worker case D3D10DDIRESOURCE_TEXTURECUBE:
311*61046927SAndroid Build Coastguard Worker ASSERT(pCreateDepthStencilView->TexCube.ArraySize != (UINT)-1);
312*61046927SAndroid Build Coastguard Worker desc.u.tex.level = pCreateDepthStencilView->TexCube.MipSlice;
313*61046927SAndroid Build Coastguard Worker desc.u.tex.first_layer = pCreateDepthStencilView->TexCube.FirstArraySlice;
314*61046927SAndroid Build Coastguard Worker desc.u.tex.last_layer = pCreateDepthStencilView->TexCube.ArraySize - 1 +
315*61046927SAndroid Build Coastguard Worker desc.u.tex.first_layer;
316*61046927SAndroid Build Coastguard Worker break;
317*61046927SAndroid Build Coastguard Worker default:
318*61046927SAndroid Build Coastguard Worker ASSERT(0);
319*61046927SAndroid Build Coastguard Worker return;
320*61046927SAndroid Build Coastguard Worker }
321*61046927SAndroid Build Coastguard Worker
322*61046927SAndroid Build Coastguard Worker pDSView->surface = pipe->create_surface(pipe, resource, &desc);
323*61046927SAndroid Build Coastguard Worker assert(pDSView->surface);
324*61046927SAndroid Build Coastguard Worker }
325*61046927SAndroid Build Coastguard Worker
326*61046927SAndroid Build Coastguard Worker
327*61046927SAndroid Build Coastguard Worker /*
328*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
329*61046927SAndroid Build Coastguard Worker *
330*61046927SAndroid Build Coastguard Worker * DestroyDepthStencilView --
331*61046927SAndroid Build Coastguard Worker *
332*61046927SAndroid Build Coastguard Worker * The DestroyDepthStencilView function destroys the specified
333*61046927SAndroid Build Coastguard Worker * depth stencil view object. The depth stencil view object can
334*61046927SAndroid Build Coastguard Worker * be destoyed only if it is not currently bound to a display device.
335*61046927SAndroid Build Coastguard Worker *
336*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
337*61046927SAndroid Build Coastguard Worker */
338*61046927SAndroid Build Coastguard Worker
339*61046927SAndroid Build Coastguard Worker void APIENTRY
DestroyDepthStencilView(D3D10DDI_HDEVICE hDevice,D3D10DDI_HDEPTHSTENCILVIEW hDepthStencilView)340*61046927SAndroid Build Coastguard Worker DestroyDepthStencilView(D3D10DDI_HDEVICE hDevice, // IN
341*61046927SAndroid Build Coastguard Worker D3D10DDI_HDEPTHSTENCILVIEW hDepthStencilView) // IN
342*61046927SAndroid Build Coastguard Worker {
343*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
344*61046927SAndroid Build Coastguard Worker
345*61046927SAndroid Build Coastguard Worker DepthStencilView *pDSView = CastDepthStencilView(hDepthStencilView);
346*61046927SAndroid Build Coastguard Worker
347*61046927SAndroid Build Coastguard Worker pipe_surface_reference(&pDSView->surface, NULL);
348*61046927SAndroid Build Coastguard Worker }
349*61046927SAndroid Build Coastguard Worker
350*61046927SAndroid Build Coastguard Worker
351*61046927SAndroid Build Coastguard Worker /*
352*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
353*61046927SAndroid Build Coastguard Worker *
354*61046927SAndroid Build Coastguard Worker * ClearDepthStencilView --
355*61046927SAndroid Build Coastguard Worker *
356*61046927SAndroid Build Coastguard Worker * The ClearDepthStencilView function clears the specified
357*61046927SAndroid Build Coastguard Worker * currently bound depth-stencil view.
358*61046927SAndroid Build Coastguard Worker *
359*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
360*61046927SAndroid Build Coastguard Worker */
361*61046927SAndroid Build Coastguard Worker
362*61046927SAndroid Build Coastguard Worker void APIENTRY
ClearDepthStencilView(D3D10DDI_HDEVICE hDevice,D3D10DDI_HDEPTHSTENCILVIEW hDepthStencilView,UINT Flags,FLOAT Depth,UINT8 Stencil)363*61046927SAndroid Build Coastguard Worker ClearDepthStencilView(D3D10DDI_HDEVICE hDevice, // IN
364*61046927SAndroid Build Coastguard Worker D3D10DDI_HDEPTHSTENCILVIEW hDepthStencilView, // IN
365*61046927SAndroid Build Coastguard Worker UINT Flags, // IN
366*61046927SAndroid Build Coastguard Worker FLOAT Depth, // IN
367*61046927SAndroid Build Coastguard Worker UINT8 Stencil) // IN
368*61046927SAndroid Build Coastguard Worker {
369*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
370*61046927SAndroid Build Coastguard Worker
371*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = CastPipeContext(hDevice);
372*61046927SAndroid Build Coastguard Worker struct pipe_surface *surface = CastPipeDepthStencilView(hDepthStencilView);
373*61046927SAndroid Build Coastguard Worker
374*61046927SAndroid Build Coastguard Worker unsigned flags = 0;
375*61046927SAndroid Build Coastguard Worker if (Flags & D3D10_DDI_CLEAR_DEPTH) {
376*61046927SAndroid Build Coastguard Worker flags |= PIPE_CLEAR_DEPTH;
377*61046927SAndroid Build Coastguard Worker }
378*61046927SAndroid Build Coastguard Worker if (Flags & D3D10_DDI_CLEAR_STENCIL) {
379*61046927SAndroid Build Coastguard Worker flags |= PIPE_CLEAR_STENCIL;
380*61046927SAndroid Build Coastguard Worker }
381*61046927SAndroid Build Coastguard Worker
382*61046927SAndroid Build Coastguard Worker pipe->clear_depth_stencil(pipe,
383*61046927SAndroid Build Coastguard Worker surface,
384*61046927SAndroid Build Coastguard Worker flags,
385*61046927SAndroid Build Coastguard Worker Depth,
386*61046927SAndroid Build Coastguard Worker Stencil,
387*61046927SAndroid Build Coastguard Worker 0, 0,
388*61046927SAndroid Build Coastguard Worker surface->width,
389*61046927SAndroid Build Coastguard Worker surface->height,
390*61046927SAndroid Build Coastguard Worker true);
391*61046927SAndroid Build Coastguard Worker }
392*61046927SAndroid Build Coastguard Worker
393*61046927SAndroid Build Coastguard Worker
394*61046927SAndroid Build Coastguard Worker /*
395*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
396*61046927SAndroid Build Coastguard Worker *
397*61046927SAndroid Build Coastguard Worker * CalcPrivateBlendStateSize --
398*61046927SAndroid Build Coastguard Worker *
399*61046927SAndroid Build Coastguard Worker * The CalcPrivateBlendStateSize function determines the size of
400*61046927SAndroid Build Coastguard Worker * the user-mode display driver's private region of memory (that
401*61046927SAndroid Build Coastguard Worker * is, the size of internal driver structures, not the size of
402*61046927SAndroid Build Coastguard Worker * the resource video memory) for a blend state.
403*61046927SAndroid Build Coastguard Worker *
404*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
405*61046927SAndroid Build Coastguard Worker */
406*61046927SAndroid Build Coastguard Worker
407*61046927SAndroid Build Coastguard Worker SIZE_T APIENTRY
CalcPrivateBlendStateSize(D3D10DDI_HDEVICE hDevice,__in const D3D10_DDI_BLEND_DESC * pBlendDesc)408*61046927SAndroid Build Coastguard Worker CalcPrivateBlendStateSize(D3D10DDI_HDEVICE hDevice, // IN
409*61046927SAndroid Build Coastguard Worker __in const D3D10_DDI_BLEND_DESC *pBlendDesc) // IN
410*61046927SAndroid Build Coastguard Worker {
411*61046927SAndroid Build Coastguard Worker return sizeof(BlendState);
412*61046927SAndroid Build Coastguard Worker }
413*61046927SAndroid Build Coastguard Worker
414*61046927SAndroid Build Coastguard Worker
415*61046927SAndroid Build Coastguard Worker /*
416*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
417*61046927SAndroid Build Coastguard Worker *
418*61046927SAndroid Build Coastguard Worker * CalcPrivateBlendStateSize1 --
419*61046927SAndroid Build Coastguard Worker *
420*61046927SAndroid Build Coastguard Worker * The CalcPrivateBlendStateSize function determines the size of
421*61046927SAndroid Build Coastguard Worker * the user-mode display driver's private region of memory (that
422*61046927SAndroid Build Coastguard Worker * is, the size of internal driver structures, not the size of
423*61046927SAndroid Build Coastguard Worker * the resource video memory) for a blend state.
424*61046927SAndroid Build Coastguard Worker *
425*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
426*61046927SAndroid Build Coastguard Worker */
427*61046927SAndroid Build Coastguard Worker
428*61046927SAndroid Build Coastguard Worker SIZE_T APIENTRY
CalcPrivateBlendStateSize1(D3D10DDI_HDEVICE hDevice,__in const D3D10_1_DDI_BLEND_DESC * pBlendDesc)429*61046927SAndroid Build Coastguard Worker CalcPrivateBlendStateSize1(D3D10DDI_HDEVICE hDevice, // IN
430*61046927SAndroid Build Coastguard Worker __in const D3D10_1_DDI_BLEND_DESC *pBlendDesc) // IN
431*61046927SAndroid Build Coastguard Worker {
432*61046927SAndroid Build Coastguard Worker return sizeof(BlendState);
433*61046927SAndroid Build Coastguard Worker }
434*61046927SAndroid Build Coastguard Worker
435*61046927SAndroid Build Coastguard Worker
436*61046927SAndroid Build Coastguard Worker /*
437*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
438*61046927SAndroid Build Coastguard Worker *
439*61046927SAndroid Build Coastguard Worker * translateBlend --
440*61046927SAndroid Build Coastguard Worker *
441*61046927SAndroid Build Coastguard Worker * Translate blend function from svga3d to gallium representation.
442*61046927SAndroid Build Coastguard Worker *
443*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
444*61046927SAndroid Build Coastguard Worker */
445*61046927SAndroid Build Coastguard Worker static uint
translateBlendOp(D3D10_DDI_BLEND_OP op)446*61046927SAndroid Build Coastguard Worker translateBlendOp(D3D10_DDI_BLEND_OP op)
447*61046927SAndroid Build Coastguard Worker {
448*61046927SAndroid Build Coastguard Worker switch (op) {
449*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_OP_ADD:
450*61046927SAndroid Build Coastguard Worker return PIPE_BLEND_ADD;
451*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_OP_SUBTRACT:
452*61046927SAndroid Build Coastguard Worker return PIPE_BLEND_SUBTRACT;
453*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_OP_REV_SUBTRACT:
454*61046927SAndroid Build Coastguard Worker return PIPE_BLEND_REVERSE_SUBTRACT;
455*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_OP_MIN:
456*61046927SAndroid Build Coastguard Worker return PIPE_BLEND_MIN;
457*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_OP_MAX:
458*61046927SAndroid Build Coastguard Worker return PIPE_BLEND_MAX;
459*61046927SAndroid Build Coastguard Worker default:
460*61046927SAndroid Build Coastguard Worker assert(0);
461*61046927SAndroid Build Coastguard Worker return PIPE_BLEND_ADD;
462*61046927SAndroid Build Coastguard Worker }
463*61046927SAndroid Build Coastguard Worker }
464*61046927SAndroid Build Coastguard Worker
465*61046927SAndroid Build Coastguard Worker
466*61046927SAndroid Build Coastguard Worker /*
467*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
468*61046927SAndroid Build Coastguard Worker *
469*61046927SAndroid Build Coastguard Worker * translateBlend --
470*61046927SAndroid Build Coastguard Worker *
471*61046927SAndroid Build Coastguard Worker * Translate blend factor from svga3d to gallium representation.
472*61046927SAndroid Build Coastguard Worker *
473*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
474*61046927SAndroid Build Coastguard Worker */
475*61046927SAndroid Build Coastguard Worker static uint
translateBlend(Device * pDevice,D3D10_DDI_BLEND blend)476*61046927SAndroid Build Coastguard Worker translateBlend(Device *pDevice,
477*61046927SAndroid Build Coastguard Worker D3D10_DDI_BLEND blend)
478*61046927SAndroid Build Coastguard Worker {
479*61046927SAndroid Build Coastguard Worker if (!pDevice->max_dual_source_render_targets) {
480*61046927SAndroid Build Coastguard Worker switch (blend) {
481*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_SRC1_COLOR:
482*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_SRC1_ALPHA:
483*61046927SAndroid Build Coastguard Worker LOG_UNSUPPORTED(true);
484*61046927SAndroid Build Coastguard Worker return D3D10_DDI_BLEND_ZERO;
485*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_INV_SRC1_COLOR:
486*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_INV_SRC1_ALPHA:
487*61046927SAndroid Build Coastguard Worker LOG_UNSUPPORTED(true);
488*61046927SAndroid Build Coastguard Worker return D3D10_DDI_BLEND_ONE;
489*61046927SAndroid Build Coastguard Worker default:
490*61046927SAndroid Build Coastguard Worker break;
491*61046927SAndroid Build Coastguard Worker }
492*61046927SAndroid Build Coastguard Worker }
493*61046927SAndroid Build Coastguard Worker
494*61046927SAndroid Build Coastguard Worker switch (blend) {
495*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_ZERO:
496*61046927SAndroid Build Coastguard Worker return PIPE_BLENDFACTOR_ZERO;
497*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_ONE:
498*61046927SAndroid Build Coastguard Worker return PIPE_BLENDFACTOR_ONE;
499*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_SRC_COLOR:
500*61046927SAndroid Build Coastguard Worker return PIPE_BLENDFACTOR_SRC_COLOR;
501*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_INV_SRC_COLOR:
502*61046927SAndroid Build Coastguard Worker return PIPE_BLENDFACTOR_INV_SRC_COLOR;
503*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_SRC_ALPHA:
504*61046927SAndroid Build Coastguard Worker return PIPE_BLENDFACTOR_SRC_ALPHA;
505*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_INV_SRC_ALPHA:
506*61046927SAndroid Build Coastguard Worker return PIPE_BLENDFACTOR_INV_SRC_ALPHA;
507*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_DEST_ALPHA:
508*61046927SAndroid Build Coastguard Worker return PIPE_BLENDFACTOR_DST_ALPHA;
509*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_INV_DEST_ALPHA:
510*61046927SAndroid Build Coastguard Worker return PIPE_BLENDFACTOR_INV_DST_ALPHA;
511*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_DEST_COLOR:
512*61046927SAndroid Build Coastguard Worker return PIPE_BLENDFACTOR_DST_COLOR;
513*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_INV_DEST_COLOR:
514*61046927SAndroid Build Coastguard Worker return PIPE_BLENDFACTOR_INV_DST_COLOR;
515*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_SRC_ALPHASAT:
516*61046927SAndroid Build Coastguard Worker return PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE;
517*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_BLEND_FACTOR:
518*61046927SAndroid Build Coastguard Worker return PIPE_BLENDFACTOR_CONST_COLOR;
519*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_INVBLEND_FACTOR:
520*61046927SAndroid Build Coastguard Worker return PIPE_BLENDFACTOR_INV_CONST_COLOR;
521*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_SRC1_COLOR:
522*61046927SAndroid Build Coastguard Worker return PIPE_BLENDFACTOR_SRC1_COLOR;
523*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_INV_SRC1_COLOR:
524*61046927SAndroid Build Coastguard Worker return PIPE_BLENDFACTOR_INV_SRC1_COLOR;
525*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_SRC1_ALPHA:
526*61046927SAndroid Build Coastguard Worker return PIPE_BLENDFACTOR_SRC1_ALPHA;
527*61046927SAndroid Build Coastguard Worker case D3D10_DDI_BLEND_INV_SRC1_ALPHA:
528*61046927SAndroid Build Coastguard Worker return PIPE_BLENDFACTOR_INV_SRC1_ALPHA;
529*61046927SAndroid Build Coastguard Worker default:
530*61046927SAndroid Build Coastguard Worker assert(0);
531*61046927SAndroid Build Coastguard Worker return PIPE_BLENDFACTOR_ONE;
532*61046927SAndroid Build Coastguard Worker }
533*61046927SAndroid Build Coastguard Worker }
534*61046927SAndroid Build Coastguard Worker
535*61046927SAndroid Build Coastguard Worker
536*61046927SAndroid Build Coastguard Worker /*
537*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
538*61046927SAndroid Build Coastguard Worker *
539*61046927SAndroid Build Coastguard Worker * CreateBlendState --
540*61046927SAndroid Build Coastguard Worker *
541*61046927SAndroid Build Coastguard Worker * The CreateBlendState function creates a blend state.
542*61046927SAndroid Build Coastguard Worker *
543*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
544*61046927SAndroid Build Coastguard Worker */
545*61046927SAndroid Build Coastguard Worker
546*61046927SAndroid Build Coastguard Worker void APIENTRY
CreateBlendState(D3D10DDI_HDEVICE hDevice,__in const D3D10_DDI_BLEND_DESC * pBlendDesc,D3D10DDI_HBLENDSTATE hBlendState,D3D10DDI_HRTBLENDSTATE hRTBlendState)547*61046927SAndroid Build Coastguard Worker CreateBlendState(D3D10DDI_HDEVICE hDevice, // IN
548*61046927SAndroid Build Coastguard Worker __in const D3D10_DDI_BLEND_DESC *pBlendDesc, // IN
549*61046927SAndroid Build Coastguard Worker D3D10DDI_HBLENDSTATE hBlendState, // IN
550*61046927SAndroid Build Coastguard Worker D3D10DDI_HRTBLENDSTATE hRTBlendState) // IN
551*61046927SAndroid Build Coastguard Worker {
552*61046927SAndroid Build Coastguard Worker unsigned i;
553*61046927SAndroid Build Coastguard Worker
554*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
555*61046927SAndroid Build Coastguard Worker
556*61046927SAndroid Build Coastguard Worker Device *pDevice = CastDevice(hDevice);
557*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = pDevice->pipe;
558*61046927SAndroid Build Coastguard Worker BlendState *pBlendState = CastBlendState(hBlendState);
559*61046927SAndroid Build Coastguard Worker
560*61046927SAndroid Build Coastguard Worker struct pipe_blend_state state;
561*61046927SAndroid Build Coastguard Worker memset(&state, 0, sizeof state);
562*61046927SAndroid Build Coastguard Worker
563*61046927SAndroid Build Coastguard Worker for (i = 0; i < MIN2(PIPE_MAX_COLOR_BUFS, D3D10_DDI_SIMULTANEOUS_RENDER_TARGET_COUNT); ++i) {
564*61046927SAndroid Build Coastguard Worker state.rt[i].blend_enable = pBlendDesc->BlendEnable[i];
565*61046927SAndroid Build Coastguard Worker state.rt[i].colormask = pBlendDesc->RenderTargetWriteMask[i];
566*61046927SAndroid Build Coastguard Worker
567*61046927SAndroid Build Coastguard Worker if (pBlendDesc->BlendEnable[0] != pBlendDesc->BlendEnable[i] ||
568*61046927SAndroid Build Coastguard Worker pBlendDesc->RenderTargetWriteMask[0] != pBlendDesc->RenderTargetWriteMask[i]) {
569*61046927SAndroid Build Coastguard Worker state.independent_blend_enable = 1;
570*61046927SAndroid Build Coastguard Worker }
571*61046927SAndroid Build Coastguard Worker }
572*61046927SAndroid Build Coastguard Worker
573*61046927SAndroid Build Coastguard Worker state.rt[0].rgb_func = translateBlendOp(pBlendDesc->BlendOp);
574*61046927SAndroid Build Coastguard Worker if (pBlendDesc->BlendOp == D3D10_DDI_BLEND_OP_MIN ||
575*61046927SAndroid Build Coastguard Worker pBlendDesc->BlendOp == D3D10_DDI_BLEND_OP_MAX) {
576*61046927SAndroid Build Coastguard Worker state.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE;
577*61046927SAndroid Build Coastguard Worker state.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ONE;
578*61046927SAndroid Build Coastguard Worker } else {
579*61046927SAndroid Build Coastguard Worker state.rt[0].rgb_src_factor = translateBlend(pDevice, pBlendDesc->SrcBlend);
580*61046927SAndroid Build Coastguard Worker state.rt[0].rgb_dst_factor = translateBlend(pDevice, pBlendDesc->DestBlend);
581*61046927SAndroid Build Coastguard Worker }
582*61046927SAndroid Build Coastguard Worker
583*61046927SAndroid Build Coastguard Worker state.rt[0].alpha_func = translateBlendOp(pBlendDesc->BlendOpAlpha);
584*61046927SAndroid Build Coastguard Worker if (pBlendDesc->BlendOpAlpha == D3D10_DDI_BLEND_OP_MIN ||
585*61046927SAndroid Build Coastguard Worker pBlendDesc->BlendOpAlpha == D3D10_DDI_BLEND_OP_MAX) {
586*61046927SAndroid Build Coastguard Worker state.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
587*61046927SAndroid Build Coastguard Worker state.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ONE;
588*61046927SAndroid Build Coastguard Worker } else {
589*61046927SAndroid Build Coastguard Worker state.rt[0].alpha_src_factor = translateBlend(pDevice, pBlendDesc->SrcBlendAlpha);
590*61046927SAndroid Build Coastguard Worker state.rt[0].alpha_dst_factor = translateBlend(pDevice, pBlendDesc->DestBlendAlpha);
591*61046927SAndroid Build Coastguard Worker }
592*61046927SAndroid Build Coastguard Worker
593*61046927SAndroid Build Coastguard Worker /*
594*61046927SAndroid Build Coastguard Worker * Propagate to all the other rendertargets
595*61046927SAndroid Build Coastguard Worker */
596*61046927SAndroid Build Coastguard Worker for (i = 1; i < MIN2(PIPE_MAX_COLOR_BUFS, D3D10_DDI_SIMULTANEOUS_RENDER_TARGET_COUNT); ++i) {
597*61046927SAndroid Build Coastguard Worker state.rt[i].rgb_func = state.rt[0].rgb_func;
598*61046927SAndroid Build Coastguard Worker state.rt[i].rgb_src_factor = state.rt[0].rgb_src_factor;
599*61046927SAndroid Build Coastguard Worker state.rt[i].rgb_dst_factor = state.rt[0].rgb_dst_factor;
600*61046927SAndroid Build Coastguard Worker state.rt[i].alpha_func = state.rt[0].alpha_func;
601*61046927SAndroid Build Coastguard Worker state.rt[i].alpha_src_factor = state.rt[0].alpha_src_factor;
602*61046927SAndroid Build Coastguard Worker state.rt[i].alpha_dst_factor = state.rt[0].alpha_dst_factor;
603*61046927SAndroid Build Coastguard Worker }
604*61046927SAndroid Build Coastguard Worker
605*61046927SAndroid Build Coastguard Worker state.alpha_to_coverage = pBlendDesc->AlphaToCoverageEnable;
606*61046927SAndroid Build Coastguard Worker
607*61046927SAndroid Build Coastguard Worker pBlendState->handle = pipe->create_blend_state(pipe, &state);
608*61046927SAndroid Build Coastguard Worker }
609*61046927SAndroid Build Coastguard Worker
610*61046927SAndroid Build Coastguard Worker
611*61046927SAndroid Build Coastguard Worker /*
612*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
613*61046927SAndroid Build Coastguard Worker *
614*61046927SAndroid Build Coastguard Worker * CreateBlendState1 --
615*61046927SAndroid Build Coastguard Worker *
616*61046927SAndroid Build Coastguard Worker * The CreateBlendState function creates a blend state.
617*61046927SAndroid Build Coastguard Worker *
618*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
619*61046927SAndroid Build Coastguard Worker */
620*61046927SAndroid Build Coastguard Worker
621*61046927SAndroid Build Coastguard Worker void APIENTRY
CreateBlendState1(D3D10DDI_HDEVICE hDevice,__in const D3D10_1_DDI_BLEND_DESC * pBlendDesc,D3D10DDI_HBLENDSTATE hBlendState,D3D10DDI_HRTBLENDSTATE hRTBlendState)622*61046927SAndroid Build Coastguard Worker CreateBlendState1(D3D10DDI_HDEVICE hDevice, // IN
623*61046927SAndroid Build Coastguard Worker __in const D3D10_1_DDI_BLEND_DESC *pBlendDesc, // IN
624*61046927SAndroid Build Coastguard Worker D3D10DDI_HBLENDSTATE hBlendState, // IN
625*61046927SAndroid Build Coastguard Worker D3D10DDI_HRTBLENDSTATE hRTBlendState) // IN
626*61046927SAndroid Build Coastguard Worker {
627*61046927SAndroid Build Coastguard Worker unsigned i;
628*61046927SAndroid Build Coastguard Worker
629*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
630*61046927SAndroid Build Coastguard Worker
631*61046927SAndroid Build Coastguard Worker Device *pDevice = CastDevice(hDevice);
632*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = pDevice->pipe;
633*61046927SAndroid Build Coastguard Worker BlendState *pBlendState = CastBlendState(hBlendState);
634*61046927SAndroid Build Coastguard Worker
635*61046927SAndroid Build Coastguard Worker struct pipe_blend_state state;
636*61046927SAndroid Build Coastguard Worker memset(&state, 0, sizeof state);
637*61046927SAndroid Build Coastguard Worker
638*61046927SAndroid Build Coastguard Worker state.alpha_to_coverage = pBlendDesc->AlphaToCoverageEnable;
639*61046927SAndroid Build Coastguard Worker state.independent_blend_enable = pBlendDesc->IndependentBlendEnable;
640*61046927SAndroid Build Coastguard Worker
641*61046927SAndroid Build Coastguard Worker for (i = 0; i < MIN2(PIPE_MAX_COLOR_BUFS, D3D10_DDI_SIMULTANEOUS_RENDER_TARGET_COUNT); ++i) {
642*61046927SAndroid Build Coastguard Worker state.rt[i].blend_enable = pBlendDesc->RenderTarget[i].BlendEnable;
643*61046927SAndroid Build Coastguard Worker state.rt[i].colormask = pBlendDesc->RenderTarget[i].RenderTargetWriteMask;
644*61046927SAndroid Build Coastguard Worker
645*61046927SAndroid Build Coastguard Worker state.rt[i].rgb_func = translateBlendOp(pBlendDesc->RenderTarget[i].BlendOp);
646*61046927SAndroid Build Coastguard Worker if (pBlendDesc->RenderTarget[i].BlendOp == D3D10_DDI_BLEND_OP_MIN ||
647*61046927SAndroid Build Coastguard Worker pBlendDesc->RenderTarget[i].BlendOp == D3D10_DDI_BLEND_OP_MAX) {
648*61046927SAndroid Build Coastguard Worker state.rt[i].rgb_src_factor = PIPE_BLENDFACTOR_ONE;
649*61046927SAndroid Build Coastguard Worker state.rt[i].rgb_dst_factor = PIPE_BLENDFACTOR_ONE;
650*61046927SAndroid Build Coastguard Worker } else {
651*61046927SAndroid Build Coastguard Worker state.rt[i].rgb_src_factor = translateBlend(pDevice, pBlendDesc->RenderTarget[i].SrcBlend);
652*61046927SAndroid Build Coastguard Worker state.rt[i].rgb_dst_factor = translateBlend(pDevice, pBlendDesc->RenderTarget[i].DestBlend);
653*61046927SAndroid Build Coastguard Worker }
654*61046927SAndroid Build Coastguard Worker
655*61046927SAndroid Build Coastguard Worker state.rt[i].alpha_func = translateBlendOp(pBlendDesc->RenderTarget[i].BlendOpAlpha);
656*61046927SAndroid Build Coastguard Worker if (pBlendDesc->RenderTarget[i].BlendOpAlpha == D3D10_DDI_BLEND_OP_MIN ||
657*61046927SAndroid Build Coastguard Worker pBlendDesc->RenderTarget[i].BlendOpAlpha == D3D10_DDI_BLEND_OP_MAX) {
658*61046927SAndroid Build Coastguard Worker state.rt[i].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
659*61046927SAndroid Build Coastguard Worker state.rt[i].alpha_dst_factor = PIPE_BLENDFACTOR_ONE;
660*61046927SAndroid Build Coastguard Worker } else {
661*61046927SAndroid Build Coastguard Worker state.rt[i].alpha_src_factor = translateBlend(pDevice, pBlendDesc->RenderTarget[i].SrcBlendAlpha);
662*61046927SAndroid Build Coastguard Worker state.rt[i].alpha_dst_factor = translateBlend(pDevice, pBlendDesc->RenderTarget[i].DestBlendAlpha);
663*61046927SAndroid Build Coastguard Worker }
664*61046927SAndroid Build Coastguard Worker }
665*61046927SAndroid Build Coastguard Worker
666*61046927SAndroid Build Coastguard Worker pBlendState->handle = pipe->create_blend_state(pipe, &state);
667*61046927SAndroid Build Coastguard Worker }
668*61046927SAndroid Build Coastguard Worker
669*61046927SAndroid Build Coastguard Worker
670*61046927SAndroid Build Coastguard Worker /*
671*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
672*61046927SAndroid Build Coastguard Worker *
673*61046927SAndroid Build Coastguard Worker * DestroyBlendState --
674*61046927SAndroid Build Coastguard Worker *
675*61046927SAndroid Build Coastguard Worker * The DestroyBlendState function destroys the specified blend
676*61046927SAndroid Build Coastguard Worker * state object. The blend state object can be destoyed only if
677*61046927SAndroid Build Coastguard Worker * it is not currently bound to a display device.
678*61046927SAndroid Build Coastguard Worker *
679*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
680*61046927SAndroid Build Coastguard Worker */
681*61046927SAndroid Build Coastguard Worker
682*61046927SAndroid Build Coastguard Worker void APIENTRY
DestroyBlendState(D3D10DDI_HDEVICE hDevice,D3D10DDI_HBLENDSTATE hBlendState)683*61046927SAndroid Build Coastguard Worker DestroyBlendState(D3D10DDI_HDEVICE hDevice, // IN
684*61046927SAndroid Build Coastguard Worker D3D10DDI_HBLENDSTATE hBlendState) // IN
685*61046927SAndroid Build Coastguard Worker {
686*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
687*61046927SAndroid Build Coastguard Worker
688*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = CastPipeContext(hDevice);
689*61046927SAndroid Build Coastguard Worker BlendState *pBlendState = CastBlendState(hBlendState);
690*61046927SAndroid Build Coastguard Worker
691*61046927SAndroid Build Coastguard Worker pipe->delete_blend_state(pipe, pBlendState->handle);
692*61046927SAndroid Build Coastguard Worker }
693*61046927SAndroid Build Coastguard Worker
694*61046927SAndroid Build Coastguard Worker
695*61046927SAndroid Build Coastguard Worker /*
696*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
697*61046927SAndroid Build Coastguard Worker *
698*61046927SAndroid Build Coastguard Worker * SetBlendState --
699*61046927SAndroid Build Coastguard Worker *
700*61046927SAndroid Build Coastguard Worker * The SetBlendState function sets a blend state.
701*61046927SAndroid Build Coastguard Worker *
702*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
703*61046927SAndroid Build Coastguard Worker */
704*61046927SAndroid Build Coastguard Worker
705*61046927SAndroid Build Coastguard Worker void APIENTRY
SetBlendState(D3D10DDI_HDEVICE hDevice,D3D10DDI_HBLENDSTATE hState,const FLOAT pBlendFactor[4],UINT SampleMask)706*61046927SAndroid Build Coastguard Worker SetBlendState(D3D10DDI_HDEVICE hDevice, // IN
707*61046927SAndroid Build Coastguard Worker D3D10DDI_HBLENDSTATE hState, // IN
708*61046927SAndroid Build Coastguard Worker const FLOAT pBlendFactor[4], // IN
709*61046927SAndroid Build Coastguard Worker UINT SampleMask) // IN
710*61046927SAndroid Build Coastguard Worker {
711*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
712*61046927SAndroid Build Coastguard Worker
713*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = CastPipeContext(hDevice);
714*61046927SAndroid Build Coastguard Worker void *state = CastPipeBlendState(hState);
715*61046927SAndroid Build Coastguard Worker
716*61046927SAndroid Build Coastguard Worker pipe->bind_blend_state(pipe, state);
717*61046927SAndroid Build Coastguard Worker
718*61046927SAndroid Build Coastguard Worker struct pipe_blend_color color;
719*61046927SAndroid Build Coastguard Worker color.color[0] = pBlendFactor[0];
720*61046927SAndroid Build Coastguard Worker color.color[1] = pBlendFactor[1];
721*61046927SAndroid Build Coastguard Worker color.color[2] = pBlendFactor[2];
722*61046927SAndroid Build Coastguard Worker color.color[3] = pBlendFactor[3];
723*61046927SAndroid Build Coastguard Worker
724*61046927SAndroid Build Coastguard Worker pipe->set_blend_color(pipe, &color);
725*61046927SAndroid Build Coastguard Worker
726*61046927SAndroid Build Coastguard Worker pipe->set_sample_mask(pipe, SampleMask);
727*61046927SAndroid Build Coastguard Worker }
728*61046927SAndroid Build Coastguard Worker
729*61046927SAndroid Build Coastguard Worker
730*61046927SAndroid Build Coastguard Worker /*
731*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
732*61046927SAndroid Build Coastguard Worker *
733*61046927SAndroid Build Coastguard Worker * SetRenderTargets --
734*61046927SAndroid Build Coastguard Worker *
735*61046927SAndroid Build Coastguard Worker * Set the rendertargets.
736*61046927SAndroid Build Coastguard Worker *
737*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
738*61046927SAndroid Build Coastguard Worker */
739*61046927SAndroid Build Coastguard Worker
740*61046927SAndroid Build Coastguard Worker void APIENTRY
SetRenderTargets(D3D10DDI_HDEVICE hDevice,__in_ecount (NumViews)const D3D10DDI_HRENDERTARGETVIEW * phRenderTargetView,UINT RTargets,UINT ClearTargets,D3D10DDI_HDEPTHSTENCILVIEW hDepthStencilView)741*61046927SAndroid Build Coastguard Worker SetRenderTargets(D3D10DDI_HDEVICE hDevice, // IN
742*61046927SAndroid Build Coastguard Worker __in_ecount (NumViews)
743*61046927SAndroid Build Coastguard Worker const D3D10DDI_HRENDERTARGETVIEW *phRenderTargetView, // IN
744*61046927SAndroid Build Coastguard Worker UINT RTargets, // IN
745*61046927SAndroid Build Coastguard Worker UINT ClearTargets, // IN
746*61046927SAndroid Build Coastguard Worker D3D10DDI_HDEPTHSTENCILVIEW hDepthStencilView) // IN
747*61046927SAndroid Build Coastguard Worker {
748*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
749*61046927SAndroid Build Coastguard Worker
750*61046927SAndroid Build Coastguard Worker Device *pDevice = CastDevice(hDevice);
751*61046927SAndroid Build Coastguard Worker
752*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = pDevice->pipe;
753*61046927SAndroid Build Coastguard Worker
754*61046927SAndroid Build Coastguard Worker pDevice->fb.nr_cbufs = 0;
755*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < RTargets; ++i) {
756*61046927SAndroid Build Coastguard Worker pipe_surface_reference(&pDevice->fb.cbufs[i],
757*61046927SAndroid Build Coastguard Worker CastPipeRenderTargetView(phRenderTargetView[i]));
758*61046927SAndroid Build Coastguard Worker if (pDevice->fb.cbufs[i]) {
759*61046927SAndroid Build Coastguard Worker pDevice->fb.nr_cbufs = i + 1;
760*61046927SAndroid Build Coastguard Worker }
761*61046927SAndroid Build Coastguard Worker }
762*61046927SAndroid Build Coastguard Worker
763*61046927SAndroid Build Coastguard Worker for (unsigned i = RTargets; i < PIPE_MAX_COLOR_BUFS; ++i) {
764*61046927SAndroid Build Coastguard Worker pipe_surface_reference(&pDevice->fb.cbufs[i], NULL);
765*61046927SAndroid Build Coastguard Worker }
766*61046927SAndroid Build Coastguard Worker
767*61046927SAndroid Build Coastguard Worker pipe_surface_reference(&pDevice->fb.zsbuf,
768*61046927SAndroid Build Coastguard Worker CastPipeDepthStencilView(hDepthStencilView));
769*61046927SAndroid Build Coastguard Worker
770*61046927SAndroid Build Coastguard Worker /*
771*61046927SAndroid Build Coastguard Worker * Calculate the width/height fields for this framebuffer. D3D10
772*61046927SAndroid Build Coastguard Worker * actually specifies that they be identical for all bound views.
773*61046927SAndroid Build Coastguard Worker */
774*61046927SAndroid Build Coastguard Worker unsigned width, height;
775*61046927SAndroid Build Coastguard Worker util_framebuffer_min_size(&pDevice->fb, &width, &height);
776*61046927SAndroid Build Coastguard Worker pDevice->fb.width = width;
777*61046927SAndroid Build Coastguard Worker pDevice->fb.height = height;
778*61046927SAndroid Build Coastguard Worker
779*61046927SAndroid Build Coastguard Worker pipe->set_framebuffer_state(pipe, &pDevice->fb);
780*61046927SAndroid Build Coastguard Worker }
781*61046927SAndroid Build Coastguard Worker
782*61046927SAndroid Build Coastguard Worker
783*61046927SAndroid Build Coastguard Worker /*
784*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
785*61046927SAndroid Build Coastguard Worker *
786*61046927SAndroid Build Coastguard Worker * CalcPrivateDepthStencilStateSize --
787*61046927SAndroid Build Coastguard Worker *
788*61046927SAndroid Build Coastguard Worker * The CalcPrivateDepthStencilStateSize function determines the size
789*61046927SAndroid Build Coastguard Worker * of the user-mode display driver's private region of memory (that
790*61046927SAndroid Build Coastguard Worker * is, the size of internal driver structures, not the size of the
791*61046927SAndroid Build Coastguard Worker * resource video memory) for a depth stencil state.
792*61046927SAndroid Build Coastguard Worker *
793*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
794*61046927SAndroid Build Coastguard Worker */
795*61046927SAndroid Build Coastguard Worker
796*61046927SAndroid Build Coastguard Worker SIZE_T APIENTRY
CalcPrivateDepthStencilStateSize(D3D10DDI_HDEVICE hDevice,__in const D3D10_DDI_DEPTH_STENCIL_DESC * pDepthStencilDesc)797*61046927SAndroid Build Coastguard Worker CalcPrivateDepthStencilStateSize(
798*61046927SAndroid Build Coastguard Worker D3D10DDI_HDEVICE hDevice, // IN
799*61046927SAndroid Build Coastguard Worker __in const D3D10_DDI_DEPTH_STENCIL_DESC *pDepthStencilDesc) // IN
800*61046927SAndroid Build Coastguard Worker {
801*61046927SAndroid Build Coastguard Worker return sizeof(DepthStencilState);
802*61046927SAndroid Build Coastguard Worker }
803*61046927SAndroid Build Coastguard Worker
804*61046927SAndroid Build Coastguard Worker
805*61046927SAndroid Build Coastguard Worker /*
806*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
807*61046927SAndroid Build Coastguard Worker *
808*61046927SAndroid Build Coastguard Worker * translateComparison --
809*61046927SAndroid Build Coastguard Worker *
810*61046927SAndroid Build Coastguard Worker * Translate comparison function from DX10 to gallium representation.
811*61046927SAndroid Build Coastguard Worker *
812*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
813*61046927SAndroid Build Coastguard Worker */
814*61046927SAndroid Build Coastguard Worker static uint
translateComparison(D3D10_DDI_COMPARISON_FUNC Func)815*61046927SAndroid Build Coastguard Worker translateComparison(D3D10_DDI_COMPARISON_FUNC Func)
816*61046927SAndroid Build Coastguard Worker {
817*61046927SAndroid Build Coastguard Worker switch (Func) {
818*61046927SAndroid Build Coastguard Worker case D3D10_DDI_COMPARISON_NEVER:
819*61046927SAndroid Build Coastguard Worker return PIPE_FUNC_NEVER;
820*61046927SAndroid Build Coastguard Worker case D3D10_DDI_COMPARISON_LESS:
821*61046927SAndroid Build Coastguard Worker return PIPE_FUNC_LESS;
822*61046927SAndroid Build Coastguard Worker case D3D10_DDI_COMPARISON_EQUAL:
823*61046927SAndroid Build Coastguard Worker return PIPE_FUNC_EQUAL;
824*61046927SAndroid Build Coastguard Worker case D3D10_DDI_COMPARISON_LESS_EQUAL:
825*61046927SAndroid Build Coastguard Worker return PIPE_FUNC_LEQUAL;
826*61046927SAndroid Build Coastguard Worker case D3D10_DDI_COMPARISON_GREATER:
827*61046927SAndroid Build Coastguard Worker return PIPE_FUNC_GREATER;
828*61046927SAndroid Build Coastguard Worker case D3D10_DDI_COMPARISON_NOT_EQUAL:
829*61046927SAndroid Build Coastguard Worker return PIPE_FUNC_NOTEQUAL;
830*61046927SAndroid Build Coastguard Worker case D3D10_DDI_COMPARISON_GREATER_EQUAL:
831*61046927SAndroid Build Coastguard Worker return PIPE_FUNC_GEQUAL;
832*61046927SAndroid Build Coastguard Worker case D3D10_DDI_COMPARISON_ALWAYS:
833*61046927SAndroid Build Coastguard Worker return PIPE_FUNC_ALWAYS;
834*61046927SAndroid Build Coastguard Worker default:
835*61046927SAndroid Build Coastguard Worker assert(0);
836*61046927SAndroid Build Coastguard Worker return PIPE_FUNC_ALWAYS;
837*61046927SAndroid Build Coastguard Worker }
838*61046927SAndroid Build Coastguard Worker }
839*61046927SAndroid Build Coastguard Worker
840*61046927SAndroid Build Coastguard Worker
841*61046927SAndroid Build Coastguard Worker /*
842*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
843*61046927SAndroid Build Coastguard Worker *
844*61046927SAndroid Build Coastguard Worker * translateStencilOp --
845*61046927SAndroid Build Coastguard Worker *
846*61046927SAndroid Build Coastguard Worker * Translate stencil op from DX10 to gallium representation.
847*61046927SAndroid Build Coastguard Worker *
848*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
849*61046927SAndroid Build Coastguard Worker */
850*61046927SAndroid Build Coastguard Worker static uint
translateStencilOp(D3D10_DDI_STENCIL_OP StencilOp)851*61046927SAndroid Build Coastguard Worker translateStencilOp(D3D10_DDI_STENCIL_OP StencilOp)
852*61046927SAndroid Build Coastguard Worker {
853*61046927SAndroid Build Coastguard Worker switch (StencilOp) {
854*61046927SAndroid Build Coastguard Worker case D3D10_DDI_STENCIL_OP_KEEP:
855*61046927SAndroid Build Coastguard Worker return PIPE_STENCIL_OP_KEEP;
856*61046927SAndroid Build Coastguard Worker case D3D10_DDI_STENCIL_OP_ZERO:
857*61046927SAndroid Build Coastguard Worker return PIPE_STENCIL_OP_ZERO;
858*61046927SAndroid Build Coastguard Worker case D3D10_DDI_STENCIL_OP_REPLACE:
859*61046927SAndroid Build Coastguard Worker return PIPE_STENCIL_OP_REPLACE;
860*61046927SAndroid Build Coastguard Worker case D3D10_DDI_STENCIL_OP_INCR_SAT:
861*61046927SAndroid Build Coastguard Worker return PIPE_STENCIL_OP_INCR;
862*61046927SAndroid Build Coastguard Worker case D3D10_DDI_STENCIL_OP_DECR_SAT:
863*61046927SAndroid Build Coastguard Worker return PIPE_STENCIL_OP_DECR;
864*61046927SAndroid Build Coastguard Worker case D3D10_DDI_STENCIL_OP_INVERT:
865*61046927SAndroid Build Coastguard Worker return PIPE_STENCIL_OP_INVERT;
866*61046927SAndroid Build Coastguard Worker case D3D10_DDI_STENCIL_OP_INCR:
867*61046927SAndroid Build Coastguard Worker return PIPE_STENCIL_OP_INCR_WRAP;
868*61046927SAndroid Build Coastguard Worker case D3D10_DDI_STENCIL_OP_DECR:
869*61046927SAndroid Build Coastguard Worker return PIPE_STENCIL_OP_DECR_WRAP;
870*61046927SAndroid Build Coastguard Worker default:
871*61046927SAndroid Build Coastguard Worker assert(0);
872*61046927SAndroid Build Coastguard Worker return PIPE_STENCIL_OP_KEEP;
873*61046927SAndroid Build Coastguard Worker }
874*61046927SAndroid Build Coastguard Worker }
875*61046927SAndroid Build Coastguard Worker
876*61046927SAndroid Build Coastguard Worker
877*61046927SAndroid Build Coastguard Worker /*
878*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
879*61046927SAndroid Build Coastguard Worker *
880*61046927SAndroid Build Coastguard Worker * CreateDepthStencilState --
881*61046927SAndroid Build Coastguard Worker *
882*61046927SAndroid Build Coastguard Worker * The CreateDepthStencilState function creates a depth stencil state.
883*61046927SAndroid Build Coastguard Worker *
884*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
885*61046927SAndroid Build Coastguard Worker */
886*61046927SAndroid Build Coastguard Worker
887*61046927SAndroid Build Coastguard Worker void APIENTRY
CreateDepthStencilState(D3D10DDI_HDEVICE hDevice,__in const D3D10_DDI_DEPTH_STENCIL_DESC * pDepthStencilDesc,D3D10DDI_HDEPTHSTENCILSTATE hDepthStencilState,D3D10DDI_HRTDEPTHSTENCILSTATE hRTDepthStencilState)888*61046927SAndroid Build Coastguard Worker CreateDepthStencilState(
889*61046927SAndroid Build Coastguard Worker D3D10DDI_HDEVICE hDevice, // IN
890*61046927SAndroid Build Coastguard Worker __in const D3D10_DDI_DEPTH_STENCIL_DESC *pDepthStencilDesc, // IN
891*61046927SAndroid Build Coastguard Worker D3D10DDI_HDEPTHSTENCILSTATE hDepthStencilState, // IN
892*61046927SAndroid Build Coastguard Worker D3D10DDI_HRTDEPTHSTENCILSTATE hRTDepthStencilState) // IN
893*61046927SAndroid Build Coastguard Worker {
894*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
895*61046927SAndroid Build Coastguard Worker
896*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = CastPipeContext(hDevice);
897*61046927SAndroid Build Coastguard Worker DepthStencilState *pDepthStencilState = CastDepthStencilState(hDepthStencilState);
898*61046927SAndroid Build Coastguard Worker
899*61046927SAndroid Build Coastguard Worker struct pipe_depth_stencil_alpha_state state;
900*61046927SAndroid Build Coastguard Worker memset(&state, 0, sizeof state);
901*61046927SAndroid Build Coastguard Worker
902*61046927SAndroid Build Coastguard Worker /* Depth. */
903*61046927SAndroid Build Coastguard Worker state.depth_enabled = (pDepthStencilDesc->DepthEnable ? 1 : 0);
904*61046927SAndroid Build Coastguard Worker state.depth_writemask = (pDepthStencilDesc->DepthWriteMask ? 1 : 0);
905*61046927SAndroid Build Coastguard Worker state.depth_func = translateComparison(pDepthStencilDesc->DepthFunc);
906*61046927SAndroid Build Coastguard Worker
907*61046927SAndroid Build Coastguard Worker /* Stencil. */
908*61046927SAndroid Build Coastguard Worker if (pDepthStencilDesc->StencilEnable) {
909*61046927SAndroid Build Coastguard Worker struct pipe_stencil_state *face0 = &state.stencil[0];
910*61046927SAndroid Build Coastguard Worker struct pipe_stencil_state *face1 = &state.stencil[1];
911*61046927SAndroid Build Coastguard Worker
912*61046927SAndroid Build Coastguard Worker face0->enabled = 1;
913*61046927SAndroid Build Coastguard Worker face0->func = translateComparison(pDepthStencilDesc->FrontFace.StencilFunc);
914*61046927SAndroid Build Coastguard Worker face0->fail_op = translateStencilOp(pDepthStencilDesc->FrontFace.StencilFailOp);
915*61046927SAndroid Build Coastguard Worker face0->zpass_op = translateStencilOp(pDepthStencilDesc->FrontFace.StencilPassOp);
916*61046927SAndroid Build Coastguard Worker face0->zfail_op = translateStencilOp(pDepthStencilDesc->FrontFace.StencilDepthFailOp);
917*61046927SAndroid Build Coastguard Worker face0->valuemask = pDepthStencilDesc->StencilReadMask;
918*61046927SAndroid Build Coastguard Worker face0->writemask = pDepthStencilDesc->StencilWriteMask;
919*61046927SAndroid Build Coastguard Worker
920*61046927SAndroid Build Coastguard Worker face1->enabled = 1;
921*61046927SAndroid Build Coastguard Worker face1->func = translateComparison(pDepthStencilDesc->BackFace.StencilFunc);
922*61046927SAndroid Build Coastguard Worker face1->fail_op = translateStencilOp(pDepthStencilDesc->BackFace.StencilFailOp);
923*61046927SAndroid Build Coastguard Worker face1->zpass_op = translateStencilOp(pDepthStencilDesc->BackFace.StencilPassOp);
924*61046927SAndroid Build Coastguard Worker face1->zfail_op = translateStencilOp(pDepthStencilDesc->BackFace.StencilDepthFailOp);
925*61046927SAndroid Build Coastguard Worker face1->valuemask = pDepthStencilDesc->StencilReadMask;
926*61046927SAndroid Build Coastguard Worker face1->writemask = pDepthStencilDesc->StencilWriteMask;
927*61046927SAndroid Build Coastguard Worker #if MESA_DEBUG
928*61046927SAndroid Build Coastguard Worker if (!pDepthStencilDesc->FrontEnable) {
929*61046927SAndroid Build Coastguard Worker ASSERT(face0->func == PIPE_FUNC_ALWAYS);
930*61046927SAndroid Build Coastguard Worker ASSERT(face0->fail_op == PIPE_STENCIL_OP_KEEP);
931*61046927SAndroid Build Coastguard Worker ASSERT(face0->zpass_op == PIPE_STENCIL_OP_KEEP);
932*61046927SAndroid Build Coastguard Worker ASSERT(face0->zfail_op == PIPE_STENCIL_OP_KEEP);
933*61046927SAndroid Build Coastguard Worker }
934*61046927SAndroid Build Coastguard Worker
935*61046927SAndroid Build Coastguard Worker if (!pDepthStencilDesc->BackEnable) {
936*61046927SAndroid Build Coastguard Worker ASSERT(face1->func == PIPE_FUNC_ALWAYS);
937*61046927SAndroid Build Coastguard Worker ASSERT(face1->fail_op == PIPE_STENCIL_OP_KEEP);
938*61046927SAndroid Build Coastguard Worker ASSERT(face1->zpass_op == PIPE_STENCIL_OP_KEEP);
939*61046927SAndroid Build Coastguard Worker ASSERT(face1->zfail_op == PIPE_STENCIL_OP_KEEP);
940*61046927SAndroid Build Coastguard Worker }
941*61046927SAndroid Build Coastguard Worker #endif
942*61046927SAndroid Build Coastguard Worker }
943*61046927SAndroid Build Coastguard Worker
944*61046927SAndroid Build Coastguard Worker pDepthStencilState->handle =
945*61046927SAndroid Build Coastguard Worker pipe->create_depth_stencil_alpha_state(pipe, &state);
946*61046927SAndroid Build Coastguard Worker }
947*61046927SAndroid Build Coastguard Worker
948*61046927SAndroid Build Coastguard Worker
949*61046927SAndroid Build Coastguard Worker /*
950*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
951*61046927SAndroid Build Coastguard Worker *
952*61046927SAndroid Build Coastguard Worker * DestroyDepthStencilState --
953*61046927SAndroid Build Coastguard Worker *
954*61046927SAndroid Build Coastguard Worker * The CreateDepthStencilState function creates a depth stencil state.
955*61046927SAndroid Build Coastguard Worker *
956*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
957*61046927SAndroid Build Coastguard Worker */
958*61046927SAndroid Build Coastguard Worker
959*61046927SAndroid Build Coastguard Worker void APIENTRY
DestroyDepthStencilState(D3D10DDI_HDEVICE hDevice,D3D10DDI_HDEPTHSTENCILSTATE hDepthStencilState)960*61046927SAndroid Build Coastguard Worker DestroyDepthStencilState(D3D10DDI_HDEVICE hDevice, // IN
961*61046927SAndroid Build Coastguard Worker D3D10DDI_HDEPTHSTENCILSTATE hDepthStencilState) // IN
962*61046927SAndroid Build Coastguard Worker {
963*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
964*61046927SAndroid Build Coastguard Worker
965*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = CastPipeContext(hDevice);
966*61046927SAndroid Build Coastguard Worker DepthStencilState *pDepthStencilState = CastDepthStencilState(hDepthStencilState);
967*61046927SAndroid Build Coastguard Worker
968*61046927SAndroid Build Coastguard Worker pipe->delete_depth_stencil_alpha_state(pipe, pDepthStencilState->handle);
969*61046927SAndroid Build Coastguard Worker }
970*61046927SAndroid Build Coastguard Worker
971*61046927SAndroid Build Coastguard Worker
972*61046927SAndroid Build Coastguard Worker /*
973*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
974*61046927SAndroid Build Coastguard Worker *
975*61046927SAndroid Build Coastguard Worker * SetDepthStencilState --
976*61046927SAndroid Build Coastguard Worker *
977*61046927SAndroid Build Coastguard Worker * The SetDepthStencilState function sets a depth-stencil state.
978*61046927SAndroid Build Coastguard Worker *
979*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
980*61046927SAndroid Build Coastguard Worker */
981*61046927SAndroid Build Coastguard Worker
982*61046927SAndroid Build Coastguard Worker void APIENTRY
SetDepthStencilState(D3D10DDI_HDEVICE hDevice,D3D10DDI_HDEPTHSTENCILSTATE hState,UINT StencilRef)983*61046927SAndroid Build Coastguard Worker SetDepthStencilState(D3D10DDI_HDEVICE hDevice, // IN
984*61046927SAndroid Build Coastguard Worker D3D10DDI_HDEPTHSTENCILSTATE hState, // IN
985*61046927SAndroid Build Coastguard Worker UINT StencilRef) // IN
986*61046927SAndroid Build Coastguard Worker {
987*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
988*61046927SAndroid Build Coastguard Worker
989*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = CastPipeContext(hDevice);
990*61046927SAndroid Build Coastguard Worker void *state = CastPipeDepthStencilState(hState);
991*61046927SAndroid Build Coastguard Worker struct pipe_stencil_ref psr;
992*61046927SAndroid Build Coastguard Worker
993*61046927SAndroid Build Coastguard Worker psr.ref_value[0] = StencilRef;
994*61046927SAndroid Build Coastguard Worker psr.ref_value[1] = StencilRef;
995*61046927SAndroid Build Coastguard Worker
996*61046927SAndroid Build Coastguard Worker pipe->bind_depth_stencil_alpha_state(pipe, state);
997*61046927SAndroid Build Coastguard Worker pipe->set_stencil_ref(pipe, psr);
998*61046927SAndroid Build Coastguard Worker }
999