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