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, ¶ms, &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, ¶ms, &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