Raphael Junqueira | 3cae8cf | 2003-06-04 21:55:29 +0000 | [diff] [blame] | 1 | /* |
| 2 | * D3D8 utils |
| 3 | * |
| 4 | * Copyright 2002-2003 Jason Edmeades |
| 5 | * Raphael Junqueira |
| 6 | * |
| 7 | * This library is free software; you can redistribute it and/or |
| 8 | * modify it under the terms of the GNU Lesser General Public |
| 9 | * License as published by the Free Software Foundation; either |
| 10 | * version 2.1 of the License, or (at your option) any later version. |
| 11 | * |
| 12 | * This library is distributed in the hope that it will be useful, |
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 15 | * Lesser General Public License for more details. |
| 16 | * |
| 17 | * You should have received a copy of the GNU Lesser General Public |
| 18 | * License along with this library; if not, write to the Free Software |
| 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 20 | */ |
| 21 | |
| 22 | #include "config.h" |
| 23 | |
| 24 | #include <math.h> |
Alexandre Julliard | e37c6e1 | 2003-09-05 23:08:26 +0000 | [diff] [blame] | 25 | #include <stdarg.h> |
Raphael Junqueira | 3cae8cf | 2003-06-04 21:55:29 +0000 | [diff] [blame] | 26 | |
| 27 | #define NONAMELESSUNION |
| 28 | #define NONAMELESSSTRUCT |
| 29 | #include "windef.h" |
| 30 | #include "winbase.h" |
| 31 | #include "winuser.h" |
| 32 | #include "wingdi.h" |
| 33 | #include "wine/debug.h" |
| 34 | |
| 35 | #include "d3d8_private.h" |
| 36 | |
| 37 | WINE_DEFAULT_DEBUG_CHANNEL(d3d); |
| 38 | |
Raphael Junqueira | 3cae8cf | 2003-06-04 21:55:29 +0000 | [diff] [blame] | 39 | const char* debug_d3ddevicetype(D3DDEVTYPE devtype) { |
| 40 | switch (devtype) { |
| 41 | #define DEVTYPE_TO_STR(dev) case dev: return #dev |
| 42 | DEVTYPE_TO_STR(D3DDEVTYPE_HAL); |
| 43 | DEVTYPE_TO_STR(D3DDEVTYPE_REF); |
| 44 | DEVTYPE_TO_STR(D3DDEVTYPE_SW); |
| 45 | #undef DEVTYPE_TO_STR |
| 46 | default: |
| 47 | FIXME("Unrecognized %u D3DDEVTYPE!\n", devtype); |
| 48 | return "unrecognized"; |
| 49 | } |
| 50 | } |
| 51 | |
| 52 | const char* debug_d3dusage(DWORD usage) { |
| 53 | switch (usage) { |
| 54 | #define D3DUSAGE_TO_STR(u) case u: return #u |
| 55 | D3DUSAGE_TO_STR(D3DUSAGE_RENDERTARGET); |
| 56 | D3DUSAGE_TO_STR(D3DUSAGE_DEPTHSTENCIL); |
| 57 | D3DUSAGE_TO_STR(D3DUSAGE_WRITEONLY); |
| 58 | D3DUSAGE_TO_STR(D3DUSAGE_SOFTWAREPROCESSING); |
| 59 | D3DUSAGE_TO_STR(D3DUSAGE_DONOTCLIP); |
| 60 | D3DUSAGE_TO_STR(D3DUSAGE_POINTS); |
| 61 | D3DUSAGE_TO_STR(D3DUSAGE_RTPATCHES); |
| 62 | D3DUSAGE_TO_STR(D3DUSAGE_NPATCHES); |
| 63 | D3DUSAGE_TO_STR(D3DUSAGE_DYNAMIC); |
| 64 | #undef D3DUSAGE_TO_STR |
| 65 | case 0: return "none"; |
| 66 | default: |
| 67 | FIXME("Unrecognized %lu Usage!\n", usage); |
| 68 | return "unrecognized"; |
| 69 | } |
| 70 | } |
| 71 | |
| 72 | const char* debug_d3dformat(D3DFORMAT fmt) { |
| 73 | switch (fmt) { |
| 74 | #define FMT_TO_STR(fmt) case fmt: return #fmt |
| 75 | FMT_TO_STR(D3DFMT_UNKNOWN); |
| 76 | FMT_TO_STR(D3DFMT_R8G8B8); |
| 77 | FMT_TO_STR(D3DFMT_A8R8G8B8); |
| 78 | FMT_TO_STR(D3DFMT_X8R8G8B8); |
| 79 | FMT_TO_STR(D3DFMT_R5G6B5); |
| 80 | FMT_TO_STR(D3DFMT_X1R5G5B5); |
| 81 | FMT_TO_STR(D3DFMT_A1R5G5B5); |
| 82 | FMT_TO_STR(D3DFMT_A4R4G4B4); |
| 83 | FMT_TO_STR(D3DFMT_R3G3B2); |
| 84 | FMT_TO_STR(D3DFMT_A8); |
| 85 | FMT_TO_STR(D3DFMT_A8R3G3B2); |
| 86 | FMT_TO_STR(D3DFMT_X4R4G4B4); |
| 87 | FMT_TO_STR(D3DFMT_A8P8); |
| 88 | FMT_TO_STR(D3DFMT_P8); |
| 89 | FMT_TO_STR(D3DFMT_L8); |
| 90 | FMT_TO_STR(D3DFMT_A8L8); |
| 91 | FMT_TO_STR(D3DFMT_A4L4); |
| 92 | FMT_TO_STR(D3DFMT_V8U8); |
| 93 | FMT_TO_STR(D3DFMT_L6V5U5); |
| 94 | FMT_TO_STR(D3DFMT_X8L8V8U8); |
| 95 | FMT_TO_STR(D3DFMT_Q8W8V8U8); |
| 96 | FMT_TO_STR(D3DFMT_V16U16); |
| 97 | FMT_TO_STR(D3DFMT_W11V11U10); |
| 98 | FMT_TO_STR(D3DFMT_UYVY); |
| 99 | FMT_TO_STR(D3DFMT_YUY2); |
| 100 | FMT_TO_STR(D3DFMT_DXT1); |
| 101 | FMT_TO_STR(D3DFMT_DXT2); |
| 102 | FMT_TO_STR(D3DFMT_DXT3); |
| 103 | FMT_TO_STR(D3DFMT_DXT4); |
| 104 | FMT_TO_STR(D3DFMT_DXT5); |
| 105 | FMT_TO_STR(D3DFMT_D16_LOCKABLE); |
| 106 | FMT_TO_STR(D3DFMT_D32); |
| 107 | FMT_TO_STR(D3DFMT_D15S1); |
| 108 | FMT_TO_STR(D3DFMT_D24S8); |
| 109 | FMT_TO_STR(D3DFMT_D16); |
| 110 | FMT_TO_STR(D3DFMT_D24X8); |
| 111 | FMT_TO_STR(D3DFMT_D24X4S4); |
| 112 | FMT_TO_STR(D3DFMT_VERTEXDATA); |
| 113 | FMT_TO_STR(D3DFMT_INDEX16); |
| 114 | FMT_TO_STR(D3DFMT_INDEX32); |
| 115 | #undef FMT_TO_STR |
| 116 | default: |
| 117 | FIXME("Unrecognized %u D3DFORMAT!\n", fmt); |
| 118 | return "unrecognized"; |
| 119 | } |
| 120 | } |
| 121 | |
| 122 | const char* debug_d3dressourcetype(D3DRESOURCETYPE res) { |
| 123 | switch (res) { |
| 124 | #define RES_TO_STR(res) case res: return #res; |
| 125 | RES_TO_STR(D3DRTYPE_SURFACE); |
| 126 | RES_TO_STR(D3DRTYPE_VOLUME); |
| 127 | RES_TO_STR(D3DRTYPE_TEXTURE); |
| 128 | RES_TO_STR(D3DRTYPE_VOLUMETEXTURE); |
| 129 | RES_TO_STR(D3DRTYPE_CUBETEXTURE); |
| 130 | RES_TO_STR(D3DRTYPE_VERTEXBUFFER); |
| 131 | RES_TO_STR(D3DRTYPE_INDEXBUFFER); |
| 132 | #undef RES_TO_STR |
| 133 | default: |
| 134 | FIXME("Unrecognized %u D3DRESOURCETYPE!\n", res); |
| 135 | return "unrecognized"; |
| 136 | } |
| 137 | } |
| 138 | |
| 139 | const char* debug_d3dprimitivetype(D3DPRIMITIVETYPE PrimitiveType) { |
| 140 | switch (PrimitiveType) { |
| 141 | #define PRIM_TO_STR(prim) case prim: return #prim; |
| 142 | PRIM_TO_STR(D3DPT_POINTLIST); |
| 143 | PRIM_TO_STR(D3DPT_LINELIST); |
| 144 | PRIM_TO_STR(D3DPT_LINESTRIP); |
| 145 | PRIM_TO_STR(D3DPT_TRIANGLELIST); |
| 146 | PRIM_TO_STR(D3DPT_TRIANGLESTRIP); |
| 147 | PRIM_TO_STR(D3DPT_TRIANGLEFAN); |
| 148 | #undef PRIM_TO_STR |
| 149 | default: |
| 150 | FIXME("Unrecognized %u D3DPRIMITIVETYPE!\n", PrimitiveType); |
| 151 | return "unrecognized"; |
| 152 | } |
| 153 | } |
| 154 | |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 155 | const char* debug_d3dpool(D3DPOOL Pool) { |
| 156 | switch (Pool) { |
| 157 | #define POOL_TO_STR(p) case p: return #p; |
| 158 | POOL_TO_STR(D3DPOOL_DEFAULT); |
| 159 | POOL_TO_STR(D3DPOOL_MANAGED); |
| 160 | POOL_TO_STR(D3DPOOL_SYSTEMMEM); |
| 161 | POOL_TO_STR(D3DPOOL_SCRATCH); |
| 162 | #undef POOL_TO_STR |
| 163 | default: |
| 164 | FIXME("Unrecognized %u D3DPOOL!\n", Pool); |
| 165 | return "unrecognized"; |
| 166 | } |
| 167 | } |
| 168 | |
Jason Edmeades | 21a0928 | 2003-06-13 19:14:34 +0000 | [diff] [blame] | 169 | const char* debug_d3drenderstate(DWORD state) { |
| 170 | switch (state) { |
| 171 | #define D3DSTATE_TO_STR(u) case u: return #u |
| 172 | D3DSTATE_TO_STR(D3DRS_ZENABLE ); |
| 173 | D3DSTATE_TO_STR(D3DRS_FILLMODE ); |
| 174 | D3DSTATE_TO_STR(D3DRS_SHADEMODE ); |
| 175 | D3DSTATE_TO_STR(D3DRS_LINEPATTERN ); |
| 176 | D3DSTATE_TO_STR(D3DRS_ZWRITEENABLE ); |
| 177 | D3DSTATE_TO_STR(D3DRS_ALPHATESTENABLE ); |
| 178 | D3DSTATE_TO_STR(D3DRS_LASTPIXEL ); |
| 179 | D3DSTATE_TO_STR(D3DRS_SRCBLEND ); |
| 180 | D3DSTATE_TO_STR(D3DRS_DESTBLEND ); |
| 181 | D3DSTATE_TO_STR(D3DRS_CULLMODE ); |
| 182 | D3DSTATE_TO_STR(D3DRS_ZFUNC ); |
| 183 | D3DSTATE_TO_STR(D3DRS_ALPHAREF ); |
| 184 | D3DSTATE_TO_STR(D3DRS_ALPHAFUNC ); |
| 185 | D3DSTATE_TO_STR(D3DRS_DITHERENABLE ); |
| 186 | D3DSTATE_TO_STR(D3DRS_ALPHABLENDENABLE ); |
| 187 | D3DSTATE_TO_STR(D3DRS_FOGENABLE ); |
| 188 | D3DSTATE_TO_STR(D3DRS_SPECULARENABLE ); |
| 189 | D3DSTATE_TO_STR(D3DRS_ZVISIBLE ); |
| 190 | D3DSTATE_TO_STR(D3DRS_FOGCOLOR ); |
| 191 | D3DSTATE_TO_STR(D3DRS_FOGTABLEMODE ); |
| 192 | D3DSTATE_TO_STR(D3DRS_FOGSTART ); |
| 193 | D3DSTATE_TO_STR(D3DRS_FOGEND ); |
| 194 | D3DSTATE_TO_STR(D3DRS_FOGDENSITY ); |
| 195 | D3DSTATE_TO_STR(D3DRS_EDGEANTIALIAS ); |
| 196 | D3DSTATE_TO_STR(D3DRS_ZBIAS ); |
| 197 | D3DSTATE_TO_STR(D3DRS_RANGEFOGENABLE ); |
| 198 | D3DSTATE_TO_STR(D3DRS_STENCILENABLE ); |
| 199 | D3DSTATE_TO_STR(D3DRS_STENCILFAIL ); |
| 200 | D3DSTATE_TO_STR(D3DRS_STENCILZFAIL ); |
| 201 | D3DSTATE_TO_STR(D3DRS_STENCILPASS ); |
| 202 | D3DSTATE_TO_STR(D3DRS_STENCILFUNC ); |
| 203 | D3DSTATE_TO_STR(D3DRS_STENCILREF ); |
| 204 | D3DSTATE_TO_STR(D3DRS_STENCILMASK ); |
| 205 | D3DSTATE_TO_STR(D3DRS_STENCILWRITEMASK ); |
| 206 | D3DSTATE_TO_STR(D3DRS_TEXTUREFACTOR ); |
| 207 | D3DSTATE_TO_STR(D3DRS_WRAP0 ); |
| 208 | D3DSTATE_TO_STR(D3DRS_WRAP1 ); |
| 209 | D3DSTATE_TO_STR(D3DRS_WRAP2 ); |
| 210 | D3DSTATE_TO_STR(D3DRS_WRAP3 ); |
| 211 | D3DSTATE_TO_STR(D3DRS_WRAP4 ); |
| 212 | D3DSTATE_TO_STR(D3DRS_WRAP5 ); |
| 213 | D3DSTATE_TO_STR(D3DRS_WRAP6 ); |
| 214 | D3DSTATE_TO_STR(D3DRS_WRAP7 ); |
| 215 | D3DSTATE_TO_STR(D3DRS_CLIPPING ); |
| 216 | D3DSTATE_TO_STR(D3DRS_LIGHTING ); |
| 217 | D3DSTATE_TO_STR(D3DRS_AMBIENT ); |
| 218 | D3DSTATE_TO_STR(D3DRS_FOGVERTEXMODE ); |
| 219 | D3DSTATE_TO_STR(D3DRS_COLORVERTEX ); |
| 220 | D3DSTATE_TO_STR(D3DRS_LOCALVIEWER ); |
| 221 | D3DSTATE_TO_STR(D3DRS_NORMALIZENORMALS ); |
| 222 | D3DSTATE_TO_STR(D3DRS_DIFFUSEMATERIALSOURCE ); |
| 223 | D3DSTATE_TO_STR(D3DRS_SPECULARMATERIALSOURCE ); |
| 224 | D3DSTATE_TO_STR(D3DRS_AMBIENTMATERIALSOURCE ); |
| 225 | D3DSTATE_TO_STR(D3DRS_EMISSIVEMATERIALSOURCE ); |
| 226 | D3DSTATE_TO_STR(D3DRS_VERTEXBLEND ); |
| 227 | D3DSTATE_TO_STR(D3DRS_CLIPPLANEENABLE ); |
| 228 | D3DSTATE_TO_STR(D3DRS_SOFTWAREVERTEXPROCESSING ); |
| 229 | D3DSTATE_TO_STR(D3DRS_POINTSIZE ); |
| 230 | D3DSTATE_TO_STR(D3DRS_POINTSIZE_MIN ); |
| 231 | D3DSTATE_TO_STR(D3DRS_POINTSPRITEENABLE ); |
| 232 | D3DSTATE_TO_STR(D3DRS_POINTSCALEENABLE ); |
| 233 | D3DSTATE_TO_STR(D3DRS_POINTSCALE_A ); |
| 234 | D3DSTATE_TO_STR(D3DRS_POINTSCALE_B ); |
| 235 | D3DSTATE_TO_STR(D3DRS_POINTSCALE_C ); |
| 236 | D3DSTATE_TO_STR(D3DRS_MULTISAMPLEANTIALIAS ); |
| 237 | D3DSTATE_TO_STR(D3DRS_MULTISAMPLEMASK ); |
| 238 | D3DSTATE_TO_STR(D3DRS_PATCHEDGESTYLE ); |
| 239 | D3DSTATE_TO_STR(D3DRS_PATCHSEGMENTS ); |
| 240 | D3DSTATE_TO_STR(D3DRS_DEBUGMONITORTOKEN ); |
| 241 | D3DSTATE_TO_STR(D3DRS_POINTSIZE_MAX ); |
| 242 | D3DSTATE_TO_STR(D3DRS_INDEXEDVERTEXBLENDENABLE ); |
| 243 | D3DSTATE_TO_STR(D3DRS_COLORWRITEENABLE ); |
| 244 | D3DSTATE_TO_STR(D3DRS_TWEENFACTOR ); |
| 245 | D3DSTATE_TO_STR(D3DRS_BLENDOP ); |
| 246 | D3DSTATE_TO_STR(D3DRS_POSITIONORDER ); |
| 247 | D3DSTATE_TO_STR(D3DRS_NORMALORDER ); |
| 248 | #undef D3DSTATE_TO_STR |
| 249 | default: |
| 250 | FIXME("Unrecognized %lu render state!\n", state); |
| 251 | return "unrecognized"; |
| 252 | } |
| 253 | } |
| 254 | |
| 255 | const char* debug_d3dtexturestate(DWORD state) { |
| 256 | switch (state) { |
| 257 | #define D3DSTATE_TO_STR(u) case u: return #u |
| 258 | D3DSTATE_TO_STR(D3DTSS_COLOROP ); |
| 259 | D3DSTATE_TO_STR(D3DTSS_COLORARG1 ); |
| 260 | D3DSTATE_TO_STR(D3DTSS_COLORARG2 ); |
| 261 | D3DSTATE_TO_STR(D3DTSS_ALPHAOP ); |
| 262 | D3DSTATE_TO_STR(D3DTSS_ALPHAARG1 ); |
| 263 | D3DSTATE_TO_STR(D3DTSS_ALPHAARG2 ); |
| 264 | D3DSTATE_TO_STR(D3DTSS_BUMPENVMAT00 ); |
| 265 | D3DSTATE_TO_STR(D3DTSS_BUMPENVMAT01 ); |
| 266 | D3DSTATE_TO_STR(D3DTSS_BUMPENVMAT10 ); |
| 267 | D3DSTATE_TO_STR(D3DTSS_BUMPENVMAT11 ); |
| 268 | D3DSTATE_TO_STR(D3DTSS_TEXCOORDINDEX ); |
| 269 | D3DSTATE_TO_STR(D3DTSS_ADDRESSU ); |
| 270 | D3DSTATE_TO_STR(D3DTSS_ADDRESSV ); |
| 271 | D3DSTATE_TO_STR(D3DTSS_BORDERCOLOR ); |
| 272 | D3DSTATE_TO_STR(D3DTSS_MAGFILTER ); |
| 273 | D3DSTATE_TO_STR(D3DTSS_MINFILTER ); |
| 274 | D3DSTATE_TO_STR(D3DTSS_MIPFILTER ); |
| 275 | D3DSTATE_TO_STR(D3DTSS_MIPMAPLODBIAS ); |
| 276 | D3DSTATE_TO_STR(D3DTSS_MAXMIPLEVEL ); |
| 277 | D3DSTATE_TO_STR(D3DTSS_MAXANISOTROPY ); |
| 278 | D3DSTATE_TO_STR(D3DTSS_BUMPENVLSCALE ); |
| 279 | D3DSTATE_TO_STR(D3DTSS_BUMPENVLOFFSET ); |
| 280 | D3DSTATE_TO_STR(D3DTSS_TEXTURETRANSFORMFLAGS ); |
| 281 | D3DSTATE_TO_STR(D3DTSS_ADDRESSW ); |
| 282 | D3DSTATE_TO_STR(D3DTSS_COLORARG0 ); |
| 283 | D3DSTATE_TO_STR(D3DTSS_ALPHAARG0 ); |
| 284 | D3DSTATE_TO_STR(D3DTSS_RESULTARG ); |
| 285 | #undef D3DSTATE_TO_STR |
| 286 | case 12: |
| 287 | /* Note D3DTSS are not consecutive, so skip these */ |
| 288 | return "unused"; |
| 289 | break; |
| 290 | default: |
| 291 | FIXME("Unrecognized %lu texture state!\n", state); |
| 292 | return "unrecognized"; |
| 293 | } |
| 294 | } |
| 295 | |
Raphael Junqueira | 3cae8cf | 2003-06-04 21:55:29 +0000 | [diff] [blame] | 296 | /* |
| 297 | * Simple utility routines used for dx -> gl mapping of byte formats |
| 298 | */ |
Raphael Junqueira | 3cae8cf | 2003-06-04 21:55:29 +0000 | [diff] [blame] | 299 | int D3DPrimitiveListGetVertexSize(D3DPRIMITIVETYPE PrimitiveType, int iNumPrim) { |
| 300 | switch (PrimitiveType) { |
| 301 | case D3DPT_POINTLIST: return iNumPrim; |
| 302 | case D3DPT_LINELIST: return iNumPrim * 2; |
| 303 | case D3DPT_LINESTRIP: return iNumPrim + 1; |
| 304 | case D3DPT_TRIANGLELIST: return iNumPrim * 3; |
| 305 | case D3DPT_TRIANGLESTRIP: return iNumPrim + 2; |
| 306 | case D3DPT_TRIANGLEFAN: return iNumPrim + 2; |
| 307 | default: |
| 308 | FIXME("Unrecognized %u D3DPRIMITIVETYPE!\n", PrimitiveType); |
| 309 | return 0; |
| 310 | } |
| 311 | } |
| 312 | |
| 313 | int D3DPrimitive2GLenum(D3DPRIMITIVETYPE PrimitiveType) { |
| 314 | switch (PrimitiveType) { |
| 315 | case D3DPT_POINTLIST: return GL_POINTS; |
| 316 | case D3DPT_LINELIST: return GL_LINES; |
| 317 | case D3DPT_LINESTRIP: return GL_LINE_STRIP; |
| 318 | case D3DPT_TRIANGLELIST: return GL_TRIANGLES; |
| 319 | case D3DPT_TRIANGLESTRIP: return GL_TRIANGLE_STRIP; |
| 320 | case D3DPT_TRIANGLEFAN: return GL_TRIANGLE_FAN; |
| 321 | default: |
| 322 | FIXME("Unrecognized %u D3DPRIMITIVETYPE!\n", PrimitiveType); |
| 323 | return GL_POLYGON; |
| 324 | } |
| 325 | } |
| 326 | |
| 327 | int D3DFVFGetSize(D3DFORMAT fvf) { |
| 328 | int ret = 0; |
| 329 | if (fvf & D3DFVF_XYZ) ret += 3 * sizeof(float); |
| 330 | else if (fvf & D3DFVF_XYZRHW) ret += 4 * sizeof(float); |
| 331 | if (fvf & D3DFVF_NORMAL) ret += 3 * sizeof(float); |
| 332 | if (fvf & D3DFVF_PSIZE) ret += sizeof(float); |
| 333 | if (fvf & D3DFVF_DIFFUSE) ret += sizeof(DWORD); |
| 334 | if (fvf & D3DFVF_SPECULAR) ret += sizeof(DWORD); |
| 335 | /*if (fvf & D3DFVF_TEX1) ret += 1;*/ |
| 336 | return ret; |
| 337 | } |
| 338 | |
| 339 | GLenum D3DFmt2GLDepthFmt(D3DFORMAT fmt) { |
| 340 | switch (fmt) { |
| 341 | /* depth/stencil buffer */ |
| 342 | case D3DFMT_D16_LOCKABLE: |
| 343 | case D3DFMT_D16: |
| 344 | case D3DFMT_D15S1: |
| 345 | case D3DFMT_D24X4S4: |
| 346 | case D3DFMT_D24S8: |
| 347 | case D3DFMT_D24X8: |
| 348 | case D3DFMT_D32: |
| 349 | return GL_DEPTH_COMPONENT; |
| 350 | default: |
| 351 | FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt)); |
| 352 | } |
| 353 | return 0; |
| 354 | } |
| 355 | |
| 356 | GLenum D3DFmt2GLDepthType(D3DFORMAT fmt) { |
| 357 | switch (fmt) { |
| 358 | /* depth/stencil buffer */ |
| 359 | case D3DFMT_D15S1: |
| 360 | case D3DFMT_D16_LOCKABLE: |
| 361 | case D3DFMT_D16: |
| 362 | return GL_UNSIGNED_SHORT; |
| 363 | case D3DFMT_D24X4S4: |
| 364 | case D3DFMT_D24S8: |
| 365 | case D3DFMT_D24X8: |
| 366 | case D3DFMT_D32: |
| 367 | return GL_UNSIGNED_INT; |
| 368 | default: |
| 369 | FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt)); |
| 370 | } |
| 371 | return 0; |
| 372 | } |
| 373 | |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 374 | SHORT D3DFmtGetBpp(IDirect3DDevice8Impl* This, D3DFORMAT fmt) { |
| 375 | SHORT retVal; |
| 376 | |
| 377 | switch (fmt) { |
| 378 | /* color buffer */ |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 379 | case D3DFMT_R3G3B2: retVal = 1; break; |
| 380 | case D3DFMT_R5G6B5: retVal = 2; break; |
Raphael Junqueira | 40dd969 | 2004-05-19 04:33:42 +0000 | [diff] [blame] | 381 | case D3DFMT_R8G8B8: retVal = 3; break; |
| 382 | case D3DFMT_A1R5G5B5: retVal = 2; break; |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 383 | case D3DFMT_X1R5G5B5: retVal = 2; break; |
| 384 | case D3DFMT_A4R4G4B4: retVal = 2; break; |
| 385 | case D3DFMT_X4R4G4B4: retVal = 2; break; |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 386 | case D3DFMT_A8R8G8B8: retVal = 4; break; |
Raphael Junqueira | 40dd969 | 2004-05-19 04:33:42 +0000 | [diff] [blame] | 387 | case D3DFMT_X8R8G8B8: retVal = 4; break; |
| 388 | /* Paletted */ |
| 389 | case D3DFMT_P8: retVal = 1; break; |
| 390 | case D3DFMT_A8P8: retVal = 2; break; |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 391 | /* depth/stencil buffer */ |
| 392 | case D3DFMT_D16_LOCKABLE: retVal = 2; break; |
| 393 | case D3DFMT_D16: retVal = 2; break; |
Raphael Junqueira | 40dd969 | 2004-05-19 04:33:42 +0000 | [diff] [blame] | 394 | case D3DFMT_D32: retVal = 4; break; |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 395 | case D3DFMT_D15S1: retVal = 2; break; |
| 396 | case D3DFMT_D24X4S4: retVal = 4; break; |
| 397 | case D3DFMT_D24S8: retVal = 4; break; |
| 398 | case D3DFMT_D24X8: retVal = 4; break; |
Raphael Junqueira | 40dd969 | 2004-05-19 04:33:42 +0000 | [diff] [blame] | 399 | /* Luminance */ |
| 400 | case D3DFMT_L8: retVal = 1; break; |
| 401 | case D3DFMT_A4L4: retVal = 1; break; |
| 402 | case D3DFMT_A8L8: retVal = 2; break; |
| 403 | /* Bump */ |
| 404 | case D3DFMT_V8U8: retVal = 2; break; |
| 405 | case D3DFMT_L6V5U5: retVal = 2; break; |
| 406 | case D3DFMT_V16U16: retVal = 4; break; |
| 407 | case D3DFMT_X8L8V8U8: retVal = 4; break; |
Jason Edmeades | 7ac9d25 | 2003-09-19 00:20:19 +0000 | [diff] [blame] | 408 | /* Compressed */ |
| 409 | case D3DFMT_DXT1: retVal = 1; break; /* Actually 8 bytes per 16 pixels - Special cased later */ |
| 410 | case D3DFMT_DXT3: retVal = 1; break; /* Actually 16 bytes per 16 pixels */ |
| 411 | case D3DFMT_DXT5: retVal = 1; break; /* Actually 16 bytes per 16 pixels */ |
Raphael Junqueira | 40dd969 | 2004-05-19 04:33:42 +0000 | [diff] [blame] | 412 | /* to see */ |
| 413 | case D3DFMT_A8: retVal = 1; break; |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 414 | /* unknown */ |
| 415 | case D3DFMT_UNKNOWN: |
| 416 | /* Guess at the highest value of the above */ |
| 417 | TRACE("D3DFMT_UNKNOWN - Guessing at 4 bytes/pixel %u\n", fmt); |
| 418 | retVal = 4; |
| 419 | break; |
| 420 | |
| 421 | default: |
| 422 | FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt)); |
| 423 | retVal = 4; |
| 424 | } |
| 425 | TRACE("bytes/Pxl for fmt(%u,%s) = %d\n", fmt, debug_d3dformat(fmt), retVal); |
| 426 | return retVal; |
Raphael Junqueira | 3cae8cf | 2003-06-04 21:55:29 +0000 | [diff] [blame] | 427 | } |
| 428 | |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 429 | GLint D3DFmt2GLIntFmt(IDirect3DDevice8Impl* This, D3DFORMAT fmt) { |
Jason Edmeades | beb4ac8 | 2003-08-15 03:50:08 +0000 | [diff] [blame] | 430 | GLint retVal = 0; |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 431 | |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 432 | if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) { |
| 433 | switch (fmt) { |
| 434 | case D3DFMT_DXT1: retVal = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break; |
| 435 | case D3DFMT_DXT3: retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break; |
| 436 | case D3DFMT_DXT5: retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break; |
| 437 | default: |
| 438 | /* stupid compiler */ |
| 439 | break; |
| 440 | } |
| 441 | } |
Jason Edmeades | 7ac9d25 | 2003-09-19 00:20:19 +0000 | [diff] [blame] | 442 | |
Jason Edmeades | beb4ac8 | 2003-08-15 03:50:08 +0000 | [diff] [blame] | 443 | if (retVal == 0) { |
| 444 | switch (fmt) { |
Raphael Junqueira | 40dd969 | 2004-05-19 04:33:42 +0000 | [diff] [blame] | 445 | /* Paletted */ |
Jason Edmeades | beb4ac8 | 2003-08-15 03:50:08 +0000 | [diff] [blame] | 446 | case D3DFMT_P8: retVal = GL_COLOR_INDEX8_EXT; break; |
| 447 | case D3DFMT_A8P8: retVal = GL_COLOR_INDEX8_EXT; break; |
Raphael Junqueira | 40dd969 | 2004-05-19 04:33:42 +0000 | [diff] [blame] | 448 | /* Luminance */ |
| 449 | case D3DFMT_L8: retVal = GL_LUMINANCE8; break; |
| 450 | case D3DFMT_A8L8: retVal = GL_LUMINANCE8_ALPHA8; break; |
| 451 | case D3DFMT_A4L4: retVal = GL_LUMINANCE4_ALPHA4; break; |
| 452 | /* Bump */ |
Raphael Junqueira | d52c508 | 2004-04-29 00:20:18 +0000 | [diff] [blame] | 453 | case D3DFMT_V8U8: retVal = GL_COLOR_INDEX8_EXT; break; |
Raphael Junqueira | 40dd969 | 2004-05-19 04:33:42 +0000 | [diff] [blame] | 454 | case D3DFMT_V16U16: retVal = GL_COLOR_INDEX; break; |
| 455 | case D3DFMT_L6V5U5: retVal = GL_COLOR_INDEX8_EXT; break; |
| 456 | case D3DFMT_X8L8V8U8: retVal = GL_COLOR_INDEX; break; |
| 457 | /* color buffer */ |
| 458 | case D3DFMT_R3G3B2: retVal = GL_R3_G3_B2; break; |
Jason Edmeades | beb4ac8 | 2003-08-15 03:50:08 +0000 | [diff] [blame] | 459 | case D3DFMT_R5G6B5: retVal = GL_RGB5; break; /* fixme: internal format 6 for g? */ |
Raphael Junqueira | 40dd969 | 2004-05-19 04:33:42 +0000 | [diff] [blame] | 460 | case D3DFMT_R8G8B8: retVal = GL_RGB8; break; |
Jason Edmeades | beb4ac8 | 2003-08-15 03:50:08 +0000 | [diff] [blame] | 461 | case D3DFMT_A1R5G5B5: retVal = GL_RGB5_A1; break; |
Raphael Junqueira | 40dd969 | 2004-05-19 04:33:42 +0000 | [diff] [blame] | 462 | case D3DFMT_X1R5G5B5: retVal = GL_RGB5_A1; break; |
| 463 | case D3DFMT_A4R4G4B4: retVal = GL_RGBA4; break; |
| 464 | case D3DFMT_X4R4G4B4: retVal = GL_RGBA4; break; |
| 465 | case D3DFMT_A8R8G8B8: retVal = GL_RGBA8; break; |
| 466 | case D3DFMT_X8R8G8B8: retVal = GL_RGBA8; break; |
| 467 | /* to see */ |
| 468 | case D3DFMT_A8: retVal = GL_ALPHA8; break; |
Jason Edmeades | beb4ac8 | 2003-08-15 03:50:08 +0000 | [diff] [blame] | 469 | default: |
| 470 | FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt)); |
| 471 | retVal = GL_RGB8; |
| 472 | } |
| 473 | } |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 474 | TRACE("fmt2glintFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal); |
| 475 | return retVal; |
Raphael Junqueira | 3cae8cf | 2003-06-04 21:55:29 +0000 | [diff] [blame] | 476 | } |
| 477 | |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 478 | GLenum D3DFmt2GLFmt(IDirect3DDevice8Impl* This, D3DFORMAT fmt) { |
Jason Edmeades | 7ac9d25 | 2003-09-19 00:20:19 +0000 | [diff] [blame] | 479 | GLenum retVal = 0; |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 480 | |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 481 | if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) { |
| 482 | switch (fmt) { |
| 483 | case D3DFMT_DXT1: retVal = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break; |
| 484 | case D3DFMT_DXT3: retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break; |
| 485 | case D3DFMT_DXT5: retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break; |
| 486 | default: |
| 487 | /* stupid compiler */ |
| 488 | break; |
| 489 | } |
| 490 | } |
Jason Edmeades | 7ac9d25 | 2003-09-19 00:20:19 +0000 | [diff] [blame] | 491 | |
| 492 | if (retVal == 0) { |
| 493 | switch (fmt) { |
Raphael Junqueira | 40dd969 | 2004-05-19 04:33:42 +0000 | [diff] [blame] | 494 | /* Paletted */ |
Jason Edmeades | 7ac9d25 | 2003-09-19 00:20:19 +0000 | [diff] [blame] | 495 | case D3DFMT_P8: retVal = GL_COLOR_INDEX; break; |
| 496 | case D3DFMT_A8P8: retVal = GL_COLOR_INDEX; break; |
Raphael Junqueira | 40dd969 | 2004-05-19 04:33:42 +0000 | [diff] [blame] | 497 | /* Luminance */ |
| 498 | case D3DFMT_L8: retVal = GL_LUMINANCE; break; |
| 499 | case D3DFMT_A8L8: retVal = GL_LUMINANCE_ALPHA; break; |
| 500 | case D3DFMT_A4L4: retVal = GL_LUMINANCE_ALPHA; break; |
| 501 | /* Bump */ |
Raphael Junqueira | d52c508 | 2004-04-29 00:20:18 +0000 | [diff] [blame] | 502 | case D3DFMT_V8U8: retVal = GL_COLOR_INDEX; break; |
Raphael Junqueira | 40dd969 | 2004-05-19 04:33:42 +0000 | [diff] [blame] | 503 | case D3DFMT_V16U16: retVal = GL_COLOR_INDEX; break; |
| 504 | case D3DFMT_L6V5U5: retVal = GL_COLOR_INDEX; break; |
| 505 | case D3DFMT_X8L8V8U8: retVal = GL_COLOR_INDEX; break; |
| 506 | /* color buffer */ |
| 507 | case D3DFMT_R3G3B2: retVal = GL_BGR; break; |
| 508 | case D3DFMT_R5G6B5: retVal = GL_RGB; break; |
| 509 | case D3DFMT_R8G8B8: retVal = GL_RGB; break; |
| 510 | case D3DFMT_A1R5G5B5: retVal = GL_BGRA; break; |
| 511 | case D3DFMT_X1R5G5B5: retVal = GL_BGRA; break; |
Jason Edmeades | 7ac9d25 | 2003-09-19 00:20:19 +0000 | [diff] [blame] | 512 | case D3DFMT_A4R4G4B4: retVal = GL_BGRA; break; |
Raphael Junqueira | 40dd969 | 2004-05-19 04:33:42 +0000 | [diff] [blame] | 513 | case D3DFMT_X4R4G4B4: retVal = GL_BGRA; break; |
Jason Edmeades | 7ac9d25 | 2003-09-19 00:20:19 +0000 | [diff] [blame] | 514 | case D3DFMT_A8R8G8B8: retVal = GL_BGRA; break; |
| 515 | case D3DFMT_X8R8G8B8: retVal = GL_BGRA; break; |
Raphael Junqueira | 40dd969 | 2004-05-19 04:33:42 +0000 | [diff] [blame] | 516 | /* to see */ |
| 517 | case D3DFMT_A8: retVal = GL_ALPHA; break; |
Jason Edmeades | 7ac9d25 | 2003-09-19 00:20:19 +0000 | [diff] [blame] | 518 | default: |
| 519 | FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt)); |
| 520 | retVal = GL_BGR; |
| 521 | } |
| 522 | } |
| 523 | |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 524 | TRACE("fmt2glFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal); |
| 525 | return retVal; |
Raphael Junqueira | 3cae8cf | 2003-06-04 21:55:29 +0000 | [diff] [blame] | 526 | } |
| 527 | |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 528 | GLenum D3DFmt2GLType(IDirect3DDevice8Impl* This, D3DFORMAT fmt) { |
Jason Edmeades | 7ac9d25 | 2003-09-19 00:20:19 +0000 | [diff] [blame] | 529 | GLenum retVal = 0; |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 530 | |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 531 | if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) { |
| 532 | switch (fmt) { |
| 533 | case D3DFMT_DXT1: retVal = 0; break; |
| 534 | case D3DFMT_DXT3: retVal = 0; break; |
| 535 | case D3DFMT_DXT5: retVal = 0; break; |
| 536 | default: |
| 537 | /* stupid compiler */ |
| 538 | break; |
| 539 | } |
| 540 | } |
Jason Edmeades | 7ac9d25 | 2003-09-19 00:20:19 +0000 | [diff] [blame] | 541 | |
| 542 | if (retVal == 0) { |
| 543 | switch (fmt) { |
Raphael Junqueira | 40dd969 | 2004-05-19 04:33:42 +0000 | [diff] [blame] | 544 | /* Paletted */ |
Jason Edmeades | 7ac9d25 | 2003-09-19 00:20:19 +0000 | [diff] [blame] | 545 | case D3DFMT_P8: retVal = GL_UNSIGNED_BYTE; break; |
Raphael Junqueira | d52c508 | 2004-04-29 00:20:18 +0000 | [diff] [blame] | 546 | case D3DFMT_A8P8: retVal = GL_UNSIGNED_BYTE; break; |
Raphael Junqueira | 40dd969 | 2004-05-19 04:33:42 +0000 | [diff] [blame] | 547 | /* Luminance */ |
| 548 | case D3DFMT_L8: retVal = GL_UNSIGNED_BYTE; break; |
| 549 | case D3DFMT_A8L8: retVal = GL_UNSIGNED_BYTE; break; |
| 550 | case D3DFMT_A4L4: retVal = GL_UNSIGNED_BYTE; break; |
| 551 | /* Bump */ |
| 552 | case D3DFMT_V8U8: retVal = GL_UNSIGNED_BYTE; break; |
| 553 | case D3DFMT_V16U16: retVal = GL_UNSIGNED_SHORT; break; |
| 554 | case D3DFMT_L6V5U5: retVal = GL_UNSIGNED_SHORT_5_5_5_1; break; |
| 555 | case D3DFMT_X8L8V8U8: retVal = GL_UNSIGNED_BYTE; break; |
| 556 | /* Color buffer */ |
| 557 | case D3DFMT_R3G3B2: retVal = GL_UNSIGNED_BYTE_2_3_3_REV; break; |
Jason Edmeades | 7ac9d25 | 2003-09-19 00:20:19 +0000 | [diff] [blame] | 558 | case D3DFMT_R5G6B5: retVal = GL_UNSIGNED_SHORT_5_6_5; break; |
| 559 | case D3DFMT_R8G8B8: retVal = GL_UNSIGNED_BYTE; break; |
| 560 | case D3DFMT_A1R5G5B5: retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; break; |
Raphael Junqueira | 40dd969 | 2004-05-19 04:33:42 +0000 | [diff] [blame] | 561 | case D3DFMT_X1R5G5B5: retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; break; |
| 562 | case D3DFMT_A4R4G4B4: retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break; |
| 563 | case D3DFMT_X4R4G4B4: retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break; |
| 564 | case D3DFMT_A8R8G8B8: retVal = GL_UNSIGNED_INT_8_8_8_8_REV; break; |
| 565 | case D3DFMT_X8R8G8B8: retVal = GL_UNSIGNED_INT_8_8_8_8_REV; break; |
| 566 | /* to see */ |
| 567 | case D3DFMT_A8: retVal = GL_ALPHA; break; |
Jason Edmeades | 7ac9d25 | 2003-09-19 00:20:19 +0000 | [diff] [blame] | 568 | default: |
| 569 | FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt)); |
| 570 | retVal = GL_UNSIGNED_BYTE; |
| 571 | } |
| 572 | } |
| 573 | |
Raphael Junqueira | 0b5e9d9 | 2003-06-04 22:12:34 +0000 | [diff] [blame] | 574 | TRACE("fmt2glType for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal); |
| 575 | return retVal; |
Raphael Junqueira | 3cae8cf | 2003-06-04 21:55:29 +0000 | [diff] [blame] | 576 | } |
| 577 | |
| 578 | int SOURCEx_RGB_EXT(DWORD arg) { |
| 579 | switch(arg) { |
| 580 | case D3DTSS_COLORARG0: return GL_SOURCE2_RGB_EXT; |
| 581 | case D3DTSS_COLORARG1: return GL_SOURCE0_RGB_EXT; |
| 582 | case D3DTSS_COLORARG2: return GL_SOURCE1_RGB_EXT; |
| 583 | case D3DTSS_ALPHAARG0: |
| 584 | case D3DTSS_ALPHAARG1: |
| 585 | case D3DTSS_ALPHAARG2: |
| 586 | default: |
| 587 | FIXME("Invalid arg %ld\n", arg); |
| 588 | return GL_SOURCE0_RGB_EXT; |
| 589 | } |
| 590 | } |
| 591 | |
| 592 | int OPERANDx_RGB_EXT(DWORD arg) { |
| 593 | switch(arg) { |
| 594 | case D3DTSS_COLORARG0: return GL_OPERAND2_RGB_EXT; |
| 595 | case D3DTSS_COLORARG1: return GL_OPERAND0_RGB_EXT; |
| 596 | case D3DTSS_COLORARG2: return GL_OPERAND1_RGB_EXT; |
| 597 | case D3DTSS_ALPHAARG0: |
| 598 | case D3DTSS_ALPHAARG1: |
| 599 | case D3DTSS_ALPHAARG2: |
| 600 | default: |
| 601 | FIXME("Invalid arg %ld\n", arg); |
| 602 | return GL_OPERAND0_RGB_EXT; |
| 603 | } |
| 604 | } |
| 605 | |
| 606 | int SOURCEx_ALPHA_EXT(DWORD arg) { |
| 607 | switch(arg) { |
| 608 | case D3DTSS_ALPHAARG0: return GL_SOURCE2_ALPHA_EXT; |
| 609 | case D3DTSS_ALPHAARG1: return GL_SOURCE0_ALPHA_EXT; |
| 610 | case D3DTSS_ALPHAARG2: return GL_SOURCE1_ALPHA_EXT; |
| 611 | case D3DTSS_COLORARG0: |
| 612 | case D3DTSS_COLORARG1: |
| 613 | case D3DTSS_COLORARG2: |
| 614 | default: |
| 615 | FIXME("Invalid arg %ld\n", arg); |
| 616 | return GL_SOURCE0_ALPHA_EXT; |
| 617 | } |
| 618 | } |
| 619 | |
| 620 | int OPERANDx_ALPHA_EXT(DWORD arg) { |
| 621 | switch(arg) { |
| 622 | case D3DTSS_ALPHAARG0: return GL_OPERAND2_ALPHA_EXT; |
| 623 | case D3DTSS_ALPHAARG1: return GL_OPERAND0_ALPHA_EXT; |
| 624 | case D3DTSS_ALPHAARG2: return GL_OPERAND1_ALPHA_EXT; |
| 625 | case D3DTSS_COLORARG0: |
| 626 | case D3DTSS_COLORARG1: |
| 627 | case D3DTSS_COLORARG2: |
| 628 | default: |
| 629 | FIXME("Invalid arg %ld\n", arg); |
| 630 | return GL_OPERAND0_ALPHA_EXT; |
| 631 | } |
| 632 | } |
| 633 | |
| 634 | GLenum StencilOp(DWORD op) { |
| 635 | switch(op) { |
| 636 | case D3DSTENCILOP_KEEP : return GL_KEEP; |
| 637 | case D3DSTENCILOP_ZERO : return GL_ZERO; |
| 638 | case D3DSTENCILOP_REPLACE : return GL_REPLACE; |
| 639 | case D3DSTENCILOP_INCRSAT : return GL_INCR; |
| 640 | case D3DSTENCILOP_DECRSAT : return GL_DECR; |
Jason Edmeades | 84cd192 | 2003-06-04 22:01:05 +0000 | [diff] [blame] | 641 | case D3DSTENCILOP_INVERT : return GL_INVERT; |
Jason Edmeades | 84cd192 | 2003-06-04 22:01:05 +0000 | [diff] [blame] | 642 | case D3DSTENCILOP_INCR : return GL_INCR_WRAP_EXT; |
| 643 | case D3DSTENCILOP_DECR : return GL_DECR_WRAP_EXT; |
Raphael Junqueira | 3cae8cf | 2003-06-04 21:55:29 +0000 | [diff] [blame] | 644 | default: |
| 645 | FIXME("Invalid stencil op %ld\n", op); |
| 646 | return GL_ALWAYS; |
| 647 | } |
| 648 | } |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 649 | |
| 650 | /** |
| 651 | * @nodoc: todo |
| 652 | */ |
| 653 | void GetSrcAndOpFromValue(DWORD iValue, BOOL isAlphaArg, GLenum* source, GLenum* operand) |
| 654 | { |
| 655 | BOOL isAlphaReplicate = FALSE; |
| 656 | BOOL isComplement = FALSE; |
| 657 | |
| 658 | *operand = GL_SRC_COLOR; |
| 659 | *source = GL_TEXTURE; |
| 660 | |
| 661 | /* Catch alpha replicate */ |
| 662 | if (iValue & D3DTA_ALPHAREPLICATE) { |
| 663 | iValue = iValue & ~D3DTA_ALPHAREPLICATE; |
| 664 | isAlphaReplicate = TRUE; |
| 665 | } |
| 666 | |
| 667 | /* Catch Complement */ |
| 668 | if (iValue & D3DTA_COMPLEMENT) { |
| 669 | iValue = iValue & ~D3DTA_COMPLEMENT; |
| 670 | isComplement = TRUE; |
| 671 | } |
| 672 | |
| 673 | /* Calculate the operand */ |
| 674 | if (isAlphaReplicate && !isComplement) { |
| 675 | *operand = GL_SRC_ALPHA; |
| 676 | } else if (isAlphaReplicate && isComplement) { |
| 677 | *operand = GL_ONE_MINUS_SRC_ALPHA; |
| 678 | } else if (isComplement) { |
| 679 | if (isAlphaArg) { |
| 680 | *operand = GL_ONE_MINUS_SRC_ALPHA; |
| 681 | } else { |
| 682 | *operand = GL_ONE_MINUS_SRC_COLOR; |
| 683 | } |
| 684 | } else { |
| 685 | if (isAlphaArg) { |
| 686 | *operand = GL_SRC_ALPHA; |
| 687 | } else { |
| 688 | *operand = GL_SRC_COLOR; |
| 689 | } |
| 690 | } |
| 691 | |
| 692 | /* Calculate the source */ |
| 693 | switch (iValue & D3DTA_SELECTMASK) { |
| 694 | case D3DTA_CURRENT: *source = GL_PREVIOUS_EXT; |
| 695 | break; |
| 696 | case D3DTA_DIFFUSE: *source = GL_PRIMARY_COLOR_EXT; |
| 697 | break; |
| 698 | case D3DTA_TEXTURE: *source = GL_TEXTURE; |
| 699 | break; |
| 700 | case D3DTA_TFACTOR: *source = GL_CONSTANT_EXT; |
| 701 | break; |
| 702 | case D3DTA_SPECULAR: |
Christian Costa | 15ccb11 | 2004-04-26 23:34:17 +0000 | [diff] [blame] | 703 | /* |
Francois Gouget | 640cc3f | 2004-01-06 22:08:33 +0000 | [diff] [blame] | 704 | * According to the GL_ARB_texture_env_combine specs, SPECULAR is |
| 705 | * 'Secondary color' and isn't supported until base GL supports it |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 706 | * There is no concept of temp registers as far as I can tell |
| 707 | */ |
Christian Costa | 15ccb11 | 2004-04-26 23:34:17 +0000 | [diff] [blame] | 708 | FIXME("Unhandled texture arg D3DTA_SPECULAR\n"); |
| 709 | *source = GL_TEXTURE; |
| 710 | break; |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 711 | |
| 712 | default: |
Christian Costa | 15ccb11 | 2004-04-26 23:34:17 +0000 | [diff] [blame] | 713 | FIXME("Unrecognized texture arg %ld\n", iValue); |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 714 | *source = GL_TEXTURE; |
| 715 | } |
| 716 | } |
| 717 | |
Raphael Junqueira | 114c907 | 2004-03-30 05:14:57 +0000 | [diff] [blame] | 718 | |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 719 | /* Set texture operations up - The following avoids lots of ifdefs in this routine!*/ |
| 720 | #if defined (GL_VERSION_1_3) |
Raphael Junqueira | 85aa298 | 2003-06-06 18:12:59 +0000 | [diff] [blame] | 721 | # define useext(A) A |
| 722 | # define combine_ext 1 |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 723 | #elif defined (GL_EXT_texture_env_combine) |
Raphael Junqueira | 85aa298 | 2003-06-06 18:12:59 +0000 | [diff] [blame] | 724 | # define useext(A) A##_EXT |
| 725 | # define combine_ext 1 |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 726 | #elif defined (GL_ARB_texture_env_combine) |
Raphael Junqueira | 85aa298 | 2003-06-06 18:12:59 +0000 | [diff] [blame] | 727 | # define useext(A) A##_ARB |
| 728 | # define combine_ext 1 |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 729 | #else |
Raphael Junqueira | 85aa298 | 2003-06-06 18:12:59 +0000 | [diff] [blame] | 730 | # undef combine_ext |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 731 | #endif |
| 732 | |
| 733 | #if !defined(combine_ext) |
| 734 | void set_tex_op(LPDIRECT3DDEVICE8 iface, BOOL isAlpha, int Stage, D3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3) |
| 735 | { |
| 736 | FIXME("Requires opengl combine extensions to work\n"); |
| 737 | return; |
| 738 | } |
| 739 | #else |
| 740 | /* Setup the texture operations texture stage states */ |
| 741 | void set_tex_op(LPDIRECT3DDEVICE8 iface, BOOL isAlpha, int Stage, D3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3) |
| 742 | { |
| 743 | GLenum src1, src2, src3; |
| 744 | GLenum opr1, opr2, opr3; |
| 745 | GLenum comb_target; |
| 746 | GLenum src0_target, src1_target, src2_target; |
| 747 | GLenum opr0_target, opr1_target, opr2_target; |
| 748 | GLenum scal_target; |
| 749 | GLenum opr=0, invopr, src3_target, opr3_target; |
| 750 | BOOL Handled = FALSE; |
| 751 | ICOM_THIS(IDirect3DDevice8Impl,iface); |
| 752 | |
| 753 | TRACE("Alpha?(%d), Stage:%d Op(%d), a1(%ld), a2(%ld), a3(%ld)\n", isAlpha, Stage, op, arg1, arg2, arg3); |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 754 | |
Raphael Junqueira | 44edc0c | 2003-06-18 03:17:42 +0000 | [diff] [blame] | 755 | ENTER_GL(); |
| 756 | |
Jason Edmeades | 21a0928 | 2003-06-13 19:14:34 +0000 | [diff] [blame] | 757 | /* Note: Operations usually involve two ars, src0 and src1 and are operations of |
| 758 | the form (a1 <operation> a2). However, some of the more complex operations |
| 759 | take 3 parameters. Instead of the (sensible) addition of a3, Microsoft added |
| 760 | in a third parameter called a0. Therefore these are operations of the form |
| 761 | a0 <operation> a1 <operation> a2, ie the new parameter goes to the front. |
| 762 | |
| 763 | However, below we treat the new (a0) parameter as src2/opr2, so in the actual |
| 764 | functions below, expect their syntax to differ slightly to those listed in the |
| 765 | manuals, ie replace arg1 with arg3, arg2 with arg1 and arg3 with arg2 |
| 766 | This affects D3DTOP_MULTIPLYADD and D3DTOP_LERP */ |
| 767 | |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 768 | if (isAlpha) { |
| 769 | comb_target = useext(GL_COMBINE_ALPHA); |
| 770 | src0_target = useext(GL_SOURCE0_ALPHA); |
| 771 | src1_target = useext(GL_SOURCE1_ALPHA); |
| 772 | src2_target = useext(GL_SOURCE2_ALPHA); |
| 773 | opr0_target = useext(GL_OPERAND0_ALPHA); |
| 774 | opr1_target = useext(GL_OPERAND1_ALPHA); |
| 775 | opr2_target = useext(GL_OPERAND2_ALPHA); |
Raphael Junqueira | 85aa298 | 2003-06-06 18:12:59 +0000 | [diff] [blame] | 776 | scal_target = GL_ALPHA_SCALE; |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 777 | } |
| 778 | else { |
| 779 | comb_target = useext(GL_COMBINE_RGB); |
| 780 | src0_target = useext(GL_SOURCE0_RGB); |
| 781 | src1_target = useext(GL_SOURCE1_RGB); |
| 782 | src2_target = useext(GL_SOURCE2_RGB); |
| 783 | opr0_target = useext(GL_OPERAND0_RGB); |
| 784 | opr1_target = useext(GL_OPERAND1_RGB); |
| 785 | opr2_target = useext(GL_OPERAND2_RGB); |
| 786 | scal_target = useext(GL_RGB_SCALE); |
| 787 | } |
| 788 | |
| 789 | /* From MSDN (D3DTSS_ALPHAARG1) : |
| 790 | The default argument is D3DTA_TEXTURE. If no texture is set for this stage, |
| 791 | then the default argument is D3DTA_DIFFUSE. |
| 792 | FIXME? If texture added/removed, may need to reset back as well? */ |
Jason Edmeades | 21a0928 | 2003-06-13 19:14:34 +0000 | [diff] [blame] | 793 | if (isAlpha && This->StateBlock->textures[Stage] == NULL && arg1 == D3DTA_TEXTURE) { |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 794 | GetSrcAndOpFromValue(D3DTA_DIFFUSE, isAlpha, &src1, &opr1); |
| 795 | } else { |
| 796 | GetSrcAndOpFromValue(arg1, isAlpha, &src1, &opr1); |
| 797 | } |
| 798 | GetSrcAndOpFromValue(arg2, isAlpha, &src2, &opr2); |
| 799 | GetSrcAndOpFromValue(arg3, isAlpha, &src3, &opr3); |
| 800 | |
| 801 | TRACE("ct(%x), 1:(%x,%x), 2:(%x,%x), 3:(%x,%x)\n", comb_target, src1, opr1, src2, opr2, src3, opr3); |
| 802 | |
| 803 | Handled = TRUE; /* Assume will be handled */ |
| 804 | switch (op) { |
Jason Edmeades | 021604c | 2003-07-03 18:10:22 +0000 | [diff] [blame] | 805 | case D3DTOP_DISABLE: /* Only for alpha */ |
| 806 | glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE); |
| 807 | checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE"); |
| 808 | glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT); |
| 809 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 810 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA); |
| 811 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 812 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 813 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 814 | break; |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 815 | case D3DTOP_SELECTARG1: |
| 816 | glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE); |
| 817 | checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE"); |
| 818 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 819 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 820 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 821 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 822 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 823 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 824 | break; |
| 825 | case D3DTOP_SELECTARG2: |
| 826 | glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE); |
| 827 | checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE"); |
| 828 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src2); |
| 829 | checkGLcall("GL_TEXTURE_ENV, src0_target, src2"); |
| 830 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2); |
| 831 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2"); |
| 832 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 833 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 834 | break; |
| 835 | case D3DTOP_MODULATE: |
| 836 | glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE); |
| 837 | checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE"); |
| 838 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 839 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 840 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 841 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 842 | glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); |
| 843 | checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); |
| 844 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); |
| 845 | checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); |
| 846 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 847 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 848 | break; |
| 849 | case D3DTOP_MODULATE2X: |
| 850 | glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE); |
| 851 | checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE"); |
| 852 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 853 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 854 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 855 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 856 | glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); |
| 857 | checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); |
| 858 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); |
| 859 | checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); |
| 860 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 2); |
| 861 | checkGLcall("GL_TEXTURE_ENV, scal_target, 2"); |
| 862 | break; |
| 863 | case D3DTOP_MODULATE4X: |
| 864 | glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE); |
| 865 | checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE"); |
| 866 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 867 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 868 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 869 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 870 | glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); |
| 871 | checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); |
| 872 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); |
| 873 | checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); |
| 874 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 4); |
| 875 | checkGLcall("GL_TEXTURE_ENV, scal_target, 4"); |
| 876 | break; |
| 877 | case D3DTOP_ADD: |
| 878 | glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); |
| 879 | checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); |
| 880 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 881 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 882 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 883 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 884 | glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); |
| 885 | checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); |
| 886 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); |
| 887 | checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); |
| 888 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 889 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 890 | break; |
| 891 | case D3DTOP_ADDSIGNED: |
| 892 | glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)); |
| 893 | checkGLcall("GL_TEXTURE_ENV, comb_target, useext((GL_ADD_SIGNED)"); |
| 894 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 895 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 896 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 897 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 898 | glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); |
| 899 | checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); |
| 900 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); |
| 901 | checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); |
| 902 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 903 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 904 | break; |
| 905 | case D3DTOP_ADDSIGNED2X: |
| 906 | glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)); |
| 907 | checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)"); |
| 908 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 909 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 910 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 911 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 912 | glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); |
| 913 | checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); |
| 914 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); |
| 915 | checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); |
| 916 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 2); |
| 917 | checkGLcall("GL_TEXTURE_ENV, scal_target, 2"); |
| 918 | break; |
| 919 | case D3DTOP_SUBTRACT: |
Raphael Junqueira | 85aa298 | 2003-06-06 18:12:59 +0000 | [diff] [blame] | 920 | if (GL_SUPPORT(ARB_TEXTURE_ENV_COMBINE)) { |
| 921 | glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_SUBTRACT); |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 922 | checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_SUBTRACT)"); |
| 923 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 924 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 925 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 926 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 927 | glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); |
| 928 | checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); |
| 929 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); |
| 930 | checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); |
| 931 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 932 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
Raphael Junqueira | 85aa298 | 2003-06-06 18:12:59 +0000 | [diff] [blame] | 933 | } else { |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 934 | FIXME("This version of opengl does not support GL_SUBTRACT\n"); |
Raphael Junqueira | 85aa298 | 2003-06-06 18:12:59 +0000 | [diff] [blame] | 935 | } |
| 936 | break; |
| 937 | |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 938 | case D3DTOP_BLENDDIFFUSEALPHA: |
| 939 | glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)); |
| 940 | checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)"); |
| 941 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 942 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 943 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 944 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 945 | glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); |
| 946 | checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); |
| 947 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); |
| 948 | checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); |
Raphael Junqueira | 85aa298 | 2003-06-06 18:12:59 +0000 | [diff] [blame] | 949 | glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_PRIMARY_COLOR)); |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 950 | checkGLcall("GL_TEXTURE_ENV, src2_target, GL_PRIMARY_COLOR"); |
| 951 | glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA); |
| 952 | checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA"); |
| 953 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 954 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 955 | break; |
| 956 | case D3DTOP_BLENDTEXTUREALPHA: |
| 957 | glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)); |
| 958 | checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)"); |
| 959 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 960 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 961 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 962 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 963 | glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); |
| 964 | checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); |
| 965 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); |
| 966 | checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); |
| 967 | glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_TEXTURE); |
| 968 | checkGLcall("GL_TEXTURE_ENV, src2_target, GL_TEXTURE"); |
| 969 | glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA); |
| 970 | checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA"); |
| 971 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 972 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 973 | break; |
| 974 | case D3DTOP_BLENDFACTORALPHA: |
| 975 | glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)); |
| 976 | checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)"); |
| 977 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 978 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 979 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 980 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 981 | glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); |
| 982 | checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); |
| 983 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); |
| 984 | checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); |
Raphael Junqueira | 85aa298 | 2003-06-06 18:12:59 +0000 | [diff] [blame] | 985 | glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_CONSTANT)); |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 986 | checkGLcall("GL_TEXTURE_ENV, src2_target, GL_CONSTANT"); |
| 987 | glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA); |
| 988 | checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA"); |
| 989 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 990 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 991 | break; |
| 992 | case D3DTOP_BLENDCURRENTALPHA: |
| 993 | glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)); |
| 994 | checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)"); |
| 995 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 996 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 997 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 998 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 999 | glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); |
| 1000 | checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); |
| 1001 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); |
| 1002 | checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); |
Raphael Junqueira | 85aa298 | 2003-06-06 18:12:59 +0000 | [diff] [blame] | 1003 | glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_PREVIOUS)); |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 1004 | checkGLcall("GL_TEXTURE_ENV, src2_target, GL_PREVIOUS"); |
| 1005 | glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA); |
| 1006 | checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA"); |
| 1007 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 1008 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 1009 | break; |
| 1010 | case D3DTOP_DOTPRODUCT3: |
Raphael Junqueira | 85aa298 | 2003-06-06 18:12:59 +0000 | [diff] [blame] | 1011 | if (GL_SUPPORT(ARB_TEXTURE_ENV_DOT3)) { |
Raphael Junqueira | 114c907 | 2004-03-30 05:14:57 +0000 | [diff] [blame] | 1012 | glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_ARB); |
| 1013 | checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_ARB"); |
| 1014 | } else if (GL_SUPPORT(EXT_TEXTURE_ENV_DOT3)) { |
| 1015 | glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_EXT); |
| 1016 | checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_EXT"); |
Raphael Junqueira | 85aa298 | 2003-06-06 18:12:59 +0000 | [diff] [blame] | 1017 | } else { |
| 1018 | FIXME("This version of opengl does not support GL_DOT3\n"); |
| 1019 | } |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 1020 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 1021 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 1022 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 1023 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 1024 | glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); |
| 1025 | checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); |
| 1026 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); |
| 1027 | checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); |
| 1028 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 1029 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 1030 | break; |
| 1031 | case D3DTOP_LERP: |
| 1032 | glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)); |
| 1033 | checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)"); |
Jason Edmeades | 21a0928 | 2003-06-13 19:14:34 +0000 | [diff] [blame] | 1034 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 1035 | checkGLcall("GL_TEXTURE_ENV, src0_target, src2"); |
Jason Edmeades | 21a0928 | 2003-06-13 19:14:34 +0000 | [diff] [blame] | 1036 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 1037 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2"); |
Jason Edmeades | 21a0928 | 2003-06-13 19:14:34 +0000 | [diff] [blame] | 1038 | glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 1039 | checkGLcall("GL_TEXTURE_ENV, src1_target, src3"); |
Jason Edmeades | 21a0928 | 2003-06-13 19:14:34 +0000 | [diff] [blame] | 1040 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 1041 | checkGLcall("GL_TEXTURE_ENV, opr1_target, opr3"); |
Jason Edmeades | 21a0928 | 2003-06-13 19:14:34 +0000 | [diff] [blame] | 1042 | glTexEnvi(GL_TEXTURE_ENV, src2_target, src3); |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 1043 | checkGLcall("GL_TEXTURE_ENV, src2_target, src1"); |
Jason Edmeades | 21a0928 | 2003-06-13 19:14:34 +0000 | [diff] [blame] | 1044 | glTexEnvi(GL_TEXTURE_ENV, opr2_target, src3); |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 1045 | checkGLcall("GL_TEXTURE_ENV, opr2_target, src1"); |
| 1046 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 1047 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 1048 | break; |
| 1049 | default: |
| 1050 | Handled = FALSE; |
| 1051 | } |
Jason Edmeades | 21a0928 | 2003-06-13 19:14:34 +0000 | [diff] [blame] | 1052 | |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 1053 | if (Handled) { |
Raphael Junqueira | 114c907 | 2004-03-30 05:14:57 +0000 | [diff] [blame] | 1054 | BOOL combineOK = TRUE; |
| 1055 | if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) { |
| 1056 | DWORD op2; |
| 1057 | |
| 1058 | if (isAlpha) { |
| 1059 | op2 = This->UpdateStateBlock->texture_state[Stage][D3DTSS_COLOROP]; |
| 1060 | } else { |
| 1061 | op2 = This->UpdateStateBlock->texture_state[Stage][D3DTSS_ALPHAOP]; |
| 1062 | } |
| 1063 | |
| 1064 | /* Note: If COMBINE4 in effect can't go back to combine! */ |
| 1065 | switch (op2) { |
| 1066 | case D3DTOP_ADDSMOOTH: |
| 1067 | case D3DTOP_BLENDTEXTUREALPHAPM: |
| 1068 | case D3DTOP_MODULATEALPHA_ADDCOLOR: |
| 1069 | case D3DTOP_MODULATECOLOR_ADDALPHA: |
| 1070 | case D3DTOP_MODULATEINVALPHA_ADDCOLOR: |
| 1071 | case D3DTOP_MODULATEINVCOLOR_ADDALPHA: |
| 1072 | case D3DTOP_MULTIPLYADD: |
| 1073 | /* Ignore those implemented in both cases */ |
| 1074 | switch (op) { |
| 1075 | case D3DTOP_SELECTARG1: |
| 1076 | case D3DTOP_SELECTARG2: |
| 1077 | combineOK = FALSE; |
| 1078 | Handled = FALSE; |
| 1079 | break; |
| 1080 | default: |
Francois Gouget | 359c709 | 2004-03-31 20:06:10 +0000 | [diff] [blame] | 1081 | FIXME("Can't use COMBINE4 and COMBINE together, thisop=%d, otherop=%ld, isAlpha(%d)\n", op, op2, isAlpha); |
Raphael Junqueira | 114c907 | 2004-03-30 05:14:57 +0000 | [diff] [blame] | 1082 | LEAVE_GL(); |
| 1083 | return; |
| 1084 | } |
| 1085 | } |
| 1086 | } |
| 1087 | |
| 1088 | if (combineOK == TRUE) { |
| 1089 | glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE)); |
| 1090 | checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE)"); |
| 1091 | |
| 1092 | LEAVE_GL(); |
| 1093 | return; |
| 1094 | } |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 1095 | } |
| 1096 | |
| 1097 | /* Other texture operations require special extensions: */ |
Raphael Junqueira | 114c907 | 2004-03-30 05:14:57 +0000 | [diff] [blame] | 1098 | if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) { |
| 1099 | if (isAlpha) { |
| 1100 | opr = GL_SRC_ALPHA; |
| 1101 | invopr = GL_ONE_MINUS_SRC_ALPHA; |
| 1102 | src3_target = GL_SOURCE3_ALPHA_NV; |
| 1103 | opr3_target = GL_OPERAND3_ALPHA_NV; |
| 1104 | } else { |
| 1105 | opr = GL_SRC_COLOR; |
| 1106 | invopr = GL_ONE_MINUS_SRC_COLOR; |
| 1107 | src3_target = GL_SOURCE3_RGB_NV; |
| 1108 | opr3_target = GL_OPERAND3_RGB_NV; |
| 1109 | } |
| 1110 | Handled = TRUE; /* Again, assume handled */ |
| 1111 | switch (op) { |
| 1112 | case D3DTOP_SELECTARG1: /* = a1 * 1 + 0 * 0 */ |
| 1113 | case D3DTOP_SELECTARG2: /* = a2 * 1 + 0 * 0 */ |
| 1114 | glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); |
| 1115 | checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); |
| 1116 | if (op == D3DTOP_SELECTARG1) { |
| 1117 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 1118 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 1119 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 1120 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 1121 | } else { |
| 1122 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src2); |
| 1123 | checkGLcall("GL_TEXTURE_ENV, src0_target, src2"); |
| 1124 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2); |
| 1125 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2"); |
| 1126 | } |
| 1127 | glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO); |
| 1128 | checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); |
| 1129 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); |
| 1130 | checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); |
| 1131 | glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO); |
| 1132 | checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO"); |
| 1133 | glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr); |
| 1134 | checkGLcall("GL_TEXTURE_ENV, opr2_target, opr"); |
| 1135 | glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO); |
| 1136 | checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO"); |
| 1137 | glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr); |
| 1138 | checkGLcall("GL_TEXTURE_ENV, opr3_target, opr"); |
| 1139 | break; |
| 1140 | |
| 1141 | case D3DTOP_ADDSMOOTH: |
| 1142 | glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); |
| 1143 | checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); |
| 1144 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 1145 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 1146 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 1147 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 1148 | glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO); |
| 1149 | checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); |
| 1150 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); |
| 1151 | checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); |
| 1152 | glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); |
| 1153 | checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); |
| 1154 | glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); |
| 1155 | checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); |
| 1156 | glTexEnvi(GL_TEXTURE_ENV, src3_target, src1); |
| 1157 | checkGLcall("GL_TEXTURE_ENV, src3_target, src1"); |
| 1158 | switch (opr1) { |
| 1159 | case GL_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_COLOR; break; |
| 1160 | case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_SRC_COLOR; break; |
| 1161 | case GL_SRC_ALPHA: opr1 = GL_ONE_MINUS_SRC_ALPHA; break; |
| 1162 | case GL_ONE_MINUS_SRC_ALPHA: opr1 = GL_SRC_ALPHA; break; |
| 1163 | } |
| 1164 | glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr1); |
| 1165 | checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1"); |
| 1166 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 1167 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 1168 | break; |
| 1169 | case D3DTOP_BLENDTEXTUREALPHAPM: |
| 1170 | glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); |
| 1171 | checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); |
| 1172 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 1173 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 1174 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 1175 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 1176 | glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO); |
| 1177 | checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); |
| 1178 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); |
| 1179 | checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); |
| 1180 | glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); |
| 1181 | checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); |
| 1182 | glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); |
| 1183 | checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); |
| 1184 | glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE); |
| 1185 | checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE"); |
| 1186 | glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA); |
| 1187 | checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA"); |
| 1188 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 1189 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 1190 | break; |
| 1191 | case D3DTOP_MODULATEALPHA_ADDCOLOR: |
| 1192 | glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); |
| 1193 | checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */ |
| 1194 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); /* a0 = src1/opr1 */ |
| 1195 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 1196 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 1197 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); /* a1 = 1 (see docs) */ |
| 1198 | glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO); |
| 1199 | checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); |
| 1200 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); |
| 1201 | checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); |
| 1202 | glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); /* a2 = arg2 */ |
| 1203 | checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); |
| 1204 | glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); |
| 1205 | checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); /* a3 = src1 alpha */ |
| 1206 | glTexEnvi(GL_TEXTURE_ENV, src3_target, src1); |
| 1207 | checkGLcall("GL_TEXTURE_ENV, src3_target, src1"); |
| 1208 | switch (opr1) { |
| 1209 | case GL_SRC_COLOR: opr1 = GL_SRC_ALPHA; break; |
| 1210 | case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_ALPHA; break; |
| 1211 | } |
| 1212 | glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr1); |
| 1213 | checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1"); |
| 1214 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 1215 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 1216 | break; |
| 1217 | case D3DTOP_MODULATECOLOR_ADDALPHA: |
| 1218 | glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); |
| 1219 | checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); |
| 1220 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 1221 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 1222 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 1223 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 1224 | glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); |
| 1225 | checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); |
| 1226 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); |
| 1227 | checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); |
| 1228 | glTexEnvi(GL_TEXTURE_ENV, src2_target, src1); |
| 1229 | checkGLcall("GL_TEXTURE_ENV, src2_target, src1"); |
| 1230 | switch (opr1) { |
| 1231 | case GL_SRC_COLOR: opr1 = GL_SRC_ALPHA; break; |
| 1232 | case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_ALPHA; break; |
| 1233 | } |
| 1234 | glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1); |
| 1235 | checkGLcall("GL_TEXTURE_ENV, opr2_target, opr1"); |
| 1236 | glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO); |
| 1237 | checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO"); |
| 1238 | glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr); |
| 1239 | checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr"); |
| 1240 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 1241 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 1242 | break; |
| 1243 | case D3DTOP_MODULATEINVALPHA_ADDCOLOR: |
| 1244 | glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); |
| 1245 | checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); |
| 1246 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 1247 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 1248 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); |
| 1249 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 1250 | glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO); |
| 1251 | checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); |
| 1252 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); |
| 1253 | checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); |
| 1254 | glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); |
| 1255 | checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); |
| 1256 | glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); |
| 1257 | checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); |
| 1258 | glTexEnvi(GL_TEXTURE_ENV, src3_target, src1); |
| 1259 | checkGLcall("GL_TEXTURE_ENV, src3_target, src1"); |
| 1260 | switch (opr1) { |
| 1261 | case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break; |
| 1262 | case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_ALPHA; break; |
| 1263 | case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break; |
| 1264 | case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break; |
| 1265 | } |
| 1266 | glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr); |
| 1267 | checkGLcall("GL_TEXTURE_ENV, opr3_target, opr"); |
| 1268 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 1269 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 1270 | break; |
| 1271 | case D3DTOP_MODULATEINVCOLOR_ADDALPHA: |
| 1272 | glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); |
| 1273 | checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); |
| 1274 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); |
| 1275 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 1276 | switch (opr1) { |
| 1277 | case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break; |
| 1278 | case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break; |
| 1279 | case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break; |
| 1280 | case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break; |
| 1281 | } |
| 1282 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr); |
| 1283 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr"); |
| 1284 | glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); |
| 1285 | checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); |
| 1286 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); |
| 1287 | checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); |
| 1288 | glTexEnvi(GL_TEXTURE_ENV, src2_target, src1); |
| 1289 | checkGLcall("GL_TEXTURE_ENV, src2_target, src1"); |
| 1290 | switch (opr1) { |
| 1291 | case GL_SRC_COLOR: opr1 = GL_SRC_ALPHA; break; |
| 1292 | case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_ALPHA; break; |
| 1293 | } |
| 1294 | glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1); |
| 1295 | checkGLcall("GL_TEXTURE_ENV, opr2_target, opr1"); |
| 1296 | glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO); |
| 1297 | checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO"); |
| 1298 | glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr); |
| 1299 | checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr"); |
| 1300 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 1301 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 1302 | break; |
| 1303 | case D3DTOP_MULTIPLYADD: |
| 1304 | glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); |
| 1305 | checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); |
| 1306 | glTexEnvi(GL_TEXTURE_ENV, src0_target, src3); |
| 1307 | checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); |
| 1308 | glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3); |
| 1309 | checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); |
| 1310 | glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO); |
| 1311 | checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); |
| 1312 | glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); |
| 1313 | checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); |
| 1314 | glTexEnvi(GL_TEXTURE_ENV, src2_target, src1); |
| 1315 | checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); |
| 1316 | glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1); |
| 1317 | checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); |
| 1318 | glTexEnvi(GL_TEXTURE_ENV, src3_target, src2); |
| 1319 | checkGLcall("GL_TEXTURE_ENV, src3_target, src3"); |
| 1320 | glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr2); |
| 1321 | checkGLcall("GL_TEXTURE_ENV, opr3_target, opr3"); |
| 1322 | glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); |
| 1323 | checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); |
| 1324 | break; |
Raphael Junqueira | d52c508 | 2004-04-29 00:20:18 +0000 | [diff] [blame] | 1325 | |
| 1326 | case D3DTOP_BUMPENVMAP: |
| 1327 | { |
| 1328 | if (GL_SUPPORT(NV_TEXTURE_SHADER)) { |
| 1329 | /* |
| 1330 | texture unit 0: GL_TEXTURE_2D |
| 1331 | texture unit 1: GL_DOT_PRODUCT_NV |
| 1332 | texture unit 2: GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV |
| 1333 | texture unit 3: GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV |
| 1334 | */ |
| 1335 | float m[2][2]; |
| 1336 | |
| 1337 | union { |
| 1338 | float f; |
| 1339 | DWORD d; |
| 1340 | } tmpvalue; |
| 1341 | |
| 1342 | tmpvalue.d = This->StateBlock->texture_state[Stage][D3DTSS_BUMPENVMAT00]; |
| 1343 | m[0][0] = tmpvalue.f; |
| 1344 | tmpvalue.d = This->StateBlock->texture_state[Stage][D3DTSS_BUMPENVMAT01]; |
| 1345 | m[0][1] = tmpvalue.f; |
| 1346 | tmpvalue.d = This->StateBlock->texture_state[Stage][D3DTSS_BUMPENVMAT10]; |
| 1347 | m[1][0] = tmpvalue.f; |
| 1348 | tmpvalue.d = This->StateBlock->texture_state[Stage][D3DTSS_BUMPENVMAT11]; |
| 1349 | m[1][1] = tmpvalue.f; |
| 1350 | |
| 1351 | if (FALSE == This->texture_shader_active) { |
| 1352 | This->texture_shader_active = TRUE; |
| 1353 | glEnable(GL_TEXTURE_SHADER_NV); |
| 1354 | } |
| 1355 | /* |
| 1356 | glActiveTextureARB(GL_TEXTURE0_ARB + Stage - 1); |
| 1357 | glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_2D); |
| 1358 | */ |
| 1359 | glActiveTextureARB(GL_TEXTURE1_ARB + Stage); |
| 1360 | glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_OFFSET_TEXTURE_2D_NV); |
| 1361 | glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, GL_TEXTURE0_ARB + Stage - 1); |
| 1362 | glTexEnvfv(GL_TEXTURE_SHADER_NV, GL_OFFSET_TEXTURE_MATRIX_NV, (float*)&m[0]); |
| 1363 | break; |
| 1364 | } |
| 1365 | } |
| 1366 | |
| 1367 | case D3DTOP_BUMPENVMAPLUMINANCE: |
Jason Edmeades | 21a0928 | 2003-06-13 19:14:34 +0000 | [diff] [blame] | 1368 | |
Raphael Junqueira | 114c907 | 2004-03-30 05:14:57 +0000 | [diff] [blame] | 1369 | default: |
| 1370 | Handled = FALSE; |
| 1371 | } |
| 1372 | if (Handled) { |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 1373 | glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV); |
| 1374 | checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV"); |
Raphael Junqueira | 114c907 | 2004-03-30 05:14:57 +0000 | [diff] [blame] | 1375 | |
Raphael Junqueira | 44edc0c | 2003-06-18 03:17:42 +0000 | [diff] [blame] | 1376 | LEAVE_GL(); |
| 1377 | return; |
Raphael Junqueira | 114c907 | 2004-03-30 05:14:57 +0000 | [diff] [blame] | 1378 | } |
| 1379 | } /* GL_NV_texture_env_combine4 */ |
| 1380 | |
Raphael Junqueira | 44edc0c | 2003-06-18 03:17:42 +0000 | [diff] [blame] | 1381 | LEAVE_GL(); |
Raphael Junqueira | 114c907 | 2004-03-30 05:14:57 +0000 | [diff] [blame] | 1382 | |
| 1383 | /* After all the extensions, if still unhandled, report fixme */ |
| 1384 | FIXME("Unhandled texture operation %d\n", op); |
Jason Edmeades | 3d51c86 | 2003-06-04 22:20:47 +0000 | [diff] [blame] | 1385 | } |
| 1386 | #endif |