1 /*
2  * Direct3D wine internal private include file
3  *
4  * Copyright 2002-2003 The wine-d3d team
5  * Copyright 2002-2003 Raphael Junqueira
6  * Copyright 2002-2003, 2004 Jason Edmeades
7  * Copyright 2005 Oliver Stieber
8  * Copyright 2006-2011, 2013 Stefan Dösinger for CodeWeavers
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2.1 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with this library; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23  */
24 
25 #ifndef __WINE_WINED3D_PRIVATE_H
26 #define __WINE_WINED3D_PRIVATE_H
27 
28 #ifdef USE_WIN32_OPENGL
29 #define WINE_GLAPI __stdcall
30 #else
31 #define WINE_GLAPI
32 #endif
33 
34 #include <assert.h>
35 #include <stdarg.h>
36 #include <math.h>
37 #include <limits.h>
38 #include "ntstatus.h"
39 #define WIN32_NO_STATUS
40 #define NONAMELESSUNION
41 #define NONAMELESSSTRUCT
42 #define COBJMACROS
43 #include "windef.h"
44 #include "winbase.h"
45 #include "winreg.h"
46 #include "wingdi.h"
47 #include "winuser.h"
48 #include "winternl.h"
49 #include "ddk/d3dkmthk.h"
50 #include "wine/debug.h"
51 #include "wine/heap.h"
52 #include "wine/unicode.h"
53 
54 #include "objbase.h"
55 #include "wine/wined3d.h"
56 #include "wined3d_gl.h"
57 #include "wine/list.h"
58 #include "wine/rbtree.h"
59 #include "wine/wgl_driver.h"
60 
61 #ifndef ARRAY_SIZE
62 #define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
63 #endif
64 
65 #define MAKEDWORD_VERSION(maj, min) (((maj & 0xffffu) << 16) | (min & 0xffffu))
66 
67 /* Driver quirks */
68 #define WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT       0x00000001
69 #define WINED3D_QUIRK_SET_TEXCOORD_W            0x00000002
70 #define WINED3D_QUIRK_GLSL_CLIP_VARYING         0x00000004
71 #define WINED3D_QUIRK_ALLOWS_SPECULAR_ALPHA     0x00000008
72 #define WINED3D_QUIRK_NV_CLIP_BROKEN            0x00000010
73 #define WINED3D_QUIRK_FBO_TEX_UPDATE            0x00000020
74 #define WINED3D_QUIRK_BROKEN_RGBA16             0x00000040
75 #define WINED3D_QUIRK_INFO_LOG_SPAM             0x00000080
76 #define WINED3D_QUIRK_LIMITED_TEX_FILTERING     0x00000100
77 #define WINED3D_QUIRK_BROKEN_ARB_FOG            0x00000200
78 
79 enum wined3d_ffp_idx
80 {
81     WINED3D_FFP_POSITION = 0,
82     WINED3D_FFP_BLENDWEIGHT = 1,
83     WINED3D_FFP_BLENDINDICES = 2,
84     WINED3D_FFP_NORMAL = 3,
85     WINED3D_FFP_PSIZE = 4,
86     WINED3D_FFP_DIFFUSE = 5,
87     WINED3D_FFP_SPECULAR = 6,
88     WINED3D_FFP_TEXCOORD0 = 7,
89     WINED3D_FFP_TEXCOORD1 = 8,
90     WINED3D_FFP_TEXCOORD2 = 9,
91     WINED3D_FFP_TEXCOORD3 = 10,
92     WINED3D_FFP_TEXCOORD4 = 11,
93     WINED3D_FFP_TEXCOORD5 = 12,
94     WINED3D_FFP_TEXCOORD6 = 13,
95     WINED3D_FFP_TEXCOORD7 = 14,
96     WINED3D_FFP_ATTRIBS_COUNT = 15,
97 };
98 
99 enum wined3d_ffp_emit_idx
100 {
101     WINED3D_FFP_EMIT_FLOAT1,
102     WINED3D_FFP_EMIT_FLOAT2,
103     WINED3D_FFP_EMIT_FLOAT3,
104     WINED3D_FFP_EMIT_FLOAT4,
105     WINED3D_FFP_EMIT_D3DCOLOR,
106     WINED3D_FFP_EMIT_UBYTE4,
107     WINED3D_FFP_EMIT_SHORT2,
108     WINED3D_FFP_EMIT_SHORT4,
109     WINED3D_FFP_EMIT_UBYTE4N,
110     WINED3D_FFP_EMIT_SHORT2N,
111     WINED3D_FFP_EMIT_SHORT4N,
112     WINED3D_FFP_EMIT_USHORT2N,
113     WINED3D_FFP_EMIT_USHORT4N,
114     WINED3D_FFP_EMIT_UDEC3,
115     WINED3D_FFP_EMIT_DEC3N,
116     WINED3D_FFP_EMIT_FLOAT16_2,
117     WINED3D_FFP_EMIT_FLOAT16_4,
118     WINED3D_FFP_EMIT_INVALID,
119     WINED3D_FFP_EMIT_COUNT,
120 };
121 
122 /* Texture format fixups */
123 
124 enum fixup_channel_source
125 {
126     CHANNEL_SOURCE_ZERO = 0,
127     CHANNEL_SOURCE_ONE = 1,
128     CHANNEL_SOURCE_X = 2,
129     CHANNEL_SOURCE_Y = 3,
130     CHANNEL_SOURCE_Z = 4,
131     CHANNEL_SOURCE_W = 5,
132     CHANNEL_SOURCE_COMPLEX0 = 6,
133     CHANNEL_SOURCE_COMPLEX1 = 7,
134 };
135 
136 enum complex_fixup
137 {
138     COMPLEX_FIXUP_NONE = 0,
139     COMPLEX_FIXUP_YUY2 = 1,
140     COMPLEX_FIXUP_UYVY = 2,
141     COMPLEX_FIXUP_YV12 = 3,
142     COMPLEX_FIXUP_P8   = 4,
143     COMPLEX_FIXUP_NV12 = 5,
144 };
145 
146 #include <pshpack2.h>
147 struct color_fixup_desc
148 {
149     unsigned short x_sign_fixup : 1;
150     unsigned short x_source : 3;
151     unsigned short y_sign_fixup : 1;
152     unsigned short y_source : 3;
153     unsigned short z_sign_fixup : 1;
154     unsigned short z_source : 3;
155     unsigned short w_sign_fixup : 1;
156     unsigned short w_source : 3;
157 };
158 #include <poppack.h>
159 
160 struct wined3d_d3d_limits
161 {
162     unsigned int vs_version, hs_version, ds_version, gs_version, ps_version, cs_version;
163     DWORD vs_uniform_count;
164     DWORD ps_uniform_count;
165     unsigned int varying_count;
166     unsigned int ffp_textures;
167     unsigned int ffp_blend_stages;
168     unsigned int ffp_vertex_blend_matrices;
169     unsigned int active_light_count;
170 };
171 
172 typedef void (WINE_GLAPI *wined3d_ffp_attrib_func)(const void *data);
173 typedef void (WINE_GLAPI *wined3d_ffp_texcoord_func)(GLenum unit, const void *data);
174 typedef void (WINE_GLAPI *wined3d_generic_attrib_func)(GLuint idx, const void *data);
175 extern wined3d_ffp_attrib_func specular_func_3ubv DECLSPEC_HIDDEN;
176 
177 struct wined3d_ffp_attrib_ops
178 {
179     wined3d_ffp_attrib_func position[WINED3D_FFP_EMIT_COUNT];
180     wined3d_ffp_attrib_func diffuse[WINED3D_FFP_EMIT_COUNT];
181     wined3d_ffp_attrib_func specular[WINED3D_FFP_EMIT_COUNT];
182     wined3d_ffp_attrib_func normal[WINED3D_FFP_EMIT_COUNT];
183     wined3d_ffp_texcoord_func texcoord[WINED3D_FFP_EMIT_COUNT];
184     wined3d_generic_attrib_func generic[WINED3D_FFP_EMIT_COUNT];
185 };
186 
187 struct wined3d_d3d_info
188 {
189     struct wined3d_d3d_limits limits;
190     struct wined3d_ffp_attrib_ops ffp_attrib_ops;
191     BOOL xyzrhw;
192     BOOL emulated_flatshading;
193     BOOL ffp_generic_attributes;
194     BOOL vs_clipping;
195     BOOL shader_color_key;
196     DWORD valid_rt_mask;
197     DWORD valid_dual_rt_mask;
198     DWORD wined3d_creation_flags;
199     BOOL shader_double_precision;
200 };
201 
202 static const struct color_fixup_desc COLOR_FIXUP_IDENTITY =
203         {0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_Z, 0, CHANNEL_SOURCE_W};
204 
205 static inline struct color_fixup_desc create_color_fixup_desc(
206         int sign0, enum fixup_channel_source src0, int sign1, enum fixup_channel_source src1,
207         int sign2, enum fixup_channel_source src2, int sign3, enum fixup_channel_source src3)
208 {
209     struct color_fixup_desc fixup =
210     {
211         sign0, src0,
212         sign1, src1,
213         sign2, src2,
214         sign3, src3,
215     };
216     return fixup;
217 }
218 
219 static inline struct color_fixup_desc create_complex_fixup_desc(enum complex_fixup complex_fixup)
220 {
221     struct color_fixup_desc fixup =
222     {
223         0u, complex_fixup & (1u << 0) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0,
224         0u, complex_fixup & (1u << 1) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0,
225         0u, complex_fixup & (1u << 2) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0,
226         0u, complex_fixup & (1u << 3) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0,
227     };
228     return fixup;
229 }
230 
231 static inline BOOL is_identity_fixup(struct color_fixup_desc fixup)
232 {
233     return !memcmp(&fixup, &COLOR_FIXUP_IDENTITY, sizeof(fixup));
234 }
235 
236 static inline BOOL is_complex_fixup(struct color_fixup_desc fixup)
237 {
238     return fixup.x_source == CHANNEL_SOURCE_COMPLEX0 || fixup.x_source == CHANNEL_SOURCE_COMPLEX1;
239 }
240 
241 static inline BOOL is_scaling_fixup(struct color_fixup_desc fixup)
242 {
243     return fixup.x_sign_fixup || fixup.y_sign_fixup || fixup.z_sign_fixup || fixup.w_sign_fixup;
244 }
245 
246 static inline BOOL is_same_fixup(struct color_fixup_desc f1, struct color_fixup_desc f2)
247 {
248     return f1.x_sign_fixup == f2.x_sign_fixup && f1.x_source == f2.x_source
249             && f1.y_sign_fixup == f2.y_sign_fixup && f1.y_source == f2.y_source
250             && f1.z_sign_fixup == f2.z_sign_fixup && f1.z_source == f2.z_source
251             && f1.w_sign_fixup == f2.w_sign_fixup && f1.w_source == f2.w_source;
252 }
253 
254 static inline enum complex_fixup get_complex_fixup(struct color_fixup_desc fixup)
255 {
256     enum complex_fixup complex_fixup = 0;
257     if (fixup.x_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1u << 0);
258     if (fixup.y_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1u << 1);
259     if (fixup.z_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1u << 2);
260     if (fixup.w_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1u << 3);
261     return complex_fixup;
262 }
263 
264 /* Device caps */
265 #define MAX_STREAMS                 16
266 #define MAX_TEXTURES                8
267 #define MAX_FRAGMENT_SAMPLERS       16
268 #define MAX_VERTEX_SAMPLERS         4
269 #define MAX_COMBINED_SAMPLERS       (MAX_FRAGMENT_SAMPLERS + MAX_VERTEX_SAMPLERS)
270 #define MAX_ACTIVE_LIGHTS           8
271 #define MAX_CLIP_DISTANCES          8
272 #define MAX_CONSTANT_BUFFERS        15
273 #define MAX_SAMPLER_OBJECTS         16
274 #define MAX_SHADER_RESOURCE_VIEWS   128
275 #define MAX_RENDER_TARGET_VIEWS     8
276 #define MAX_UNORDERED_ACCESS_VIEWS  8
277 #define MAX_TGSM_REGISTERS          8192
278 #define MAX_VERTEX_BLENDS           4
279 #define MAX_VERTEX_INDEX_BLENDS     9
280 #define MAX_RENDER_TARGETS          8
281 
282 struct min_lookup
283 {
284     GLenum mip[WINED3D_TEXF_LINEAR + 1];
285 };
286 
287 extern const struct min_lookup minMipLookup[WINED3D_TEXF_LINEAR + 1] DECLSPEC_HIDDEN;
288 extern const GLenum magLookup[WINED3D_TEXF_LINEAR + 1] DECLSPEC_HIDDEN;
289 
290 GLenum wined3d_gl_compare_func(enum wined3d_cmp_func f) DECLSPEC_HIDDEN;
291 
292 static inline enum wined3d_cmp_func wined3d_sanitize_cmp_func(enum wined3d_cmp_func func)
293 {
294     if (func < WINED3D_CMP_NEVER || func > WINED3D_CMP_ALWAYS)
295         return WINED3D_CMP_ALWAYS;
296     return func;
297 }
298 
299 static inline GLenum wined3d_gl_mag_filter(enum wined3d_texture_filter_type mag_filter)
300 {
301     return magLookup[mag_filter];
302 }
303 
304 static inline GLenum wined3d_gl_min_mip_filter(enum wined3d_texture_filter_type min_filter,
305         enum wined3d_texture_filter_type mip_filter)
306 {
307     return minMipLookup[min_filter].mip[mip_filter];
308 }
309 
310 /* float_16_to_32() and float_32_to_16() (see implementation in
311  * surface_base.c) convert 16 bit floats in the FLOAT16 data type
312  * to standard C floats and vice versa. They do not depend on the encoding
313  * of the C float, so they are platform independent, but slow. On x86 and
314  * other IEEE 754 compliant platforms the conversion can be accelerated by
315  * bit shifting the exponent and mantissa. There are also some SSE-based
316  * assembly routines out there.
317  *
318  * See GL_NV_half_float for a reference of the FLOAT16 / GL_HALF format
319  */
320 static inline float float_16_to_32(const unsigned short *in)
321 {
322     const unsigned short s = ((*in) & 0x8000u);
323     const unsigned short e = ((*in) & 0x7c00u) >> 10;
324     const unsigned short m = (*in) & 0x3ffu;
325     const float sgn = (s ? -1.0f : 1.0f);
326 
327     if(e == 0) {
328         if(m == 0) return sgn * 0.0f; /* +0.0 or -0.0 */
329         else return sgn * powf(2, -14.0f) * ((float)m / 1024.0f);
330     } else if(e < 31) {
331         return sgn * powf(2, (float)e - 15.0f) * (1.0f + ((float)m / 1024.0f));
332     } else {
333         if(m == 0) return sgn * INFINITY;
334         else return NAN;
335     }
336 }
337 
338 static inline float float_24_to_32(DWORD in)
339 {
340     const float sgn = in & 0x800000u ? -1.0f : 1.0f;
341     const unsigned short e = (in & 0x780000u) >> 19;
342     const unsigned int m = in & 0x7ffffu;
343 
344     if (e == 0)
345     {
346         if (m == 0) return sgn * 0.0f; /* +0.0 or -0.0 */
347         else return sgn * powf(2, -6.0f) * ((float)m / 524288.0f);
348     }
349     else if (e < 15)
350     {
351         return sgn * powf(2, (float)e - 7.0f) * (1.0f + ((float)m / 524288.0f));
352     }
353     else
354     {
355         if (m == 0) return sgn * INFINITY;
356         else return NAN;
357     }
358 }
359 
360 static inline unsigned int wined3d_popcount(unsigned int x)
361 {
362 #ifdef HAVE___BUILTIN_POPCOUNT
363     return __builtin_popcount(x);
364 #else
365     x -= x >> 1 & 0x55555555;
366     x = (x & 0x33333333) + (x >> 2 & 0x33333333);
367     return ((x + (x >> 4)) & 0x0f0f0f0f) * 0x01010101 >> 24;
368 #endif
369 }
370 
371 static inline void wined3d_pause(void)
372 {
373 #ifdef __REACTOS__
374     Sleep(0);
375 #else
376 #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
377     __asm__ __volatile__( "rep;nop" : : : "memory" );
378 #endif
379 #endif
380 }
381 
382 #define ORM_BACKBUFFER  0
383 #define ORM_FBO         1
384 
385 #define PCI_VENDOR_NONE 0xffff /* e.g. 0x8086 for Intel and 0x10de for Nvidia */
386 #define PCI_DEVICE_NONE 0xffff /* e.g. 0x14f for a Geforce6200 */
387 
388 /* NOTE: When adding fields to this structure, make sure to update the default
389  * values in wined3d_main.c as well. */
390 struct wined3d_settings
391 {
392     unsigned int cs_multithreaded;
393     BOOL explicit_gl_version;
394     DWORD max_gl_version;
395     BOOL glslRequested;
396     int offscreen_rendering_mode;
397     unsigned short pci_vendor_id;
398     unsigned short pci_device_id;
399     /* Memory tracking and object counting. */
400     UINT64 emulated_textureram;
401     char *logo;
402     unsigned int multisample_textures;
403     unsigned int sample_count;
404     BOOL check_float_constants;
405     unsigned int max_sm_vs;
406     unsigned int max_sm_hs;
407     unsigned int max_sm_ds;
408     unsigned int max_sm_gs;
409     unsigned int max_sm_ps;
410     unsigned int max_sm_cs;
411     BOOL no_3d;
412 };
413 
414 extern struct wined3d_settings wined3d_settings DECLSPEC_HIDDEN;
415 
416 enum wined3d_shader_resource_type
417 {
418     WINED3D_SHADER_RESOURCE_NONE,
419     WINED3D_SHADER_RESOURCE_BUFFER,
420     WINED3D_SHADER_RESOURCE_TEXTURE_1D,
421     WINED3D_SHADER_RESOURCE_TEXTURE_2D,
422     WINED3D_SHADER_RESOURCE_TEXTURE_2DMS,
423     WINED3D_SHADER_RESOURCE_TEXTURE_3D,
424     WINED3D_SHADER_RESOURCE_TEXTURE_CUBE,
425     WINED3D_SHADER_RESOURCE_TEXTURE_1DARRAY,
426     WINED3D_SHADER_RESOURCE_TEXTURE_2DARRAY,
427     WINED3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY,
428     WINED3D_SHADER_RESOURCE_TEXTURE_CUBEARRAY,
429 };
430 
431 #define WINED3D_SHADER_CONST_VS_F            0x00000001
432 #define WINED3D_SHADER_CONST_VS_I            0x00000002
433 #define WINED3D_SHADER_CONST_VS_B            0x00000004
434 #define WINED3D_SHADER_CONST_VS_CLIP_PLANES  0x00000008
435 #define WINED3D_SHADER_CONST_VS_POINTSIZE    0x00000010
436 #define WINED3D_SHADER_CONST_POS_FIXUP       0x00000020
437 #define WINED3D_SHADER_CONST_PS_F            0x00000040
438 #define WINED3D_SHADER_CONST_PS_I            0x00000080
439 #define WINED3D_SHADER_CONST_PS_B            0x00000100
440 #define WINED3D_SHADER_CONST_PS_BUMP_ENV     0x00000200
441 #define WINED3D_SHADER_CONST_PS_FOG          0x00000400
442 #define WINED3D_SHADER_CONST_PS_ALPHA_TEST   0x00000800
443 #define WINED3D_SHADER_CONST_PS_Y_CORR       0x00001000
444 #define WINED3D_SHADER_CONST_PS_NP2_FIXUP    0x00002000
445 #define WINED3D_SHADER_CONST_FFP_MODELVIEW   0x00004000
446 #define WINED3D_SHADER_CONST_FFP_PROJ        0x00010000
447 #define WINED3D_SHADER_CONST_FFP_TEXMATRIX   0x00020000
448 #define WINED3D_SHADER_CONST_FFP_MATERIAL    0x00040000
449 #define WINED3D_SHADER_CONST_FFP_LIGHTS      0x00080000
450 #define WINED3D_SHADER_CONST_FFP_PS          0x00100000
451 #define WINED3D_SHADER_CONST_FFP_COLOR_KEY   0x00200000
452 #define WINED3D_SHADER_CONST_FFP_VERTEXBLEND 0xff000000
453 #define WINED3D_SHADER_CONST_FFP_VERTEXBLEND_INDEX(i) (0x01000000 << ((i) - 1))
454 
455 enum wined3d_shader_register_type
456 {
457     WINED3DSPR_TEMP = 0,
458     WINED3DSPR_INPUT = 1,
459     WINED3DSPR_CONST = 2,
460     WINED3DSPR_ADDR = 3,
461     WINED3DSPR_TEXTURE = 3,
462     WINED3DSPR_RASTOUT = 4,
463     WINED3DSPR_ATTROUT = 5,
464     WINED3DSPR_TEXCRDOUT = 6,
465     WINED3DSPR_OUTPUT = 6,
466     WINED3DSPR_CONSTINT = 7,
467     WINED3DSPR_COLOROUT = 8,
468     WINED3DSPR_DEPTHOUT = 9,
469     WINED3DSPR_SAMPLER = 10,
470     WINED3DSPR_CONST2 = 11,
471     WINED3DSPR_CONST3 = 12,
472     WINED3DSPR_CONST4 = 13,
473     WINED3DSPR_CONSTBOOL = 14,
474     WINED3DSPR_LOOP = 15,
475     WINED3DSPR_TEMPFLOAT16 = 16,
476     WINED3DSPR_MISCTYPE = 17,
477     WINED3DSPR_LABEL = 18,
478     WINED3DSPR_PREDICATE = 19,
479     WINED3DSPR_IMMCONST,
480     WINED3DSPR_CONSTBUFFER,
481     WINED3DSPR_IMMCONSTBUFFER,
482     WINED3DSPR_PRIMID,
483     WINED3DSPR_NULL,
484     WINED3DSPR_RESOURCE,
485     WINED3DSPR_UAV,
486     WINED3DSPR_OUTPOINTID,
487     WINED3DSPR_FORKINSTID,
488     WINED3DSPR_JOININSTID,
489     WINED3DSPR_INCONTROLPOINT,
490     WINED3DSPR_OUTCONTROLPOINT,
491     WINED3DSPR_PATCHCONST,
492     WINED3DSPR_TESSCOORD,
493     WINED3DSPR_GROUPSHAREDMEM,
494     WINED3DSPR_THREADID,
495     WINED3DSPR_THREADGROUPID,
496     WINED3DSPR_LOCALTHREADID,
497     WINED3DSPR_LOCALTHREADINDEX,
498     WINED3DSPR_IDXTEMP,
499     WINED3DSPR_STREAM,
500     WINED3DSPR_FUNCTIONBODY,
501     WINED3DSPR_FUNCTIONPOINTER,
502     WINED3DSPR_COVERAGE,
503     WINED3DSPR_SAMPLEMASK,
504     WINED3DSPR_GSINSTID,
505     WINED3DSPR_DEPTHOUTGE,
506     WINED3DSPR_DEPTHOUTLE,
507     WINED3DSPR_RASTERIZER,
508 };
509 
510 enum wined3d_data_type
511 {
512     WINED3D_DATA_FLOAT,
513     WINED3D_DATA_INT,
514     WINED3D_DATA_RESOURCE,
515     WINED3D_DATA_SAMPLER,
516     WINED3D_DATA_UAV,
517     WINED3D_DATA_UINT,
518     WINED3D_DATA_UNORM,
519     WINED3D_DATA_SNORM,
520     WINED3D_DATA_OPAQUE,
521 };
522 
523 enum wined3d_immconst_type
524 {
525     WINED3D_IMMCONST_SCALAR,
526     WINED3D_IMMCONST_VEC4,
527 };
528 
529 #define WINED3DSP_NOSWIZZLE (0u | (1u << 2) | (2u << 4) | (3u << 6))
530 
531 enum wined3d_shader_src_modifier
532 {
533     WINED3DSPSM_NONE = 0,
534     WINED3DSPSM_NEG = 1,
535     WINED3DSPSM_BIAS = 2,
536     WINED3DSPSM_BIASNEG = 3,
537     WINED3DSPSM_SIGN = 4,
538     WINED3DSPSM_SIGNNEG = 5,
539     WINED3DSPSM_COMP = 6,
540     WINED3DSPSM_X2 = 7,
541     WINED3DSPSM_X2NEG = 8,
542     WINED3DSPSM_DZ = 9,
543     WINED3DSPSM_DW = 10,
544     WINED3DSPSM_ABS = 11,
545     WINED3DSPSM_ABSNEG = 12,
546     WINED3DSPSM_NOT = 13,
547 };
548 
549 #define WINED3DSP_WRITEMASK_0   0x1u /* .x r */
550 #define WINED3DSP_WRITEMASK_1   0x2u /* .y g */
551 #define WINED3DSP_WRITEMASK_2   0x4u /* .z b */
552 #define WINED3DSP_WRITEMASK_3   0x8u /* .w a */
553 #define WINED3DSP_WRITEMASK_ALL 0xfu /* all */
554 
555 enum wined3d_shader_dst_modifier
556 {
557     WINED3DSPDM_NONE = 0,
558     WINED3DSPDM_SATURATE = 1,
559     WINED3DSPDM_PARTIALPRECISION = 2,
560     WINED3DSPDM_MSAMPCENTROID = 4,
561 };
562 
563 enum wined3d_shader_interpolation_mode
564 {
565     WINED3DSIM_NONE = 0,
566     WINED3DSIM_CONSTANT = 1,
567     WINED3DSIM_LINEAR = 2,
568     WINED3DSIM_LINEAR_CENTROID = 3,
569     WINED3DSIM_LINEAR_NOPERSPECTIVE = 4,
570     WINED3DSIM_LINEAR_NOPERSPECTIVE_CENTROID = 5,
571     WINED3DSIM_LINEAR_SAMPLE = 6,
572     WINED3DSIM_LINEAR_NOPERSPECTIVE_SAMPLE = 7,
573 };
574 
575 #define WINED3D_PACKED_INTERPOLATION_SIZE 3
576 #define WINED3D_PACKED_INTERPOLATION_BIT_COUNT 3
577 
578 enum wined3d_shader_global_flags
579 {
580     WINED3DSGF_REFACTORING_ALLOWED               = 0x1,
581     WINED3DSGF_FORCE_EARLY_DEPTH_STENCIL         = 0x4,
582     WINED3DSGF_ENABLE_RAW_AND_STRUCTURED_BUFFERS = 0x8,
583 };
584 
585 enum wined3d_shader_sync_flags
586 {
587     WINED3DSSF_THREAD_GROUP        = 0x1,
588     WINED3DSSF_GROUP_SHARED_MEMORY = 0x2,
589 };
590 
591 enum wined3d_shader_uav_flags
592 {
593     WINED3DSUF_GLOBALLY_COHERENT = 0x2,
594     WINED3DSUF_ORDER_PRESERVING_COUNTER = 0x100,
595 };
596 
597 enum wined3d_tessellator_domain
598 {
599     WINED3D_TESSELLATOR_DOMAIN_LINE      = 1,
600     WINED3D_TESSELLATOR_DOMAIN_TRIANGLE  = 2,
601     WINED3D_TESSELLATOR_DOMAIN_QUAD      = 3,
602 };
603 
604 enum wined3d_tessellator_output_primitive
605 {
606     WINED3D_TESSELLATOR_OUTPUT_POINT        = 1,
607     WINED3D_TESSELLATOR_OUTPUT_LINE         = 2,
608     WINED3D_TESSELLATOR_OUTPUT_TRIANGLE_CW  = 3,
609     WINED3D_TESSELLATOR_OUTPUT_TRIANGLE_CCW = 4,
610 };
611 
612 enum wined3d_tessellator_partitioning
613 {
614     WINED3D_TESSELLATOR_PARTITIONING_INTEGER         = 1,
615     WINED3D_TESSELLATOR_PARTITIONING_POW2            = 2,
616     WINED3D_TESSELLATOR_PARTITIONING_FRACTIONAL_ODD  = 3,
617     WINED3D_TESSELLATOR_PARTITIONING_FRACTIONAL_EVEN = 4,
618 };
619 
620 /* Undocumented opcode control to identify projective texture lookups in ps 2.0 and later */
621 #define WINED3DSI_TEXLD_PROJECT     0x1
622 #define WINED3DSI_TEXLD_BIAS        0x2
623 #define WINED3DSI_INDEXED_DYNAMIC   0x4
624 #define WINED3DSI_RESINFO_RCP_FLOAT 0x1
625 #define WINED3DSI_RESINFO_UINT      0x2
626 #define WINED3DSI_SAMPLE_INFO_UINT  0x1
627 #define WINED3DSI_SAMPLER_COMPARISON_MODE 0x1
628 
629 #define WINED3DSI_PRECISE_X         0x100
630 #define WINED3DSI_PRECISE_Y         0x200
631 #define WINED3DSI_PRECISE_Z         0x400
632 #define WINED3DSI_PRECISE_W         0x800
633 #define WINED3DSI_PRECISE_XYZW      (WINED3DSI_PRECISE_X | WINED3DSI_PRECISE_Y \
634                                     | WINED3DSI_PRECISE_Z | WINED3DSI_PRECISE_W)
635 #define WINED3DSI_PRECISE_SHIFT     8
636 
637 enum wined3d_shader_rel_op
638 {
639     WINED3D_SHADER_REL_OP_GT = 1,
640     WINED3D_SHADER_REL_OP_EQ = 2,
641     WINED3D_SHADER_REL_OP_GE = 3,
642     WINED3D_SHADER_REL_OP_LT = 4,
643     WINED3D_SHADER_REL_OP_NE = 5,
644     WINED3D_SHADER_REL_OP_LE = 6,
645 };
646 
647 enum wined3d_shader_conditional_op
648 {
649     WINED3D_SHADER_CONDITIONAL_OP_NZ = 0,
650     WINED3D_SHADER_CONDITIONAL_OP_Z  = 1
651 };
652 
653 #define WINED3D_SM1_VS  0xfffeu
654 #define WINED3D_SM1_PS  0xffffu
655 #define WINED3D_SM4_PS  0x0000u
656 #define WINED3D_SM4_VS  0x0001u
657 #define WINED3D_SM4_GS  0x0002u
658 #define WINED3D_SM5_HS  0x0003u
659 #define WINED3D_SM5_DS  0x0004u
660 #define WINED3D_SM5_CS  0x0005u
661 
662 /* Shader version tokens, and shader end tokens */
663 #define WINED3DPS_VERSION(major, minor) ((WINED3D_SM1_PS << 16) | ((major) << 8) | (minor))
664 #define WINED3DVS_VERSION(major, minor) ((WINED3D_SM1_VS << 16) | ((major) << 8) | (minor))
665 
666 /* Shader backends */
667 
668 /* TODO: Make this dynamic, based on shader limits ? */
669 #define MAX_ATTRIBS 16
670 #define MAX_REG_ADDR 1
671 #define MAX_REG_TEXCRD 8
672 #define MAX_REG_INPUT 32
673 #define MAX_REG_OUTPUT 32
674 #define WINED3D_MAX_CBS 15
675 #define WINED3D_MAX_CONSTS_B 16
676 #define WINED3D_MAX_CONSTS_I 16
677 #define WINED3D_MAX_VS_CONSTS_F 256
678 #define WINED3D_MAX_PS_CONSTS_F 224
679 
680 /* FIXME: This needs to go up to 2048 for
681  * Shader model 3 according to msdn (and for software shaders) */
682 #define MAX_LABELS 16
683 
684 #define MAX_IMMEDIATE_CONSTANT_BUFFER_SIZE 4096
685 
686 struct wined3d_string_buffer
687 {
688     struct list entry;
689     char *buffer;
690     unsigned int buffer_size;
691     unsigned int content_size;
692 };
693 
694 enum WINED3D_SHADER_INSTRUCTION_HANDLER
695 {
696     WINED3DSIH_ABS,
697     WINED3DSIH_ADD,
698     WINED3DSIH_AND,
699     WINED3DSIH_ATOMIC_AND,
700     WINED3DSIH_ATOMIC_CMP_STORE,
701     WINED3DSIH_ATOMIC_IADD,
702     WINED3DSIH_ATOMIC_IMAX,
703     WINED3DSIH_ATOMIC_IMIN,
704     WINED3DSIH_ATOMIC_OR,
705     WINED3DSIH_ATOMIC_UMAX,
706     WINED3DSIH_ATOMIC_UMIN,
707     WINED3DSIH_ATOMIC_XOR,
708     WINED3DSIH_BEM,
709     WINED3DSIH_BFI,
710     WINED3DSIH_BFREV,
711     WINED3DSIH_BREAK,
712     WINED3DSIH_BREAKC,
713     WINED3DSIH_BREAKP,
714     WINED3DSIH_BUFINFO,
715     WINED3DSIH_CALL,
716     WINED3DSIH_CALLNZ,
717     WINED3DSIH_CASE,
718     WINED3DSIH_CMP,
719     WINED3DSIH_CND,
720     WINED3DSIH_CONTINUE,
721     WINED3DSIH_CONTINUEP,
722     WINED3DSIH_COUNTBITS,
723     WINED3DSIH_CRS,
724     WINED3DSIH_CUT,
725     WINED3DSIH_CUT_STREAM,
726     WINED3DSIH_DCL,
727     WINED3DSIH_DCL_CONSTANT_BUFFER,
728     WINED3DSIH_DCL_FUNCTION_BODY,
729     WINED3DSIH_DCL_FUNCTION_TABLE,
730     WINED3DSIH_DCL_GLOBAL_FLAGS,
731     WINED3DSIH_DCL_GS_INSTANCES,
732     WINED3DSIH_DCL_HS_FORK_PHASE_INSTANCE_COUNT,
733     WINED3DSIH_DCL_HS_JOIN_PHASE_INSTANCE_COUNT,
734     WINED3DSIH_DCL_HS_MAX_TESSFACTOR,
735     WINED3DSIH_DCL_IMMEDIATE_CONSTANT_BUFFER,
736     WINED3DSIH_DCL_INDEX_RANGE,
737     WINED3DSIH_DCL_INDEXABLE_TEMP,
738     WINED3DSIH_DCL_INPUT,
739     WINED3DSIH_DCL_INPUT_CONTROL_POINT_COUNT,
740     WINED3DSIH_DCL_INPUT_PRIMITIVE,
741     WINED3DSIH_DCL_INPUT_PS,
742     WINED3DSIH_DCL_INPUT_PS_SGV,
743     WINED3DSIH_DCL_INPUT_PS_SIV,
744     WINED3DSIH_DCL_INPUT_SGV,
745     WINED3DSIH_DCL_INPUT_SIV,
746     WINED3DSIH_DCL_INTERFACE,
747     WINED3DSIH_DCL_OUTPUT,
748     WINED3DSIH_DCL_OUTPUT_CONTROL_POINT_COUNT,
749     WINED3DSIH_DCL_OUTPUT_SIV,
750     WINED3DSIH_DCL_OUTPUT_TOPOLOGY,
751     WINED3DSIH_DCL_RESOURCE_RAW,
752     WINED3DSIH_DCL_RESOURCE_STRUCTURED,
753     WINED3DSIH_DCL_SAMPLER,
754     WINED3DSIH_DCL_STREAM,
755     WINED3DSIH_DCL_TEMPS,
756     WINED3DSIH_DCL_TESSELLATOR_DOMAIN,
757     WINED3DSIH_DCL_TESSELLATOR_OUTPUT_PRIMITIVE,
758     WINED3DSIH_DCL_TESSELLATOR_PARTITIONING,
759     WINED3DSIH_DCL_TGSM_RAW,
760     WINED3DSIH_DCL_TGSM_STRUCTURED,
761     WINED3DSIH_DCL_THREAD_GROUP,
762     WINED3DSIH_DCL_UAV_RAW,
763     WINED3DSIH_DCL_UAV_STRUCTURED,
764     WINED3DSIH_DCL_UAV_TYPED,
765     WINED3DSIH_DCL_VERTICES_OUT,
766     WINED3DSIH_DEF,
767     WINED3DSIH_DEFAULT,
768     WINED3DSIH_DEFB,
769     WINED3DSIH_DEFI,
770     WINED3DSIH_DIV,
771     WINED3DSIH_DP2,
772     WINED3DSIH_DP2ADD,
773     WINED3DSIH_DP3,
774     WINED3DSIH_DP4,
775     WINED3DSIH_DST,
776     WINED3DSIH_DSX,
777     WINED3DSIH_DSX_COARSE,
778     WINED3DSIH_DSX_FINE,
779     WINED3DSIH_DSY,
780     WINED3DSIH_DSY_COARSE,
781     WINED3DSIH_DSY_FINE,
782     WINED3DSIH_EVAL_SAMPLE_INDEX,
783     WINED3DSIH_ELSE,
784     WINED3DSIH_EMIT,
785     WINED3DSIH_EMIT_STREAM,
786     WINED3DSIH_ENDIF,
787     WINED3DSIH_ENDLOOP,
788     WINED3DSIH_ENDREP,
789     WINED3DSIH_ENDSWITCH,
790     WINED3DSIH_EQ,
791     WINED3DSIH_EXP,
792     WINED3DSIH_EXPP,
793     WINED3DSIH_F16TOF32,
794     WINED3DSIH_F32TOF16,
795     WINED3DSIH_FCALL,
796     WINED3DSIH_FIRSTBIT_HI,
797     WINED3DSIH_FIRSTBIT_LO,
798     WINED3DSIH_FIRSTBIT_SHI,
799     WINED3DSIH_FRC,
800     WINED3DSIH_FTOI,
801     WINED3DSIH_FTOU,
802     WINED3DSIH_GATHER4,
803     WINED3DSIH_GATHER4_C,
804     WINED3DSIH_GATHER4_PO,
805     WINED3DSIH_GATHER4_PO_C,
806     WINED3DSIH_GE,
807     WINED3DSIH_HS_CONTROL_POINT_PHASE,
808     WINED3DSIH_HS_DECLS,
809     WINED3DSIH_HS_FORK_PHASE,
810     WINED3DSIH_HS_JOIN_PHASE,
811     WINED3DSIH_IADD,
812     WINED3DSIH_IBFE,
813     WINED3DSIH_IEQ,
814     WINED3DSIH_IF,
815     WINED3DSIH_IFC,
816     WINED3DSIH_IGE,
817     WINED3DSIH_ILT,
818     WINED3DSIH_IMAD,
819     WINED3DSIH_IMAX,
820     WINED3DSIH_IMIN,
821     WINED3DSIH_IMM_ATOMIC_ALLOC,
822     WINED3DSIH_IMM_ATOMIC_AND,
823     WINED3DSIH_IMM_ATOMIC_CMP_EXCH,
824     WINED3DSIH_IMM_ATOMIC_CONSUME,
825     WINED3DSIH_IMM_ATOMIC_EXCH,
826     WINED3DSIH_IMM_ATOMIC_IADD,
827     WINED3DSIH_IMM_ATOMIC_IMAX,
828     WINED3DSIH_IMM_ATOMIC_IMIN,
829     WINED3DSIH_IMM_ATOMIC_OR,
830     WINED3DSIH_IMM_ATOMIC_UMAX,
831     WINED3DSIH_IMM_ATOMIC_UMIN,
832     WINED3DSIH_IMM_ATOMIC_XOR,
833     WINED3DSIH_IMUL,
834     WINED3DSIH_INE,
835     WINED3DSIH_INEG,
836     WINED3DSIH_ISHL,
837     WINED3DSIH_ISHR,
838     WINED3DSIH_ITOF,
839     WINED3DSIH_LABEL,
840     WINED3DSIH_LD,
841     WINED3DSIH_LD2DMS,
842     WINED3DSIH_LD_RAW,
843     WINED3DSIH_LD_STRUCTURED,
844     WINED3DSIH_LD_UAV_TYPED,
845     WINED3DSIH_LIT,
846     WINED3DSIH_LOD,
847     WINED3DSIH_LOG,
848     WINED3DSIH_LOGP,
849     WINED3DSIH_LOOP,
850     WINED3DSIH_LRP,
851     WINED3DSIH_LT,
852     WINED3DSIH_M3x2,
853     WINED3DSIH_M3x3,
854     WINED3DSIH_M3x4,
855     WINED3DSIH_M4x3,
856     WINED3DSIH_M4x4,
857     WINED3DSIH_MAD,
858     WINED3DSIH_MAX,
859     WINED3DSIH_MIN,
860     WINED3DSIH_MOV,
861     WINED3DSIH_MOVA,
862     WINED3DSIH_MOVC,
863     WINED3DSIH_MUL,
864     WINED3DSIH_NE,
865     WINED3DSIH_NOP,
866     WINED3DSIH_NOT,
867     WINED3DSIH_NRM,
868     WINED3DSIH_OR,
869     WINED3DSIH_PHASE,
870     WINED3DSIH_POW,
871     WINED3DSIH_RCP,
872     WINED3DSIH_REP,
873     WINED3DSIH_RESINFO,
874     WINED3DSIH_RET,
875     WINED3DSIH_RETP,
876     WINED3DSIH_ROUND_NE,
877     WINED3DSIH_ROUND_NI,
878     WINED3DSIH_ROUND_PI,
879     WINED3DSIH_ROUND_Z,
880     WINED3DSIH_RSQ,
881     WINED3DSIH_SAMPLE,
882     WINED3DSIH_SAMPLE_B,
883     WINED3DSIH_SAMPLE_C,
884     WINED3DSIH_SAMPLE_C_LZ,
885     WINED3DSIH_SAMPLE_GRAD,
886     WINED3DSIH_SAMPLE_INFO,
887     WINED3DSIH_SAMPLE_LOD,
888     WINED3DSIH_SAMPLE_POS,
889     WINED3DSIH_SETP,
890     WINED3DSIH_SGE,
891     WINED3DSIH_SGN,
892     WINED3DSIH_SINCOS,
893     WINED3DSIH_SLT,
894     WINED3DSIH_SQRT,
895     WINED3DSIH_STORE_RAW,
896     WINED3DSIH_STORE_STRUCTURED,
897     WINED3DSIH_STORE_UAV_TYPED,
898     WINED3DSIH_SUB,
899     WINED3DSIH_SWAPC,
900     WINED3DSIH_SWITCH,
901     WINED3DSIH_SYNC,
902     WINED3DSIH_TEX,
903     WINED3DSIH_TEXBEM,
904     WINED3DSIH_TEXBEML,
905     WINED3DSIH_TEXCOORD,
906     WINED3DSIH_TEXDEPTH,
907     WINED3DSIH_TEXDP3,
908     WINED3DSIH_TEXDP3TEX,
909     WINED3DSIH_TEXKILL,
910     WINED3DSIH_TEXLDD,
911     WINED3DSIH_TEXLDL,
912     WINED3DSIH_TEXM3x2DEPTH,
913     WINED3DSIH_TEXM3x2PAD,
914     WINED3DSIH_TEXM3x2TEX,
915     WINED3DSIH_TEXM3x3,
916     WINED3DSIH_TEXM3x3DIFF,
917     WINED3DSIH_TEXM3x3PAD,
918     WINED3DSIH_TEXM3x3SPEC,
919     WINED3DSIH_TEXM3x3TEX,
920     WINED3DSIH_TEXM3x3VSPEC,
921     WINED3DSIH_TEXREG2AR,
922     WINED3DSIH_TEXREG2GB,
923     WINED3DSIH_TEXREG2RGB,
924     WINED3DSIH_UBFE,
925     WINED3DSIH_UDIV,
926     WINED3DSIH_UGE,
927     WINED3DSIH_ULT,
928     WINED3DSIH_UMAX,
929     WINED3DSIH_UMIN,
930     WINED3DSIH_UMUL,
931     WINED3DSIH_USHR,
932     WINED3DSIH_UTOF,
933     WINED3DSIH_XOR,
934     WINED3DSIH_TABLE_SIZE
935 };
936 
937 enum wined3d_shader_type
938 {
939     WINED3D_SHADER_TYPE_PIXEL,
940     WINED3D_SHADER_TYPE_VERTEX,
941     WINED3D_SHADER_TYPE_GEOMETRY,
942     WINED3D_SHADER_TYPE_HULL,
943     WINED3D_SHADER_TYPE_DOMAIN,
944     WINED3D_SHADER_TYPE_GRAPHICS_COUNT,
945 
946     WINED3D_SHADER_TYPE_COMPUTE = WINED3D_SHADER_TYPE_GRAPHICS_COUNT,
947     WINED3D_SHADER_TYPE_COUNT,
948     WINED3D_SHADER_TYPE_INVALID = WINED3D_SHADER_TYPE_COUNT,
949 };
950 
951 struct wined3d_shader_version
952 {
953     enum wined3d_shader_type type;
954     BYTE major;
955     BYTE minor;
956 };
957 
958 struct wined3d_shader_resource_info
959 {
960     enum wined3d_shader_resource_type type;
961     enum wined3d_data_type data_type;
962     unsigned int flags;
963     unsigned int stride;
964 };
965 
966 #define WINED3D_SAMPLER_DEFAULT ~0x0u
967 
968 struct wined3d_shader_sampler_map_entry
969 {
970     unsigned int resource_idx;
971     unsigned int sampler_idx;
972     unsigned int bind_idx;
973 };
974 
975 struct wined3d_shader_sampler_map
976 {
977     struct wined3d_shader_sampler_map_entry *entries;
978     size_t size;
979     size_t count;
980 };
981 
982 struct wined3d_shader_immediate_constant_buffer
983 {
984     unsigned int vec4_count;
985     DWORD data[MAX_IMMEDIATE_CONSTANT_BUFFER_SIZE];
986 };
987 
988 struct wined3d_shader_indexable_temp
989 {
990     struct list entry;
991     unsigned int register_idx;
992     unsigned int register_size;
993     unsigned int component_count;
994 };
995 
996 #define WINED3D_SHADER_VERSION(major, minor) (((major) << 8) | (minor))
997 
998 struct wined3d_shader_reg_maps
999 {
1000     struct wined3d_shader_version shader_version;
1001     BYTE texcoord;                                  /* MAX_REG_TEXCRD, 8 */
1002     BYTE address;                                   /* MAX_REG_ADDR, 1 */
1003     WORD labels;                                    /* MAX_LABELS, 16 */
1004     DWORD temporary;                                /* 32 */
1005     unsigned int temporary_count;
1006     DWORD *constf;                                  /* pixel, vertex */
1007     struct list indexable_temps;
1008     const struct wined3d_shader_immediate_constant_buffer *icb;
1009     union
1010     {
1011         DWORD texcoord_mask[MAX_REG_TEXCRD];        /* vertex < 3.0 */
1012         BYTE output_registers_mask[MAX_REG_OUTPUT]; /* vertex >= 3.0 */
1013     } u;
1014     DWORD input_registers;                          /* max(MAX_REG_INPUT, MAX_ATTRIBS), 32 */
1015     DWORD output_registers;                         /* MAX_REG_OUTPUT, 32 */
1016     WORD integer_constants;                         /* WINED3D_MAX_CONSTS_I, 16 */
1017     WORD boolean_constants;                         /* WINED3D_MAX_CONSTS_B, 16 */
1018     WORD local_int_consts;                          /* WINED3D_MAX_CONSTS_I, 16 */
1019     WORD local_bool_consts;                         /* WINED3D_MAX_CONSTS_B, 16 */
1020     UINT cb_sizes[WINED3D_MAX_CBS];
1021 
1022     struct wined3d_shader_resource_info resource_info[MAX_SHADER_RESOURCE_VIEWS];
1023     struct wined3d_shader_sampler_map sampler_map;
1024     DWORD sampler_comparison_mode;
1025     BYTE bumpmat;                                   /* MAX_TEXTURES, 8 */
1026     BYTE luminanceparams;                           /* MAX_TEXTURES, 8 */
1027     struct wined3d_shader_resource_info uav_resource_info[MAX_UNORDERED_ACCESS_VIEWS];
1028     DWORD uav_read_mask : 8;                        /* MAX_UNORDERED_ACCESS_VIEWS, 8 */
1029     DWORD uav_counter_mask : 8;                     /* MAX_UNORDERED_ACCESS_VIEWS, 8 */
1030 
1031     DWORD clip_distance_mask : 8;                   /* MAX_CLIP_DISTANCES, 8 */
1032     DWORD cull_distance_mask : 8;                   /* MAX_CLIP_DISTANCES, 8 */
1033     DWORD usesnrm        : 1;
1034     DWORD vpos           : 1;
1035     DWORD usesdsx        : 1;
1036     DWORD usesdsy        : 1;
1037     DWORD usestexldd     : 1;
1038     DWORD usesmova       : 1;
1039     DWORD usesfacing     : 1;
1040     DWORD usesrelconstF  : 1;
1041     DWORD fog            : 1;
1042     DWORD usestexldl     : 1;
1043     DWORD usesifc        : 1;
1044     DWORD usescall       : 1;
1045     DWORD usespow        : 1;
1046     DWORD point_size     : 1;
1047     DWORD vocp           : 1;
1048     DWORD input_rel_addressing : 1;
1049     DWORD viewport_array : 1;
1050     DWORD sample_mask    : 1;
1051     DWORD padding        : 14;
1052 
1053     DWORD rt_mask; /* Used render targets, 32 max. */
1054 
1055     /* Whether or not loops are used in this shader, and nesting depth */
1056     unsigned int loop_depth;
1057     unsigned int min_rel_offset, max_rel_offset;
1058 
1059     struct wined3d_shader_tgsm *tgsm;
1060     SIZE_T tgsm_capacity;
1061     unsigned int tgsm_count;
1062 };
1063 
1064 /* Keeps track of details for TEX_M#x# instructions which need to maintain
1065  * state information between multiple instructions. */
1066 struct wined3d_shader_tex_mx
1067 {
1068     unsigned int current_row;
1069     DWORD texcoord_w[2];
1070 };
1071 
1072 struct wined3d_shader_parser_state
1073 {
1074     unsigned int current_loop_depth;
1075     unsigned int current_loop_reg;
1076     BOOL in_subroutine;
1077 };
1078 
1079 struct wined3d_shader_context
1080 {
1081     const struct wined3d_shader *shader;
1082     const struct wined3d_gl_info *gl_info;
1083     const struct wined3d_shader_reg_maps *reg_maps;
1084     struct wined3d_string_buffer *buffer;
1085     struct wined3d_shader_tex_mx *tex_mx;
1086     struct wined3d_shader_parser_state *state;
1087     void *backend_data;
1088 };
1089 
1090 struct wined3d_shader_register_index
1091 {
1092     const struct wined3d_shader_src_param *rel_addr;
1093     unsigned int offset;
1094 };
1095 
1096 struct wined3d_shader_register
1097 {
1098     enum wined3d_shader_register_type type;
1099     enum wined3d_data_type data_type;
1100     struct wined3d_shader_register_index idx[2];
1101     enum wined3d_immconst_type immconst_type;
1102     union
1103     {
1104         DWORD immconst_data[4];
1105         unsigned fp_body_idx;
1106     } u;
1107 };
1108 
1109 struct wined3d_shader_dst_param
1110 {
1111     struct wined3d_shader_register reg;
1112     DWORD write_mask;
1113     DWORD modifiers;
1114     DWORD shift;
1115 };
1116 
1117 struct wined3d_shader_src_param
1118 {
1119     struct wined3d_shader_register reg;
1120     DWORD swizzle;
1121     enum wined3d_shader_src_modifier modifiers;
1122 };
1123 
1124 struct wined3d_shader_index_range
1125 {
1126     struct wined3d_shader_dst_param first_register;
1127     unsigned int last_register;
1128 };
1129 
1130 struct wined3d_shader_semantic
1131 {
1132     enum wined3d_decl_usage usage;
1133     UINT usage_idx;
1134     enum wined3d_shader_resource_type resource_type;
1135     enum wined3d_data_type resource_data_type;
1136     struct wined3d_shader_dst_param reg;
1137 };
1138 
1139 enum wined3d_shader_input_sysval_semantic
1140 {
1141     WINED3D_SIV_POSITION                     = 1,
1142     WINED3D_SIV_CLIP_DISTANCE                = 2,
1143     WINED3D_SIV_CULL_DISTANCE                = 3,
1144     WINED3D_SIV_RENDER_TARGET_ARRAY_INDEX    = 4,
1145     WINED3D_SIV_VIEWPORT_ARRAY_INDEX         = 5,
1146     WINED3D_SIV_VERTEX_ID                    = 6,
1147     WINED3D_SIV_PRIMITIVE_ID                 = 7,
1148     WINED3D_SIV_INSTANCE_ID                  = 8,
1149     WINED3D_SIV_IS_FRONT_FACE                = 9,
1150     WINED3D_SIV_SAMPLE_INDEX                 = 10,
1151     WINED3D_SIV_QUAD_U0_TESS_FACTOR          = 11,
1152     WINED3D_SIV_QUAD_V0_TESS_FACTOR          = 12,
1153     WINED3D_SIV_QUAD_U1_TESS_FACTOR          = 13,
1154     WINED3D_SIV_QUAD_V1_TESS_FACTOR          = 14,
1155     WINED3D_SIV_QUAD_U_INNER_TESS_FACTOR     = 15,
1156     WINED3D_SIV_QUAD_V_INNER_TESS_FACTOR     = 16,
1157     WINED3D_SIV_TRIANGLE_U_TESS_FACTOR       = 17,
1158     WINED3D_SIV_TRIANGLE_V_TESS_FACTOR       = 18,
1159     WINED3D_SIV_TRIANGLE_W_TESS_FACTOR       = 19,
1160     WINED3D_SIV_TRIANGLE_INNER_TESS_FACTOR   = 20,
1161     WINED3D_SIV_LINE_DETAIL_TESS_FACTOR      = 21,
1162     WINED3D_SIV_LINE_DENSITY_TESS_FACTOR     = 22,
1163 };
1164 
1165 struct wined3d_shader_register_semantic
1166 {
1167     struct wined3d_shader_dst_param reg;
1168     enum wined3d_shader_input_sysval_semantic sysval_semantic;
1169 };
1170 
1171 struct wined3d_shader_structured_resource
1172 {
1173     struct wined3d_shader_dst_param reg;
1174     unsigned int byte_stride;
1175 };
1176 
1177 struct wined3d_shader_tgsm
1178 {
1179     unsigned int size;
1180     unsigned int stride;
1181 };
1182 
1183 struct wined3d_shader_tgsm_raw
1184 {
1185     struct wined3d_shader_dst_param reg;
1186     unsigned int byte_count;
1187 };
1188 
1189 struct wined3d_shader_tgsm_structured
1190 {
1191     struct wined3d_shader_dst_param reg;
1192     unsigned int byte_stride;
1193     unsigned int structure_count;
1194 };
1195 
1196 struct wined3d_shader_thread_group_size
1197 {
1198     unsigned int x, y, z;
1199 };
1200 
1201 struct wined3d_shader_function_table_pointer
1202 {
1203     unsigned int index;
1204     unsigned int array_size;
1205     unsigned int body_count;
1206     unsigned int table_count;
1207 };
1208 
1209 struct wined3d_shader_texel_offset
1210 {
1211     signed char u, v, w;
1212 };
1213 
1214 struct wined3d_shader_primitive_type
1215 {
1216     enum wined3d_primitive_type type;
1217     unsigned int patch_vertex_count;
1218 };
1219 
1220 struct wined3d_shader_instruction
1221 {
1222     const struct wined3d_shader_context *ctx;
1223     enum WINED3D_SHADER_INSTRUCTION_HANDLER handler_idx;
1224     DWORD flags;
1225     unsigned int dst_count;
1226     unsigned int src_count;
1227     const struct wined3d_shader_dst_param *dst;
1228     const struct wined3d_shader_src_param *src;
1229     struct wined3d_shader_texel_offset texel_offset;
1230     BOOL coissue;
1231     const struct wined3d_shader_src_param *predicate;
1232     union
1233     {
1234         struct wined3d_shader_semantic semantic;
1235         struct wined3d_shader_register_semantic register_semantic;
1236         struct wined3d_shader_primitive_type primitive_type;
1237         struct wined3d_shader_dst_param dst;
1238         struct wined3d_shader_src_param src;
1239         unsigned int count;
1240         unsigned int index;
1241         const struct wined3d_shader_immediate_constant_buffer *icb;
1242         struct wined3d_shader_structured_resource structured_resource;
1243         struct wined3d_shader_tgsm_raw tgsm_raw;
1244         struct wined3d_shader_tgsm_structured tgsm_structured;
1245         struct wined3d_shader_thread_group_size thread_group_size;
1246         enum wined3d_tessellator_domain tessellator_domain;
1247         enum wined3d_tessellator_output_primitive tessellator_output_primitive;
1248         enum wined3d_tessellator_partitioning tessellator_partitioning;
1249         float max_tessellation_factor;
1250         struct wined3d_shader_index_range index_range;
1251         struct wined3d_shader_indexable_temp indexable_temp;
1252         struct wined3d_shader_function_table_pointer fp;
1253     } declaration;
1254 };
1255 
1256 static inline BOOL wined3d_shader_instruction_has_texel_offset(const struct wined3d_shader_instruction *ins)
1257 {
1258     return ins->texel_offset.u || ins->texel_offset.v || ins->texel_offset.w;
1259 }
1260 
1261 struct wined3d_shader_attribute
1262 {
1263     enum wined3d_decl_usage usage;
1264     UINT usage_idx;
1265 };
1266 
1267 struct wined3d_shader_loop_control
1268 {
1269     unsigned int count;
1270     unsigned int start;
1271     int step;
1272 };
1273 
1274 struct wined3d_shader_frontend
1275 {
1276     void *(*shader_init)(const DWORD *byte_code, size_t byte_code_size,
1277             const struct wined3d_shader_signature *output_signature);
1278     void (*shader_free)(void *data);
1279     void (*shader_read_header)(void *data, const DWORD **ptr, struct wined3d_shader_version *shader_version);
1280     void (*shader_read_instruction)(void *data, const DWORD **ptr, struct wined3d_shader_instruction *ins);
1281     BOOL (*shader_is_end)(void *data, const DWORD **ptr);
1282 };
1283 
1284 extern const struct wined3d_shader_frontend sm1_shader_frontend DECLSPEC_HIDDEN;
1285 extern const struct wined3d_shader_frontend sm4_shader_frontend DECLSPEC_HIDDEN;
1286 
1287 enum wined3d_shader_type wined3d_get_sm4_shader_type(const DWORD *byte_code,
1288         size_t byte_code_size) DECLSPEC_HIDDEN;
1289 
1290 typedef void (*SHADER_HANDLER)(const struct wined3d_shader_instruction *);
1291 
1292 #define WINED3D_SHADER_CAP_VS_CLIPPING      0x00000001
1293 #define WINED3D_SHADER_CAP_SRGB_WRITE       0x00000002
1294 #define WINED3D_SHADER_CAP_DOUBLE_PRECISION 0x00000004
1295 
1296 struct shader_caps
1297 {
1298     unsigned int vs_version;
1299     unsigned int hs_version;
1300     unsigned int ds_version;
1301     unsigned int gs_version;
1302     unsigned int ps_version;
1303     unsigned int cs_version;
1304 
1305     DWORD vs_uniform_count;
1306     DWORD ps_uniform_count;
1307     float ps_1x_max_value;
1308     DWORD varying_count;
1309 
1310     DWORD wined3d_caps;
1311 };
1312 
1313 enum wined3d_gl_resource_type
1314 {
1315     WINED3D_GL_RES_TYPE_TEX_1D          = 0,
1316     WINED3D_GL_RES_TYPE_TEX_2D          = 1,
1317     WINED3D_GL_RES_TYPE_TEX_3D          = 2,
1318     WINED3D_GL_RES_TYPE_TEX_CUBE        = 3,
1319     WINED3D_GL_RES_TYPE_TEX_RECT        = 4,
1320     WINED3D_GL_RES_TYPE_BUFFER          = 5,
1321     WINED3D_GL_RES_TYPE_RB              = 6,
1322     WINED3D_GL_RES_TYPE_COUNT           = 7,
1323 };
1324 
1325 enum wined3d_vertex_processing_mode
1326 {
1327     WINED3D_VP_MODE_FF,
1328     WINED3D_VP_MODE_SHADER,
1329     WINED3D_VP_MODE_NONE,
1330 };
1331 
1332 #define WINED3D_CONST_NUM_UNUSED ~0U
1333 
1334 enum wined3d_ffp_ps_fog_mode
1335 {
1336     WINED3D_FFP_PS_FOG_OFF,
1337     WINED3D_FFP_PS_FOG_LINEAR,
1338     WINED3D_FFP_PS_FOG_EXP,
1339     WINED3D_FFP_PS_FOG_EXP2,
1340 };
1341 
1342 /* Stateblock dependent parameters which have to be hardcoded
1343  * into the shader code
1344  */
1345 
1346 #define WINED3D_PSARGS_PROJECTED (1u << 3)
1347 #define WINED3D_PSARGS_TEXTRANSFORM_SHIFT 4
1348 #define WINED3D_PSARGS_TEXTRANSFORM_MASK 0xfu
1349 #define WINED3D_PSARGS_TEXTYPE_SHIFT 2
1350 #define WINED3D_PSARGS_TEXTYPE_MASK 0x3u
1351 
1352 /* Used for Shader Model 1 pixel shaders to track the bound texture
1353  * type. 2D and RECT textures are separated through NP2 fixup. */
1354 enum wined3d_shader_tex_types
1355 {
1356     WINED3D_SHADER_TEX_2D   = 0,
1357     WINED3D_SHADER_TEX_3D   = 1,
1358     WINED3D_SHADER_TEX_CUBE = 2,
1359 };
1360 
1361 struct ps_compile_args
1362 {
1363     struct color_fixup_desc     color_fixup[MAX_FRAGMENT_SAMPLERS];
1364     enum wined3d_vertex_processing_mode vp_mode;
1365     enum wined3d_ffp_ps_fog_mode fog;
1366     WORD                        tex_transform; /* ps 1.0-1.3, 4 textures */
1367     WORD                        tex_types; /* ps 1.0 - 1.4, 6 textures */
1368     WORD                        srgb_correction;
1369     /* Bitmap for NP2 texcoord fixups (16 samplers max currently).
1370        D3D9 has a limit of 16 samplers and the fixup is superfluous
1371        in D3D10 (unconditional NP2 support mandatory). */
1372     WORD                        np2_fixup;
1373     WORD shadow; /* MAX_FRAGMENT_SAMPLERS, 16 */
1374     WORD texcoords_initialized; /* MAX_TEXTURES, 8 */
1375     DWORD pointsprite : 1;
1376     DWORD flatshading : 1;
1377     DWORD alpha_test_func : 3;
1378     DWORD render_offscreen : 1;
1379     DWORD dual_source_blend : 1;
1380     DWORD padding : 25;
1381 };
1382 
1383 enum fog_src_type
1384 {
1385     VS_FOG_Z        = 0,
1386     VS_FOG_COORD    = 1
1387 };
1388 
1389 struct vs_compile_args
1390 {
1391     BYTE fog_src;
1392     BYTE clip_enabled : 1;
1393     BYTE point_size : 1;
1394     BYTE per_vertex_point_size : 1;
1395     BYTE flatshading : 1;
1396     BYTE next_shader_type : 3;
1397     BYTE padding : 1;
1398     WORD swizzle_map;   /* MAX_ATTRIBS, 16 */
1399     unsigned int next_shader_input_count;
1400     DWORD interpolation_mode[WINED3D_PACKED_INTERPOLATION_SIZE];
1401 };
1402 
1403 struct ds_compile_args
1404 {
1405     enum wined3d_tessellator_output_primitive tessellator_output_primitive;
1406     enum wined3d_tessellator_partitioning tessellator_partitioning;
1407     unsigned int output_count : 16;
1408     unsigned int next_shader_type : 3;
1409     unsigned int render_offscreen : 1;
1410     unsigned int padding : 12;
1411     DWORD interpolation_mode[WINED3D_PACKED_INTERPOLATION_SIZE];
1412 };
1413 
1414 struct gs_compile_args
1415 {
1416     unsigned int output_count;
1417     enum wined3d_primitive_type primitive_type;
1418     DWORD interpolation_mode[WINED3D_PACKED_INTERPOLATION_SIZE];
1419 };
1420 
1421 struct wined3d_context;
1422 struct wined3d_state;
1423 struct fragment_pipeline;
1424 struct wined3d_vertex_pipe_ops;
1425 
1426 struct wined3d_shader_backend_ops
1427 {
1428     void (*shader_handle_instruction)(const struct wined3d_shader_instruction *);
1429     void (*shader_precompile)(void *shader_priv, struct wined3d_shader *shader);
1430     void (*shader_select)(void *shader_priv, struct wined3d_context *context,
1431             const struct wined3d_state *state);
1432     void (*shader_select_compute)(void *shader_priv, struct wined3d_context *context,
1433             const struct wined3d_state *state);
1434     void (*shader_disable)(void *shader_priv, struct wined3d_context *context);
1435     void (*shader_update_float_vertex_constants)(struct wined3d_device *device, UINT start, UINT count);
1436     void (*shader_update_float_pixel_constants)(struct wined3d_device *device, UINT start, UINT count);
1437     void (*shader_load_constants)(void *shader_priv, struct wined3d_context *context,
1438             const struct wined3d_state *state);
1439     void (*shader_destroy)(struct wined3d_shader *shader);
1440     HRESULT (*shader_alloc_private)(struct wined3d_device *device, const struct wined3d_vertex_pipe_ops *vertex_pipe,
1441             const struct fragment_pipeline *fragment_pipe);
1442     void (*shader_free_private)(struct wined3d_device *device);
1443     BOOL (*shader_allocate_context_data)(struct wined3d_context *context);
1444     void (*shader_free_context_data)(struct wined3d_context *context);
1445     void (*shader_init_context_state)(struct wined3d_context *context);
1446     void (*shader_get_caps)(const struct wined3d_gl_info *gl_info, struct shader_caps *caps);
1447     BOOL (*shader_color_fixup_supported)(struct color_fixup_desc fixup);
1448     BOOL (*shader_has_ffp_proj_control)(void *shader_priv);
1449 };
1450 
1451 extern const struct wined3d_shader_backend_ops glsl_shader_backend DECLSPEC_HIDDEN;
1452 extern const struct wined3d_shader_backend_ops arb_program_shader_backend DECLSPEC_HIDDEN;
1453 extern const struct wined3d_shader_backend_ops none_shader_backend DECLSPEC_HIDDEN;
1454 
1455 #define GL_EXTCALL(f) (gl_info->gl_ops.ext.p_##f)
1456 
1457 #define D3DCOLOR_B_R(dw) (((dw) >> 16) & 0xff)
1458 #define D3DCOLOR_B_G(dw) (((dw) >>  8) & 0xff)
1459 #define D3DCOLOR_B_B(dw) (((dw) >>  0) & 0xff)
1460 #define D3DCOLOR_B_A(dw) (((dw) >> 24) & 0xff)
1461 
1462 static inline void wined3d_color_from_d3dcolor(struct wined3d_color *wined3d_color, DWORD d3d_color)
1463 {
1464     wined3d_color->r = D3DCOLOR_B_R(d3d_color) / 255.0f;
1465     wined3d_color->g = D3DCOLOR_B_G(d3d_color) / 255.0f;
1466     wined3d_color->b = D3DCOLOR_B_B(d3d_color) / 255.0f;
1467     wined3d_color->a = D3DCOLOR_B_A(d3d_color) / 255.0f;
1468 }
1469 
1470 #define HIGHEST_TRANSFORMSTATE WINED3D_TS_WORLD_MATRIX(255) /* Highest value in wined3d_transform_state. */
1471 
1472 void wined3d_check_gl_call(const struct wined3d_gl_info *gl_info,
1473         const char *file, unsigned int line, const char *name) DECLSPEC_HIDDEN;
1474 
1475 /* Checking of API calls */
1476 /* --------------------- */
1477 #ifndef WINE_NO_DEBUG_MSGS
1478 #define checkGLcall(A)                                              \
1479 do {                                                                \
1480     if (__WINE_IS_DEBUG_ON(_ERR, &__wine_dbch_d3d)                  \
1481             && !gl_info->supported[ARB_DEBUG_OUTPUT])               \
1482         wined3d_check_gl_call(gl_info, __FILE__, __LINE__, A);      \
1483 } while(0)
1484 #else
1485 #define checkGLcall(A) do {} while(0)
1486 #endif
1487 
1488 struct wined3d_bo_address
1489 {
1490     GLuint buffer_object;
1491     BYTE *addr;
1492 };
1493 
1494 struct wined3d_const_bo_address
1495 {
1496     GLuint buffer_object;
1497     const BYTE *addr;
1498 };
1499 
1500 static inline struct wined3d_const_bo_address *wined3d_const_bo_address(struct wined3d_bo_address *data)
1501 {
1502     return (struct wined3d_const_bo_address *)data;
1503 }
1504 
1505 struct wined3d_stream_info_element
1506 {
1507     const struct wined3d_format *format;
1508     struct wined3d_bo_address data;
1509     GLsizei stride;
1510     unsigned int stream_idx;
1511     unsigned int divisor;
1512 };
1513 
1514 struct wined3d_stream_info
1515 {
1516     struct wined3d_stream_info_element elements[MAX_ATTRIBS];
1517     DWORD position_transformed : 1;
1518     DWORD all_vbo : 1;
1519     WORD swizzle_map; /* MAX_ATTRIBS, 16 */
1520     WORD use_map; /* MAX_ATTRIBS, 16 */
1521 };
1522 
1523 void wined3d_stream_info_from_declaration(struct wined3d_stream_info *stream_info,
1524         const struct wined3d_state *state, const struct wined3d_gl_info *gl_info,
1525         const struct wined3d_d3d_info *d3d_info) DECLSPEC_HIDDEN;
1526 
1527 struct wined3d_direct_dispatch_parameters
1528 {
1529     unsigned int group_count_x;
1530     unsigned int group_count_y;
1531     unsigned int group_count_z;
1532 };
1533 
1534 struct wined3d_indirect_dispatch_parameters
1535 {
1536     struct wined3d_buffer *buffer;
1537     unsigned int offset;
1538 };
1539 
1540 struct wined3d_dispatch_parameters
1541 {
1542     BOOL indirect;
1543     union
1544     {
1545         struct wined3d_direct_dispatch_parameters direct;
1546         struct wined3d_indirect_dispatch_parameters indirect;
1547     } u;
1548 };
1549 
1550 struct wined3d_direct_draw_parameters
1551 {
1552     int base_vertex_idx;
1553     unsigned int start_idx;
1554     unsigned int index_count;
1555     unsigned int start_instance;
1556     unsigned int instance_count;
1557 };
1558 
1559 struct wined3d_indirect_draw_parameters
1560 {
1561     struct wined3d_buffer *buffer;
1562     unsigned int offset;
1563 };
1564 
1565 struct wined3d_draw_parameters
1566 {
1567     BOOL indirect;
1568     union
1569     {
1570         struct wined3d_direct_draw_parameters direct;
1571         struct wined3d_indirect_draw_parameters indirect;
1572     } u;
1573     BOOL indexed;
1574 };
1575 
1576 void draw_primitive(struct wined3d_device *device, const struct wined3d_state *state,
1577         const struct wined3d_draw_parameters *draw_parameters) DECLSPEC_HIDDEN;
1578 void dispatch_compute(struct wined3d_device *device, const struct wined3d_state *state,
1579         const struct wined3d_dispatch_parameters *dispatch_parameters) DECLSPEC_HIDDEN;
1580 DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) DECLSPEC_HIDDEN;
1581 
1582 #define eps 1e-8f
1583 
1584 #define GET_TEXCOORD_SIZE_FROM_FVF(d3dvtVertexType, tex_num) \
1585     (((((d3dvtVertexType) >> (16 + (2 * (tex_num)))) + 1) & 0x03) + 1)
1586 
1587 enum wined3d_pipeline
1588 {
1589     WINED3D_PIPELINE_GRAPHICS,
1590     WINED3D_PIPELINE_COMPUTE,
1591     WINED3D_PIPELINE_COUNT,
1592 };
1593 
1594 /* Routines and structures related to state management */
1595 
1596 #define STATE_RENDER(a) (a)
1597 #define STATE_IS_RENDER(a) ((a) >= STATE_RENDER(1) && (a) <= STATE_RENDER(WINEHIGHEST_RENDER_STATE))
1598 
1599 #define STATE_TEXTURESTAGE(stage, num) \
1600     (STATE_RENDER(WINEHIGHEST_RENDER_STATE) + 1 + (stage) * (WINED3D_HIGHEST_TEXTURE_STATE + 1) + (num))
1601 #define STATE_IS_TEXTURESTAGE(a) \
1602     ((a) >= STATE_TEXTURESTAGE(0, 1) && (a) <= STATE_TEXTURESTAGE(MAX_TEXTURES - 1, WINED3D_HIGHEST_TEXTURE_STATE))
1603 
1604 /* + 1 because samplers start with 0 */
1605 #define STATE_SAMPLER(num) (STATE_TEXTURESTAGE(MAX_TEXTURES - 1, WINED3D_HIGHEST_TEXTURE_STATE) + 1 + (num))
1606 #define STATE_IS_SAMPLER(num) ((num) >= STATE_SAMPLER(0) && (num) <= STATE_SAMPLER(MAX_COMBINED_SAMPLERS - 1))
1607 
1608 #define STATE_GRAPHICS_SHADER(a) (STATE_SAMPLER(MAX_COMBINED_SAMPLERS) + (a))
1609 #define STATE_IS_GRAPHICS_SHADER(a) \
1610     ((a) >= STATE_GRAPHICS_SHADER(0) && (a) < STATE_GRAPHICS_SHADER(WINED3D_SHADER_TYPE_GRAPHICS_COUNT))
1611 
1612 #define STATE_GRAPHICS_CONSTANT_BUFFER(a) (STATE_GRAPHICS_SHADER(WINED3D_SHADER_TYPE_GRAPHICS_COUNT) + (a))
1613 #define STATE_IS_GRAPHICS_CONSTANT_BUFFER(a) \
1614     ((a) >= STATE_GRAPHICS_CONSTANT_BUFFER(0) \
1615     && (a) < STATE_GRAPHICS_CONSTANT_BUFFER(WINED3D_SHADER_TYPE_GRAPHICS_COUNT))
1616 
1617 #define STATE_GRAPHICS_SHADER_RESOURCE_BINDING (STATE_GRAPHICS_CONSTANT_BUFFER(WINED3D_SHADER_TYPE_GRAPHICS_COUNT))
1618 #define STATE_IS_GRAPHICS_SHADER_RESOURCE_BINDING(a) ((a) == STATE_GRAPHICS_SHADER_RESOURCE_BINDING)
1619 
1620 #define STATE_GRAPHICS_UNORDERED_ACCESS_VIEW_BINDING (STATE_GRAPHICS_SHADER_RESOURCE_BINDING + 1)
1621 #define STATE_IS_GRAPHICS_UNORDERED_ACCESS_VIEW_BINDING(a) ((a) == STATE_GRAPHICS_UNORDERED_ACCESS_VIEW_BINDING)
1622 
1623 #define STATE_TRANSFORM(a) (STATE_GRAPHICS_UNORDERED_ACCESS_VIEW_BINDING + (a))
1624 #define STATE_IS_TRANSFORM(a) ((a) >= STATE_TRANSFORM(1) && (a) <= STATE_TRANSFORM(WINED3D_TS_WORLD_MATRIX(255)))
1625 
1626 #define STATE_STREAMSRC (STATE_TRANSFORM(WINED3D_TS_WORLD_MATRIX(255)) + 1)
1627 #define STATE_IS_STREAMSRC(a) ((a) == STATE_STREAMSRC)
1628 #define STATE_INDEXBUFFER (STATE_STREAMSRC + 1)
1629 #define STATE_IS_INDEXBUFFER(a) ((a) == STATE_INDEXBUFFER)
1630 
1631 #define STATE_VDECL (STATE_INDEXBUFFER + 1)
1632 #define STATE_IS_VDECL(a) ((a) == STATE_VDECL)
1633 
1634 #define STATE_VIEWPORT (STATE_VDECL + 1)
1635 #define STATE_IS_VIEWPORT(a) ((a) == STATE_VIEWPORT)
1636 
1637 #define STATE_LIGHT_TYPE (STATE_VIEWPORT + 1)
1638 #define STATE_IS_LIGHT_TYPE(a) ((a) == STATE_LIGHT_TYPE)
1639 #define STATE_ACTIVELIGHT(a) (STATE_LIGHT_TYPE + 1 + (a))
1640 #define STATE_IS_ACTIVELIGHT(a) ((a) >= STATE_ACTIVELIGHT(0) && (a) < STATE_ACTIVELIGHT(MAX_ACTIVE_LIGHTS))
1641 
1642 #define STATE_SCISSORRECT (STATE_ACTIVELIGHT(MAX_ACTIVE_LIGHTS - 1) + 1)
1643 #define STATE_IS_SCISSORRECT(a) ((a) == STATE_SCISSORRECT)
1644 
1645 #define STATE_CLIPPLANE(a) (STATE_SCISSORRECT + 1 + (a))
1646 #define STATE_IS_CLIPPLANE(a) ((a) >= STATE_CLIPPLANE(0) && (a) <= STATE_CLIPPLANE(MAX_CLIP_DISTANCES - 1))
1647 
1648 #define STATE_MATERIAL (STATE_CLIPPLANE(MAX_CLIP_DISTANCES))
1649 #define STATE_IS_MATERIAL(a) ((a) == STATE_MATERIAL)
1650 
1651 #define STATE_RASTERIZER (STATE_MATERIAL + 1)
1652 #define STATE_IS_RASTERIZER(a) ((a) == STATE_RASTERIZER)
1653 
1654 #define STATE_POINTSPRITECOORDORIGIN (STATE_RASTERIZER + 1)
1655 #define STATE_IS_POINTSPRITECOORDORIGIN(a) ((a) == STATE_POINTSPRITECOORDORIGIN)
1656 
1657 #define STATE_BASEVERTEXINDEX  (STATE_POINTSPRITECOORDORIGIN + 1)
1658 #define STATE_IS_BASEVERTEXINDEX(a) ((a) == STATE_BASEVERTEXINDEX)
1659 
1660 #define STATE_FRAMEBUFFER (STATE_BASEVERTEXINDEX + 1)
1661 #define STATE_IS_FRAMEBUFFER(a) ((a) == STATE_FRAMEBUFFER)
1662 
1663 #define STATE_POINT_ENABLE (STATE_FRAMEBUFFER + 1)
1664 #define STATE_IS_POINT_ENABLE(a) ((a) == STATE_POINT_ENABLE)
1665 
1666 #define STATE_COLOR_KEY (STATE_POINT_ENABLE + 1)
1667 #define STATE_IS_COLOR_KEY(a) ((a) == STATE_COLOR_KEY)
1668 
1669 #define STATE_STREAM_OUTPUT (STATE_COLOR_KEY + 1)
1670 #define STATE_IS_STREAM_OUTPUT(a) ((a) == STATE_STREAM_OUTPUT)
1671 
1672 #define STATE_BLEND (STATE_STREAM_OUTPUT + 1)
1673 #define STATE_IS_BLEND(a) ((a) == STATE_BLEND)
1674 
1675 #define STATE_COMPUTE_OFFSET (STATE_BLEND + 1)
1676 
1677 #define STATE_COMPUTE_SHADER (STATE_COMPUTE_OFFSET)
1678 #define STATE_IS_COMPUTE_SHADER(a) ((a) == STATE_COMPUTE_SHADER)
1679 
1680 #define STATE_COMPUTE_CONSTANT_BUFFER (STATE_COMPUTE_SHADER + 1)
1681 #define STATE_IS_COMPUTE_CONSTANT_BUFFER(a) ((a) == STATE_COMPUTE_CONSTANT_BUFFER)
1682 
1683 #define STATE_COMPUTE_SHADER_RESOURCE_BINDING (STATE_COMPUTE_CONSTANT_BUFFER + 1)
1684 #define STATE_IS_COMPUTE_SHADER_RESOURCE_BINDING(a) ((a) == STATE_COMPUTE_SHADER_RESOURCE_BINDING)
1685 
1686 #define STATE_COMPUTE_UNORDERED_ACCESS_VIEW_BINDING (STATE_COMPUTE_SHADER_RESOURCE_BINDING + 1)
1687 #define STATE_IS_COMPUTE_UNORDERED_ACCESS_VIEW_BINDING(a) ((a) == STATE_COMPUTE_UNORDERED_ACCESS_VIEW_BINDING)
1688 
1689 #define STATE_COMPUTE_HIGHEST (STATE_COMPUTE_UNORDERED_ACCESS_VIEW_BINDING)
1690 #define STATE_HIGHEST (STATE_COMPUTE_UNORDERED_ACCESS_VIEW_BINDING)
1691 
1692 #define STATE_IS_COMPUTE(a) ((a) >= STATE_COMPUTE_OFFSET && (a) <= STATE_COMPUTE_HIGHEST)
1693 #define STATE_COMPUTE_COUNT (STATE_COMPUTE_HIGHEST - STATE_COMPUTE_OFFSET + 1)
1694 
1695 #define STATE_SHADER(a) ((a) != WINED3D_SHADER_TYPE_COMPUTE ? STATE_GRAPHICS_SHADER(a) : STATE_COMPUTE_SHADER)
1696 #define STATE_CONSTANT_BUFFER(a) \
1697     ((a) != WINED3D_SHADER_TYPE_COMPUTE ? STATE_GRAPHICS_CONSTANT_BUFFER(a) : STATE_COMPUTE_CONSTANT_BUFFER)
1698 #define STATE_UNORDERED_ACCESS_VIEW_BINDING(a) ((a) == WINED3D_PIPELINE_GRAPHICS ? \
1699     STATE_GRAPHICS_UNORDERED_ACCESS_VIEW_BINDING : STATE_COMPUTE_UNORDERED_ACCESS_VIEW_BINDING)
1700 
1701 enum fogsource {
1702     FOGSOURCE_FFP,
1703     FOGSOURCE_VS,
1704     FOGSOURCE_COORD,
1705 };
1706 
1707 union wined3d_gl_fence_object
1708 {
1709     GLuint id;
1710     GLsync sync;
1711 };
1712 
1713 enum wined3d_fence_result
1714 {
1715     WINED3D_FENCE_OK,
1716     WINED3D_FENCE_WAITING,
1717     WINED3D_FENCE_NOT_STARTED,
1718     WINED3D_FENCE_WRONG_THREAD,
1719     WINED3D_FENCE_ERROR,
1720 };
1721 
1722 struct wined3d_fence
1723 {
1724     struct list entry;
1725     union wined3d_gl_fence_object object;
1726     struct wined3d_context *context;
1727 };
1728 
1729 HRESULT wined3d_fence_create(struct wined3d_device *device, struct wined3d_fence **fence) DECLSPEC_HIDDEN;
1730 void wined3d_fence_destroy(struct wined3d_fence *fence) DECLSPEC_HIDDEN;
1731 void wined3d_fence_issue(struct wined3d_fence *fence, const struct wined3d_device *device) DECLSPEC_HIDDEN;
1732 enum wined3d_fence_result wined3d_fence_wait(const struct wined3d_fence *fence,
1733         const struct wined3d_device *device) DECLSPEC_HIDDEN;
1734 
1735 /* Direct3D terminology with little modifications. We do not have an issued
1736  * state because only the driver knows about it, but we have a created state
1737  * because D3D allows GetData() on a created query, but OpenGL doesn't. */
1738 enum wined3d_query_state
1739 {
1740     QUERY_CREATED,
1741     QUERY_SIGNALLED,
1742     QUERY_BUILDING
1743 };
1744 
1745 struct wined3d_query_ops
1746 {
1747     BOOL (*query_poll)(struct wined3d_query *query, DWORD flags);
1748     BOOL (*query_issue)(struct wined3d_query *query, DWORD flags);
1749     void (*query_destroy)(struct wined3d_query *query);
1750 };
1751 
1752 struct wined3d_query
1753 {
1754     LONG ref;
1755 
1756     void *parent;
1757     const struct wined3d_parent_ops *parent_ops;
1758     struct wined3d_device *device;
1759     enum wined3d_query_state state;
1760     enum wined3d_query_type type;
1761     const void *data;
1762     DWORD data_size;
1763     const struct wined3d_query_ops *query_ops;
1764 
1765     LONG counter_main, counter_retrieved;
1766     struct list poll_list_entry;
1767 };
1768 
1769 struct wined3d_event_query
1770 {
1771     struct wined3d_query query;
1772 
1773     struct wined3d_fence fence;
1774     BOOL signalled;
1775 };
1776 
1777 struct wined3d_occlusion_query
1778 {
1779     struct wined3d_query query;
1780 
1781     struct list entry;
1782     GLuint id;
1783     struct wined3d_context *context;
1784     UINT64 samples;
1785     BOOL started;
1786 };
1787 
1788 struct wined3d_timestamp_query
1789 {
1790     struct wined3d_query query;
1791 
1792     struct list entry;
1793     GLuint id;
1794     struct wined3d_context *context;
1795     UINT64 timestamp;
1796 };
1797 
1798 void context_alloc_timestamp_query(struct wined3d_context *context, struct wined3d_timestamp_query *query) DECLSPEC_HIDDEN;
1799 void context_free_timestamp_query(struct wined3d_timestamp_query *query) DECLSPEC_HIDDEN;
1800 
1801 union wined3d_gl_so_statistics_query
1802 {
1803     GLuint id[2];
1804     struct
1805     {
1806         GLuint written;
1807         GLuint generated;
1808     } query;
1809 };
1810 
1811 struct wined3d_so_statistics_query
1812 {
1813     struct wined3d_query query;
1814 
1815     struct list entry;
1816     union wined3d_gl_so_statistics_query u;
1817     struct wined3d_context *context;
1818     unsigned int stream_idx;
1819     struct wined3d_query_data_so_statistics statistics;
1820     BOOL started;
1821 };
1822 
1823 void context_alloc_so_statistics_query(struct wined3d_context *context,
1824         struct wined3d_so_statistics_query *query) DECLSPEC_HIDDEN;
1825 void context_free_so_statistics_query(struct wined3d_so_statistics_query *query) DECLSPEC_HIDDEN;
1826 
1827 union wined3d_gl_pipeline_statistics_query
1828 {
1829     GLuint id[11];
1830     struct
1831     {
1832         GLuint vertices;
1833         GLuint primitives;
1834         GLuint vertex_shader;
1835         GLuint tess_control_shader;
1836         GLuint tess_eval_shader;
1837         GLuint geometry_shader;
1838         GLuint geometry_primitives;
1839         GLuint fragment_shader;
1840         GLuint compute_shader;
1841         GLuint clipping_input;
1842         GLuint clipping_output;
1843     } query;
1844 };
1845 
1846 struct wined3d_pipeline_statistics_query
1847 {
1848     struct wined3d_query query;
1849 
1850     struct list entry;
1851     union wined3d_gl_pipeline_statistics_query u;
1852     struct wined3d_context *context;
1853     struct wined3d_query_data_pipeline_statistics statistics;
1854     BOOL started;
1855 };
1856 
1857 void context_alloc_pipeline_statistics_query(struct wined3d_context *context,
1858         struct wined3d_pipeline_statistics_query *query) DECLSPEC_HIDDEN;
1859 void context_free_pipeline_statistics_query(struct wined3d_pipeline_statistics_query *query) DECLSPEC_HIDDEN;
1860 
1861 struct wined3d_gl_view
1862 {
1863     GLenum target;
1864     GLuint name;
1865 };
1866 
1867 struct wined3d_rendertarget_info
1868 {
1869     struct wined3d_gl_view gl_view;
1870     struct wined3d_resource *resource;
1871     unsigned int sub_resource_idx;
1872     unsigned int layer_count;
1873 };
1874 
1875 #define MAX_GL_FRAGMENT_SAMPLERS 32
1876 
1877 struct wined3d_context
1878 {
1879     const struct wined3d_gl_info *gl_info;
1880     const struct wined3d_d3d_info *d3d_info;
1881     const struct StateEntry *state_table;
1882     /* State dirtification
1883      * dirtyArray is an array that contains markers for dirty states. numDirtyEntries states are dirty, their numbers are in indices
1884      * 0...numDirtyEntries - 1. isStateDirty is a redundant copy of the dirtyArray. Technically only one of them would be needed,
1885      * but with the help of both it is easy to find out if a state is dirty(just check the array index), and for applying dirty states
1886      * only numDirtyEntries array elements have to be checked, not STATE_HIGHEST states.
1887      */
1888     DWORD                   dirtyArray[STATE_HIGHEST + 1]; /* Won't get bigger than that, a state is never marked dirty 2 times */
1889     DWORD                   numDirtyEntries;
1890     DWORD isStateDirty[STATE_HIGHEST / (sizeof(DWORD) * CHAR_BIT) + 1]; /* Bitmap to find out quickly if a state is dirty */
1891     unsigned int dirty_compute_states[STATE_COMPUTE_COUNT / (sizeof(unsigned int) * CHAR_BIT) + 1];
1892 
1893     struct wined3d_device *device;
1894     struct wined3d_swapchain *swapchain;
1895     struct
1896     {
1897         struct wined3d_texture *texture;
1898         unsigned int sub_resource_idx;
1899     } current_rt;
1900     DWORD                   tid;    /* Thread ID which owns this context at the moment */
1901 
1902     /* Stores some information about the context state for optimization */
1903     DWORD render_offscreen : 1;
1904     DWORD last_was_rhw : 1;             /* true iff last draw_primitive was in xyzrhw mode */
1905     DWORD last_swizzle_map : 16; /* MAX_ATTRIBS, 16 */
1906     DWORD last_was_pshader : 1;
1907     DWORD last_was_vshader : 1;
1908     DWORD last_was_normal : 1;
1909     DWORD namedArraysLoaded : 1;
1910     DWORD last_was_ffp_blit : 1;
1911     DWORD last_was_blit : 1;
1912     DWORD last_was_ckey : 1;
1913     DWORD fog_coord : 1;
1914     DWORD fog_enabled : 1;
1915     DWORD num_untracked_materials : 2;  /* Max value 2 */
1916     DWORD current : 1;
1917     DWORD destroyed : 1;
1918     DWORD valid : 1;
1919 
1920     DWORD texShaderBumpMap : 8;         /* MAX_TEXTURES, 8 */
1921     DWORD lastWasPow2Texture : 8;       /* MAX_TEXTURES, 8 */
1922     DWORD fixed_function_usage_map : 8; /* MAX_TEXTURES, 8 */
1923     DWORD lowest_disabled_stage : 4;    /* Max MAX_TEXTURES, 8 */
1924     DWORD use_immediate_mode_draw : 1;
1925     DWORD rebind_fbo : 1;
1926     DWORD needs_set : 1;
1927     DWORD hdc_is_private : 1;
1928 
1929     DWORD hdc_has_format : 1;           /* only meaningful if hdc_is_private */
1930     DWORD update_shader_resource_bindings : 1;
1931     DWORD update_compute_shader_resource_bindings : 1;
1932     DWORD update_unordered_access_view_bindings : 1;
1933     DWORD update_compute_unordered_access_view_bindings : 1;
1934     DWORD uses_uavs : 1;
1935     DWORD destroy_delayed : 1;
1936     DWORD transform_feedback_active : 1;
1937     DWORD transform_feedback_paused : 1;
1938     DWORD shader_update_mask : 6; /* WINED3D_SHADER_TYPE_COUNT, 6 */
1939     DWORD clip_distance_mask : 8; /* MAX_CLIP_DISTANCES, 8 */
1940     DWORD last_was_dual_blend : 1;
1941     DWORD padding : 8;
1942 
1943     DWORD constant_update_mask;
1944     DWORD numbered_array_mask;
1945     GLenum                  tracking_parm;     /* Which source is tracking current colour         */
1946     GLenum                  untracked_materials[2];
1947     UINT                    blit_w, blit_h;
1948     enum fogsource          fog_source;
1949     DWORD active_texture;
1950     DWORD *texture_type;
1951 
1952     UINT instance_count;
1953 
1954     /* The actual opengl context */
1955     UINT level;
1956     HGLRC restore_ctx;
1957     HDC restore_dc;
1958     int restore_pf;
1959     HWND restore_pf_win;
1960     HGLRC                   glCtx;
1961     HWND                    win_handle;
1962     HDC                     hdc;
1963     int pixel_format;
1964     GLint                   aux_buffers;
1965 
1966     void *shader_backend_data;
1967     void *fragment_pipe_data;
1968 
1969     /* FBOs */
1970     UINT                    fbo_entry_count;
1971     struct list             fbo_list;
1972     struct list             fbo_destroy_list;
1973     struct fbo_entry        *current_fbo;
1974     GLuint                  fbo_read_binding;
1975     GLuint                  fbo_draw_binding;
1976     struct wined3d_rendertarget_info blit_targets[MAX_RENDER_TARGET_VIEWS];
1977     DWORD draw_buffers_mask; /* Enabled draw buffers, 31 max. */
1978 
1979     /* Queries */
1980     GLuint *free_occlusion_queries;
1981     SIZE_T free_occlusion_query_size;
1982     unsigned int free_occlusion_query_count;
1983     struct list occlusion_queries;
1984 
1985     union wined3d_gl_fence_object *free_fences;
1986     SIZE_T free_fence_size;
1987     unsigned int free_fence_count;
1988     struct list fences;
1989 
1990     GLuint *free_timestamp_queries;
1991     SIZE_T free_timestamp_query_size;
1992     unsigned int free_timestamp_query_count;
1993     struct list timestamp_queries;
1994 
1995     union wined3d_gl_so_statistics_query *free_so_statistics_queries;
1996     SIZE_T free_so_statistics_query_size;
1997     unsigned int free_so_statistics_query_count;
1998     struct list so_statistics_queries;
1999 
2000     union wined3d_gl_pipeline_statistics_query *free_pipeline_statistics_queries;
2001     SIZE_T free_pipeline_statistics_query_size;
2002     unsigned int free_pipeline_statistics_query_count;
2003     struct list pipeline_statistics_queries;
2004 
2005     struct wined3d_stream_info stream_info;
2006 
2007     /* Fences for GL_APPLE_flush_buffer_range */
2008     struct wined3d_fence *buffer_fences[MAX_ATTRIBS];
2009     unsigned int buffer_fence_count;
2010 
2011     GLuint blit_vbo;
2012 
2013     DWORD tex_unit_map[MAX_COMBINED_SAMPLERS];
2014     DWORD rev_tex_unit_map[MAX_GL_FRAGMENT_SAMPLERS + MAX_VERTEX_SAMPLERS];
2015 
2016     /* Extension emulation */
2017     GLint                   gl_fog_source;
2018     GLfloat                 fog_coord_value;
2019     GLfloat                 color[4], fogstart, fogend, fogcolor[4];
2020     GLuint                  dummy_arbfp_prog;
2021 
2022     unsigned int viewport_count;
2023     unsigned int scissor_rect_count;
2024 };
2025 
2026 struct wined3d_fb_state
2027 {
2028     struct wined3d_rendertarget_view *render_targets[MAX_RENDER_TARGET_VIEWS];
2029     struct wined3d_rendertarget_view *depth_stencil;
2030 };
2031 
2032 typedef void (*APPLYSTATEFUNC)(struct wined3d_context *ctx, const struct wined3d_state *state, DWORD state_id);
2033 
2034 struct StateEntry
2035 {
2036     DWORD representative;
2037     APPLYSTATEFUNC apply;
2038 };
2039 
2040 struct StateEntryTemplate
2041 {
2042     DWORD state;
2043     struct StateEntry content;
2044     enum wined3d_gl_extension extension;
2045 };
2046 
2047 #define WINED3D_FRAGMENT_CAP_PROJ_CONTROL   0x00000001
2048 #define WINED3D_FRAGMENT_CAP_SRGB_WRITE     0x00000002
2049 #define WINED3D_FRAGMENT_CAP_COLOR_KEY      0x00000004
2050 
2051 struct fragment_caps
2052 {
2053     DWORD wined3d_caps;
2054     DWORD PrimitiveMiscCaps;
2055     DWORD TextureOpCaps;
2056     DWORD MaxTextureBlendStages;
2057     DWORD MaxSimultaneousTextures;
2058 };
2059 
2060 #define GL_EXT_EMUL_ARB_MULTITEXTURE 0x00000001
2061 #define GL_EXT_EMUL_EXT_FOG_COORD    0x00000002
2062 
2063 struct fragment_pipeline
2064 {
2065     void (*enable_extension)(const struct wined3d_gl_info *gl_info, BOOL enable);
2066     void (*get_caps)(const struct wined3d_gl_info *gl_info, struct fragment_caps *caps);
2067     DWORD (*get_emul_mask)(const struct wined3d_gl_info *gl_info);
2068     void *(*alloc_private)(const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv);
2069     void (*free_private)(struct wined3d_device *device);
2070     BOOL (*allocate_context_data)(struct wined3d_context *context);
2071     void (*free_context_data)(struct wined3d_context *context);
2072     BOOL (*color_fixup_supported)(struct color_fixup_desc fixup);
2073     const struct StateEntryTemplate *states;
2074 };
2075 
2076 struct wined3d_vertex_caps
2077 {
2078     BOOL xyzrhw;
2079     BOOL emulated_flatshading;
2080     BOOL ffp_generic_attributes;
2081     DWORD max_active_lights;
2082     DWORD max_vertex_blend_matrices;
2083     DWORD max_vertex_blend_matrix_index;
2084     DWORD vertex_processing_caps;
2085     DWORD fvf_caps;
2086     DWORD max_user_clip_planes;
2087     DWORD raster_caps;
2088 };
2089 
2090 struct wined3d_vertex_pipe_ops
2091 {
2092     void (*vp_enable)(const struct wined3d_gl_info *gl_info, BOOL enable);
2093     void (*vp_get_caps)(const struct wined3d_gl_info *gl_info, struct wined3d_vertex_caps *caps);
2094     DWORD (*vp_get_emul_mask)(const struct wined3d_gl_info *gl_info);
2095     void *(*vp_alloc)(const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv);
2096     void (*vp_free)(struct wined3d_device *device);
2097     const struct StateEntryTemplate *vp_states;
2098 };
2099 
2100 extern const struct StateEntryTemplate misc_state_template[] DECLSPEC_HIDDEN;
2101 extern const struct fragment_pipeline none_fragment_pipe DECLSPEC_HIDDEN;
2102 extern const struct fragment_pipeline ffp_fragment_pipeline DECLSPEC_HIDDEN;
2103 extern const struct fragment_pipeline atifs_fragment_pipeline DECLSPEC_HIDDEN;
2104 extern const struct fragment_pipeline arbfp_fragment_pipeline DECLSPEC_HIDDEN;
2105 extern const struct fragment_pipeline nvts_fragment_pipeline DECLSPEC_HIDDEN;
2106 extern const struct fragment_pipeline nvrc_fragment_pipeline DECLSPEC_HIDDEN;
2107 extern const struct fragment_pipeline glsl_fragment_pipe DECLSPEC_HIDDEN;
2108 
2109 extern const struct wined3d_vertex_pipe_ops none_vertex_pipe DECLSPEC_HIDDEN;
2110 extern const struct wined3d_vertex_pipe_ops ffp_vertex_pipe DECLSPEC_HIDDEN;
2111 extern const struct wined3d_vertex_pipe_ops glsl_vertex_pipe DECLSPEC_HIDDEN;
2112 
2113 /* "Base" state table */
2114 HRESULT compile_state_table(struct StateEntry *StateTable, APPLYSTATEFUNC **dev_multistate_funcs,
2115         const struct wined3d_gl_info *gl_info, const struct wined3d_d3d_info *d3d_info,
2116         const struct wined3d_vertex_pipe_ops *vertex, const struct fragment_pipeline *fragment,
2117         const struct StateEntryTemplate *misc) DECLSPEC_HIDDEN;
2118 
2119 enum wined3d_blit_op
2120 {
2121     WINED3D_BLIT_OP_COLOR_BLIT,
2122     WINED3D_BLIT_OP_COLOR_BLIT_ALPHATEST,
2123     WINED3D_BLIT_OP_COLOR_BLIT_CKEY,
2124     WINED3D_BLIT_OP_COLOR_FILL,
2125     WINED3D_BLIT_OP_DEPTH_FILL,
2126     WINED3D_BLIT_OP_DEPTH_BLIT,
2127     WINED3D_BLIT_OP_RAW_BLIT,
2128 };
2129 
2130 struct wined3d_blitter
2131 {
2132     const struct wined3d_blitter_ops *ops;
2133     struct wined3d_blitter *next;
2134 };
2135 
2136 struct wined3d_blitter_ops
2137 {
2138     void (*blitter_destroy)(struct wined3d_blitter *blitter, struct wined3d_context *context);
2139     void (*blitter_clear)(struct wined3d_blitter *blitter, struct wined3d_device *device,
2140             unsigned int rt_count, const struct wined3d_fb_state *fb, unsigned int rect_count, const RECT *clear_rects,
2141             const RECT *draw_rect, DWORD flags, const struct wined3d_color *colour, float depth, DWORD stencil);
2142     DWORD (*blitter_blit)(struct wined3d_blitter *blitter, enum wined3d_blit_op op, struct wined3d_context *context,
2143             struct wined3d_texture *src_texture, unsigned int src_sub_resource_idx, DWORD src_location,
2144             const RECT *src_rect, struct wined3d_texture *dst_texture, unsigned int dst_sub_resource_idx,
2145             DWORD dst_location, const RECT *dst_rect, const struct wined3d_color_key *colour_key,
2146             enum wined3d_texture_filter_type filter);
2147 };
2148 
2149 void wined3d_arbfp_blitter_create(struct wined3d_blitter **next,
2150         const struct wined3d_device *device) DECLSPEC_HIDDEN;
2151 struct wined3d_blitter *wined3d_cpu_blitter_create(void) DECLSPEC_HIDDEN;
2152 void wined3d_fbo_blitter_create(struct wined3d_blitter **next,
2153         const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
2154 void wined3d_ffp_blitter_create(struct wined3d_blitter **next,
2155         const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
2156 struct wined3d_blitter *wined3d_glsl_blitter_create(struct wined3d_blitter **next,
2157         const struct wined3d_device *device) DECLSPEC_HIDDEN;
2158 void wined3d_raw_blitter_create(struct wined3d_blitter **next,
2159         const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
2160 
2161 BOOL wined3d_clip_blit(const RECT *clip_rect, RECT *clipped, RECT *other) DECLSPEC_HIDDEN;
2162 
2163 struct wined3d_context *context_acquire(const struct wined3d_device *device,
2164         struct wined3d_texture *texture, unsigned int sub_resource_idx) DECLSPEC_HIDDEN;
2165 void context_alloc_fence(struct wined3d_context *context, struct wined3d_fence *fence) DECLSPEC_HIDDEN;
2166 void context_alloc_occlusion_query(struct wined3d_context *context,
2167         struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN;
2168 void context_apply_blit_state(struct wined3d_context *context, const struct wined3d_device *device) DECLSPEC_HIDDEN;
2169 BOOL context_apply_clear_state(struct wined3d_context *context, const struct wined3d_state *state,
2170         UINT rt_count, const struct wined3d_fb_state *fb) DECLSPEC_HIDDEN;
2171 void context_apply_fbo_state_blit(struct wined3d_context *context, GLenum target,
2172         struct wined3d_resource *rt, unsigned int rt_sub_resource_idx,
2173         struct wined3d_resource *ds, unsigned int ds_sub_resource_idx, DWORD location) DECLSPEC_HIDDEN;
2174 void context_apply_ffp_blit_state(struct wined3d_context *context,
2175         const struct wined3d_device *device) DECLSPEC_HIDDEN;
2176 void context_active_texture(struct wined3d_context *context, const struct wined3d_gl_info *gl_info,
2177         unsigned int unit) DECLSPEC_HIDDEN;
2178 void context_bind_bo(struct wined3d_context *context, GLenum binding, GLuint name) DECLSPEC_HIDDEN;
2179 void context_bind_dummy_textures(const struct wined3d_device *device,
2180         const struct wined3d_context *context) DECLSPEC_HIDDEN;
2181 void context_bind_texture(struct wined3d_context *context, GLenum target, GLuint name) DECLSPEC_HIDDEN;
2182 void context_check_fbo_status(const struct wined3d_context *context, GLenum target) DECLSPEC_HIDDEN;
2183 void context_copy_bo_address(struct wined3d_context *context,
2184         const struct wined3d_bo_address *dst, GLenum dst_binding,
2185         const struct wined3d_bo_address *src, GLenum src_binding, size_t size) DECLSPEC_HIDDEN;
2186 struct wined3d_context *context_create(struct wined3d_swapchain *swapchain, struct wined3d_texture *target,
2187         const struct wined3d_format *ds_format) DECLSPEC_HIDDEN;
2188 HGLRC context_create_wgl_attribs(const struct wined3d_gl_info *gl_info, HDC hdc, HGLRC share_ctx) DECLSPEC_HIDDEN;
2189 void context_destroy(struct wined3d_device *device, struct wined3d_context *context) DECLSPEC_HIDDEN;
2190 void context_draw_shaded_quad(struct wined3d_context *context, struct wined3d_texture *texture,
2191         unsigned int sub_resource_idx, const RECT *src_rect, const RECT *dst_rect,
2192         enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN;
2193 void context_draw_textured_quad(struct wined3d_context *context, struct wined3d_texture *texture,
2194         unsigned int sub_resource_idx, const RECT *src_rect, const RECT *dst_rect,
2195         enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN;
2196 void context_enable_clip_distances(struct wined3d_context *context, unsigned int mask) DECLSPEC_HIDDEN;
2197 void context_end_transform_feedback(struct wined3d_context *context) DECLSPEC_HIDDEN;
2198 void context_free_fence(struct wined3d_fence *fence) DECLSPEC_HIDDEN;
2199 void context_free_occlusion_query(struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN;
2200 struct wined3d_context *context_get_current(void) DECLSPEC_HIDDEN;
2201 GLenum context_get_offscreen_gl_buffer(const struct wined3d_context *context) DECLSPEC_HIDDEN;
2202 const DWORD *context_get_tex_unit_mapping(const struct wined3d_context *context,
2203         const struct wined3d_shader_version *shader_version, unsigned int *base, unsigned int *count) DECLSPEC_HIDDEN;
2204 DWORD context_get_tls_idx(void) DECLSPEC_HIDDEN;
2205 void context_gl_resource_released(struct wined3d_device *device,
2206         GLuint name, BOOL rb_namespace) DECLSPEC_HIDDEN;
2207 void context_invalidate_compute_state(struct wined3d_context *context, DWORD state_id) DECLSPEC_HIDDEN;
2208 void context_invalidate_state(struct wined3d_context *context, DWORD state_id) DECLSPEC_HIDDEN;
2209 void context_load_tex_coords(const struct wined3d_context *context, const struct wined3d_stream_info *si,
2210         GLuint *current_bo, const struct wined3d_state *state) DECLSPEC_HIDDEN;
2211 void *context_map_bo_address(struct wined3d_context *context, const struct wined3d_bo_address *data,
2212         size_t size, GLenum binding, DWORD flags) DECLSPEC_HIDDEN;
2213 struct wined3d_context *context_reacquire(const struct wined3d_device *device,
2214         struct wined3d_context *context) DECLSPEC_HIDDEN;
2215 void context_release(struct wined3d_context *context) DECLSPEC_HIDDEN;
2216 void context_resource_released(const struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN;
2217 void context_restore(struct wined3d_context *context, struct wined3d_texture *texture,
2218         unsigned int sub_resource_idx) DECLSPEC_HIDDEN;
2219 BOOL context_set_current(struct wined3d_context *ctx) DECLSPEC_HIDDEN;
2220 void context_set_draw_buffer(struct wined3d_context *context, GLenum buffer) DECLSPEC_HIDDEN;
2221 void context_set_tls_idx(DWORD idx) DECLSPEC_HIDDEN;
2222 void context_state_drawbuf(struct wined3d_context *context,
2223         const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
2224 void context_state_fb(struct wined3d_context *context,
2225         const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
2226 void context_texture_update(struct wined3d_context *context, const struct wined3d_texture *texture) DECLSPEC_HIDDEN;
2227 void context_unload_tex_coords(const struct wined3d_context *context) DECLSPEC_HIDDEN;
2228 void context_unmap_bo_address(struct wined3d_context *context,
2229         const struct wined3d_bo_address *data, GLenum binding) DECLSPEC_HIDDEN;
2230 void context_update_stream_sources(struct wined3d_context *context,
2231         const struct wined3d_state *state) DECLSPEC_HIDDEN;
2232 
2233 /*****************************************************************************
2234  * Internal representation of a light
2235  */
2236 struct wined3d_light_info
2237 {
2238     struct wined3d_light OriginalParms; /* Note D3D8LIGHT == D3D9LIGHT */
2239     DWORD        OriginalIndex;
2240     LONG         glIndex;
2241     BOOL         enabled;
2242 
2243     /* Converted parms to speed up swapping lights */
2244     struct wined3d_vec4 position;
2245     struct wined3d_vec4 direction;
2246     float exponent;
2247     float cutoff;
2248 
2249     struct list entry;
2250 };
2251 
2252 /* The default light parameters */
2253 extern const struct wined3d_light WINED3D_default_light DECLSPEC_HIDDEN;
2254 
2255 struct wined3d_pixel_format
2256 {
2257     int iPixelFormat; /* WGL pixel format */
2258     int iPixelType; /* WGL pixel type e.g. WGL_TYPE_RGBA_ARB, WGL_TYPE_RGBA_FLOAT_ARB or WGL_TYPE_COLORINDEX_ARB */
2259     int redSize, greenSize, blueSize, alphaSize, colorSize;
2260     int depthSize, stencilSize;
2261     BOOL windowDrawable;
2262     BOOL doubleBuffer;
2263     int auxBuffers;
2264     int numSamples;
2265 };
2266 
2267 enum wined3d_pci_vendor
2268 {
2269     HW_VENDOR_SOFTWARE              = 0x0000,
2270     HW_VENDOR_AMD                   = 0x1002,
2271     HW_VENDOR_NVIDIA                = 0x10de,
2272     HW_VENDOR_VMWARE                = 0x15ad,
2273     HW_VENDOR_INTEL                 = 0x8086,
2274 };
2275 
2276 enum wined3d_pci_device
2277 {
2278     CARD_WINE                       = 0x0000,
2279 
2280     CARD_AMD_RAGE_128PRO            = 0x5246,
2281     CARD_AMD_RADEON_7200            = 0x5144,
2282     CARD_AMD_RADEON_8500            = 0x514c,
2283     CARD_AMD_RADEON_9500            = 0x4144,
2284     CARD_AMD_RADEON_XPRESS_200M     = 0x5955,
2285     CARD_AMD_RADEON_X700            = 0x5e4c,
2286     CARD_AMD_RADEON_X1600           = 0x71c2,
2287     CARD_AMD_RADEON_HD2350          = 0x94c7,
2288     CARD_AMD_RADEON_HD2600          = 0x9581,
2289     CARD_AMD_RADEON_HD2900          = 0x9400,
2290     CARD_AMD_RADEON_HD3200          = 0x9620,
2291     CARD_AMD_RADEON_HD3850          = 0x9515,
2292     CARD_AMD_RADEON_HD4200M         = 0x9712,
2293     CARD_AMD_RADEON_HD4350          = 0x954f,
2294     CARD_AMD_RADEON_HD4600          = 0x9495,
2295     CARD_AMD_RADEON_HD4700          = 0x944e,
2296     CARD_AMD_RADEON_HD4800          = 0x944c,
2297     CARD_AMD_RADEON_HD5400          = 0x68f9,
2298     CARD_AMD_RADEON_HD5600          = 0x68d8,
2299     CARD_AMD_RADEON_HD5700          = 0x68be,
2300     CARD_AMD_RADEON_HD5800          = 0x6898,
2301     CARD_AMD_RADEON_HD5900          = 0x689c,
2302     CARD_AMD_RADEON_HD6300          = 0x9803,
2303     CARD_AMD_RADEON_HD6400          = 0x6770,
2304     CARD_AMD_RADEON_HD6410D         = 0x9644,
2305     CARD_AMD_RADEON_HD6480G         = 0x9648,
2306     CARD_AMD_RADEON_HD6550D         = 0x9640,
2307     CARD_AMD_RADEON_HD6600          = 0x6758,
2308     CARD_AMD_RADEON_HD6600M         = 0x6741,
2309     CARD_AMD_RADEON_HD6700          = 0x68ba,
2310     CARD_AMD_RADEON_HD6800          = 0x6739,
2311     CARD_AMD_RADEON_HD6900          = 0x6719,
2312     CARD_AMD_RADEON_HD7660D         = 0x9901,
2313     CARD_AMD_RADEON_HD7700          = 0x683d,
2314     CARD_AMD_RADEON_HD7800          = 0x6819,
2315     CARD_AMD_RADEON_HD7900          = 0x679a,
2316     CARD_AMD_RADEON_HD8600M         = 0x6660,
2317     CARD_AMD_RADEON_HD8670          = 0x6610,
2318     CARD_AMD_RADEON_HD8770          = 0x665c,
2319     CARD_AMD_RADEON_R3              = 0x9830,
2320     CARD_AMD_RADEON_R7              = 0x130f,
2321     CARD_AMD_RADEON_R9_285          = 0x6939,
2322     CARD_AMD_RADEON_R9_290          = 0x67b1,
2323     CARD_AMD_RADEON_R9_FURY         = 0x7300,
2324     CARD_AMD_RADEON_RX_460          = 0x67ef,
2325     CARD_AMD_RADEON_RX_480          = 0x67df,
2326 
2327     CARD_NVIDIA_RIVA_128            = 0x0018,
2328     CARD_NVIDIA_RIVA_TNT            = 0x0020,
2329     CARD_NVIDIA_RIVA_TNT2           = 0x0028,
2330     CARD_NVIDIA_GEFORCE             = 0x0100,
2331     CARD_NVIDIA_GEFORCE2_MX         = 0x0110,
2332     CARD_NVIDIA_GEFORCE2            = 0x0150,
2333     CARD_NVIDIA_GEFORCE3            = 0x0200,
2334     CARD_NVIDIA_GEFORCE4_MX         = 0x0170,
2335     CARD_NVIDIA_GEFORCE4_TI4200     = 0x0253,
2336     CARD_NVIDIA_GEFORCEFX_5200      = 0x0320,
2337     CARD_NVIDIA_GEFORCEFX_5600      = 0x0312,
2338     CARD_NVIDIA_GEFORCEFX_5800      = 0x0302,
2339     CARD_NVIDIA_GEFORCE_6200        = 0x014f,
2340     CARD_NVIDIA_GEFORCE_6600GT      = 0x0140,
2341     CARD_NVIDIA_GEFORCE_6800        = 0x0041,
2342     CARD_NVIDIA_GEFORCE_7300        = 0x01d7, /* GeForce Go 7300 */
2343     CARD_NVIDIA_GEFORCE_7400        = 0x01d8,
2344     CARD_NVIDIA_GEFORCE_7600        = 0x0391,
2345     CARD_NVIDIA_GEFORCE_7800GT      = 0x0092,
2346     CARD_NVIDIA_GEFORCE_8200        = 0x0849, /* Other PCI ID 0x084b */
2347     CARD_NVIDIA_GEFORCE_8300GS      = 0x0423,
2348     CARD_NVIDIA_GEFORCE_8400GS      = 0x0404,
2349     CARD_NVIDIA_GEFORCE_8500GT      = 0x0421,
2350     CARD_NVIDIA_GEFORCE_8600GT      = 0x0402,
2351     CARD_NVIDIA_GEFORCE_8600MGT     = 0x0407,
2352     CARD_NVIDIA_GEFORCE_8800GTS     = 0x0193,
2353     CARD_NVIDIA_GEFORCE_8800GTX     = 0x0191,
2354     CARD_NVIDIA_GEFORCE_9200        = 0x086d,
2355     CARD_NVIDIA_GEFORCE_9300        = 0x086c,
2356     CARD_NVIDIA_GEFORCE_9400M       = 0x0863,
2357     CARD_NVIDIA_GEFORCE_9400GT      = 0x042c,
2358     CARD_NVIDIA_GEFORCE_9500GT      = 0x0640,
2359     CARD_NVIDIA_GEFORCE_9600GT      = 0x0622,
2360     CARD_NVIDIA_GEFORCE_9700MGT     = 0x064a,
2361     CARD_NVIDIA_GEFORCE_9800GT      = 0x0614,
2362     CARD_NVIDIA_GEFORCE_210         = 0x0a23,
2363     CARD_NVIDIA_GEFORCE_GT220       = 0x0a20,
2364     CARD_NVIDIA_GEFORCE_GT240       = 0x0ca3,
2365     CARD_NVIDIA_GEFORCE_GTS250      = 0x0615,
2366     CARD_NVIDIA_GEFORCE_GTX260      = 0x05e2,
2367     CARD_NVIDIA_GEFORCE_GTX275      = 0x05e6,
2368     CARD_NVIDIA_GEFORCE_GTX280      = 0x05e1,
2369     CARD_NVIDIA_GEFORCE_315M        = 0x0a7a,
2370     CARD_NVIDIA_GEFORCE_320M        = 0x08a3,
2371     CARD_NVIDIA_GEFORCE_GT320M      = 0x0a2d,
2372     CARD_NVIDIA_GEFORCE_GT325M      = 0x0a35,
2373     CARD_NVIDIA_GEFORCE_GT330       = 0x0ca0,
2374     CARD_NVIDIA_GEFORCE_GTS350M     = 0x0cb0,
2375     CARD_NVIDIA_GEFORCE_410M        = 0x1055,
2376     CARD_NVIDIA_GEFORCE_GT420       = 0x0de2,
2377     CARD_NVIDIA_GEFORCE_GT425M      = 0x0df0,
2378     CARD_NVIDIA_GEFORCE_GT430       = 0x0de1,
2379     CARD_NVIDIA_GEFORCE_GT440       = 0x0de0,
2380     CARD_NVIDIA_GEFORCE_GTS450      = 0x0dc4,
2381     CARD_NVIDIA_GEFORCE_GTX460      = 0x0e22,
2382     CARD_NVIDIA_GEFORCE_GTX460M     = 0x0dd1,
2383     CARD_NVIDIA_GEFORCE_GTX465      = 0x06c4,
2384     CARD_NVIDIA_GEFORCE_GTX470      = 0x06cd,
2385     CARD_NVIDIA_GEFORCE_GTX480      = 0x06c0,
2386     CARD_NVIDIA_GEFORCE_GT520       = 0x1040,
2387     CARD_NVIDIA_GEFORCE_GT525M      = 0x0dec,
2388     CARD_NVIDIA_GEFORCE_GT540M      = 0x0df4,
2389     CARD_NVIDIA_GEFORCE_GTX550      = 0x1244,
2390     CARD_NVIDIA_GEFORCE_GT555M      = 0x04b8,
2391     CARD_NVIDIA_GEFORCE_GTX560TI    = 0x1200,
2392     CARD_NVIDIA_GEFORCE_GTX560M     = 0x1251,
2393     CARD_NVIDIA_GEFORCE_GTX560      = 0x1201,
2394     CARD_NVIDIA_GEFORCE_GTX570      = 0x1081,
2395     CARD_NVIDIA_GEFORCE_GTX580      = 0x1080,
2396     CARD_NVIDIA_GEFORCE_GT610       = 0x104a,
2397     CARD_NVIDIA_GEFORCE_GT630       = 0x0f00,
2398     CARD_NVIDIA_GEFORCE_GT630M      = 0x0de9,
2399     CARD_NVIDIA_GEFORCE_GT640M      = 0x0fd2,
2400     CARD_NVIDIA_GEFORCE_GT650M      = 0x0fd1,
2401     CARD_NVIDIA_GEFORCE_GTX650      = 0x0fc6,
2402     CARD_NVIDIA_GEFORCE_GTX650TI    = 0x11c6,
2403     CARD_NVIDIA_GEFORCE_GTX660      = 0x11c0,
2404     CARD_NVIDIA_GEFORCE_GTX660M     = 0x0fd4,
2405     CARD_NVIDIA_GEFORCE_GTX660TI    = 0x1183,
2406     CARD_NVIDIA_GEFORCE_GTX670      = 0x1189,
2407     CARD_NVIDIA_GEFORCE_GTX670MX    = 0x11a1,
2408     CARD_NVIDIA_GEFORCE_GTX675MX    = 0x11a7,
2409     CARD_NVIDIA_GEFORCE_GTX680      = 0x1180,
2410     CARD_NVIDIA_GEFORCE_GTX690      = 0x1188,
2411     CARD_NVIDIA_GEFORCE_GT730       = 0x1287,
2412     CARD_NVIDIA_GEFORCE_GT730M      = 0x0fe1,
2413     CARD_NVIDIA_GEFORCE_GT740M      = 0x1292,
2414     CARD_NVIDIA_GEFORCE_GT750M      = 0x0fe9,
2415     CARD_NVIDIA_GEFORCE_GTX750      = 0x1381,
2416     CARD_NVIDIA_GEFORCE_GTX750TI    = 0x1380,
2417     CARD_NVIDIA_GEFORCE_GTX760      = 0x1187,
2418     CARD_NVIDIA_GEFORCE_GTX760TI    = 0x1193,
2419     CARD_NVIDIA_GEFORCE_GTX765M     = 0x11e2,
2420     CARD_NVIDIA_GEFORCE_GTX770M     = 0x11e0,
2421     CARD_NVIDIA_GEFORCE_GTX770      = 0x1184,
2422     CARD_NVIDIA_GEFORCE_GTX780      = 0x1004,
2423     CARD_NVIDIA_GEFORCE_GTX780TI    = 0x100a,
2424     CARD_NVIDIA_GEFORCE_GTXTITAN    = 0x1005,
2425     CARD_NVIDIA_GEFORCE_GTXTITANB   = 0x100c,
2426     CARD_NVIDIA_GEFORCE_GTXTITANX   = 0x17c2,
2427     CARD_NVIDIA_GEFORCE_GTXTITANZ   = 0x1001,
2428     CARD_NVIDIA_GEFORCE_820M        = 0x0fed,
2429     CARD_NVIDIA_GEFORCE_830M        = 0x1340,
2430     CARD_NVIDIA_GEFORCE_840M        = 0x1341,
2431     CARD_NVIDIA_GEFORCE_845M        = 0x1344,
2432     CARD_NVIDIA_GEFORCE_GTX850M     = 0x1391,
2433     CARD_NVIDIA_GEFORCE_GTX860M     = 0x1392, /* Other PCI ID 0x119a */
2434     CARD_NVIDIA_GEFORCE_GTX870M     = 0x1199,
2435     CARD_NVIDIA_GEFORCE_GTX880M     = 0x1198,
2436     CARD_NVIDIA_GEFORCE_940M        = 0x1347,
2437     CARD_NVIDIA_GEFORCE_GTX950      = 0x1402,
2438     CARD_NVIDIA_GEFORCE_GTX950M     = 0x139a,
2439     CARD_NVIDIA_GEFORCE_GTX960      = 0x1401,
2440     CARD_NVIDIA_GEFORCE_GTX960M     = 0x139b,
2441     CARD_NVIDIA_GEFORCE_GTX970      = 0x13c2,
2442     CARD_NVIDIA_GEFORCE_GTX970M     = 0x13d8,
2443     CARD_NVIDIA_GEFORCE_GTX980      = 0x13c0,
2444     CARD_NVIDIA_GEFORCE_GTX980TI    = 0x17c8,
2445     CARD_NVIDIA_GEFORCE_GTX1050     = 0x1c81,
2446     CARD_NVIDIA_GEFORCE_GTX1050TI   = 0x1c82,
2447     CARD_NVIDIA_GEFORCE_GTX1060     = 0x1c03,
2448     CARD_NVIDIA_GEFORCE_GTX1070     = 0x1b81,
2449     CARD_NVIDIA_GEFORCE_GTX1080     = 0x1b80,
2450     CARD_NVIDIA_GEFORCE_GTX1080TI   = 0x1b06,
2451     CARD_NVIDIA_TITANX_PASCAL       = 0x1b00,
2452     CARD_NVIDIA_TITANV              = 0x1d81,
2453 
2454     CARD_VMWARE_SVGA3D              = 0x0405,
2455 
2456     CARD_INTEL_830M                 = 0x3577,
2457     CARD_INTEL_855GM                = 0x3582,
2458     CARD_INTEL_845G                 = 0x2562,
2459     CARD_INTEL_865G                 = 0x2572,
2460     CARD_INTEL_915G                 = 0x2582,
2461     CARD_INTEL_E7221G               = 0x258a,
2462     CARD_INTEL_915GM                = 0x2592,
2463     CARD_INTEL_945G                 = 0x2772,
2464     CARD_INTEL_945GM                = 0x27a2,
2465     CARD_INTEL_945GME               = 0x27ae,
2466     CARD_INTEL_Q35                  = 0x29b2,
2467     CARD_INTEL_G33                  = 0x29c2,
2468     CARD_INTEL_Q33                  = 0x29d2,
2469     CARD_INTEL_PNVG                 = 0xa001,
2470     CARD_INTEL_PNVM                 = 0xa011,
2471     CARD_INTEL_965Q                 = 0x2992,
2472     CARD_INTEL_965G                 = 0x2982,
2473     CARD_INTEL_946GZ                = 0x2972,
2474     CARD_INTEL_965GM                = 0x2a02,
2475     CARD_INTEL_965GME               = 0x2a12,
2476     CARD_INTEL_GM45                 = 0x2a42,
2477     CARD_INTEL_IGD                  = 0x2e02,
2478     CARD_INTEL_Q45                  = 0x2e12,
2479     CARD_INTEL_G45                  = 0x2e22,
2480     CARD_INTEL_G41                  = 0x2e32,
2481     CARD_INTEL_B43                  = 0x2e92,
2482     CARD_INTEL_ILKD                 = 0x0042,
2483     CARD_INTEL_ILKM                 = 0x0046,
2484     CARD_INTEL_SNBD                 = 0x0122,
2485     CARD_INTEL_SNBM                 = 0x0126,
2486     CARD_INTEL_SNBS                 = 0x010a,
2487     CARD_INTEL_IVBD                 = 0x0162,
2488     CARD_INTEL_IVBM                 = 0x0166,
2489     CARD_INTEL_IVBS                 = 0x015a,
2490     CARD_INTEL_HWD                  = 0x0412,
2491     CARD_INTEL_HWM                  = 0x0416,
2492     CARD_INTEL_HD5000               = 0x0a26,
2493     CARD_INTEL_I5100_1              = 0x0a22,
2494     CARD_INTEL_I5100_2              = 0x0a2a,
2495     CARD_INTEL_I5100_3              = 0x0a2b,
2496     CARD_INTEL_I5100_4              = 0x0a2e,
2497     CARD_INTEL_IP5200_1             = 0x0d22,
2498     CARD_INTEL_IP5200_2             = 0x0d26,
2499     CARD_INTEL_IP5200_3             = 0x0d2a,
2500     CARD_INTEL_IP5200_4             = 0x0d2b,
2501     CARD_INTEL_IP5200_5             = 0x0d2e,
2502     CARD_INTEL_HD5300               = 0x161e,
2503     CARD_INTEL_HD5500               = 0x1616,
2504     CARD_INTEL_HD5600               = 0x1612,
2505     CARD_INTEL_HD6000               = 0x1626,
2506     CARD_INTEL_I6100                = 0x162b,
2507     CARD_INTEL_IP6200               = 0x1622,
2508     CARD_INTEL_IPP6300              = 0x162a,
2509     CARD_INTEL_HD510_1              = 0x1902,
2510     CARD_INTEL_HD510_2              = 0x1906,
2511     CARD_INTEL_HD510_3              = 0x190b,
2512     CARD_INTEL_HD515                = 0x191e,
2513     CARD_INTEL_HD520_1              = 0x1916,
2514     CARD_INTEL_HD520_2              = 0x1921,
2515     CARD_INTEL_HD530_1              = 0x1912,
2516     CARD_INTEL_HD530_2              = 0x191b,
2517     CARD_INTEL_HDP530               = 0x191d,
2518     CARD_INTEL_I540                 = 0x1926,
2519     CARD_INTEL_I550                 = 0x1927,
2520     CARD_INTEL_I555                 = 0x192b,
2521     CARD_INTEL_IP555                = 0x192d,
2522     CARD_INTEL_IP580_1              = 0x1932,
2523     CARD_INTEL_IP580_2              = 0x193b,
2524     CARD_INTEL_IPP580_1             = 0x193a,
2525     CARD_INTEL_IPP580_2             = 0x193d,
2526 };
2527 
2528 struct wined3d_fbo_ops
2529 {
2530     GLboolean (WINE_GLAPI *glIsRenderbuffer)(GLuint renderbuffer);
2531     void (WINE_GLAPI *glBindRenderbuffer)(GLenum target, GLuint renderbuffer);
2532     void (WINE_GLAPI *glDeleteRenderbuffers)(GLsizei n, const GLuint *renderbuffers);
2533     void (WINE_GLAPI *glGenRenderbuffers)(GLsizei n, GLuint *renderbuffers);
2534     void (WINE_GLAPI *glRenderbufferStorage)(GLenum target, GLenum internalformat,
2535             GLsizei width, GLsizei height);
2536     void (WINE_GLAPI *glRenderbufferStorageMultisample)(GLenum target, GLsizei samples,
2537             GLenum internalformat, GLsizei width, GLsizei height);
2538     void (WINE_GLAPI *glGetRenderbufferParameteriv)(GLenum target, GLenum pname, GLint *params);
2539     GLboolean (WINE_GLAPI *glIsFramebuffer)(GLuint framebuffer);
2540     void (WINE_GLAPI *glBindFramebuffer)(GLenum target, GLuint framebuffer);
2541     void (WINE_GLAPI *glDeleteFramebuffers)(GLsizei n, const GLuint *framebuffers);
2542     void (WINE_GLAPI *glGenFramebuffers)(GLsizei n, GLuint *framebuffers);
2543     GLenum (WINE_GLAPI *glCheckFramebufferStatus)(GLenum target);
2544     void (WINE_GLAPI *glFramebufferTexture)(GLenum target, GLenum attachment,
2545             GLuint texture, GLint level);
2546     void (WINE_GLAPI *glFramebufferTexture1D)(GLenum target, GLenum attachment,
2547             GLenum textarget, GLuint texture, GLint level);
2548     void (WINE_GLAPI *glFramebufferTexture2D)(GLenum target, GLenum attachment,
2549             GLenum textarget, GLuint texture, GLint level);
2550     void (WINE_GLAPI *glFramebufferTexture3D)(GLenum target, GLenum attachment,
2551             GLenum textarget, GLuint texture, GLint level, GLint layer);
2552     void (WINE_GLAPI *glFramebufferTextureLayer)(GLenum target, GLenum attachment,
2553             GLuint texture, GLint level, GLint layer);
2554     void (WINE_GLAPI *glFramebufferRenderbuffer)(GLenum target, GLenum attachment,
2555             GLenum renderbuffertarget, GLuint renderbuffer);
2556     void (WINE_GLAPI *glGetFramebufferAttachmentParameteriv)(GLenum target, GLenum attachment,
2557             GLenum pname, GLint *params);
2558     void (WINE_GLAPI *glBlitFramebuffer)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
2559             GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
2560     void (WINE_GLAPI *glGenerateMipmap)(GLenum target);
2561 };
2562 
2563 struct wined3d_gl_limits
2564 {
2565     UINT buffers;
2566     UINT dual_buffers;
2567     UINT lights;
2568     UINT textures;
2569     UINT texture_coords;
2570     unsigned int uniform_blocks[WINED3D_SHADER_TYPE_COUNT];
2571     unsigned int samplers[WINED3D_SHADER_TYPE_COUNT];
2572     unsigned int graphics_samplers;
2573     unsigned int combined_samplers;
2574     UINT general_combiners;
2575     UINT user_clip_distances;
2576     UINT texture_size;
2577     UINT texture3d_size;
2578     float pointsize_max;
2579     float pointsize_min;
2580     UINT anisotropy;
2581     float shininess;
2582     UINT samples;
2583     UINT vertex_attribs;
2584 
2585     unsigned int texture_buffer_offset_alignment;
2586 
2587     unsigned int framebuffer_width;
2588     unsigned int framebuffer_height;
2589 
2590     UINT glsl_varyings;
2591     UINT glsl_vs_float_constants;
2592     UINT glsl_ps_float_constants;
2593 
2594     UINT arb_vs_float_constants;
2595     UINT arb_vs_native_constants;
2596     UINT arb_vs_instructions;
2597     UINT arb_vs_temps;
2598     UINT arb_ps_float_constants;
2599     UINT arb_ps_local_constants;
2600     UINT arb_ps_native_constants;
2601     UINT arb_ps_instructions;
2602     UINT arb_ps_temps;
2603 };
2604 
2605 void wined3d_gl_limits_get_texture_unit_range(const struct wined3d_gl_limits *gl_limits,
2606         enum wined3d_shader_type shader_type, unsigned int *base, unsigned int *count) DECLSPEC_HIDDEN;
2607 void wined3d_gl_limits_get_uniform_block_range(const struct wined3d_gl_limits *gl_limits,
2608         enum wined3d_shader_type shader_type, unsigned int *base, unsigned int *count) DECLSPEC_HIDDEN;
2609 
2610 struct wined3d_gl_info
2611 {
2612     DWORD selected_gl_version;
2613     DWORD glsl_version;
2614     struct wined3d_gl_limits limits;
2615     DWORD reserved_glsl_constants, reserved_arb_constants;
2616     DWORD quirks;
2617     BOOL supported[WINED3D_GL_EXT_COUNT];
2618     GLint wrap_lookup[WINED3D_TADDRESS_MIRROR_ONCE - WINED3D_TADDRESS_WRAP + 1];
2619 
2620     HGLRC (WINAPI *p_wglCreateContextAttribsARB)(HDC dc, HGLRC share, const GLint *attribs);
2621     struct opengl_funcs gl_ops;
2622     struct wined3d_fbo_ops fbo_ops;
2623 
2624     struct wined3d_format *formats;
2625     unsigned int format_count;
2626 };
2627 
2628 struct wined3d_driver_info
2629 {
2630     enum wined3d_pci_vendor vendor;
2631     enum wined3d_pci_device device;
2632     const char *name;
2633     const char *description;
2634     UINT64 vram_bytes;
2635     DWORD version_high;
2636     DWORD version_low;
2637 };
2638 
2639 /* The adapter structure */
2640 struct wined3d_adapter
2641 {
2642     UINT ordinal;
2643     POINT monitor_position;
2644     enum wined3d_format_id screen_format;
2645 
2646     struct wined3d_gl_info  gl_info;
2647     struct wined3d_d3d_info d3d_info;
2648     struct wined3d_driver_info driver_info;
2649     WCHAR                   DeviceName[CCHDEVICENAME]; /* DeviceName for use with e.g. ChangeDisplaySettings */
2650     unsigned int cfg_count;
2651     struct wined3d_pixel_format *cfgs;
2652     UINT64 vram_bytes;
2653     UINT64 vram_bytes_used;
2654     LUID luid;
2655 
2656     const struct wined3d_vertex_pipe_ops *vertex_pipe;
2657     const struct fragment_pipeline *fragment_pipe;
2658     const struct wined3d_shader_backend_ops *shader_backend;
2659 };
2660 
2661 struct wined3d_caps_gl_ctx
2662 {
2663     HDC dc;
2664     HWND wnd;
2665     HGLRC gl_ctx;
2666     HDC restore_dc;
2667     HGLRC restore_gl_ctx;
2668 
2669     const struct wined3d_gl_info *gl_info;
2670     GLuint test_vbo;
2671     GLuint test_program_id;
2672 };
2673 
2674 BOOL wined3d_adapter_init_format_info(struct wined3d_adapter *adapter,
2675         struct wined3d_caps_gl_ctx *ctx) DECLSPEC_HIDDEN;
2676 UINT64 adapter_adjust_memory(struct wined3d_adapter *adapter, INT64 amount) DECLSPEC_HIDDEN;
2677 
2678 BOOL wined3d_caps_gl_ctx_test_viewport_subpixel_bits(struct wined3d_caps_gl_ctx *ctx) DECLSPEC_HIDDEN;
2679 
2680 void install_gl_compat_wrapper(struct wined3d_gl_info *gl_info, enum wined3d_gl_extension ext) DECLSPEC_HIDDEN;
2681 
2682 enum wined3d_projection_type
2683 {
2684     WINED3D_PROJECTION_NONE    = 0,
2685     WINED3D_PROJECTION_COUNT3  = 1,
2686     WINED3D_PROJECTION_COUNT4  = 2
2687 };
2688 
2689 /*****************************************************************************
2690  * Fixed function pipeline replacements
2691  */
2692 #define ARG_UNUSED          0xff
2693 struct texture_stage_op
2694 {
2695     unsigned                cop : 8;
2696     unsigned                carg1 : 8;
2697     unsigned                carg2 : 8;
2698     unsigned                carg0 : 8;
2699 
2700     unsigned                aop : 8;
2701     unsigned                aarg1 : 8;
2702     unsigned                aarg2 : 8;
2703     unsigned                aarg0 : 8;
2704 
2705     struct color_fixup_desc color_fixup;
2706     unsigned                tex_type : 3;
2707     unsigned                tmp_dst : 1;
2708     unsigned                projected : 2;
2709     unsigned                padding : 10;
2710 };
2711 
2712 struct ffp_frag_settings
2713 {
2714     struct texture_stage_op op[MAX_TEXTURES];
2715     enum wined3d_ffp_ps_fog_mode fog;
2716     unsigned char sRGB_write;
2717     unsigned char emul_clipplanes;
2718     unsigned char texcoords_initialized;
2719     unsigned char color_key_enabled : 1;
2720     unsigned char pointsprite : 1;
2721     unsigned char flatshading : 1;
2722     unsigned char alpha_test_func : 3;
2723     unsigned char padding : 2;
2724 };
2725 
2726 struct ffp_frag_desc
2727 {
2728     struct wine_rb_entry entry;
2729     struct ffp_frag_settings    settings;
2730 };
2731 
2732 int wined3d_ffp_frag_program_key_compare(const void *key, const struct wine_rb_entry *entry) DECLSPEC_HIDDEN;
2733 int wined3d_ffp_vertex_program_key_compare(const void *key, const struct wine_rb_entry *entry) DECLSPEC_HIDDEN;
2734 
2735 extern const struct wined3d_parent_ops wined3d_null_parent_ops DECLSPEC_HIDDEN;
2736 
2737 unsigned int wined3d_max_compat_varyings(const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
2738 void gen_ffp_frag_op(const struct wined3d_context *context, const struct wined3d_state *state,
2739         struct ffp_frag_settings *settings, BOOL ignore_textype) DECLSPEC_HIDDEN;
2740 const struct ffp_frag_desc *find_ffp_frag_shader(const struct wine_rb_tree *fragment_shaders,
2741         const struct ffp_frag_settings *settings) DECLSPEC_HIDDEN;
2742 void add_ffp_frag_shader(struct wine_rb_tree *shaders, struct ffp_frag_desc *desc) DECLSPEC_HIDDEN;
2743 void wined3d_ftoa(float value, char *s) DECLSPEC_HIDDEN;
2744 
2745 extern const float wined3d_srgb_const0[] DECLSPEC_HIDDEN;
2746 extern const float wined3d_srgb_const1[] DECLSPEC_HIDDEN;
2747 
2748 enum wined3d_ffp_vs_fog_mode
2749 {
2750     WINED3D_FFP_VS_FOG_OFF      = 0,
2751     WINED3D_FFP_VS_FOG_FOGCOORD = 1,
2752     WINED3D_FFP_VS_FOG_DEPTH    = 2,
2753     WINED3D_FFP_VS_FOG_RANGE    = 3,
2754 };
2755 
2756 #define WINED3D_FFP_TCI_SHIFT               16
2757 #define WINED3D_FFP_TCI_MASK                0xffu
2758 
2759 #define WINED3D_FFP_LIGHT_TYPE_SHIFT(idx)   (3 * (idx))
2760 #define WINED3D_FFP_LIGHT_TYPE_MASK         0x7u
2761 
2762 struct wined3d_ffp_vs_settings
2763 {
2764     DWORD point_light_count          : 4;
2765     DWORD spot_light_count           : 4;
2766     DWORD directional_light_count    : 4;
2767     DWORD parallel_point_light_count : 4;
2768     DWORD diffuse_source  : 2;
2769     DWORD emissive_source : 2;
2770     DWORD ambient_source  : 2;
2771     DWORD specular_source : 2;
2772     DWORD transformed     : 1;
2773     DWORD vertexblends    : 2;
2774     DWORD clipping        : 1;
2775     DWORD normal          : 1;
2776     DWORD normalize       : 1;
2777     DWORD lighting        : 1;
2778     DWORD localviewer     : 1;
2779 
2780     DWORD point_size      : 1;
2781     DWORD per_vertex_point_size : 1;
2782     DWORD fog_mode        : 2;
2783     DWORD texcoords       : 8;  /* MAX_TEXTURES */
2784     DWORD ortho_fog       : 1;
2785     DWORD flatshading     : 1;
2786     DWORD swizzle_map     : 16; /* MAX_ATTRIBS, 16 */
2787     DWORD vb_indices      : 1;
2788     DWORD sw_blending     : 1;
2789 
2790     DWORD texgen[MAX_TEXTURES];
2791 };
2792 
2793 struct wined3d_ffp_vs_desc
2794 {
2795     struct wine_rb_entry entry;
2796     struct wined3d_ffp_vs_settings settings;
2797 };
2798 
2799 void wined3d_ffp_get_vs_settings(const struct wined3d_context *context,
2800         const struct wined3d_state *state, struct wined3d_ffp_vs_settings *settings) DECLSPEC_HIDDEN;
2801 
2802 struct wined3d
2803 {
2804     LONG ref;
2805     DWORD flags;
2806     UINT adapter_count;
2807     struct wined3d_adapter adapters[1];
2808 };
2809 
2810 HRESULT wined3d_init(struct wined3d *wined3d, DWORD flags) DECLSPEC_HIDDEN;
2811 BOOL wined3d_register_window(HWND window, struct wined3d_device *device) DECLSPEC_HIDDEN;
2812 void wined3d_unregister_window(HWND window) DECLSPEC_HIDDEN;
2813 
2814 struct wined3d_blend_state
2815 {
2816     LONG refcount;
2817     struct wined3d_blend_state_desc desc;
2818 
2819     void *parent;
2820     const struct wined3d_parent_ops *parent_ops;
2821 
2822     struct wined3d_device *device;
2823 };
2824 
2825 struct wined3d_rasterizer_state
2826 {
2827     LONG refcount;
2828     struct wined3d_rasterizer_state_desc desc;
2829 
2830     void *parent;
2831     const struct wined3d_parent_ops *parent_ops;
2832 
2833     struct wined3d_device *device;
2834 };
2835 
2836 struct wined3d_stream_output
2837 {
2838     struct wined3d_buffer *buffer;
2839     UINT offset;
2840 };
2841 
2842 struct wined3d_stream_state
2843 {
2844     struct wined3d_buffer *buffer;
2845     UINT offset;
2846     UINT stride;
2847     UINT frequency;
2848     UINT flags;
2849 };
2850 
2851 #define WINED3D_STATE_NO_REF        0x00000001
2852 #define WINED3D_STATE_INIT_DEFAULT  0x00000002
2853 
2854 struct wined3d_state
2855 {
2856     DWORD flags;
2857     const struct wined3d_fb_state *fb;
2858 
2859     struct wined3d_vertex_declaration *vertex_declaration;
2860     struct wined3d_stream_output stream_output[WINED3D_MAX_STREAM_OUTPUT_BUFFERS];
2861     struct wined3d_stream_state streams[MAX_STREAMS + 1 /* tesselated pseudo-stream */];
2862     struct wined3d_buffer *index_buffer;
2863     enum wined3d_format_id index_format;
2864     unsigned int index_offset;
2865     int base_vertex_index;
2866     int load_base_vertex_index; /* Non-indexed drawing needs 0 here, indexed needs base_vertex_index. */
2867     GLenum gl_primitive_type;
2868     GLint gl_patch_vertices;
2869     struct wined3d_query *predicate;
2870     BOOL predicate_value;
2871 
2872     struct wined3d_shader *shader[WINED3D_SHADER_TYPE_COUNT];
2873     struct wined3d_buffer *cb[WINED3D_SHADER_TYPE_COUNT][MAX_CONSTANT_BUFFERS];
2874     struct wined3d_sampler *sampler[WINED3D_SHADER_TYPE_COUNT][MAX_SAMPLER_OBJECTS];
2875     struct wined3d_shader_resource_view *shader_resource_view[WINED3D_SHADER_TYPE_COUNT][MAX_SHADER_RESOURCE_VIEWS];
2876     struct wined3d_unordered_access_view *unordered_access_view[WINED3D_PIPELINE_COUNT][MAX_UNORDERED_ACCESS_VIEWS];
2877 
2878     BOOL vs_consts_b[WINED3D_MAX_CONSTS_B];
2879     struct wined3d_ivec4 vs_consts_i[WINED3D_MAX_CONSTS_I];
2880     struct wined3d_vec4 vs_consts_f[WINED3D_MAX_VS_CONSTS_F];
2881 
2882     BOOL ps_consts_b[WINED3D_MAX_CONSTS_B];
2883     struct wined3d_ivec4 ps_consts_i[WINED3D_MAX_CONSTS_I];
2884     struct wined3d_vec4 ps_consts_f[WINED3D_MAX_PS_CONSTS_F];
2885 
2886     struct wined3d_texture *textures[MAX_COMBINED_SAMPLERS];
2887     DWORD sampler_states[MAX_COMBINED_SAMPLERS][WINED3D_HIGHEST_SAMPLER_STATE + 1];
2888     DWORD texture_states[MAX_TEXTURES][WINED3D_HIGHEST_TEXTURE_STATE + 1];
2889 
2890     struct wined3d_matrix transforms[HIGHEST_TRANSFORMSTATE + 1];
2891     struct wined3d_vec4 clip_planes[MAX_CLIP_DISTANCES];
2892     struct wined3d_material material;
2893     struct wined3d_viewport viewports[WINED3D_MAX_VIEWPORTS];
2894     unsigned int viewport_count;
2895     RECT scissor_rects[WINED3D_MAX_VIEWPORTS];
2896     unsigned int scissor_rect_count;
2897 
2898     /* Light hashmap. Collisions are handled using linked lists. */
2899 #define LIGHTMAP_SIZE 43
2900 #define LIGHTMAP_HASHFUNC(x) ((x) % LIGHTMAP_SIZE)
2901     struct list light_map[LIGHTMAP_SIZE];
2902     const struct wined3d_light_info *lights[MAX_ACTIVE_LIGHTS];
2903 
2904     DWORD render_states[WINEHIGHEST_RENDER_STATE + 1];
2905     struct wined3d_blend_state *blend_state;
2906     struct wined3d_rasterizer_state *rasterizer_state;
2907 };
2908 
2909 static inline BOOL wined3d_dualblend_enabled(const struct wined3d_state *state, const struct wined3d_gl_info *gl_info)
2910 {
2911     if (!state->fb->render_targets[0]) return FALSE;
2912     if (!state->render_states[WINED3D_RS_ALPHABLENDENABLE]) return FALSE;
2913     if (!gl_info->supported[ARB_BLEND_FUNC_EXTENDED]) return FALSE;
2914 
2915 #define IS_DUAL_SOURCE_BLEND(x) ((x) >= WINED3D_BLEND_SRC1COLOR && (x) <= WINED3D_BLEND_INVSRC1ALPHA)
2916     if (IS_DUAL_SOURCE_BLEND(state->render_states[WINED3D_RS_SRCBLEND]))  return TRUE;
2917     if (IS_DUAL_SOURCE_BLEND(state->render_states[WINED3D_RS_DESTBLEND])) return TRUE;
2918     if (IS_DUAL_SOURCE_BLEND(state->render_states[WINED3D_RS_SRCBLENDALPHA]))  return TRUE;
2919     if (IS_DUAL_SOURCE_BLEND(state->render_states[WINED3D_RS_DESTBLENDALPHA])) return TRUE;
2920 #undef IS_DUAL_SOURCE_BLEND
2921 
2922     return FALSE;
2923 }
2924 
2925 struct wined3d_dummy_textures
2926 {
2927     GLuint tex_1d;
2928     GLuint tex_2d;
2929     GLuint tex_rect;
2930     GLuint tex_3d;
2931     GLuint tex_cube;
2932     GLuint tex_cube_array;
2933     GLuint tex_1d_array;
2934     GLuint tex_2d_array;
2935     GLuint tex_buffer;
2936     GLuint tex_2d_ms;
2937     GLuint tex_2d_ms_array;
2938 };
2939 
2940 #define WINED3D_UNMAPPED_STAGE ~0u
2941 
2942 /* Multithreaded flag. Removed from the public header to signal that
2943  * wined3d_device_create() ignores it. */
2944 #define WINED3DCREATE_MULTITHREADED 0x00000004
2945 
2946 struct wined3d_device
2947 {
2948     LONG ref;
2949 
2950     /* WineD3D Information  */
2951     struct wined3d_device_parent *device_parent;
2952     struct wined3d *wined3d;
2953     struct wined3d_adapter *adapter;
2954 
2955     /* Window styles to restore when switching fullscreen mode */
2956     LONG                    style;
2957     LONG                    exStyle;
2958 
2959     const struct wined3d_shader_backend_ops *shader_backend;
2960     void *shader_priv;
2961     void *fragment_priv;
2962     void *vertex_priv;
2963     struct StateEntry StateTable[STATE_HIGHEST + 1];
2964     /* Array of functions for states which are handled by more than one pipeline part */
2965     APPLYSTATEFUNC *multistate_funcs[STATE_HIGHEST + 1];
2966     struct wined3d_blitter *blitter;
2967 
2968     BYTE bCursorVisible : 1;
2969     BYTE d3d_initialized : 1;
2970     BYTE inScene : 1;                   /* A flag to check for proper BeginScene / EndScene call pairs */
2971     BYTE softwareVertexProcessing : 1;  /* process vertex shaders using software or hardware */
2972     BYTE filter_messages : 1;
2973     BYTE padding : 3;
2974 
2975     unsigned char           surface_alignment; /* Line Alignment of surfaces                      */
2976 
2977     WORD padding2 : 16;
2978 
2979     struct wined3d_state state;
2980     struct wined3d_state *update_state;
2981     struct wined3d_stateblock *recording;
2982 
2983     /* Internal use fields  */
2984     struct wined3d_device_creation_parameters create_parms;
2985     HWND focus_window;
2986 
2987     struct wined3d_rendertarget_view *back_buffer_view;
2988     struct wined3d_swapchain **swapchains;
2989     UINT swapchain_count;
2990     unsigned int max_frame_latency;
2991 
2992     struct list             resources; /* a linked list to track resources created by the device */
2993     struct list             shaders;   /* a linked list to track shaders (pixel and vertex)      */
2994     struct wine_rb_tree samplers;
2995 
2996     /* Render Target Support */
2997     struct wined3d_fb_state fb;
2998     struct wined3d_rendertarget_view *auto_depth_stencil_view;
2999 
3000     /* Cursor management */
3001     UINT                    xHotSpot;
3002     UINT                    yHotSpot;
3003     UINT                    xScreenSpace;
3004     UINT                    yScreenSpace;
3005     UINT                    cursorWidth, cursorHeight;
3006     struct wined3d_texture *cursor_texture;
3007     HCURSOR                 hardwareCursor;
3008 
3009     /* The Wine logo texture */
3010     struct wined3d_texture *logo_texture;
3011 
3012     /* Textures for when no other textures are mapped */
3013     struct wined3d_dummy_textures dummy_textures;
3014 
3015     /* Default sampler used to emulate the direct resource access without using wined3d_sampler */
3016     struct wined3d_sampler *default_sampler;
3017     struct wined3d_sampler *null_sampler;
3018 
3019     /* Command stream */
3020     struct wined3d_cs *cs;
3021 
3022     /* Context management */
3023     struct wined3d_context **contexts;
3024     UINT context_count;
3025 };
3026 
3027 void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, const struct wined3d_fb_state *fb,
3028         UINT rect_count, const RECT *rects, const RECT *draw_rect, DWORD flags,
3029         const struct wined3d_color *color, float depth, DWORD stencil) DECLSPEC_HIDDEN;
3030 BOOL device_context_add(struct wined3d_device *device, struct wined3d_context *context) DECLSPEC_HIDDEN;
3031 void device_context_remove(struct wined3d_device *device, struct wined3d_context *context) DECLSPEC_HIDDEN;
3032 HRESULT device_init(struct wined3d_device *device, struct wined3d *wined3d,
3033         UINT adapter_idx, enum wined3d_device_type device_type, HWND focus_window, DWORD flags,
3034         BYTE surface_alignment, struct wined3d_device_parent *device_parent) DECLSPEC_HIDDEN;
3035 LRESULT device_process_message(struct wined3d_device *device, HWND window, BOOL unicode,
3036         UINT message, WPARAM wparam, LPARAM lparam, WNDPROC proc) DECLSPEC_HIDDEN;
3037 void device_resource_add(struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN;
3038 void device_resource_released(struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN;
3039 void device_invalidate_state(const struct wined3d_device *device, DWORD state) DECLSPEC_HIDDEN;
3040 
3041 static inline BOOL isStateDirty(const struct wined3d_context *context, DWORD state)
3042 {
3043     DWORD idx = state / (sizeof(*context->isStateDirty) * CHAR_BIT);
3044     BYTE shift = state & ((sizeof(*context->isStateDirty) * CHAR_BIT) - 1);
3045     return context->isStateDirty[idx] & (1u << shift);
3046 }
3047 
3048 const char *wined3d_debug_resource_access(DWORD access) DECLSPEC_HIDDEN;
3049 
3050 static inline BOOL wined3d_resource_access_is_managed(unsigned int access)
3051 {
3052     return !(~access & (WINED3D_RESOURCE_ACCESS_GPU | WINED3D_RESOURCE_ACCESS_CPU));
3053 }
3054 
3055 struct wined3d_resource_ops
3056 {
3057     ULONG (*resource_incref)(struct wined3d_resource *resource);
3058     ULONG (*resource_decref)(struct wined3d_resource *resource);
3059     void (*resource_preload)(struct wined3d_resource *resource);
3060     void (*resource_unload)(struct wined3d_resource *resource);
3061     HRESULT (*resource_sub_resource_map)(struct wined3d_resource *resource, unsigned int sub_resource_idx,
3062             struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags);
3063     HRESULT (*resource_map_info)(struct wined3d_resource *resource, unsigned int sub_resource_idx,
3064             struct wined3d_map_info *info, DWORD flags);
3065     HRESULT (*resource_sub_resource_unmap)(struct wined3d_resource *resource, unsigned int sub_resource_idx);
3066 };
3067 
3068 struct wined3d_resource
3069 {
3070     LONG ref;
3071     LONG bind_count;
3072     LONG map_count;
3073     LONG access_count;
3074     struct wined3d_device *device;
3075     enum wined3d_resource_type type;
3076     enum wined3d_gl_resource_type gl_type;
3077     const struct wined3d_format *format;
3078     unsigned int format_flags;
3079     enum wined3d_multisample_type multisample_type;
3080     UINT multisample_quality;
3081     DWORD usage;
3082     unsigned int access;
3083     WORD draw_binding;
3084     WORD map_binding;
3085     UINT width;
3086     UINT height;
3087     UINT depth;
3088     UINT size;
3089     DWORD priority;
3090     void *heap_memory;
3091 
3092     void *parent;
3093     const struct wined3d_parent_ops *parent_ops;
3094     const struct wined3d_resource_ops *resource_ops;
3095 
3096     struct list resource_list_entry;
3097 };
3098 
3099 static inline ULONG wined3d_resource_incref(struct wined3d_resource *resource)
3100 {
3101     return resource->resource_ops->resource_incref(resource);
3102 }
3103 
3104 static inline ULONG wined3d_resource_decref(struct wined3d_resource *resource)
3105 {
3106     return resource->resource_ops->resource_decref(resource);
3107 }
3108 
3109 static inline void wined3d_resource_acquire(struct wined3d_resource *resource)
3110 {
3111     InterlockedIncrement(&resource->access_count);
3112 }
3113 
3114 static inline void wined3d_resource_release(struct wined3d_resource *resource)
3115 {
3116     InterlockedDecrement(&resource->access_count);
3117 }
3118 
3119 void resource_cleanup(struct wined3d_resource *resource) DECLSPEC_HIDDEN;
3120 HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device *device,
3121         enum wined3d_resource_type type, const struct wined3d_format *format,
3122         enum wined3d_multisample_type multisample_type, unsigned int multisample_quality,
3123         unsigned int usage, unsigned int access, unsigned int width, unsigned int height, unsigned int depth,
3124         unsigned int size, void *parent, const struct wined3d_parent_ops *parent_ops,
3125         const struct wined3d_resource_ops *resource_ops) DECLSPEC_HIDDEN;
3126 void resource_unload(struct wined3d_resource *resource) DECLSPEC_HIDDEN;
3127 BOOL wined3d_resource_allocate_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN;
3128 void wined3d_resource_free_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN;
3129 GLbitfield wined3d_resource_gl_map_flags(DWORD d3d_flags) DECLSPEC_HIDDEN;
3130 GLenum wined3d_resource_gl_legacy_map_flags(DWORD d3d_flags) DECLSPEC_HIDDEN;
3131 BOOL wined3d_resource_is_offscreen(struct wined3d_resource *resource) DECLSPEC_HIDDEN;
3132 void wined3d_resource_update_draw_binding(struct wined3d_resource *resource) DECLSPEC_HIDDEN;
3133 
3134 /* Tests show that the start address of resources is 32 byte aligned */
3135 #define RESOURCE_ALIGNMENT 16
3136 #define WINED3D_CONSTANT_BUFFER_ALIGNMENT 16
3137 
3138 struct gl_texture
3139 {
3140     struct wined3d_sampler_desc sampler_desc;
3141     unsigned int base_level;
3142     GLuint name;
3143 };
3144 
3145 struct wined3d_blt_info
3146 {
3147     GLenum bind_target;
3148     struct wined3d_vec3 texcoords[4];
3149 };
3150 
3151 struct wined3d_texture_ops
3152 {
3153     BOOL (*texture_load_location)(struct wined3d_texture *texture, unsigned int sub_resource_idx,
3154             struct wined3d_context *context, DWORD location);
3155 };
3156 
3157 #define WINED3D_TEXTURE_COND_NP2            0x00000001
3158 #define WINED3D_TEXTURE_COND_NP2_EMULATED   0x00000002
3159 #define WINED3D_TEXTURE_POW2_MAT_IDENT      0x00000004
3160 #define WINED3D_TEXTURE_IS_SRGB             0x00000008
3161 #define WINED3D_TEXTURE_RGB_ALLOCATED       0x00000010
3162 #define WINED3D_TEXTURE_RGB_VALID           0x00000020
3163 #define WINED3D_TEXTURE_SRGB_ALLOCATED      0x00000040
3164 #define WINED3D_TEXTURE_SRGB_VALID          0x00000080
3165 #define WINED3D_TEXTURE_CONVERTED           0x00000100
3166 #define WINED3D_TEXTURE_PIN_SYSMEM          0x00000200
3167 #define WINED3D_TEXTURE_NORMALIZED_COORDS   0x00000400
3168 #define WINED3D_TEXTURE_GET_DC_LENIENT      0x00000800
3169 #define WINED3D_TEXTURE_DC_IN_USE           0x00001000
3170 #define WINED3D_TEXTURE_DISCARD             0x00002000
3171 #define WINED3D_TEXTURE_GET_DC              0x00004000
3172 #define WINED3D_TEXTURE_GENERATE_MIPMAPS    0x00008000
3173 
3174 #define WINED3D_TEXTURE_ASYNC_COLOR_KEY     0x00000001
3175 
3176 struct wined3d_texture
3177 {
3178     struct wined3d_resource resource;
3179     const struct wined3d_texture_ops *texture_ops;
3180     struct gl_texture texture_rgb, texture_srgb;
3181     struct wined3d_swapchain *swapchain;
3182     unsigned int pow2_width;
3183     unsigned int pow2_height;
3184     UINT layer_count;
3185     UINT level_count;
3186     unsigned int download_count;
3187     unsigned int sysmem_count;
3188     float pow2_matrix[16];
3189     UINT lod;
3190     DWORD sampler;
3191     DWORD flags;
3192     GLenum target;
3193     DWORD update_map_binding;
3194 
3195     GLuint rb_multisample;
3196     GLuint rb_resolved;
3197 
3198     void *user_memory;
3199     unsigned int row_pitch;
3200     unsigned int slice_pitch;
3201 
3202     /* May only be accessed from the command stream worker thread. */
3203     struct wined3d_texture_async
3204     {
3205         DWORD flags;
3206 
3207         /* Color keys for DDraw */
3208         struct wined3d_color_key dst_blt_color_key;
3209         struct wined3d_color_key src_blt_color_key;
3210         struct wined3d_color_key dst_overlay_color_key;
3211         struct wined3d_color_key src_overlay_color_key;
3212         struct wined3d_color_key gl_color_key;
3213         DWORD color_key_flags;
3214     } async;
3215 
3216     struct wined3d_overlay_info
3217     {
3218         struct list entry;
3219         struct list overlays;
3220         struct wined3d_texture *dst_texture;
3221         unsigned int dst_sub_resource_idx;
3222         RECT src_rect;
3223         RECT dst_rect;
3224     } *overlay_info;
3225 
3226     struct wined3d_dc_info
3227     {
3228         HBITMAP bitmap;
3229         HDC dc;
3230     } *dc_info;
3231 
3232     struct list renderbuffers;
3233     const struct wined3d_renderbuffer_entry *current_renderbuffer;
3234 
3235     struct wined3d_texture_sub_resource
3236     {
3237         void *parent;
3238         const struct wined3d_parent_ops *parent_ops;
3239 
3240         unsigned int offset;
3241         unsigned int size;
3242 
3243         unsigned int map_count;
3244         DWORD locations;
3245         GLuint buffer_object;
3246     } sub_resources[1];
3247 };
3248 
3249 static inline struct wined3d_texture *texture_from_resource(struct wined3d_resource *resource)
3250 {
3251     return CONTAINING_RECORD(resource, struct wined3d_texture, resource);
3252 }
3253 
3254 static inline GLenum wined3d_texture_get_sub_resource_target(const struct wined3d_texture *texture,
3255         unsigned int sub_resource_idx)
3256 {
3257     static const GLenum cube_targets[] =
3258     {
3259         GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB,
3260         GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB,
3261         GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB,
3262         GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB,
3263         GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB,
3264         GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB,
3265     };
3266 
3267     return texture->resource.usage & WINED3DUSAGE_LEGACY_CUBEMAP
3268             ? cube_targets[sub_resource_idx / texture->level_count] : texture->target;
3269 }
3270 
3271 static inline struct gl_texture *wined3d_texture_get_gl_texture(struct wined3d_texture *texture,
3272         BOOL srgb)
3273 {
3274     return srgb ? &texture->texture_srgb : &texture->texture_rgb;
3275 }
3276 
3277 static inline unsigned int wined3d_texture_get_level_width(const struct wined3d_texture *texture,
3278         unsigned int level)
3279 {
3280     return max(1, texture->resource.width >> level);
3281 }
3282 
3283 static inline unsigned int wined3d_texture_get_level_height(const struct wined3d_texture *texture,
3284         unsigned int level)
3285 {
3286     return max(1, texture->resource.height >> level);
3287 }
3288 
3289 static inline unsigned int wined3d_texture_get_level_depth(const struct wined3d_texture *texture,
3290         unsigned int level)
3291 {
3292     return max(1, texture->resource.depth >> level);
3293 }
3294 
3295 static inline unsigned int wined3d_texture_get_level_pow2_width(const struct wined3d_texture *texture,
3296         unsigned int level)
3297 {
3298     return max(1, texture->pow2_width >> level);
3299 }
3300 
3301 static inline unsigned int wined3d_texture_get_level_pow2_height(const struct wined3d_texture *texture,
3302         unsigned int level)
3303 {
3304     return max(1, texture->pow2_height >> level);
3305 }
3306 
3307 static inline void wined3d_texture_get_level_box(const struct wined3d_texture *texture,
3308         unsigned int level, struct wined3d_box *box)
3309 {
3310     wined3d_box_set(box, 0, 0,
3311             wined3d_texture_get_level_width(texture, level),
3312             wined3d_texture_get_level_height(texture, level),
3313             0, wined3d_texture_get_level_depth(texture, level));
3314 }
3315 
3316 HRESULT texture2d_blt(struct wined3d_texture *dst_texture, unsigned int dst_sub_resource_idx,
3317         const struct wined3d_box *dst_box, struct wined3d_texture *src_texture,
3318         unsigned int src_sub_resource_idx, const struct wined3d_box *src_box, DWORD flags,
3319         const struct wined3d_blt_fx *blt_fx, enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN;
3320 void texture2d_get_blt_info(const struct wined3d_texture *texture, unsigned int sub_resource_idx,
3321         const RECT *rect, struct wined3d_blt_info *info) DECLSPEC_HIDDEN;
3322 BOOL texture2d_load_drawable(struct wined3d_texture *texture, unsigned int sub_resource_idx,
3323         struct wined3d_context *context) DECLSPEC_HIDDEN;
3324 void texture2d_load_fb_texture(struct wined3d_texture *texture, unsigned int sub_resource_idx,
3325         BOOL srgb, struct wined3d_context *context) DECLSPEC_HIDDEN;
3326 BOOL texture2d_load_renderbuffer(struct wined3d_texture *texture, unsigned int sub_resource_idx,
3327         struct wined3d_context *context, DWORD dst_location) DECLSPEC_HIDDEN;
3328 BOOL texture2d_load_sysmem(struct wined3d_texture *texture, unsigned int sub_resource_idx,
3329         struct wined3d_context *context, DWORD dst_location) DECLSPEC_HIDDEN;
3330 BOOL texture2d_load_texture(struct wined3d_texture *texture, unsigned int sub_resource_idx,
3331         struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN;
3332 
3333 void wined3d_texture_apply_sampler_desc(struct wined3d_texture *texture,
3334         const struct wined3d_sampler_desc *sampler_desc, const struct wined3d_context *context) DECLSPEC_HIDDEN;
3335 void wined3d_texture_bind(struct wined3d_texture *texture,
3336         struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN;
3337 void wined3d_texture_bind_and_dirtify(struct wined3d_texture *texture,
3338         struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN;
3339 HRESULT wined3d_texture_check_box_dimensions(const struct wined3d_texture *texture,
3340         unsigned int level, const struct wined3d_box *box) DECLSPEC_HIDDEN;
3341 GLenum wined3d_texture_get_gl_buffer(const struct wined3d_texture *texture) DECLSPEC_HIDDEN;
3342 void wined3d_texture_get_memory(struct wined3d_texture *texture, unsigned int sub_resource_idx,
3343         struct wined3d_bo_address *data, DWORD locations) DECLSPEC_HIDDEN;
3344 void wined3d_texture_invalidate_location(struct wined3d_texture *texture,
3345         unsigned int sub_resource_idx, DWORD location) DECLSPEC_HIDDEN;
3346 void wined3d_texture_load(struct wined3d_texture *texture,
3347         struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN;
3348 BOOL wined3d_texture_load_location(struct wined3d_texture *texture,
3349         unsigned int sub_resource_idx, struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN;
3350 BOOL wined3d_texture_prepare_location(struct wined3d_texture *texture, unsigned int sub_resource_idx,
3351         struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN;
3352 void wined3d_texture_prepare_texture(struct wined3d_texture *texture,
3353         struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN;
3354 void wined3d_texture_set_compatible_renderbuffer(struct wined3d_texture *texture,
3355         unsigned int level, const struct wined3d_rendertarget_info *rt) DECLSPEC_HIDDEN;
3356 void wined3d_texture_set_map_binding(struct wined3d_texture *texture, DWORD map_binding) DECLSPEC_HIDDEN;
3357 void wined3d_texture_set_swapchain(struct wined3d_texture *texture,
3358         struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
3359 void wined3d_texture_translate_drawable_coords(const struct wined3d_texture *texture,
3360         HWND window, RECT *rect) DECLSPEC_HIDDEN;
3361 void wined3d_texture_upload_data(struct wined3d_texture *texture, unsigned int sub_resource_idx,
3362         struct wined3d_context *context, const struct wined3d_format *format, const struct wined3d_box *src_box,
3363         const struct wined3d_const_bo_address *data, unsigned int row_pitch, unsigned int slice_pitch,
3364         unsigned int dst_x, unsigned int dst_y, unsigned int dst_z, BOOL srgb) DECLSPEC_HIDDEN;
3365 void wined3d_texture_upload_from_texture(struct wined3d_texture *dst_texture, unsigned int dst_sub_resource_idx,
3366         unsigned int dst_x, unsigned int dst_y, unsigned int dst_z, struct wined3d_texture *src_texture,
3367         unsigned int src_sub_resource_idx, const struct wined3d_box *src_box) DECLSPEC_HIDDEN;
3368 void wined3d_texture_validate_location(struct wined3d_texture *texture,
3369         unsigned int sub_resource_idx, DWORD location) DECLSPEC_HIDDEN;
3370 
3371 #define WINED3D_LOCATION_DISCARDED      0x00000001
3372 #define WINED3D_LOCATION_SYSMEM         0x00000002
3373 #define WINED3D_LOCATION_USER_MEMORY    0x00000004
3374 #define WINED3D_LOCATION_BUFFER         0x00000008
3375 #define WINED3D_LOCATION_TEXTURE_RGB    0x00000010
3376 #define WINED3D_LOCATION_TEXTURE_SRGB   0x00000020
3377 #define WINED3D_LOCATION_DRAWABLE       0x00000040
3378 #define WINED3D_LOCATION_RB_MULTISAMPLE 0x00000080
3379 #define WINED3D_LOCATION_RB_RESOLVED    0x00000100
3380 
3381 const char *wined3d_debug_location(DWORD location) DECLSPEC_HIDDEN;
3382 
3383 struct wined3d_renderbuffer_entry
3384 {
3385     struct list entry;
3386     GLuint id;
3387     UINT width;
3388     UINT height;
3389 };
3390 
3391 struct wined3d_fbo_resource
3392 {
3393     GLuint object;
3394     GLenum target;
3395     GLuint level, layer;
3396 };
3397 
3398 #define WINED3D_FBO_ENTRY_FLAG_ATTACHED      0x1
3399 #define WINED3D_FBO_ENTRY_FLAG_DEPTH         0x2
3400 #define WINED3D_FBO_ENTRY_FLAG_STENCIL       0x4
3401 
3402 struct fbo_entry
3403 {
3404     struct list entry;
3405     DWORD flags;
3406     DWORD rt_mask;
3407     GLuint id;
3408     struct wined3d_fbo_entry_key
3409     {
3410         DWORD rb_namespace;
3411         struct wined3d_fbo_resource objects[MAX_RENDER_TARGET_VIEWS + 1];
3412     } key;
3413 };
3414 
3415 struct wined3d_sampler
3416 {
3417     struct wine_rb_entry entry;
3418     LONG refcount;
3419     GLuint name;
3420     struct wined3d_device *device;
3421     void *parent;
3422     const struct wined3d_parent_ops *parent_ops;
3423     struct wined3d_sampler_desc desc;
3424 };
3425 
3426 void wined3d_sampler_bind(struct wined3d_sampler *sampler, unsigned int unit,
3427         struct wined3d_texture *texture, const struct wined3d_context *context) DECLSPEC_HIDDEN;
3428 
3429 struct wined3d_vertex_declaration_element
3430 {
3431     const struct wined3d_format *format;
3432     BOOL ffp_valid;
3433     unsigned int input_slot;
3434     unsigned int offset;
3435     unsigned int output_slot;
3436     enum wined3d_input_classification input_slot_class;
3437     unsigned int instance_data_step_rate;
3438     BYTE method;
3439     BYTE usage;
3440     BYTE usage_idx;
3441 };
3442 
3443 struct wined3d_vertex_declaration
3444 {
3445     LONG ref;
3446     void *parent;
3447     const struct wined3d_parent_ops *parent_ops;
3448     struct wined3d_device *device;
3449 
3450     struct wined3d_vertex_declaration_element *elements;
3451     UINT element_count;
3452 
3453     BOOL position_transformed;
3454     BOOL half_float_conv_needed;
3455 };
3456 
3457 struct wined3d_saved_states
3458 {
3459     DWORD transform[(HIGHEST_TRANSFORMSTATE >> 5) + 1];
3460     WORD streamSource;                          /* MAX_STREAMS, 16 */
3461     WORD streamFreq;                            /* MAX_STREAMS, 16 */
3462     DWORD renderState[(WINEHIGHEST_RENDER_STATE >> 5) + 1];
3463     DWORD textureState[MAX_TEXTURES];           /* WINED3D_HIGHEST_TEXTURE_STATE + 1, 18 */
3464     WORD samplerState[MAX_COMBINED_SAMPLERS];   /* WINED3D_HIGHEST_SAMPLER_STATE + 1, 14 */
3465     DWORD clipplane;                            /* WINED3D_MAX_USER_CLIP_PLANES, 32 */
3466     WORD pixelShaderConstantsB;                 /* WINED3D_MAX_CONSTS_B, 16 */
3467     WORD pixelShaderConstantsI;                 /* WINED3D_MAX_CONSTS_I, 16 */
3468     BOOL ps_consts_f[WINED3D_MAX_PS_CONSTS_F];
3469     WORD vertexShaderConstantsB;                /* WINED3D_MAX_CONSTS_B, 16 */
3470     WORD vertexShaderConstantsI;                /* WINED3D_MAX_CONSTS_I, 16 */
3471     BOOL vs_consts_f[WINED3D_MAX_VS_CONSTS_F];
3472     DWORD textures : 20;                        /* MAX_COMBINED_SAMPLERS, 20 */
3473     DWORD indices : 1;
3474     DWORD material : 1;
3475     DWORD viewport : 1;
3476     DWORD vertexDecl : 1;
3477     DWORD pixelShader : 1;
3478     DWORD vertexShader : 1;
3479     DWORD scissorRect : 1;
3480     DWORD padding : 5;
3481 };
3482 
3483 struct StageState {
3484     DWORD stage;
3485     DWORD state;
3486 };
3487 
3488 struct wined3d_stateblock
3489 {
3490     LONG                      ref;     /* Note: Ref counting not required */
3491     struct wined3d_device *device;
3492 
3493     /* Array indicating whether things have been set or changed */
3494     struct wined3d_saved_states changed;
3495     struct wined3d_state state;
3496 
3497     /* Contained state management */
3498     DWORD                     contained_render_states[WINEHIGHEST_RENDER_STATE + 1];
3499     unsigned int              num_contained_render_states;
3500     DWORD                     contained_transform_states[HIGHEST_TRANSFORMSTATE + 1];
3501     unsigned int              num_contained_transform_states;
3502     DWORD                     contained_vs_consts_i[WINED3D_MAX_CONSTS_I];
3503     unsigned int              num_contained_vs_consts_i;
3504     DWORD                     contained_vs_consts_b[WINED3D_MAX_CONSTS_B];
3505     unsigned int              num_contained_vs_consts_b;
3506     DWORD                     contained_vs_consts_f[WINED3D_MAX_VS_CONSTS_F];
3507     unsigned int              num_contained_vs_consts_f;
3508     DWORD                     contained_ps_consts_i[WINED3D_MAX_CONSTS_I];
3509     unsigned int              num_contained_ps_consts_i;
3510     DWORD                     contained_ps_consts_b[WINED3D_MAX_CONSTS_B];
3511     unsigned int              num_contained_ps_consts_b;
3512     DWORD                     contained_ps_consts_f[WINED3D_MAX_PS_CONSTS_F];
3513     unsigned int              num_contained_ps_consts_f;
3514     struct StageState         contained_tss_states[MAX_TEXTURES * (WINED3D_HIGHEST_TEXTURE_STATE + 1)];
3515     unsigned int              num_contained_tss_states;
3516     struct StageState         contained_sampler_states[MAX_COMBINED_SAMPLERS * WINED3D_HIGHEST_SAMPLER_STATE];
3517     unsigned int              num_contained_sampler_states;
3518 };
3519 
3520 void stateblock_init_contained_states(struct wined3d_stateblock *stateblock) DECLSPEC_HIDDEN;
3521 
3522 void state_cleanup(struct wined3d_state *state) DECLSPEC_HIDDEN;
3523 void wined3d_state_enable_light(struct wined3d_state *state, const struct wined3d_d3d_info *d3d_info,
3524         struct wined3d_light_info *light_info, BOOL enable) DECLSPEC_HIDDEN;
3525 struct wined3d_light_info *wined3d_state_get_light(const struct wined3d_state *state,
3526         unsigned int idx) DECLSPEC_HIDDEN;
3527 void state_init(struct wined3d_state *state, struct wined3d_fb_state *fb,
3528         const struct wined3d_gl_info *gl_info, const struct wined3d_d3d_info *d3d_info,
3529         DWORD flags) DECLSPEC_HIDDEN;
3530 void state_unbind_resources(struct wined3d_state *state) DECLSPEC_HIDDEN;
3531 
3532 enum wined3d_cs_queue_id
3533 {
3534     WINED3D_CS_QUEUE_DEFAULT = 0,
3535     WINED3D_CS_QUEUE_MAP,
3536     WINED3D_CS_QUEUE_COUNT,
3537 };
3538 
3539 enum wined3d_push_constants
3540 {
3541     WINED3D_PUSH_CONSTANTS_VS_F,
3542     WINED3D_PUSH_CONSTANTS_PS_F,
3543     WINED3D_PUSH_CONSTANTS_VS_I,
3544     WINED3D_PUSH_CONSTANTS_PS_I,
3545     WINED3D_PUSH_CONSTANTS_VS_B,
3546     WINED3D_PUSH_CONSTANTS_PS_B,
3547 };
3548 
3549 #define WINED3D_CS_QUERY_POLL_INTERVAL  10u
3550 #define WINED3D_CS_QUEUE_SIZE           0x100000u
3551 #ifdef __REACTOS__
3552 #define WINED3D_CS_SPIN_COUNT           1u
3553 #else
3554 #define WINED3D_CS_SPIN_COUNT           10000000u
3555 #endif
3556 
3557 struct wined3d_cs_queue
3558 {
3559     LONG head, tail;
3560     BYTE data[WINED3D_CS_QUEUE_SIZE];
3561 };
3562 
3563 struct wined3d_cs_ops
3564 {
3565     BOOL (*check_space)(struct wined3d_cs *cs, size_t size, enum wined3d_cs_queue_id queue_id);
3566     void *(*require_space)(struct wined3d_cs *cs, size_t size, enum wined3d_cs_queue_id queue_id);
3567     void (*submit)(struct wined3d_cs *cs, enum wined3d_cs_queue_id queue_id);
3568     void (*finish)(struct wined3d_cs *cs, enum wined3d_cs_queue_id queue_id);
3569     void (*push_constants)(struct wined3d_cs *cs, enum wined3d_push_constants p,
3570             unsigned int start_idx, unsigned int count, const void *constants);
3571 };
3572 
3573 struct wined3d_cs
3574 {
3575     const struct wined3d_cs_ops *ops;
3576     struct wined3d_device *device;
3577     struct wined3d_fb_state fb;
3578     struct wined3d_state state;
3579     HMODULE wined3d_module;
3580     HANDLE thread;
3581     DWORD thread_id;
3582 
3583     struct wined3d_cs_queue queue[WINED3D_CS_QUEUE_COUNT];
3584     size_t data_size, start, end;
3585     void *data;
3586     struct list query_poll_list;
3587     BOOL queries_flushed;
3588 
3589     HANDLE event;
3590     BOOL waiting_for_event;
3591     LONG pending_presents;
3592 };
3593 
3594 struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) DECLSPEC_HIDDEN;
3595 void wined3d_cs_destroy(struct wined3d_cs *cs) DECLSPEC_HIDDEN;
3596 void wined3d_cs_destroy_object(struct wined3d_cs *cs,
3597         void (*callback)(void *object), void *object) DECLSPEC_HIDDEN;
3598 void wined3d_cs_emit_add_dirty_texture_region(struct wined3d_cs *cs,
3599         struct wined3d_texture *texture, unsigned int layer) DECLSPEC_HIDDEN;
3600 void wined3d_cs_emit_blt_sub_resource(struct wined3d_cs *cs, struct wined3d_resource *dst_resource,
3601         unsigned int dst_sub_resource_idx, const struct wined3d_box *dst_box, struct wined3d_resource *src_resource,
3602         unsigned int src_sub_resource_idx, const struct wined3d_box *src_box, DWORD flags,
3603         const struct wined3d_blt_fx *fx, enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN;
3604 void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT *rects,
3605         DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil) DECLSPEC_HIDDEN;
3606 void wined3d_cs_emit_clear_rendertarget_view(struct wined3d_cs *cs, struct wined3d_rendertarget_view *view,
3607         const RECT *rect, DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil) DECLSPEC_HIDDEN;
3608 void wined3d_cs_emit_clear_unordered_access_view_uint(struct wined3d_cs *cs,
3609         struct wined3d_unordered_access_view *view, const struct wined3d_uvec4 *clear_value) DECLSPEC_HIDDEN;
3610 void wined3d_cs_emit_copy_uav_counter(struct wined3d_cs *cs, struct wined3d_buffer *dst_buffer,
3611         unsigned int offset, struct wined3d_unordered_access_view *uav) DECLSPEC_HIDDEN;
3612 void wined3d_cs_emit_dispatch(struct wined3d_cs *cs,
3613         unsigned int group_count_x, unsigned int group_count_y, unsigned int group_count_z) DECLSPEC_HIDDEN;
3614 void wined3d_cs_emit_dispatch_indirect(struct wined3d_cs *cs,
3615         struct wined3d_buffer *buffer, unsigned int offset) DECLSPEC_HIDDEN;
3616 void wined3d_cs_emit_draw(struct wined3d_cs *cs, GLenum primitive_type, unsigned int patch_vertex_count,
3617         int base_vertex_idx, unsigned int start_idx, unsigned int index_count,
3618         unsigned int start_instance, unsigned int instance_count, BOOL indexed) DECLSPEC_HIDDEN;
3619 void wined3d_cs_emit_draw_indirect(struct wined3d_cs *cs, GLenum primitive_type, unsigned int patch_vertex_count,
3620         struct wined3d_buffer *buffer, unsigned int offset, BOOL indexed) DECLSPEC_HIDDEN;
3621 void wined3d_cs_emit_flush(struct wined3d_cs *cs) DECLSPEC_HIDDEN;
3622 void wined3d_cs_emit_generate_mipmaps(struct wined3d_cs *cs, struct wined3d_shader_resource_view *view) DECLSPEC_HIDDEN;
3623 void wined3d_cs_emit_preload_resource(struct wined3d_cs *cs, struct wined3d_resource *resource) DECLSPEC_HIDDEN;
3624 void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *swapchain, const RECT *src_rect,
3625         const RECT *dst_rect, HWND dst_window_override, unsigned int swap_interval, DWORD flags) DECLSPEC_HIDDEN;
3626 void wined3d_cs_emit_query_issue(struct wined3d_cs *cs, struct wined3d_query *query, DWORD flags) DECLSPEC_HIDDEN;
3627 void wined3d_cs_emit_reset_state(struct wined3d_cs *cs) DECLSPEC_HIDDEN;
3628 void wined3d_cs_emit_set_blend_state(struct wined3d_cs *cs, struct wined3d_blend_state *state) DECLSPEC_HIDDEN;
3629 void wined3d_cs_emit_set_clip_plane(struct wined3d_cs *cs, UINT plane_idx,
3630         const struct wined3d_vec4 *plane) DECLSPEC_HIDDEN;
3631 void wined3d_cs_emit_set_color_key(struct wined3d_cs *cs, struct wined3d_texture *texture,
3632         WORD flags, const struct wined3d_color_key *color_key) DECLSPEC_HIDDEN;
3633 void wined3d_cs_emit_set_constant_buffer(struct wined3d_cs *cs, enum wined3d_shader_type type,
3634         UINT cb_idx, struct wined3d_buffer *buffer) DECLSPEC_HIDDEN;
3635 void wined3d_cs_emit_set_depth_stencil_view(struct wined3d_cs *cs,
3636         struct wined3d_rendertarget_view *view) DECLSPEC_HIDDEN;
3637 void wined3d_cs_emit_set_index_buffer(struct wined3d_cs *cs, struct wined3d_buffer *buffer,
3638         enum wined3d_format_id format_id, unsigned int offset) DECLSPEC_HIDDEN;
3639 void wined3d_cs_emit_set_light(struct wined3d_cs *cs, const struct wined3d_light_info *light) DECLSPEC_HIDDEN;
3640 void wined3d_cs_emit_set_light_enable(struct wined3d_cs *cs, unsigned int idx, BOOL enable) DECLSPEC_HIDDEN;
3641 void wined3d_cs_emit_set_material(struct wined3d_cs *cs, const struct wined3d_material *material) DECLSPEC_HIDDEN;
3642 void wined3d_cs_emit_set_predication(struct wined3d_cs *cs,
3643         struct wined3d_query *predicate, BOOL value) DECLSPEC_HIDDEN;
3644 void wined3d_cs_emit_set_rasterizer_state(struct wined3d_cs *cs,
3645         struct wined3d_rasterizer_state *rasterizer_state) DECLSPEC_HIDDEN;
3646 void wined3d_cs_emit_set_render_state(struct wined3d_cs *cs,
3647         enum wined3d_render_state state, DWORD value) DECLSPEC_HIDDEN;
3648 void wined3d_cs_emit_set_rendertarget_view(struct wined3d_cs *cs, unsigned int view_idx,
3649         struct wined3d_rendertarget_view *view) DECLSPEC_HIDDEN;
3650 void wined3d_cs_emit_set_shader_resource_view(struct wined3d_cs *cs, enum wined3d_shader_type type,
3651         UINT view_idx, struct wined3d_shader_resource_view *view) DECLSPEC_HIDDEN;
3652 void wined3d_cs_emit_set_sampler(struct wined3d_cs *cs, enum wined3d_shader_type type,
3653         UINT sampler_idx, struct wined3d_sampler *sampler) DECLSPEC_HIDDEN;
3654 void wined3d_cs_emit_set_sampler_state(struct wined3d_cs *cs, UINT sampler_idx,
3655         enum wined3d_sampler_state state, DWORD value) DECLSPEC_HIDDEN;
3656 void wined3d_cs_emit_set_scissor_rects(struct wined3d_cs *cs, unsigned int rect_count, const RECT *rects) DECLSPEC_HIDDEN;
3657 void wined3d_cs_emit_set_shader(struct wined3d_cs *cs, enum wined3d_shader_type type,
3658         struct wined3d_shader *shader) DECLSPEC_HIDDEN;
3659 void wined3d_cs_emit_set_stream_output(struct wined3d_cs *cs, UINT stream_idx,
3660         struct wined3d_buffer *buffer, UINT offset) DECLSPEC_HIDDEN;
3661 void wined3d_cs_emit_set_stream_source(struct wined3d_cs *cs, UINT stream_idx,
3662         struct wined3d_buffer *buffer, UINT offset, UINT stride) DECLSPEC_HIDDEN;
3663 void wined3d_cs_emit_set_stream_source_freq(struct wined3d_cs *cs, UINT stream_idx,
3664         UINT frequency, UINT flags) DECLSPEC_HIDDEN;
3665 void wined3d_cs_emit_set_texture(struct wined3d_cs *cs, UINT stage, struct wined3d_texture *texture) DECLSPEC_HIDDEN;
3666 void wined3d_cs_emit_set_texture_state(struct wined3d_cs *cs, UINT stage,
3667         enum wined3d_texture_stage_state state, DWORD value) DECLSPEC_HIDDEN;
3668 void wined3d_cs_emit_set_transform(struct wined3d_cs *cs, enum wined3d_transform_state state,
3669         const struct wined3d_matrix *matrix) DECLSPEC_HIDDEN;
3670 void wined3d_cs_emit_set_unordered_access_view(struct wined3d_cs *cs, enum wined3d_pipeline pipeline,
3671         unsigned int view_idx, struct wined3d_unordered_access_view *view,
3672         unsigned int initial_count) DECLSPEC_HIDDEN;
3673 void wined3d_cs_emit_set_vertex_declaration(struct wined3d_cs *cs,
3674         struct wined3d_vertex_declaration *declaration) DECLSPEC_HIDDEN;
3675 void wined3d_cs_emit_set_viewports(struct wined3d_cs *cs, unsigned int viewport_count, const struct wined3d_viewport *viewports) DECLSPEC_HIDDEN;
3676 void wined3d_cs_emit_unload_resource(struct wined3d_cs *cs, struct wined3d_resource *resource) DECLSPEC_HIDDEN;
3677 void wined3d_cs_emit_update_sub_resource(struct wined3d_cs *cs, struct wined3d_resource *resource,
3678         unsigned int sub_resource_idx, const struct wined3d_box *box, const void *data, unsigned int row_pitch,
3679         unsigned int slice_pitch) DECLSPEC_HIDDEN;
3680 void wined3d_cs_init_object(struct wined3d_cs *cs,
3681         void (*callback)(void *object), void *object) DECLSPEC_HIDDEN;
3682 HRESULT wined3d_cs_map(struct wined3d_cs *cs, struct wined3d_resource *resource, unsigned int sub_resource_idx,
3683         struct wined3d_map_desc *map_desc, const struct wined3d_box *box, unsigned int flags) DECLSPEC_HIDDEN;
3684 HRESULT wined3d_cs_unmap(struct wined3d_cs *cs, struct wined3d_resource *resource,
3685         unsigned int sub_resource_idx) DECLSPEC_HIDDEN;
3686 
3687 static inline void wined3d_cs_push_constants(struct wined3d_cs *cs, enum wined3d_push_constants p,
3688         unsigned int start_idx, unsigned int count, const void *constants)
3689 {
3690     cs->ops->push_constants(cs, p, start_idx, count, constants);
3691 }
3692 
3693 static inline void wined3d_resource_wait_idle(struct wined3d_resource *resource)
3694 {
3695     const struct wined3d_cs *cs = resource->device->cs;
3696 
3697     if (!cs->thread || cs->thread_id == GetCurrentThreadId())
3698         return;
3699 
3700     while (InterlockedCompareExchange(&resource->access_count, 0, 0))
3701         wined3d_pause();
3702 }
3703 
3704 /* TODO: Add tests and support for FLOAT16_4 POSITIONT, D3DCOLOR position, other
3705  * fixed function semantics as D3DCOLOR or FLOAT16 */
3706 enum wined3d_buffer_conversion_type
3707 {
3708     CONV_NONE,
3709     CONV_D3DCOLOR,
3710     CONV_POSITIONT,
3711 };
3712 
3713 struct wined3d_map_range
3714 {
3715     UINT offset;
3716     UINT size;
3717 };
3718 
3719 struct wined3d_buffer
3720 {
3721     struct wined3d_resource resource;
3722 
3723     struct wined3d_buffer_desc desc;
3724 
3725     GLuint buffer_object;
3726     GLenum buffer_object_usage;
3727     GLenum buffer_type_hint;
3728     unsigned int bind_flags;
3729     DWORD flags;
3730     DWORD locations;
3731     void *map_ptr;
3732 
3733     struct wined3d_map_range *maps;
3734     SIZE_T maps_size, modified_areas;
3735     struct wined3d_fence *fence;
3736 
3737     /* conversion stuff */
3738     UINT decl_change_count, full_conversion_count;
3739     UINT draw_count;
3740     UINT stride;                                            /* 0 if no conversion */
3741     enum wined3d_buffer_conversion_type *conversion_map;    /* NULL if no conversion */
3742     UINT conversion_stride;                                 /* 0 if no shifted conversion */
3743 };
3744 
3745 static inline struct wined3d_buffer *buffer_from_resource(struct wined3d_resource *resource)
3746 {
3747     return CONTAINING_RECORD(resource, struct wined3d_buffer, resource);
3748 }
3749 
3750 DWORD wined3d_buffer_get_memory(struct wined3d_buffer *buffer,
3751         struct wined3d_bo_address *data, DWORD locations) DECLSPEC_HIDDEN;
3752 void wined3d_buffer_invalidate_location(struct wined3d_buffer *buffer, DWORD location) DECLSPEC_HIDDEN;
3753 void wined3d_buffer_load(struct wined3d_buffer *buffer, struct wined3d_context *context,
3754         const struct wined3d_state *state) DECLSPEC_HIDDEN;
3755 BOOL wined3d_buffer_load_location(struct wined3d_buffer *buffer,
3756         struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN;
3757 BYTE *wined3d_buffer_load_sysmem(struct wined3d_buffer *buffer, struct wined3d_context *context) DECLSPEC_HIDDEN;
3758 void wined3d_buffer_copy(struct wined3d_buffer *dst_buffer, unsigned int dst_offset,
3759         struct wined3d_buffer *src_buffer, unsigned int src_offset, unsigned int size) DECLSPEC_HIDDEN;
3760 void wined3d_buffer_upload_data(struct wined3d_buffer *buffer, struct wined3d_context *context,
3761         const struct wined3d_box *box, const void *data) DECLSPEC_HIDDEN;
3762 
3763 struct wined3d_rendertarget_view
3764 {
3765     LONG refcount;
3766 
3767     struct wined3d_resource *resource;
3768     void *parent;
3769     const struct wined3d_parent_ops *parent_ops;
3770 
3771     struct wined3d_gl_view gl_view;
3772     const struct wined3d_format *format;
3773     unsigned int format_flags;
3774     unsigned int sub_resource_idx;
3775     unsigned int layer_count;
3776 
3777     unsigned int width;
3778     unsigned int height;
3779 
3780     struct wined3d_view_desc desc;
3781 };
3782 
3783 void wined3d_rendertarget_view_get_drawable_size(const struct wined3d_rendertarget_view *view,
3784         const struct wined3d_context *context, unsigned int *width, unsigned int *height) DECLSPEC_HIDDEN;
3785 void wined3d_rendertarget_view_invalidate_location(struct wined3d_rendertarget_view *view,
3786         DWORD location) DECLSPEC_HIDDEN;
3787 void wined3d_rendertarget_view_load_location(struct wined3d_rendertarget_view *view,
3788         struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN;
3789 void wined3d_rendertarget_view_prepare_location(struct wined3d_rendertarget_view *view,
3790         struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN;
3791 void wined3d_rendertarget_view_validate_location(struct wined3d_rendertarget_view *view,
3792         DWORD location) DECLSPEC_HIDDEN;
3793 
3794 struct wined3d_shader_resource_view
3795 {
3796     LONG refcount;
3797 
3798     struct wined3d_resource *resource;
3799     void *parent;
3800     const struct wined3d_parent_ops *parent_ops;
3801 
3802     struct wined3d_gl_view gl_view;
3803     const struct wined3d_format *format;
3804 
3805     struct wined3d_view_desc desc;
3806 };
3807 
3808 void shader_resource_view_generate_mipmaps(struct wined3d_shader_resource_view *view) DECLSPEC_HIDDEN;
3809 void wined3d_shader_resource_view_bind(struct wined3d_shader_resource_view *view, unsigned int unit,
3810         struct wined3d_sampler *sampler, struct wined3d_context *context) DECLSPEC_HIDDEN;
3811 
3812 struct wined3d_unordered_access_view
3813 {
3814     LONG refcount;
3815 
3816     struct wined3d_resource *resource;
3817     void *parent;
3818     const struct wined3d_parent_ops *parent_ops;
3819 
3820     struct wined3d_gl_view gl_view;
3821     const struct wined3d_format *format;
3822     GLuint counter_bo;
3823 
3824     struct wined3d_view_desc desc;
3825 };
3826 
3827 void wined3d_unordered_access_view_clear_uint(struct wined3d_unordered_access_view *view,
3828         const struct wined3d_uvec4 *clear_value, struct wined3d_context *context) DECLSPEC_HIDDEN;
3829 void wined3d_unordered_access_view_copy_counter(struct wined3d_unordered_access_view *view,
3830         struct wined3d_buffer *buffer, unsigned int offset, struct wined3d_context *context) DECLSPEC_HIDDEN;
3831 void wined3d_unordered_access_view_invalidate_location(struct wined3d_unordered_access_view *view,
3832         DWORD location) DECLSPEC_HIDDEN;
3833 void wined3d_unordered_access_view_set_counter(struct wined3d_unordered_access_view *view,
3834         unsigned int value) DECLSPEC_HIDDEN;
3835 
3836 struct wined3d_swapchain_ops
3837 {
3838     void (*swapchain_present)(struct wined3d_swapchain *swapchain,
3839             const RECT *src_rect, const RECT *dst_rect, DWORD flags);
3840     void (*swapchain_frontbuffer_updated)(struct wined3d_swapchain *swapchain);
3841 };
3842 
3843 struct wined3d_swapchain
3844 {
3845     LONG ref;
3846     void *parent;
3847     const struct wined3d_parent_ops *parent_ops;
3848     const struct wined3d_swapchain_ops *swapchain_ops;
3849     struct wined3d_device *device;
3850 
3851     struct wined3d_texture **back_buffers;
3852     struct wined3d_texture *front_buffer;
3853     struct wined3d_swapchain_desc desc;
3854     struct wined3d_display_mode original_mode, d3d_mode;
3855     RECT original_window_rect;
3856     struct wined3d_gamma_ramp orig_gamma;
3857     BOOL render_to_fbo, reapply_mode;
3858     const struct wined3d_format *ds_format;
3859     struct wined3d_palette *palette;
3860     RECT front_buffer_update;
3861     unsigned int swap_interval;
3862     unsigned int max_frame_latency;
3863 
3864     LONG prev_time, frames;   /* Performance tracking */
3865 
3866     struct wined3d_context **context;
3867     unsigned int num_contexts;
3868 
3869     HWND win_handle;
3870     HWND device_window;
3871 
3872     HDC backup_dc;
3873     HWND backup_wnd;
3874 };
3875 
3876 void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activate) DECLSPEC_HIDDEN;
3877 void wined3d_swapchain_set_swap_interval(struct wined3d_swapchain *swapchain,
3878         unsigned int swap_interval) DECLSPEC_HIDDEN;
3879 struct wined3d_context *swapchain_get_context(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
3880 void swapchain_destroy_contexts(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
3881 HDC swapchain_get_backup_dc(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
3882 void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
3883 void swapchain_set_max_frame_latency(struct wined3d_swapchain *swapchain,
3884         const struct wined3d_device *device) DECLSPEC_HIDDEN;
3885 
3886 /*****************************************************************************
3887  * Utility function prototypes
3888  */
3889 
3890 /* Trace routines */
3891 const char *debug_box(const struct wined3d_box *box) DECLSPEC_HIDDEN;
3892 const char *debug_color(const struct wined3d_color *color) DECLSPEC_HIDDEN;
3893 const char *debug_d3dshaderinstructionhandler(enum WINED3D_SHADER_INSTRUCTION_HANDLER handler_idx) DECLSPEC_HIDDEN;
3894 const char *debug_d3dformat(enum wined3d_format_id format_id) DECLSPEC_HIDDEN;
3895 const char *debug_d3ddevicetype(enum wined3d_device_type device_type) DECLSPEC_HIDDEN;
3896 const char *debug_d3dresourcetype(enum wined3d_resource_type resource_type) DECLSPEC_HIDDEN;
3897 const char *debug_d3dusage(DWORD usage) DECLSPEC_HIDDEN;
3898 const char *debug_d3dusagequery(DWORD usagequery) DECLSPEC_HIDDEN;
3899 const char *debug_d3ddeclmethod(enum wined3d_decl_method method) DECLSPEC_HIDDEN;
3900 const char *debug_d3ddeclusage(enum wined3d_decl_usage usage) DECLSPEC_HIDDEN;
3901 const char *debug_d3dinput_classification(enum wined3d_input_classification classification) DECLSPEC_HIDDEN;
3902 const char *debug_d3dprimitivetype(enum wined3d_primitive_type primitive_type) DECLSPEC_HIDDEN;
3903 const char *debug_d3drenderstate(enum wined3d_render_state state) DECLSPEC_HIDDEN;
3904 const char *debug_d3dsamplerstate(enum wined3d_sampler_state state) DECLSPEC_HIDDEN;
3905 const char *debug_d3dstate(DWORD state) DECLSPEC_HIDDEN;
3906 const char *debug_d3dtexturefiltertype(enum wined3d_texture_filter_type filter_type) DECLSPEC_HIDDEN;
3907 const char *debug_d3dtexturestate(enum wined3d_texture_stage_state state) DECLSPEC_HIDDEN;
3908 const char *debug_d3dtop(enum wined3d_texture_op d3dtop) DECLSPEC_HIDDEN;
3909 const char *debug_d3dtstype(enum wined3d_transform_state tstype) DECLSPEC_HIDDEN;
3910 const char *debug_fboattachment(GLenum attachment) DECLSPEC_HIDDEN;
3911 const char *debug_fbostatus(GLenum status) DECLSPEC_HIDDEN;
3912 const char *debug_glerror(GLenum error) DECLSPEC_HIDDEN;
3913 const char *debug_ivec4(const struct wined3d_ivec4 *v) DECLSPEC_HIDDEN;
3914 const char *debug_uvec4(const struct wined3d_uvec4 *v) DECLSPEC_HIDDEN;
3915 const char *debug_shader_type(enum wined3d_shader_type shader_type) DECLSPEC_HIDDEN;
3916 const char *debug_vec4(const struct wined3d_vec4 *v) DECLSPEC_HIDDEN;
3917 void dump_color_fixup_desc(struct color_fixup_desc fixup) DECLSPEC_HIDDEN;
3918 
3919 BOOL is_invalid_op(const struct wined3d_state *state, int stage,
3920         enum wined3d_texture_op op, DWORD arg1, DWORD arg2, DWORD arg3) DECLSPEC_HIDDEN;
3921 void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d_state *state,
3922         BOOL is_alpha, int stage, enum wined3d_texture_op op, DWORD arg1, DWORD arg2, DWORD arg3,
3923         INT texture_idx, DWORD dst) DECLSPEC_HIDDEN;
3924 void texture_activate_dimensions(const struct wined3d_texture *texture,
3925         const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
3926 void sampler_texdim(struct wined3d_context *context,
3927         const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
3928 void tex_alphaop(struct wined3d_context *context,
3929         const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
3930 void apply_pixelshader(struct wined3d_context *context,
3931         const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
3932 void state_alpha_test(struct wined3d_context *context,
3933         const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
3934 void state_fogcolor(struct wined3d_context *context,
3935         const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
3936 void state_fogdensity(struct wined3d_context *context,
3937         const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
3938 void state_fogstartend(struct wined3d_context *context,
3939         const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
3940 void state_fog_fragpart(struct wined3d_context *context,
3941         const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
3942 void state_nop(struct wined3d_context *context,
3943         const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
3944 void state_srgbwrite(struct wined3d_context *context,
3945         const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
3946 
3947 void state_clipping(struct wined3d_context *context,
3948         const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
3949 void clipplane(struct wined3d_context *context,
3950         const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
3951 void state_pointsprite_w(struct wined3d_context *context,
3952         const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
3953 void state_pointsprite(struct wined3d_context *context,
3954         const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
3955 void state_shademode(struct wined3d_context *context,
3956         const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
3957 
3958 GLenum gl_primitive_type_from_d3d(enum wined3d_primitive_type primitive_type) DECLSPEC_HIDDEN;
3959 enum wined3d_primitive_type d3d_primitive_type_from_gl(GLenum primitive_type) DECLSPEC_HIDDEN;
3960 
3961 /* Math utils */
3962 void multiply_matrix(struct wined3d_matrix *dest, const struct wined3d_matrix *src1,
3963         const struct wined3d_matrix *src2) DECLSPEC_HIDDEN;
3964 BOOL invert_matrix_3d(struct wined3d_matrix *out, const struct wined3d_matrix *in) DECLSPEC_HIDDEN;
3965 BOOL invert_matrix(struct wined3d_matrix *out, const struct wined3d_matrix *m) DECLSPEC_HIDDEN;
3966 void transpose_matrix(struct wined3d_matrix *out, const struct wined3d_matrix *m) DECLSPEC_HIDDEN;
3967 
3968 void wined3d_release_dc(HWND window, HDC dc) DECLSPEC_HIDDEN;
3969 
3970 struct wined3d_shader_lconst
3971 {
3972     struct list entry;
3973     unsigned int idx;
3974     DWORD value[4];
3975 };
3976 
3977 struct wined3d_shader_limits
3978 {
3979     unsigned int sampler;
3980     unsigned int constant_int;
3981     unsigned int constant_float;
3982     unsigned int constant_bool;
3983     unsigned int packed_output;
3984     unsigned int packed_input;
3985 };
3986 
3987 #ifdef __GNUC__
3988 #define PRINTF_ATTR(fmt,args) __attribute__((format (printf,fmt,args)))
3989 #else
3990 #define PRINTF_ATTR(fmt,args)
3991 #endif
3992 
3993 struct wined3d_string_buffer_list
3994 {
3995     struct list list;
3996 };
3997 
3998 struct wined3d_string_buffer *string_buffer_get(struct wined3d_string_buffer_list *list) DECLSPEC_HIDDEN;
3999 void string_buffer_sprintf(struct wined3d_string_buffer *buffer, const char *format, ...) PRINTF_ATTR(2, 3) DECLSPEC_HIDDEN;
4000 void string_buffer_release(struct wined3d_string_buffer_list *list, struct wined3d_string_buffer *buffer) DECLSPEC_HIDDEN;
4001 void string_buffer_list_init(struct wined3d_string_buffer_list *list) DECLSPEC_HIDDEN;
4002 void string_buffer_list_cleanup(struct wined3d_string_buffer_list *list) DECLSPEC_HIDDEN;
4003 
4004 int shader_addline(struct wined3d_string_buffer *buffer, const char *fmt, ...) PRINTF_ATTR(2,3) DECLSPEC_HIDDEN;
4005 BOOL string_buffer_resize(struct wined3d_string_buffer *buffer, int rc) DECLSPEC_HIDDEN;
4006 int shader_vaddline(struct wined3d_string_buffer *buffer, const char *fmt, va_list args) DECLSPEC_HIDDEN;
4007 
4008 struct wined3d_shader_phase
4009 {
4010     const DWORD *start;
4011     const DWORD *end;
4012     unsigned int instance_count;
4013     unsigned int temporary_count;
4014 };
4015 
4016 struct wined3d_vertex_shader
4017 {
4018     struct wined3d_shader_attribute attributes[MAX_ATTRIBS];
4019 };
4020 
4021 struct wined3d_hull_shader
4022 {
4023     struct
4024     {
4025         struct wined3d_shader_phase *control_point;
4026         unsigned int fork_count;
4027         unsigned int join_count;
4028         struct wined3d_shader_phase *fork;
4029         SIZE_T fork_size;
4030         struct wined3d_shader_phase *join;
4031         SIZE_T join_size;
4032     } phases;
4033     unsigned int output_vertex_count;
4034     enum wined3d_tessellator_output_primitive tessellator_output_primitive;
4035     enum wined3d_tessellator_partitioning tessellator_partitioning;
4036 };
4037 
4038 struct wined3d_domain_shader
4039 {
4040     enum wined3d_tessellator_domain tessellator_domain;
4041 };
4042 
4043 struct wined3d_geometry_shader
4044 {
4045     enum wined3d_primitive_type input_type;
4046     enum wined3d_primitive_type output_type;
4047     unsigned int vertices_out;
4048     unsigned int instance_count;
4049 
4050     struct wined3d_stream_output_desc so_desc;
4051 };
4052 
4053 struct wined3d_pixel_shader
4054 {
4055     /* Pixel shader input semantics */
4056     DWORD input_reg_map[MAX_REG_INPUT];
4057     DWORD input_reg_used; /* MAX_REG_INPUT, 32 */
4058     unsigned int declared_in_count;
4059 
4060     /* Some information about the shader behavior */
4061     BOOL color0_mov;
4062     DWORD color0_reg;
4063 
4064     BOOL force_early_depth_stencil;
4065     enum wined3d_shader_register_type depth_output;
4066     DWORD interpolation_mode[WINED3D_PACKED_INTERPOLATION_SIZE];
4067 };
4068 
4069 struct wined3d_compute_shader
4070 {
4071     struct wined3d_shader_thread_group_size thread_group_size;
4072 };
4073 
4074 struct wined3d_shader
4075 {
4076     LONG ref;
4077     const struct wined3d_shader_limits *limits;
4078     DWORD *function;
4079     UINT functionLength;
4080     BOOL load_local_constsF;
4081     const struct wined3d_shader_frontend *frontend;
4082     void *frontend_data;
4083     void *backend_data;
4084 
4085     void *parent;
4086     const struct wined3d_parent_ops *parent_ops;
4087 
4088     /* Programs this shader is linked with */
4089     struct list linked_programs;
4090 
4091     /* Immediate constants (override global ones) */
4092     struct list constantsB;
4093     struct list constantsF;
4094     struct list constantsI;
4095     struct wined3d_shader_reg_maps reg_maps;
4096     BOOL lconst_inf_or_nan;
4097 
4098     struct wined3d_shader_signature input_signature;
4099     struct wined3d_shader_signature output_signature;
4100     struct wined3d_shader_signature patch_constant_signature;
4101     char *signature_strings;
4102 
4103     /* Pointer to the parent device */
4104     struct wined3d_device *device;
4105     struct list shader_list_entry;
4106 
4107     union
4108     {
4109         struct wined3d_vertex_shader vs;
4110         struct wined3d_hull_shader hs;
4111         struct wined3d_domain_shader ds;
4112         struct wined3d_geometry_shader gs;
4113         struct wined3d_pixel_shader ps;
4114         struct wined3d_compute_shader cs;
4115     } u;
4116 };
4117 
4118 void pixelshader_update_resource_types(struct wined3d_shader *shader, WORD tex_types) DECLSPEC_HIDDEN;
4119 void find_ps_compile_args(const struct wined3d_state *state, const struct wined3d_shader *shader,
4120         BOOL position_transformed, struct ps_compile_args *args,
4121         const struct wined3d_context *context) DECLSPEC_HIDDEN;
4122 
4123 BOOL vshader_get_input(const struct wined3d_shader *shader,
4124         BYTE usage_req, BYTE usage_idx_req, unsigned int *regnum) DECLSPEC_HIDDEN;
4125 void find_vs_compile_args(const struct wined3d_state *state, const struct wined3d_shader *shader,
4126         WORD swizzle_map, struct vs_compile_args *args,
4127         const struct wined3d_context *context) DECLSPEC_HIDDEN;
4128 
4129 void find_ds_compile_args(const struct wined3d_state *state, const struct wined3d_shader *shader,
4130         struct ds_compile_args *args, const struct wined3d_context *context) DECLSPEC_HIDDEN;
4131 
4132 void find_gs_compile_args(const struct wined3d_state *state, const struct wined3d_shader *shader,
4133         struct gs_compile_args *args, const struct wined3d_context *context) DECLSPEC_HIDDEN;
4134 
4135 void string_buffer_clear(struct wined3d_string_buffer *buffer) DECLSPEC_HIDDEN;
4136 BOOL string_buffer_init(struct wined3d_string_buffer *buffer) DECLSPEC_HIDDEN;
4137 void string_buffer_free(struct wined3d_string_buffer *buffer) DECLSPEC_HIDDEN;
4138 unsigned int shader_find_free_input_register(const struct wined3d_shader_reg_maps *reg_maps,
4139         unsigned int max) DECLSPEC_HIDDEN;
4140 HRESULT shader_generate_code(const struct wined3d_shader *shader, struct wined3d_string_buffer *buffer,
4141         const struct wined3d_shader_reg_maps *reg_maps, void *backend_ctx,
4142         const DWORD *start, const DWORD *end) DECLSPEC_HIDDEN;
4143 BOOL shader_match_semantic(const char *semantic_name, enum wined3d_decl_usage usage) DECLSPEC_HIDDEN;
4144 
4145 static inline BOOL shader_is_scalar(const struct wined3d_shader_register *reg)
4146 {
4147     switch (reg->type)
4148     {
4149         case WINED3DSPR_RASTOUT:
4150             /* oFog & oPts */
4151             if (reg->idx[0].offset)
4152                 return TRUE;
4153             /* oPos */
4154             return FALSE;
4155 
4156         case WINED3DSPR_CONSTBOOL:  /* b# */
4157         case WINED3DSPR_DEPTHOUT:   /* oDepth */
4158         case WINED3DSPR_DEPTHOUTGE:
4159         case WINED3DSPR_DEPTHOUTLE:
4160         case WINED3DSPR_LOOP:       /* aL */
4161         case WINED3DSPR_PREDICATE:  /* p0 */
4162         case WINED3DSPR_PRIMID:     /* primID */
4163         case WINED3DSPR_SAMPLEMASK: /* oMask */
4164             return TRUE;
4165 
4166         case WINED3DSPR_MISCTYPE:
4167             switch (reg->idx[0].offset)
4168             {
4169                 case 0: /* vPos */
4170                     return FALSE;
4171                 case 1: /* vFace */
4172                     return TRUE;
4173                 default:
4174                     return FALSE;
4175             }
4176 
4177         case WINED3DSPR_IMMCONST:
4178             return reg->immconst_type == WINED3D_IMMCONST_SCALAR;
4179 
4180         default:
4181             return FALSE;
4182     }
4183 }
4184 
4185 static inline void shader_get_position_fixup(const struct wined3d_context *context,
4186         const struct wined3d_state *state, unsigned int fixup_count, float *position_fixup)
4187 {
4188     float center_offset;
4189     unsigned int i;
4190 
4191     if (context->d3d_info->wined3d_creation_flags & WINED3D_PIXEL_CENTER_INTEGER)
4192         center_offset = 63.0f / 64.0f;
4193     else
4194         center_offset = -1.0f / 64.0f;
4195 
4196     for (i = 0; i < fixup_count; ++i)
4197     {
4198         position_fixup[4 * i    ] = 1.0f;
4199         position_fixup[4 * i + 1] = 1.0f;
4200         position_fixup[4 * i + 2] = center_offset / state->viewports[i].width;
4201         position_fixup[4 * i + 3] = -center_offset / state->viewports[i].height;
4202 
4203         if (context->render_offscreen)
4204         {
4205             position_fixup[4 * i + 1] *= -1.0f;
4206             position_fixup[4 * i + 3] *= -1.0f;
4207         }
4208     }
4209 }
4210 
4211 static inline BOOL shader_constant_is_local(const struct wined3d_shader *shader, DWORD reg)
4212 {
4213     struct wined3d_shader_lconst *lconst;
4214 
4215     if (shader->load_local_constsF)
4216         return FALSE;
4217 
4218     LIST_FOR_EACH_ENTRY(lconst, &shader->constantsF, struct wined3d_shader_lconst, entry)
4219     {
4220         if (lconst->idx == reg)
4221             return TRUE;
4222     }
4223 
4224     return FALSE;
4225 }
4226 
4227 void get_identity_matrix(struct wined3d_matrix *mat) DECLSPEC_HIDDEN;
4228 void get_modelview_matrix(const struct wined3d_context *context, const struct wined3d_state *state,
4229         unsigned int index, struct wined3d_matrix *mat) DECLSPEC_HIDDEN;
4230 void get_projection_matrix(const struct wined3d_context *context, const struct wined3d_state *state,
4231         struct wined3d_matrix *mat) DECLSPEC_HIDDEN;
4232 void get_texture_matrix(const struct wined3d_context *context, const struct wined3d_state *state,
4233         unsigned int tex, struct wined3d_matrix *mat) DECLSPEC_HIDDEN;
4234 void get_pointsize_minmax(const struct wined3d_context *context, const struct wined3d_state *state,
4235         float *out_min, float *out_max) DECLSPEC_HIDDEN;
4236 void get_pointsize(const struct wined3d_context *context, const struct wined3d_state *state,
4237         float *out_pointsize, float *out_att) DECLSPEC_HIDDEN;
4238 void get_fog_start_end(const struct wined3d_context *context, const struct wined3d_state *state,
4239         float *start, float *end) DECLSPEC_HIDDEN;
4240 
4241 /* Using additional shader constants (uniforms in GLSL / program environment
4242  * or local parameters in ARB) is costly:
4243  * ARB only knows float4 parameters and GLSL compiler are not really smart
4244  * when it comes to efficiently pack float2 uniforms, so no space is wasted
4245  * (in fact most compilers map a float2 to a full float4 uniform).
4246  *
4247  * For NP2 texcoord fixup we only need 2 floats (width and height) for each
4248  * 2D texture used in the shader. We therefore pack fixup info for 2 textures
4249  * into a single shader constant (uniform / program parameter).
4250  *
4251  * This structure is shared between the GLSL and the ARB backend.*/
4252 struct ps_np2fixup_info {
4253     unsigned char     idx[MAX_FRAGMENT_SAMPLERS]; /* indices to the real constant */
4254     WORD              active; /* bitfield indicating if we can apply the fixup */
4255     WORD              num_consts;
4256 };
4257 
4258 void print_glsl_info_log(const struct wined3d_gl_info *gl_info, GLuint id, BOOL program) DECLSPEC_HIDDEN;
4259 void shader_glsl_validate_link(const struct wined3d_gl_info *gl_info, GLuint program) DECLSPEC_HIDDEN;
4260 
4261 struct wined3d_palette
4262 {
4263     LONG ref;
4264     struct wined3d_device *device;
4265 
4266     unsigned int size;
4267     RGBQUAD colors[256];
4268     DWORD flags;
4269 };
4270 
4271 /* DirectDraw utility functions */
4272 extern enum wined3d_format_id pixelformat_for_depth(DWORD depth) DECLSPEC_HIDDEN;
4273 
4274 /*****************************************************************************
4275  * Pixel format management
4276  */
4277 
4278 /* WineD3D pixel format flags */
4279 #define WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING    0x00000001
4280 #define WINED3DFMT_FLAG_FILTERING                   0x00000002
4281 #define WINED3DFMT_FLAG_DEPTH                       0x00000004
4282 #define WINED3DFMT_FLAG_STENCIL                     0x00000008
4283 #define WINED3DFMT_FLAG_RENDERTARGET                0x00000010
4284 #define WINED3DFMT_FLAG_EXTENSION                   0x00000020
4285 #define WINED3DFMT_FLAG_FBO_ATTACHABLE              0x00000040
4286 #define WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB         0x00000080
4287 #define WINED3DFMT_FLAG_FLOAT                       0x00000200
4288 #define WINED3DFMT_FLAG_BUMPMAP                     0x00000400
4289 #define WINED3DFMT_FLAG_SRGB_READ                   0x00000800
4290 #define WINED3DFMT_FLAG_SRGB_WRITE                  0x00001000
4291 #define WINED3DFMT_FLAG_VTF                         0x00002000
4292 #define WINED3DFMT_FLAG_SHADOW                      0x00004000
4293 #define WINED3DFMT_FLAG_COMPRESSED                  0x00008000
4294 #define WINED3DFMT_FLAG_BROKEN_PITCH                0x00010000
4295 #define WINED3DFMT_FLAG_BLOCKS                      0x00020000
4296 #define WINED3DFMT_FLAG_HEIGHT_SCALE                0x00040000
4297 #define WINED3DFMT_FLAG_TEXTURE                     0x00080000
4298 #define WINED3DFMT_FLAG_BLOCKS_NO_VERIFY            0x00100000
4299 #define WINED3DFMT_FLAG_INTEGER                     0x00200000
4300 #define WINED3DFMT_FLAG_GEN_MIPMAP                  0x00400000
4301 
4302 struct wined3d_rational
4303 {
4304     UINT numerator;
4305     UINT denominator;
4306 };
4307 
4308 struct wined3d_color_key_conversion
4309 {
4310     enum wined3d_format_id dst_format;
4311     void (*convert)(const BYTE *src, unsigned int src_pitch, BYTE *dst, unsigned int dst_pitch,
4312             unsigned int width, unsigned int height, const struct wined3d_color_key *colour_key);
4313 };
4314 
4315 struct wined3d_format
4316 {
4317     enum wined3d_format_id id;
4318 
4319     D3DDDIFORMAT ddi_format;
4320     DWORD red_size;
4321     DWORD green_size;
4322     DWORD blue_size;
4323     DWORD alpha_size;
4324     DWORD red_offset;
4325     DWORD green_offset;
4326     DWORD blue_offset;
4327     DWORD alpha_offset;
4328     UINT byte_count;
4329     BYTE depth_size;
4330     BYTE stencil_size;
4331 
4332     UINT block_width;
4333     UINT block_height;
4334     UINT block_byte_count;
4335 
4336     enum wined3d_ffp_emit_idx emit_idx;
4337     GLint component_count;
4338     GLenum gl_vtx_type;
4339     GLint gl_vtx_format;
4340     GLboolean gl_normalized;
4341     unsigned int attribute_size;
4342 
4343     GLint glInternal;
4344     GLint glGammaInternal;
4345     GLint rtInternal;
4346     GLint glFormat;
4347     GLint glType;
4348     UINT  conv_byte_count;
4349     DWORD multisample_types;
4350     unsigned int flags[WINED3D_GL_RES_TYPE_COUNT];
4351     float depth_bias_scale;
4352     struct wined3d_rational height_scale;
4353     struct color_fixup_desc color_fixup;
4354     void (*upload)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch,
4355             unsigned int dst_row_pitch, unsigned dst_slice_pitch,
4356             unsigned int width, unsigned int height, unsigned int depth);
4357     void (*download)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch,
4358             unsigned int dst_row_pitch, unsigned dst_slice_pitch,
4359             unsigned int width, unsigned int height, unsigned int depth);
4360 
4361     enum wined3d_format_id typeless_id;
4362     GLenum gl_view_class;
4363 };
4364 
4365 const struct wined3d_format *wined3d_get_format(const struct wined3d_gl_info *gl_info,
4366         enum wined3d_format_id format_id, unsigned int resource_usage) DECLSPEC_HIDDEN;
4367 void wined3d_format_calculate_pitch(const struct wined3d_format *format, unsigned int alignment,
4368         unsigned int width, unsigned int height, unsigned int *row_pitch, unsigned int *slice_pitch) DECLSPEC_HIDDEN;
4369 UINT wined3d_format_calculate_size(const struct wined3d_format *format,
4370         UINT alignment, UINT width, UINT height, UINT depth) DECLSPEC_HIDDEN;
4371 DWORD wined3d_format_convert_from_float(const struct wined3d_format *format,
4372         const struct wined3d_color *color) DECLSPEC_HIDDEN;
4373 void wined3d_format_get_float_color_key(const struct wined3d_format *format,
4374         const struct wined3d_color_key *key, struct wined3d_color *float_colors) DECLSPEC_HIDDEN;
4375 BOOL wined3d_format_is_depth_view(enum wined3d_format_id resource_format_id,
4376         enum wined3d_format_id view_format_id) DECLSPEC_HIDDEN;
4377 const struct wined3d_color_key_conversion * wined3d_format_get_color_key_conversion(
4378         const struct wined3d_texture *texture, BOOL need_alpha_ck) DECLSPEC_HIDDEN;
4379 BOOL wined3d_formats_are_srgb_variants(enum wined3d_format_id format1,
4380         enum wined3d_format_id format2) DECLSPEC_HIDDEN;
4381 
4382 BOOL wined3d_array_reserve(void **elements, SIZE_T *capacity, SIZE_T count, SIZE_T size) DECLSPEC_HIDDEN;
4383 
4384 static inline BOOL wined3d_format_is_typeless(const struct wined3d_format *format)
4385 {
4386     return format->id == format->typeless_id && format->id != WINED3DFMT_UNKNOWN;
4387 }
4388 
4389 static inline BOOL use_indexed_vertex_blending(const struct wined3d_state *state, const struct wined3d_stream_info *si)
4390 {
4391     if (!state->render_states[WINED3D_RS_INDEXEDVERTEXBLENDENABLE])
4392         return FALSE;
4393 
4394     if (state->render_states[WINED3D_RS_VERTEXBLEND] == WINED3D_VBF_DISABLE)
4395         return FALSE;
4396 
4397     if (!(si->use_map & (1 << WINED3D_FFP_BLENDINDICES)) || !(si->use_map & (1 << WINED3D_FFP_BLENDWEIGHT)))
4398         return FALSE;
4399 
4400     return TRUE;
4401 }
4402 
4403 static inline BOOL use_software_vertex_processing(const struct wined3d_device *device)
4404 {
4405     if (device->shader_backend != &glsl_shader_backend)
4406         return FALSE;
4407 
4408     if (device->create_parms.flags & WINED3DCREATE_SOFTWARE_VERTEXPROCESSING)
4409         return TRUE;
4410 
4411     if (!(device->create_parms.flags & WINED3DCREATE_MIXED_VERTEXPROCESSING))
4412         return FALSE;
4413 
4414     return device->softwareVertexProcessing;
4415 }
4416 
4417 static inline BOOL use_vs(const struct wined3d_state *state)
4418 {
4419     /* Check state->vertex_declaration to allow this to be used before the
4420      * stream info is validated, for example in device_update_tex_unit_map(). */
4421     return state->shader[WINED3D_SHADER_TYPE_VERTEX]
4422             && (!state->vertex_declaration || !state->vertex_declaration->position_transformed);
4423 }
4424 
4425 static inline BOOL use_ps(const struct wined3d_state *state)
4426 {
4427     return !!state->shader[WINED3D_SHADER_TYPE_PIXEL];
4428 }
4429 
4430 static inline void context_apply_state(struct wined3d_context *context,
4431         const struct wined3d_state *state, DWORD state_id)
4432 {
4433     const struct StateEntry *state_table = context->state_table;
4434     DWORD rep = state_table[state_id].representative;
4435     state_table[rep].apply(context, state, rep);
4436 }
4437 
4438 static inline BOOL needs_separate_srgb_gl_texture(const struct wined3d_context *context,
4439         const struct wined3d_texture *texture)
4440 {
4441     unsigned int flags = texture->resource.format_flags
4442             & (WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE);
4443 
4444     return (!context->gl_info->supported[EXT_TEXTURE_SRGB_DECODE]
4445             || (flags && flags != (WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE)))
4446             && context->d3d_info->wined3d_creation_flags & WINED3D_SRGB_READ_WRITE_CONTROL;
4447 }
4448 
4449 static inline BOOL needs_srgb_write(const struct wined3d_context *context,
4450         const struct wined3d_state *state, const struct wined3d_fb_state *fb)
4451 {
4452     return (!(context->d3d_info->wined3d_creation_flags & WINED3D_SRGB_READ_WRITE_CONTROL)
4453             || state->render_states[WINED3D_RS_SRGBWRITEENABLE])
4454             && fb->render_targets[0] && fb->render_targets[0]->format_flags & WINED3DFMT_FLAG_SRGB_WRITE;
4455 }
4456 
4457 static inline GLuint wined3d_texture_get_texture_name(const struct wined3d_texture *texture,
4458         const struct wined3d_context *context, BOOL srgb)
4459 {
4460     return srgb && needs_separate_srgb_gl_texture(context, texture)
4461             ? texture->texture_srgb.name : texture->texture_rgb.name;
4462 }
4463 
4464 static inline BOOL can_use_texture_swizzle(const struct wined3d_gl_info *gl_info, const struct wined3d_format *format)
4465 {
4466     return gl_info->supported[ARB_TEXTURE_SWIZZLE] && !is_complex_fixup(format->color_fixup)
4467             && !is_scaling_fixup(format->color_fixup);
4468 }
4469 
4470 static inline BOOL needs_interpolation_qualifiers_for_shader_outputs(const struct wined3d_gl_info *gl_info)
4471 {
4472     /* In GLSL 4.40+ it is fine to specify interpolation qualifiers only in
4473      * fragment shaders. In older GLSL versions interpolation qualifiers must
4474      * match between shader stages.
4475      */
4476     return gl_info->glsl_version < MAKEDWORD_VERSION(4, 40);
4477 }
4478 
4479 static inline BOOL is_rasterization_disabled(const struct wined3d_shader *geometry_shader)
4480 {
4481     return geometry_shader
4482             && geometry_shader->u.gs.so_desc.rasterizer_stream_idx == WINED3D_NO_RASTERIZER_STREAM;
4483 }
4484 
4485 static inline int wined3d_bit_scan(unsigned int *x)
4486 {
4487     int bit_offset = ffs(*x) - 1;
4488     *x ^= 1u << bit_offset;
4489     return bit_offset;
4490 }
4491 
4492 static inline DWORD wined3d_extract_bits(const DWORD *bitstream,
4493         unsigned int offset, unsigned int count)
4494 {
4495     const unsigned int word_bit_count = sizeof(*bitstream) * CHAR_BIT;
4496     const unsigned int idx = offset / word_bit_count;
4497     const unsigned int shift = offset % word_bit_count;
4498     DWORD mask = (1u << count) - 1;
4499     DWORD ret;
4500 
4501     ret = (bitstream[idx] >> shift) & mask;
4502     if (shift + count > word_bit_count)
4503     {
4504         const unsigned int extracted_bit_count = word_bit_count - shift;
4505         const unsigned int remaining_bit_count = count - extracted_bit_count;
4506         mask = (1u << remaining_bit_count) - 1;
4507         ret |= (bitstream[idx + 1] & mask) << extracted_bit_count;
4508     }
4509     return ret;
4510 }
4511 
4512 static inline void wined3d_insert_bits(DWORD *bitstream,
4513         unsigned int offset, unsigned int count, DWORD bits)
4514 {
4515     const unsigned int word_bit_count = sizeof(*bitstream) * CHAR_BIT;
4516     const unsigned int idx = offset / word_bit_count;
4517     const unsigned int shift = offset % word_bit_count;
4518     DWORD mask = (1u << count) - 1;
4519 
4520     bitstream[idx] |= (bits & mask) << shift;
4521     if (shift + count > word_bit_count)
4522     {
4523         const unsigned int inserted_bit_count = word_bit_count - shift;
4524         const unsigned int remaining_bit_count = count - inserted_bit_count;
4525         mask = (1u << remaining_bit_count) - 1;
4526         bitstream[idx + 1] |= (bits >> inserted_bit_count) & mask;
4527     }
4528 }
4529 
4530 static inline void wined3d_from_cs(const struct wined3d_cs *cs)
4531 {
4532     if (cs->thread)
4533         assert(cs->thread_id == GetCurrentThreadId());
4534 }
4535 
4536 static inline void wined3d_not_from_cs(struct wined3d_cs *cs)
4537 {
4538     assert(cs->thread_id != GetCurrentThreadId());
4539 }
4540 
4541 BOOL wined3d_dxtn_init(void) DECLSPEC_HIDDEN;
4542 void wined3d_dxtn_free(void) DECLSPEC_HIDDEN;
4543 
4544 /* The WNDCLASS-Name for the fake window which we use to retrieve the GL capabilities */
4545 #define WINED3D_OPENGL_WINDOW_CLASS_NAME "WineD3D_OpenGL"
4546 
4547 #endif
4548