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