ntdll: The FileMailslotSetInformation and FileCompletionInformation cases of NtSetInf...
[wine] / dlls / wined3d / wined3d_private.h
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 2004 Jason Edmeades
7  * Copyright 2005 Oliver Stieber
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23
24 #ifndef __WINE_WINED3D_PRIVATE_H
25 #define __WINE_WINED3D_PRIVATE_H
26
27 #include <stdarg.h>
28 #include <math.h>
29 #define NONAMELESSUNION
30 #define NONAMELESSSTRUCT
31 #define COBJMACROS
32 #include "windef.h"
33 #include "winbase.h"
34 #include "winreg.h"
35 #include "wingdi.h"
36 #include "winuser.h"
37 #include "wine/debug.h"
38 #include "wine/unicode.h"
39
40 #include "wined3d_private_types.h"
41 #include "wine/wined3d_interface.h"
42 #include "wine/wined3d_caps.h"
43 #include "wine/wined3d_gl.h"
44 #include "wine/list.h"
45
46 /* Hash table functions */
47 typedef unsigned int (hash_function_t)(void *key);
48 typedef BOOL (compare_function_t)(void *keya, void *keyb);
49
50 typedef struct {
51     void *key;
52     void *value;
53     unsigned int hash;
54     struct list entry;
55 } hash_table_entry_t;
56
57 typedef struct {
58     hash_function_t *hash_function;
59     compare_function_t *compare_function;
60     struct list *buckets;
61     unsigned int bucket_count;
62     hash_table_entry_t *entries;
63     unsigned int entry_count;
64     struct list free_entries;
65     unsigned int count;
66     unsigned int grow_size;
67     unsigned int shrink_size;
68 } hash_table_t;
69
70 hash_table_t *hash_table_create(hash_function_t *hash_function, compare_function_t *compare_function);
71 void hash_table_destroy(hash_table_t *table);
72 void *hash_table_get(hash_table_t *table, void *key);
73 void hash_table_put(hash_table_t *table, void *key, void *value);
74 void hash_table_remove(hash_table_t *table, void *key);
75
76 /* Device caps */
77 #define MAX_PALETTES            256
78 #define MAX_STREAMS             16
79 #define MAX_TEXTURES            8
80 #define MAX_FRAGMENT_SAMPLERS   16
81 #define MAX_VERTEX_SAMPLERS     4
82 #define MAX_COMBINED_SAMPLERS   (MAX_FRAGMENT_SAMPLERS + MAX_VERTEX_SAMPLERS)
83 #define MAX_ACTIVE_LIGHTS       8
84 #define MAX_CLIPPLANES          WINED3DMAXUSERCLIPPLANES
85 #define MAX_LEVELS              256
86
87 #define MAX_CONST_I 16
88 #define MAX_CONST_B 16
89
90 /* Used for CreateStateBlock */
91 #define NUM_SAVEDPIXELSTATES_R     35
92 #define NUM_SAVEDPIXELSTATES_T     18
93 #define NUM_SAVEDPIXELSTATES_S     12
94 #define NUM_SAVEDVERTEXSTATES_R    34
95 #define NUM_SAVEDVERTEXSTATES_T    2
96 #define NUM_SAVEDVERTEXSTATES_S    1
97
98 extern const DWORD SavedPixelStates_R[NUM_SAVEDPIXELSTATES_R];
99 extern const DWORD SavedPixelStates_T[NUM_SAVEDPIXELSTATES_T];
100 extern const DWORD SavedPixelStates_S[NUM_SAVEDPIXELSTATES_S];
101 extern const DWORD SavedVertexStates_R[NUM_SAVEDVERTEXSTATES_R];
102 extern const DWORD SavedVertexStates_T[NUM_SAVEDVERTEXSTATES_T];
103 extern const DWORD SavedVertexStates_S[NUM_SAVEDVERTEXSTATES_S];
104
105 typedef enum _WINELOOKUP {
106     WINELOOKUP_WARPPARAM = 0,
107     WINELOOKUP_MAGFILTER = 1,
108     MAX_LOOKUPS          = 2
109 } WINELOOKUP;
110
111 extern int minLookup[MAX_LOOKUPS];
112 extern int maxLookup[MAX_LOOKUPS];
113 extern DWORD *stateLookup[MAX_LOOKUPS];
114
115 extern DWORD minMipLookup[WINED3DTEXF_ANISOTROPIC + 1][WINED3DTEXF_LINEAR + 1];
116
117 void init_type_lookup(WineD3D_GL_Info *gl_info);
118 #define WINED3D_ATR_TYPE(type)          GLINFO_LOCATION.glTypeLookup[type].d3dType
119 #define WINED3D_ATR_SIZE(type)          GLINFO_LOCATION.glTypeLookup[type].size
120 #define WINED3D_ATR_GLTYPE(type)        GLINFO_LOCATION.glTypeLookup[type].glType
121 #define WINED3D_ATR_NORMALIZED(type)    GLINFO_LOCATION.glTypeLookup[type].normalized
122 #define WINED3D_ATR_TYPESIZE(type)      GLINFO_LOCATION.glTypeLookup[type].typesize
123
124 /* See GL_NV_half_float for reference */
125 static inline float float_16_to_32(const unsigned short *in) {
126     const unsigned short s = ((*in) & 0x8000);
127     const unsigned short e = ((*in) & 0x7C00) >> 10;
128     const unsigned short m = (*in) & 0x3FF;
129     const float sgn = (s ? -1.0 : 1.0);
130
131     if(e == 0) {
132         if(m == 0) return sgn * 0.0; /* +0.0 or -0.0 */
133         else return sgn * pow(2, -14.0) * ( (float) m / 1024.0);
134     } else if(e < 31) {
135         return sgn * pow(2, (float) e-15.0) * (1.0 + ((float) m / 1024.0));
136     } else {
137         if(m == 0) return sgn / 0.0; /* +INF / -INF */
138         else return 0.0 / 0.0; /* NAN */
139     }
140 }
141
142 /**
143  * Settings 
144  */
145 #define VS_NONE    0
146 #define VS_HW      1
147
148 #define PS_NONE    0
149 #define PS_HW      1
150
151 #define VBO_NONE   0
152 #define VBO_HW     1
153
154 #define NP2_NONE   0
155 #define NP2_REPACK 1
156 #define NP2_NATIVE 2
157
158 #define ORM_BACKBUFFER  0
159 #define ORM_PBUFFER     1
160 #define ORM_FBO         2
161
162 #define SHADER_ARB  1
163 #define SHADER_GLSL 2
164 #define SHADER_NONE 3
165
166 #define RTL_DISABLE   -1
167 #define RTL_AUTO       0
168 #define RTL_READDRAW   1
169 #define RTL_READTEX    2
170 #define RTL_TEXDRAW    3
171 #define RTL_TEXTEX     4
172
173 /* NOTE: When adding fields to this structure, make sure to update the default
174  * values in wined3d_main.c as well. */
175 typedef struct wined3d_settings_s {
176 /* vertex and pixel shader modes */
177   int vs_mode;
178   int ps_mode;
179   int vbo_mode;
180 /* Ideally, we don't want the user to have to request GLSL.  If the hardware supports GLSL,
181     we should use it.  However, until it's fully implemented, we'll leave it as a registry
182     setting for developers. */
183   BOOL glslRequested;
184   int offscreen_rendering_mode;
185   int rendertargetlock_mode;
186 /* Memory tracking and object counting */
187   unsigned int emulated_textureram;
188   char *logo;
189 } wined3d_settings_t;
190
191 extern wined3d_settings_t wined3d_settings;
192
193 /* Shader backends */
194 struct SHADER_OPCODE_ARG;
195
196 typedef struct {
197     void (*shader_select)(IWineD3DDevice *iface, BOOL usePS, BOOL useVS);
198     void (*shader_select_depth_blt)(IWineD3DDevice *iface);
199     void (*shader_load_constants)(IWineD3DDevice *iface, char usePS, char useVS);
200     void (*shader_cleanup)(IWineD3DDevice *iface);
201     void (*shader_color_correction)(struct SHADER_OPCODE_ARG *arg);
202     void (*shader_destroy)(IWineD3DBaseShader *iface);
203 } shader_backend_t;
204
205 extern const shader_backend_t glsl_shader_backend;
206 extern const shader_backend_t arb_program_shader_backend;
207 extern const shader_backend_t none_shader_backend;
208
209 /* X11 locking */
210
211 extern void (*wine_tsx11_lock_ptr)(void);
212 extern void (*wine_tsx11_unlock_ptr)(void);
213
214 /* As GLX relies on X, this is needed */
215 extern int num_lock;
216
217 #if 0
218 #define ENTER_GL() ++num_lock; if (num_lock > 1) FIXME("Recursive use of GL lock to: %d\n", num_lock); wine_tsx11_lock_ptr()
219 #define LEAVE_GL() if (num_lock != 1) FIXME("Recursive use of GL lock: %d\n", num_lock); --num_lock; wine_tsx11_unlock_ptr()
220 #else
221 #define ENTER_GL() wine_tsx11_lock_ptr()
222 #define LEAVE_GL() wine_tsx11_unlock_ptr()
223 #endif
224
225 /*****************************************************************************
226  * Defines
227  */
228
229 /* GL related defines */
230 /* ------------------ */
231 #define GL_SUPPORT(ExtName)           (GLINFO_LOCATION.supported[ExtName] != 0)
232 #define GL_LIMITS(ExtName)            (GLINFO_LOCATION.max_##ExtName)
233 #define GL_EXTCALL(FuncName)          (GLINFO_LOCATION.FuncName)
234 #define GL_VEND(_VendName)            (GLINFO_LOCATION.gl_vendor == VENDOR_##_VendName ? TRUE : FALSE)
235
236 #define D3DCOLOR_B_R(dw) (((dw) >> 16) & 0xFF)
237 #define D3DCOLOR_B_G(dw) (((dw) >>  8) & 0xFF)
238 #define D3DCOLOR_B_B(dw) (((dw) >>  0) & 0xFF)
239 #define D3DCOLOR_B_A(dw) (((dw) >> 24) & 0xFF)
240
241 #define D3DCOLOR_R(dw) (((float) (((dw) >> 16) & 0xFF)) / 255.0f)
242 #define D3DCOLOR_G(dw) (((float) (((dw) >>  8) & 0xFF)) / 255.0f)
243 #define D3DCOLOR_B(dw) (((float) (((dw) >>  0) & 0xFF)) / 255.0f)
244 #define D3DCOLOR_A(dw) (((float) (((dw) >> 24) & 0xFF)) / 255.0f)
245
246 #define D3DCOLORTOGLFLOAT4(dw, vec) \
247   (vec)[0] = D3DCOLOR_R(dw); \
248   (vec)[1] = D3DCOLOR_G(dw); \
249   (vec)[2] = D3DCOLOR_B(dw); \
250   (vec)[3] = D3DCOLOR_A(dw);
251
252 /* DirectX Device Limits */
253 /* --------------------- */
254 #define MAX_LEVELS  256  /* Maximum number of mipmap levels. Guessed at 256 */
255
256 #define MAX_STREAMS  16  /* Maximum possible streams - used for fixed size arrays
257                             See MaxStreams in MSDN under GetDeviceCaps */
258                          /* Maximum number of constants provided to the shaders */
259 #define HIGHEST_TRANSFORMSTATE 512 
260                          /* Highest value in WINED3DTRANSFORMSTATETYPE */
261 #define MAX_PALETTES      256
262
263 /* Checking of API calls */
264 /* --------------------- */
265 #define checkGLcall(A)                                          \
266 {                                                               \
267     GLint err = glGetError();                                   \
268     if (err == GL_NO_ERROR) {                                   \
269        TRACE("%s call ok %s / %d\n", A, __FILE__, __LINE__);    \
270                                                                 \
271     } else do {                                                 \
272         FIXME(">>>>>>>>>>>>>>>>> %s (%#x) from %s @ %s / %d\n", \
273             debug_glerror(err), err, A, __FILE__, __LINE__);    \
274        err = glGetError();                                      \
275     } while (err != GL_NO_ERROR);                               \
276
277
278 /* Trace routines / diagnostics */
279 /* ---------------------------- */
280
281 /* Dump out a matrix and copy it */
282 #define conv_mat(mat,gl_mat)                                                                \
283 do {                                                                                        \
284     TRACE("%f %f %f %f\n", (mat)->u.s._11, (mat)->u.s._12, (mat)->u.s._13, (mat)->u.s._14); \
285     TRACE("%f %f %f %f\n", (mat)->u.s._21, (mat)->u.s._22, (mat)->u.s._23, (mat)->u.s._24); \
286     TRACE("%f %f %f %f\n", (mat)->u.s._31, (mat)->u.s._32, (mat)->u.s._33, (mat)->u.s._34); \
287     TRACE("%f %f %f %f\n", (mat)->u.s._41, (mat)->u.s._42, (mat)->u.s._43, (mat)->u.s._44); \
288     memcpy(gl_mat, (mat), 16 * sizeof(float));                                              \
289 } while (0)
290
291 /* Macro to dump out the current state of the light chain */
292 #define DUMP_LIGHT_CHAIN()                    \
293 {                                             \
294   PLIGHTINFOEL *el = This->stateBlock->lights;\
295   while (el) {                                \
296     TRACE("Light %p (glIndex %ld, d3dIndex %ld, enabled %d)\n", el, el->glIndex, el->OriginalIndex, el->lightEnabled);\
297     el = el->next;                            \
298   }                                           \
299 }
300
301 /* Trace vector and strided data information */
302 #define TRACE_VECTOR(name) TRACE( #name "=(%f, %f, %f, %f)\n", name.x, name.y, name.z, name.w);
303 #define TRACE_STRIDED(sd,name) TRACE( #name "=(data:%p, stride:%d, type:%d, vbo %d, stream %u)\n", \
304         sd->u.s.name.lpData, sd->u.s.name.dwStride, sd->u.s.name.dwType, sd->u.s.name.VBO, sd->u.s.name.streamNo);
305
306 /* Defines used for optimizations */
307
308 /*    Only reapply what is necessary */
309 #define REAPPLY_ALPHAOP  0x0001
310 #define REAPPLY_ALL      0xFFFF
311
312 /* Advance declaration of structures to satisfy compiler */
313 typedef struct IWineD3DStateBlockImpl IWineD3DStateBlockImpl;
314 typedef struct IWineD3DSurfaceImpl    IWineD3DSurfaceImpl;
315 typedef struct IWineD3DPaletteImpl    IWineD3DPaletteImpl;
316 typedef struct IWineD3DDeviceImpl     IWineD3DDeviceImpl;
317
318 /* Global variables */
319 extern const float identity[16];
320
321 /*****************************************************************************
322  * Compilable extra diagnostics
323  */
324
325 /* Trace information per-vertex: (extremely high amount of trace) */
326 #if 0 /* NOTE: Must be 0 in cvs */
327 # define VTRACE(A) TRACE A
328 #else 
329 # define VTRACE(A) 
330 #endif
331
332 /* Checking of per-vertex related GL calls */
333 /* --------------------- */
334 #define vcheckGLcall(A)                                         \
335 {                                                               \
336     GLint err = glGetError();                                   \
337     if (err == GL_NO_ERROR) {                                   \
338        VTRACE(("%s call ok %s / %d\n", A, __FILE__, __LINE__)); \
339                                                                 \
340     } else do {                                                 \
341         FIXME(">>>>>>>>>>>>>>>>> %s (%#x) from %s @ %s / %d\n", \
342             debug_glerror(err), err, A, __FILE__, __LINE__);    \
343        err = glGetError();                                      \
344     } while (err != GL_NO_ERROR);                               \
345 }
346
347 /* TODO: Confirm each of these works when wined3d move completed */
348 #if 0 /* NOTE: Must be 0 in cvs */
349   /* To avoid having to get gigabytes of trace, the following can be compiled in, and at the start
350      of each frame, a check is made for the existence of C:\D3DTRACE, and if it exists d3d trace
351      is enabled, and if it doesn't exist it is disabled. */
352 # define FRAME_DEBUGGING
353   /*  Adding in the SINGLE_FRAME_DEBUGGING gives a trace of just what makes up a single frame, before
354       the file is deleted                                                                            */
355 # if 1 /* NOTE: Must be 1 in cvs, as this is mostly more useful than a trace from program start */
356 #  define SINGLE_FRAME_DEBUGGING
357 # endif  
358   /* The following, when enabled, lets you see the makeup of the frame, by drawprimitive calls.
359      It can only be enabled when FRAME_DEBUGGING is also enabled                               
360      The contents of the back buffer are written into /tmp/backbuffer_* after each primitive 
361      array is drawn.                                                                            */
362 # if 0 /* NOTE: Must be 0 in cvs, as this give a lot of ppm files when compiled in */                                                                                       
363 #  define SHOW_FRAME_MAKEUP 1
364 # endif  
365   /* The following, when enabled, lets you see the makeup of the all the textures used during each
366      of the drawprimitive calls. It can only be enabled when SHOW_FRAME_MAKEUP is also enabled.
367      The contents of the textures assigned to each stage are written into 
368      /tmp/texture_*_<Stage>.ppm after each primitive array is drawn.                            */
369 # if 0 /* NOTE: Must be 0 in cvs, as this give a lot of ppm files when compiled in */
370 #  define SHOW_TEXTURE_MAKEUP 0
371 # endif  
372 extern BOOL isOn;
373 extern BOOL isDumpingFrames;
374 extern LONG primCounter;
375 #endif
376
377 /*****************************************************************************
378  * Prototypes
379  */
380
381 /* Routine common to the draw primitive and draw indexed primitive routines */
382 void drawPrimitive(IWineD3DDevice *iface,
383                     int PrimitiveType,
384                     long NumPrimitives,
385                     /* for Indexed: */
386                     long  StartVertexIndex,
387                     UINT  numberOfVertices,
388                     long  StartIdx,
389                     short idxBytes,
390                     const void *idxData,
391                     int   minIndex);
392
393 void primitiveDeclarationConvertToStridedData(
394      IWineD3DDevice *iface,
395      BOOL useVertexShaderFunction,
396      WineDirect3DVertexStridedData *strided,
397      BOOL *fixup);
398
399 DWORD get_flexible_vertex_size(DWORD d3dvtVertexType);
400
401 typedef void (*glAttribFunc)(void *data);
402 typedef void (*glTexAttribFunc)(GLuint unit, void *data);
403 extern glAttribFunc position_funcs[WINED3DDECLTYPE_UNUSED];
404 extern glAttribFunc diffuse_funcs[WINED3DDECLTYPE_UNUSED];
405 extern glAttribFunc specular_funcs[WINED3DDECLTYPE_UNUSED];
406 extern glAttribFunc normal_funcs[WINED3DDECLTYPE_UNUSED];
407
408 #define eps 1e-8
409
410 #define GET_TEXCOORD_SIZE_FROM_FVF(d3dvtVertexType, tex_num) \
411     (((((d3dvtVertexType) >> (16 + (2 * (tex_num)))) + 1) & 0x03) + 1)
412
413 /* Routines and structures related to state management */
414 typedef struct WineD3DContext WineD3DContext;
415 typedef void (*APPLYSTATEFUNC)(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *ctx);
416
417 #define STATE_RENDER(a) (a)
418 #define STATE_IS_RENDER(a) ((a) >= STATE_RENDER(1) && (a) <= STATE_RENDER(WINEHIGHEST_RENDER_STATE))
419
420 #define STATE_TEXTURESTAGE(stage, num) (STATE_RENDER(WINEHIGHEST_RENDER_STATE) + (stage) * WINED3D_HIGHEST_TEXTURE_STATE + (num))
421 #define STATE_IS_TEXTURESTAGE(a) ((a) >= STATE_TEXTURESTAGE(0, 1) && (a) <= STATE_TEXTURESTAGE(MAX_TEXTURES - 1, WINED3D_HIGHEST_TEXTURE_STATE))
422
423 /* + 1 because samplers start with 0 */
424 #define STATE_SAMPLER(num) (STATE_TEXTURESTAGE(MAX_TEXTURES - 1, WINED3D_HIGHEST_TEXTURE_STATE) + 1 + (num))
425 #define STATE_IS_SAMPLER(num) ((num) >= STATE_SAMPLER(0) && (num) <= STATE_SAMPLER(MAX_COMBINED_SAMPLERS - 1))
426
427 #define STATE_PIXELSHADER (STATE_SAMPLER(MAX_COMBINED_SAMPLERS - 1) + 1)
428 #define STATE_IS_PIXELSHADER(a) ((a) == STATE_PIXELSHADER)
429
430 #define STATE_TRANSFORM(a) (STATE_PIXELSHADER + (a))
431 #define STATE_IS_TRANSFORM(a) ((a) >= STATE_TRANSFORM(1) && (a) <= STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(255)))
432
433 #define STATE_STREAMSRC (STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(255)) + 1)
434 #define STATE_IS_STREAMSRC(a) ((a) == STATE_STREAMSRC)
435 #define STATE_INDEXBUFFER (STATE_STREAMSRC + 1)
436 #define STATE_IS_INDEXBUFFER(a) ((a) == STATE_INDEXBUFFER)
437
438 #define STATE_VDECL (STATE_INDEXBUFFER + 1)
439 #define STATE_IS_VDECL(a) ((a) == STATE_VDECL)
440
441 #define STATE_VSHADER (STATE_VDECL + 1)
442 #define STATE_IS_VSHADER(a) ((a) == STATE_VSHADER)
443
444 #define STATE_VIEWPORT (STATE_VSHADER + 1)
445 #define STATE_IS_VIEWPORT(a) ((a) == STATE_VIEWPORT)
446
447 #define STATE_VERTEXSHADERCONSTANT (STATE_VIEWPORT + 1)
448 #define STATE_PIXELSHADERCONSTANT (STATE_VERTEXSHADERCONSTANT + 1)
449 #define STATE_IS_VERTEXSHADERCONSTANT(a) ((a) == STATE_VERTEXSHADERCONSTANT)
450 #define STATE_IS_PIXELSHADERCONSTANT(a) ((a) == STATE_PIXELSHADERCONSTANT)
451
452 #define STATE_ACTIVELIGHT(a) (STATE_PIXELSHADERCONSTANT + (a) + 1)
453 #define STATE_IS_ACTIVELIGHT(a) ((a) >= STATE_ACTIVELIGHT(0) && (a) < STATE_ACTIVELIGHT(MAX_ACTIVE_LIGHTS))
454
455 #define STATE_SCISSORRECT (STATE_ACTIVELIGHT(MAX_ACTIVE_LIGHTS - 1) + 1)
456 #define STATE_IS_SCISSORRECT(a) ((a) == STATE_SCISSORRECT)
457
458 #define STATE_CLIPPLANE(a) (STATE_SCISSORRECT + 1 + (a))
459 #define STATE_IS_CLIPPLANE(a) ((a) >= STATE_CLIPPLANE(0) && (a) <= STATE_CLIPPLANE(MAX_CLIPPLANES - 1))
460
461 #define STATE_MATERIAL (STATE_CLIPPLANE(MAX_CLIPPLANES))
462
463 #define STATE_FRONTFACE (STATE_MATERIAL + 1)
464
465 #define STATE_HIGHEST (STATE_FRONTFACE)
466
467 struct StateEntry
468 {
469     DWORD           representative;
470     APPLYSTATEFUNC  apply;
471 };
472
473 /* Global state table */
474 extern const struct StateEntry StateTable[];
475
476 /* The new context manager that should deal with onscreen and offscreen rendering */
477 struct WineD3DContext {
478     /* State dirtification
479      * dirtyArray is an array that contains markers for dirty states. numDirtyEntries states are dirty, their numbers are in indices
480      * 0...numDirtyEntries - 1. isStateDirty is a redundant copy of the dirtyArray. Technically only one of them would be needed,
481      * 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
482      * only numDirtyEntries array elements have to be checked, not STATE_HIGHEST states.
483      */
484     DWORD                   dirtyArray[STATE_HIGHEST + 1]; /* Won't get bigger than that, a state is never marked dirty 2 times */
485     DWORD                   numDirtyEntries;
486     DWORD                   isStateDirty[STATE_HIGHEST/32 + 1]; /* Bitmap to find out quickly if a state is dirty */
487
488     IWineD3DSurface         *surface;
489     DWORD                   tid;    /* Thread ID which owns this context at the moment */
490
491     /* Stores some information about the context state for optimization */
492     GLint                   last_draw_buffer;
493     BOOL                    last_was_rhw;      /* true iff last draw_primitive was in xyzrhw mode */
494     BOOL                    last_was_pshader;
495     BOOL                    last_was_vshader;
496     BOOL                    last_was_foggy_shader;
497     BOOL                    namedArraysLoaded, numberedArraysLoaded;
498     BOOL                    lastWasPow2Texture[MAX_TEXTURES];
499     GLenum                  tracking_parm;     /* Which source is tracking current colour         */
500     unsigned char           num_untracked_materials;
501     GLenum                  untracked_materials[2];
502     BOOL                    last_was_blit, last_was_ckey;
503     char                    texShaderBumpMap;
504     BOOL                    fog_coord;
505
506     /* The actual opengl context */
507     HGLRC                   glCtx;
508     HWND                    win_handle;
509     HDC                     hdc;
510     HPBUFFERARB             pbuffer;
511     BOOL                    isPBuffer;
512 };
513
514 typedef enum ContextUsage {
515     CTXUSAGE_RESOURCELOAD       = 1,    /* Only loads textures: No State is applied */
516     CTXUSAGE_DRAWPRIM           = 2,    /* OpenGL states are set up for blitting DirectDraw surfaces */
517     CTXUSAGE_BLIT               = 3,    /* OpenGL states are set up 3D drawing */
518     CTXUSAGE_CLEAR              = 4,    /* Drawable and states are set up for clearing */
519 } ContextUsage;
520
521 void ActivateContext(IWineD3DDeviceImpl *device, IWineD3DSurface *target, ContextUsage usage);
522 WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, HWND win, BOOL create_pbuffer, const WINED3DPRESENT_PARAMETERS *pPresentParms);
523 void DestroyContext(IWineD3DDeviceImpl *This, WineD3DContext *context);
524 void apply_fbo_state(IWineD3DDevice *iface);
525
526 /* Macros for doing basic GPU detection based on opengl capabilities */
527 #define WINE_D3D6_CAPABLE(gl_info) (gl_info->supported[ARB_MULTITEXTURE])
528 #define WINE_D3D7_CAPABLE(gl_info) (gl_info->supported[ARB_TEXTURE_COMPRESSION] && gl_info->supported[ARB_TEXTURE_CUBE_MAP] && gl_info->supported[ARB_TEXTURE_ENV_DOT3])
529 #define WINE_D3D8_CAPABLE(gl_info) WINE_D3D7_CAPABLE(gl_info) && (gl_info->supported[ARB_MULTISAMPLE] && gl_info->supported[ARB_TEXTURE_BORDER_CLAMP])
530 #define WINE_D3D9_CAPABLE(gl_info) WINE_D3D8_CAPABLE(gl_info) && (gl_info->supported[ARB_FRAGMENT_PROGRAM] && gl_info->supported[ARB_VERTEX_SHADER])
531
532 /* Default callbacks for implicit object destruction */
533 extern ULONG WINAPI D3DCB_DefaultDestroySurface(IWineD3DSurface *pSurface);
534
535 extern ULONG WINAPI D3DCB_DefaultDestroyVolume(IWineD3DVolume *pSurface);
536
537 /*****************************************************************************
538  * Internal representation of a light
539  */
540 typedef struct PLIGHTINFOEL PLIGHTINFOEL;
541 struct PLIGHTINFOEL {
542     WINED3DLIGHT OriginalParms; /* Note D3D8LIGHT == D3D9LIGHT */
543     DWORD        OriginalIndex;
544     LONG         glIndex;
545     BOOL         changed;
546     BOOL         enabledChanged;
547     BOOL         enabled;
548
549     /* Converted parms to speed up swapping lights */
550     float                         lightPosn[4];
551     float                         lightDirn[4];
552     float                         exponent;
553     float                         cutoff;
554
555     struct list entry;
556 };
557
558 /* The default light parameters */
559 extern const WINED3DLIGHT WINED3D_default_light;
560
561 typedef struct WineD3D_PixelFormat
562 {
563     int iPixelFormat; /* WGL pixel format */
564     int redSize, greenSize, blueSize, alphaSize;
565     int depthSize, stencilSize;
566 } WineD3D_PixelFormat;
567
568 /* The adapter structure */
569 typedef struct GLPixelFormatDesc GLPixelFormatDesc;
570 struct WineD3DAdapter
571 {
572     UINT                    num;
573     POINT                   monitorPoint;
574     WineD3D_GL_Info         gl_info;
575     const char              *driver;
576     const char              *description;
577     WCHAR                   DeviceName[CCHDEVICENAME]; /* DeviceName for use with e.g. ChangeDisplaySettings */
578     int                     nCfgs;
579     WineD3D_PixelFormat     *cfgs;
580     unsigned int            TextureRam; /* Amount of texture memory both video ram + AGP/TurboCache/HyperMemory/.. */
581     unsigned int            UsedTextureRam;
582 };
583
584 extern BOOL InitAdapters(void);
585 extern BOOL initPixelFormats(WineD3D_GL_Info *gl_info);
586 extern long WineD3DAdapterChangeGLRam(IWineD3DDeviceImpl *D3DDevice, long glram);
587
588 /*****************************************************************************
589  * High order patch management
590  */
591 struct WineD3DRectPatch
592 {
593     UINT                            Handle;
594     float                          *mem;
595     WineDirect3DVertexStridedData   strided;
596     WINED3DRECTPATCH_INFO           RectPatchInfo;
597     float                           numSegs[4];
598     char                            has_normals, has_texcoords;
599     struct list                     entry;
600 };
601
602 HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This, struct WineD3DRectPatch *patch);
603
604 /*****************************************************************************
605  * IWineD3D implementation structure
606  */
607 typedef struct IWineD3DImpl
608 {
609     /* IUnknown fields */
610     const IWineD3DVtbl     *lpVtbl;
611     LONG                    ref;     /* Note: Ref counting not required */
612
613     /* WineD3D Information */
614     IUnknown               *parent;
615     UINT                    dxVersion;
616 } IWineD3DImpl;
617
618 extern const IWineD3DVtbl IWineD3D_Vtbl;
619
620 /* TODO: setup some flags in the registry to enable, disable pbuffer support
621 (since it will break quite a few things until contexts are managed properly!) */
622 extern BOOL pbuffer_support;
623 /* allocate one pbuffer per surface */
624 extern BOOL pbuffer_per_surface;
625
626 /* A helper function that dumps a resource list */
627 void dumpResources(struct list *list);
628
629 /*****************************************************************************
630  * IWineD3DDevice implementation structure
631  */
632 struct IWineD3DDeviceImpl
633 {
634     /* IUnknown fields      */
635     const IWineD3DDeviceVtbl *lpVtbl;
636     LONG                    ref;     /* Note: Ref counting not required */
637
638     /* WineD3D Information  */
639     IUnknown               *parent;
640     IWineD3D               *wineD3D;
641     struct WineD3DAdapter  *adapter;
642
643     /* Window styles to restore when switching fullscreen mode */
644     LONG                    style;
645     LONG                    exStyle;
646
647     /* X and GL Information */
648     GLint                   maxConcurrentLights;
649     GLenum                  offscreenBuffer;
650
651     /* Selected capabilities */
652     int vs_selected_mode;
653     int ps_selected_mode;
654     const shader_backend_t *shader_backend;
655     hash_table_t *glsl_program_lookup;
656
657     /* To store */
658     BOOL                    view_ident;        /* true iff view matrix is identity                */
659     BOOL                    untransformed;
660     BOOL                    vertexBlendUsed;   /* To avoid needless setting of the blend matrices */
661     unsigned char           surface_alignment; /* Line Alignment of surfaces                      */
662
663     /* State block related */
664     BOOL                    isRecordingState;
665     IWineD3DStateBlockImpl *stateBlock;
666     IWineD3DStateBlockImpl *updateStateBlock;
667     BOOL                   isInDraw;
668
669     /* Internal use fields  */
670     WINED3DDEVICE_CREATION_PARAMETERS createParms;
671     UINT                            adapterNo;
672     WINED3DDEVTYPE                  devType;
673
674     IWineD3DSwapChain     **swapchains;
675     UINT                    NumberOfSwapChains;
676
677     struct list             resources; /* a linked list to track resources created by the device */
678     struct list             shaders;   /* a linked list to track shaders (pixel and vertex)      */
679
680     /* Render Target Support */
681     IWineD3DSurface       **render_targets;
682     IWineD3DSurface        *auto_depth_stencil_buffer;
683     IWineD3DSurface       **fbo_color_attachments;
684     IWineD3DSurface        *fbo_depth_attachment;
685
686     IWineD3DSurface        *stencilBufferTarget;
687
688     /* Caches to avoid unneeded context changes */
689     IWineD3DSurface        *lastActiveRenderTarget;
690     IWineD3DSwapChain      *lastActiveSwapChain;
691
692     /* palettes texture management */
693     PALETTEENTRY            palettes[MAX_PALETTES][256];
694     UINT                    currentPalette;
695     UINT                    paletteConversionShader;
696
697     /* For rendering to a texture using glCopyTexImage */
698     BOOL                    render_offscreen;
699     WINED3D_DEPTHCOPYSTATE  depth_copy_state;
700     GLuint                  fbo;
701     GLuint                  src_fbo;
702     GLuint                  dst_fbo;
703     GLenum                  *draw_buffers;
704
705     /* Cursor management */
706     BOOL                    bCursorVisible;
707     UINT                    xHotSpot;
708     UINT                    yHotSpot;
709     UINT                    xScreenSpace;
710     UINT                    yScreenSpace;
711     UINT                    cursorWidth, cursorHeight;
712     GLuint                  cursorTexture;
713     BOOL                    haveHardwareCursor;
714     HCURSOR                 hardwareCursor;
715
716     /* The Wine logo surface */
717     IWineD3DSurface        *logo_surface;
718
719     /* Textures for when no other textures are mapped */
720     UINT                          dummyTextureName[MAX_TEXTURES];
721
722     /* Debug stream management */
723     BOOL                     debug;
724
725     /* Device state management */
726     HRESULT                 state;
727     BOOL                    d3d_initialized;
728
729     /* A flag to check for proper BeginScene / EndScene call pairs */
730     BOOL inScene;
731
732     /* process vertex shaders using software or hardware */
733     BOOL softwareVertexProcessing;
734
735     /* DirectDraw stuff */
736     HWND ddraw_window;
737     IWineD3DSurface *ddraw_primary;
738     DWORD ddraw_width, ddraw_height;
739     WINED3DFORMAT ddraw_format;
740     BOOL ddraw_fullscreen;
741
742     /* Final position fixup constant */
743     float                       posFixup[4];
744
745     /* With register combiners we can skip junk texture stages */
746     DWORD                     texUnitMap[MAX_COMBINED_SAMPLERS];
747     DWORD                     rev_tex_unit_map[MAX_COMBINED_SAMPLERS];
748     BOOL                      fixed_function_usage_map[MAX_TEXTURES];
749
750     /* Stream source management */
751     WineDirect3DVertexStridedData strided_streams;
752     WineDirect3DVertexStridedData *up_strided;
753     BOOL                      useDrawStridedSlow;
754     BOOL                      instancedDraw;
755
756     /* Context management */
757     WineD3DContext          **contexts;                  /* Dynamic array containing pointers to context structures */
758     WineD3DContext          *activeContext;
759     DWORD                   lastThread;
760     UINT                    numContexts;
761     WineD3DContext          *pbufferContext;             /* The context that has a pbuffer as drawable */
762     DWORD                   pbufferWidth, pbufferHeight; /* Size of the buffer drawable */
763
764     /* High level patch management */
765 #define PATCHMAP_SIZE 43
766 #define PATCHMAP_HASHFUNC(x) ((x) % PATCHMAP_SIZE) /* Primitive and simple function */
767     struct list             patches[PATCHMAP_SIZE];
768     struct WineD3DRectPatch *currentPatch;
769 };
770
771 extern const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl;
772
773 HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This,  IWineD3DSurfaceImpl *target, DWORD Count,
774                                         CONST WINED3DRECT* pRects, DWORD Flags, WINED3DCOLOR Color,
775                                         float Z, DWORD Stencil);
776 void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This);
777 void IWineD3DDeviceImpl_MarkStateDirty(IWineD3DDeviceImpl *This, DWORD state);
778 static inline BOOL isStateDirty(WineD3DContext *context, DWORD state) {
779     DWORD idx = state >> 5;
780     BYTE shift = state & 0x1f;
781     return context->isStateDirty[idx] & (1 << shift);
782 }
783
784 /* Support for IWineD3DResource ::Set/Get/FreePrivateData. */
785 typedef struct PrivateData
786 {
787     struct list entry;
788
789     GUID tag;
790     DWORD flags; /* DDSPD_* */
791     DWORD uniqueness_value;
792
793     union
794     {
795         LPVOID data;
796         LPUNKNOWN object;
797     } ptr;
798
799     DWORD size;
800 } PrivateData;
801
802 /*****************************************************************************
803  * IWineD3DResource implementation structure
804  */
805 typedef struct IWineD3DResourceClass
806 {
807     /* IUnknown fields */
808     LONG                    ref;     /* Note: Ref counting not required */
809
810     /* WineD3DResource Information */
811     IUnknown               *parent;
812     WINED3DRESOURCETYPE     resourceType;
813     IWineD3DDeviceImpl     *wineD3DDevice;
814     WINED3DPOOL             pool;
815     UINT                    size;
816     DWORD                   usage;
817     WINED3DFORMAT           format;
818     BYTE                   *allocatedMemory; /* Pointer to the real data location */
819     BYTE                   *heapMemory; /* Pointer to the HeapAlloced block of memory */
820     struct list             privateData;
821     struct list             resource_list_entry;
822
823 } IWineD3DResourceClass;
824
825 typedef struct IWineD3DResourceImpl
826 {
827     /* IUnknown & WineD3DResource Information     */
828     const IWineD3DResourceVtbl *lpVtbl;
829     IWineD3DResourceClass   resource;
830 } IWineD3DResourceImpl;
831
832 /* Tests show that the start address of resources is 32 byte aligned */
833 #define RESOURCE_ALIGNMENT 32
834
835 /*****************************************************************************
836  * IWineD3DVertexBuffer implementation structure (extends IWineD3DResourceImpl)
837  */
838 enum vbo_conversion_type {
839     CONV_NONE               = 0,
840     CONV_D3DCOLOR           = 1,
841     CONV_POSITIONT          = 2,
842     CONV_FLOAT16_2          = 3 /* Also handles FLOAT16_4 */
843
844     /* TODO: Add tests and support for FLOAT16_4 POSITIONT, D3DCOLOR position, other
845      * fixed function semantics as D3DCOLOR or FLOAT16
846      */
847 };
848
849 typedef struct IWineD3DVertexBufferImpl
850 {
851     /* IUnknown & WineD3DResource Information     */
852     const IWineD3DVertexBufferVtbl *lpVtbl;
853     IWineD3DResourceClass     resource;
854
855     /* WineD3DVertexBuffer specifics */
856     DWORD                     fvf;
857
858     /* Vertex buffer object support */
859     GLuint                    vbo;
860     BYTE                      Flags;
861     LONG                      bindCount;
862     LONG                      vbo_size;
863     GLenum                    vbo_usage;
864
865     UINT                      dirtystart, dirtyend;
866     LONG                      lockcount;
867
868     LONG                      declChanges, draws;
869     /* Last description of the buffer */
870     DWORD                     stride;       /* 0 if no conversion               */
871     enum vbo_conversion_type  *conv_map;    /* NULL if no conversion            */
872
873     /* Extra load offsets, for FLOAT16 conversion */
874     DWORD                     *conv_shift;  /* NULL if no shifted conversion    */
875     DWORD                     conv_stride;  /* 0 if no shifted conversion       */
876 } IWineD3DVertexBufferImpl;
877
878 extern const IWineD3DVertexBufferVtbl IWineD3DVertexBuffer_Vtbl;
879
880 #define VBFLAG_LOAD           0x01    /* Data is written from allocatedMemory to the VBO */
881 #define VBFLAG_OPTIMIZED      0x02    /* Optimize has been called for the VB */
882 #define VBFLAG_DIRTY          0x04    /* Buffer data has been modified */
883 #define VBFLAG_HASDESC        0x08    /* A vertex description has been found */
884 #define VBFLAG_VBOCREATEFAIL  0x10    /* An attempt to create a vbo has failed */
885
886 /*****************************************************************************
887  * IWineD3DIndexBuffer implementation structure (extends IWineD3DResourceImpl)
888  */
889 typedef struct IWineD3DIndexBufferImpl
890 {
891     /* IUnknown & WineD3DResource Information     */
892     const IWineD3DIndexBufferVtbl *lpVtbl;
893     IWineD3DResourceClass     resource;
894
895     GLuint                    vbo;
896     UINT                      dirtystart, dirtyend;
897     LONG                      lockcount;
898
899     /* WineD3DVertexBuffer specifics */
900 } IWineD3DIndexBufferImpl;
901
902 extern const IWineD3DIndexBufferVtbl IWineD3DIndexBuffer_Vtbl;
903
904 /*****************************************************************************
905  * IWineD3DBaseTexture D3D- > openGL state map lookups
906  */
907 #define WINED3DFUNC_NOTSUPPORTED  -2
908 #define WINED3DFUNC_UNIMPLEMENTED -1
909
910 typedef enum winetexturestates {
911     WINED3DTEXSTA_ADDRESSU       = 0,
912     WINED3DTEXSTA_ADDRESSV       = 1,
913     WINED3DTEXSTA_ADDRESSW       = 2,
914     WINED3DTEXSTA_BORDERCOLOR    = 3,
915     WINED3DTEXSTA_MAGFILTER      = 4,
916     WINED3DTEXSTA_MINFILTER      = 5,
917     WINED3DTEXSTA_MIPFILTER      = 6,
918     WINED3DTEXSTA_MAXMIPLEVEL    = 7,
919     WINED3DTEXSTA_MAXANISOTROPY  = 8,
920     WINED3DTEXSTA_SRGBTEXTURE    = 9,
921     WINED3DTEXSTA_ELEMENTINDEX   = 10,
922     WINED3DTEXSTA_DMAPOFFSET     = 11,
923     WINED3DTEXSTA_TSSADDRESSW    = 12,
924     MAX_WINETEXTURESTATES        = 13,
925 } winetexturestates;
926
927 /*****************************************************************************
928  * IWineD3DBaseTexture implementation structure (extends IWineD3DResourceImpl)
929  */
930 typedef struct IWineD3DBaseTextureClass
931 {
932     UINT                    levels;
933     BOOL                    dirty;
934     UINT                    textureName;
935     UINT                    LOD;
936     WINED3DTEXTUREFILTERTYPE filterType;
937     DWORD                   states[MAX_WINETEXTURESTATES];
938     LONG                    bindCount;
939     DWORD                   sampler;
940     BOOL                    is_srgb;
941     UINT                    srgb_mode_change_count;
942     WINED3DFORMAT           shader_conversion_group;
943     float                   pow2Matrix[16];
944 } IWineD3DBaseTextureClass;
945
946 typedef struct IWineD3DBaseTextureImpl
947 {
948     /* IUnknown & WineD3DResource Information     */
949     const IWineD3DBaseTextureVtbl *lpVtbl;
950     IWineD3DResourceClass     resource;
951     IWineD3DBaseTextureClass  baseTexture;
952
953 } IWineD3DBaseTextureImpl;
954
955 /*****************************************************************************
956  * IWineD3DTexture implementation structure (extends IWineD3DBaseTextureImpl)
957  */
958 typedef struct IWineD3DTextureImpl
959 {
960     /* IUnknown & WineD3DResource/WineD3DBaseTexture Information     */
961     const IWineD3DTextureVtbl *lpVtbl;
962     IWineD3DResourceClass     resource;
963     IWineD3DBaseTextureClass  baseTexture;
964
965     /* IWineD3DTexture */
966     IWineD3DSurface          *surfaces[MAX_LEVELS];
967     
968     UINT                      width;
969     UINT                      height;
970     UINT                      target;
971
972 } IWineD3DTextureImpl;
973
974 extern const IWineD3DTextureVtbl IWineD3DTexture_Vtbl;
975
976 /*****************************************************************************
977  * IWineD3DCubeTexture implementation structure (extends IWineD3DBaseTextureImpl)
978  */
979 typedef struct IWineD3DCubeTextureImpl
980 {
981     /* IUnknown & WineD3DResource/WineD3DBaseTexture Information     */
982     const IWineD3DCubeTextureVtbl *lpVtbl;
983     IWineD3DResourceClass     resource;
984     IWineD3DBaseTextureClass  baseTexture;
985
986     /* IWineD3DCubeTexture */
987     IWineD3DSurface          *surfaces[6][MAX_LEVELS];
988
989     UINT                      edgeLength;
990 } IWineD3DCubeTextureImpl;
991
992 extern const IWineD3DCubeTextureVtbl IWineD3DCubeTexture_Vtbl;
993
994 typedef struct _WINED3DVOLUMET_DESC
995 {
996     UINT                    Width;
997     UINT                    Height;
998     UINT                    Depth;
999 } WINED3DVOLUMET_DESC;
1000
1001 /*****************************************************************************
1002  * IWineD3DVolume implementation structure (extends IUnknown)
1003  */
1004 typedef struct IWineD3DVolumeImpl
1005 {
1006     /* IUnknown & WineD3DResource fields */
1007     const IWineD3DVolumeVtbl  *lpVtbl;
1008     IWineD3DResourceClass      resource;
1009
1010     /* WineD3DVolume Information */
1011     WINED3DVOLUMET_DESC      currentDesc;
1012     IWineD3DBase            *container;
1013     UINT                    bytesPerPixel;
1014
1015     BOOL                    lockable;
1016     BOOL                    locked;
1017     WINED3DBOX              lockedBox;
1018     WINED3DBOX              dirtyBox;
1019     BOOL                    dirty;
1020
1021
1022 } IWineD3DVolumeImpl;
1023
1024 extern const IWineD3DVolumeVtbl IWineD3DVolume_Vtbl;
1025
1026 /*****************************************************************************
1027  * IWineD3DVolumeTexture implementation structure (extends IWineD3DBaseTextureImpl)
1028  */
1029 typedef struct IWineD3DVolumeTextureImpl
1030 {
1031     /* IUnknown & WineD3DResource/WineD3DBaseTexture Information     */
1032     const IWineD3DVolumeTextureVtbl *lpVtbl;
1033     IWineD3DResourceClass     resource;
1034     IWineD3DBaseTextureClass  baseTexture;
1035
1036     /* IWineD3DVolumeTexture */
1037     IWineD3DVolume           *volumes[MAX_LEVELS];
1038
1039     UINT                      width;
1040     UINT                      height;
1041     UINT                      depth;
1042 } IWineD3DVolumeTextureImpl;
1043
1044 extern const IWineD3DVolumeTextureVtbl IWineD3DVolumeTexture_Vtbl;
1045
1046 typedef struct _WINED3DSURFACET_DESC
1047 {
1048     WINED3DMULTISAMPLE_TYPE MultiSampleType;
1049     DWORD                   MultiSampleQuality;
1050     UINT                    Width;
1051     UINT                    Height;
1052 } WINED3DSURFACET_DESC;
1053
1054 /*****************************************************************************
1055  * Structure for DIB Surfaces (GetDC and GDI surfaces)
1056  */
1057 typedef struct wineD3DSurface_DIB {
1058     HBITMAP DIBsection;
1059     void* bitmap_data;
1060     UINT bitmap_size;
1061     HGDIOBJ holdbitmap;
1062     BOOL client_memory;
1063 } wineD3DSurface_DIB;
1064
1065 typedef struct {
1066     struct list entry;
1067     GLuint id;
1068     UINT width;
1069     UINT height;
1070 } renderbuffer_entry_t;
1071
1072 /*****************************************************************************
1073  * IWineD3DClipp implementation structure
1074  */
1075 typedef struct IWineD3DClipperImpl
1076 {
1077     const IWineD3DClipperVtbl *lpVtbl;
1078     LONG ref;
1079
1080     IUnknown *Parent;
1081     HWND hWnd;
1082 } IWineD3DClipperImpl;
1083
1084
1085 /*****************************************************************************
1086  * IWineD3DSurface implementation structure
1087  */
1088 struct IWineD3DSurfaceImpl
1089 {
1090     /* IUnknown & IWineD3DResource Information     */
1091     const IWineD3DSurfaceVtbl *lpVtbl;
1092     IWineD3DResourceClass     resource;
1093
1094     /* IWineD3DSurface fields */
1095     IWineD3DBase              *container;
1096     WINED3DSURFACET_DESC      currentDesc;
1097     IWineD3DPaletteImpl       *palette; /* D3D7 style palette handling */
1098     PALETTEENTRY              *palette9; /* D3D8/9 style palette handling */
1099
1100     UINT                      bytesPerPixel;
1101
1102     /* TODO: move this off into a management class(maybe!) */
1103     DWORD                      Flags;
1104
1105     UINT                      pow2Width;
1106     UINT                      pow2Height;
1107
1108     /* A method to retrieve the drawable size. Not in the Vtable to make it changeable */
1109     void (*get_drawable_size)(IWineD3DSurfaceImpl *This, UINT *width, UINT *height);
1110
1111     /* Oversized texture */
1112     RECT                      glRect;
1113
1114     /* PBO */
1115     GLuint                    pbo;
1116
1117     RECT                      lockedRect;
1118     RECT                      dirtyRect;
1119     int                       lockCount;
1120 #define MAXLOCKCOUNT          50 /* After this amount of locks do not free the sysmem copy */
1121
1122     glDescriptor              glDescription;
1123     BOOL                      srgb;
1124
1125     /* For GetDC */
1126     wineD3DSurface_DIB        dib;
1127     HDC                       hDC;
1128
1129     /* Color keys for DDraw */
1130     WINEDDCOLORKEY            DestBltCKey;
1131     WINEDDCOLORKEY            DestOverlayCKey;
1132     WINEDDCOLORKEY            SrcOverlayCKey;
1133     WINEDDCOLORKEY            SrcBltCKey;
1134     DWORD                     CKeyFlags;
1135
1136     WINEDDCOLORKEY            glCKey;
1137
1138     struct list               renderbuffers;
1139     renderbuffer_entry_t      *current_renderbuffer;
1140
1141     /* DirectDraw clippers */
1142     IWineD3DClipper           *clipper;
1143 };
1144
1145 extern const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl;
1146 extern const IWineD3DSurfaceVtbl IWineGDISurface_Vtbl;
1147
1148 /* Predeclare the shared Surface functions */
1149 HRESULT WINAPI IWineD3DBaseSurfaceImpl_QueryInterface(IWineD3DSurface *iface, REFIID riid, LPVOID *ppobj);
1150 ULONG WINAPI IWineD3DBaseSurfaceImpl_AddRef(IWineD3DSurface *iface);
1151 HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetParent(IWineD3DSurface *iface, IUnknown **pParent);
1152 HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetDevice(IWineD3DSurface *iface, IWineD3DDevice** ppDevice);
1153 HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetPrivateData(IWineD3DSurface *iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags);
1154 HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetPrivateData(IWineD3DSurface *iface, REFGUID refguid, void* pData, DWORD* pSizeOfData);
1155 HRESULT WINAPI IWineD3DBaseSurfaceImpl_FreePrivateData(IWineD3DSurface *iface, REFGUID refguid);
1156 DWORD   WINAPI IWineD3DBaseSurfaceImpl_SetPriority(IWineD3DSurface *iface, DWORD PriorityNew);
1157 DWORD   WINAPI IWineD3DBaseSurfaceImpl_GetPriority(IWineD3DSurface *iface);
1158 WINED3DRESOURCETYPE WINAPI IWineD3DBaseSurfaceImpl_GetType(IWineD3DSurface *iface);
1159 HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetContainer(IWineD3DSurface* iface, REFIID riid, void** ppContainer);
1160 HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetDesc(IWineD3DSurface *iface, WINED3DSURFACE_DESC *pDesc);
1161 HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetBltStatus(IWineD3DSurface *iface, DWORD Flags);
1162 HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetFlipStatus(IWineD3DSurface *iface, DWORD Flags);
1163 HRESULT WINAPI IWineD3DBaseSurfaceImpl_IsLost(IWineD3DSurface *iface);
1164 HRESULT WINAPI IWineD3DBaseSurfaceImpl_Restore(IWineD3DSurface *iface);
1165 HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetPalette(IWineD3DSurface *iface, IWineD3DPalette **Pal);
1166 HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetPalette(IWineD3DSurface *iface, IWineD3DPalette *Pal);
1167 HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetColorKey(IWineD3DSurface *iface, DWORD Flags, WINEDDCOLORKEY *CKey);
1168 HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetContainer(IWineD3DSurface *iface, IWineD3DBase *container);
1169 DWORD WINAPI IWineD3DBaseSurfaceImpl_GetPitch(IWineD3DSurface *iface);
1170 HRESULT WINAPI IWineD3DBaseSurfaceImpl_RealizePalette(IWineD3DSurface *iface);
1171 HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetOverlayPosition(IWineD3DSurface *iface, LONG X, LONG Y);
1172 HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetOverlayPosition(IWineD3DSurface *iface, LONG *X, LONG *Y);
1173 HRESULT WINAPI IWineD3DBaseSurfaceImpl_UpdateOverlayZOrder(IWineD3DSurface *iface, DWORD Flags, IWineD3DSurface *Ref);
1174 HRESULT WINAPI IWineD3DBaseSurfaceImpl_UpdateOverlay(IWineD3DSurface *iface, RECT *SrcRect, IWineD3DSurface *DstSurface, RECT *DstRect, DWORD Flags, WINEDDOVERLAYFX *FX);
1175 HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetClipper(IWineD3DSurface *iface, IWineD3DClipper *clipper);
1176 HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetClipper(IWineD3DSurface *iface, IWineD3DClipper **clipper);
1177 HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3DFORMAT format);
1178 HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface);
1179 HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, RECT *DestRect, IWineD3DSurface *SrcSurface, RECT *SrcRect, DWORD Flags, WINEDDBLTFX *DDBltFx, WINED3DTEXTUREFILTERTYPE Filter);
1180 HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dstx, DWORD dsty, IWineD3DSurface *Source, RECT *rsrc, DWORD trans);
1181 HRESULT WINAPI IWineD3DBaseSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags);
1182 void WINAPI IWineD3DBaseSurfaceImpl_BindTexture(IWineD3DSurface *iface);
1183
1184 const void *WINAPI IWineD3DSurfaceImpl_GetData(IWineD3DSurface *iface);
1185
1186 void get_drawable_size_swapchain(IWineD3DSurfaceImpl *This, UINT *width, UINT *height);
1187 void get_drawable_size_backbuffer(IWineD3DSurfaceImpl *This, UINT *width, UINT *height);
1188 void get_drawable_size_pbuffer(IWineD3DSurfaceImpl *This, UINT *width, UINT *height);
1189 void get_drawable_size_fbo(IWineD3DSurfaceImpl *This, UINT *width, UINT *height);
1190
1191 /* Surface flags: */
1192 #define SFLAG_OVERSIZE    0x00000001 /* Surface is bigger than gl size, blts only */
1193 #define SFLAG_CONVERTED   0x00000002 /* Converted for color keying or Palettized */
1194 #define SFLAG_DIBSECTION  0x00000004 /* Has a DIB section attached for getdc */
1195 #define SFLAG_LOCKABLE    0x00000008 /* Surface can be locked */
1196 #define SFLAG_DISCARD     0x00000010 /* ??? */
1197 #define SFLAG_LOCKED      0x00000020 /* Surface is locked atm */
1198 #define SFLAG_INTEXTURE   0x00000040 /* The GL texture contains the newest surface content */
1199 #define SFLAG_INDRAWABLE  0x00000080 /* The gl drawable contains the most up to date data */
1200 #define SFLAG_INSYSMEM    0x00000100 /* The system memory copy is most up to date */
1201 #define SFLAG_NONPOW2     0x00000200 /* Surface sizes are not a power of 2 */
1202 #define SFLAG_DYNLOCK     0x00000400 /* Surface is often locked by the app */
1203 #define SFLAG_DYNCHANGE   0x00000C00 /* Surface contents are changed very often, implies DYNLOCK */
1204 #define SFLAG_DCINUSE     0x00001000 /* Set between GetDC and ReleaseDC calls */
1205 #define SFLAG_LOST        0x00002000 /* Surface lost flag for DDraw */
1206 #define SFLAG_USERPTR     0x00004000 /* The application allocated the memory for this surface */
1207 #define SFLAG_GLCKEY      0x00008000 /* The gl texture was created with a color key */
1208 #define SFLAG_CLIENT      0x00010000 /* GL_APPLE_client_storage is used on that texture */
1209 #define SFLAG_ALLOCATED   0x00020000 /* A gl texture is allocated for this surface */
1210 #define SFLAG_PBO         0x00040000 /* Has a PBO attached for speeding up data transfers for dynamically locked surfaces */
1211
1212 /* In some conditions the surface memory must not be freed:
1213  * SFLAG_OVERSIZE: Not all data can be kept in GL
1214  * SFLAG_CONVERTED: Converting the data back would take too long
1215  * SFLAG_DIBSECTION: The dib code manages the memory
1216  * SFLAG_LOCKED: The app requires access to the surface data
1217  * SFLAG_DYNLOCK: Avoid freeing the data for performance
1218  * SFLAG_DYNCHANGE: Same reason as DYNLOCK
1219  * SFLAG_PBO: PBOs don't use 'normal' memory. It is either allocated by the driver or must be NULL.
1220  * SFLAG_CLIENT: OpenGL uses our memory as backup
1221  */
1222 #define SFLAG_DONOTFREE  (SFLAG_OVERSIZE   | \
1223                           SFLAG_CONVERTED  | \
1224                           SFLAG_DIBSECTION | \
1225                           SFLAG_LOCKED     | \
1226                           SFLAG_DYNLOCK    | \
1227                           SFLAG_DYNCHANGE  | \
1228                           SFLAG_USERPTR    | \
1229                           SFLAG_PBO        | \
1230                           SFLAG_CLIENT)
1231
1232 #define SFLAG_LOCATIONS  (SFLAG_INSYSMEM   | \
1233                           SFLAG_INTEXTURE  | \
1234                           SFLAG_INDRAWABLE)
1235 BOOL CalculateTexRect(IWineD3DSurfaceImpl *This, RECT *Rect, float glTexCoord[4]);
1236
1237 typedef enum {
1238     NO_CONVERSION,
1239     CONVERT_PALETTED,
1240     CONVERT_PALETTED_CK,
1241     CONVERT_CK_565,
1242     CONVERT_CK_5551,
1243     CONVERT_CK_4444,
1244     CONVERT_CK_4444_ARGB,
1245     CONVERT_CK_1555,
1246     CONVERT_555,
1247     CONVERT_CK_RGB24,
1248     CONVERT_CK_8888,
1249     CONVERT_CK_8888_ARGB,
1250     CONVERT_RGB32_888,
1251     CONVERT_V8U8,
1252     CONVERT_L6V5U5,
1253     CONVERT_X8L8V8U8,
1254     CONVERT_Q8W8V8U8,
1255     CONVERT_V16U16,
1256     CONVERT_A4L4,
1257     CONVERT_R32F,
1258     CONVERT_R16F,
1259     CONVERT_G16R16,
1260 } CONVERT_TYPES;
1261
1262 HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_texturing, GLenum *format, GLenum *internal, GLenum *type, CONVERT_TYPES *convert, int *target_bpp, BOOL srgb_mode);
1263
1264 /*****************************************************************************
1265  * IWineD3DVertexDeclaration implementation structure
1266  */
1267 typedef struct attrib_declaration {
1268     DWORD usage;
1269     DWORD idx;
1270 } attrib_declaration;
1271
1272 #define MAX_ATTRIBS 16
1273
1274 typedef struct IWineD3DVertexDeclarationImpl {
1275     /* IUnknown  Information */
1276     const IWineD3DVertexDeclarationVtbl *lpVtbl;
1277     LONG                    ref;
1278
1279     IUnknown                *parent;
1280     IWineD3DDeviceImpl      *wineD3DDevice;
1281
1282     WINED3DVERTEXELEMENT    *pDeclarationWine;
1283     UINT                    declarationWNumElements;
1284
1285     DWORD                   streams[MAX_STREAMS];
1286     UINT                    num_streams;
1287     BOOL                    position_transformed;
1288     BOOL                    half_float_conv_needed;
1289
1290     /* Ordered array of declaration types that need swizzling in a vshader */
1291     attrib_declaration      swizzled_attribs[MAX_ATTRIBS];
1292     UINT                    num_swizzled_attribs;
1293 } IWineD3DVertexDeclarationImpl;
1294
1295 extern const IWineD3DVertexDeclarationVtbl IWineD3DVertexDeclaration_Vtbl;
1296
1297 /*****************************************************************************
1298  * IWineD3DStateBlock implementation structure
1299  */
1300
1301 /* Internal state Block for Begin/End/Capture/Create/Apply info  */
1302 /*   Note: Very long winded but gl Lists are not flexible enough */
1303 /*   to resolve everything we need, so doing it manually for now */
1304 typedef struct SAVEDSTATES {
1305         BOOL                      indices;
1306         BOOL                      material;
1307         BOOL                      fvf;
1308         BOOL                      streamSource[MAX_STREAMS];
1309         BOOL                      streamFreq[MAX_STREAMS];
1310         BOOL                      textures[MAX_COMBINED_SAMPLERS];
1311         BOOL                      transform[HIGHEST_TRANSFORMSTATE + 1];
1312         BOOL                      viewport;
1313         BOOL                      renderState[WINEHIGHEST_RENDER_STATE + 1];
1314         BOOL                      textureState[MAX_TEXTURES][WINED3D_HIGHEST_TEXTURE_STATE + 1];
1315         BOOL                      samplerState[MAX_COMBINED_SAMPLERS][WINED3D_HIGHEST_SAMPLER_STATE + 1];
1316         BOOL                      clipplane[MAX_CLIPPLANES];
1317         BOOL                      vertexDecl;
1318         BOOL                      pixelShader;
1319         BOOL                      pixelShaderConstantsB[MAX_CONST_B];
1320         BOOL                      pixelShaderConstantsI[MAX_CONST_I];
1321         BOOL                     *pixelShaderConstantsF;
1322         BOOL                      vertexShader;
1323         BOOL                      vertexShaderConstantsB[MAX_CONST_B];
1324         BOOL                      vertexShaderConstantsI[MAX_CONST_I];
1325         BOOL                     *vertexShaderConstantsF;
1326         BOOL                      scissorRect;
1327 } SAVEDSTATES;
1328
1329 typedef struct {
1330     struct  list entry;
1331     DWORD   count;
1332     DWORD   idx[13];
1333 } constants_entry;
1334
1335 struct StageState {
1336     DWORD stage;
1337     DWORD state;
1338 };
1339
1340 struct IWineD3DStateBlockImpl
1341 {
1342     /* IUnknown fields */
1343     const IWineD3DStateBlockVtbl *lpVtbl;
1344     LONG                      ref;     /* Note: Ref counting not required */
1345
1346     /* IWineD3DStateBlock information */
1347     IUnknown                 *parent;
1348     IWineD3DDeviceImpl       *wineD3DDevice;
1349     WINED3DSTATEBLOCKTYPE     blockType;
1350
1351     /* Array indicating whether things have been set or changed */
1352     SAVEDSTATES               changed;
1353     struct list               set_vconstantsF;
1354     struct list               set_pconstantsF;
1355
1356     /* Drawing - Vertex Shader or FVF related */
1357     DWORD                     fvf;
1358     /* Vertex Shader Declaration */
1359     IWineD3DVertexDeclaration *vertexDecl;
1360
1361     IWineD3DVertexShader      *vertexShader;
1362
1363     /* Vertex Shader Constants */
1364     BOOL                       vertexShaderConstantB[MAX_CONST_B];
1365     INT                        vertexShaderConstantI[MAX_CONST_I * 4];
1366     float                     *vertexShaderConstantF;
1367
1368     /* Stream Source */
1369     BOOL                      streamIsUP;
1370     UINT                      streamStride[MAX_STREAMS];
1371     UINT                      streamOffset[MAX_STREAMS + 1 /* tesselated pseudo-stream */ ];
1372     IWineD3DVertexBuffer     *streamSource[MAX_STREAMS];
1373     UINT                      streamFreq[MAX_STREAMS + 1];
1374     UINT                      streamFlags[MAX_STREAMS + 1];     /*0 | WINED3DSTREAMSOURCE_INSTANCEDATA | WINED3DSTREAMSOURCE_INDEXEDDATA  */
1375
1376     /* Indices */
1377     IWineD3DIndexBuffer*      pIndexData;
1378     INT                       baseVertexIndex;
1379     INT                       loadBaseVertexIndex; /* non-indexed drawing needs 0 here, indexed baseVertexIndex */
1380
1381     /* Transform */
1382     WINED3DMATRIX             transforms[HIGHEST_TRANSFORMSTATE + 1];
1383
1384     /* Light hashmap . Collisions are handled using standard wine double linked lists */
1385 #define LIGHTMAP_SIZE 43 /* Use of a prime number recommended. Set to 1 for a linked list! */
1386 #define LIGHTMAP_HASHFUNC(x) ((x) % LIGHTMAP_SIZE) /* Primitive and simple function */
1387     struct list               lightMap[LIGHTMAP_SIZE]; /* Mashmap containing the lights */
1388     PLIGHTINFOEL             *activeLights[MAX_ACTIVE_LIGHTS]; /* Map of opengl lights to d3d lights */
1389
1390     /* Clipping */
1391     double                    clipplane[MAX_CLIPPLANES][4];
1392     WINED3DCLIPSTATUS         clip_status;
1393
1394     /* ViewPort */
1395     WINED3DVIEWPORT           viewport;
1396
1397     /* Material */
1398     WINED3DMATERIAL           material;
1399
1400     /* Pixel Shader */
1401     IWineD3DPixelShader      *pixelShader;
1402
1403     /* Pixel Shader Constants */
1404     BOOL                       pixelShaderConstantB[MAX_CONST_B];
1405     INT                        pixelShaderConstantI[MAX_CONST_I * 4];
1406     float                     *pixelShaderConstantF;
1407
1408     /* RenderState */
1409     DWORD                     renderState[WINEHIGHEST_RENDER_STATE + 1];
1410
1411     /* Texture */
1412     IWineD3DBaseTexture      *textures[MAX_COMBINED_SAMPLERS];
1413     int                       textureDimensions[MAX_COMBINED_SAMPLERS];
1414
1415     /* Texture State Stage */
1416     DWORD                     textureState[MAX_TEXTURES][WINED3D_HIGHEST_TEXTURE_STATE + 1];
1417     DWORD                     lowest_disabled_stage;
1418     /* Sampler States */
1419     DWORD                     samplerState[MAX_COMBINED_SAMPLERS][WINED3D_HIGHEST_SAMPLER_STATE + 1];
1420
1421     /* Current GLSL Shader Program */
1422     struct glsl_shader_prog_link *glsl_program;
1423
1424     /* Scissor test rectangle */
1425     RECT                      scissorRect;
1426
1427     /* Contained state management */
1428     DWORD                     contained_render_states[WINEHIGHEST_RENDER_STATE + 1];
1429     unsigned int              num_contained_render_states;
1430     DWORD                     contained_transform_states[HIGHEST_TRANSFORMSTATE + 1];
1431     unsigned int              num_contained_transform_states;
1432     DWORD                     contained_vs_consts_i[MAX_CONST_I];
1433     unsigned int              num_contained_vs_consts_i;
1434     DWORD                     contained_vs_consts_b[MAX_CONST_B];
1435     unsigned int              num_contained_vs_consts_b;
1436     DWORD                     *contained_vs_consts_f;
1437     unsigned int              num_contained_vs_consts_f;
1438     DWORD                     contained_ps_consts_i[MAX_CONST_I];
1439     unsigned int              num_contained_ps_consts_i;
1440     DWORD                     contained_ps_consts_b[MAX_CONST_B];
1441     unsigned int              num_contained_ps_consts_b;
1442     DWORD                     *contained_ps_consts_f;
1443     unsigned int              num_contained_ps_consts_f;
1444     struct StageState         contained_tss_states[MAX_TEXTURES * (WINED3D_HIGHEST_TEXTURE_STATE)];
1445     unsigned int              num_contained_tss_states;
1446     struct StageState         contained_sampler_states[MAX_COMBINED_SAMPLERS * WINED3D_HIGHEST_SAMPLER_STATE];
1447     unsigned int              num_contained_sampler_states;
1448 };
1449
1450 extern void stateblock_savedstates_set(
1451     IWineD3DStateBlock* iface,
1452     SAVEDSTATES* states,
1453     BOOL value);
1454
1455 extern void stateblock_savedstates_copy(
1456     IWineD3DStateBlock* iface,
1457     SAVEDSTATES* dest,
1458     SAVEDSTATES* source);
1459
1460 extern void stateblock_copy(
1461     IWineD3DStateBlock* destination,
1462     IWineD3DStateBlock* source);
1463
1464 extern const IWineD3DStateBlockVtbl IWineD3DStateBlock_Vtbl;
1465
1466 /* Direct3D terminology with little modifications. We do not have an issued state
1467  * because only the driver knows about it, but we have a created state because d3d
1468  * allows GetData on a created issue, but opengl doesn't
1469  */
1470 enum query_state {
1471     QUERY_CREATED,
1472     QUERY_SIGNALLED,
1473     QUERY_BUILDING
1474 };
1475 /*****************************************************************************
1476  * IWineD3DQueryImpl implementation structure (extends IUnknown)
1477  */
1478 typedef struct IWineD3DQueryImpl
1479 {
1480     const IWineD3DQueryVtbl  *lpVtbl;
1481     LONG                      ref;     /* Note: Ref counting not required */
1482     
1483     IUnknown                 *parent;
1484     /*TODO: replace with iface usage */
1485 #if 0
1486     IWineD3DDevice         *wineD3DDevice;
1487 #else
1488     IWineD3DDeviceImpl       *wineD3DDevice;
1489 #endif
1490
1491     /* IWineD3DQuery fields */
1492     enum query_state         state;
1493     WINED3DQUERYTYPE         type;
1494     /* TODO: Think about using a IUnknown instead of a void* */
1495     void                     *extendedData;
1496     
1497   
1498 } IWineD3DQueryImpl;
1499
1500 extern const IWineD3DQueryVtbl IWineD3DQuery_Vtbl;
1501
1502 /* Datastructures for IWineD3DQueryImpl.extendedData */
1503 typedef struct  WineQueryOcclusionData {
1504     GLuint  queryId;
1505     WineD3DContext *ctx;
1506 } WineQueryOcclusionData;
1507
1508 typedef struct  WineQueryEventData {
1509     GLuint  fenceId;
1510     WineD3DContext *ctx;
1511 } WineQueryEventData;
1512
1513 /*****************************************************************************
1514  * IWineD3DSwapChainImpl implementation structure (extends IUnknown)
1515  */
1516
1517 typedef struct IWineD3DSwapChainImpl
1518 {
1519     /*IUnknown part*/
1520     const IWineD3DSwapChainVtbl *lpVtbl;
1521     LONG                      ref;     /* Note: Ref counting not required */
1522
1523     IUnknown                 *parent;
1524     IWineD3DDeviceImpl       *wineD3DDevice;
1525
1526     /* IWineD3DSwapChain fields */
1527     IWineD3DSurface         **backBuffer;
1528     IWineD3DSurface          *frontBuffer;
1529     BOOL                      wantsDepthStencilBuffer;
1530     WINED3DPRESENT_PARAMETERS presentParms;
1531     DWORD                     orig_width, orig_height;
1532     WINED3DFORMAT             orig_fmt;
1533
1534     long prev_time, frames;   /* Performance tracking */
1535     unsigned int vSyncCounter;
1536
1537     WineD3DContext        **context; /* Later a array for multithreading */
1538     unsigned int            num_contexts;
1539
1540     HWND                    win_handle;
1541 } IWineD3DSwapChainImpl;
1542
1543 extern const IWineD3DSwapChainVtbl IWineD3DSwapChain_Vtbl;
1544
1545 WineD3DContext *IWineD3DSwapChainImpl_CreateContextForThread(IWineD3DSwapChain *iface);
1546
1547 /*****************************************************************************
1548  * Utility function prototypes 
1549  */
1550
1551 /* Trace routines */
1552 const char* debug_d3dformat(WINED3DFORMAT fmt);
1553 const char* debug_d3ddevicetype(WINED3DDEVTYPE devtype);
1554 const char* debug_d3dresourcetype(WINED3DRESOURCETYPE res);
1555 const char* debug_d3dusage(DWORD usage);
1556 const char* debug_d3dusagequery(DWORD usagequery);
1557 const char* debug_d3ddeclmethod(WINED3DDECLMETHOD method);
1558 const char* debug_d3ddecltype(WINED3DDECLTYPE type);
1559 const char* debug_d3ddeclusage(BYTE usage);
1560 const char* debug_d3dprimitivetype(WINED3DPRIMITIVETYPE PrimitiveType);
1561 const char* debug_d3drenderstate(DWORD state);
1562 const char* debug_d3dsamplerstate(DWORD state);
1563 const char* debug_d3dtexturefiltertype(WINED3DTEXTUREFILTERTYPE filter_type);
1564 const char* debug_d3dtexturestate(DWORD state);
1565 const char* debug_d3dtstype(WINED3DTRANSFORMSTATETYPE tstype);
1566 const char* debug_d3dpool(WINED3DPOOL pool);
1567 const char *debug_fbostatus(GLenum status);
1568 const char *debug_glerror(GLenum error);
1569 const char *debug_d3dbasis(WINED3DBASISTYPE basis);
1570 const char *debug_d3ddegree(WINED3DDEGREETYPE order);
1571
1572 /* Routines for GL <-> D3D values */
1573 GLenum StencilOp(DWORD op);
1574 GLenum CompareFunc(DWORD func);
1575 void   set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3);
1576 void   set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, INT texture_idx);
1577 void   set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords, BOOL transformed, DWORD coordtype);
1578
1579 void surface_set_compatible_renderbuffer(IWineD3DSurface *iface, unsigned int width, unsigned int height);
1580 GLenum surface_get_gl_buffer(IWineD3DSurface *iface, IWineD3DSwapChain *swapchain);
1581
1582 BOOL getColorBits(WINED3DFORMAT fmt, short *redSize, short *greenSize, short *blueSize, short *alphaSize, short *totalSize);
1583 BOOL getDepthStencilBits(WINED3DFORMAT fmt, short *depthSize, short *stencilSize);
1584
1585 /* Math utils */
1586 void multiply_matrix(WINED3DMATRIX *dest, const WINED3DMATRIX *src1, const WINED3DMATRIX *src2);
1587 unsigned int count_bits(unsigned int mask);
1588
1589 /*****************************************************************************
1590  * To enable calling of inherited functions, requires prototypes 
1591  *
1592  * Note: Only require classes which are subclassed, ie resource, basetexture, 
1593  */
1594     /*** IUnknown methods ***/
1595     extern HRESULT WINAPI IWineD3DResourceImpl_QueryInterface(IWineD3DResource *iface, REFIID riid, void** ppvObject);
1596     extern ULONG WINAPI IWineD3DResourceImpl_AddRef(IWineD3DResource *iface);
1597     extern ULONG WINAPI IWineD3DResourceImpl_Release(IWineD3DResource *iface);
1598     /*** IWineD3DResource methods ***/
1599     extern HRESULT WINAPI IWineD3DResourceImpl_GetParent(IWineD3DResource *iface, IUnknown **pParent);
1600     extern HRESULT WINAPI IWineD3DResourceImpl_GetDevice(IWineD3DResource *iface, IWineD3DDevice ** ppDevice);
1601     extern HRESULT WINAPI IWineD3DResourceImpl_SetPrivateData(IWineD3DResource *iface, REFGUID  refguid, CONST void * pData, DWORD  SizeOfData, DWORD  Flags);
1602     extern HRESULT WINAPI IWineD3DResourceImpl_GetPrivateData(IWineD3DResource *iface, REFGUID  refguid, void * pData, DWORD * pSizeOfData);
1603     extern HRESULT WINAPI IWineD3DResourceImpl_FreePrivateData(IWineD3DResource *iface, REFGUID  refguid);
1604     extern DWORD WINAPI IWineD3DResourceImpl_SetPriority(IWineD3DResource *iface, DWORD  PriorityNew);
1605     extern DWORD WINAPI IWineD3DResourceImpl_GetPriority(IWineD3DResource *iface);
1606     extern void WINAPI IWineD3DResourceImpl_PreLoad(IWineD3DResource *iface);
1607     extern void WINAPI IWineD3DResourceImpl_UnLoad(IWineD3DResource *iface);
1608     extern WINED3DRESOURCETYPE WINAPI IWineD3DResourceImpl_GetType(IWineD3DResource *iface);
1609     /*** class static members ***/
1610     void IWineD3DResourceImpl_CleanUp(IWineD3DResource *iface);
1611
1612     /*** IUnknown methods ***/
1613     extern HRESULT WINAPI IWineD3DBaseTextureImpl_QueryInterface(IWineD3DBaseTexture *iface, REFIID riid, void** ppvObject);
1614     extern ULONG WINAPI IWineD3DBaseTextureImpl_AddRef(IWineD3DBaseTexture *iface);
1615     extern ULONG WINAPI IWineD3DBaseTextureImpl_Release(IWineD3DBaseTexture *iface);
1616     /*** IWineD3DResource methods ***/
1617     extern HRESULT WINAPI IWineD3DBaseTextureImpl_GetParent(IWineD3DBaseTexture *iface, IUnknown **pParent);
1618     extern HRESULT WINAPI IWineD3DBaseTextureImpl_GetDevice(IWineD3DBaseTexture *iface, IWineD3DDevice ** ppDevice);
1619     extern HRESULT WINAPI IWineD3DBaseTextureImpl_SetPrivateData(IWineD3DBaseTexture *iface, REFGUID  refguid, CONST void * pData, DWORD  SizeOfData, DWORD  Flags);
1620     extern HRESULT WINAPI IWineD3DBaseTextureImpl_GetPrivateData(IWineD3DBaseTexture *iface, REFGUID  refguid, void * pData, DWORD * pSizeOfData);
1621     extern HRESULT WINAPI IWineD3DBaseTextureImpl_FreePrivateData(IWineD3DBaseTexture *iface, REFGUID  refguid);
1622     extern DWORD WINAPI IWineD3DBaseTextureImpl_SetPriority(IWineD3DBaseTexture *iface, DWORD  PriorityNew);
1623     extern DWORD WINAPI IWineD3DBaseTextureImpl_GetPriority(IWineD3DBaseTexture *iface);
1624     extern void WINAPI IWineD3DBaseTextureImpl_PreLoad(IWineD3DBaseTexture *iface);
1625     extern WINED3DRESOURCETYPE WINAPI IWineD3DBaseTextureImpl_GetType(IWineD3DBaseTexture *iface);
1626     /*** IWineD3DBaseTexture methods ***/
1627     extern DWORD WINAPI IWineD3DBaseTextureImpl_SetLOD(IWineD3DBaseTexture *iface, DWORD LODNew);
1628     extern DWORD WINAPI IWineD3DBaseTextureImpl_GetLOD(IWineD3DBaseTexture *iface);
1629     extern DWORD WINAPI IWineD3DBaseTextureImpl_GetLevelCount(IWineD3DBaseTexture *iface);
1630     extern HRESULT WINAPI IWineD3DBaseTextureImpl_SetAutoGenFilterType(IWineD3DBaseTexture *iface, WINED3DTEXTUREFILTERTYPE FilterType);
1631     extern WINED3DTEXTUREFILTERTYPE WINAPI IWineD3DBaseTextureImpl_GetAutoGenFilterType(IWineD3DBaseTexture *iface);
1632     extern void WINAPI IWineD3DBaseTextureImpl_GenerateMipSubLevels(IWineD3DBaseTexture *iface);
1633     extern BOOL WINAPI IWineD3DBaseTextureImpl_SetDirty(IWineD3DBaseTexture *iface, BOOL);
1634     extern BOOL WINAPI IWineD3DBaseTextureImpl_GetDirty(IWineD3DBaseTexture *iface);
1635
1636     extern BYTE* WINAPI IWineD3DVertexBufferImpl_GetMemory(IWineD3DVertexBuffer* iface, DWORD iOffset, GLint *vbo);
1637     extern HRESULT WINAPI IWineD3DVertexBufferImpl_ReleaseMemory(IWineD3DVertexBuffer* iface);
1638     extern HRESULT WINAPI IWineD3DBaseTextureImpl_BindTexture(IWineD3DBaseTexture *iface);
1639     extern HRESULT WINAPI IWineD3DBaseTextureImpl_UnBindTexture(IWineD3DBaseTexture *iface);
1640     extern void WINAPI IWineD3DBaseTextureImpl_ApplyStateChanges(IWineD3DBaseTexture *iface, const DWORD textureStates[WINED3D_HIGHEST_TEXTURE_STATE + 1], const DWORD samplerStates[WINED3D_HIGHEST_SAMPLER_STATE + 1]);
1641     /*** class static members ***/
1642     void IWineD3DBaseTextureImpl_CleanUp(IWineD3DBaseTexture *iface);
1643
1644 typedef void (*SHADER_HANDLER) (struct SHADER_OPCODE_ARG*);
1645
1646 /* Struct to maintain a list of GLSL shader programs and their associated pixel and
1647  * vertex shaders.  A list of this type is maintained on the DeviceImpl, and is only
1648  * used if the user is using GLSL shaders. */
1649 struct glsl_shader_prog_link {
1650     struct list             vshader_entry;
1651     struct list             pshader_entry;
1652     GLhandleARB             programId;
1653     GLhandleARB             *vuniformF_locations;
1654     GLhandleARB             *puniformF_locations;
1655     GLhandleARB             vuniformI_locations[MAX_CONST_I];
1656     GLhandleARB             puniformI_locations[MAX_CONST_I];
1657     GLhandleARB             posFixup_location;
1658     GLhandleARB             bumpenvmat_location;
1659     GLhandleARB             luminancescale_location;
1660     GLhandleARB             luminanceoffset_location;
1661     GLhandleARB             srgb_comparison_location;
1662     GLhandleARB             srgb_mul_low_location;
1663     GLhandleARB             ycorrection_location;
1664     GLhandleARB             vshader;
1665     GLhandleARB             pshader;
1666 };
1667
1668 typedef struct {
1669     GLhandleARB vshader;
1670     GLhandleARB pshader;
1671 } glsl_program_key_t;
1672
1673 /* TODO: Make this dynamic, based on shader limits ? */
1674 #define MAX_REG_ADDR 1
1675 #define MAX_REG_TEMP 32
1676 #define MAX_REG_TEXCRD 8
1677 #define MAX_REG_INPUT 12
1678 #define MAX_REG_OUTPUT 12
1679 #define MAX_CONST_I 16
1680 #define MAX_CONST_B 16
1681
1682 /* FIXME: This needs to go up to 2048 for
1683  * Shader model 3 according to msdn (and for software shaders) */
1684 #define MAX_LABELS 16
1685
1686 typedef struct semantic {
1687     DWORD usage;
1688     DWORD reg;
1689 } semantic;
1690
1691 typedef struct local_constant {
1692     struct list entry;
1693     unsigned int idx;
1694     DWORD value[4];
1695 } local_constant;
1696
1697 typedef struct shader_reg_maps {
1698
1699     char texcoord[MAX_REG_TEXCRD];          /* pixel < 3.0 */
1700     char temporary[MAX_REG_TEMP];           /* pixel, vertex */
1701     char address[MAX_REG_ADDR];             /* vertex */
1702     char packed_input[MAX_REG_INPUT];       /* pshader >= 3.0 */
1703     char packed_output[MAX_REG_OUTPUT];     /* vertex >= 3.0 */
1704     char attributes[MAX_ATTRIBS];           /* vertex */
1705     char labels[MAX_LABELS];                /* pixel, vertex */
1706     DWORD texcoord_mask[MAX_REG_TEXCRD];    /* vertex < 3.0 */
1707
1708     /* Sampler usage tokens 
1709      * Use 0 as default (bit 31 is always 1 on a valid token) */
1710     DWORD samplers[max(MAX_FRAGMENT_SAMPLERS, MAX_VERTEX_SAMPLERS)];
1711     char bumpmat, luminanceparams;
1712     char usesnrm, vpos, usesdsy;
1713     char usesrelconstF;
1714
1715     /* Whether or not loops are used in this shader, and nesting depth */
1716     unsigned loop_depth;
1717
1718     /* Whether or not this shader uses fog */
1719     char fog;
1720
1721 } shader_reg_maps;
1722
1723 #define SHADER_PGMSIZE 65535
1724 typedef struct SHADER_BUFFER {
1725     char* buffer;
1726     unsigned int bsize;
1727     unsigned int lineNo;
1728     BOOL newline;
1729 } SHADER_BUFFER;
1730
1731 /* Undocumented opcode controls */
1732 #define INST_CONTROLS_SHIFT 16
1733 #define INST_CONTROLS_MASK 0x00ff0000
1734
1735 typedef enum COMPARISON_TYPE {
1736     COMPARISON_GT = 1,
1737     COMPARISON_EQ = 2,
1738     COMPARISON_GE = 3,
1739     COMPARISON_LT = 4,
1740     COMPARISON_NE = 5,
1741     COMPARISON_LE = 6
1742 } COMPARISON_TYPE;
1743
1744 typedef struct SHADER_OPCODE {
1745     unsigned int  opcode;
1746     const char*   name;
1747     const char*   glname;
1748     char          dst_token;
1749     CONST UINT    num_params;
1750     SHADER_HANDLER hw_fct;
1751     SHADER_HANDLER hw_glsl_fct;
1752     DWORD         min_version;
1753     DWORD         max_version;
1754 } SHADER_OPCODE;
1755
1756 typedef struct SHADER_OPCODE_ARG {
1757     IWineD3DBaseShader* shader;
1758     shader_reg_maps* reg_maps;
1759     CONST SHADER_OPCODE* opcode;
1760     DWORD opcode_token;
1761     DWORD dst;
1762     DWORD dst_addr;
1763     DWORD predicate;
1764     DWORD src[4];
1765     DWORD src_addr[4];
1766     SHADER_BUFFER* buffer;
1767 } SHADER_OPCODE_ARG;
1768
1769 typedef struct SHADER_LIMITS {
1770     unsigned int temporary;
1771     unsigned int texcoord;
1772     unsigned int sampler;
1773     unsigned int constant_int;
1774     unsigned int constant_float;
1775     unsigned int constant_bool;
1776     unsigned int address;
1777     unsigned int packed_output;
1778     unsigned int packed_input;
1779     unsigned int attributes;
1780     unsigned int label;
1781 } SHADER_LIMITS;
1782
1783 /** Keeps track of details for TEX_M#x# shader opcodes which need to 
1784     maintain state information between multiple codes */
1785 typedef struct SHADER_PARSE_STATE {
1786     unsigned int current_row;
1787     DWORD texcoord_w[2];
1788 } SHADER_PARSE_STATE;
1789
1790 #ifdef __GNUC__
1791 #define PRINTF_ATTR(fmt,args) __attribute__((format (printf,fmt,args)))
1792 #else
1793 #define PRINTF_ATTR(fmt,args)
1794 #endif
1795
1796 /* Base Shader utility functions. 
1797  * (may move callers into the same file in the future) */
1798 extern int shader_addline(
1799     SHADER_BUFFER* buffer,
1800     const char* fmt, ...) PRINTF_ATTR(2,3);
1801
1802 extern const SHADER_OPCODE* shader_get_opcode(
1803     IWineD3DBaseShader *iface, 
1804     const DWORD code);
1805
1806 void delete_glsl_program_entry(IWineD3DDevice *iface, struct glsl_shader_prog_link *entry);
1807
1808 /* Vertex shader utility functions */
1809 extern BOOL vshader_get_input(
1810     IWineD3DVertexShader* iface,
1811     BYTE usage_req, BYTE usage_idx_req,
1812     unsigned int* regnum);
1813
1814 extern BOOL vshader_input_is_color(
1815     IWineD3DVertexShader* iface,
1816     unsigned int regnum);
1817
1818 extern HRESULT allocate_shader_constants(IWineD3DStateBlockImpl* object);
1819
1820 /* ARB_[vertex/fragment]_program helper functions */
1821 extern void shader_arb_load_constants(
1822     IWineD3DDevice* device,
1823     char usePixelShader,
1824     char useVertexShader);
1825
1826 /* ARB shader program Prototypes */
1827 extern void shader_hw_def(SHADER_OPCODE_ARG *arg);
1828
1829 /* ARB pixel shader prototypes */
1830 extern void pshader_hw_bem(SHADER_OPCODE_ARG* arg);
1831 extern void pshader_hw_cnd(SHADER_OPCODE_ARG* arg);
1832 extern void pshader_hw_cmp(SHADER_OPCODE_ARG* arg);
1833 extern void pshader_hw_map2gl(SHADER_OPCODE_ARG* arg);
1834 extern void pshader_hw_tex(SHADER_OPCODE_ARG* arg);
1835 extern void pshader_hw_texcoord(SHADER_OPCODE_ARG* arg);
1836 extern void pshader_hw_texreg2ar(SHADER_OPCODE_ARG* arg);
1837 extern void pshader_hw_texreg2gb(SHADER_OPCODE_ARG* arg);
1838 extern void pshader_hw_texbem(SHADER_OPCODE_ARG* arg);
1839 extern void pshader_hw_texm3x2pad(SHADER_OPCODE_ARG* arg);
1840 extern void pshader_hw_texm3x2tex(SHADER_OPCODE_ARG* arg);
1841 extern void pshader_hw_texm3x3pad(SHADER_OPCODE_ARG* arg);
1842 extern void pshader_hw_texm3x3tex(SHADER_OPCODE_ARG* arg);
1843 extern void pshader_hw_texm3x3spec(SHADER_OPCODE_ARG* arg);
1844 extern void pshader_hw_texm3x3vspec(SHADER_OPCODE_ARG* arg);
1845 extern void pshader_hw_texdepth(SHADER_OPCODE_ARG* arg);
1846 extern void pshader_hw_texkill(SHADER_OPCODE_ARG* arg);
1847 extern void pshader_hw_texdp3tex(SHADER_OPCODE_ARG* arg);
1848 extern void pshader_hw_texdp3(SHADER_OPCODE_ARG* arg);
1849 extern void pshader_hw_texm3x3(SHADER_OPCODE_ARG* arg);
1850 extern void pshader_hw_texm3x2depth(SHADER_OPCODE_ARG* arg);
1851 extern void pshader_hw_dp2add(SHADER_OPCODE_ARG* arg);
1852 extern void pshader_hw_texreg2rgb(SHADER_OPCODE_ARG* arg);
1853
1854 /* ARB vertex / pixel shader common prototypes */
1855 extern void shader_hw_nrm(SHADER_OPCODE_ARG* arg);
1856 extern void shader_hw_sincos(SHADER_OPCODE_ARG* arg);
1857 extern void shader_hw_mnxn(SHADER_OPCODE_ARG* arg);
1858
1859 /* ARB vertex shader prototypes */
1860 extern void vshader_hw_map2gl(SHADER_OPCODE_ARG* arg);
1861 extern void vshader_hw_rsq_rcp(SHADER_OPCODE_ARG* arg);
1862
1863 /* GLSL helper functions */
1864 extern void shader_glsl_add_instruction_modifiers(SHADER_OPCODE_ARG *arg);
1865 extern void shader_glsl_load_constants(
1866     IWineD3DDevice* device,
1867     char usePixelShader,
1868     char useVertexShader);
1869
1870 /** The following translate DirectX pixel/vertex shader opcodes to GLSL lines */
1871 extern void shader_glsl_cross(SHADER_OPCODE_ARG* arg);
1872 extern void shader_glsl_map2gl(SHADER_OPCODE_ARG* arg);
1873 extern void shader_glsl_arith(SHADER_OPCODE_ARG* arg);
1874 extern void shader_glsl_mov(SHADER_OPCODE_ARG* arg);
1875 extern void shader_glsl_mad(SHADER_OPCODE_ARG* arg);
1876 extern void shader_glsl_mnxn(SHADER_OPCODE_ARG* arg);
1877 extern void shader_glsl_lrp(SHADER_OPCODE_ARG* arg);
1878 extern void shader_glsl_dot(SHADER_OPCODE_ARG* arg);
1879 extern void shader_glsl_rcp(SHADER_OPCODE_ARG* arg);
1880 extern void shader_glsl_rsq(SHADER_OPCODE_ARG* arg);
1881 extern void shader_glsl_cnd(SHADER_OPCODE_ARG* arg);
1882 extern void shader_glsl_compare(SHADER_OPCODE_ARG* arg);
1883 extern void shader_glsl_def(SHADER_OPCODE_ARG* arg);
1884 extern void shader_glsl_defi(SHADER_OPCODE_ARG* arg);
1885 extern void shader_glsl_defb(SHADER_OPCODE_ARG* arg);
1886 extern void shader_glsl_expp(SHADER_OPCODE_ARG* arg);
1887 extern void shader_glsl_cmp(SHADER_OPCODE_ARG* arg);
1888 extern void shader_glsl_lit(SHADER_OPCODE_ARG* arg);
1889 extern void shader_glsl_dst(SHADER_OPCODE_ARG* arg);
1890 extern void shader_glsl_sincos(SHADER_OPCODE_ARG* arg);
1891 extern void shader_glsl_loop(SHADER_OPCODE_ARG* arg);
1892 extern void shader_glsl_end(SHADER_OPCODE_ARG* arg);
1893 extern void shader_glsl_if(SHADER_OPCODE_ARG* arg);
1894 extern void shader_glsl_ifc(SHADER_OPCODE_ARG* arg);
1895 extern void shader_glsl_else(SHADER_OPCODE_ARG* arg);
1896 extern void shader_glsl_break(SHADER_OPCODE_ARG* arg);
1897 extern void shader_glsl_breakc(SHADER_OPCODE_ARG* arg);
1898 extern void shader_glsl_rep(SHADER_OPCODE_ARG* arg);
1899 extern void shader_glsl_call(SHADER_OPCODE_ARG* arg);
1900 extern void shader_glsl_callnz(SHADER_OPCODE_ARG* arg);
1901 extern void shader_glsl_label(SHADER_OPCODE_ARG* arg);
1902 extern void shader_glsl_pow(SHADER_OPCODE_ARG* arg);
1903 extern void shader_glsl_log(SHADER_OPCODE_ARG* arg);
1904 extern void shader_glsl_texldl(SHADER_OPCODE_ARG* arg);
1905
1906 /** GLSL Pixel Shader Prototypes */
1907 extern void pshader_glsl_tex(SHADER_OPCODE_ARG* arg);
1908 extern void pshader_glsl_texcoord(SHADER_OPCODE_ARG* arg);
1909 extern void pshader_glsl_texdp3tex(SHADER_OPCODE_ARG* arg);
1910 extern void pshader_glsl_texdp3(SHADER_OPCODE_ARG* arg);
1911 extern void pshader_glsl_texdepth(SHADER_OPCODE_ARG* arg);
1912 extern void pshader_glsl_texm3x2depth(SHADER_OPCODE_ARG* arg);
1913 extern void pshader_glsl_texm3x2pad(SHADER_OPCODE_ARG* arg);
1914 extern void pshader_glsl_texm3x2tex(SHADER_OPCODE_ARG* arg);
1915 extern void pshader_glsl_texm3x3(SHADER_OPCODE_ARG* arg);
1916 extern void pshader_glsl_texm3x3pad(SHADER_OPCODE_ARG* arg);
1917 extern void pshader_glsl_texm3x3tex(SHADER_OPCODE_ARG* arg);
1918 extern void pshader_glsl_texm3x3spec(SHADER_OPCODE_ARG* arg);
1919 extern void pshader_glsl_texm3x3vspec(SHADER_OPCODE_ARG* arg);
1920 extern void pshader_glsl_texkill(SHADER_OPCODE_ARG* arg);
1921 extern void pshader_glsl_texbem(SHADER_OPCODE_ARG* arg);
1922 extern void pshader_glsl_bem(SHADER_OPCODE_ARG* arg);
1923 extern void pshader_glsl_texreg2ar(SHADER_OPCODE_ARG* arg);
1924 extern void pshader_glsl_texreg2gb(SHADER_OPCODE_ARG* arg);
1925 extern void pshader_glsl_texreg2rgb(SHADER_OPCODE_ARG* arg);
1926 extern void pshader_glsl_dp2add(SHADER_OPCODE_ARG* arg);
1927 extern void pshader_glsl_input_pack(
1928    SHADER_BUFFER* buffer,
1929    semantic* semantics_out,
1930    IWineD3DPixelShader *iface);
1931
1932 /*****************************************************************************
1933  * IDirect3DBaseShader implementation structure
1934  */
1935 typedef struct IWineD3DBaseShaderClass
1936 {
1937     LONG                            ref;
1938     DWORD                           hex_version;
1939     SHADER_LIMITS                   limits;
1940     SHADER_PARSE_STATE              parse_state;
1941     CONST SHADER_OPCODE             *shader_ins;
1942     DWORD                          *function;
1943     UINT                            functionLength;
1944     GLuint                          prgId;
1945     BOOL                            is_compiled;
1946     UINT                            cur_loop_depth, cur_loop_regno;
1947     BOOL                            load_local_constsF;
1948
1949     /* Type of shader backend */
1950     int shader_mode;
1951
1952     /* Programs this shader is linked with */
1953     struct list linked_programs;
1954
1955     /* Immediate constants (override global ones) */
1956     struct list constantsB;
1957     struct list constantsF;
1958     struct list constantsI;
1959     shader_reg_maps reg_maps;
1960
1961     /* Pixel formats of sampled textures, for format conversion. This
1962      * represents the formats found during compilation, it is not initialized
1963      * on the first parser pass. It is needed to check if the shader
1964      * needs recompilation to adjust the format conversion
1965      */
1966     WINED3DFORMAT       sampled_format[MAX_COMBINED_SAMPLERS];
1967     UINT                sampled_samplers[MAX_COMBINED_SAMPLERS];
1968     UINT                num_sampled_samplers;
1969
1970     UINT recompile_count;
1971
1972     /* Pointer to the parent device */
1973     IWineD3DDevice *device;
1974     struct list     shader_list_entry;
1975
1976 } IWineD3DBaseShaderClass;
1977
1978 typedef struct IWineD3DBaseShaderImpl {
1979     /* IUnknown */
1980     const IWineD3DBaseShaderVtbl    *lpVtbl;
1981
1982     /* IWineD3DBaseShader */
1983     IWineD3DBaseShaderClass         baseShader;
1984 } IWineD3DBaseShaderImpl;
1985
1986 HRESULT  WINAPI IWineD3DBaseShaderImpl_QueryInterface(IWineD3DBaseShader *iface, REFIID riid, LPVOID *ppobj);
1987 ULONG  WINAPI IWineD3DBaseShaderImpl_AddRef(IWineD3DBaseShader *iface);
1988 ULONG  WINAPI IWineD3DBaseShaderImpl_Release(IWineD3DBaseShader *iface);
1989
1990 extern HRESULT shader_get_registers_used(
1991     IWineD3DBaseShader *iface,
1992     shader_reg_maps* reg_maps,
1993     semantic* semantics_in,
1994     semantic* semantics_out,
1995     CONST DWORD* pToken,
1996     IWineD3DStateBlockImpl *stateBlock);
1997
1998 extern void shader_generate_glsl_declarations(
1999     IWineD3DBaseShader *iface,
2000     shader_reg_maps* reg_maps,
2001     SHADER_BUFFER* buffer,
2002     WineD3D_GL_Info* gl_info);
2003
2004 extern void shader_generate_arb_declarations(
2005     IWineD3DBaseShader *iface,
2006     shader_reg_maps* reg_maps,
2007     SHADER_BUFFER* buffer,
2008     WineD3D_GL_Info* gl_info);
2009
2010 extern void shader_generate_main(
2011     IWineD3DBaseShader *iface,
2012     SHADER_BUFFER* buffer,
2013     shader_reg_maps* reg_maps,
2014     CONST DWORD* pFunction);
2015
2016 extern void shader_dump_ins_modifiers(
2017     const DWORD output);
2018
2019 extern void shader_dump_param(
2020     IWineD3DBaseShader *iface,
2021     const DWORD param,
2022     const DWORD addr_token,
2023     int input);
2024
2025 extern void shader_trace_init(
2026     IWineD3DBaseShader *iface,
2027     const DWORD* pFunction);
2028
2029 extern int shader_get_param(
2030     IWineD3DBaseShader* iface,
2031     const DWORD* pToken,
2032     DWORD* param,
2033     DWORD* addr_token);
2034
2035 extern int shader_skip_unrecognized(
2036     IWineD3DBaseShader* iface,
2037     const DWORD* pToken);
2038
2039 extern void print_glsl_info_log(
2040     WineD3D_GL_Info *gl_info,
2041     GLhandleARB obj);
2042
2043 static inline int shader_get_regtype(const DWORD param) {
2044     return (((param & WINED3DSP_REGTYPE_MASK) >> WINED3DSP_REGTYPE_SHIFT) |
2045             ((param & WINED3DSP_REGTYPE_MASK2) >> WINED3DSP_REGTYPE_SHIFT2));
2046 }
2047
2048 static inline int shader_get_writemask(const DWORD param) {
2049     return param & WINED3DSP_WRITEMASK_ALL;
2050 }
2051
2052 extern unsigned int shader_get_float_offset(const DWORD reg);
2053
2054 static inline BOOL shader_is_pshader_version(DWORD token) {
2055     return 0xFFFF0000 == (token & 0xFFFF0000);
2056 }
2057
2058 static inline BOOL shader_is_vshader_version(DWORD token) {
2059     return 0xFFFE0000 == (token & 0xFFFF0000);
2060 }
2061
2062 static inline BOOL shader_is_comment(DWORD token) {
2063     return WINED3DSIO_COMMENT == (token & WINED3DSI_OPCODE_MASK);
2064 }
2065
2066 /* TODO: vFace (ps_3_0) */
2067 static inline BOOL shader_is_scalar(DWORD param) {
2068     DWORD reg_type = shader_get_regtype(param);
2069
2070     switch (reg_type) {
2071         case WINED3DSPR_RASTOUT:
2072             if ((param & WINED3DSP_REGNUM_MASK) != 0) {
2073                 /* oFog & oPts */
2074                 return TRUE;
2075             }
2076             /* oPos */
2077             return FALSE;
2078
2079         case WINED3DSPR_DEPTHOUT:   /* oDepth */
2080         case WINED3DSPR_CONSTBOOL:  /* b# */
2081         case WINED3DSPR_LOOP:       /* aL */
2082         case WINED3DSPR_PREDICATE:  /* p0 */
2083             return TRUE;
2084
2085         default:
2086             return FALSE;
2087     }
2088 }
2089
2090 /* Internally used shader constants. Applications can use constants 0 to GL_LIMITS(vshader_constantsF) - 1,
2091  * so upload them above that
2092  */
2093 #define ARB_SHADER_PRIVCONST_BASE GL_LIMITS(vshader_constantsF)
2094 #define ARB_SHADER_PRIVCONST_POS ARB_SHADER_PRIVCONST_BASE + 0
2095
2096 /*****************************************************************************
2097  * IDirect3DVertexShader implementation structure
2098  */
2099 typedef struct IWineD3DVertexShaderImpl {
2100     /* IUnknown parts*/   
2101     const IWineD3DVertexShaderVtbl *lpVtbl;
2102
2103     /* IWineD3DBaseShader */
2104     IWineD3DBaseShaderClass     baseShader;
2105
2106     /* IWineD3DVertexShaderImpl */
2107     IUnknown                    *parent;
2108
2109     DWORD                       usage;
2110
2111     /* Vertex shader input and output semantics */
2112     semantic semantics_in [MAX_ATTRIBS];
2113     semantic semantics_out [MAX_REG_OUTPUT];
2114
2115     /* Ordered array of attributes that are swizzled */
2116     attrib_declaration          swizzled_attribs [MAX_ATTRIBS];
2117     UINT                        num_swizzled_attribs;
2118
2119     /* run time datas...  */
2120     VSHADERDATA                *data;
2121     UINT                       min_rel_offset, max_rel_offset;
2122     UINT                       rel_offset;
2123
2124     UINT                       recompile_count;
2125 #if 0 /* needs reworking */
2126     /* run time datas */
2127     VSHADERINPUTDATA input;
2128     VSHADEROUTPUTDATA output;
2129 #endif
2130 } IWineD3DVertexShaderImpl;
2131 extern const SHADER_OPCODE IWineD3DVertexShaderImpl_shader_ins[];
2132 extern const IWineD3DVertexShaderVtbl IWineD3DVertexShader_Vtbl;
2133
2134 /*****************************************************************************
2135  * IDirect3DPixelShader implementation structure
2136  */
2137
2138 enum vertexprocessing_mode {
2139     fixedfunction,
2140     vertexshader,
2141     pretransformed
2142 };
2143
2144 typedef struct IWineD3DPixelShaderImpl {
2145     /* IUnknown parts */
2146     const IWineD3DPixelShaderVtbl *lpVtbl;
2147
2148     /* IWineD3DBaseShader */
2149     IWineD3DBaseShaderClass     baseShader;
2150
2151     /* IWineD3DPixelShaderImpl */
2152     IUnknown                   *parent;
2153
2154     /* Pixel shader input semantics */
2155     semantic semantics_in [MAX_REG_INPUT];
2156     DWORD                 input_reg_map[MAX_REG_INPUT];
2157     BOOL                  input_reg_used[MAX_REG_INPUT];
2158
2159     /* run time data */
2160     PSHADERDATA                *data;
2161
2162     /* Some information about the shader behavior */
2163     char                        needsbumpmat;
2164     UINT                        bumpenvmatconst;
2165     UINT                        luminanceconst;
2166     char                        srgb_enabled;
2167     char                        srgb_mode_hardcoded;
2168     UINT                        srgb_low_const;
2169     UINT                        srgb_cmp_const;
2170     char                        vpos_uniform;
2171     BOOL                        render_offscreen;
2172     UINT                        height;
2173     enum vertexprocessing_mode  vertexprocessing;
2174
2175 #if 0 /* needs reworking */
2176     PSHADERINPUTDATA input;
2177     PSHADEROUTPUTDATA output;
2178 #endif
2179 } IWineD3DPixelShaderImpl;
2180
2181 extern const SHADER_OPCODE IWineD3DPixelShaderImpl_shader_ins[];
2182 extern const IWineD3DPixelShaderVtbl IWineD3DPixelShader_Vtbl;
2183
2184 /* sRGB correction constants */
2185 static const float srgb_cmp = 0.0031308;
2186 static const float srgb_mul_low = 12.92;
2187 static const float srgb_pow = 0.41666;
2188 static const float srgb_mul_high = 1.055;
2189 static const float srgb_sub_high = 0.055;
2190
2191 /*****************************************************************************
2192  * IWineD3DPalette implementation structure
2193  */
2194 struct IWineD3DPaletteImpl {
2195     /* IUnknown parts */
2196     const IWineD3DPaletteVtbl  *lpVtbl;
2197     LONG                       ref;
2198
2199     IUnknown                   *parent;
2200     IWineD3DDeviceImpl         *wineD3DDevice;
2201
2202     /* IWineD3DPalette */
2203     HPALETTE                   hpal;
2204     WORD                       palVersion;     /*|               */
2205     WORD                       palNumEntries;  /*|  LOGPALETTE   */
2206     PALETTEENTRY               palents[256];   /*|               */
2207     /* This is to store the palette in 'screen format' */
2208     int                        screen_palents[256];
2209     DWORD                      Flags;
2210 };
2211
2212 extern const IWineD3DPaletteVtbl IWineD3DPalette_Vtbl;
2213 DWORD IWineD3DPaletteImpl_Size(DWORD dwFlags);
2214
2215 /* DirectDraw utility functions */
2216 extern WINED3DFORMAT pixelformat_for_depth(DWORD depth);
2217
2218 /*****************************************************************************
2219  * Pixel format management
2220  */
2221 typedef struct {
2222     WINED3DFORMAT           format;
2223     DWORD                   alphaMask, redMask, greenMask, blueMask;
2224     UINT                    bpp;
2225     short                   depthSize, stencilSize;
2226     BOOL                    isFourcc;
2227 } StaticPixelFormatDesc;
2228
2229 const StaticPixelFormatDesc *getFormatDescEntry(WINED3DFORMAT fmt,
2230         WineD3D_GL_Info *gl_info,
2231         const GlPixelFormatDesc **glDesc);
2232
2233 static inline BOOL use_vs(IWineD3DDeviceImpl *device) {
2234     return (device->vs_selected_mode != SHADER_NONE
2235             && device->stateBlock->vertexShader
2236             && ((IWineD3DVertexShaderImpl *)device->stateBlock->vertexShader)->baseShader.function
2237             && !device->strided_streams.u.s.position_transformed);
2238 }
2239
2240 static inline BOOL use_ps(IWineD3DDeviceImpl *device) {
2241     return (device->ps_selected_mode != SHADER_NONE
2242             && device->stateBlock->pixelShader
2243             && ((IWineD3DPixelShaderImpl *)device->stateBlock->pixelShader)->baseShader.function);
2244 }
2245
2246 void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED3DRECT *src_rect,
2247         IWineD3DSurface *dst_surface, WINED3DRECT *dst_rect, const WINED3DTEXTUREFILTERTYPE filter, BOOL flip);
2248
2249 #endif