xref: /aosp_15_r20/external/mesa3d/src/gallium/frontends/nine/adapter9.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2011 Joakim Sindholt <[email protected]>
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #include "adapter9.h"
7*61046927SAndroid Build Coastguard Worker #include "device9ex.h"
8*61046927SAndroid Build Coastguard Worker #include "nine_helpers.h"
9*61046927SAndroid Build Coastguard Worker #include "nine_defines.h"
10*61046927SAndroid Build Coastguard Worker #include "nine_pipe.h"
11*61046927SAndroid Build Coastguard Worker #include "nine_dump.h"
12*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
13*61046927SAndroid Build Coastguard Worker #include "util/format/u_format.h"
14*61046927SAndroid Build Coastguard Worker #include "util/u_dump.h"
15*61046927SAndroid Build Coastguard Worker #include "nir.h"
16*61046927SAndroid Build Coastguard Worker 
17*61046927SAndroid Build Coastguard Worker #include "pipe/p_screen.h"
18*61046927SAndroid Build Coastguard Worker 
19*61046927SAndroid Build Coastguard Worker #define DBG_CHANNEL DBG_ADAPTER
20*61046927SAndroid Build Coastguard Worker 
21*61046927SAndroid Build Coastguard Worker static bool
has_sm3(struct pipe_screen * hal)22*61046927SAndroid Build Coastguard Worker has_sm3(struct pipe_screen *hal)
23*61046927SAndroid Build Coastguard Worker {
24*61046927SAndroid Build Coastguard Worker     return hal->get_param(hal, PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD) &&
25*61046927SAndroid Build Coastguard Worker            hal->get_param(hal, PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES);
26*61046927SAndroid Build Coastguard Worker }
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker HRESULT
NineAdapter9_ctor(struct NineAdapter9 * This,struct NineUnknownParams * pParams,struct d3dadapter9_context * pCTX)29*61046927SAndroid Build Coastguard Worker NineAdapter9_ctor( struct NineAdapter9 *This,
30*61046927SAndroid Build Coastguard Worker                    struct NineUnknownParams *pParams,
31*61046927SAndroid Build Coastguard Worker                    struct d3dadapter9_context *pCTX )
32*61046927SAndroid Build Coastguard Worker {
33*61046927SAndroid Build Coastguard Worker     struct pipe_screen *hal = pCTX->hal;
34*61046927SAndroid Build Coastguard Worker     HRESULT hr = NineUnknown_ctor(&This->base, pParams);
35*61046927SAndroid Build Coastguard Worker     if (FAILED(hr)) { return hr; }
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker     DBG("This=%p pParams=%p pCTX=%p\n", This, pParams, pCTX);
38*61046927SAndroid Build Coastguard Worker     nine_dump_D3DADAPTER_IDENTIFIER9(DBG_CHANNEL, &pCTX->identifier);
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker     This->ctx = pCTX;
41*61046927SAndroid Build Coastguard Worker     if (!hal->get_param(hal, PIPE_CAP_CLIP_HALFZ)) {
42*61046927SAndroid Build Coastguard Worker         WARN_ONCE("Driver doesn't natively support d3d9 coordinates\n");
43*61046927SAndroid Build Coastguard Worker         const nir_shader_compiler_options *options = hal->get_compiler_options(hal, PIPE_SHADER_IR_NIR, PIPE_SHADER_VERTEX);
44*61046927SAndroid Build Coastguard Worker         if(!options->compact_arrays){
45*61046927SAndroid Build Coastguard Worker             ERR("Driver doesn't support emulating d3d9 coordinates\n");
46*61046927SAndroid Build Coastguard Worker             return D3DERR_DRIVERINTERNALERROR;
47*61046927SAndroid Build Coastguard Worker         }
48*61046927SAndroid Build Coastguard Worker     }
49*61046927SAndroid Build Coastguard Worker     /* Old cards had tricks to bypass some restrictions to implement
50*61046927SAndroid Build Coastguard Worker      * everything and fit tight the requirements: number of constants,
51*61046927SAndroid Build Coastguard Worker      * number of temp registers, special behaviours, etc. Since we don't
52*61046927SAndroid Build Coastguard Worker      * have access to all this, we need a bit more than what dx9 required.
53*61046927SAndroid Build Coastguard Worker      * For example we have to use more than 32 temp registers to emulate
54*61046927SAndroid Build Coastguard Worker      * behaviours, while some dx9 hw don't have more. As for sm2 hardware,
55*61046927SAndroid Build Coastguard Worker      * we could support vs2 / ps2 for them but it needs some more care, and
56*61046927SAndroid Build Coastguard Worker      * as these are very old, we choose to drop support for them */
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker     /* checks minimum requirements, most are vs3/ps3 strict requirements */
59*61046927SAndroid Build Coastguard Worker     if (!has_sm3(hal) ||
60*61046927SAndroid Build Coastguard Worker         hal->get_shader_param(hal, PIPE_SHADER_VERTEX,
61*61046927SAndroid Build Coastguard Worker                               PIPE_SHADER_CAP_MAX_CONST_BUFFER0_SIZE) < 256 * sizeof(float[4]) ||
62*61046927SAndroid Build Coastguard Worker         hal->get_shader_param(hal, PIPE_SHADER_FRAGMENT,
63*61046927SAndroid Build Coastguard Worker                               PIPE_SHADER_CAP_MAX_CONST_BUFFER0_SIZE) < 244 * sizeof(float[4]) ||
64*61046927SAndroid Build Coastguard Worker         hal->get_shader_param(hal, PIPE_SHADER_VERTEX,
65*61046927SAndroid Build Coastguard Worker                               PIPE_SHADER_CAP_MAX_TEMPS) < 32 ||
66*61046927SAndroid Build Coastguard Worker         hal->get_shader_param(hal, PIPE_SHADER_FRAGMENT,
67*61046927SAndroid Build Coastguard Worker                               PIPE_SHADER_CAP_MAX_TEMPS) < 32 ||
68*61046927SAndroid Build Coastguard Worker         hal->get_shader_param(hal, PIPE_SHADER_VERTEX,
69*61046927SAndroid Build Coastguard Worker                               PIPE_SHADER_CAP_MAX_INPUTS) < 16 ||
70*61046927SAndroid Build Coastguard Worker         hal->get_shader_param(hal, PIPE_SHADER_FRAGMENT,
71*61046927SAndroid Build Coastguard Worker                               PIPE_SHADER_CAP_MAX_INPUTS) < 10 ||
72*61046927SAndroid Build Coastguard Worker         hal->get_shader_param(hal, PIPE_SHADER_FRAGMENT,
73*61046927SAndroid Build Coastguard Worker                               PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS) < 16) {
74*61046927SAndroid Build Coastguard Worker         ERR("Your device is not supported by Gallium Nine. Minimum requirement "
75*61046927SAndroid Build Coastguard Worker             "is >= r500, >= nv50, >= i965\n");
76*61046927SAndroid Build Coastguard Worker         return D3DERR_DRIVERINTERNALERROR;
77*61046927SAndroid Build Coastguard Worker     }
78*61046927SAndroid Build Coastguard Worker     /* for r500 */
79*61046927SAndroid Build Coastguard Worker     if (hal->get_shader_param(hal, PIPE_SHADER_VERTEX,
80*61046927SAndroid Build Coastguard Worker                               PIPE_SHADER_CAP_MAX_CONST_BUFFER0_SIZE) < 276 * sizeof(float[4]) || /* we put bool and int constants with float constants */
81*61046927SAndroid Build Coastguard Worker         hal->get_shader_param(hal, PIPE_SHADER_VERTEX,
82*61046927SAndroid Build Coastguard Worker                               PIPE_SHADER_CAP_MAX_TEMPS) < 40 || /* we use some more temp registers */
83*61046927SAndroid Build Coastguard Worker         hal->get_shader_param(hal, PIPE_SHADER_FRAGMENT,
84*61046927SAndroid Build Coastguard Worker                               PIPE_SHADER_CAP_MAX_TEMPS) < 40 ||
85*61046927SAndroid Build Coastguard Worker         hal->get_shader_param(hal, PIPE_SHADER_FRAGMENT,
86*61046927SAndroid Build Coastguard Worker                               PIPE_SHADER_CAP_MAX_INPUTS) < 20) /* we don't pack inputs as much as we could */
87*61046927SAndroid Build Coastguard Worker         WARN_ONCE("Your device is at the limit of Gallium Nine requirements. Some games "
88*61046927SAndroid Build Coastguard Worker             "may run into issues because requirements are too tight\n");
89*61046927SAndroid Build Coastguard Worker     return D3D_OK;
90*61046927SAndroid Build Coastguard Worker }
91*61046927SAndroid Build Coastguard Worker 
92*61046927SAndroid Build Coastguard Worker void
NineAdapter9_dtor(struct NineAdapter9 * This)93*61046927SAndroid Build Coastguard Worker NineAdapter9_dtor( struct NineAdapter9 *This )
94*61046927SAndroid Build Coastguard Worker {
95*61046927SAndroid Build Coastguard Worker     struct d3dadapter9_context *ctx = This->ctx;
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker     DBG("This=%p\n", This);
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker     NineUnknown_dtor(&This->base);
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker     /* special case, call backend-specific dtor AFTER destroying this object
102*61046927SAndroid Build Coastguard Worker      * completely. */
103*61046927SAndroid Build Coastguard Worker     if (ctx) {
104*61046927SAndroid Build Coastguard Worker         if (ctx->destroy) { ctx->destroy(ctx); }
105*61046927SAndroid Build Coastguard Worker     }
106*61046927SAndroid Build Coastguard Worker }
107*61046927SAndroid Build Coastguard Worker 
108*61046927SAndroid Build Coastguard Worker static HRESULT
NineAdapter9_GetScreen(struct NineAdapter9 * This,D3DDEVTYPE DevType,struct pipe_screen ** ppScreen)109*61046927SAndroid Build Coastguard Worker NineAdapter9_GetScreen( struct NineAdapter9 *This,
110*61046927SAndroid Build Coastguard Worker                         D3DDEVTYPE DevType,
111*61046927SAndroid Build Coastguard Worker                         struct pipe_screen **ppScreen )
112*61046927SAndroid Build Coastguard Worker {
113*61046927SAndroid Build Coastguard Worker     const char *force_sw = getenv("D3D_ALWAYS_SOFTWARE");
114*61046927SAndroid Build Coastguard Worker     switch (DevType) {
115*61046927SAndroid Build Coastguard Worker         case D3DDEVTYPE_HAL:
116*61046927SAndroid Build Coastguard Worker             if (force_sw && !strcmp(force_sw, "1") && This->ctx->ref) {
117*61046927SAndroid Build Coastguard Worker                 *ppScreen = This->ctx->ref;
118*61046927SAndroid Build Coastguard Worker                 break;
119*61046927SAndroid Build Coastguard Worker             }
120*61046927SAndroid Build Coastguard Worker             *ppScreen = This->ctx->hal;
121*61046927SAndroid Build Coastguard Worker             break;
122*61046927SAndroid Build Coastguard Worker 
123*61046927SAndroid Build Coastguard Worker         case D3DDEVTYPE_REF:
124*61046927SAndroid Build Coastguard Worker         case D3DDEVTYPE_NULLREF:
125*61046927SAndroid Build Coastguard Worker         case D3DDEVTYPE_SW:
126*61046927SAndroid Build Coastguard Worker             if (force_sw && !strcmp(force_sw, "0")) {
127*61046927SAndroid Build Coastguard Worker                 *ppScreen = This->ctx->hal;
128*61046927SAndroid Build Coastguard Worker                 break;
129*61046927SAndroid Build Coastguard Worker             }
130*61046927SAndroid Build Coastguard Worker             *ppScreen = This->ctx->ref;
131*61046927SAndroid Build Coastguard Worker             break;
132*61046927SAndroid Build Coastguard Worker 
133*61046927SAndroid Build Coastguard Worker         default:
134*61046927SAndroid Build Coastguard Worker             user_assert(!"Invalid device type", D3DERR_INVALIDCALL);
135*61046927SAndroid Build Coastguard Worker     }
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker     if (!*ppScreen) { return D3DERR_NOTAVAILABLE; }
138*61046927SAndroid Build Coastguard Worker 
139*61046927SAndroid Build Coastguard Worker     return D3D_OK;
140*61046927SAndroid Build Coastguard Worker }
141*61046927SAndroid Build Coastguard Worker 
142*61046927SAndroid Build Coastguard Worker HRESULT NINE_WINAPI
NineAdapter9_GetAdapterIdentifier(struct NineAdapter9 * This,DWORD Flags,D3DADAPTER_IDENTIFIER9 * pIdentifier)143*61046927SAndroid Build Coastguard Worker NineAdapter9_GetAdapterIdentifier( struct NineAdapter9 *This,
144*61046927SAndroid Build Coastguard Worker                                    DWORD Flags,
145*61046927SAndroid Build Coastguard Worker                                    D3DADAPTER_IDENTIFIER9 *pIdentifier )
146*61046927SAndroid Build Coastguard Worker {
147*61046927SAndroid Build Coastguard Worker     DBG("This=%p Flags=%x pIdentifier=%p\n", This, Flags, pIdentifier);
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker     /* regarding flags, MSDN has this to say:
150*61046927SAndroid Build Coastguard Worker      *  Flags sets the WHQLLevel member of D3DADAPTER_IDENTIFIER9. Flags can be
151*61046927SAndroid Build Coastguard Worker      *  set to either 0 or D3DENUM_WHQL_LEVEL. If D3DENUM_WHQL_LEVEL is
152*61046927SAndroid Build Coastguard Worker      *  specified, this call can connect to the Internet to download new
153*61046927SAndroid Build Coastguard Worker      *  Microsoft Windows Hardware Quality Labs (WHQL) certificates.
154*61046927SAndroid Build Coastguard Worker      * so let's just ignore it. */
155*61046927SAndroid Build Coastguard Worker     *pIdentifier = This->ctx->identifier;
156*61046927SAndroid Build Coastguard Worker     return D3D_OK;
157*61046927SAndroid Build Coastguard Worker }
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker static inline bool
backbuffer_format(D3DFORMAT dfmt,D3DFORMAT bfmt,bool win)160*61046927SAndroid Build Coastguard Worker backbuffer_format( D3DFORMAT dfmt,
161*61046927SAndroid Build Coastguard Worker                    D3DFORMAT bfmt,
162*61046927SAndroid Build Coastguard Worker                    bool win )
163*61046927SAndroid Build Coastguard Worker {
164*61046927SAndroid Build Coastguard Worker     if (dfmt == D3DFMT_A2R10G10B10 && win) { return false; }
165*61046927SAndroid Build Coastguard Worker 
166*61046927SAndroid Build Coastguard Worker     if ((dfmt == D3DFMT_A2R10G10B10 && bfmt == dfmt) ||
167*61046927SAndroid Build Coastguard Worker         (dfmt == D3DFMT_X8R8G8B8 && (bfmt == dfmt ||
168*61046927SAndroid Build Coastguard Worker                                      bfmt == D3DFMT_A8R8G8B8)) ||
169*61046927SAndroid Build Coastguard Worker         (dfmt == D3DFMT_X1R5G5B5 && (bfmt == dfmt ||
170*61046927SAndroid Build Coastguard Worker                                      bfmt == D3DFMT_A1R5G5B5)) ||
171*61046927SAndroid Build Coastguard Worker         (dfmt == D3DFMT_R5G6B5 && bfmt == dfmt)) {
172*61046927SAndroid Build Coastguard Worker         return true;
173*61046927SAndroid Build Coastguard Worker     }
174*61046927SAndroid Build Coastguard Worker 
175*61046927SAndroid Build Coastguard Worker     return false;
176*61046927SAndroid Build Coastguard Worker }
177*61046927SAndroid Build Coastguard Worker 
178*61046927SAndroid Build Coastguard Worker HRESULT NINE_WINAPI
NineAdapter9_CheckDeviceType(struct NineAdapter9 * This,D3DDEVTYPE DevType,D3DFORMAT AdapterFormat,D3DFORMAT BackBufferFormat,BOOL bWindowed)179*61046927SAndroid Build Coastguard Worker NineAdapter9_CheckDeviceType( struct NineAdapter9 *This,
180*61046927SAndroid Build Coastguard Worker                               D3DDEVTYPE DevType,
181*61046927SAndroid Build Coastguard Worker                               D3DFORMAT AdapterFormat,
182*61046927SAndroid Build Coastguard Worker                               D3DFORMAT BackBufferFormat,
183*61046927SAndroid Build Coastguard Worker                               BOOL bWindowed )
184*61046927SAndroid Build Coastguard Worker {
185*61046927SAndroid Build Coastguard Worker     struct pipe_screen *screen;
186*61046927SAndroid Build Coastguard Worker     enum pipe_format dfmt, bfmt;
187*61046927SAndroid Build Coastguard Worker     HRESULT hr;
188*61046927SAndroid Build Coastguard Worker 
189*61046927SAndroid Build Coastguard Worker     DBG("This=%p DevType=%s AdapterFormat=%s BackBufferFormat=%s "
190*61046927SAndroid Build Coastguard Worker         "bWindowed=%i\n", This, nine_D3DDEVTYPE_to_str(DevType),
191*61046927SAndroid Build Coastguard Worker         d3dformat_to_string(AdapterFormat),
192*61046927SAndroid Build Coastguard Worker         d3dformat_to_string(BackBufferFormat), bWindowed);
193*61046927SAndroid Build Coastguard Worker 
194*61046927SAndroid Build Coastguard Worker     user_assert(backbuffer_format(AdapterFormat, BackBufferFormat, bWindowed),
195*61046927SAndroid Build Coastguard Worker                 D3DERR_NOTAVAILABLE);
196*61046927SAndroid Build Coastguard Worker 
197*61046927SAndroid Build Coastguard Worker     hr = NineAdapter9_GetScreen(This, DevType, &screen);
198*61046927SAndroid Build Coastguard Worker     if (FAILED(hr)) { return hr; }
199*61046927SAndroid Build Coastguard Worker 
200*61046927SAndroid Build Coastguard Worker     /* The display format is not handled in Nine. We always present an XRGB8888
201*61046927SAndroid Build Coastguard Worker      * buffer (and the display server will eventually do the conversion). We probably
202*61046927SAndroid Build Coastguard Worker      * don't need to check for anything for the adapter format support, since if the
203*61046927SAndroid Build Coastguard Worker      * display server advertise support, it will likely be able to do the conversion.
204*61046927SAndroid Build Coastguard Worker      * We do the approximation that a format is available in the display server if
205*61046927SAndroid Build Coastguard Worker      * the format passes with NINE_BIND_BACKBUFFER_FLAGS */
206*61046927SAndroid Build Coastguard Worker     dfmt = d3d9_to_pipe_format_checked(screen, AdapterFormat, PIPE_TEXTURE_2D,
207*61046927SAndroid Build Coastguard Worker                                        1,
208*61046927SAndroid Build Coastguard Worker                                        NINE_BIND_BACKBUFFER_FLAGS, false, false);
209*61046927SAndroid Build Coastguard Worker     bfmt = d3d9_to_pipe_format_checked(screen, BackBufferFormat, PIPE_TEXTURE_2D,
210*61046927SAndroid Build Coastguard Worker                                        1,
211*61046927SAndroid Build Coastguard Worker                                        NINE_BIND_BACKBUFFER_FLAGS, false, false);
212*61046927SAndroid Build Coastguard Worker     if (dfmt == PIPE_FORMAT_NONE || bfmt == PIPE_FORMAT_NONE) {
213*61046927SAndroid Build Coastguard Worker         DBG("Unsupported Adapter/BackBufferFormat.\n");
214*61046927SAndroid Build Coastguard Worker         return D3DERR_NOTAVAILABLE;
215*61046927SAndroid Build Coastguard Worker     }
216*61046927SAndroid Build Coastguard Worker 
217*61046927SAndroid Build Coastguard Worker     return D3D_OK;
218*61046927SAndroid Build Coastguard Worker }
219*61046927SAndroid Build Coastguard Worker 
220*61046927SAndroid Build Coastguard Worker static inline bool
display_format(D3DFORMAT fmt,bool win)221*61046927SAndroid Build Coastguard Worker display_format( D3DFORMAT fmt,
222*61046927SAndroid Build Coastguard Worker                 bool win )
223*61046927SAndroid Build Coastguard Worker {
224*61046927SAndroid Build Coastguard Worker     /* http://msdn.microsoft.com/en-us/library/bb172558(v=VS.85).aspx#BackBuffer_or_Display_Formats */
225*61046927SAndroid Build Coastguard Worker     static const D3DFORMAT allowed[] = {
226*61046927SAndroid Build Coastguard Worker         D3DFMT_A2R10G10B10,
227*61046927SAndroid Build Coastguard Worker         D3DFMT_X8R8G8B8,
228*61046927SAndroid Build Coastguard Worker         D3DFMT_X1R5G5B5,
229*61046927SAndroid Build Coastguard Worker         D3DFMT_R5G6B5,
230*61046927SAndroid Build Coastguard Worker     };
231*61046927SAndroid Build Coastguard Worker     unsigned i;
232*61046927SAndroid Build Coastguard Worker 
233*61046927SAndroid Build Coastguard Worker     if (fmt == D3DFMT_A2R10G10B10 && win) { return false; }
234*61046927SAndroid Build Coastguard Worker 
235*61046927SAndroid Build Coastguard Worker     for (i = 0; i < sizeof(allowed)/sizeof(D3DFORMAT); i++) {
236*61046927SAndroid Build Coastguard Worker         if (fmt == allowed[i]) { return true; }
237*61046927SAndroid Build Coastguard Worker     }
238*61046927SAndroid Build Coastguard Worker     return false;
239*61046927SAndroid Build Coastguard Worker }
240*61046927SAndroid Build Coastguard Worker 
241*61046927SAndroid Build Coastguard Worker static inline bool
adapter_format(D3DFORMAT fmt)242*61046927SAndroid Build Coastguard Worker adapter_format( D3DFORMAT fmt )
243*61046927SAndroid Build Coastguard Worker {
244*61046927SAndroid Build Coastguard Worker     /* Formats that are compatible to display_format (modulo alpha bits) */
245*61046927SAndroid Build Coastguard Worker     static const D3DFORMAT allowed[] = {
246*61046927SAndroid Build Coastguard Worker         D3DFMT_A2R10G10B10,
247*61046927SAndroid Build Coastguard Worker         D3DFMT_X8R8G8B8,
248*61046927SAndroid Build Coastguard Worker         D3DFMT_A8R8G8B8,
249*61046927SAndroid Build Coastguard Worker         D3DFMT_X1R5G5B5,
250*61046927SAndroid Build Coastguard Worker         D3DFMT_A1R5G5B5,
251*61046927SAndroid Build Coastguard Worker         D3DFMT_R5G6B5,
252*61046927SAndroid Build Coastguard Worker     };
253*61046927SAndroid Build Coastguard Worker     unsigned i;
254*61046927SAndroid Build Coastguard Worker 
255*61046927SAndroid Build Coastguard Worker     for (i = 0; i < sizeof(allowed)/sizeof(D3DFORMAT); i++) {
256*61046927SAndroid Build Coastguard Worker         if (fmt == allowed[i]) { return true; }
257*61046927SAndroid Build Coastguard Worker     }
258*61046927SAndroid Build Coastguard Worker     return false;
259*61046927SAndroid Build Coastguard Worker }
260*61046927SAndroid Build Coastguard Worker 
261*61046927SAndroid Build Coastguard Worker HRESULT NINE_WINAPI
NineAdapter9_CheckDeviceFormat(struct NineAdapter9 * This,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,DWORD Usage,D3DRESOURCETYPE RType,D3DFORMAT CheckFormat)262*61046927SAndroid Build Coastguard Worker NineAdapter9_CheckDeviceFormat( struct NineAdapter9 *This,
263*61046927SAndroid Build Coastguard Worker                                 D3DDEVTYPE DeviceType,
264*61046927SAndroid Build Coastguard Worker                                 D3DFORMAT AdapterFormat,
265*61046927SAndroid Build Coastguard Worker                                 DWORD Usage,
266*61046927SAndroid Build Coastguard Worker                                 D3DRESOURCETYPE RType,
267*61046927SAndroid Build Coastguard Worker                                 D3DFORMAT CheckFormat )
268*61046927SAndroid Build Coastguard Worker {
269*61046927SAndroid Build Coastguard Worker     struct pipe_screen *screen;
270*61046927SAndroid Build Coastguard Worker     HRESULT hr;
271*61046927SAndroid Build Coastguard Worker     enum pipe_format pf;
272*61046927SAndroid Build Coastguard Worker     enum pipe_texture_target target;
273*61046927SAndroid Build Coastguard Worker     unsigned bind = 0;
274*61046927SAndroid Build Coastguard Worker     bool srgb;
275*61046927SAndroid Build Coastguard Worker 
276*61046927SAndroid Build Coastguard Worker     /* Check adapter format. */
277*61046927SAndroid Build Coastguard Worker 
278*61046927SAndroid Build Coastguard Worker     DBG("This=%p DeviceType=%s AdapterFormat=%s\n", This,
279*61046927SAndroid Build Coastguard Worker         nine_D3DDEVTYPE_to_str(DeviceType), d3dformat_to_string(AdapterFormat));
280*61046927SAndroid Build Coastguard Worker     DBG("Usage=%x RType=%u CheckFormat=%s\n", Usage, RType,
281*61046927SAndroid Build Coastguard Worker         d3dformat_to_string(CheckFormat));
282*61046927SAndroid Build Coastguard Worker 
283*61046927SAndroid Build Coastguard Worker     /* Wine tests, but suspicious. Needs more tests. */
284*61046927SAndroid Build Coastguard Worker     user_assert(adapter_format(AdapterFormat), D3DERR_INVALIDCALL);
285*61046927SAndroid Build Coastguard Worker     user_assert(display_format(AdapterFormat, false), D3DERR_NOTAVAILABLE);
286*61046927SAndroid Build Coastguard Worker 
287*61046927SAndroid Build Coastguard Worker     hr = NineAdapter9_GetScreen(This, DeviceType, &screen);
288*61046927SAndroid Build Coastguard Worker     if (FAILED(hr))
289*61046927SAndroid Build Coastguard Worker         return hr;
290*61046927SAndroid Build Coastguard Worker     pf = d3d9_to_pipe_format_checked(screen, AdapterFormat, PIPE_TEXTURE_2D, 0,
291*61046927SAndroid Build Coastguard Worker                                      PIPE_BIND_DISPLAY_TARGET |
292*61046927SAndroid Build Coastguard Worker                                      PIPE_BIND_SHARED, false, false);
293*61046927SAndroid Build Coastguard Worker     if (pf == PIPE_FORMAT_NONE) {
294*61046927SAndroid Build Coastguard Worker         DBG("AdapterFormat %s not available.\n",
295*61046927SAndroid Build Coastguard Worker             d3dformat_to_string(AdapterFormat));
296*61046927SAndroid Build Coastguard Worker         return D3DERR_NOTAVAILABLE;
297*61046927SAndroid Build Coastguard Worker     }
298*61046927SAndroid Build Coastguard Worker 
299*61046927SAndroid Build Coastguard Worker     /* Check actual format. */
300*61046927SAndroid Build Coastguard Worker 
301*61046927SAndroid Build Coastguard Worker     switch (RType) {
302*61046927SAndroid Build Coastguard Worker     case D3DRTYPE_SURFACE:       target = PIPE_TEXTURE_2D; break;
303*61046927SAndroid Build Coastguard Worker     case D3DRTYPE_TEXTURE:       target = PIPE_TEXTURE_2D; break;
304*61046927SAndroid Build Coastguard Worker     case D3DRTYPE_CUBETEXTURE:   target = PIPE_TEXTURE_CUBE; break;
305*61046927SAndroid Build Coastguard Worker     case D3DRTYPE_VOLUME:        target = PIPE_TEXTURE_3D; break;
306*61046927SAndroid Build Coastguard Worker     case D3DRTYPE_VOLUMETEXTURE: target = PIPE_TEXTURE_3D; break;
307*61046927SAndroid Build Coastguard Worker     case D3DRTYPE_VERTEXBUFFER:  target = PIPE_BUFFER; break;
308*61046927SAndroid Build Coastguard Worker     case D3DRTYPE_INDEXBUFFER:   target = PIPE_BUFFER; break;
309*61046927SAndroid Build Coastguard Worker     default:
310*61046927SAndroid Build Coastguard Worker         user_assert(0, D3DERR_INVALIDCALL);
311*61046927SAndroid Build Coastguard Worker     }
312*61046927SAndroid Build Coastguard Worker 
313*61046927SAndroid Build Coastguard Worker     bind = 0;
314*61046927SAndroid Build Coastguard Worker     if (Usage & D3DUSAGE_RENDERTARGET) {
315*61046927SAndroid Build Coastguard Worker         if (depth_stencil_format(CheckFormat))
316*61046927SAndroid Build Coastguard Worker             return D3DERR_NOTAVAILABLE;
317*61046927SAndroid Build Coastguard Worker         bind |= PIPE_BIND_RENDER_TARGET;
318*61046927SAndroid Build Coastguard Worker     }
319*61046927SAndroid Build Coastguard Worker     if (Usage & D3DUSAGE_DEPTHSTENCIL) {
320*61046927SAndroid Build Coastguard Worker         if (!depth_stencil_format(CheckFormat))
321*61046927SAndroid Build Coastguard Worker             return D3DERR_NOTAVAILABLE;
322*61046927SAndroid Build Coastguard Worker         bind |= d3d9_get_pipe_depth_format_bindings(CheckFormat);
323*61046927SAndroid Build Coastguard Worker     }
324*61046927SAndroid Build Coastguard Worker 
325*61046927SAndroid Build Coastguard Worker     if ((Usage & D3DUSAGE_QUERY_VERTEXTEXTURE) &&
326*61046927SAndroid Build Coastguard Worker         !screen->get_shader_param(screen, PIPE_SHADER_VERTEX, PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS))
327*61046927SAndroid Build Coastguard Worker         return D3DERR_NOTAVAILABLE;
328*61046927SAndroid Build Coastguard Worker 
329*61046927SAndroid Build Coastguard Worker     /* API hack because setting RT[0] to NULL is forbidden */
330*61046927SAndroid Build Coastguard Worker     if (CheckFormat == D3DFMT_NULL && bind == PIPE_BIND_RENDER_TARGET &&
331*61046927SAndroid Build Coastguard Worker         (RType == D3DRTYPE_SURFACE ||
332*61046927SAndroid Build Coastguard Worker          RType == D3DRTYPE_TEXTURE))
333*61046927SAndroid Build Coastguard Worker         return D3D_OK;
334*61046927SAndroid Build Coastguard Worker 
335*61046927SAndroid Build Coastguard Worker     /* RESZ hack */
336*61046927SAndroid Build Coastguard Worker     if (CheckFormat == D3DFMT_RESZ && bind == PIPE_BIND_RENDER_TARGET &&
337*61046927SAndroid Build Coastguard Worker         RType == D3DRTYPE_SURFACE)
338*61046927SAndroid Build Coastguard Worker         return screen->get_param(screen, PIPE_CAP_MULTISAMPLE_Z_RESOLVE) ?
339*61046927SAndroid Build Coastguard Worker                D3D_OK : D3DERR_NOTAVAILABLE;
340*61046927SAndroid Build Coastguard Worker 
341*61046927SAndroid Build Coastguard Worker     /* ATOC hack */
342*61046927SAndroid Build Coastguard Worker     if (CheckFormat == D3DFMT_ATOC && RType == D3DRTYPE_SURFACE)
343*61046927SAndroid Build Coastguard Worker         return D3D_OK;
344*61046927SAndroid Build Coastguard Worker 
345*61046927SAndroid Build Coastguard Worker     if ((Usage & D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING) &&
346*61046927SAndroid Build Coastguard Worker         (Usage & D3DUSAGE_RENDERTARGET))
347*61046927SAndroid Build Coastguard Worker         bind |= PIPE_BIND_BLENDABLE;
348*61046927SAndroid Build Coastguard Worker 
349*61046927SAndroid Build Coastguard Worker     if (Usage & D3DUSAGE_DMAP) {
350*61046927SAndroid Build Coastguard Worker         DBG("D3DUSAGE_DMAP not available\n");
351*61046927SAndroid Build Coastguard Worker         return D3DERR_NOTAVAILABLE; /* TODO: displacement mapping */
352*61046927SAndroid Build Coastguard Worker     }
353*61046927SAndroid Build Coastguard Worker 
354*61046927SAndroid Build Coastguard Worker     switch (RType) {
355*61046927SAndroid Build Coastguard Worker     case D3DRTYPE_TEXTURE:       bind |= PIPE_BIND_SAMPLER_VIEW; break;
356*61046927SAndroid Build Coastguard Worker     case D3DRTYPE_CUBETEXTURE:   bind |= PIPE_BIND_SAMPLER_VIEW; break;
357*61046927SAndroid Build Coastguard Worker     case D3DRTYPE_VOLUMETEXTURE: bind |= PIPE_BIND_SAMPLER_VIEW; break;
358*61046927SAndroid Build Coastguard Worker     case D3DRTYPE_VERTEXBUFFER:  bind |= PIPE_BIND_VERTEX_BUFFER; break;
359*61046927SAndroid Build Coastguard Worker     case D3DRTYPE_INDEXBUFFER:   bind |= PIPE_BIND_INDEX_BUFFER; break;
360*61046927SAndroid Build Coastguard Worker     case D3DRTYPE_SURFACE:
361*61046927SAndroid Build Coastguard Worker         if (!(Usage & D3DUSAGE_DEPTHSTENCIL))
362*61046927SAndroid Build Coastguard Worker             bind |= PIPE_BIND_SAMPLER_VIEW; /* StretchRect */
363*61046927SAndroid Build Coastguard Worker         /* Offscreen surface support: Usage = 0.
364*61046927SAndroid Build Coastguard Worker          * In practice drivers are very restrictive on the formats supported.
365*61046927SAndroid Build Coastguard Worker          * Basically a few common formats + YUV and compressed formats. The
366*61046927SAndroid Build Coastguard Worker          * reason is that offscreen surface are useful only for directdraw
367*61046927SAndroid Build Coastguard Worker          * compatibility (a WONTIMPL of nine) + format conversion (useful in
368*61046927SAndroid Build Coastguard Worker          * particular for YUV because the format was not advertised for textures
369*61046927SAndroid Build Coastguard Worker          * on NV chips). */
370*61046927SAndroid Build Coastguard Worker         if (Usage == 0)
371*61046927SAndroid Build Coastguard Worker             bind |= PIPE_BIND_RENDER_TARGET; /* A current requirement of our impl, which we should get rid of. */
372*61046927SAndroid Build Coastguard Worker         break;
373*61046927SAndroid Build Coastguard Worker     default:
374*61046927SAndroid Build Coastguard Worker         break;
375*61046927SAndroid Build Coastguard Worker     }
376*61046927SAndroid Build Coastguard Worker 
377*61046927SAndroid Build Coastguard Worker 
378*61046927SAndroid Build Coastguard Worker     srgb = (Usage & (D3DUSAGE_QUERY_SRGBREAD | D3DUSAGE_QUERY_SRGBWRITE)) != 0;
379*61046927SAndroid Build Coastguard Worker     pf = d3d9_to_pipe_format_checked(screen, CheckFormat, target,
380*61046927SAndroid Build Coastguard Worker                                      0, bind, srgb, false);
381*61046927SAndroid Build Coastguard Worker     if (pf == PIPE_FORMAT_NONE) {
382*61046927SAndroid Build Coastguard Worker         DBG("NOT AVAILABLE\n");
383*61046927SAndroid Build Coastguard Worker         return D3DERR_NOTAVAILABLE;
384*61046927SAndroid Build Coastguard Worker     }
385*61046927SAndroid Build Coastguard Worker 
386*61046927SAndroid Build Coastguard Worker     /* we support ATI1 and ATI2 hack only for 2D and Cube textures */
387*61046927SAndroid Build Coastguard Worker     if (RType != D3DRTYPE_TEXTURE && RType != D3DRTYPE_CUBETEXTURE &&
388*61046927SAndroid Build Coastguard Worker         (CheckFormat == D3DFMT_ATI1 || CheckFormat == D3DFMT_ATI2))
389*61046927SAndroid Build Coastguard Worker         return D3DERR_NOTAVAILABLE;
390*61046927SAndroid Build Coastguard Worker     /* if (Usage & D3DUSAGE_NONSECURE) { don't know the implications of this } */
391*61046927SAndroid Build Coastguard Worker     /* if (Usage & D3DUSAGE_SOFTWAREPROCESSING) { we can always support this } */
392*61046927SAndroid Build Coastguard Worker 
393*61046927SAndroid Build Coastguard Worker     if ((Usage & D3DUSAGE_AUTOGENMIPMAP) && !(bind & PIPE_BIND_SAMPLER_VIEW))
394*61046927SAndroid Build Coastguard Worker         return D3DOK_NOAUTOGEN;
395*61046927SAndroid Build Coastguard Worker     return D3D_OK;
396*61046927SAndroid Build Coastguard Worker }
397*61046927SAndroid Build Coastguard Worker 
398*61046927SAndroid Build Coastguard Worker HRESULT NINE_WINAPI
NineAdapter9_CheckDeviceMultiSampleType(struct NineAdapter9 * This,D3DDEVTYPE DeviceType,D3DFORMAT SurfaceFormat,BOOL Windowed,D3DMULTISAMPLE_TYPE MultiSampleType,DWORD * pQualityLevels)399*61046927SAndroid Build Coastguard Worker NineAdapter9_CheckDeviceMultiSampleType( struct NineAdapter9 *This,
400*61046927SAndroid Build Coastguard Worker                                          D3DDEVTYPE DeviceType,
401*61046927SAndroid Build Coastguard Worker                                          D3DFORMAT SurfaceFormat,
402*61046927SAndroid Build Coastguard Worker                                          BOOL Windowed,
403*61046927SAndroid Build Coastguard Worker                                          D3DMULTISAMPLE_TYPE MultiSampleType,
404*61046927SAndroid Build Coastguard Worker                                          DWORD *pQualityLevels )
405*61046927SAndroid Build Coastguard Worker {
406*61046927SAndroid Build Coastguard Worker     struct pipe_screen *screen;
407*61046927SAndroid Build Coastguard Worker     HRESULT hr;
408*61046927SAndroid Build Coastguard Worker     enum pipe_format pf;
409*61046927SAndroid Build Coastguard Worker     unsigned bind;
410*61046927SAndroid Build Coastguard Worker 
411*61046927SAndroid Build Coastguard Worker     DBG("This=%p DeviceType=%s SurfaceFormat=%s Windowed=%i MultiSampleType=%u "
412*61046927SAndroid Build Coastguard Worker         "pQualityLevels=%p\n", This, nine_D3DDEVTYPE_to_str(DeviceType),
413*61046927SAndroid Build Coastguard Worker         d3dformat_to_string(SurfaceFormat), Windowed, MultiSampleType,
414*61046927SAndroid Build Coastguard Worker         pQualityLevels);
415*61046927SAndroid Build Coastguard Worker 
416*61046927SAndroid Build Coastguard Worker     if (pQualityLevels) {
417*61046927SAndroid Build Coastguard Worker         /* In error cases return only 1 quality level supported */
418*61046927SAndroid Build Coastguard Worker         *pQualityLevels = 1;
419*61046927SAndroid Build Coastguard Worker     }
420*61046927SAndroid Build Coastguard Worker     user_assert(MultiSampleType <= D3DMULTISAMPLE_16_SAMPLES, D3DERR_INVALIDCALL);
421*61046927SAndroid Build Coastguard Worker 
422*61046927SAndroid Build Coastguard Worker     hr = NineAdapter9_GetScreen(This, DeviceType, &screen);
423*61046927SAndroid Build Coastguard Worker     if (FAILED(hr))
424*61046927SAndroid Build Coastguard Worker         return hr;
425*61046927SAndroid Build Coastguard Worker 
426*61046927SAndroid Build Coastguard Worker     if (depth_stencil_format(SurfaceFormat))
427*61046927SAndroid Build Coastguard Worker         bind = d3d9_get_pipe_depth_format_bindings(SurfaceFormat);
428*61046927SAndroid Build Coastguard Worker     else /* render-target */
429*61046927SAndroid Build Coastguard Worker         bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
430*61046927SAndroid Build Coastguard Worker 
431*61046927SAndroid Build Coastguard Worker     pf = d3d9_to_pipe_format_checked(screen, SurfaceFormat, PIPE_TEXTURE_2D,
432*61046927SAndroid Build Coastguard Worker                                      0, PIPE_BIND_SAMPLER_VIEW, false, false);
433*61046927SAndroid Build Coastguard Worker 
434*61046927SAndroid Build Coastguard Worker     if (pf == PIPE_FORMAT_NONE && SurfaceFormat != D3DFMT_NULL) {
435*61046927SAndroid Build Coastguard Worker         DBG("%s not available.\n", d3dformat_to_string(SurfaceFormat));
436*61046927SAndroid Build Coastguard Worker         return D3DERR_INVALIDCALL;
437*61046927SAndroid Build Coastguard Worker     }
438*61046927SAndroid Build Coastguard Worker 
439*61046927SAndroid Build Coastguard Worker     pf = d3d9_to_pipe_format_checked(screen, SurfaceFormat, PIPE_TEXTURE_2D,
440*61046927SAndroid Build Coastguard Worker                                      MultiSampleType, bind, false, false);
441*61046927SAndroid Build Coastguard Worker 
442*61046927SAndroid Build Coastguard Worker     if (pf == PIPE_FORMAT_NONE && SurfaceFormat != D3DFMT_NULL) {
443*61046927SAndroid Build Coastguard Worker         DBG("%s with %u samples not available.\n",
444*61046927SAndroid Build Coastguard Worker             d3dformat_to_string(SurfaceFormat), MultiSampleType);
445*61046927SAndroid Build Coastguard Worker         return D3DERR_NOTAVAILABLE;
446*61046927SAndroid Build Coastguard Worker     }
447*61046927SAndroid Build Coastguard Worker 
448*61046927SAndroid Build Coastguard Worker     if (pQualityLevels) {
449*61046927SAndroid Build Coastguard Worker         /* NONMASKABLE MultiSampleType might have more than one quality level,
450*61046927SAndroid Build Coastguard Worker          * while MASKABLE MultiSampleTypes have only one level.
451*61046927SAndroid Build Coastguard Worker          * Advertise quality levels and map each level to a sample count. */
452*61046927SAndroid Build Coastguard Worker          (void ) d3dmultisample_type_check(screen, SurfaceFormat,
453*61046927SAndroid Build Coastguard Worker                  &MultiSampleType, D3DMULTISAMPLE_16_SAMPLES, pQualityLevels);
454*61046927SAndroid Build Coastguard Worker          DBG("advertising %u quality levels\n", *pQualityLevels);
455*61046927SAndroid Build Coastguard Worker     }
456*61046927SAndroid Build Coastguard Worker 
457*61046927SAndroid Build Coastguard Worker     return D3D_OK;
458*61046927SAndroid Build Coastguard Worker }
459*61046927SAndroid Build Coastguard Worker 
460*61046927SAndroid Build Coastguard Worker HRESULT NINE_WINAPI
NineAdapter9_CheckDepthStencilMatch(struct NineAdapter9 * This,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,D3DFORMAT RenderTargetFormat,D3DFORMAT DepthStencilFormat)461*61046927SAndroid Build Coastguard Worker NineAdapter9_CheckDepthStencilMatch( struct NineAdapter9 *This,
462*61046927SAndroid Build Coastguard Worker                                      D3DDEVTYPE DeviceType,
463*61046927SAndroid Build Coastguard Worker                                      D3DFORMAT AdapterFormat,
464*61046927SAndroid Build Coastguard Worker                                      D3DFORMAT RenderTargetFormat,
465*61046927SAndroid Build Coastguard Worker                                      D3DFORMAT DepthStencilFormat )
466*61046927SAndroid Build Coastguard Worker {
467*61046927SAndroid Build Coastguard Worker     struct pipe_screen *screen;
468*61046927SAndroid Build Coastguard Worker     enum pipe_format dfmt, bfmt, zsfmt;
469*61046927SAndroid Build Coastguard Worker     HRESULT hr;
470*61046927SAndroid Build Coastguard Worker 
471*61046927SAndroid Build Coastguard Worker     DBG("This=%p DeviceType=%s AdapterFormat=%s "
472*61046927SAndroid Build Coastguard Worker         "RenderTargetFormat=%s DepthStencilFormat=%s\n", This,
473*61046927SAndroid Build Coastguard Worker         nine_D3DDEVTYPE_to_str(DeviceType), d3dformat_to_string(AdapterFormat),
474*61046927SAndroid Build Coastguard Worker         d3dformat_to_string(RenderTargetFormat),
475*61046927SAndroid Build Coastguard Worker         d3dformat_to_string(DepthStencilFormat));
476*61046927SAndroid Build Coastguard Worker 
477*61046927SAndroid Build Coastguard Worker     /* TODO: does it check AdapterFormat at all ?
478*61046927SAndroid Build Coastguard Worker      * It seems to need to pass at least for A8R8G8B8:
479*61046927SAndroid Build Coastguard Worker      * https://github.com/iXit/Mesa-3D/issues/317 */
480*61046927SAndroid Build Coastguard Worker     user_assert(adapter_format(AdapterFormat), D3DERR_NOTAVAILABLE);
481*61046927SAndroid Build Coastguard Worker     user_assert(depth_stencil_format(DepthStencilFormat), D3DERR_NOTAVAILABLE);
482*61046927SAndroid Build Coastguard Worker 
483*61046927SAndroid Build Coastguard Worker     hr = NineAdapter9_GetScreen(This, DeviceType, &screen);
484*61046927SAndroid Build Coastguard Worker     if (FAILED(hr)) { return hr; }
485*61046927SAndroid Build Coastguard Worker 
486*61046927SAndroid Build Coastguard Worker     dfmt = d3d9_to_pipe_format_checked(screen, AdapterFormat, PIPE_TEXTURE_2D, 0,
487*61046927SAndroid Build Coastguard Worker                                        NINE_BIND_BACKBUFFER_FLAGS, false, false);
488*61046927SAndroid Build Coastguard Worker     bfmt = d3d9_to_pipe_format_checked(screen, RenderTargetFormat,
489*61046927SAndroid Build Coastguard Worker                                        PIPE_TEXTURE_2D, 0,
490*61046927SAndroid Build Coastguard Worker                                        NINE_BIND_BACKBUFFER_FLAGS, false, false);
491*61046927SAndroid Build Coastguard Worker     if (RenderTargetFormat == D3DFMT_NULL)
492*61046927SAndroid Build Coastguard Worker         bfmt = dfmt;
493*61046927SAndroid Build Coastguard Worker     zsfmt = d3d9_to_pipe_format_checked(screen, DepthStencilFormat,
494*61046927SAndroid Build Coastguard Worker                                         PIPE_TEXTURE_2D, 0,
495*61046927SAndroid Build Coastguard Worker                                         d3d9_get_pipe_depth_format_bindings(DepthStencilFormat),
496*61046927SAndroid Build Coastguard Worker                                         false, false);
497*61046927SAndroid Build Coastguard Worker     if (dfmt == PIPE_FORMAT_NONE ||
498*61046927SAndroid Build Coastguard Worker         bfmt == PIPE_FORMAT_NONE ||
499*61046927SAndroid Build Coastguard Worker         zsfmt == PIPE_FORMAT_NONE) {
500*61046927SAndroid Build Coastguard Worker         return D3DERR_NOTAVAILABLE;
501*61046927SAndroid Build Coastguard Worker     }
502*61046927SAndroid Build Coastguard Worker 
503*61046927SAndroid Build Coastguard Worker     return D3D_OK;
504*61046927SAndroid Build Coastguard Worker }
505*61046927SAndroid Build Coastguard Worker 
506*61046927SAndroid Build Coastguard Worker HRESULT NINE_WINAPI
NineAdapter9_CheckDeviceFormatConversion(struct NineAdapter9 * This,D3DDEVTYPE DeviceType,D3DFORMAT SourceFormat,D3DFORMAT TargetFormat)507*61046927SAndroid Build Coastguard Worker NineAdapter9_CheckDeviceFormatConversion( struct NineAdapter9 *This,
508*61046927SAndroid Build Coastguard Worker                                           D3DDEVTYPE DeviceType,
509*61046927SAndroid Build Coastguard Worker                                           D3DFORMAT SourceFormat,
510*61046927SAndroid Build Coastguard Worker                                           D3DFORMAT TargetFormat )
511*61046927SAndroid Build Coastguard Worker {
512*61046927SAndroid Build Coastguard Worker     /* MSDN says this tests whether a certain backbuffer format can be used in
513*61046927SAndroid Build Coastguard Worker      * conjunction with a certain front buffer format. It's a little confusing
514*61046927SAndroid Build Coastguard Worker      * but some one wiser might be able to figure this one out. XXX */
515*61046927SAndroid Build Coastguard Worker     struct pipe_screen *screen;
516*61046927SAndroid Build Coastguard Worker     enum pipe_format dfmt, bfmt;
517*61046927SAndroid Build Coastguard Worker     HRESULT hr;
518*61046927SAndroid Build Coastguard Worker 
519*61046927SAndroid Build Coastguard Worker     DBG("This=%p DeviceType=%s SourceFormat=%s TargetFormat=%s\n", This,
520*61046927SAndroid Build Coastguard Worker         nine_D3DDEVTYPE_to_str(DeviceType),
521*61046927SAndroid Build Coastguard Worker         d3dformat_to_string(SourceFormat), d3dformat_to_string(TargetFormat));
522*61046927SAndroid Build Coastguard Worker 
523*61046927SAndroid Build Coastguard Worker     user_assert(backbuffer_format(TargetFormat, SourceFormat, false),
524*61046927SAndroid Build Coastguard Worker                 D3DERR_NOTAVAILABLE);
525*61046927SAndroid Build Coastguard Worker 
526*61046927SAndroid Build Coastguard Worker     hr = NineAdapter9_GetScreen(This, DeviceType, &screen);
527*61046927SAndroid Build Coastguard Worker     if (FAILED(hr)) { return hr; }
528*61046927SAndroid Build Coastguard Worker 
529*61046927SAndroid Build Coastguard Worker     dfmt = d3d9_to_pipe_format_checked(screen, TargetFormat, PIPE_TEXTURE_2D, 1,
530*61046927SAndroid Build Coastguard Worker                                        NINE_BIND_BACKBUFFER_FLAGS, false, false);
531*61046927SAndroid Build Coastguard Worker     bfmt = d3d9_to_pipe_format_checked(screen, SourceFormat, PIPE_TEXTURE_2D, 1,
532*61046927SAndroid Build Coastguard Worker                                        NINE_BIND_BACKBUFFER_FLAGS, false, false);
533*61046927SAndroid Build Coastguard Worker 
534*61046927SAndroid Build Coastguard Worker     if (dfmt == PIPE_FORMAT_NONE || bfmt == PIPE_FORMAT_NONE) {
535*61046927SAndroid Build Coastguard Worker         DBG("%s to %s not supported.\n",
536*61046927SAndroid Build Coastguard Worker             d3dformat_to_string(SourceFormat),
537*61046927SAndroid Build Coastguard Worker             d3dformat_to_string(TargetFormat));
538*61046927SAndroid Build Coastguard Worker         return D3DERR_NOTAVAILABLE;
539*61046927SAndroid Build Coastguard Worker     }
540*61046927SAndroid Build Coastguard Worker 
541*61046927SAndroid Build Coastguard Worker     return D3D_OK;
542*61046927SAndroid Build Coastguard Worker }
543*61046927SAndroid Build Coastguard Worker 
544*61046927SAndroid Build Coastguard Worker HRESULT NINE_WINAPI
NineAdapter9_GetDeviceCaps(struct NineAdapter9 * This,D3DDEVTYPE DeviceType,D3DCAPS9 * pCaps)545*61046927SAndroid Build Coastguard Worker NineAdapter9_GetDeviceCaps( struct NineAdapter9 *This,
546*61046927SAndroid Build Coastguard Worker                             D3DDEVTYPE DeviceType,
547*61046927SAndroid Build Coastguard Worker                             D3DCAPS9 *pCaps )
548*61046927SAndroid Build Coastguard Worker {
549*61046927SAndroid Build Coastguard Worker     struct pipe_screen *screen;
550*61046927SAndroid Build Coastguard Worker     HRESULT hr;
551*61046927SAndroid Build Coastguard Worker 
552*61046927SAndroid Build Coastguard Worker     DBG("This=%p DeviceType=%s pCaps=%p\n", This,
553*61046927SAndroid Build Coastguard Worker         nine_D3DDEVTYPE_to_str(DeviceType), pCaps);
554*61046927SAndroid Build Coastguard Worker 
555*61046927SAndroid Build Coastguard Worker     user_assert(pCaps, D3DERR_INVALIDCALL);
556*61046927SAndroid Build Coastguard Worker 
557*61046927SAndroid Build Coastguard Worker     hr = NineAdapter9_GetScreen(This, DeviceType, &screen);
558*61046927SAndroid Build Coastguard Worker     if (FAILED(hr)) {
559*61046927SAndroid Build Coastguard Worker        DBG("Failed to get pipe_screen.\n");
560*61046927SAndroid Build Coastguard Worker        return hr;
561*61046927SAndroid Build Coastguard Worker     }
562*61046927SAndroid Build Coastguard Worker 
563*61046927SAndroid Build Coastguard Worker #define D3DPIPECAP(pcap, d3dcap) \
564*61046927SAndroid Build Coastguard Worker     (screen->get_param(screen, PIPE_CAP_##pcap) ? (d3dcap) : 0)
565*61046927SAndroid Build Coastguard Worker 
566*61046927SAndroid Build Coastguard Worker #define D3DNPIPECAP(pcap, d3dcap) \
567*61046927SAndroid Build Coastguard Worker     (screen->get_param(screen, PIPE_CAP_##pcap) ? 0 : (d3dcap))
568*61046927SAndroid Build Coastguard Worker 
569*61046927SAndroid Build Coastguard Worker     pCaps->DeviceType = DeviceType;
570*61046927SAndroid Build Coastguard Worker 
571*61046927SAndroid Build Coastguard Worker     pCaps->AdapterOrdinal = 0;
572*61046927SAndroid Build Coastguard Worker 
573*61046927SAndroid Build Coastguard Worker     pCaps->Caps = D3DCAPS_READ_SCANLINE;
574*61046927SAndroid Build Coastguard Worker 
575*61046927SAndroid Build Coastguard Worker     pCaps->Caps2 = /* D3DCAPS2_CANMANAGERESOURCE | */
576*61046927SAndroid Build Coastguard Worker                 /* D3DCAPS2_CANSHARERESOURCE | */
577*61046927SAndroid Build Coastguard Worker                 /* D3DCAPS2_CANCALIBRATEGAMMA | */
578*61046927SAndroid Build Coastguard Worker                    D3DCAPS2_DYNAMICTEXTURES |
579*61046927SAndroid Build Coastguard Worker                    D3DCAPS2_FULLSCREENGAMMA |
580*61046927SAndroid Build Coastguard Worker                    D3DCAPS2_CANAUTOGENMIPMAP;
581*61046927SAndroid Build Coastguard Worker 
582*61046927SAndroid Build Coastguard Worker     /* Note: D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD just means the
583*61046927SAndroid Build Coastguard Worker      * backbuffer can be ARGB (instead of only XRGB) when we are fullscreen
584*61046927SAndroid Build Coastguard Worker      * and in discard mode. */
585*61046927SAndroid Build Coastguard Worker     pCaps->Caps3 = D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD |
586*61046927SAndroid Build Coastguard Worker                    D3DCAPS3_COPY_TO_VIDMEM |
587*61046927SAndroid Build Coastguard Worker                    D3DCAPS3_COPY_TO_SYSTEMMEM |
588*61046927SAndroid Build Coastguard Worker                    D3DCAPS3_LINEAR_TO_SRGB_PRESENTATION;
589*61046927SAndroid Build Coastguard Worker 
590*61046927SAndroid Build Coastguard Worker     pCaps->PresentationIntervals = D3DPRESENT_INTERVAL_DEFAULT |
591*61046927SAndroid Build Coastguard Worker                                    D3DPRESENT_INTERVAL_ONE |
592*61046927SAndroid Build Coastguard Worker                                    D3DPRESENT_INTERVAL_TWO |
593*61046927SAndroid Build Coastguard Worker                                    D3DPRESENT_INTERVAL_THREE |
594*61046927SAndroid Build Coastguard Worker                                    D3DPRESENT_INTERVAL_FOUR |
595*61046927SAndroid Build Coastguard Worker                                    D3DPRESENT_INTERVAL_IMMEDIATE;
596*61046927SAndroid Build Coastguard Worker     pCaps->CursorCaps = D3DCURSORCAPS_COLOR /* | D3DCURSORCAPS_LOWRES*/;
597*61046927SAndroid Build Coastguard Worker 
598*61046927SAndroid Build Coastguard Worker     pCaps->DevCaps = D3DDEVCAPS_CANBLTSYSTONONLOCAL |
599*61046927SAndroid Build Coastguard Worker                      D3DDEVCAPS_CANRENDERAFTERFLIP |
600*61046927SAndroid Build Coastguard Worker                      D3DDEVCAPS_DRAWPRIMITIVES2 |
601*61046927SAndroid Build Coastguard Worker                      D3DDEVCAPS_DRAWPRIMITIVES2EX |
602*61046927SAndroid Build Coastguard Worker                      D3DDEVCAPS_DRAWPRIMTLVERTEX |
603*61046927SAndroid Build Coastguard Worker                      D3DDEVCAPS_EXECUTESYSTEMMEMORY |
604*61046927SAndroid Build Coastguard Worker                      D3DDEVCAPS_EXECUTEVIDEOMEMORY |
605*61046927SAndroid Build Coastguard Worker                      D3DDEVCAPS_HWRASTERIZATION |
606*61046927SAndroid Build Coastguard Worker                      D3DDEVCAPS_HWTRANSFORMANDLIGHT |
607*61046927SAndroid Build Coastguard Worker                      /*D3DDEVCAPS_NPATCHES |*/
608*61046927SAndroid Build Coastguard Worker                      D3DDEVCAPS_PUREDEVICE |
609*61046927SAndroid Build Coastguard Worker                      /*D3DDEVCAPS_QUINTICRTPATCHES |*/
610*61046927SAndroid Build Coastguard Worker                      /*D3DDEVCAPS_RTPATCHES |*/
611*61046927SAndroid Build Coastguard Worker                      /*D3DDEVCAPS_RTPATCHHANDLEZERO |*/
612*61046927SAndroid Build Coastguard Worker                      /*D3DDEVCAPS_SEPARATETEXTUREMEMORIES |*/
613*61046927SAndroid Build Coastguard Worker                      D3DDEVCAPS_TEXTURENONLOCALVIDMEM |
614*61046927SAndroid Build Coastguard Worker                      /* D3DDEVCAPS_TEXTURESYSTEMMEMORY |*/
615*61046927SAndroid Build Coastguard Worker                      D3DDEVCAPS_TEXTUREVIDEOMEMORY |
616*61046927SAndroid Build Coastguard Worker                      D3DDEVCAPS_TLVERTEXSYSTEMMEMORY |
617*61046927SAndroid Build Coastguard Worker                      D3DDEVCAPS_TLVERTEXVIDEOMEMORY;
618*61046927SAndroid Build Coastguard Worker 
619*61046927SAndroid Build Coastguard Worker     pCaps->PrimitiveMiscCaps = D3DPMISCCAPS_MASKZ |
620*61046927SAndroid Build Coastguard Worker                                D3DPMISCCAPS_CULLNONE | /* XXX */
621*61046927SAndroid Build Coastguard Worker                                D3DPMISCCAPS_CULLCW |
622*61046927SAndroid Build Coastguard Worker                                D3DPMISCCAPS_CULLCCW |
623*61046927SAndroid Build Coastguard Worker                                D3DPMISCCAPS_COLORWRITEENABLE |
624*61046927SAndroid Build Coastguard Worker                                D3DPMISCCAPS_CLIPPLANESCALEDPOINTS |
625*61046927SAndroid Build Coastguard Worker                                /*D3DPMISCCAPS_CLIPTLVERTS |*/
626*61046927SAndroid Build Coastguard Worker                                D3DPMISCCAPS_TSSARGTEMP |
627*61046927SAndroid Build Coastguard Worker                                D3DPMISCCAPS_BLENDOP |
628*61046927SAndroid Build Coastguard Worker                                D3DPIPECAP(INDEP_BLEND_ENABLE, D3DPMISCCAPS_INDEPENDENTWRITEMASKS) |
629*61046927SAndroid Build Coastguard Worker                                D3DPMISCCAPS_PERSTAGECONSTANT |
630*61046927SAndroid Build Coastguard Worker                                /*D3DPMISCCAPS_POSTBLENDSRGBCONVERT |*/ /* TODO: advertise if Ex and dx10 able card */
631*61046927SAndroid Build Coastguard Worker                                D3DPMISCCAPS_FOGANDSPECULARALPHA | /* Note: documentation of the flag is wrong */
632*61046927SAndroid Build Coastguard Worker                                D3DPIPECAP(BLEND_EQUATION_SEPARATE, D3DPMISCCAPS_SEPARATEALPHABLEND) |
633*61046927SAndroid Build Coastguard Worker                                D3DPIPECAP(MIXED_COLORBUFFER_FORMATS, D3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS) |
634*61046927SAndroid Build Coastguard Worker                                D3DPMISCCAPS_MRTPOSTPIXELSHADERBLENDING |
635*61046927SAndroid Build Coastguard Worker                                D3DPMISCCAPS_FOGVERTEXCLAMPED;
636*61046927SAndroid Build Coastguard Worker     if (!screen->get_param(screen, PIPE_CAP_VS_WINDOW_SPACE_POSITION) &&
637*61046927SAndroid Build Coastguard Worker         !screen->get_param(screen, PIPE_CAP_DEPTH_CLIP_DISABLE))
638*61046927SAndroid Build Coastguard Worker         pCaps->PrimitiveMiscCaps |= D3DPMISCCAPS_CLIPTLVERTS;
639*61046927SAndroid Build Coastguard Worker 
640*61046927SAndroid Build Coastguard Worker     pCaps->RasterCaps =
641*61046927SAndroid Build Coastguard Worker         D3DPIPECAP(ANISOTROPIC_FILTER, D3DPRASTERCAPS_ANISOTROPY) |
642*61046927SAndroid Build Coastguard Worker         D3DPRASTERCAPS_COLORPERSPECTIVE |
643*61046927SAndroid Build Coastguard Worker         D3DPRASTERCAPS_DITHER |
644*61046927SAndroid Build Coastguard Worker         D3DPRASTERCAPS_DEPTHBIAS |
645*61046927SAndroid Build Coastguard Worker         D3DPRASTERCAPS_FOGRANGE |
646*61046927SAndroid Build Coastguard Worker         D3DPRASTERCAPS_FOGTABLE |
647*61046927SAndroid Build Coastguard Worker         D3DPRASTERCAPS_FOGVERTEX |
648*61046927SAndroid Build Coastguard Worker         D3DPRASTERCAPS_MIPMAPLODBIAS |
649*61046927SAndroid Build Coastguard Worker         D3DPRASTERCAPS_MULTISAMPLE_TOGGLE |
650*61046927SAndroid Build Coastguard Worker         D3DPRASTERCAPS_SCISSORTEST |
651*61046927SAndroid Build Coastguard Worker         D3DPRASTERCAPS_SLOPESCALEDEPTHBIAS |
652*61046927SAndroid Build Coastguard Worker         /*D3DPRASTERCAPS_WBUFFER |*/
653*61046927SAndroid Build Coastguard Worker         D3DPRASTERCAPS_WFOG |
654*61046927SAndroid Build Coastguard Worker         /*D3DPRASTERCAPS_ZBUFFERLESSHSR |*/
655*61046927SAndroid Build Coastguard Worker         D3DPRASTERCAPS_ZFOG |
656*61046927SAndroid Build Coastguard Worker         D3DPRASTERCAPS_ZTEST;
657*61046927SAndroid Build Coastguard Worker 
658*61046927SAndroid Build Coastguard Worker     pCaps->ZCmpCaps = D3DPCMPCAPS_NEVER |
659*61046927SAndroid Build Coastguard Worker                       D3DPCMPCAPS_LESS |
660*61046927SAndroid Build Coastguard Worker                       D3DPCMPCAPS_EQUAL |
661*61046927SAndroid Build Coastguard Worker                       D3DPCMPCAPS_LESSEQUAL |
662*61046927SAndroid Build Coastguard Worker                       D3DPCMPCAPS_GREATER |
663*61046927SAndroid Build Coastguard Worker                       D3DPCMPCAPS_NOTEQUAL |
664*61046927SAndroid Build Coastguard Worker                       D3DPCMPCAPS_GREATEREQUAL |
665*61046927SAndroid Build Coastguard Worker                       D3DPCMPCAPS_ALWAYS;
666*61046927SAndroid Build Coastguard Worker 
667*61046927SAndroid Build Coastguard Worker     pCaps->SrcBlendCaps = D3DPBLENDCAPS_ZERO |
668*61046927SAndroid Build Coastguard Worker                           D3DPBLENDCAPS_ONE |
669*61046927SAndroid Build Coastguard Worker                           D3DPBLENDCAPS_SRCCOLOR |
670*61046927SAndroid Build Coastguard Worker                           D3DPBLENDCAPS_INVSRCCOLOR |
671*61046927SAndroid Build Coastguard Worker                           D3DPBLENDCAPS_SRCALPHA |
672*61046927SAndroid Build Coastguard Worker                           D3DPBLENDCAPS_INVSRCALPHA |
673*61046927SAndroid Build Coastguard Worker                           D3DPBLENDCAPS_DESTALPHA |
674*61046927SAndroid Build Coastguard Worker                           D3DPBLENDCAPS_INVDESTALPHA |
675*61046927SAndroid Build Coastguard Worker                           D3DPBLENDCAPS_DESTCOLOR |
676*61046927SAndroid Build Coastguard Worker                           D3DPBLENDCAPS_INVDESTCOLOR |
677*61046927SAndroid Build Coastguard Worker                           D3DPBLENDCAPS_SRCALPHASAT |
678*61046927SAndroid Build Coastguard Worker                           D3DPBLENDCAPS_BOTHSRCALPHA |
679*61046927SAndroid Build Coastguard Worker                           D3DPBLENDCAPS_BOTHINVSRCALPHA |
680*61046927SAndroid Build Coastguard Worker                           D3DPBLENDCAPS_BLENDFACTOR |
681*61046927SAndroid Build Coastguard Worker                           D3DPIPECAP(MAX_DUAL_SOURCE_RENDER_TARGETS,
682*61046927SAndroid Build Coastguard Worker                               D3DPBLENDCAPS_INVSRCCOLOR2 |
683*61046927SAndroid Build Coastguard Worker                               D3DPBLENDCAPS_SRCCOLOR2);
684*61046927SAndroid Build Coastguard Worker 
685*61046927SAndroid Build Coastguard Worker     pCaps->DestBlendCaps = pCaps->SrcBlendCaps;
686*61046927SAndroid Build Coastguard Worker 
687*61046927SAndroid Build Coastguard Worker     pCaps->AlphaCmpCaps = D3DPCMPCAPS_NEVER |
688*61046927SAndroid Build Coastguard Worker                           D3DPCMPCAPS_LESS |
689*61046927SAndroid Build Coastguard Worker                           D3DPCMPCAPS_EQUAL |
690*61046927SAndroid Build Coastguard Worker                           D3DPCMPCAPS_LESSEQUAL |
691*61046927SAndroid Build Coastguard Worker                           D3DPCMPCAPS_GREATER |
692*61046927SAndroid Build Coastguard Worker                           D3DPCMPCAPS_NOTEQUAL |
693*61046927SAndroid Build Coastguard Worker                           D3DPCMPCAPS_GREATEREQUAL |
694*61046927SAndroid Build Coastguard Worker                           D3DPCMPCAPS_ALWAYS;
695*61046927SAndroid Build Coastguard Worker 
696*61046927SAndroid Build Coastguard Worker     /* FLAT caps not legal for D3D9. */
697*61046927SAndroid Build Coastguard Worker     pCaps->ShadeCaps = D3DPSHADECAPS_COLORGOURAUDRGB |
698*61046927SAndroid Build Coastguard Worker                        D3DPSHADECAPS_SPECULARGOURAUDRGB |
699*61046927SAndroid Build Coastguard Worker                        D3DPSHADECAPS_ALPHAGOURAUDBLEND |
700*61046927SAndroid Build Coastguard Worker                        D3DPSHADECAPS_FOGGOURAUD;
701*61046927SAndroid Build Coastguard Worker 
702*61046927SAndroid Build Coastguard Worker     pCaps->TextureCaps =
703*61046927SAndroid Build Coastguard Worker         D3DPTEXTURECAPS_ALPHA |
704*61046927SAndroid Build Coastguard Worker         D3DPTEXTURECAPS_ALPHAPALETTE |
705*61046927SAndroid Build Coastguard Worker         D3DPTEXTURECAPS_PERSPECTIVE |
706*61046927SAndroid Build Coastguard Worker         D3DPTEXTURECAPS_PROJECTED |
707*61046927SAndroid Build Coastguard Worker         D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE |
708*61046927SAndroid Build Coastguard Worker         D3DPTEXTURECAPS_CUBEMAP |
709*61046927SAndroid Build Coastguard Worker         D3DPTEXTURECAPS_VOLUMEMAP |
710*61046927SAndroid Build Coastguard Worker         D3DNPIPECAP(NPOT_TEXTURES, D3DPTEXTURECAPS_POW2) |
711*61046927SAndroid Build Coastguard Worker         D3DNPIPECAP(NPOT_TEXTURES, D3DPTEXTURECAPS_NONPOW2CONDITIONAL) |
712*61046927SAndroid Build Coastguard Worker         D3DNPIPECAP(NPOT_TEXTURES, D3DPTEXTURECAPS_CUBEMAP_POW2) |
713*61046927SAndroid Build Coastguard Worker         D3DNPIPECAP(NPOT_TEXTURES, D3DPTEXTURECAPS_VOLUMEMAP_POW2) |
714*61046927SAndroid Build Coastguard Worker         D3DPIPECAP(MAX_TEXTURE_2D_SIZE, D3DPTEXTURECAPS_MIPMAP) |
715*61046927SAndroid Build Coastguard Worker         D3DPIPECAP(MAX_TEXTURE_3D_LEVELS, D3DPTEXTURECAPS_MIPVOLUMEMAP) |
716*61046927SAndroid Build Coastguard Worker         D3DPIPECAP(MAX_TEXTURE_CUBE_LEVELS, D3DPTEXTURECAPS_MIPCUBEMAP);
717*61046927SAndroid Build Coastguard Worker 
718*61046927SAndroid Build Coastguard Worker     pCaps->TextureFilterCaps =
719*61046927SAndroid Build Coastguard Worker         D3DPTFILTERCAPS_MINFPOINT |
720*61046927SAndroid Build Coastguard Worker         D3DPTFILTERCAPS_MINFLINEAR |
721*61046927SAndroid Build Coastguard Worker         D3DPIPECAP(ANISOTROPIC_FILTER, D3DPTFILTERCAPS_MINFANISOTROPIC) |
722*61046927SAndroid Build Coastguard Worker         /*D3DPTFILTERCAPS_MINFPYRAMIDALQUAD |*/
723*61046927SAndroid Build Coastguard Worker         /*D3DPTFILTERCAPS_MINFGAUSSIANQUAD |*/
724*61046927SAndroid Build Coastguard Worker         D3DPTFILTERCAPS_MIPFPOINT |
725*61046927SAndroid Build Coastguard Worker         D3DPTFILTERCAPS_MIPFLINEAR |
726*61046927SAndroid Build Coastguard Worker         D3DPTFILTERCAPS_MAGFPOINT |
727*61046927SAndroid Build Coastguard Worker         D3DPTFILTERCAPS_MAGFLINEAR |
728*61046927SAndroid Build Coastguard Worker         D3DPIPECAP(ANISOTROPIC_FILTER, D3DPTFILTERCAPS_MAGFANISOTROPIC) |
729*61046927SAndroid Build Coastguard Worker         /*D3DPTFILTERCAPS_MAGFPYRAMIDALQUAD |*/
730*61046927SAndroid Build Coastguard Worker         /*D3DPTFILTERCAPS_MAGFGAUSSIANQUAD*/0;
731*61046927SAndroid Build Coastguard Worker 
732*61046927SAndroid Build Coastguard Worker     pCaps->CubeTextureFilterCaps = pCaps->TextureFilterCaps;
733*61046927SAndroid Build Coastguard Worker     pCaps->VolumeTextureFilterCaps = pCaps->TextureFilterCaps;
734*61046927SAndroid Build Coastguard Worker 
735*61046927SAndroid Build Coastguard Worker     pCaps->TextureAddressCaps =
736*61046927SAndroid Build Coastguard Worker         D3DPTADDRESSCAPS_BORDER |
737*61046927SAndroid Build Coastguard Worker         D3DPTADDRESSCAPS_INDEPENDENTUV |
738*61046927SAndroid Build Coastguard Worker         D3DPTADDRESSCAPS_WRAP |
739*61046927SAndroid Build Coastguard Worker         D3DPTADDRESSCAPS_MIRROR |
740*61046927SAndroid Build Coastguard Worker         D3DPTADDRESSCAPS_CLAMP |
741*61046927SAndroid Build Coastguard Worker         D3DPIPECAP(TEXTURE_MIRROR_CLAMP, D3DPTADDRESSCAPS_MIRRORONCE);
742*61046927SAndroid Build Coastguard Worker 
743*61046927SAndroid Build Coastguard Worker     pCaps->VolumeTextureAddressCaps = pCaps->TextureAddressCaps;
744*61046927SAndroid Build Coastguard Worker 
745*61046927SAndroid Build Coastguard Worker     pCaps->LineCaps =
746*61046927SAndroid Build Coastguard Worker         D3DLINECAPS_ALPHACMP |
747*61046927SAndroid Build Coastguard Worker         D3DLINECAPS_BLEND |
748*61046927SAndroid Build Coastguard Worker         D3DLINECAPS_TEXTURE |
749*61046927SAndroid Build Coastguard Worker         D3DLINECAPS_ZTEST |
750*61046927SAndroid Build Coastguard Worker         D3DLINECAPS_FOG;
751*61046927SAndroid Build Coastguard Worker     if (screen->get_paramf(screen, PIPE_CAPF_MAX_LINE_WIDTH_AA) > 0.0) {
752*61046927SAndroid Build Coastguard Worker         pCaps->LineCaps |= D3DLINECAPS_ANTIALIAS;
753*61046927SAndroid Build Coastguard Worker     }
754*61046927SAndroid Build Coastguard Worker 
755*61046927SAndroid Build Coastguard Worker     pCaps->MaxTextureWidth =screen->get_param(screen,
756*61046927SAndroid Build Coastguard Worker                                               PIPE_CAP_MAX_TEXTURE_2D_SIZE);
757*61046927SAndroid Build Coastguard Worker     pCaps->MaxTextureHeight = pCaps->MaxTextureWidth;
758*61046927SAndroid Build Coastguard Worker     pCaps->MaxVolumeExtent =
759*61046927SAndroid Build Coastguard Worker         1 << (screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS) - 1);
760*61046927SAndroid Build Coastguard Worker     /* XXX values from wine */
761*61046927SAndroid Build Coastguard Worker     pCaps->MaxTextureRepeat = 32768;
762*61046927SAndroid Build Coastguard Worker     pCaps->MaxTextureAspectRatio = pCaps->MaxTextureWidth;
763*61046927SAndroid Build Coastguard Worker 
764*61046927SAndroid Build Coastguard Worker     pCaps->MaxAnisotropy =
765*61046927SAndroid Build Coastguard Worker         (DWORD)screen->get_paramf(screen, PIPE_CAPF_MAX_TEXTURE_ANISOTROPY);
766*61046927SAndroid Build Coastguard Worker 
767*61046927SAndroid Build Coastguard Worker     /* Values for GeForce 9600 GT */
768*61046927SAndroid Build Coastguard Worker     pCaps->MaxVertexW = 1e10f;
769*61046927SAndroid Build Coastguard Worker     pCaps->GuardBandLeft = -1e9f;
770*61046927SAndroid Build Coastguard Worker     pCaps->GuardBandTop = -1e9f;
771*61046927SAndroid Build Coastguard Worker     pCaps->GuardBandRight = 1e9f;
772*61046927SAndroid Build Coastguard Worker     pCaps->GuardBandBottom = 1e9f;
773*61046927SAndroid Build Coastguard Worker     pCaps->ExtentsAdjust = 0.0f;
774*61046927SAndroid Build Coastguard Worker 
775*61046927SAndroid Build Coastguard Worker     pCaps->StencilCaps =
776*61046927SAndroid Build Coastguard Worker         D3DSTENCILCAPS_KEEP |
777*61046927SAndroid Build Coastguard Worker         D3DSTENCILCAPS_ZERO |
778*61046927SAndroid Build Coastguard Worker         D3DSTENCILCAPS_REPLACE |
779*61046927SAndroid Build Coastguard Worker         D3DSTENCILCAPS_INCRSAT |
780*61046927SAndroid Build Coastguard Worker         D3DSTENCILCAPS_DECRSAT |
781*61046927SAndroid Build Coastguard Worker         D3DSTENCILCAPS_INVERT |
782*61046927SAndroid Build Coastguard Worker         D3DSTENCILCAPS_INCR |
783*61046927SAndroid Build Coastguard Worker         D3DSTENCILCAPS_DECR |
784*61046927SAndroid Build Coastguard Worker         D3DSTENCILCAPS_TWOSIDED;
785*61046927SAndroid Build Coastguard Worker 
786*61046927SAndroid Build Coastguard Worker     pCaps->FVFCaps =
787*61046927SAndroid Build Coastguard Worker         8 | /* 8 textures max */
788*61046927SAndroid Build Coastguard Worker         /*D3DFVFCAPS_DONOTSTRIPELEMENTS |*/
789*61046927SAndroid Build Coastguard Worker         D3DFVFCAPS_PSIZE;
790*61046927SAndroid Build Coastguard Worker 
791*61046927SAndroid Build Coastguard Worker     pCaps->TextureOpCaps = D3DTEXOPCAPS_DISABLE |
792*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_SELECTARG1 |
793*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_SELECTARG2 |
794*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_MODULATE |
795*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_MODULATE2X |
796*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_MODULATE4X |
797*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_ADD |
798*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_ADDSIGNED |
799*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_ADDSIGNED2X |
800*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_SUBTRACT |
801*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_ADDSMOOTH |
802*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_BLENDDIFFUSEALPHA |
803*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_BLENDTEXTUREALPHA |
804*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_BLENDFACTORALPHA |
805*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_BLENDTEXTUREALPHAPM |
806*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_BLENDCURRENTALPHA |
807*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_PREMODULATE |
808*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR |
809*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_MODULATECOLOR_ADDALPHA |
810*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR |
811*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA |
812*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_BUMPENVMAP |
813*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_BUMPENVMAPLUMINANCE |
814*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_DOTPRODUCT3 |
815*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_MULTIPLYADD |
816*61046927SAndroid Build Coastguard Worker                            D3DTEXOPCAPS_LERP;
817*61046927SAndroid Build Coastguard Worker 
818*61046927SAndroid Build Coastguard Worker     pCaps->MaxTextureBlendStages = 8; /* XXX wine */
819*61046927SAndroid Build Coastguard Worker     pCaps->MaxSimultaneousTextures = 8;
820*61046927SAndroid Build Coastguard Worker 
821*61046927SAndroid Build Coastguard Worker     pCaps->VertexProcessingCaps = D3DVTXPCAPS_TEXGEN |
822*61046927SAndroid Build Coastguard Worker                                   D3DVTXPCAPS_TEXGEN_SPHEREMAP |
823*61046927SAndroid Build Coastguard Worker                                   D3DVTXPCAPS_MATERIALSOURCE7 |
824*61046927SAndroid Build Coastguard Worker                                   D3DVTXPCAPS_DIRECTIONALLIGHTS |
825*61046927SAndroid Build Coastguard Worker                                   D3DVTXPCAPS_POSITIONALLIGHTS |
826*61046927SAndroid Build Coastguard Worker                                   D3DVTXPCAPS_LOCALVIEWER |
827*61046927SAndroid Build Coastguard Worker                                   D3DVTXPCAPS_TWEENING |
828*61046927SAndroid Build Coastguard Worker                                   /*D3DVTXPCAPS_NO_TEXGEN_NONLOCALVIEWER*/0;
829*61046927SAndroid Build Coastguard Worker 
830*61046927SAndroid Build Coastguard Worker     pCaps->MaxActiveLights = NINE_MAX_LIGHTS_ACTIVE; /* like GL_LIGHTi */
831*61046927SAndroid Build Coastguard Worker     pCaps->MaxUserClipPlanes = PIPE_MAX_CLIP_PLANES;
832*61046927SAndroid Build Coastguard Worker     pCaps->MaxVertexBlendMatrices = 4; /* 1 vec4 BLENDWEIGHT/INDICES input */
833*61046927SAndroid Build Coastguard Worker     pCaps->MaxVertexBlendMatrixIndex = 8; /* D3DTS_WORLDMATRIX(0..8) */
834*61046927SAndroid Build Coastguard Worker 
835*61046927SAndroid Build Coastguard Worker     pCaps->MaxPointSize = screen->get_paramf(screen, PIPE_CAPF_MAX_POINT_SIZE);
836*61046927SAndroid Build Coastguard Worker 
837*61046927SAndroid Build Coastguard Worker     pCaps->MaxPrimitiveCount = 0x555555; /* <- wine, really 0xFFFFFFFF; */
838*61046927SAndroid Build Coastguard Worker     pCaps->MaxVertexIndex = 0xFFFFFF; /* <- wine, really 0xFFFFFFFF */
839*61046927SAndroid Build Coastguard Worker     pCaps->MaxStreams =
840*61046927SAndroid Build Coastguard Worker         _min(screen->get_shader_param(screen,
841*61046927SAndroid Build Coastguard Worker                  PIPE_SHADER_VERTEX, PIPE_SHADER_CAP_MAX_INPUTS),
842*61046927SAndroid Build Coastguard Worker              16);
843*61046927SAndroid Build Coastguard Worker 
844*61046927SAndroid Build Coastguard Worker     pCaps->MaxStreamStride = screen->get_param(screen,
845*61046927SAndroid Build Coastguard Worker             PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE);
846*61046927SAndroid Build Coastguard Worker 
847*61046927SAndroid Build Coastguard Worker     pCaps->VertexShaderVersion = D3DVS_VERSION(3,0);
848*61046927SAndroid Build Coastguard Worker 
849*61046927SAndroid Build Coastguard Worker     /* VS 2 as well as 3.0 supports a minimum of 256 consts.
850*61046927SAndroid Build Coastguard Worker      * Wine and d3d9 drivers for dx1x hw advertise 256. Just as them,
851*61046927SAndroid Build Coastguard Worker      * advertise 256. Problem is with hw that can only do 256, because
852*61046927SAndroid Build Coastguard Worker      * we need take a few slots for boolean and integer constants. For these
853*61046927SAndroid Build Coastguard Worker      * we'll have to fail later if they use complex shaders. */
854*61046927SAndroid Build Coastguard Worker     pCaps->MaxVertexShaderConst = NINE_MAX_CONST_F;
855*61046927SAndroid Build Coastguard Worker 
856*61046927SAndroid Build Coastguard Worker     pCaps->PixelShaderVersion = D3DPS_VERSION(3,0);
857*61046927SAndroid Build Coastguard Worker     /* Value for GeForce 9600 GT */
858*61046927SAndroid Build Coastguard Worker     pCaps->PixelShader1xMaxValue = 65504.f;
859*61046927SAndroid Build Coastguard Worker 
860*61046927SAndroid Build Coastguard Worker     pCaps->DevCaps2 = D3DDEVCAPS2_STREAMOFFSET |
861*61046927SAndroid Build Coastguard Worker                       D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET |
862*61046927SAndroid Build Coastguard Worker                       D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES |
863*61046927SAndroid Build Coastguard Worker                       /*D3DDEVCAPS2_DMAPNPATCH |*/
864*61046927SAndroid Build Coastguard Worker                       /*D3DDEVCAPS2_ADAPTIVETESSRTPATCH |*/
865*61046927SAndroid Build Coastguard Worker                       /*D3DDEVCAPS2_ADAPTIVETESSNPATCH |*/
866*61046927SAndroid Build Coastguard Worker                       /*D3DDEVCAPS2_PRESAMPLEDDMAPNPATCH*/0;
867*61046927SAndroid Build Coastguard Worker 
868*61046927SAndroid Build Coastguard Worker     pCaps->MasterAdapterOrdinal = 0;
869*61046927SAndroid Build Coastguard Worker     pCaps->AdapterOrdinalInGroup = 0;
870*61046927SAndroid Build Coastguard Worker     pCaps->NumberOfAdaptersInGroup = 1;
871*61046927SAndroid Build Coastguard Worker 
872*61046927SAndroid Build Coastguard Worker     /* Undocumented ? */
873*61046927SAndroid Build Coastguard Worker     pCaps->MaxNpatchTessellationLevel = 0.0f;
874*61046927SAndroid Build Coastguard Worker     pCaps->Reserved5 = 0;
875*61046927SAndroid Build Coastguard Worker 
876*61046927SAndroid Build Coastguard Worker     /* XXX: use is_format_supported */
877*61046927SAndroid Build Coastguard Worker     pCaps->DeclTypes = D3DDTCAPS_UBYTE4 |
878*61046927SAndroid Build Coastguard Worker                        D3DDTCAPS_UBYTE4N |
879*61046927SAndroid Build Coastguard Worker                        D3DDTCAPS_SHORT2N |
880*61046927SAndroid Build Coastguard Worker                        D3DDTCAPS_SHORT4N |
881*61046927SAndroid Build Coastguard Worker                        D3DDTCAPS_USHORT2N |
882*61046927SAndroid Build Coastguard Worker                        D3DDTCAPS_USHORT4N |
883*61046927SAndroid Build Coastguard Worker                        D3DDTCAPS_UDEC3 |
884*61046927SAndroid Build Coastguard Worker                        D3DDTCAPS_DEC3N |
885*61046927SAndroid Build Coastguard Worker                        D3DDTCAPS_FLOAT16_2 |
886*61046927SAndroid Build Coastguard Worker                        D3DDTCAPS_FLOAT16_4;
887*61046927SAndroid Build Coastguard Worker 
888*61046927SAndroid Build Coastguard Worker     pCaps->NumSimultaneousRTs =
889*61046927SAndroid Build Coastguard Worker         screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS);
890*61046927SAndroid Build Coastguard Worker     if (pCaps->NumSimultaneousRTs > NINE_MAX_SIMULTANEOUS_RENDERTARGETS)
891*61046927SAndroid Build Coastguard Worker         pCaps->NumSimultaneousRTs = NINE_MAX_SIMULTANEOUS_RENDERTARGETS;
892*61046927SAndroid Build Coastguard Worker 
893*61046927SAndroid Build Coastguard Worker     pCaps->StretchRectFilterCaps = D3DPTFILTERCAPS_MINFPOINT |
894*61046927SAndroid Build Coastguard Worker                                    D3DPTFILTERCAPS_MINFLINEAR |
895*61046927SAndroid Build Coastguard Worker                                    D3DPTFILTERCAPS_MAGFPOINT |
896*61046927SAndroid Build Coastguard Worker                                    D3DPTFILTERCAPS_MAGFLINEAR;
897*61046927SAndroid Build Coastguard Worker 
898*61046927SAndroid Build Coastguard Worker 
899*61046927SAndroid Build Coastguard Worker     pCaps->VS20Caps.Caps = D3DVS20CAPS_PREDICATION;
900*61046927SAndroid Build Coastguard Worker     pCaps->VS20Caps.DynamicFlowControlDepth = /* XXX is this dynamic ? */
901*61046927SAndroid Build Coastguard Worker         screen->get_shader_param(screen, PIPE_SHADER_VERTEX,
902*61046927SAndroid Build Coastguard Worker                                  PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
903*61046927SAndroid Build Coastguard Worker     pCaps->VS20Caps.NumTemps =
904*61046927SAndroid Build Coastguard Worker         screen->get_shader_param(screen, PIPE_SHADER_VERTEX,
905*61046927SAndroid Build Coastguard Worker                                  PIPE_SHADER_CAP_MAX_TEMPS);
906*61046927SAndroid Build Coastguard Worker     pCaps->VS20Caps.StaticFlowControlDepth = /* XXX is this static ? */
907*61046927SAndroid Build Coastguard Worker         screen->get_shader_param(screen, PIPE_SHADER_VERTEX,
908*61046927SAndroid Build Coastguard Worker                                  PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
909*61046927SAndroid Build Coastguard Worker 
910*61046927SAndroid Build Coastguard Worker     /* also check for values < 0, because get_shader_param may return unsigned */
911*61046927SAndroid Build Coastguard Worker     if (pCaps->VS20Caps.DynamicFlowControlDepth > D3DVS20_MAX_DYNAMICFLOWCONTROLDEPTH
912*61046927SAndroid Build Coastguard Worker         || pCaps->VS20Caps.DynamicFlowControlDepth < 0)
913*61046927SAndroid Build Coastguard Worker         pCaps->VS20Caps.DynamicFlowControlDepth = D3DVS20_MAX_DYNAMICFLOWCONTROLDEPTH;
914*61046927SAndroid Build Coastguard Worker     if (pCaps->VS20Caps.StaticFlowControlDepth > D3DVS20_MAX_STATICFLOWCONTROLDEPTH
915*61046927SAndroid Build Coastguard Worker         || pCaps->VS20Caps.StaticFlowControlDepth < 0)
916*61046927SAndroid Build Coastguard Worker         pCaps->VS20Caps.StaticFlowControlDepth = D3DVS20_MAX_STATICFLOWCONTROLDEPTH;
917*61046927SAndroid Build Coastguard Worker     if (pCaps->VS20Caps.NumTemps > D3DVS20_MAX_NUMTEMPS)
918*61046927SAndroid Build Coastguard Worker         pCaps->VS20Caps.NumTemps = D3DVS20_MAX_NUMTEMPS;
919*61046927SAndroid Build Coastguard Worker     assert(pCaps->VS20Caps.DynamicFlowControlDepth >= D3DVS20_MIN_DYNAMICFLOWCONTROLDEPTH);
920*61046927SAndroid Build Coastguard Worker     assert(pCaps->VS20Caps.StaticFlowControlDepth >= D3DVS20_MIN_STATICFLOWCONTROLDEPTH);
921*61046927SAndroid Build Coastguard Worker     assert(pCaps->VS20Caps.NumTemps >= D3DVS20_MIN_NUMTEMPS);
922*61046927SAndroid Build Coastguard Worker 
923*61046927SAndroid Build Coastguard Worker 
924*61046927SAndroid Build Coastguard Worker     pCaps->PS20Caps.Caps = D3DPS20CAPS_ARBITRARYSWIZZLE |
925*61046927SAndroid Build Coastguard Worker                            D3DPS20CAPS_GRADIENTINSTRUCTIONS |
926*61046927SAndroid Build Coastguard Worker                            D3DPS20CAPS_PREDICATION;
927*61046927SAndroid Build Coastguard Worker     if (screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
928*61046927SAndroid Build Coastguard Worker                                  PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS) ==
929*61046927SAndroid Build Coastguard Worker         screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
930*61046927SAndroid Build Coastguard Worker                                  PIPE_SHADER_CAP_MAX_INSTRUCTIONS))
931*61046927SAndroid Build Coastguard Worker         pCaps->PS20Caps.Caps |= D3DPS20CAPS_NOTEXINSTRUCTIONLIMIT;
932*61046927SAndroid Build Coastguard Worker     if (screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
933*61046927SAndroid Build Coastguard Worker                                  PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS) ==
934*61046927SAndroid Build Coastguard Worker         screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
935*61046927SAndroid Build Coastguard Worker                                  PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS))
936*61046927SAndroid Build Coastguard Worker         pCaps->PS20Caps.Caps |= D3DPS20CAPS_NODEPENDENTREADLIMIT;
937*61046927SAndroid Build Coastguard Worker     pCaps->PS20Caps.DynamicFlowControlDepth = /* XXX is this dynamic ? */
938*61046927SAndroid Build Coastguard Worker         screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
939*61046927SAndroid Build Coastguard Worker                                  PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
940*61046927SAndroid Build Coastguard Worker     pCaps->PS20Caps.NumTemps =
941*61046927SAndroid Build Coastguard Worker         screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
942*61046927SAndroid Build Coastguard Worker                                  PIPE_SHADER_CAP_MAX_TEMPS);
943*61046927SAndroid Build Coastguard Worker     pCaps->PS20Caps.StaticFlowControlDepth =  /* XXX is this static ? */
944*61046927SAndroid Build Coastguard Worker         screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
945*61046927SAndroid Build Coastguard Worker                                  PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
946*61046927SAndroid Build Coastguard Worker     pCaps->PS20Caps.NumInstructionSlots =
947*61046927SAndroid Build Coastguard Worker         screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
948*61046927SAndroid Build Coastguard Worker                                  PIPE_SHADER_CAP_MAX_INSTRUCTIONS);
949*61046927SAndroid Build Coastguard Worker 
950*61046927SAndroid Build Coastguard Worker     if (pCaps->PS20Caps.DynamicFlowControlDepth > D3DPS20_MAX_DYNAMICFLOWCONTROLDEPTH
951*61046927SAndroid Build Coastguard Worker         || pCaps->PS20Caps.DynamicFlowControlDepth < 0)
952*61046927SAndroid Build Coastguard Worker         pCaps->PS20Caps.DynamicFlowControlDepth = D3DPS20_MAX_DYNAMICFLOWCONTROLDEPTH;
953*61046927SAndroid Build Coastguard Worker     if (pCaps->PS20Caps.StaticFlowControlDepth > D3DPS20_MAX_STATICFLOWCONTROLDEPTH
954*61046927SAndroid Build Coastguard Worker         || pCaps->PS20Caps.StaticFlowControlDepth < 0)
955*61046927SAndroid Build Coastguard Worker         pCaps->PS20Caps.StaticFlowControlDepth = D3DPS20_MAX_STATICFLOWCONTROLDEPTH;
956*61046927SAndroid Build Coastguard Worker     if (pCaps->PS20Caps.NumTemps > D3DPS20_MAX_NUMTEMPS)
957*61046927SAndroid Build Coastguard Worker         pCaps->PS20Caps.NumTemps = D3DPS20_MAX_NUMTEMPS;
958*61046927SAndroid Build Coastguard Worker     if (pCaps->PS20Caps.NumInstructionSlots > D3DPS20_MAX_NUMINSTRUCTIONSLOTS)
959*61046927SAndroid Build Coastguard Worker         pCaps->PS20Caps.NumInstructionSlots = D3DPS20_MAX_NUMINSTRUCTIONSLOTS;
960*61046927SAndroid Build Coastguard Worker     assert(pCaps->PS20Caps.DynamicFlowControlDepth >= D3DPS20_MIN_DYNAMICFLOWCONTROLDEPTH);
961*61046927SAndroid Build Coastguard Worker     assert(pCaps->PS20Caps.StaticFlowControlDepth >= D3DPS20_MIN_STATICFLOWCONTROLDEPTH);
962*61046927SAndroid Build Coastguard Worker     assert(pCaps->PS20Caps.NumTemps >= D3DPS20_MIN_NUMTEMPS);
963*61046927SAndroid Build Coastguard Worker     assert(pCaps->PS20Caps.NumInstructionSlots >= D3DPS20_MIN_NUMINSTRUCTIONSLOTS);
964*61046927SAndroid Build Coastguard Worker 
965*61046927SAndroid Build Coastguard Worker 
966*61046927SAndroid Build Coastguard Worker     if (screen->get_shader_param(screen, PIPE_SHADER_VERTEX,
967*61046927SAndroid Build Coastguard Worker                                  PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS))
968*61046927SAndroid Build Coastguard Worker         pCaps->VertexTextureFilterCaps = pCaps->TextureFilterCaps &
969*61046927SAndroid Build Coastguard Worker             ~(D3DPTFILTERCAPS_MIPFPOINT |
970*61046927SAndroid Build Coastguard Worker               D3DPTFILTERCAPS_MIPFPOINT); /* XXX */
971*61046927SAndroid Build Coastguard Worker     else
972*61046927SAndroid Build Coastguard Worker         pCaps->VertexTextureFilterCaps = 0;
973*61046927SAndroid Build Coastguard Worker 
974*61046927SAndroid Build Coastguard Worker     pCaps->MaxVertexShader30InstructionSlots =
975*61046927SAndroid Build Coastguard Worker         screen->get_shader_param(screen, PIPE_SHADER_VERTEX,
976*61046927SAndroid Build Coastguard Worker                                  PIPE_SHADER_CAP_MAX_INSTRUCTIONS);
977*61046927SAndroid Build Coastguard Worker     pCaps->MaxPixelShader30InstructionSlots =
978*61046927SAndroid Build Coastguard Worker         screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
979*61046927SAndroid Build Coastguard Worker                                  PIPE_SHADER_CAP_MAX_INSTRUCTIONS);
980*61046927SAndroid Build Coastguard Worker     if (pCaps->MaxVertexShader30InstructionSlots > D3DMAX30SHADERINSTRUCTIONS)
981*61046927SAndroid Build Coastguard Worker         pCaps->MaxVertexShader30InstructionSlots = D3DMAX30SHADERINSTRUCTIONS;
982*61046927SAndroid Build Coastguard Worker     if (pCaps->MaxPixelShader30InstructionSlots > D3DMAX30SHADERINSTRUCTIONS)
983*61046927SAndroid Build Coastguard Worker         pCaps->MaxPixelShader30InstructionSlots = D3DMAX30SHADERINSTRUCTIONS;
984*61046927SAndroid Build Coastguard Worker     assert(pCaps->MaxVertexShader30InstructionSlots >= D3DMIN30SHADERINSTRUCTIONS);
985*61046927SAndroid Build Coastguard Worker     assert(pCaps->MaxPixelShader30InstructionSlots >= D3DMIN30SHADERINSTRUCTIONS);
986*61046927SAndroid Build Coastguard Worker 
987*61046927SAndroid Build Coastguard Worker     /* 65535 is required, advertise more for GPUs with >= 2048 instruction slots */
988*61046927SAndroid Build Coastguard Worker     pCaps->MaxVShaderInstructionsExecuted = MAX2(65535, pCaps->MaxVertexShader30InstructionSlots * 32);
989*61046927SAndroid Build Coastguard Worker     pCaps->MaxPShaderInstructionsExecuted = MAX2(65535, pCaps->MaxPixelShader30InstructionSlots * 32);
990*61046927SAndroid Build Coastguard Worker 
991*61046927SAndroid Build Coastguard Worker     if (debug_get_bool_option("NINE_DUMP_CAPS", false))
992*61046927SAndroid Build Coastguard Worker         nine_dump_D3DCAPS9(DBG_CHANNEL, pCaps);
993*61046927SAndroid Build Coastguard Worker 
994*61046927SAndroid Build Coastguard Worker     return D3D_OK;
995*61046927SAndroid Build Coastguard Worker }
996*61046927SAndroid Build Coastguard Worker 
997*61046927SAndroid Build Coastguard Worker HRESULT NINE_WINAPI
NineAdapter9_CreateDevice(struct NineAdapter9 * This,UINT RealAdapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS * pPresentationParameters,IDirect3D9 * pD3D9,ID3DPresentGroup * pPresentationGroup,IDirect3DDevice9 ** ppReturnedDeviceInterface)998*61046927SAndroid Build Coastguard Worker NineAdapter9_CreateDevice( struct NineAdapter9 *This,
999*61046927SAndroid Build Coastguard Worker                            UINT RealAdapter,
1000*61046927SAndroid Build Coastguard Worker                            D3DDEVTYPE DeviceType,
1001*61046927SAndroid Build Coastguard Worker                            HWND hFocusWindow,
1002*61046927SAndroid Build Coastguard Worker                            DWORD BehaviorFlags,
1003*61046927SAndroid Build Coastguard Worker                            D3DPRESENT_PARAMETERS *pPresentationParameters,
1004*61046927SAndroid Build Coastguard Worker                            IDirect3D9 *pD3D9,
1005*61046927SAndroid Build Coastguard Worker                            ID3DPresentGroup *pPresentationGroup,
1006*61046927SAndroid Build Coastguard Worker                            IDirect3DDevice9 **ppReturnedDeviceInterface )
1007*61046927SAndroid Build Coastguard Worker {
1008*61046927SAndroid Build Coastguard Worker     struct pipe_screen *screen;
1009*61046927SAndroid Build Coastguard Worker     D3DDEVICE_CREATION_PARAMETERS params;
1010*61046927SAndroid Build Coastguard Worker     D3DCAPS9 caps;
1011*61046927SAndroid Build Coastguard Worker     int major, minor;
1012*61046927SAndroid Build Coastguard Worker     HRESULT hr;
1013*61046927SAndroid Build Coastguard Worker 
1014*61046927SAndroid Build Coastguard Worker     DBG("This=%p RealAdapter=%u DeviceType=%s hFocusWindow=%p "
1015*61046927SAndroid Build Coastguard Worker         "BehaviourFlags=%x " "pD3D9=%p pPresentationGroup=%p "
1016*61046927SAndroid Build Coastguard Worker         "ppReturnedDeviceInterface=%p\n", This,
1017*61046927SAndroid Build Coastguard Worker         RealAdapter, nine_D3DDEVTYPE_to_str(DeviceType), hFocusWindow,
1018*61046927SAndroid Build Coastguard Worker         BehaviorFlags, pD3D9, pPresentationGroup, ppReturnedDeviceInterface);
1019*61046927SAndroid Build Coastguard Worker 
1020*61046927SAndroid Build Coastguard Worker     ID3DPresentGroup_GetVersion(pPresentationGroup, &major, &minor);
1021*61046927SAndroid Build Coastguard Worker     if (major != 1) {
1022*61046927SAndroid Build Coastguard Worker         ERR("Doesn't support the ID3DPresentGroup version %d %d. Expected 1\n",
1023*61046927SAndroid Build Coastguard Worker             major, minor);
1024*61046927SAndroid Build Coastguard Worker         return D3DERR_NOTAVAILABLE;
1025*61046927SAndroid Build Coastguard Worker     }
1026*61046927SAndroid Build Coastguard Worker 
1027*61046927SAndroid Build Coastguard Worker     hr = NineAdapter9_GetScreen(This, DeviceType, &screen);
1028*61046927SAndroid Build Coastguard Worker     if (FAILED(hr)) {
1029*61046927SAndroid Build Coastguard Worker         DBG("Failed to get pipe_screen.\n");
1030*61046927SAndroid Build Coastguard Worker         return hr;
1031*61046927SAndroid Build Coastguard Worker     }
1032*61046927SAndroid Build Coastguard Worker 
1033*61046927SAndroid Build Coastguard Worker     hr = NineAdapter9_GetDeviceCaps(This, DeviceType, &caps);
1034*61046927SAndroid Build Coastguard Worker     if (FAILED(hr)) {
1035*61046927SAndroid Build Coastguard Worker         DBG("Failed to get device caps.\n");
1036*61046927SAndroid Build Coastguard Worker         return hr;
1037*61046927SAndroid Build Coastguard Worker     }
1038*61046927SAndroid Build Coastguard Worker 
1039*61046927SAndroid Build Coastguard Worker     params.AdapterOrdinal = RealAdapter;
1040*61046927SAndroid Build Coastguard Worker     params.DeviceType = DeviceType;
1041*61046927SAndroid Build Coastguard Worker     params.hFocusWindow = hFocusWindow;
1042*61046927SAndroid Build Coastguard Worker     params.BehaviorFlags = BehaviorFlags;
1043*61046927SAndroid Build Coastguard Worker 
1044*61046927SAndroid Build Coastguard Worker     hr = NineDevice9_new(screen, &params, &caps, pPresentationParameters,
1045*61046927SAndroid Build Coastguard Worker                          pD3D9, pPresentationGroup, This->ctx, false, NULL,
1046*61046927SAndroid Build Coastguard Worker                          (struct NineDevice9 **)ppReturnedDeviceInterface,
1047*61046927SAndroid Build Coastguard Worker                          minor);
1048*61046927SAndroid Build Coastguard Worker     if (FAILED(hr)) {
1049*61046927SAndroid Build Coastguard Worker         DBG("Failed to create device.\n");
1050*61046927SAndroid Build Coastguard Worker         return hr;
1051*61046927SAndroid Build Coastguard Worker     }
1052*61046927SAndroid Build Coastguard Worker     DBG("NineDevice9 created successfully.\n");
1053*61046927SAndroid Build Coastguard Worker 
1054*61046927SAndroid Build Coastguard Worker     return D3D_OK;
1055*61046927SAndroid Build Coastguard Worker }
1056*61046927SAndroid Build Coastguard Worker 
1057*61046927SAndroid Build Coastguard Worker HRESULT NINE_WINAPI
NineAdapter9_CreateDeviceEx(struct NineAdapter9 * This,UINT RealAdapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS * pPresentationParameters,D3DDISPLAYMODEEX * pFullscreenDisplayMode,IDirect3D9Ex * pD3D9Ex,ID3DPresentGroup * pPresentationGroup,IDirect3DDevice9Ex ** ppReturnedDeviceInterface)1058*61046927SAndroid Build Coastguard Worker NineAdapter9_CreateDeviceEx( struct NineAdapter9 *This,
1059*61046927SAndroid Build Coastguard Worker                              UINT RealAdapter,
1060*61046927SAndroid Build Coastguard Worker                              D3DDEVTYPE DeviceType,
1061*61046927SAndroid Build Coastguard Worker                              HWND hFocusWindow,
1062*61046927SAndroid Build Coastguard Worker                              DWORD BehaviorFlags,
1063*61046927SAndroid Build Coastguard Worker                              D3DPRESENT_PARAMETERS *pPresentationParameters,
1064*61046927SAndroid Build Coastguard Worker                              D3DDISPLAYMODEEX *pFullscreenDisplayMode,
1065*61046927SAndroid Build Coastguard Worker                              IDirect3D9Ex *pD3D9Ex,
1066*61046927SAndroid Build Coastguard Worker                              ID3DPresentGroup *pPresentationGroup,
1067*61046927SAndroid Build Coastguard Worker                              IDirect3DDevice9Ex **ppReturnedDeviceInterface )
1068*61046927SAndroid Build Coastguard Worker {
1069*61046927SAndroid Build Coastguard Worker     struct pipe_screen *screen;
1070*61046927SAndroid Build Coastguard Worker     D3DDEVICE_CREATION_PARAMETERS params;
1071*61046927SAndroid Build Coastguard Worker     D3DCAPS9 caps;
1072*61046927SAndroid Build Coastguard Worker     int major, minor;
1073*61046927SAndroid Build Coastguard Worker     HRESULT hr;
1074*61046927SAndroid Build Coastguard Worker 
1075*61046927SAndroid Build Coastguard Worker     DBG("This=%p RealAdapter=%u DeviceType=%s hFocusWindow=%p "
1076*61046927SAndroid Build Coastguard Worker         "BehaviourFlags=%x " "pD3D9Ex=%p pPresentationGroup=%p "
1077*61046927SAndroid Build Coastguard Worker         "ppReturnedDeviceInterface=%p\n", This,
1078*61046927SAndroid Build Coastguard Worker         RealAdapter, nine_D3DDEVTYPE_to_str(DeviceType), hFocusWindow,
1079*61046927SAndroid Build Coastguard Worker         BehaviorFlags, pD3D9Ex, pPresentationGroup, ppReturnedDeviceInterface);
1080*61046927SAndroid Build Coastguard Worker 
1081*61046927SAndroid Build Coastguard Worker     ID3DPresentGroup_GetVersion(pPresentationGroup, &major, &minor);
1082*61046927SAndroid Build Coastguard Worker     if (major != 1) {
1083*61046927SAndroid Build Coastguard Worker         ERR("Doesn't support the ID3DPresentGroup version %d %d. Expected 1\n",
1084*61046927SAndroid Build Coastguard Worker             major, minor);
1085*61046927SAndroid Build Coastguard Worker         return D3DERR_NOTAVAILABLE;
1086*61046927SAndroid Build Coastguard Worker     }
1087*61046927SAndroid Build Coastguard Worker 
1088*61046927SAndroid Build Coastguard Worker     hr = NineAdapter9_GetScreen(This, DeviceType, &screen);
1089*61046927SAndroid Build Coastguard Worker     if (FAILED(hr)) {
1090*61046927SAndroid Build Coastguard Worker         DBG("Failed to get pipe_screen.\n");
1091*61046927SAndroid Build Coastguard Worker         return hr;
1092*61046927SAndroid Build Coastguard Worker     }
1093*61046927SAndroid Build Coastguard Worker 
1094*61046927SAndroid Build Coastguard Worker     hr = NineAdapter9_GetDeviceCaps(This, DeviceType, &caps);
1095*61046927SAndroid Build Coastguard Worker     if (FAILED(hr)) {
1096*61046927SAndroid Build Coastguard Worker         DBG("Failed to get device caps.\n");
1097*61046927SAndroid Build Coastguard Worker         return hr;
1098*61046927SAndroid Build Coastguard Worker     }
1099*61046927SAndroid Build Coastguard Worker 
1100*61046927SAndroid Build Coastguard Worker     params.AdapterOrdinal = RealAdapter;
1101*61046927SAndroid Build Coastguard Worker     params.DeviceType = DeviceType;
1102*61046927SAndroid Build Coastguard Worker     params.hFocusWindow = hFocusWindow;
1103*61046927SAndroid Build Coastguard Worker     params.BehaviorFlags = BehaviorFlags;
1104*61046927SAndroid Build Coastguard Worker 
1105*61046927SAndroid Build Coastguard Worker     hr = NineDevice9Ex_new(screen, &params, &caps, pPresentationParameters,
1106*61046927SAndroid Build Coastguard Worker                            pFullscreenDisplayMode,
1107*61046927SAndroid Build Coastguard Worker                            pD3D9Ex, pPresentationGroup, This->ctx,
1108*61046927SAndroid Build Coastguard Worker                            (struct NineDevice9Ex **)ppReturnedDeviceInterface,
1109*61046927SAndroid Build Coastguard Worker                            minor);
1110*61046927SAndroid Build Coastguard Worker     if (FAILED(hr)) {
1111*61046927SAndroid Build Coastguard Worker         DBG("Failed to create device.\n");
1112*61046927SAndroid Build Coastguard Worker         return hr;
1113*61046927SAndroid Build Coastguard Worker     }
1114*61046927SAndroid Build Coastguard Worker     DBG("NineDevice9Ex created successfully.\n");
1115*61046927SAndroid Build Coastguard Worker 
1116*61046927SAndroid Build Coastguard Worker     return D3D_OK;
1117*61046927SAndroid Build Coastguard Worker }
1118*61046927SAndroid Build Coastguard Worker 
1119*61046927SAndroid Build Coastguard Worker ID3DAdapter9Vtbl NineAdapter9_vtable = {
1120*61046927SAndroid Build Coastguard Worker     (void *)NineUnknown_QueryInterface,
1121*61046927SAndroid Build Coastguard Worker     (void *)NineUnknown_AddRef,
1122*61046927SAndroid Build Coastguard Worker     (void *)NineUnknown_Release,
1123*61046927SAndroid Build Coastguard Worker     (void *)NineAdapter9_GetAdapterIdentifier,
1124*61046927SAndroid Build Coastguard Worker     (void *)NineAdapter9_CheckDeviceType,
1125*61046927SAndroid Build Coastguard Worker     (void *)NineAdapter9_CheckDeviceFormat,
1126*61046927SAndroid Build Coastguard Worker     (void *)NineAdapter9_CheckDeviceMultiSampleType,
1127*61046927SAndroid Build Coastguard Worker     (void *)NineAdapter9_CheckDepthStencilMatch,
1128*61046927SAndroid Build Coastguard Worker     (void *)NineAdapter9_CheckDeviceFormatConversion,
1129*61046927SAndroid Build Coastguard Worker     (void *)NineAdapter9_GetDeviceCaps,
1130*61046927SAndroid Build Coastguard Worker     (void *)NineAdapter9_CreateDevice,
1131*61046927SAndroid Build Coastguard Worker     (void *)NineAdapter9_CreateDeviceEx
1132*61046927SAndroid Build Coastguard Worker };
1133*61046927SAndroid Build Coastguard Worker 
1134*61046927SAndroid Build Coastguard Worker static const GUID *NineAdapter9_IIDs[] = {
1135*61046927SAndroid Build Coastguard Worker     &IID_ID3D9Adapter,
1136*61046927SAndroid Build Coastguard Worker     &IID_IUnknown,
1137*61046927SAndroid Build Coastguard Worker     NULL
1138*61046927SAndroid Build Coastguard Worker };
1139*61046927SAndroid Build Coastguard Worker 
1140*61046927SAndroid Build Coastguard Worker HRESULT
NineAdapter9_new(struct d3dadapter9_context * pCTX,struct NineAdapter9 ** ppOut)1141*61046927SAndroid Build Coastguard Worker NineAdapter9_new( struct d3dadapter9_context *pCTX,
1142*61046927SAndroid Build Coastguard Worker                   struct NineAdapter9 **ppOut )
1143*61046927SAndroid Build Coastguard Worker {
1144*61046927SAndroid Build Coastguard Worker     NINE_NEW(Adapter9, ppOut, false, /* args */ pCTX);
1145*61046927SAndroid Build Coastguard Worker }
1146