xref: /aosp_15_r20/external/mesa3d/src/gallium/frontends/d3d10umd/OutputMerger.cpp (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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