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