blob: 4b2c781b6d5c5dd9b4011e2bfb81753752a43985 [file] [log] [blame]
Raphael Junqueira01968612003-11-14 03:50:35 +00001/*
2 * Direct3D wine internal private include file
3 *
4 * Copyright 2002-2003 The wine-d3d team
5 * Copyright 2002-2003 Raphael Junqueira
Oliver Stieber46e7c302005-06-23 11:05:24 +00006 * Copyright 2004 Jason Edmeades
7 * Copyright 2005 Oliver Stieber
Raphael Junqueira01968612003-11-14 03:50:35 +00008 *
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 */
23
24#ifndef __WINE_WINED3D_PRIVATE_H
25#define __WINE_WINED3D_PRIVATE_H
26
27#include <stdarg.h>
Jason Edmeades0a944ae2004-11-29 17:53:42 +000028#include <math.h>
Jason Edmeades24ab49e2004-09-23 04:34:27 +000029#define NONAMELESSUNION
30#define NONAMELESSSTRUCT
Jason Edmeades289562e2004-11-23 13:52:46 +000031#define COBJMACROS
Raphael Junqueira01968612003-11-14 03:50:35 +000032#include "windef.h"
33#include "winbase.h"
Jason Edmeades24ab49e2004-09-23 04:34:27 +000034#include "winreg.h"
Raphael Junqueira01968612003-11-14 03:50:35 +000035#include "wingdi.h"
36#include "winuser.h"
37#include "wine/debug.h"
Jason Edmeadesb9e2bed2004-10-08 20:52:33 +000038#include "wine/unicode.h"
Raphael Junqueira01968612003-11-14 03:50:35 +000039
Jason Edmeades24ab49e2004-09-23 04:34:27 +000040#include "d3d9.h"
41#include "d3d9types.h"
Raphael Junqueira01968612003-11-14 03:50:35 +000042#include "wine/wined3d_interface.h"
Jason Edmeadesc3421ea2004-09-29 21:26:47 +000043#include "wine/wined3d_gl.h"
Raphael Junqueira01968612003-11-14 03:50:35 +000044
Oliver Stieber18857f12005-06-24 11:53:07 +000045/* Device caps */
Oliver Stieberabb11f32005-07-05 14:05:18 +000046#define MAX_PALETTES 256
47#define MAX_STREAMS 16
48#define MAX_TEXTURES 8
Oliver Stieber18857f12005-06-24 11:53:07 +000049#define MAX_SAMPLERS 16
Oliver Stieberabb11f32005-07-05 14:05:18 +000050#define MAX_ACTIVE_LIGHTS 8
51#define MAX_CLIPPLANES D3DMAXUSERCLIPPLANES
52#define MAX_LEVELS 256
Oliver Stieber18857f12005-06-24 11:53:07 +000053
Oliver Stieber9b0b8032005-08-17 10:27:01 +000054#define MAX_VSHADER_CONSTANTS 96
Oliver Stieber2af36c62005-08-25 19:24:21 +000055#define MAX_PSHADER_CONSTANTS 32
Oliver Stieber9b0b8032005-08-17 10:27:01 +000056
Oliver Stieberabb11f32005-07-05 14:05:18 +000057/* Used for CreateStateBlock */
58#define NUM_SAVEDPIXELSTATES_R 35
59#define NUM_SAVEDPIXELSTATES_T 18
60#define NUM_SAVEDPIXELSTATES_S 12
61#define NUM_SAVEDVERTEXSTATES_R 31
62#define NUM_SAVEDVERTEXSTATES_T 2
63#define NUM_SAVEDVERTEXSTATES_S 1
64
65extern const DWORD SavedPixelStates_R[NUM_SAVEDPIXELSTATES_R];
66extern const DWORD SavedPixelStates_T[NUM_SAVEDPIXELSTATES_T];
67extern const DWORD SavedPixelStates_S[NUM_SAVEDPIXELSTATES_S];
68extern const DWORD SavedVertexStates_R[NUM_SAVEDVERTEXSTATES_R];
69extern const DWORD SavedVertexStates_T[NUM_SAVEDVERTEXSTATES_T];
70extern const DWORD SavedVertexStates_S[NUM_SAVEDVERTEXSTATES_S];
71
Oliver Stieberbb6f9b02005-08-03 11:00:28 +000072typedef enum _WINELOOKUP {
73 WINELOOKUP_WARPPARAM = 0,
74 WINELOOKUP_MAGFILTER = 1,
75 MAX_LOOKUPS = 2
76} WINELOOKUP;
77
78extern int minLookup[MAX_LOOKUPS];
79extern int maxLookup[MAX_LOOKUPS];
80extern DWORD *stateLookup[MAX_LOOKUPS];
81
82extern DWORD minMipLookup[D3DTEXF_ANISOTROPIC + 1][D3DTEXF_LINEAR + 1];
83
Oliver Stieberbb6f9b02005-08-03 11:00:28 +000084/* NOTE: Make sure these are in the correct numerical order. (see /include/d3d9types.h typedef enum _D3DDECLTYPE) */
85UINT static const glTypeLookup[D3DDECLTYPE_UNUSED][5] = {
86 {D3DDECLTYPE_FLOAT1, 1, GL_FLOAT , GL_FALSE ,sizeof(float)},
87 {D3DDECLTYPE_FLOAT2, 2, GL_FLOAT , GL_FALSE ,sizeof(float)},
88 {D3DDECLTYPE_FLOAT3, 3, GL_FLOAT , GL_FALSE ,sizeof(float)},
89 {D3DDECLTYPE_FLOAT4, 4, GL_FLOAT , GL_FALSE ,sizeof(float)},
90 {D3DDECLTYPE_D3DCOLOR, 4, GL_UNSIGNED_BYTE , GL_TRUE ,sizeof(BYTE)},
91 {D3DDECLTYPE_UBYTE4, 4, GL_UNSIGNED_BYTE , GL_FALSE ,sizeof(BYTE)},
92 {D3DDECLTYPE_SHORT2, 2, GL_SHORT , GL_FALSE ,sizeof(short int)},
93 {D3DDECLTYPE_SHORT4, 4, GL_SHORT , GL_FALSE ,sizeof(short int)},
94 {D3DDECLTYPE_UBYTE4N, 4, GL_UNSIGNED_BYTE , GL_FALSE ,sizeof(BYTE)},
95 {D3DDECLTYPE_SHORT2N, 2, GL_SHORT , GL_FALSE ,sizeof(short int)},
96 {D3DDECLTYPE_SHORT4N, 4, GL_SHORT , GL_FALSE ,sizeof(short int)},
97 {D3DDECLTYPE_USHORT2N, 2, GL_UNSIGNED_SHORT , GL_FALSE ,sizeof(short int)},
98 {D3DDECLTYPE_USHORT4N, 4, GL_UNSIGNED_SHORT , GL_FALSE ,sizeof(short int)},
99 {D3DDECLTYPE_UDEC3, 3, GL_UNSIGNED_SHORT , GL_FALSE ,sizeof(short int)},
100 {D3DDECLTYPE_DEC3N, 3, GL_SHORT , GL_FALSE ,sizeof(short int)},
101 {D3DDECLTYPE_FLOAT16_2, 2, GL_FLOAT , GL_FALSE ,sizeof(short int)},
102 {D3DDECLTYPE_FLOAT16_4, 4, GL_FLOAT , GL_FALSE ,sizeof(short int)}};
103
104#define WINED3D_ATR_TYPE(_attribute) glTypeLookup[sd->u.s._attribute.dwType][0]
105#define WINED3D_ATR_SIZE(_attribute) glTypeLookup[sd->u.s._attribute.dwType][1]
106#define WINED3D_ATR_GLTYPE(_attribute) glTypeLookup[sd->u.s._attribute.dwType][2]
Oliver Stieber1be54d82005-08-19 10:05:00 +0000107#define WINED3D_ATR_NORMALIZED(_attribute) glTypeLookup[sd->u.s._attribute.dwType][3]
Oliver Stieberbb6f9b02005-08-03 11:00:28 +0000108#define WINED3D_ATR_TYPESIZE(_attribute) glTypeLookup[sd->u.s._attribute.dwType][4]
Oliver Stieberbb6f9b02005-08-03 11:00:28 +0000109
Raphael Junqueiracc8762a2005-07-24 17:11:33 +0000110/**
111 * Settings
112 */
Jason Edmeades24ab49e2004-09-23 04:34:27 +0000113#define VS_NONE 0
114#define VS_HW 1
115#define VS_SW 2
Raphael Junqueira01968612003-11-14 03:50:35 +0000116
Jason Edmeades24ab49e2004-09-23 04:34:27 +0000117#define PS_NONE 0
118#define PS_HW 1
119
Raphael Junqueiracc8762a2005-07-24 17:11:33 +0000120#define VBO_NONE 0
121#define VBO_HW 1
122
123typedef struct wined3d_settings_s {
124/* vertex and pixel shader modes */
125 int vs_mode;
126 int ps_mode;
127 int vbo_mode;
128} wined3d_settings_t;
129
130extern wined3d_settings_t wined3d_settings;
131
Jason Edmeadesc3421ea2004-09-29 21:26:47 +0000132/* X11 locking */
133
134extern void (*wine_tsx11_lock_ptr)(void);
135extern void (*wine_tsx11_unlock_ptr)(void);
136
137/* As GLX relies on X, this is needed */
138extern int num_lock;
139
140#if 0
141#define ENTER_GL() ++num_lock; if (num_lock > 1) FIXME("Recursive use of GL lock to: %d\n", num_lock); wine_tsx11_lock_ptr()
142#define LEAVE_GL() if (num_lock != 1) FIXME("Recursive use of GL lock: %d\n", num_lock); --num_lock; wine_tsx11_unlock_ptr()
143#else
144#define ENTER_GL() wine_tsx11_lock_ptr()
145#define LEAVE_GL() wine_tsx11_unlock_ptr()
146#endif
147
148/*****************************************************************************
149 * Defines
150 */
Jason Edmeades2003c7a2004-12-13 13:35:38 +0000151
152/* GL related defines */
153/* ------------------ */
Jason Edmeadeseba27af2004-11-28 15:04:41 +0000154#define GL_SUPPORT(ExtName) (GLINFO_LOCATION.supported[ExtName] != 0)
155#define GL_LIMITS(ExtName) (GLINFO_LOCATION.max_##ExtName)
Jason Edmeadesf738c142004-12-09 11:42:34 +0000156#define GL_EXTCALL(FuncName) (GLINFO_LOCATION.FuncName)
Oliver Stieber2c0e97e2005-08-17 11:34:03 +0000157#define GL_VEND(_VendName) (GLINFO_LOCATION.gl_vendor == VENDOR_##_VendName ? TRUE : FALSE)
Jason Edmeadesb5198932004-10-06 00:05:29 +0000158
Jason Edmeades2003c7a2004-12-13 13:35:38 +0000159#define D3DCOLOR_R(dw) (((float) (((dw) >> 16) & 0xFF)) / 255.0f)
160#define D3DCOLOR_G(dw) (((float) (((dw) >> 8) & 0xFF)) / 255.0f)
161#define D3DCOLOR_B(dw) (((float) (((dw) >> 0) & 0xFF)) / 255.0f)
162#define D3DCOLOR_A(dw) (((float) (((dw) >> 24) & 0xFF)) / 255.0f)
163
164#define D3DCOLORTOGLFLOAT4(dw, vec) \
165 (vec)[0] = D3DCOLOR_R(dw); \
166 (vec)[1] = D3DCOLOR_G(dw); \
167 (vec)[2] = D3DCOLOR_B(dw); \
168 (vec)[3] = D3DCOLOR_A(dw);
169
170/* Note: The following is purely to keep the source code as clear from #ifdefs as possible */
171#if defined(GL_VERSION_1_3)
Jason Edmeadesc4de9522004-12-14 11:54:27 +0000172#define GLACTIVETEXTURE(textureNo) \
173 glActiveTexture(GL_TEXTURE0 + textureNo); \
Jason Edmeades2003c7a2004-12-13 13:35:38 +0000174 checkGLcall("glActiveTexture");
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000175#define GLCLIENTACTIVETEXTURE(textureNo) \
176 glClientActiveTexture(GL_TEXTURE0 + textureNo);
Jason Edmeadesc4de9522004-12-14 11:54:27 +0000177#define GLMULTITEXCOORD1F(a,b) \
178 glMultiTexCoord1f(GL_TEXTURE0 + a, b);
179#define GLMULTITEXCOORD2F(a,b,c) \
180 glMultiTexCoord2f(GL_TEXTURE0 + a, b, c);
181#define GLMULTITEXCOORD3F(a,b,c,d) \
182 glMultiTexCoord3f(GL_TEXTURE0 + a, b, c, d);
183#define GLMULTITEXCOORD4F(a,b,c,d,e) \
184 glMultiTexCoord4f(GL_TEXTURE0 + a, b, c, d, e);
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000185#define GLTEXTURECUBEMAP GL_TEXTURE_CUBE_MAP
Jason Edmeades2003c7a2004-12-13 13:35:38 +0000186#else
Jason Edmeadesc4de9522004-12-14 11:54:27 +0000187#define GLACTIVETEXTURE(textureNo) \
188 glActiveTextureARB(GL_TEXTURE0_ARB + textureNo); \
Jason Edmeades2003c7a2004-12-13 13:35:38 +0000189 checkGLcall("glActiveTextureARB");
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000190#define GLCLIENTACTIVETEXTURE(textureNo) \
191 glClientActiveTextureARB(GL_TEXTURE0_ARB + textureNo);
Jason Edmeadesc4de9522004-12-14 11:54:27 +0000192#define GLMULTITEXCOORD1F(a,b) \
Raphael Junqueira66cae0d2004-12-17 19:07:44 +0000193 glMultiTexCoord1fARB(GL_TEXTURE0_ARB + a, b);
Jason Edmeadesc4de9522004-12-14 11:54:27 +0000194#define GLMULTITEXCOORD2F(a,b,c) \
Raphael Junqueira66cae0d2004-12-17 19:07:44 +0000195 glMultiTexCoord2fARB(GL_TEXTURE0_ARB + a, b, c);
Jason Edmeadesc4de9522004-12-14 11:54:27 +0000196#define GLMULTITEXCOORD3F(a,b,c,d) \
Raphael Junqueira66cae0d2004-12-17 19:07:44 +0000197 glMultiTexCoord3fARB(GL_TEXTURE0_ARB + a, b, c, d);
Jason Edmeadesc4de9522004-12-14 11:54:27 +0000198#define GLMULTITEXCOORD4F(a,b,c,d,e) \
Raphael Junqueira66cae0d2004-12-17 19:07:44 +0000199 glMultiTexCoord4fARB(GL_TEXTURE0_ARB + a, b, c, d, e);
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000200#define GLTEXTURECUBEMAP GL_TEXTURE_CUBE_MAP_ARB
Jason Edmeades2003c7a2004-12-13 13:35:38 +0000201#endif
202
203/* DirectX Device Limits */
204/* --------------------- */
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000205#define MAX_LEVELS 256 /* Maximum number of mipmap levels. Guessed at 256 */
206
Jason Edmeadesb5198932004-10-06 00:05:29 +0000207#define MAX_STREAMS 16 /* Maximum possible streams - used for fixed size arrays
208 See MaxStreams in MSDN under GetDeviceCaps */
Oliver Stieber7b261652005-03-03 13:57:15 +0000209 /* Maximum number of constants provided to the shaders */
Jason Edmeadeseba27af2004-11-28 15:04:41 +0000210#define HIGHEST_TRANSFORMSTATE 512
211 /* Highest value in D3DTRANSFORMSTATETYPE */
Jason Edmeades0a944ae2004-11-29 17:53:42 +0000212#define MAX_CLIPPLANES D3DMAXUSERCLIPPLANES
Jason Edmeadesb5198932004-10-06 00:05:29 +0000213
Jason Edmeades41427852005-01-09 17:37:02 +0000214#define MAX_PALETTES 256
215
Jason Edmeades2003c7a2004-12-13 13:35:38 +0000216/* Checking of API calls */
217/* --------------------- */
Jason Edmeadesb9e2bed2004-10-08 20:52:33 +0000218#define checkGLcall(A) \
219{ \
220 GLint err = glGetError(); \
221 if (err != GL_NO_ERROR) { \
222 FIXME(">>>>>>>>>>>>>>>>> %x from %s @ %s / %d\n", err, A, __FILE__, __LINE__); \
223 } else { \
224 TRACE("%s call ok %s / %d\n", A, __FILE__, __LINE__); \
225 } \
226}
227
Jason Edmeades2003c7a2004-12-13 13:35:38 +0000228/* Trace routines / diagnostics */
229/* ---------------------------- */
230
231/* Dump out a matrix and copy it */
Jason Edmeadeseba27af2004-11-28 15:04:41 +0000232#define conv_mat(mat,gl_mat) \
233do { \
234 TRACE("%f %f %f %f\n", (mat)->u.s._11, (mat)->u.s._12, (mat)->u.s._13, (mat)->u.s._14); \
235 TRACE("%f %f %f %f\n", (mat)->u.s._21, (mat)->u.s._22, (mat)->u.s._23, (mat)->u.s._24); \
236 TRACE("%f %f %f %f\n", (mat)->u.s._31, (mat)->u.s._32, (mat)->u.s._33, (mat)->u.s._34); \
237 TRACE("%f %f %f %f\n", (mat)->u.s._41, (mat)->u.s._42, (mat)->u.s._43, (mat)->u.s._44); \
238 memcpy(gl_mat, (mat), 16 * sizeof(float)); \
239} while (0)
240
Jason Edmeades0a944ae2004-11-29 17:53:42 +0000241/* Macro to dump out the current state of the light chain */
242#define DUMP_LIGHT_CHAIN() \
243{ \
244 PLIGHTINFOEL *el = This->stateBlock->lights;\
245 while (el) { \
246 TRACE("Light %p (glIndex %ld, d3dIndex %ld, enabled %d)\n", el, el->glIndex, el->OriginalIndex, el->lightEnabled);\
247 el = el->next; \
248 } \
249}
250
Jason Edmeades2003c7a2004-12-13 13:35:38 +0000251/* Trace vector and strided data information */
Jason Edmeadesf738c142004-12-09 11:42:34 +0000252#define TRACE_VECTOR(name) TRACE( #name "=(%f, %f, %f, %f)\n", name.x, name.y, name.z, name.w);
253#define TRACE_STRIDED(sd,name) TRACE( #name "=(data:%p, stride:%ld, type:%ld)\n", sd->u.s.name.lpData, sd->u.s.name.dwStride, sd->u.s.name.dwType);
254
Jason Edmeades2003c7a2004-12-13 13:35:38 +0000255/* Defines used for optimizations */
256
257/* Only reapply what is necessary */
258#define REAPPLY_ALPHAOP 0x0001
259#define REAPPLY_ALL 0xFFFF
260
261/* Advance declaration of structures to satisfy compiler */
Jason Edmeades447d5ed2004-10-21 20:59:12 +0000262typedef struct IWineD3DStateBlockImpl IWineD3DStateBlockImpl;
Jason Edmeades41427852005-01-09 17:37:02 +0000263typedef struct IWineD3DSurfaceImpl IWineD3DSurfaceImpl;
Jason Edmeades447d5ed2004-10-21 20:59:12 +0000264
Oliver Stieber6a032492005-07-13 11:34:55 +0000265/* Tracking */
266
267/* TODO: Move some of this to the device */
268long globalChangeGlRam(long glram);
269
270/* Memory and object tracking */
271
272/*Structure for holding information on all direct3d objects
Francois Gougetbd19d672005-07-22 09:06:03 +0000273useful for making sure tracking is ok and when release is called on a device!
274and probably quite handy for debugging and dumping states out
Oliver Stieber6a032492005-07-13 11:34:55 +0000275*/
276typedef struct WineD3DGlobalStatistics {
277 int glsurfaceram; /* The aproximate amount of glTexture memory allocated for textures */
278} WineD3DGlobalStatistics;
279
280extern WineD3DGlobalStatistics* wineD3DGlobalStatistics;
281
Jason Edmeades2003c7a2004-12-13 13:35:38 +0000282/* Global variables */
Jason Edmeadeseba27af2004-11-28 15:04:41 +0000283extern const float identity[16];
284
Jason Edmeades24ab49e2004-09-23 04:34:27 +0000285/*****************************************************************************
Jason Edmeadesf738c142004-12-09 11:42:34 +0000286 * Compilable extra diagnostics
287 */
288
289/* Trace information per-vertex: (extremely high amount of trace) */
290#if 0 /* NOTE: Must be 0 in cvs */
291# define VTRACE(A) TRACE A
292#else
293# define VTRACE(A)
294#endif
295
296/* Checking of per-vertex related GL calls */
297#define vcheckGLcall(A) \
298{ \
299 GLint err = glGetError(); \
300 if (err != GL_NO_ERROR) { \
301 FIXME(">>>>>>>>>>>>>>>>> %x from %s @ %s / %d\n", err, A, __FILE__, __LINE__); \
302 } else { \
303 VTRACE(("%s call ok %s / %d\n", A, __FILE__, __LINE__)); \
304 } \
305}
306
Jason Edmeadesc4de9522004-12-14 11:54:27 +0000307/* TODO: Confirm each of these works when wined3d move completed */
308#if 0 /* NOTE: Must be 0 in cvs */
309 /* To avoid having to get gigabytes of trace, the following can be compiled in, and at the start
310 of each frame, a check is made for the existence of C:\D3DTRACE, and if if exists d3d trace
311 is enabled, and if it doesn't exists it is disabled. */
312# define FRAME_DEBUGGING
313 /* Adding in the SINGLE_FRAME_DEBUGGING gives a trace of just what makes up a single frame, before
314 the file is deleted */
315# if 1 /* NOTE: Must be 1 in cvs, as this is mostly more useful than a trace from program start */
316# define SINGLE_FRAME_DEBUGGING
317# endif
318 /* The following, when enabled, lets you see the makeup of the frame, by drawprimitive calls.
319 It can only be enabled when FRAME_DEBUGGING is also enabled
320 The contents of the back buffer are written into /tmp/backbuffer_* after each primitive
321 array is drawn. */
322# if 0 /* NOTE: Must be 0 in cvs, as this give a lot of ppm files when compiled in */
323# define SHOW_FRAME_MAKEUP 1
324# endif
325 /* The following, when enabled, lets you see the makeup of the all the textures used during each
326 of the drawprimitive calls. It can only be enabled when SHOW_FRAME_MAKEUP is also enabled.
327 The contents of the textures assigned to each stage are written into
328 /tmp/texture_*_<Stage>.ppm after each primitive array is drawn. */
329# if 0 /* NOTE: Must be 0 in cvs, as this give a lot of ppm files when compiled in */
330# define SHOW_TEXTURE_MAKEUP 0
331# endif
332extern BOOL isOn;
333extern BOOL isDumpingFrames;
334extern LONG primCounter;
335#endif
336
Jason Edmeadesf738c142004-12-09 11:42:34 +0000337/*****************************************************************************
338 * Prototypes
339 */
340
341/* Routine common to the draw primitive and draw indexed primitive routines */
342void drawPrimitive(IWineD3DDevice *iface,
343 int PrimitiveType,
344 long NumPrimitives,
Jason Edmeadesf738c142004-12-09 11:42:34 +0000345 /* for Indexed: */
346 long StartVertexIndex,
Oliver Stieber1be54d82005-08-19 10:05:00 +0000347 UINT numberOfVertices,
Jason Edmeadesf738c142004-12-09 11:42:34 +0000348 long StartIdx,
349 short idxBytes,
350 const void *idxData,
351 int minIndex);
352
353/*****************************************************************************
354 * Structures required to draw primitives
355 */
356
357typedef struct Direct3DStridedData {
358 BYTE *lpData; /* Pointer to start of data */
359 DWORD dwStride; /* Stride between occurances of this data */
360 DWORD dwType; /* Type (as in D3DVSDT_TYPE) */
361} Direct3DStridedData;
362
363typedef struct Direct3DVertexStridedData {
364 union {
365 struct {
366 Direct3DStridedData position;
367 Direct3DStridedData blendWeights;
368 Direct3DStridedData blendMatrixIndices;
369 Direct3DStridedData normal;
370 Direct3DStridedData pSize;
371 Direct3DStridedData diffuse;
372 Direct3DStridedData specular;
Oliver Stieberabb11f32005-07-05 14:05:18 +0000373 Direct3DStridedData texCoords[MAX_TEXTURES];
Oliver Stieber386470b2005-07-30 19:06:14 +0000374 Direct3DStridedData position2; /* tween data */
375 Direct3DStridedData normal2; /* tween data */
376 Direct3DStridedData tangent;
377 Direct3DStridedData binormal;
378 Direct3DStridedData tessFactor;
379 Direct3DStridedData fog;
380 Direct3DStridedData depth;
381 Direct3DStridedData sample;
Jason Edmeadesf738c142004-12-09 11:42:34 +0000382 } s;
383 Direct3DStridedData input[16]; /* Indexed by constants in D3DVSDE_REGISTER */
384 } u;
385} Direct3DVertexStridedData;
386
387/*****************************************************************************
Jason Edmeades0a944ae2004-11-29 17:53:42 +0000388 * Internal representation of a light
389 */
390typedef struct PLIGHTINFOEL PLIGHTINFOEL;
391struct PLIGHTINFOEL {
392 WINED3DLIGHT OriginalParms; /* Note D3D8LIGHT == D3D9LIGHT */
393 DWORD OriginalIndex;
394 LONG glIndex;
395 BOOL lightEnabled;
396 BOOL changed;
397 BOOL enabledChanged;
398
399 /* Converted parms to speed up swapping lights */
400 float lightPosn[4];
401 float lightDirn[4];
402 float exponent;
403 float cutoff;
404
405 PLIGHTINFOEL *next;
406 PLIGHTINFOEL *prev;
407};
408
409/*****************************************************************************
Jason Edmeades24ab49e2004-09-23 04:34:27 +0000410 * IWineD3D implementation structure
411 */
412typedef struct IWineD3DImpl
413{
414 /* IUnknown fields */
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000415 const IWineD3DVtbl *lpVtbl;
Mike McCormack8955ac42005-07-28 10:16:21 +0000416 LONG ref; /* Note: Ref counting not required */
Jason Edmeades24ab49e2004-09-23 04:34:27 +0000417
418 /* WineD3D Information */
Jason Edmeades289562e2004-11-23 13:52:46 +0000419 IUnknown *parent;
Jason Edmeades24ab49e2004-09-23 04:34:27 +0000420 UINT dxVersion;
Jason Edmeadesc3421ea2004-09-29 21:26:47 +0000421
422 /* GL Information */
423 BOOL isGLInfoValid;
424 WineD3D_GL_Info gl_info;
Jason Edmeades24ab49e2004-09-23 04:34:27 +0000425} IWineD3DImpl;
426
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000427extern const IWineD3DVtbl IWineD3D_Vtbl;
Jason Edmeades24ab49e2004-09-23 04:34:27 +0000428
Oliver Stieberc93da092005-07-27 15:33:17 +0000429typedef struct SwapChainList {
430 IWineD3DSwapChain *swapchain;
431 struct SwapChainList *next;
432} SwapChainList;
Oliver Stieber94856322005-07-19 11:39:24 +0000433
434/** Hacked out start of a context manager!! **/
435typedef struct glContext {
436 int Width;
437 int Height;
438 int usedcount;
439 GLXContext context;
440
441 Drawable drawable;
442 IWineD3DSurface *pSurface;
443#if 0 /* TODO: someway to represent the state of the context */
444 IWineD3DStateBlock *pStateBlock;
445#endif
446/* a few other things like format */
447} glContext;
448
449/* TODO: setup some flags in the regestry to enable, disable pbuffer support
450(since it will break quite a few things until contexts are managed properly!) */
451extern BOOL pbuffer_support;
452/* allocate one pbuffer per surface */
453extern BOOL pbuffer_per_surface;
454
455/* Maximum number of contexts/pbuffers to keep in cache,
456set to 100 because ATI's drivers don't support deleting pBuffers properly
457this needs to be migrated to a list and some option availalbe for controle the cache size.
458*/
459#define CONTEXT_CACHE 100
460
Oliver Stieberea6189e2005-07-26 10:34:15 +0000461typedef struct ResourceList {
462 IWineD3DResource *resource;
463 struct ResourceList *next;
464} ResourceList;
Oliver Stieber94856322005-07-19 11:39:24 +0000465
Jason Edmeadesac490fa2004-10-07 04:22:21 +0000466/*****************************************************************************
467 * IWineD3DDevice implementation structure
468 */
469typedef struct IWineD3DDeviceImpl
470{
Jason Edmeadesb9e2bed2004-10-08 20:52:33 +0000471 /* IUnknown fields */
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000472 const IWineD3DDeviceVtbl *lpVtbl;
Mike McCormack8955ac42005-07-28 10:16:21 +0000473 LONG ref; /* Note: Ref counting not required */
Jason Edmeadesac490fa2004-10-07 04:22:21 +0000474
Jason Edmeadesb9e2bed2004-10-08 20:52:33 +0000475 /* WineD3D Information */
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000476 IUnknown *parent;
Jason Edmeadeseba27af2004-11-28 15:04:41 +0000477 IWineD3D *wineD3D;
Jason Edmeadesac490fa2004-10-07 04:22:21 +0000478
Jason Edmeadesb9e2bed2004-10-08 20:52:33 +0000479 /* X and GL Information */
Jason Edmeadesb9e2bed2004-10-08 20:52:33 +0000480 GLint maxConcurrentLights;
481
482 /* Optimization */
483 BOOL modelview_valid;
484 BOOL proj_valid;
485 BOOL view_ident; /* true iff view matrix is identity */
486 BOOL last_was_rhw; /* true iff last draw_primitive was in xyzrhw mode */
Jason Edmeadesf738c142004-12-09 11:42:34 +0000487 GLenum tracking_parm; /* Which source is tracking current colour */
488 LONG tracking_color; /* used iff GL_COLOR_MATERIAL was enabled */
Oliver Stieber2121f782005-03-02 12:16:10 +0000489#define DISABLED_TRACKING 0 /* Disabled */
490#define IS_TRACKING 1 /* tracking_parm is tracking diffuse color */
491#define NEEDS_TRACKING 2 /* Tracking needs to be enabled when needed */
492#define NEEDS_DISABLE 3 /* Tracking needs to be disabled when needed*/
Jason Edmeades2003c7a2004-12-13 13:35:38 +0000493 UINT srcBlend;
494 UINT dstBlend;
495 UINT alphafunc;
496 UINT stencilfunc;
497 BOOL texture_shader_active; /* TODO: Confirm use is correct */
Jason Edmeadesb9e2bed2004-10-08 20:52:33 +0000498
Jason Edmeades447d5ed2004-10-21 20:59:12 +0000499 /* State block related */
500 BOOL isRecordingState;
501 IWineD3DStateBlockImpl *stateBlock;
502 IWineD3DStateBlockImpl *updateStateBlock;
503
Jason Edmeadesb9e2bed2004-10-08 20:52:33 +0000504 /* Internal use fields */
505 D3DDEVICE_CREATION_PARAMETERS createParms;
Jason Edmeadesb9e2bed2004-10-08 20:52:33 +0000506 UINT adapterNo;
507 D3DDEVTYPE devType;
508
Oliver Stieberc93da092005-07-27 15:33:17 +0000509 SwapChainList *swapchains;
Oliver Stieber46e7c302005-06-23 11:05:24 +0000510
Oliver Stieberea6189e2005-07-26 10:34:15 +0000511 ResourceList *resources; /* a linked list to track resources created by the device */
512
Jason Edmeades41427852005-01-09 17:37:02 +0000513 /* Render Target Support */
Oliver Stieberba5eb142005-03-14 10:12:52 +0000514 IWineD3DSurface *depthStencilBuffer;
Jason Edmeades41427852005-01-09 17:37:02 +0000515
Oliver Stieberba5eb142005-03-14 10:12:52 +0000516 IWineD3DSurface *renderTarget;
517 IWineD3DSurface *stencilBufferTarget;
Jason Edmeades41427852005-01-09 17:37:02 +0000518
519 /* palettes texture management */
Oliver Stieberba5eb142005-03-14 10:12:52 +0000520 PALETTEENTRY palettes[MAX_PALETTES][256];
521 UINT currentPalette;
Jason Edmeades41427852005-01-09 17:37:02 +0000522
Jason Edmeadesf738c142004-12-09 11:42:34 +0000523 /* For rendering to a texture using glCopyTexImage */
Oliver Stieberba5eb142005-03-14 10:12:52 +0000524 BOOL renderUpsideDown;
Jason Edmeadesf738c142004-12-09 11:42:34 +0000525
Oliver Stieber2121f782005-03-02 12:16:10 +0000526 /* Cursor management */
527 BOOL bCursorVisible;
528 UINT xHotSpot;
529 UINT yHotSpot;
530 UINT xScreenSpace;
531 UINT yScreenSpace;
532
Jason Edmeades2003c7a2004-12-13 13:35:38 +0000533 /* Textures for when no other textures are mapped */
Oliver Stieberabb11f32005-07-05 14:05:18 +0000534 UINT dummyTextureName[MAX_TEXTURES];
Jason Edmeades2003c7a2004-12-13 13:35:38 +0000535
Oliver Stieber2121f782005-03-02 12:16:10 +0000536 /* Debug stream management */
537 BOOL debug;
538
Oliver Stieber329d0172005-09-21 10:55:03 +0000539 /* Device state management */
540 HRESULT state;
541
Oliver Stieber94856322005-07-19 11:39:24 +0000542 /* Screen buffer resources */
543 glContext contextCache[CONTEXT_CACHE];
544
545 /* A flag to check if endscene has been called before changing the render tartet */
546 BOOL sceneEnded;
Jason Edmeadesac490fa2004-10-07 04:22:21 +0000547} IWineD3DDeviceImpl;
548
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000549extern const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl;
Jason Edmeadesac490fa2004-10-07 04:22:21 +0000550
Oliver Stieberfe80b4e2005-07-15 09:54:57 +0000551/* Support for IWineD3DResource ::Set/Get/FreePrivateData. I don't think
552 * anybody uses it for much so a good implementation is optional. */
553typedef struct PrivateData
554{
555 struct PrivateData* next;
556
557 GUID tag;
558 DWORD flags; /* DDSPD_* */
559 DWORD uniqueness_value;
560
561 union
562 {
563 LPVOID data;
564 LPUNKNOWN object;
565 } ptr;
566
567 DWORD size;
568} PrivateData;
569
Jason Edmeadesdb7a5052004-10-14 00:32:04 +0000570/*****************************************************************************
571 * IWineD3DResource implementation structure
572 */
573typedef struct IWineD3DResourceClass
574{
575 /* IUnknown fields */
Mike McCormack8955ac42005-07-28 10:16:21 +0000576 LONG ref; /* Note: Ref counting not required */
Jason Edmeadesdb7a5052004-10-14 00:32:04 +0000577
578 /* WineD3DResource Information */
Jason Edmeades289562e2004-11-23 13:52:46 +0000579 IUnknown *parent;
Jason Edmeadesdb7a5052004-10-14 00:32:04 +0000580 D3DRESOURCETYPE resourceType;
Jason Edmeades41427852005-01-09 17:37:02 +0000581 IWineD3DDeviceImpl *wineD3DDevice;
Oliver Stieber67f2ad42005-03-29 19:01:00 +0000582 D3DPOOL pool;
583 UINT size;
584 DWORD usage;
585 WINED3DFORMAT format;
586 BYTE *allocatedMemory;
Oliver Stieberfe80b4e2005-07-15 09:54:57 +0000587 PrivateData *privateData;
Jason Edmeadesdb7a5052004-10-14 00:32:04 +0000588
589} IWineD3DResourceClass;
590
591typedef struct IWineD3DResourceImpl
592{
593 /* IUnknown & WineD3DResource Information */
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000594 const IWineD3DResourceVtbl *lpVtbl;
Jason Edmeadesdb7a5052004-10-14 00:32:04 +0000595 IWineD3DResourceClass resource;
Jason Edmeadesdb7a5052004-10-14 00:32:04 +0000596} IWineD3DResourceImpl;
597
Jason Edmeadesdb7a5052004-10-14 00:32:04 +0000598
599/*****************************************************************************
600 * IWineD3DVertexBuffer implementation structure (extends IWineD3DResourceImpl)
601 */
602typedef struct IWineD3DVertexBufferImpl
603{
604 /* IUnknown & WineD3DResource Information */
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000605 const IWineD3DVertexBufferVtbl *lpVtbl;
Jason Edmeadesdb7a5052004-10-14 00:32:04 +0000606 IWineD3DResourceClass resource;
607
608 /* WineD3DVertexBuffer specifics */
Oliver Stieber6a032492005-07-13 11:34:55 +0000609 DWORD fvf;
Jason Edmeadesdb7a5052004-10-14 00:32:04 +0000610
611} IWineD3DVertexBufferImpl;
612
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000613extern const IWineD3DVertexBufferVtbl IWineD3DVertexBuffer_Vtbl;
Jason Edmeadesdb7a5052004-10-14 00:32:04 +0000614
Oliver Stieber67f2ad42005-03-29 19:01:00 +0000615
Jason Edmeades447d5ed2004-10-21 20:59:12 +0000616/*****************************************************************************
Jason Edmeades73e8baf2004-11-24 18:13:41 +0000617 * IWineD3DIndexBuffer implementation structure (extends IWineD3DResourceImpl)
618 */
619typedef struct IWineD3DIndexBufferImpl
620{
621 /* IUnknown & WineD3DResource Information */
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000622 const IWineD3DIndexBufferVtbl *lpVtbl;
Jason Edmeades73e8baf2004-11-24 18:13:41 +0000623 IWineD3DResourceClass resource;
624
625 /* WineD3DVertexBuffer specifics */
Jason Edmeades73e8baf2004-11-24 18:13:41 +0000626} IWineD3DIndexBufferImpl;
627
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000628extern const IWineD3DIndexBufferVtbl IWineD3DIndexBuffer_Vtbl;
Jason Edmeades73e8baf2004-11-24 18:13:41 +0000629
630/*****************************************************************************
Oliver Stieberbb6f9b02005-08-03 11:00:28 +0000631 * IWineD3DBaseTexture D3D- > openGL state map lookups
632 */
633#define WINED3DFUNC_NOTSUPPORTED -2
634#define WINED3DFUNC_UNIMPLEMENTED -1
635
636typedef enum winetexturestates {
637 WINED3DTEXSTA_ADDRESSU = 0,
638 WINED3DTEXSTA_ADDRESSV = 1,
639 WINED3DTEXSTA_ADDRESSW = 2,
640 WINED3DTEXSTA_BORDERCOLOR = 3,
641 WINED3DTEXSTA_MAGFILTER = 4,
642 WINED3DTEXSTA_MINFILTER = 5,
643 WINED3DTEXSTA_MIPFILTER = 6,
644 WINED3DTEXSTA_MAXMIPLEVEL = 7,
645 WINED3DTEXSTA_MAXANISOTROPY = 8,
646 WINED3DTEXSTA_SRGBTEXTURE = 9,
647 WINED3DTEXSTA_ELEMENTINDEX = 10,
648 WINED3DTEXSTA_DMAPOFFSET = 11,
649 WINED3DTEXSTA_TSSADDRESSW = 12,
650 MAX_WINETEXTURESTATES = 13,
651} winetexturestates;
652
653typedef struct Wined3dTextureStateMap {
654 CONST int state;
655 int function;
656} Wined3dTextureStateMap;
657
658/*****************************************************************************
Jason Edmeades819b0e12004-12-07 14:29:12 +0000659 * IWineD3DBaseTexture implementation structure (extends IWineD3DResourceImpl)
660 */
661typedef struct IWineD3DBaseTextureClass
662{
663 UINT levels;
Jason Edmeades41427852005-01-09 17:37:02 +0000664 BOOL dirty;
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000665 D3DFORMAT format;
Oliver Stieberba5eb142005-03-14 10:12:52 +0000666 DWORD usage;
Oliver Stieberbb6f9b02005-08-03 11:00:28 +0000667 UINT textureName;
Oliver Stieberba5eb142005-03-14 10:12:52 +0000668 UINT LOD;
669 D3DTEXTUREFILTERTYPE filterType;
Oliver Stieberbb6f9b02005-08-03 11:00:28 +0000670 DWORD states[MAX_WINETEXTURESTATES];
Jason Edmeades819b0e12004-12-07 14:29:12 +0000671
672} IWineD3DBaseTextureClass;
673
674typedef struct IWineD3DBaseTextureImpl
675{
676 /* IUnknown & WineD3DResource Information */
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000677 const IWineD3DBaseTextureVtbl *lpVtbl;
Jason Edmeades819b0e12004-12-07 14:29:12 +0000678 IWineD3DResourceClass resource;
679 IWineD3DBaseTextureClass baseTexture;
680
681} IWineD3DBaseTextureImpl;
682
Jason Edmeades819b0e12004-12-07 14:29:12 +0000683/*****************************************************************************
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000684 * IWineD3DTexture implementation structure (extends IWineD3DBaseTextureImpl)
685 */
686typedef struct IWineD3DTextureImpl
687{
688 /* IUnknown & WineD3DResource/WineD3DBaseTexture Information */
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000689 const IWineD3DTextureVtbl *lpVtbl;
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000690 IWineD3DResourceClass resource;
691 IWineD3DBaseTextureClass baseTexture;
692
693 /* IWineD3DTexture */
Oliver Stieberba5eb142005-03-14 10:12:52 +0000694 IWineD3DSurface *surfaces[MAX_LEVELS];
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000695
696 UINT width;
697 UINT height;
Oliver Stiebere31bc6c2005-08-03 19:49:05 +0000698 float pow2scalingFactorX;
699 float pow2scalingFactorY;
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000700
701} IWineD3DTextureImpl;
702
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000703extern const IWineD3DTextureVtbl IWineD3DTexture_Vtbl;
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000704
705/*****************************************************************************
706 * IWineD3DCubeTexture implementation structure (extends IWineD3DBaseTextureImpl)
707 */
708typedef struct IWineD3DCubeTextureImpl
709{
710 /* IUnknown & WineD3DResource/WineD3DBaseTexture Information */
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000711 const IWineD3DCubeTextureVtbl *lpVtbl;
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000712 IWineD3DResourceClass resource;
713 IWineD3DBaseTextureClass baseTexture;
714
715 /* IWineD3DCubeTexture */
Oliver Stieberba5eb142005-03-14 10:12:52 +0000716 IWineD3DSurface *surfaces[6][MAX_LEVELS];
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000717
718 UINT edgeLength;
Oliver Stiebere31bc6c2005-08-03 19:49:05 +0000719 float pow2scalingFactor;
Oliver Stieberba5eb142005-03-14 10:12:52 +0000720
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000721} IWineD3DCubeTextureImpl;
722
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000723extern const IWineD3DCubeTextureVtbl IWineD3DCubeTexture_Vtbl;
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000724
725/*****************************************************************************
726 * IWineD3DVolume implementation structure (extends IUnknown)
727 */
728typedef struct IWineD3DVolumeImpl
729{
Oliver Stieber67f2ad42005-03-29 19:01:00 +0000730 /* IUnknown & WineD3DResource fields */
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000731 const IWineD3DVolumeVtbl *lpVtbl;
Oliver Stieber67f2ad42005-03-29 19:01:00 +0000732 IWineD3DResourceClass resource;
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000733
734 /* WineD3DVolume Information */
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000735 D3DVOLUME_DESC currentDesc;
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000736 IUnknown *container;
737 UINT bytesPerPixel;
738
739 BOOL lockable;
740 BOOL locked;
741 D3DBOX lockedBox;
742 D3DBOX dirtyBox;
743 BOOL dirty;
744
745
746} IWineD3DVolumeImpl;
747
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000748extern const IWineD3DVolumeVtbl IWineD3DVolume_Vtbl;
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000749
750/*****************************************************************************
751 * IWineD3DVolumeTexture implementation structure (extends IWineD3DBaseTextureImpl)
752 */
753typedef struct IWineD3DVolumeTextureImpl
754{
755 /* IUnknown & WineD3DResource/WineD3DBaseTexture Information */
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000756 const IWineD3DVolumeTextureVtbl *lpVtbl;
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000757 IWineD3DResourceClass resource;
758 IWineD3DBaseTextureClass baseTexture;
759
760 /* IWineD3DVolumeTexture */
Oliver Stieberba5eb142005-03-14 10:12:52 +0000761 IWineD3DVolume *volumes[MAX_LEVELS];
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000762
763 UINT width;
764 UINT height;
765 UINT depth;
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000766} IWineD3DVolumeTextureImpl;
767
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000768extern const IWineD3DVolumeTextureVtbl IWineD3DVolumeTexture_Vtbl;
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000769
Oliver Stieber2121f782005-03-02 12:16:10 +0000770typedef struct _WINED3DSURFACET_DESC
771{
Oliver Stieber2121f782005-03-02 12:16:10 +0000772 D3DMULTISAMPLE_TYPE MultiSampleType;
773 DWORD MultiSampleQuality;
774 UINT Width;
775 UINT Height;
776} WINED3DSURFACET_DESC;
777
Jason Edmeadesbcecddc2005-01-17 13:44:57 +0000778/*****************************************************************************
Jason Edmeades41427852005-01-09 17:37:02 +0000779 * IWineD3DSurface implementation structure
780 */
781struct IWineD3DSurfaceImpl
782{
783 /* IUnknown & IWineD3DResource Information */
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000784 const IWineD3DSurfaceVtbl *lpVtbl;
Jason Edmeades41427852005-01-09 17:37:02 +0000785 IWineD3DResourceClass resource;
786
787 /* IWineD3DSurface fields */
788 IUnknown *container;
Oliver Stieber2121f782005-03-02 12:16:10 +0000789 WINED3DSURFACET_DESC currentDesc;
Jason Edmeades41427852005-01-09 17:37:02 +0000790
791 UINT textureName;
792 UINT bytesPerPixel;
Oliver Stieber520c2f02005-07-11 14:25:54 +0000793
794 /* TODO: move this off into a management class(maybe!) */
795 BOOL nonpow2;
796
797 UINT pow2Width;
798 UINT pow2Height;
799 UINT pow2Size;
800
Oliver Stiebere31bc6c2005-08-03 19:49:05 +0000801#if 0
Oliver Stieber520c2f02005-07-11 14:25:54 +0000802 /* precalculated x and y scalings for texture coords */
803 float pow2scalingFactorX; /* = (Width / pow2Width ) */
804 float pow2scalingFactorY; /* = (Height / pow2Height) */
Oliver Stiebere31bc6c2005-08-03 19:49:05 +0000805#endif
Oliver Stieber520c2f02005-07-11 14:25:54 +0000806
Jason Edmeades41427852005-01-09 17:37:02 +0000807 BOOL lockable;
Oliver Stieber2121f782005-03-02 12:16:10 +0000808 BOOL discard;
Jason Edmeades41427852005-01-09 17:37:02 +0000809 BOOL locked;
Oliver Stieber6a032492005-07-13 11:34:55 +0000810 BOOL activeLock;
Oliver Stieber2121f782005-03-02 12:16:10 +0000811
Jason Edmeades41427852005-01-09 17:37:02 +0000812 RECT lockedRect;
813 RECT dirtyRect;
814 BOOL Dirty;
Oliver Stieber2121f782005-03-02 12:16:10 +0000815
Jason Edmeades41427852005-01-09 17:37:02 +0000816 BOOL inTexture;
817 BOOL inPBuffer;
Oliver Stieber13621052005-07-11 20:38:27 +0000818
819 glDescriptor glDescription;
Jason Edmeades41427852005-01-09 17:37:02 +0000820};
821
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000822extern const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl;
Jason Edmeades41427852005-01-09 17:37:02 +0000823
824/*****************************************************************************
Raphael Junqueira4f02b522005-01-19 19:34:49 +0000825 * IWineD3DVertexDeclaration implementation structure
826 */
827typedef struct IWineD3DVertexDeclarationImpl {
828 /* IUnknown Information */
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000829 const IWineD3DVertexDeclarationVtbl *lpVtbl;
Mike McCormack8955ac42005-07-28 10:16:21 +0000830 LONG ref; /* Note: Ref counting not required */
Raphael Junqueira4f02b522005-01-19 19:34:49 +0000831
Oliver Stieber2121f782005-03-02 12:16:10 +0000832 IUnknown *parent;
Raphael Junqueira4f02b522005-01-19 19:34:49 +0000833 /** precomputed fvf if simple declaration */
834 IWineD3DDeviceImpl *wineD3DDevice;
835 DWORD fvf[MAX_STREAMS];
836 DWORD allFVF;
837
838 /** dx8 compatible Declaration fields */
839 DWORD* pDeclaration8;
840 DWORD declaration8Length;
841
842 /** dx9+ */
843 D3DVERTEXELEMENT9* pDeclaration9;
844 UINT declaration9NumElements;
845} IWineD3DVertexDeclarationImpl;
846
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000847extern const IWineD3DVertexDeclarationVtbl IWineD3DVertexDeclaration_Vtbl;
Raphael Junqueira4f02b522005-01-19 19:34:49 +0000848
849/*****************************************************************************
Jason Edmeades447d5ed2004-10-21 20:59:12 +0000850 * IWineD3DStateBlock implementation structure
851 */
852
853/* Internal state Block for Begin/End/Capture/Create/Apply info */
854/* Note: Very long winded but gl Lists are not flexible enough */
855/* to resolve everything we need, so doing it manually for now */
856typedef struct SAVEDSTATES {
Jason Edmeadesf738c142004-12-09 11:42:34 +0000857 BOOL indices;
Jason Edmeades0a944ae2004-11-29 17:53:42 +0000858 BOOL material;
Jason Edmeades447d5ed2004-10-21 20:59:12 +0000859 BOOL fvf;
Oliver Stieberabb11f32005-07-05 14:05:18 +0000860 BOOL streamSource[MAX_STREAMS];
861 BOOL streamFreq[MAX_STREAMS];
862 BOOL textures[MAX_TEXTURES];
863 BOOL transform[HIGHEST_TRANSFORMSTATE + 1];
Jason Edmeadesf738c142004-12-09 11:42:34 +0000864 BOOL viewport;
Oliver Stieberabb11f32005-07-05 14:05:18 +0000865 BOOL renderState[WINEHIGHEST_RENDER_STATE + 1];
Oliver Stieber7cb748f2005-07-26 18:49:30 +0000866 BOOL textureState[MAX_TEXTURES][WINED3D_HIGHEST_TEXTURE_STATE + 1];
Oliver Stieber7cb748f2005-07-26 18:49:30 +0000867 BOOL samplerState[MAX_SAMPLERS][WINED3D_HIGHEST_SAMPLER_STATE + 1];
Oliver Stieberd3441622005-08-01 10:58:31 +0000868 BOOL clipplane[MAX_CLIPPLANES];
Raphael Junqueira4c385f92005-01-26 20:54:00 +0000869 BOOL vertexDecl;
Oliver Stieber2121f782005-03-02 12:16:10 +0000870 BOOL pixelShader;
Oliver Stieberabb11f32005-07-05 14:05:18 +0000871 BOOL vertexShader;
Oliver Stieber0c2fcf22005-09-21 10:19:29 +0000872 BOOL vertexShaderConstants[MAX_VSHADER_CONSTANTS];
Jason Edmeades447d5ed2004-10-21 20:59:12 +0000873} SAVEDSTATES;
874
Oliver Stieber0c2fcf22005-09-21 10:19:29 +0000875typedef enum {
876 WINESHADERCNST_FLOAT = 0,
877 WINESHADERCNST_INTEGER = 1,
878 WINESHADERCNST_BOOL = 2
879} WINESHADERCNST;
880
Jason Edmeades447d5ed2004-10-21 20:59:12 +0000881struct IWineD3DStateBlockImpl
882{
883 /* IUnknown fields */
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000884 const IWineD3DStateBlockVtbl *lpVtbl;
Mike McCormack8955ac42005-07-28 10:16:21 +0000885 LONG ref; /* Note: Ref counting not required */
Oliver Stieberabb11f32005-07-05 14:05:18 +0000886
Jason Edmeades447d5ed2004-10-21 20:59:12 +0000887 /* IWineD3DStateBlock information */
Jason Edmeades289562e2004-11-23 13:52:46 +0000888 IUnknown *parent;
Jason Edmeades41427852005-01-09 17:37:02 +0000889 IWineD3DDeviceImpl *wineD3DDevice;
Oliver Stieber7cb748f2005-07-26 18:49:30 +0000890 WINED3DSTATEBLOCKTYPE blockType;
Jason Edmeades447d5ed2004-10-21 20:59:12 +0000891
892 /* Array indicating whether things have been set or changed */
893 SAVEDSTATES changed;
894 SAVEDSTATES set;
Oliver Stieberabb11f32005-07-05 14:05:18 +0000895
Jason Edmeades447d5ed2004-10-21 20:59:12 +0000896 /* Drawing - Vertex Shader or FVF related */
897 DWORD fvf;
Raphael Junqueira4f02b522005-01-19 19:34:49 +0000898 /* Vertex Shader Declaration */
Oliver Stieber2c0e97e2005-08-17 11:34:03 +0000899 IWineD3DVertexDeclaration *vertexDecl;
Raphael Junqueira4f02b522005-01-19 19:34:49 +0000900
Oliver Stieber2c0e97e2005-08-17 11:34:03 +0000901 IWineD3DVertexShader *vertexShader; /* @TODO: Replace void * with IWineD3DVertexShader * */
Jason Edmeades447d5ed2004-10-21 20:59:12 +0000902
Oliver Stieber9b0b8032005-08-17 10:27:01 +0000903 /* Vertex Shader Constants */
904 BOOL vertexShaderConstantB[MAX_VSHADER_CONSTANTS];
Mike McCormack93ab6952005-08-26 08:53:31 +0000905 INT vertexShaderConstantI[MAX_VSHADER_CONSTANTS * 4];
Oliver Stieber9b0b8032005-08-17 10:27:01 +0000906 float vertexShaderConstantF[MAX_VSHADER_CONSTANTS * 4];
Oliver Stieber0c2fcf22005-09-21 10:19:29 +0000907 WINESHADERCNST vertexShaderConstantT[MAX_VSHADER_CONSTANTS]; /* TODO: Think about changing this to a char to possibly save a little memory */
Oliver Stieber9b0b8032005-08-17 10:27:01 +0000908
Oliver Stieber0c2fcf22005-09-21 10:19:29 +0000909 BOOL softwareVertexProcessing;
Oliver Stieber313b0102005-08-11 10:31:40 +0000910
Jason Edmeades289562e2004-11-23 13:52:46 +0000911 /* Stream Source */
Raphael Junqueira4f02b522005-01-19 19:34:49 +0000912 BOOL streamIsUP;
Oliver Stieberabb11f32005-07-05 14:05:18 +0000913 UINT streamStride[MAX_STREAMS];
914 UINT streamOffset[MAX_STREAMS];
915 IWineD3DVertexBuffer *streamSource[MAX_STREAMS];
916 UINT streamFreq[MAX_STREAMS];
917 UINT streamFlags[MAX_STREAMS]; /*0 | D3DSTREAMSOURCE_INSTANCEDATA | D3DSTREAMSOURCE_INDEXEDDATA */
Jason Edmeadeseba27af2004-11-28 15:04:41 +0000918
Jason Edmeadesf738c142004-12-09 11:42:34 +0000919 /* Indices */
920 IWineD3DIndexBuffer* pIndexData;
921 UINT baseVertexIndex; /* Note: only used for d3d8 */
922
Jason Edmeadeseba27af2004-11-28 15:04:41 +0000923 /* Transform */
Oliver Stieberabb11f32005-07-05 14:05:18 +0000924 D3DMATRIX transforms[HIGHEST_TRANSFORMSTATE + 1];
Jason Edmeadeseba27af2004-11-28 15:04:41 +0000925
Jason Edmeades0a944ae2004-11-29 17:53:42 +0000926 /* Lights */
927 PLIGHTINFOEL *lights; /* NOTE: active GL lights must be front of the chain */
Oliver Stieberabb11f32005-07-05 14:05:18 +0000928
Jason Edmeades0a944ae2004-11-29 17:53:42 +0000929 /* Clipping */
930 double clipplane[MAX_CLIPPLANES][4];
931 WINED3DCLIPSTATUS clip_status;
932
Jason Edmeadesf738c142004-12-09 11:42:34 +0000933 /* ViewPort */
934 WINED3DVIEWPORT viewport;
935
Jason Edmeades0a944ae2004-11-29 17:53:42 +0000936 /* Material */
937 WINED3DMATERIAL material;
938
Oliver Stieberabb11f32005-07-05 14:05:18 +0000939 /* Pixel Shader */
Oliver Stieber2af36c62005-08-25 19:24:21 +0000940 IWineD3DPixelShader *pixelShader; /* TODO: Replace void * with IWineD3DPixelShader */
941
942 /* Pixel Shader Constants */
943 BOOL pixelShaderConstantB[MAX_PSHADER_CONSTANTS];
944 UINT pixelShaderConstantI[MAX_PSHADER_CONSTANTS * 4];
945 float pixelShaderConstantF[MAX_PSHADER_CONSTANTS * 4];
Oliver Stieberabb11f32005-07-05 14:05:18 +0000946
Jason Edmeades2003c7a2004-12-13 13:35:38 +0000947 /* Indexed Vertex Blending */
948 D3DVERTEXBLENDFLAGS vertex_blend;
949 FLOAT tween_factor;
950
951 /* RenderState */
Oliver Stieberabb11f32005-07-05 14:05:18 +0000952 DWORD renderState[WINEHIGHEST_RENDER_STATE + 1];
Jason Edmeades2003c7a2004-12-13 13:35:38 +0000953
Jason Edmeadesf738c142004-12-09 11:42:34 +0000954 /* Texture */
Oliver Stieberabb11f32005-07-05 14:05:18 +0000955 IWineD3DBaseTexture *textures[MAX_TEXTURES];
956 int textureDimensions[MAX_SAMPLERS];
Jason Edmeades2003c7a2004-12-13 13:35:38 +0000957
958 /* Texture State Stage */
Oliver Stieber7cb748f2005-07-26 18:49:30 +0000959 DWORD textureState[MAX_TEXTURES][WINED3D_HIGHEST_TEXTURE_STATE + 1];
Oliver Stieber18857f12005-06-24 11:53:07 +0000960 /* Sampler States */
Oliver Stieber7cb748f2005-07-26 18:49:30 +0000961 DWORD samplerState[MAX_SAMPLERS][WINED3D_HIGHEST_SAMPLER_STATE + 1];
Oliver Stieber18857f12005-06-24 11:53:07 +0000962
Jason Edmeades447d5ed2004-10-21 20:59:12 +0000963};
964
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000965extern const IWineD3DStateBlockVtbl IWineD3DStateBlock_Vtbl;
Jason Edmeades447d5ed2004-10-21 20:59:12 +0000966
967/*****************************************************************************
Oliver Stieber7b261652005-03-03 13:57:15 +0000968 * IWineD3DQueryImpl implementation structure (extends IUnknown)
969 */
970typedef struct IWineD3DQueryImpl
971{
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000972 const IWineD3DQueryVtbl *lpVtbl;
Mike McCormack8955ac42005-07-28 10:16:21 +0000973 LONG ref; /* Note: Ref counting not required */
Oliver Stieber7b261652005-03-03 13:57:15 +0000974
975 IUnknown *parent;
976 /*TODO: replace with iface usage */
977#if 0
978 IWineD3DDevice *wineD3DDevice;
979#else
980 IWineD3DDeviceImpl *wineD3DDevice;
981#endif
982 /* IWineD3DQuery fields */
983
984 D3DQUERYTYPE type;
Oliver Stieber5ea96a82005-09-21 09:43:13 +0000985 /* TODO: Think about using a IUnknown instead of a void* */
Oliver Stieber7b261652005-03-03 13:57:15 +0000986 void *extendedData;
987
988
989} IWineD3DQueryImpl;
990
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +0000991extern const IWineD3DQueryVtbl IWineD3DQuery_Vtbl;
Oliver Stieber7b261652005-03-03 13:57:15 +0000992
Oliver Stieber5ea96a82005-09-21 09:43:13 +0000993/* Datastructures for IWineD3DQueryImpl.extendedData */
994typedef struct WineQueryOcclusionData {
995 unsigned int queryId;
996} WineQueryOcclusionData;
997
998
Oliver Stieber7b261652005-03-03 13:57:15 +0000999/*****************************************************************************
Oliver Stieber46e7c302005-06-23 11:05:24 +00001000 * IWineD3DSwapChainImpl implementation structure (extends IUnknown)
1001 */
1002
1003typedef struct IWineD3DSwapChainImpl
1004{
1005 /*IUnknown part*/
1006 IWineD3DSwapChainVtbl *lpVtbl;
Mike McCormack8955ac42005-07-28 10:16:21 +00001007 LONG ref; /* Note: Ref counting not required */
Oliver Stieber46e7c302005-06-23 11:05:24 +00001008
1009 IUnknown *parent;
1010 IWineD3DDeviceImpl *wineD3DDevice;
1011
1012 /* IWineD3DSwapChain fields */
1013 IWineD3DSurface *backBuffer;
1014 IWineD3DSurface *frontBuffer;
1015 BOOL wantsDepthStencilBuffer;
1016 D3DPRESENT_PARAMETERS presentParms;
1017
1018 /* TODO: move everything upto drawable off into a context manager
1019 and store the 'data' in the contextManagerData interface.
1020 IUnknown *contextManagerData;
1021 */
1022
1023 HWND win_handle;
1024 Window win;
1025 Display *display;
1026
1027 GLXContext glCtx;
1028 XVisualInfo *visInfo;
1029 GLXContext render_ctx;
Francois Gouget02c25a82005-06-30 18:19:33 +00001030 /* This has been left in device for now, but needs moving off into a rendertarget management class and separated out from swapchains and devices. */
Oliver Stieber46e7c302005-06-23 11:05:24 +00001031 Drawable drawable;
1032} IWineD3DSwapChainImpl;
1033
1034extern IWineD3DSwapChainVtbl IWineD3DSwapChain_Vtbl;
1035
1036/*****************************************************************************
Jason Edmeades447d5ed2004-10-21 20:59:12 +00001037 * Utility function prototypes
1038 */
Jason Edmeades2003c7a2004-12-13 13:35:38 +00001039
1040/* Trace routines */
Oliver Stieberb220ce12005-07-13 19:38:39 +00001041const char* debug_d3dformat(WINED3DFORMAT fmt);
Jason Edmeadesc579fa62004-10-05 02:14:06 +00001042const char* debug_d3ddevicetype(D3DDEVTYPE devtype);
1043const char* debug_d3dresourcetype(D3DRESOURCETYPE res);
1044const char* debug_d3dusage(DWORD usage);
Jason Edmeadesf738c142004-12-09 11:42:34 +00001045const char* debug_d3dprimitivetype(D3DPRIMITIVETYPE PrimitiveType);
Jason Edmeades2003c7a2004-12-13 13:35:38 +00001046const char* debug_d3drenderstate(DWORD state);
1047const char* debug_d3dtexturestate(DWORD state);
Jason Edmeadesbcecddc2005-01-17 13:44:57 +00001048const char* debug_d3dpool(D3DPOOL pool);
Jason Edmeades2003c7a2004-12-13 13:35:38 +00001049
1050/* Routines for GL <-> D3D values */
1051GLenum StencilOp(DWORD op);
1052void set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, D3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3);
Oliver Stieber052d1082005-07-26 20:01:29 +00001053void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords);
Jason Edmeades2003c7a2004-12-13 13:35:38 +00001054void GetSrcAndOpFromValue(DWORD iValue, BOOL isAlphaArg, GLenum* source, GLenum* operand);
Jason Edmeadesae5a4362004-09-28 02:12:12 +00001055
Jason Edmeades41427852005-01-09 17:37:02 +00001056SHORT D3DFmtGetBpp(IWineD3DDeviceImpl* This, D3DFORMAT fmt);
1057GLenum D3DFmt2GLFmt(IWineD3DDeviceImpl* This, D3DFORMAT fmt);
1058GLenum D3DFmt2GLType(IWineD3DDeviceImpl *This, D3DFORMAT fmt);
1059GLint D3DFmt2GLIntFmt(IWineD3DDeviceImpl* This, D3DFORMAT fmt);
1060
Oliver Stieber8a6799d2005-07-07 20:35:05 +00001061int D3DFmtMakeGlCfg(D3DFORMAT BackBufferFormat, D3DFORMAT StencilBufferFormat, int *attribs, int* nAttribs, BOOL alternate);
1062
1063
Jason Edmeadesbcecddc2005-01-17 13:44:57 +00001064/*****************************************************************************
1065 * To enable calling of inherited functions, requires prototypes
Jason Edmeades33025b22005-01-18 11:42:29 +00001066 *
1067 * Note: Only require classes which are subclassed, ie resource, basetexture,
Jason Edmeadesbcecddc2005-01-17 13:44:57 +00001068 */
1069 /*** IUnknown methods ***/
Jason Edmeadesbcecddc2005-01-17 13:44:57 +00001070 extern HRESULT WINAPI IWineD3DResourceImpl_QueryInterface(IWineD3DResource *iface, REFIID riid, void** ppvObject);
1071 extern ULONG WINAPI IWineD3DResourceImpl_AddRef(IWineD3DResource *iface);
1072 extern ULONG WINAPI IWineD3DResourceImpl_Release(IWineD3DResource *iface);
1073 /*** IWineD3DResource methods ***/
1074 extern HRESULT WINAPI IWineD3DResourceImpl_GetParent(IWineD3DResource *iface, IUnknown **pParent);
1075 extern HRESULT WINAPI IWineD3DResourceImpl_GetDevice(IWineD3DResource *iface, IWineD3DDevice ** ppDevice);
1076 extern HRESULT WINAPI IWineD3DResourceImpl_SetPrivateData(IWineD3DResource *iface, REFGUID refguid, CONST void * pData, DWORD SizeOfData, DWORD Flags);
1077 extern HRESULT WINAPI IWineD3DResourceImpl_GetPrivateData(IWineD3DResource *iface, REFGUID refguid, void * pData, DWORD * pSizeOfData);
1078 extern HRESULT WINAPI IWineD3DResourceImpl_FreePrivateData(IWineD3DResource *iface, REFGUID refguid);
1079 extern DWORD WINAPI IWineD3DResourceImpl_SetPriority(IWineD3DResource *iface, DWORD PriorityNew);
1080 extern DWORD WINAPI IWineD3DResourceImpl_GetPriority(IWineD3DResource *iface);
1081 extern void WINAPI IWineD3DResourceImpl_PreLoad(IWineD3DResource *iface);
1082 extern D3DRESOURCETYPE WINAPI IWineD3DResourceImpl_GetType(IWineD3DResource *iface);
Oliver Stieber67f2ad42005-03-29 19:01:00 +00001083 /*** class static members ***/
1084 void IWineD3DResourceImpl_CleanUp(IWineD3DResource *iface);
Jason Edmeadesbcecddc2005-01-17 13:44:57 +00001085
1086 /*** IUnknown methods ***/
1087 extern HRESULT WINAPI IWineD3DBaseTextureImpl_QueryInterface(IWineD3DBaseTexture *iface, REFIID riid, void** ppvObject);
1088 extern ULONG WINAPI IWineD3DBaseTextureImpl_AddRef(IWineD3DBaseTexture *iface);
1089 extern ULONG WINAPI IWineD3DBaseTextureImpl_Release(IWineD3DBaseTexture *iface);
1090 /*** IWineD3DResource methods ***/
1091 extern HRESULT WINAPI IWineD3DBaseTextureImpl_GetParent(IWineD3DBaseTexture *iface, IUnknown **pParent);
1092 extern HRESULT WINAPI IWineD3DBaseTextureImpl_GetDevice(IWineD3DBaseTexture *iface, IWineD3DDevice ** ppDevice);
1093 extern HRESULT WINAPI IWineD3DBaseTextureImpl_SetPrivateData(IWineD3DBaseTexture *iface, REFGUID refguid, CONST void * pData, DWORD SizeOfData, DWORD Flags);
1094 extern HRESULT WINAPI IWineD3DBaseTextureImpl_GetPrivateData(IWineD3DBaseTexture *iface, REFGUID refguid, void * pData, DWORD * pSizeOfData);
1095 extern HRESULT WINAPI IWineD3DBaseTextureImpl_FreePrivateData(IWineD3DBaseTexture *iface, REFGUID refguid);
1096 extern DWORD WINAPI IWineD3DBaseTextureImpl_SetPriority(IWineD3DBaseTexture *iface, DWORD PriorityNew);
1097 extern DWORD WINAPI IWineD3DBaseTextureImpl_GetPriority(IWineD3DBaseTexture *iface);
1098 extern void WINAPI IWineD3DBaseTextureImpl_PreLoad(IWineD3DBaseTexture *iface);
1099 extern D3DRESOURCETYPE WINAPI IWineD3DBaseTextureImpl_GetType(IWineD3DBaseTexture *iface);
1100 /*** IWineD3DBaseTexture methods ***/
1101 extern DWORD WINAPI IWineD3DBaseTextureImpl_SetLOD(IWineD3DBaseTexture *iface, DWORD LODNew);
1102 extern DWORD WINAPI IWineD3DBaseTextureImpl_GetLOD(IWineD3DBaseTexture *iface);
1103 extern DWORD WINAPI IWineD3DBaseTextureImpl_GetLevelCount(IWineD3DBaseTexture *iface);
1104 extern HRESULT WINAPI IWineD3DBaseTextureImpl_SetAutoGenFilterType(IWineD3DBaseTexture *iface, D3DTEXTUREFILTERTYPE FilterType);
1105 extern D3DTEXTUREFILTERTYPE WINAPI IWineD3DBaseTextureImpl_GetAutoGenFilterType(IWineD3DBaseTexture *iface);
1106 extern void WINAPI IWineD3DBaseTextureImpl_GenerateMipSubLevels(IWineD3DBaseTexture *iface);
1107 extern BOOL WINAPI IWineD3DBaseTextureImpl_SetDirty(IWineD3DBaseTexture *iface, BOOL);
1108 extern BOOL WINAPI IWineD3DBaseTextureImpl_GetDirty(IWineD3DBaseTexture *iface);
Raphael Junqueiracc8762a2005-07-24 17:11:33 +00001109
1110 extern BYTE* WINAPI IWineD3DVertexBufferImpl_GetMemory(IWineD3DVertexBuffer* iface, DWORD iOffset);
1111 extern HRESULT WINAPI IWineD3DVertexBufferImpl_ReleaseMemory(IWineD3DVertexBuffer* iface);
Oliver Stieber67f2ad42005-03-29 19:01:00 +00001112 extern HRESULT WINAPI IWineD3DBaseTextureImpl_BindTexture(IWineD3DBaseTexture *iface);
1113 extern HRESULT WINAPI IWineD3DBaseTextureImpl_UnBindTexture(IWineD3DBaseTexture *iface);
Oliver Stieberbb6f9b02005-08-03 11:00:28 +00001114 extern void WINAPI IWineD3DBaseTextureImpl_ApplyStateChanges(IWineD3DBaseTexture *iface, const DWORD textureStates[WINED3D_HIGHEST_TEXTURE_STATE + 1], const DWORD samplerStates[WINED3D_HIGHEST_SAMPLER_STATE + 1]);
Oliver Stieber67f2ad42005-03-29 19:01:00 +00001115 /*** class static members ***/
1116 void IWineD3DBaseTextureImpl_CleanUp(IWineD3DBaseTexture *iface);
Jason Edmeades41427852005-01-09 17:37:02 +00001117
Oliver Stieber2c0e97e2005-08-17 11:34:03 +00001118/* an emul for the type of constants that are used... adressing causes problems with being able to work out what's used and what's not.. so maybe we'll have to rely on the server vertex shader const functions? */
1119enum vsConstantsEnum {
1120 VS_CONSTANT_NOT_USED = 0,
1121 VS_CONSTANT_CONSTANT,
1122 VS_CONSTANT_INTEGER,
1123 VS_CONSTANT_BOOLEAN,
1124 VS_CONSTANT_FLOAT
1125};
1126
Raphael Junqueira01968612003-11-14 03:50:35 +00001127/*****************************************************************************
1128 * IDirect3DVertexShader implementation structure
1129 */
Oliver Stieber2121f782005-03-02 12:16:10 +00001130typedef struct IWineD3DVertexShaderImpl {
1131 /* IUnknown parts*/
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +00001132 const IWineD3DVertexShaderVtbl *lpVtbl;
Mike McCormack8955ac42005-07-28 10:16:21 +00001133 LONG ref; /* Note: Ref counting not required */
Raphael Junqueira01968612003-11-14 03:50:35 +00001134
Oliver Stieber2121f782005-03-02 12:16:10 +00001135 IUnknown *parent;
1136 IWineD3DDeviceImpl *wineD3DDevice;
Raphael Junqueira01968612003-11-14 03:50:35 +00001137
Oliver Stieber2c0e97e2005-08-17 11:34:03 +00001138 /* IWineD3DVertexShaderImpl */
Oliver Stieber2121f782005-03-02 12:16:10 +00001139 CONST DWORD *function;
1140 UINT functionLength;
1141
Oliver Stieber80cbb932005-08-17 09:54:54 +00001142 DWORD usage;
1143 DWORD version;
Oliver Stieber2c0e97e2005-08-17 11:34:03 +00001144
1145 /* vertex declaration array mapping */
1146 BOOL namedArrays; /* don't map use named functions */
1147 BOOL declaredArrays; /* mapping requires */
1148 INT arrayUsageMap[WINED3DSHADERDECLUSAGE_MAX_USAGE]; /* lookup table for the maps */
1149 INT highestConstant;
1150 CHAR constantsUsedBitmap[256];
1151 /* FIXME: This needs to be populated with some flags of VS_CONSTANT_NOT_USED, VS_CONSTANT_CONSTANT, VS_CONSTANT_INTEGER, VS_CONSTANT_BOOLEAN, VS_CONSTANT_FLOAT, a half byte bitmap will be the best option, but I'll keep it as chards for siplicity */
Oliver Stieber80cbb932005-08-17 09:54:54 +00001152 /* run time datas... */
1153 VSHADERDATA* data;
Mike McCormack93ab6952005-08-26 08:53:31 +00001154 GLuint prgId;
Oliver Stieber2121f782005-03-02 12:16:10 +00001155#if 0 /* needs reworking */
Oliver Stieber2121f782005-03-02 12:16:10 +00001156 /* run time datas */
Oliver Stieber2121f782005-03-02 12:16:10 +00001157 VSHADERINPUTDATA input;
1158 VSHADEROUTPUTDATA output;
1159#endif
1160} IWineD3DVertexShaderImpl;
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +00001161extern const IWineD3DVertexShaderVtbl IWineD3DVertexShader_Vtbl;
Raphael Junqueira01968612003-11-14 03:50:35 +00001162
1163/*****************************************************************************
1164 * IDirect3DPixelShader implementation structure
1165 */
Oliver Stieber2121f782005-03-02 12:16:10 +00001166typedef struct IWineD3DPixelShaderImpl {
1167 /* IUnknown parts*/
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +00001168 const IWineD3DPixelShaderVtbl *lpVtbl;
Mike McCormack8955ac42005-07-28 10:16:21 +00001169 LONG ref; /* Note: Ref counting not required */
Oliver Stieber2121f782005-03-02 12:16:10 +00001170
1171 IUnknown *parent;
1172 IWineD3DDeviceImpl *wineD3DDevice;
Raphael Junqueira01968612003-11-14 03:50:35 +00001173
Oliver Stieber2121f782005-03-02 12:16:10 +00001174
Oliver Stieber80cbb932005-08-17 09:54:54 +00001175 /* IWineD3DPixelShaderImpl */
Oliver Stieber2121f782005-03-02 12:16:10 +00001176 CONST DWORD *function;
1177 UINT functionLength;
Oliver Stieber80cbb932005-08-17 09:54:54 +00001178
Oliver Stieber2121f782005-03-02 12:16:10 +00001179#if 0 /* needs reworking */
Oliver Stieber2121f782005-03-02 12:16:10 +00001180 /* run time datas */
1181 PSHADERDATA* data;
1182 PSHADERINPUTDATA input;
1183 PSHADEROUTPUTDATA output;
1184#endif
1185} IWineD3DPixelShaderImpl;
1186
Dmitry Timoshkoveba47f12005-06-06 19:50:35 +00001187extern const IWineD3DPixelShaderVtbl IWineD3DPixelShader_Vtbl;
Raphael Junqueira01968612003-11-14 03:50:35 +00001188#endif