Raphael Junqueira | 0196861 | 2003-11-14 03:50:35 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Direct3D wine internal private include file |
| 3 | * |
| 4 | * Copyright 2002-2003 The wine-d3d team |
| 5 | * Copyright 2002-2003 Raphael Junqueira |
Oliver Stieber | 46e7c30 | 2005-06-23 11:05:24 +0000 | [diff] [blame] | 6 | * Copyright 2004 Jason Edmeades |
| 7 | * Copyright 2005 Oliver Stieber |
Raphael Junqueira | 0196861 | 2003-11-14 03:50:35 +0000 | [diff] [blame] | 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., 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 Edmeades | 0a944ae | 2004-11-29 17:53:42 +0000 | [diff] [blame] | 28 | #include <math.h> |
Jason Edmeades | 24ab49e | 2004-09-23 04:34:27 +0000 | [diff] [blame] | 29 | #define NONAMELESSUNION |
| 30 | #define NONAMELESSSTRUCT |
Jason Edmeades | 289562e | 2004-11-23 13:52:46 +0000 | [diff] [blame] | 31 | #define COBJMACROS |
Raphael Junqueira | 0196861 | 2003-11-14 03:50:35 +0000 | [diff] [blame] | 32 | #include "windef.h" |
| 33 | #include "winbase.h" |
Jason Edmeades | 24ab49e | 2004-09-23 04:34:27 +0000 | [diff] [blame] | 34 | #include "winreg.h" |
Raphael Junqueira | 0196861 | 2003-11-14 03:50:35 +0000 | [diff] [blame] | 35 | #include "wingdi.h" |
| 36 | #include "winuser.h" |
| 37 | #include "wine/debug.h" |
Jason Edmeades | b9e2bed | 2004-10-08 20:52:33 +0000 | [diff] [blame] | 38 | #include "wine/unicode.h" |
Raphael Junqueira | 0196861 | 2003-11-14 03:50:35 +0000 | [diff] [blame] | 39 | |
Jason Edmeades | 24ab49e | 2004-09-23 04:34:27 +0000 | [diff] [blame] | 40 | #include "d3d9.h" |
| 41 | #include "d3d9types.h" |
Raphael Junqueira | 0196861 | 2003-11-14 03:50:35 +0000 | [diff] [blame] | 42 | #include "wine/wined3d_interface.h" |
Jason Edmeades | c3421ea | 2004-09-29 21:26:47 +0000 | [diff] [blame] | 43 | #include "wine/wined3d_gl.h" |
Raphael Junqueira | 0196861 | 2003-11-14 03:50:35 +0000 | [diff] [blame] | 44 | |
Oliver Stieber | 18857f1 | 2005-06-24 11:53:07 +0000 | [diff] [blame] | 45 | /* Device caps */ |
Oliver Stieber | abb11f3 | 2005-07-05 14:05:18 +0000 | [diff] [blame] | 46 | #define MAX_PALETTES 256 |
| 47 | #define MAX_STREAMS 16 |
| 48 | #define MAX_TEXTURES 8 |
Oliver Stieber | 18857f1 | 2005-06-24 11:53:07 +0000 | [diff] [blame] | 49 | #define MAX_SAMPLERS 16 |
Oliver Stieber | abb11f3 | 2005-07-05 14:05:18 +0000 | [diff] [blame] | 50 | #define MAX_ACTIVE_LIGHTS 8 |
| 51 | #define MAX_CLIPPLANES D3DMAXUSERCLIPPLANES |
| 52 | #define MAX_LEVELS 256 |
Oliver Stieber | 18857f1 | 2005-06-24 11:53:07 +0000 | [diff] [blame] | 53 | |
Oliver Stieber | 9b0b803 | 2005-08-17 10:27:01 +0000 | [diff] [blame] | 54 | #define MAX_VSHADER_CONSTANTS 96 |
Oliver Stieber | 2af36c6 | 2005-08-25 19:24:21 +0000 | [diff] [blame] | 55 | #define MAX_PSHADER_CONSTANTS 32 |
Oliver Stieber | 9b0b803 | 2005-08-17 10:27:01 +0000 | [diff] [blame] | 56 | |
Oliver Stieber | abb11f3 | 2005-07-05 14:05:18 +0000 | [diff] [blame] | 57 | /* 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 | |
| 65 | extern const DWORD SavedPixelStates_R[NUM_SAVEDPIXELSTATES_R]; |
| 66 | extern const DWORD SavedPixelStates_T[NUM_SAVEDPIXELSTATES_T]; |
| 67 | extern const DWORD SavedPixelStates_S[NUM_SAVEDPIXELSTATES_S]; |
| 68 | extern const DWORD SavedVertexStates_R[NUM_SAVEDVERTEXSTATES_R]; |
| 69 | extern const DWORD SavedVertexStates_T[NUM_SAVEDVERTEXSTATES_T]; |
| 70 | extern const DWORD SavedVertexStates_S[NUM_SAVEDVERTEXSTATES_S]; |
| 71 | |
Oliver Stieber | bb6f9b0 | 2005-08-03 11:00:28 +0000 | [diff] [blame] | 72 | typedef enum _WINELOOKUP { |
| 73 | WINELOOKUP_WARPPARAM = 0, |
| 74 | WINELOOKUP_MAGFILTER = 1, |
| 75 | MAX_LOOKUPS = 2 |
| 76 | } WINELOOKUP; |
| 77 | |
| 78 | extern int minLookup[MAX_LOOKUPS]; |
| 79 | extern int maxLookup[MAX_LOOKUPS]; |
| 80 | extern DWORD *stateLookup[MAX_LOOKUPS]; |
| 81 | |
| 82 | extern DWORD minMipLookup[D3DTEXF_ANISOTROPIC + 1][D3DTEXF_LINEAR + 1]; |
| 83 | |
Oliver Stieber | bb6f9b0 | 2005-08-03 11:00:28 +0000 | [diff] [blame] | 84 | /* NOTE: Make sure these are in the correct numerical order. (see /include/d3d9types.h typedef enum _D3DDECLTYPE) */ |
| 85 | UINT 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 Stieber | 1be54d8 | 2005-08-19 10:05:00 +0000 | [diff] [blame] | 107 | #define WINED3D_ATR_NORMALIZED(_attribute) glTypeLookup[sd->u.s._attribute.dwType][3] |
Oliver Stieber | bb6f9b0 | 2005-08-03 11:00:28 +0000 | [diff] [blame] | 108 | #define WINED3D_ATR_TYPESIZE(_attribute) glTypeLookup[sd->u.s._attribute.dwType][4] |
Oliver Stieber | bb6f9b0 | 2005-08-03 11:00:28 +0000 | [diff] [blame] | 109 | |
Raphael Junqueira | cc8762a | 2005-07-24 17:11:33 +0000 | [diff] [blame] | 110 | /** |
| 111 | * Settings |
| 112 | */ |
Jason Edmeades | 24ab49e | 2004-09-23 04:34:27 +0000 | [diff] [blame] | 113 | #define VS_NONE 0 |
| 114 | #define VS_HW 1 |
| 115 | #define VS_SW 2 |
Raphael Junqueira | 0196861 | 2003-11-14 03:50:35 +0000 | [diff] [blame] | 116 | |
Jason Edmeades | 24ab49e | 2004-09-23 04:34:27 +0000 | [diff] [blame] | 117 | #define PS_NONE 0 |
| 118 | #define PS_HW 1 |
| 119 | |
Raphael Junqueira | cc8762a | 2005-07-24 17:11:33 +0000 | [diff] [blame] | 120 | #define VBO_NONE 0 |
| 121 | #define VBO_HW 1 |
| 122 | |
| 123 | typedef 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 | |
| 130 | extern wined3d_settings_t wined3d_settings; |
| 131 | |
Jason Edmeades | c3421ea | 2004-09-29 21:26:47 +0000 | [diff] [blame] | 132 | /* X11 locking */ |
| 133 | |
| 134 | extern void (*wine_tsx11_lock_ptr)(void); |
| 135 | extern void (*wine_tsx11_unlock_ptr)(void); |
| 136 | |
| 137 | /* As GLX relies on X, this is needed */ |
| 138 | extern 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 Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 151 | |
| 152 | /* GL related defines */ |
| 153 | /* ------------------ */ |
Jason Edmeades | eba27af | 2004-11-28 15:04:41 +0000 | [diff] [blame] | 154 | #define GL_SUPPORT(ExtName) (GLINFO_LOCATION.supported[ExtName] != 0) |
| 155 | #define GL_LIMITS(ExtName) (GLINFO_LOCATION.max_##ExtName) |
Jason Edmeades | f738c14 | 2004-12-09 11:42:34 +0000 | [diff] [blame] | 156 | #define GL_EXTCALL(FuncName) (GLINFO_LOCATION.FuncName) |
Oliver Stieber | 2c0e97e | 2005-08-17 11:34:03 +0000 | [diff] [blame] | 157 | #define GL_VEND(_VendName) (GLINFO_LOCATION.gl_vendor == VENDOR_##_VendName ? TRUE : FALSE) |
Jason Edmeades | b519893 | 2004-10-06 00:05:29 +0000 | [diff] [blame] | 158 | |
Jason Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 159 | #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 Edmeades | c4de952 | 2004-12-14 11:54:27 +0000 | [diff] [blame] | 172 | #define GLACTIVETEXTURE(textureNo) \ |
| 173 | glActiveTexture(GL_TEXTURE0 + textureNo); \ |
Jason Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 174 | checkGLcall("glActiveTexture"); |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 175 | #define GLCLIENTACTIVETEXTURE(textureNo) \ |
| 176 | glClientActiveTexture(GL_TEXTURE0 + textureNo); |
Jason Edmeades | c4de952 | 2004-12-14 11:54:27 +0000 | [diff] [blame] | 177 | #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 Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 185 | #define GLTEXTURECUBEMAP GL_TEXTURE_CUBE_MAP |
Jason Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 186 | #else |
Jason Edmeades | c4de952 | 2004-12-14 11:54:27 +0000 | [diff] [blame] | 187 | #define GLACTIVETEXTURE(textureNo) \ |
| 188 | glActiveTextureARB(GL_TEXTURE0_ARB + textureNo); \ |
Jason Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 189 | checkGLcall("glActiveTextureARB"); |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 190 | #define GLCLIENTACTIVETEXTURE(textureNo) \ |
| 191 | glClientActiveTextureARB(GL_TEXTURE0_ARB + textureNo); |
Jason Edmeades | c4de952 | 2004-12-14 11:54:27 +0000 | [diff] [blame] | 192 | #define GLMULTITEXCOORD1F(a,b) \ |
Raphael Junqueira | 66cae0d | 2004-12-17 19:07:44 +0000 | [diff] [blame] | 193 | glMultiTexCoord1fARB(GL_TEXTURE0_ARB + a, b); |
Jason Edmeades | c4de952 | 2004-12-14 11:54:27 +0000 | [diff] [blame] | 194 | #define GLMULTITEXCOORD2F(a,b,c) \ |
Raphael Junqueira | 66cae0d | 2004-12-17 19:07:44 +0000 | [diff] [blame] | 195 | glMultiTexCoord2fARB(GL_TEXTURE0_ARB + a, b, c); |
Jason Edmeades | c4de952 | 2004-12-14 11:54:27 +0000 | [diff] [blame] | 196 | #define GLMULTITEXCOORD3F(a,b,c,d) \ |
Raphael Junqueira | 66cae0d | 2004-12-17 19:07:44 +0000 | [diff] [blame] | 197 | glMultiTexCoord3fARB(GL_TEXTURE0_ARB + a, b, c, d); |
Jason Edmeades | c4de952 | 2004-12-14 11:54:27 +0000 | [diff] [blame] | 198 | #define GLMULTITEXCOORD4F(a,b,c,d,e) \ |
Raphael Junqueira | 66cae0d | 2004-12-17 19:07:44 +0000 | [diff] [blame] | 199 | glMultiTexCoord4fARB(GL_TEXTURE0_ARB + a, b, c, d, e); |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 200 | #define GLTEXTURECUBEMAP GL_TEXTURE_CUBE_MAP_ARB |
Jason Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 201 | #endif |
| 202 | |
| 203 | /* DirectX Device Limits */ |
| 204 | /* --------------------- */ |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 205 | #define MAX_LEVELS 256 /* Maximum number of mipmap levels. Guessed at 256 */ |
| 206 | |
Jason Edmeades | b519893 | 2004-10-06 00:05:29 +0000 | [diff] [blame] | 207 | #define MAX_STREAMS 16 /* Maximum possible streams - used for fixed size arrays |
| 208 | See MaxStreams in MSDN under GetDeviceCaps */ |
Oliver Stieber | 7b26165 | 2005-03-03 13:57:15 +0000 | [diff] [blame] | 209 | /* Maximum number of constants provided to the shaders */ |
Jason Edmeades | eba27af | 2004-11-28 15:04:41 +0000 | [diff] [blame] | 210 | #define HIGHEST_TRANSFORMSTATE 512 |
| 211 | /* Highest value in D3DTRANSFORMSTATETYPE */ |
Jason Edmeades | 0a944ae | 2004-11-29 17:53:42 +0000 | [diff] [blame] | 212 | #define MAX_CLIPPLANES D3DMAXUSERCLIPPLANES |
Jason Edmeades | b519893 | 2004-10-06 00:05:29 +0000 | [diff] [blame] | 213 | |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 214 | #define MAX_PALETTES 256 |
| 215 | |
Jason Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 216 | /* Checking of API calls */ |
| 217 | /* --------------------- */ |
Jason Edmeades | b9e2bed | 2004-10-08 20:52:33 +0000 | [diff] [blame] | 218 | #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 Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 228 | /* Trace routines / diagnostics */ |
| 229 | /* ---------------------------- */ |
| 230 | |
| 231 | /* Dump out a matrix and copy it */ |
Jason Edmeades | eba27af | 2004-11-28 15:04:41 +0000 | [diff] [blame] | 232 | #define conv_mat(mat,gl_mat) \ |
| 233 | do { \ |
| 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 Edmeades | 0a944ae | 2004-11-29 17:53:42 +0000 | [diff] [blame] | 241 | /* 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 Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 251 | /* Trace vector and strided data information */ |
Jason Edmeades | f738c14 | 2004-12-09 11:42:34 +0000 | [diff] [blame] | 252 | #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 Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 255 | /* 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 Edmeades | 447d5ed | 2004-10-21 20:59:12 +0000 | [diff] [blame] | 262 | typedef struct IWineD3DStateBlockImpl IWineD3DStateBlockImpl; |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 263 | typedef struct IWineD3DSurfaceImpl IWineD3DSurfaceImpl; |
Jason Edmeades | 447d5ed | 2004-10-21 20:59:12 +0000 | [diff] [blame] | 264 | |
Oliver Stieber | 6a03249 | 2005-07-13 11:34:55 +0000 | [diff] [blame] | 265 | /* Tracking */ |
| 266 | |
| 267 | /* TODO: Move some of this to the device */ |
| 268 | long globalChangeGlRam(long glram); |
| 269 | |
| 270 | /* Memory and object tracking */ |
| 271 | |
| 272 | /*Structure for holding information on all direct3d objects |
Francois Gouget | bd19d67 | 2005-07-22 09:06:03 +0000 | [diff] [blame] | 273 | useful for making sure tracking is ok and when release is called on a device! |
| 274 | and probably quite handy for debugging and dumping states out |
Oliver Stieber | 6a03249 | 2005-07-13 11:34:55 +0000 | [diff] [blame] | 275 | */ |
| 276 | typedef struct WineD3DGlobalStatistics { |
| 277 | int glsurfaceram; /* The aproximate amount of glTexture memory allocated for textures */ |
| 278 | } WineD3DGlobalStatistics; |
| 279 | |
| 280 | extern WineD3DGlobalStatistics* wineD3DGlobalStatistics; |
| 281 | |
Jason Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 282 | /* Global variables */ |
Jason Edmeades | eba27af | 2004-11-28 15:04:41 +0000 | [diff] [blame] | 283 | extern const float identity[16]; |
| 284 | |
Jason Edmeades | 24ab49e | 2004-09-23 04:34:27 +0000 | [diff] [blame] | 285 | /***************************************************************************** |
Jason Edmeades | f738c14 | 2004-12-09 11:42:34 +0000 | [diff] [blame] | 286 | * 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 Edmeades | c4de952 | 2004-12-14 11:54:27 +0000 | [diff] [blame] | 307 | /* 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 |
| 332 | extern BOOL isOn; |
| 333 | extern BOOL isDumpingFrames; |
| 334 | extern LONG primCounter; |
| 335 | #endif |
| 336 | |
Jason Edmeades | f738c14 | 2004-12-09 11:42:34 +0000 | [diff] [blame] | 337 | /***************************************************************************** |
| 338 | * Prototypes |
| 339 | */ |
| 340 | |
| 341 | /* Routine common to the draw primitive and draw indexed primitive routines */ |
| 342 | void drawPrimitive(IWineD3DDevice *iface, |
| 343 | int PrimitiveType, |
| 344 | long NumPrimitives, |
Jason Edmeades | f738c14 | 2004-12-09 11:42:34 +0000 | [diff] [blame] | 345 | /* for Indexed: */ |
| 346 | long StartVertexIndex, |
Oliver Stieber | 1be54d8 | 2005-08-19 10:05:00 +0000 | [diff] [blame] | 347 | UINT numberOfVertices, |
Jason Edmeades | f738c14 | 2004-12-09 11:42:34 +0000 | [diff] [blame] | 348 | long StartIdx, |
| 349 | short idxBytes, |
| 350 | const void *idxData, |
| 351 | int minIndex); |
| 352 | |
| 353 | /***************************************************************************** |
| 354 | * Structures required to draw primitives |
| 355 | */ |
| 356 | |
| 357 | typedef 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 | |
| 363 | typedef 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 Stieber | abb11f3 | 2005-07-05 14:05:18 +0000 | [diff] [blame] | 373 | Direct3DStridedData texCoords[MAX_TEXTURES]; |
Oliver Stieber | 386470b | 2005-07-30 19:06:14 +0000 | [diff] [blame] | 374 | 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 Edmeades | f738c14 | 2004-12-09 11:42:34 +0000 | [diff] [blame] | 382 | } s; |
| 383 | Direct3DStridedData input[16]; /* Indexed by constants in D3DVSDE_REGISTER */ |
| 384 | } u; |
| 385 | } Direct3DVertexStridedData; |
| 386 | |
| 387 | /***************************************************************************** |
Jason Edmeades | 0a944ae | 2004-11-29 17:53:42 +0000 | [diff] [blame] | 388 | * Internal representation of a light |
| 389 | */ |
| 390 | typedef struct PLIGHTINFOEL PLIGHTINFOEL; |
| 391 | struct 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 Edmeades | 24ab49e | 2004-09-23 04:34:27 +0000 | [diff] [blame] | 410 | * IWineD3D implementation structure |
| 411 | */ |
| 412 | typedef struct IWineD3DImpl |
| 413 | { |
| 414 | /* IUnknown fields */ |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 415 | const IWineD3DVtbl *lpVtbl; |
Mike McCormack | 8955ac4 | 2005-07-28 10:16:21 +0000 | [diff] [blame] | 416 | LONG ref; /* Note: Ref counting not required */ |
Jason Edmeades | 24ab49e | 2004-09-23 04:34:27 +0000 | [diff] [blame] | 417 | |
| 418 | /* WineD3D Information */ |
Jason Edmeades | 289562e | 2004-11-23 13:52:46 +0000 | [diff] [blame] | 419 | IUnknown *parent; |
Jason Edmeades | 24ab49e | 2004-09-23 04:34:27 +0000 | [diff] [blame] | 420 | UINT dxVersion; |
Jason Edmeades | c3421ea | 2004-09-29 21:26:47 +0000 | [diff] [blame] | 421 | |
| 422 | /* GL Information */ |
| 423 | BOOL isGLInfoValid; |
| 424 | WineD3D_GL_Info gl_info; |
Jason Edmeades | 24ab49e | 2004-09-23 04:34:27 +0000 | [diff] [blame] | 425 | } IWineD3DImpl; |
| 426 | |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 427 | extern const IWineD3DVtbl IWineD3D_Vtbl; |
Jason Edmeades | 24ab49e | 2004-09-23 04:34:27 +0000 | [diff] [blame] | 428 | |
Oliver Stieber | c93da09 | 2005-07-27 15:33:17 +0000 | [diff] [blame] | 429 | typedef struct SwapChainList { |
| 430 | IWineD3DSwapChain *swapchain; |
| 431 | struct SwapChainList *next; |
| 432 | } SwapChainList; |
Oliver Stieber | 9485632 | 2005-07-19 11:39:24 +0000 | [diff] [blame] | 433 | |
| 434 | /** Hacked out start of a context manager!! **/ |
| 435 | typedef 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!) */ |
| 451 | extern BOOL pbuffer_support; |
| 452 | /* allocate one pbuffer per surface */ |
| 453 | extern BOOL pbuffer_per_surface; |
| 454 | |
| 455 | /* Maximum number of contexts/pbuffers to keep in cache, |
| 456 | set to 100 because ATI's drivers don't support deleting pBuffers properly |
| 457 | this needs to be migrated to a list and some option availalbe for controle the cache size. |
| 458 | */ |
| 459 | #define CONTEXT_CACHE 100 |
| 460 | |
Oliver Stieber | ea6189e | 2005-07-26 10:34:15 +0000 | [diff] [blame] | 461 | typedef struct ResourceList { |
| 462 | IWineD3DResource *resource; |
| 463 | struct ResourceList *next; |
| 464 | } ResourceList; |
Oliver Stieber | 9485632 | 2005-07-19 11:39:24 +0000 | [diff] [blame] | 465 | |
Jason Edmeades | ac490fa | 2004-10-07 04:22:21 +0000 | [diff] [blame] | 466 | /***************************************************************************** |
| 467 | * IWineD3DDevice implementation structure |
| 468 | */ |
| 469 | typedef struct IWineD3DDeviceImpl |
| 470 | { |
Jason Edmeades | b9e2bed | 2004-10-08 20:52:33 +0000 | [diff] [blame] | 471 | /* IUnknown fields */ |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 472 | const IWineD3DDeviceVtbl *lpVtbl; |
Mike McCormack | 8955ac4 | 2005-07-28 10:16:21 +0000 | [diff] [blame] | 473 | LONG ref; /* Note: Ref counting not required */ |
Jason Edmeades | ac490fa | 2004-10-07 04:22:21 +0000 | [diff] [blame] | 474 | |
Jason Edmeades | b9e2bed | 2004-10-08 20:52:33 +0000 | [diff] [blame] | 475 | /* WineD3D Information */ |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 476 | IUnknown *parent; |
Jason Edmeades | eba27af | 2004-11-28 15:04:41 +0000 | [diff] [blame] | 477 | IWineD3D *wineD3D; |
Jason Edmeades | ac490fa | 2004-10-07 04:22:21 +0000 | [diff] [blame] | 478 | |
Jason Edmeades | b9e2bed | 2004-10-08 20:52:33 +0000 | [diff] [blame] | 479 | /* X and GL Information */ |
Jason Edmeades | b9e2bed | 2004-10-08 20:52:33 +0000 | [diff] [blame] | 480 | 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 Edmeades | f738c14 | 2004-12-09 11:42:34 +0000 | [diff] [blame] | 487 | GLenum tracking_parm; /* Which source is tracking current colour */ |
| 488 | LONG tracking_color; /* used iff GL_COLOR_MATERIAL was enabled */ |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 489 | #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 Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 493 | UINT srcBlend; |
| 494 | UINT dstBlend; |
| 495 | UINT alphafunc; |
| 496 | UINT stencilfunc; |
| 497 | BOOL texture_shader_active; /* TODO: Confirm use is correct */ |
Jason Edmeades | b9e2bed | 2004-10-08 20:52:33 +0000 | [diff] [blame] | 498 | |
Jason Edmeades | 447d5ed | 2004-10-21 20:59:12 +0000 | [diff] [blame] | 499 | /* State block related */ |
| 500 | BOOL isRecordingState; |
| 501 | IWineD3DStateBlockImpl *stateBlock; |
| 502 | IWineD3DStateBlockImpl *updateStateBlock; |
| 503 | |
Jason Edmeades | b9e2bed | 2004-10-08 20:52:33 +0000 | [diff] [blame] | 504 | /* Internal use fields */ |
| 505 | D3DDEVICE_CREATION_PARAMETERS createParms; |
Jason Edmeades | b9e2bed | 2004-10-08 20:52:33 +0000 | [diff] [blame] | 506 | UINT adapterNo; |
| 507 | D3DDEVTYPE devType; |
| 508 | |
Oliver Stieber | c93da09 | 2005-07-27 15:33:17 +0000 | [diff] [blame] | 509 | SwapChainList *swapchains; |
Oliver Stieber | 46e7c30 | 2005-06-23 11:05:24 +0000 | [diff] [blame] | 510 | |
Oliver Stieber | ea6189e | 2005-07-26 10:34:15 +0000 | [diff] [blame] | 511 | ResourceList *resources; /* a linked list to track resources created by the device */ |
| 512 | |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 513 | /* Render Target Support */ |
Oliver Stieber | ba5eb14 | 2005-03-14 10:12:52 +0000 | [diff] [blame] | 514 | IWineD3DSurface *depthStencilBuffer; |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 515 | |
Oliver Stieber | ba5eb14 | 2005-03-14 10:12:52 +0000 | [diff] [blame] | 516 | IWineD3DSurface *renderTarget; |
| 517 | IWineD3DSurface *stencilBufferTarget; |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 518 | |
| 519 | /* palettes texture management */ |
Oliver Stieber | ba5eb14 | 2005-03-14 10:12:52 +0000 | [diff] [blame] | 520 | PALETTEENTRY palettes[MAX_PALETTES][256]; |
| 521 | UINT currentPalette; |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 522 | |
Jason Edmeades | f738c14 | 2004-12-09 11:42:34 +0000 | [diff] [blame] | 523 | /* For rendering to a texture using glCopyTexImage */ |
Oliver Stieber | ba5eb14 | 2005-03-14 10:12:52 +0000 | [diff] [blame] | 524 | BOOL renderUpsideDown; |
Jason Edmeades | f738c14 | 2004-12-09 11:42:34 +0000 | [diff] [blame] | 525 | |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 526 | /* Cursor management */ |
| 527 | BOOL bCursorVisible; |
| 528 | UINT xHotSpot; |
| 529 | UINT yHotSpot; |
| 530 | UINT xScreenSpace; |
| 531 | UINT yScreenSpace; |
| 532 | |
Jason Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 533 | /* Textures for when no other textures are mapped */ |
Oliver Stieber | abb11f3 | 2005-07-05 14:05:18 +0000 | [diff] [blame] | 534 | UINT dummyTextureName[MAX_TEXTURES]; |
Jason Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 535 | |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 536 | /* Debug stream management */ |
| 537 | BOOL debug; |
| 538 | |
Oliver Stieber | 329d017 | 2005-09-21 10:55:03 +0000 | [diff] [blame] | 539 | /* Device state management */ |
| 540 | HRESULT state; |
| 541 | |
Oliver Stieber | 9485632 | 2005-07-19 11:39:24 +0000 | [diff] [blame] | 542 | /* 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 Edmeades | ac490fa | 2004-10-07 04:22:21 +0000 | [diff] [blame] | 547 | } IWineD3DDeviceImpl; |
| 548 | |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 549 | extern const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl; |
Jason Edmeades | ac490fa | 2004-10-07 04:22:21 +0000 | [diff] [blame] | 550 | |
Oliver Stieber | fe80b4e | 2005-07-15 09:54:57 +0000 | [diff] [blame] | 551 | /* Support for IWineD3DResource ::Set/Get/FreePrivateData. I don't think |
| 552 | * anybody uses it for much so a good implementation is optional. */ |
| 553 | typedef 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 Edmeades | db7a505 | 2004-10-14 00:32:04 +0000 | [diff] [blame] | 570 | /***************************************************************************** |
| 571 | * IWineD3DResource implementation structure |
| 572 | */ |
| 573 | typedef struct IWineD3DResourceClass |
| 574 | { |
| 575 | /* IUnknown fields */ |
Mike McCormack | 8955ac4 | 2005-07-28 10:16:21 +0000 | [diff] [blame] | 576 | LONG ref; /* Note: Ref counting not required */ |
Jason Edmeades | db7a505 | 2004-10-14 00:32:04 +0000 | [diff] [blame] | 577 | |
| 578 | /* WineD3DResource Information */ |
Jason Edmeades | 289562e | 2004-11-23 13:52:46 +0000 | [diff] [blame] | 579 | IUnknown *parent; |
Jason Edmeades | db7a505 | 2004-10-14 00:32:04 +0000 | [diff] [blame] | 580 | D3DRESOURCETYPE resourceType; |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 581 | IWineD3DDeviceImpl *wineD3DDevice; |
Oliver Stieber | 67f2ad4 | 2005-03-29 19:01:00 +0000 | [diff] [blame] | 582 | D3DPOOL pool; |
| 583 | UINT size; |
| 584 | DWORD usage; |
| 585 | WINED3DFORMAT format; |
| 586 | BYTE *allocatedMemory; |
Oliver Stieber | fe80b4e | 2005-07-15 09:54:57 +0000 | [diff] [blame] | 587 | PrivateData *privateData; |
Jason Edmeades | db7a505 | 2004-10-14 00:32:04 +0000 | [diff] [blame] | 588 | |
| 589 | } IWineD3DResourceClass; |
| 590 | |
| 591 | typedef struct IWineD3DResourceImpl |
| 592 | { |
| 593 | /* IUnknown & WineD3DResource Information */ |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 594 | const IWineD3DResourceVtbl *lpVtbl; |
Jason Edmeades | db7a505 | 2004-10-14 00:32:04 +0000 | [diff] [blame] | 595 | IWineD3DResourceClass resource; |
Jason Edmeades | db7a505 | 2004-10-14 00:32:04 +0000 | [diff] [blame] | 596 | } IWineD3DResourceImpl; |
| 597 | |
Jason Edmeades | db7a505 | 2004-10-14 00:32:04 +0000 | [diff] [blame] | 598 | |
| 599 | /***************************************************************************** |
| 600 | * IWineD3DVertexBuffer implementation structure (extends IWineD3DResourceImpl) |
| 601 | */ |
| 602 | typedef struct IWineD3DVertexBufferImpl |
| 603 | { |
| 604 | /* IUnknown & WineD3DResource Information */ |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 605 | const IWineD3DVertexBufferVtbl *lpVtbl; |
Jason Edmeades | db7a505 | 2004-10-14 00:32:04 +0000 | [diff] [blame] | 606 | IWineD3DResourceClass resource; |
| 607 | |
| 608 | /* WineD3DVertexBuffer specifics */ |
Oliver Stieber | 6a03249 | 2005-07-13 11:34:55 +0000 | [diff] [blame] | 609 | DWORD fvf; |
Jason Edmeades | db7a505 | 2004-10-14 00:32:04 +0000 | [diff] [blame] | 610 | |
| 611 | } IWineD3DVertexBufferImpl; |
| 612 | |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 613 | extern const IWineD3DVertexBufferVtbl IWineD3DVertexBuffer_Vtbl; |
Jason Edmeades | db7a505 | 2004-10-14 00:32:04 +0000 | [diff] [blame] | 614 | |
Oliver Stieber | 67f2ad4 | 2005-03-29 19:01:00 +0000 | [diff] [blame] | 615 | |
Jason Edmeades | 447d5ed | 2004-10-21 20:59:12 +0000 | [diff] [blame] | 616 | /***************************************************************************** |
Jason Edmeades | 73e8baf | 2004-11-24 18:13:41 +0000 | [diff] [blame] | 617 | * IWineD3DIndexBuffer implementation structure (extends IWineD3DResourceImpl) |
| 618 | */ |
| 619 | typedef struct IWineD3DIndexBufferImpl |
| 620 | { |
| 621 | /* IUnknown & WineD3DResource Information */ |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 622 | const IWineD3DIndexBufferVtbl *lpVtbl; |
Jason Edmeades | 73e8baf | 2004-11-24 18:13:41 +0000 | [diff] [blame] | 623 | IWineD3DResourceClass resource; |
| 624 | |
| 625 | /* WineD3DVertexBuffer specifics */ |
Jason Edmeades | 73e8baf | 2004-11-24 18:13:41 +0000 | [diff] [blame] | 626 | } IWineD3DIndexBufferImpl; |
| 627 | |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 628 | extern const IWineD3DIndexBufferVtbl IWineD3DIndexBuffer_Vtbl; |
Jason Edmeades | 73e8baf | 2004-11-24 18:13:41 +0000 | [diff] [blame] | 629 | |
| 630 | /***************************************************************************** |
Oliver Stieber | bb6f9b0 | 2005-08-03 11:00:28 +0000 | [diff] [blame] | 631 | * IWineD3DBaseTexture D3D- > openGL state map lookups |
| 632 | */ |
| 633 | #define WINED3DFUNC_NOTSUPPORTED -2 |
| 634 | #define WINED3DFUNC_UNIMPLEMENTED -1 |
| 635 | |
| 636 | typedef 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 | |
| 653 | typedef struct Wined3dTextureStateMap { |
| 654 | CONST int state; |
| 655 | int function; |
| 656 | } Wined3dTextureStateMap; |
| 657 | |
| 658 | /***************************************************************************** |
Jason Edmeades | 819b0e1 | 2004-12-07 14:29:12 +0000 | [diff] [blame] | 659 | * IWineD3DBaseTexture implementation structure (extends IWineD3DResourceImpl) |
| 660 | */ |
| 661 | typedef struct IWineD3DBaseTextureClass |
| 662 | { |
| 663 | UINT levels; |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 664 | BOOL dirty; |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 665 | D3DFORMAT format; |
Oliver Stieber | ba5eb14 | 2005-03-14 10:12:52 +0000 | [diff] [blame] | 666 | DWORD usage; |
Oliver Stieber | bb6f9b0 | 2005-08-03 11:00:28 +0000 | [diff] [blame] | 667 | UINT textureName; |
Oliver Stieber | ba5eb14 | 2005-03-14 10:12:52 +0000 | [diff] [blame] | 668 | UINT LOD; |
| 669 | D3DTEXTUREFILTERTYPE filterType; |
Oliver Stieber | bb6f9b0 | 2005-08-03 11:00:28 +0000 | [diff] [blame] | 670 | DWORD states[MAX_WINETEXTURESTATES]; |
Jason Edmeades | 819b0e1 | 2004-12-07 14:29:12 +0000 | [diff] [blame] | 671 | |
| 672 | } IWineD3DBaseTextureClass; |
| 673 | |
| 674 | typedef struct IWineD3DBaseTextureImpl |
| 675 | { |
| 676 | /* IUnknown & WineD3DResource Information */ |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 677 | const IWineD3DBaseTextureVtbl *lpVtbl; |
Jason Edmeades | 819b0e1 | 2004-12-07 14:29:12 +0000 | [diff] [blame] | 678 | IWineD3DResourceClass resource; |
| 679 | IWineD3DBaseTextureClass baseTexture; |
| 680 | |
| 681 | } IWineD3DBaseTextureImpl; |
| 682 | |
Jason Edmeades | 819b0e1 | 2004-12-07 14:29:12 +0000 | [diff] [blame] | 683 | /***************************************************************************** |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 684 | * IWineD3DTexture implementation structure (extends IWineD3DBaseTextureImpl) |
| 685 | */ |
| 686 | typedef struct IWineD3DTextureImpl |
| 687 | { |
| 688 | /* IUnknown & WineD3DResource/WineD3DBaseTexture Information */ |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 689 | const IWineD3DTextureVtbl *lpVtbl; |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 690 | IWineD3DResourceClass resource; |
| 691 | IWineD3DBaseTextureClass baseTexture; |
| 692 | |
| 693 | /* IWineD3DTexture */ |
Oliver Stieber | ba5eb14 | 2005-03-14 10:12:52 +0000 | [diff] [blame] | 694 | IWineD3DSurface *surfaces[MAX_LEVELS]; |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 695 | |
| 696 | UINT width; |
| 697 | UINT height; |
Oliver Stieber | e31bc6c | 2005-08-03 19:49:05 +0000 | [diff] [blame] | 698 | float pow2scalingFactorX; |
| 699 | float pow2scalingFactorY; |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 700 | |
| 701 | } IWineD3DTextureImpl; |
| 702 | |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 703 | extern const IWineD3DTextureVtbl IWineD3DTexture_Vtbl; |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 704 | |
| 705 | /***************************************************************************** |
| 706 | * IWineD3DCubeTexture implementation structure (extends IWineD3DBaseTextureImpl) |
| 707 | */ |
| 708 | typedef struct IWineD3DCubeTextureImpl |
| 709 | { |
| 710 | /* IUnknown & WineD3DResource/WineD3DBaseTexture Information */ |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 711 | const IWineD3DCubeTextureVtbl *lpVtbl; |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 712 | IWineD3DResourceClass resource; |
| 713 | IWineD3DBaseTextureClass baseTexture; |
| 714 | |
| 715 | /* IWineD3DCubeTexture */ |
Oliver Stieber | ba5eb14 | 2005-03-14 10:12:52 +0000 | [diff] [blame] | 716 | IWineD3DSurface *surfaces[6][MAX_LEVELS]; |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 717 | |
| 718 | UINT edgeLength; |
Oliver Stieber | e31bc6c | 2005-08-03 19:49:05 +0000 | [diff] [blame] | 719 | float pow2scalingFactor; |
Oliver Stieber | ba5eb14 | 2005-03-14 10:12:52 +0000 | [diff] [blame] | 720 | |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 721 | } IWineD3DCubeTextureImpl; |
| 722 | |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 723 | extern const IWineD3DCubeTextureVtbl IWineD3DCubeTexture_Vtbl; |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 724 | |
| 725 | /***************************************************************************** |
| 726 | * IWineD3DVolume implementation structure (extends IUnknown) |
| 727 | */ |
| 728 | typedef struct IWineD3DVolumeImpl |
| 729 | { |
Oliver Stieber | 67f2ad4 | 2005-03-29 19:01:00 +0000 | [diff] [blame] | 730 | /* IUnknown & WineD3DResource fields */ |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 731 | const IWineD3DVolumeVtbl *lpVtbl; |
Oliver Stieber | 67f2ad4 | 2005-03-29 19:01:00 +0000 | [diff] [blame] | 732 | IWineD3DResourceClass resource; |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 733 | |
| 734 | /* WineD3DVolume Information */ |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 735 | D3DVOLUME_DESC currentDesc; |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 736 | 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 Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 748 | extern const IWineD3DVolumeVtbl IWineD3DVolume_Vtbl; |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 749 | |
| 750 | /***************************************************************************** |
| 751 | * IWineD3DVolumeTexture implementation structure (extends IWineD3DBaseTextureImpl) |
| 752 | */ |
| 753 | typedef struct IWineD3DVolumeTextureImpl |
| 754 | { |
| 755 | /* IUnknown & WineD3DResource/WineD3DBaseTexture Information */ |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 756 | const IWineD3DVolumeTextureVtbl *lpVtbl; |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 757 | IWineD3DResourceClass resource; |
| 758 | IWineD3DBaseTextureClass baseTexture; |
| 759 | |
| 760 | /* IWineD3DVolumeTexture */ |
Oliver Stieber | ba5eb14 | 2005-03-14 10:12:52 +0000 | [diff] [blame] | 761 | IWineD3DVolume *volumes[MAX_LEVELS]; |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 762 | |
| 763 | UINT width; |
| 764 | UINT height; |
| 765 | UINT depth; |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 766 | } IWineD3DVolumeTextureImpl; |
| 767 | |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 768 | extern const IWineD3DVolumeTextureVtbl IWineD3DVolumeTexture_Vtbl; |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 769 | |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 770 | typedef struct _WINED3DSURFACET_DESC |
| 771 | { |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 772 | D3DMULTISAMPLE_TYPE MultiSampleType; |
| 773 | DWORD MultiSampleQuality; |
| 774 | UINT Width; |
| 775 | UINT Height; |
| 776 | } WINED3DSURFACET_DESC; |
| 777 | |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 778 | /***************************************************************************** |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 779 | * IWineD3DSurface implementation structure |
| 780 | */ |
| 781 | struct IWineD3DSurfaceImpl |
| 782 | { |
| 783 | /* IUnknown & IWineD3DResource Information */ |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 784 | const IWineD3DSurfaceVtbl *lpVtbl; |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 785 | IWineD3DResourceClass resource; |
| 786 | |
| 787 | /* IWineD3DSurface fields */ |
| 788 | IUnknown *container; |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 789 | WINED3DSURFACET_DESC currentDesc; |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 790 | |
| 791 | UINT textureName; |
| 792 | UINT bytesPerPixel; |
Oliver Stieber | 520c2f0 | 2005-07-11 14:25:54 +0000 | [diff] [blame] | 793 | |
| 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 Stieber | e31bc6c | 2005-08-03 19:49:05 +0000 | [diff] [blame] | 801 | #if 0 |
Oliver Stieber | 520c2f0 | 2005-07-11 14:25:54 +0000 | [diff] [blame] | 802 | /* precalculated x and y scalings for texture coords */ |
| 803 | float pow2scalingFactorX; /* = (Width / pow2Width ) */ |
| 804 | float pow2scalingFactorY; /* = (Height / pow2Height) */ |
Oliver Stieber | e31bc6c | 2005-08-03 19:49:05 +0000 | [diff] [blame] | 805 | #endif |
Oliver Stieber | 520c2f0 | 2005-07-11 14:25:54 +0000 | [diff] [blame] | 806 | |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 807 | BOOL lockable; |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 808 | BOOL discard; |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 809 | BOOL locked; |
Oliver Stieber | 6a03249 | 2005-07-13 11:34:55 +0000 | [diff] [blame] | 810 | BOOL activeLock; |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 811 | |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 812 | RECT lockedRect; |
| 813 | RECT dirtyRect; |
| 814 | BOOL Dirty; |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 815 | |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 816 | BOOL inTexture; |
| 817 | BOOL inPBuffer; |
Oliver Stieber | 1362105 | 2005-07-11 20:38:27 +0000 | [diff] [blame] | 818 | |
| 819 | glDescriptor glDescription; |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 820 | }; |
| 821 | |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 822 | extern const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl; |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 823 | |
| 824 | /***************************************************************************** |
Raphael Junqueira | 4f02b52 | 2005-01-19 19:34:49 +0000 | [diff] [blame] | 825 | * IWineD3DVertexDeclaration implementation structure |
| 826 | */ |
| 827 | typedef struct IWineD3DVertexDeclarationImpl { |
| 828 | /* IUnknown Information */ |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 829 | const IWineD3DVertexDeclarationVtbl *lpVtbl; |
Mike McCormack | 8955ac4 | 2005-07-28 10:16:21 +0000 | [diff] [blame] | 830 | LONG ref; /* Note: Ref counting not required */ |
Raphael Junqueira | 4f02b52 | 2005-01-19 19:34:49 +0000 | [diff] [blame] | 831 | |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 832 | IUnknown *parent; |
Raphael Junqueira | 4f02b52 | 2005-01-19 19:34:49 +0000 | [diff] [blame] | 833 | /** 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 Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 847 | extern const IWineD3DVertexDeclarationVtbl IWineD3DVertexDeclaration_Vtbl; |
Raphael Junqueira | 4f02b52 | 2005-01-19 19:34:49 +0000 | [diff] [blame] | 848 | |
| 849 | /***************************************************************************** |
Jason Edmeades | 447d5ed | 2004-10-21 20:59:12 +0000 | [diff] [blame] | 850 | * 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 */ |
| 856 | typedef struct SAVEDSTATES { |
Jason Edmeades | f738c14 | 2004-12-09 11:42:34 +0000 | [diff] [blame] | 857 | BOOL indices; |
Jason Edmeades | 0a944ae | 2004-11-29 17:53:42 +0000 | [diff] [blame] | 858 | BOOL material; |
Jason Edmeades | 447d5ed | 2004-10-21 20:59:12 +0000 | [diff] [blame] | 859 | BOOL fvf; |
Oliver Stieber | abb11f3 | 2005-07-05 14:05:18 +0000 | [diff] [blame] | 860 | BOOL streamSource[MAX_STREAMS]; |
| 861 | BOOL streamFreq[MAX_STREAMS]; |
| 862 | BOOL textures[MAX_TEXTURES]; |
| 863 | BOOL transform[HIGHEST_TRANSFORMSTATE + 1]; |
Jason Edmeades | f738c14 | 2004-12-09 11:42:34 +0000 | [diff] [blame] | 864 | BOOL viewport; |
Oliver Stieber | abb11f3 | 2005-07-05 14:05:18 +0000 | [diff] [blame] | 865 | BOOL renderState[WINEHIGHEST_RENDER_STATE + 1]; |
Oliver Stieber | 7cb748f | 2005-07-26 18:49:30 +0000 | [diff] [blame] | 866 | BOOL textureState[MAX_TEXTURES][WINED3D_HIGHEST_TEXTURE_STATE + 1]; |
Oliver Stieber | 7cb748f | 2005-07-26 18:49:30 +0000 | [diff] [blame] | 867 | BOOL samplerState[MAX_SAMPLERS][WINED3D_HIGHEST_SAMPLER_STATE + 1]; |
Oliver Stieber | d344162 | 2005-08-01 10:58:31 +0000 | [diff] [blame] | 868 | BOOL clipplane[MAX_CLIPPLANES]; |
Raphael Junqueira | 4c385f9 | 2005-01-26 20:54:00 +0000 | [diff] [blame] | 869 | BOOL vertexDecl; |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 870 | BOOL pixelShader; |
Oliver Stieber | abb11f3 | 2005-07-05 14:05:18 +0000 | [diff] [blame] | 871 | BOOL vertexShader; |
Oliver Stieber | 0c2fcf2 | 2005-09-21 10:19:29 +0000 | [diff] [blame] | 872 | BOOL vertexShaderConstants[MAX_VSHADER_CONSTANTS]; |
Jason Edmeades | 447d5ed | 2004-10-21 20:59:12 +0000 | [diff] [blame] | 873 | } SAVEDSTATES; |
| 874 | |
Oliver Stieber | 0c2fcf2 | 2005-09-21 10:19:29 +0000 | [diff] [blame] | 875 | typedef enum { |
| 876 | WINESHADERCNST_FLOAT = 0, |
| 877 | WINESHADERCNST_INTEGER = 1, |
| 878 | WINESHADERCNST_BOOL = 2 |
| 879 | } WINESHADERCNST; |
| 880 | |
Jason Edmeades | 447d5ed | 2004-10-21 20:59:12 +0000 | [diff] [blame] | 881 | struct IWineD3DStateBlockImpl |
| 882 | { |
| 883 | /* IUnknown fields */ |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 884 | const IWineD3DStateBlockVtbl *lpVtbl; |
Mike McCormack | 8955ac4 | 2005-07-28 10:16:21 +0000 | [diff] [blame] | 885 | LONG ref; /* Note: Ref counting not required */ |
Oliver Stieber | abb11f3 | 2005-07-05 14:05:18 +0000 | [diff] [blame] | 886 | |
Jason Edmeades | 447d5ed | 2004-10-21 20:59:12 +0000 | [diff] [blame] | 887 | /* IWineD3DStateBlock information */ |
Jason Edmeades | 289562e | 2004-11-23 13:52:46 +0000 | [diff] [blame] | 888 | IUnknown *parent; |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 889 | IWineD3DDeviceImpl *wineD3DDevice; |
Oliver Stieber | 7cb748f | 2005-07-26 18:49:30 +0000 | [diff] [blame] | 890 | WINED3DSTATEBLOCKTYPE blockType; |
Jason Edmeades | 447d5ed | 2004-10-21 20:59:12 +0000 | [diff] [blame] | 891 | |
| 892 | /* Array indicating whether things have been set or changed */ |
| 893 | SAVEDSTATES changed; |
| 894 | SAVEDSTATES set; |
Oliver Stieber | abb11f3 | 2005-07-05 14:05:18 +0000 | [diff] [blame] | 895 | |
Jason Edmeades | 447d5ed | 2004-10-21 20:59:12 +0000 | [diff] [blame] | 896 | /* Drawing - Vertex Shader or FVF related */ |
| 897 | DWORD fvf; |
Raphael Junqueira | 4f02b52 | 2005-01-19 19:34:49 +0000 | [diff] [blame] | 898 | /* Vertex Shader Declaration */ |
Oliver Stieber | 2c0e97e | 2005-08-17 11:34:03 +0000 | [diff] [blame] | 899 | IWineD3DVertexDeclaration *vertexDecl; |
Raphael Junqueira | 4f02b52 | 2005-01-19 19:34:49 +0000 | [diff] [blame] | 900 | |
Oliver Stieber | 2c0e97e | 2005-08-17 11:34:03 +0000 | [diff] [blame] | 901 | IWineD3DVertexShader *vertexShader; /* @TODO: Replace void * with IWineD3DVertexShader * */ |
Jason Edmeades | 447d5ed | 2004-10-21 20:59:12 +0000 | [diff] [blame] | 902 | |
Oliver Stieber | 9b0b803 | 2005-08-17 10:27:01 +0000 | [diff] [blame] | 903 | /* Vertex Shader Constants */ |
| 904 | BOOL vertexShaderConstantB[MAX_VSHADER_CONSTANTS]; |
Mike McCormack | 93ab695 | 2005-08-26 08:53:31 +0000 | [diff] [blame] | 905 | INT vertexShaderConstantI[MAX_VSHADER_CONSTANTS * 4]; |
Oliver Stieber | 9b0b803 | 2005-08-17 10:27:01 +0000 | [diff] [blame] | 906 | float vertexShaderConstantF[MAX_VSHADER_CONSTANTS * 4]; |
Oliver Stieber | 0c2fcf2 | 2005-09-21 10:19:29 +0000 | [diff] [blame] | 907 | WINESHADERCNST vertexShaderConstantT[MAX_VSHADER_CONSTANTS]; /* TODO: Think about changing this to a char to possibly save a little memory */ |
Oliver Stieber | 9b0b803 | 2005-08-17 10:27:01 +0000 | [diff] [blame] | 908 | |
Oliver Stieber | 0c2fcf2 | 2005-09-21 10:19:29 +0000 | [diff] [blame] | 909 | BOOL softwareVertexProcessing; |
Oliver Stieber | 313b010 | 2005-08-11 10:31:40 +0000 | [diff] [blame] | 910 | |
Jason Edmeades | 289562e | 2004-11-23 13:52:46 +0000 | [diff] [blame] | 911 | /* Stream Source */ |
Raphael Junqueira | 4f02b52 | 2005-01-19 19:34:49 +0000 | [diff] [blame] | 912 | BOOL streamIsUP; |
Oliver Stieber | abb11f3 | 2005-07-05 14:05:18 +0000 | [diff] [blame] | 913 | 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 Edmeades | eba27af | 2004-11-28 15:04:41 +0000 | [diff] [blame] | 918 | |
Jason Edmeades | f738c14 | 2004-12-09 11:42:34 +0000 | [diff] [blame] | 919 | /* Indices */ |
| 920 | IWineD3DIndexBuffer* pIndexData; |
| 921 | UINT baseVertexIndex; /* Note: only used for d3d8 */ |
| 922 | |
Jason Edmeades | eba27af | 2004-11-28 15:04:41 +0000 | [diff] [blame] | 923 | /* Transform */ |
Oliver Stieber | abb11f3 | 2005-07-05 14:05:18 +0000 | [diff] [blame] | 924 | D3DMATRIX transforms[HIGHEST_TRANSFORMSTATE + 1]; |
Jason Edmeades | eba27af | 2004-11-28 15:04:41 +0000 | [diff] [blame] | 925 | |
Jason Edmeades | 0a944ae | 2004-11-29 17:53:42 +0000 | [diff] [blame] | 926 | /* Lights */ |
| 927 | PLIGHTINFOEL *lights; /* NOTE: active GL lights must be front of the chain */ |
Oliver Stieber | abb11f3 | 2005-07-05 14:05:18 +0000 | [diff] [blame] | 928 | |
Jason Edmeades | 0a944ae | 2004-11-29 17:53:42 +0000 | [diff] [blame] | 929 | /* Clipping */ |
| 930 | double clipplane[MAX_CLIPPLANES][4]; |
| 931 | WINED3DCLIPSTATUS clip_status; |
| 932 | |
Jason Edmeades | f738c14 | 2004-12-09 11:42:34 +0000 | [diff] [blame] | 933 | /* ViewPort */ |
| 934 | WINED3DVIEWPORT viewport; |
| 935 | |
Jason Edmeades | 0a944ae | 2004-11-29 17:53:42 +0000 | [diff] [blame] | 936 | /* Material */ |
| 937 | WINED3DMATERIAL material; |
| 938 | |
Oliver Stieber | abb11f3 | 2005-07-05 14:05:18 +0000 | [diff] [blame] | 939 | /* Pixel Shader */ |
Oliver Stieber | 2af36c6 | 2005-08-25 19:24:21 +0000 | [diff] [blame] | 940 | 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 Stieber | abb11f3 | 2005-07-05 14:05:18 +0000 | [diff] [blame] | 946 | |
Jason Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 947 | /* Indexed Vertex Blending */ |
| 948 | D3DVERTEXBLENDFLAGS vertex_blend; |
| 949 | FLOAT tween_factor; |
| 950 | |
| 951 | /* RenderState */ |
Oliver Stieber | abb11f3 | 2005-07-05 14:05:18 +0000 | [diff] [blame] | 952 | DWORD renderState[WINEHIGHEST_RENDER_STATE + 1]; |
Jason Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 953 | |
Jason Edmeades | f738c14 | 2004-12-09 11:42:34 +0000 | [diff] [blame] | 954 | /* Texture */ |
Oliver Stieber | abb11f3 | 2005-07-05 14:05:18 +0000 | [diff] [blame] | 955 | IWineD3DBaseTexture *textures[MAX_TEXTURES]; |
| 956 | int textureDimensions[MAX_SAMPLERS]; |
Jason Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 957 | |
| 958 | /* Texture State Stage */ |
Oliver Stieber | 7cb748f | 2005-07-26 18:49:30 +0000 | [diff] [blame] | 959 | DWORD textureState[MAX_TEXTURES][WINED3D_HIGHEST_TEXTURE_STATE + 1]; |
Oliver Stieber | 18857f1 | 2005-06-24 11:53:07 +0000 | [diff] [blame] | 960 | /* Sampler States */ |
Oliver Stieber | 7cb748f | 2005-07-26 18:49:30 +0000 | [diff] [blame] | 961 | DWORD samplerState[MAX_SAMPLERS][WINED3D_HIGHEST_SAMPLER_STATE + 1]; |
Oliver Stieber | 18857f1 | 2005-06-24 11:53:07 +0000 | [diff] [blame] | 962 | |
Jason Edmeades | 447d5ed | 2004-10-21 20:59:12 +0000 | [diff] [blame] | 963 | }; |
| 964 | |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 965 | extern const IWineD3DStateBlockVtbl IWineD3DStateBlock_Vtbl; |
Jason Edmeades | 447d5ed | 2004-10-21 20:59:12 +0000 | [diff] [blame] | 966 | |
| 967 | /***************************************************************************** |
Oliver Stieber | 7b26165 | 2005-03-03 13:57:15 +0000 | [diff] [blame] | 968 | * IWineD3DQueryImpl implementation structure (extends IUnknown) |
| 969 | */ |
| 970 | typedef struct IWineD3DQueryImpl |
| 971 | { |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 972 | const IWineD3DQueryVtbl *lpVtbl; |
Mike McCormack | 8955ac4 | 2005-07-28 10:16:21 +0000 | [diff] [blame] | 973 | LONG ref; /* Note: Ref counting not required */ |
Oliver Stieber | 7b26165 | 2005-03-03 13:57:15 +0000 | [diff] [blame] | 974 | |
| 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 Stieber | 5ea96a8 | 2005-09-21 09:43:13 +0000 | [diff] [blame] | 985 | /* TODO: Think about using a IUnknown instead of a void* */ |
Oliver Stieber | 7b26165 | 2005-03-03 13:57:15 +0000 | [diff] [blame] | 986 | void *extendedData; |
| 987 | |
| 988 | |
| 989 | } IWineD3DQueryImpl; |
| 990 | |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 991 | extern const IWineD3DQueryVtbl IWineD3DQuery_Vtbl; |
Oliver Stieber | 7b26165 | 2005-03-03 13:57:15 +0000 | [diff] [blame] | 992 | |
Oliver Stieber | 5ea96a8 | 2005-09-21 09:43:13 +0000 | [diff] [blame] | 993 | /* Datastructures for IWineD3DQueryImpl.extendedData */ |
| 994 | typedef struct WineQueryOcclusionData { |
| 995 | unsigned int queryId; |
| 996 | } WineQueryOcclusionData; |
| 997 | |
| 998 | |
Oliver Stieber | 7b26165 | 2005-03-03 13:57:15 +0000 | [diff] [blame] | 999 | /***************************************************************************** |
Oliver Stieber | 46e7c30 | 2005-06-23 11:05:24 +0000 | [diff] [blame] | 1000 | * IWineD3DSwapChainImpl implementation structure (extends IUnknown) |
| 1001 | */ |
| 1002 | |
| 1003 | typedef struct IWineD3DSwapChainImpl |
| 1004 | { |
| 1005 | /*IUnknown part*/ |
| 1006 | IWineD3DSwapChainVtbl *lpVtbl; |
Mike McCormack | 8955ac4 | 2005-07-28 10:16:21 +0000 | [diff] [blame] | 1007 | LONG ref; /* Note: Ref counting not required */ |
Oliver Stieber | 46e7c30 | 2005-06-23 11:05:24 +0000 | [diff] [blame] | 1008 | |
| 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 Gouget | 02c25a8 | 2005-06-30 18:19:33 +0000 | [diff] [blame] | 1030 | /* 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 Stieber | 46e7c30 | 2005-06-23 11:05:24 +0000 | [diff] [blame] | 1031 | Drawable drawable; |
| 1032 | } IWineD3DSwapChainImpl; |
| 1033 | |
| 1034 | extern IWineD3DSwapChainVtbl IWineD3DSwapChain_Vtbl; |
| 1035 | |
| 1036 | /***************************************************************************** |
Jason Edmeades | 447d5ed | 2004-10-21 20:59:12 +0000 | [diff] [blame] | 1037 | * Utility function prototypes |
| 1038 | */ |
Jason Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 1039 | |
| 1040 | /* Trace routines */ |
Oliver Stieber | b220ce1 | 2005-07-13 19:38:39 +0000 | [diff] [blame] | 1041 | const char* debug_d3dformat(WINED3DFORMAT fmt); |
Jason Edmeades | c579fa6 | 2004-10-05 02:14:06 +0000 | [diff] [blame] | 1042 | const char* debug_d3ddevicetype(D3DDEVTYPE devtype); |
| 1043 | const char* debug_d3dresourcetype(D3DRESOURCETYPE res); |
| 1044 | const char* debug_d3dusage(DWORD usage); |
Jason Edmeades | f738c14 | 2004-12-09 11:42:34 +0000 | [diff] [blame] | 1045 | const char* debug_d3dprimitivetype(D3DPRIMITIVETYPE PrimitiveType); |
Jason Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 1046 | const char* debug_d3drenderstate(DWORD state); |
| 1047 | const char* debug_d3dtexturestate(DWORD state); |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 1048 | const char* debug_d3dpool(D3DPOOL pool); |
Jason Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 1049 | |
| 1050 | /* Routines for GL <-> D3D values */ |
| 1051 | GLenum StencilOp(DWORD op); |
| 1052 | void set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, D3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3); |
Oliver Stieber | 052d108 | 2005-07-26 20:01:29 +0000 | [diff] [blame] | 1053 | void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords); |
Jason Edmeades | 2003c7a | 2004-12-13 13:35:38 +0000 | [diff] [blame] | 1054 | void GetSrcAndOpFromValue(DWORD iValue, BOOL isAlphaArg, GLenum* source, GLenum* operand); |
Jason Edmeades | ae5a436 | 2004-09-28 02:12:12 +0000 | [diff] [blame] | 1055 | |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 1056 | SHORT D3DFmtGetBpp(IWineD3DDeviceImpl* This, D3DFORMAT fmt); |
| 1057 | GLenum D3DFmt2GLFmt(IWineD3DDeviceImpl* This, D3DFORMAT fmt); |
| 1058 | GLenum D3DFmt2GLType(IWineD3DDeviceImpl *This, D3DFORMAT fmt); |
| 1059 | GLint D3DFmt2GLIntFmt(IWineD3DDeviceImpl* This, D3DFORMAT fmt); |
| 1060 | |
Oliver Stieber | 8a6799d | 2005-07-07 20:35:05 +0000 | [diff] [blame] | 1061 | int D3DFmtMakeGlCfg(D3DFORMAT BackBufferFormat, D3DFORMAT StencilBufferFormat, int *attribs, int* nAttribs, BOOL alternate); |
| 1062 | |
| 1063 | |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 1064 | /***************************************************************************** |
| 1065 | * To enable calling of inherited functions, requires prototypes |
Jason Edmeades | 33025b2 | 2005-01-18 11:42:29 +0000 | [diff] [blame] | 1066 | * |
| 1067 | * Note: Only require classes which are subclassed, ie resource, basetexture, |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 1068 | */ |
| 1069 | /*** IUnknown methods ***/ |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 1070 | 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 Stieber | 67f2ad4 | 2005-03-29 19:01:00 +0000 | [diff] [blame] | 1083 | /*** class static members ***/ |
| 1084 | void IWineD3DResourceImpl_CleanUp(IWineD3DResource *iface); |
Jason Edmeades | bcecddc | 2005-01-17 13:44:57 +0000 | [diff] [blame] | 1085 | |
| 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 Junqueira | cc8762a | 2005-07-24 17:11:33 +0000 | [diff] [blame] | 1109 | |
| 1110 | extern BYTE* WINAPI IWineD3DVertexBufferImpl_GetMemory(IWineD3DVertexBuffer* iface, DWORD iOffset); |
| 1111 | extern HRESULT WINAPI IWineD3DVertexBufferImpl_ReleaseMemory(IWineD3DVertexBuffer* iface); |
Oliver Stieber | 67f2ad4 | 2005-03-29 19:01:00 +0000 | [diff] [blame] | 1112 | extern HRESULT WINAPI IWineD3DBaseTextureImpl_BindTexture(IWineD3DBaseTexture *iface); |
| 1113 | extern HRESULT WINAPI IWineD3DBaseTextureImpl_UnBindTexture(IWineD3DBaseTexture *iface); |
Oliver Stieber | bb6f9b0 | 2005-08-03 11:00:28 +0000 | [diff] [blame] | 1114 | extern void WINAPI IWineD3DBaseTextureImpl_ApplyStateChanges(IWineD3DBaseTexture *iface, const DWORD textureStates[WINED3D_HIGHEST_TEXTURE_STATE + 1], const DWORD samplerStates[WINED3D_HIGHEST_SAMPLER_STATE + 1]); |
Oliver Stieber | 67f2ad4 | 2005-03-29 19:01:00 +0000 | [diff] [blame] | 1115 | /*** class static members ***/ |
| 1116 | void IWineD3DBaseTextureImpl_CleanUp(IWineD3DBaseTexture *iface); |
Jason Edmeades | 4142785 | 2005-01-09 17:37:02 +0000 | [diff] [blame] | 1117 | |
Oliver Stieber | 2c0e97e | 2005-08-17 11:34:03 +0000 | [diff] [blame] | 1118 | /* 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? */ |
| 1119 | enum 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 Junqueira | 0196861 | 2003-11-14 03:50:35 +0000 | [diff] [blame] | 1127 | /***************************************************************************** |
| 1128 | * IDirect3DVertexShader implementation structure |
| 1129 | */ |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 1130 | typedef struct IWineD3DVertexShaderImpl { |
| 1131 | /* IUnknown parts*/ |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 1132 | const IWineD3DVertexShaderVtbl *lpVtbl; |
Mike McCormack | 8955ac4 | 2005-07-28 10:16:21 +0000 | [diff] [blame] | 1133 | LONG ref; /* Note: Ref counting not required */ |
Raphael Junqueira | 0196861 | 2003-11-14 03:50:35 +0000 | [diff] [blame] | 1134 | |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 1135 | IUnknown *parent; |
| 1136 | IWineD3DDeviceImpl *wineD3DDevice; |
Raphael Junqueira | 0196861 | 2003-11-14 03:50:35 +0000 | [diff] [blame] | 1137 | |
Oliver Stieber | 2c0e97e | 2005-08-17 11:34:03 +0000 | [diff] [blame] | 1138 | /* IWineD3DVertexShaderImpl */ |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 1139 | CONST DWORD *function; |
| 1140 | UINT functionLength; |
| 1141 | |
Oliver Stieber | 80cbb93 | 2005-08-17 09:54:54 +0000 | [diff] [blame] | 1142 | DWORD usage; |
| 1143 | DWORD version; |
Oliver Stieber | 2c0e97e | 2005-08-17 11:34:03 +0000 | [diff] [blame] | 1144 | |
| 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 Stieber | 80cbb93 | 2005-08-17 09:54:54 +0000 | [diff] [blame] | 1152 | /* run time datas... */ |
| 1153 | VSHADERDATA* data; |
Mike McCormack | 93ab695 | 2005-08-26 08:53:31 +0000 | [diff] [blame] | 1154 | GLuint prgId; |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 1155 | #if 0 /* needs reworking */ |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 1156 | /* run time datas */ |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 1157 | VSHADERINPUTDATA input; |
| 1158 | VSHADEROUTPUTDATA output; |
| 1159 | #endif |
| 1160 | } IWineD3DVertexShaderImpl; |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 1161 | extern const IWineD3DVertexShaderVtbl IWineD3DVertexShader_Vtbl; |
Raphael Junqueira | 0196861 | 2003-11-14 03:50:35 +0000 | [diff] [blame] | 1162 | |
| 1163 | /***************************************************************************** |
| 1164 | * IDirect3DPixelShader implementation structure |
| 1165 | */ |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 1166 | typedef struct IWineD3DPixelShaderImpl { |
| 1167 | /* IUnknown parts*/ |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 1168 | const IWineD3DPixelShaderVtbl *lpVtbl; |
Mike McCormack | 8955ac4 | 2005-07-28 10:16:21 +0000 | [diff] [blame] | 1169 | LONG ref; /* Note: Ref counting not required */ |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 1170 | |
| 1171 | IUnknown *parent; |
| 1172 | IWineD3DDeviceImpl *wineD3DDevice; |
Raphael Junqueira | 0196861 | 2003-11-14 03:50:35 +0000 | [diff] [blame] | 1173 | |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 1174 | |
Oliver Stieber | 80cbb93 | 2005-08-17 09:54:54 +0000 | [diff] [blame] | 1175 | /* IWineD3DPixelShaderImpl */ |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 1176 | CONST DWORD *function; |
| 1177 | UINT functionLength; |
Oliver Stieber | 80cbb93 | 2005-08-17 09:54:54 +0000 | [diff] [blame] | 1178 | |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 1179 | #if 0 /* needs reworking */ |
Oliver Stieber | 2121f78 | 2005-03-02 12:16:10 +0000 | [diff] [blame] | 1180 | /* run time datas */ |
| 1181 | PSHADERDATA* data; |
| 1182 | PSHADERINPUTDATA input; |
| 1183 | PSHADEROUTPUTDATA output; |
| 1184 | #endif |
| 1185 | } IWineD3DPixelShaderImpl; |
| 1186 | |
Dmitry Timoshkov | eba47f1 | 2005-06-06 19:50:35 +0000 | [diff] [blame] | 1187 | extern const IWineD3DPixelShaderVtbl IWineD3DPixelShader_Vtbl; |
Raphael Junqueira | 0196861 | 2003-11-14 03:50:35 +0000 | [diff] [blame] | 1188 | #endif |