/*
 * D3D8 utils
 *
 * Copyright 2002-2003 Jason Edmeades
 *                     Raphael Junqueira
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include "config.h"

#include <math.h>
#include <stdarg.h>

#define NONAMELESSUNION
#define NONAMELESSSTRUCT
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "wingdi.h"
#include "wine/debug.h"

#include "d3d8_private.h"

WINE_DEFAULT_DEBUG_CHANNEL(d3d);

const char* debug_d3ddevicetype(D3DDEVTYPE devtype) {
  switch (devtype) {
#define DEVTYPE_TO_STR(dev) case dev: return #dev
    DEVTYPE_TO_STR(D3DDEVTYPE_HAL);
    DEVTYPE_TO_STR(D3DDEVTYPE_REF);
    DEVTYPE_TO_STR(D3DDEVTYPE_SW);    
#undef DEVTYPE_TO_STR
  default:
    FIXME("Unrecognized %u D3DDEVTYPE!\n", devtype);
    return "unrecognized";
  }
}

const char* debug_d3dusage(DWORD usage) {
  switch (usage) {
#define D3DUSAGE_TO_STR(u) case u: return #u
    D3DUSAGE_TO_STR(D3DUSAGE_RENDERTARGET);
    D3DUSAGE_TO_STR(D3DUSAGE_DEPTHSTENCIL);
    D3DUSAGE_TO_STR(D3DUSAGE_WRITEONLY);
    D3DUSAGE_TO_STR(D3DUSAGE_SOFTWAREPROCESSING);
    D3DUSAGE_TO_STR(D3DUSAGE_DONOTCLIP);
    D3DUSAGE_TO_STR(D3DUSAGE_POINTS);
    D3DUSAGE_TO_STR(D3DUSAGE_RTPATCHES);
    D3DUSAGE_TO_STR(D3DUSAGE_NPATCHES);
    D3DUSAGE_TO_STR(D3DUSAGE_DYNAMIC);
#undef D3DUSAGE_TO_STR
  case 0: return "none";
  default:
    FIXME("Unrecognized %lu Usage!\n", usage);
    return "unrecognized";
  }
}

const char* debug_d3dformat(D3DFORMAT fmt) {
  switch (fmt) {
#define FMT_TO_STR(fmt) case fmt: return #fmt
    FMT_TO_STR(D3DFMT_UNKNOWN);
    FMT_TO_STR(D3DFMT_R8G8B8);
    FMT_TO_STR(D3DFMT_A8R8G8B8);
    FMT_TO_STR(D3DFMT_X8R8G8B8);
    FMT_TO_STR(D3DFMT_R5G6B5);
    FMT_TO_STR(D3DFMT_X1R5G5B5);
    FMT_TO_STR(D3DFMT_A1R5G5B5);
    FMT_TO_STR(D3DFMT_A4R4G4B4);
    FMT_TO_STR(D3DFMT_R3G3B2);
    FMT_TO_STR(D3DFMT_A8);
    FMT_TO_STR(D3DFMT_A8R3G3B2);
    FMT_TO_STR(D3DFMT_X4R4G4B4);
    FMT_TO_STR(D3DFMT_A8P8);
    FMT_TO_STR(D3DFMT_P8);
    FMT_TO_STR(D3DFMT_L8);
    FMT_TO_STR(D3DFMT_A8L8);
    FMT_TO_STR(D3DFMT_A4L4);
    FMT_TO_STR(D3DFMT_V8U8);
    FMT_TO_STR(D3DFMT_L6V5U5);
    FMT_TO_STR(D3DFMT_X8L8V8U8);
    FMT_TO_STR(D3DFMT_Q8W8V8U8);
    FMT_TO_STR(D3DFMT_V16U16);
    FMT_TO_STR(D3DFMT_W11V11U10);
    FMT_TO_STR(D3DFMT_UYVY);
    FMT_TO_STR(D3DFMT_YUY2);
    FMT_TO_STR(D3DFMT_DXT1);
    FMT_TO_STR(D3DFMT_DXT2);
    FMT_TO_STR(D3DFMT_DXT3);
    FMT_TO_STR(D3DFMT_DXT4);
    FMT_TO_STR(D3DFMT_DXT5);
    FMT_TO_STR(D3DFMT_D16_LOCKABLE);
    FMT_TO_STR(D3DFMT_D32);
    FMT_TO_STR(D3DFMT_D15S1);
    FMT_TO_STR(D3DFMT_D24S8);
    FMT_TO_STR(D3DFMT_D16);
    FMT_TO_STR(D3DFMT_D24X8);
    FMT_TO_STR(D3DFMT_D24X4S4);
    FMT_TO_STR(D3DFMT_VERTEXDATA);
    FMT_TO_STR(D3DFMT_INDEX16);
    FMT_TO_STR(D3DFMT_INDEX32);
#undef FMT_TO_STR
  default:
    FIXME("Unrecognized %u D3DFORMAT!\n", fmt);
    return "unrecognized";
  }
}

const char* debug_d3dressourcetype(D3DRESOURCETYPE res) {
  switch (res) {
#define RES_TO_STR(res) case res: return #res;
    RES_TO_STR(D3DRTYPE_SURFACE);
    RES_TO_STR(D3DRTYPE_VOLUME);
    RES_TO_STR(D3DRTYPE_TEXTURE);
    RES_TO_STR(D3DRTYPE_VOLUMETEXTURE);
    RES_TO_STR(D3DRTYPE_CUBETEXTURE);
    RES_TO_STR(D3DRTYPE_VERTEXBUFFER);
    RES_TO_STR(D3DRTYPE_INDEXBUFFER);
#undef  RES_TO_STR
  default:
    FIXME("Unrecognized %u D3DRESOURCETYPE!\n", res);
    return "unrecognized";
  }
}

const char* debug_d3dprimitivetype(D3DPRIMITIVETYPE PrimitiveType) {
  switch (PrimitiveType) {
#define PRIM_TO_STR(prim) case prim: return #prim;
    PRIM_TO_STR(D3DPT_POINTLIST);
    PRIM_TO_STR(D3DPT_LINELIST);
    PRIM_TO_STR(D3DPT_LINESTRIP);
    PRIM_TO_STR(D3DPT_TRIANGLELIST);
    PRIM_TO_STR(D3DPT_TRIANGLESTRIP);
    PRIM_TO_STR(D3DPT_TRIANGLEFAN);
#undef  PRIM_TO_STR
  default:
    FIXME("Unrecognized %u D3DPRIMITIVETYPE!\n", PrimitiveType);
    return "unrecognized";
  }
}

const char* debug_d3dpool(D3DPOOL Pool) {
  switch (Pool) {
#define POOL_TO_STR(p) case p: return #p;
    POOL_TO_STR(D3DPOOL_DEFAULT);
    POOL_TO_STR(D3DPOOL_MANAGED);
    POOL_TO_STR(D3DPOOL_SYSTEMMEM);
    POOL_TO_STR(D3DPOOL_SCRATCH);
#undef  POOL_TO_STR
  default:
    FIXME("Unrecognized %u D3DPOOL!\n", Pool);
    return "unrecognized";
  }
}

const char* debug_d3drenderstate(DWORD state) {
  switch (state) {
#define D3DSTATE_TO_STR(u) case u: return #u
    D3DSTATE_TO_STR(D3DRS_ZENABLE                   );
    D3DSTATE_TO_STR(D3DRS_FILLMODE                  );
    D3DSTATE_TO_STR(D3DRS_SHADEMODE                 );
    D3DSTATE_TO_STR(D3DRS_LINEPATTERN               );
    D3DSTATE_TO_STR(D3DRS_ZWRITEENABLE              );
    D3DSTATE_TO_STR(D3DRS_ALPHATESTENABLE           );
    D3DSTATE_TO_STR(D3DRS_LASTPIXEL                 );
    D3DSTATE_TO_STR(D3DRS_SRCBLEND                  );
    D3DSTATE_TO_STR(D3DRS_DESTBLEND                 );
    D3DSTATE_TO_STR(D3DRS_CULLMODE                  );
    D3DSTATE_TO_STR(D3DRS_ZFUNC                     );
    D3DSTATE_TO_STR(D3DRS_ALPHAREF                  );
    D3DSTATE_TO_STR(D3DRS_ALPHAFUNC                 );
    D3DSTATE_TO_STR(D3DRS_DITHERENABLE              );
    D3DSTATE_TO_STR(D3DRS_ALPHABLENDENABLE          );
    D3DSTATE_TO_STR(D3DRS_FOGENABLE                 );
    D3DSTATE_TO_STR(D3DRS_SPECULARENABLE            );
    D3DSTATE_TO_STR(D3DRS_ZVISIBLE                  );
    D3DSTATE_TO_STR(D3DRS_FOGCOLOR                  );
    D3DSTATE_TO_STR(D3DRS_FOGTABLEMODE              );
    D3DSTATE_TO_STR(D3DRS_FOGSTART                  );
    D3DSTATE_TO_STR(D3DRS_FOGEND                    );
    D3DSTATE_TO_STR(D3DRS_FOGDENSITY                );
    D3DSTATE_TO_STR(D3DRS_EDGEANTIALIAS             );
    D3DSTATE_TO_STR(D3DRS_ZBIAS                     );
    D3DSTATE_TO_STR(D3DRS_RANGEFOGENABLE            );
    D3DSTATE_TO_STR(D3DRS_STENCILENABLE             );
    D3DSTATE_TO_STR(D3DRS_STENCILFAIL               );
    D3DSTATE_TO_STR(D3DRS_STENCILZFAIL              );
    D3DSTATE_TO_STR(D3DRS_STENCILPASS               );
    D3DSTATE_TO_STR(D3DRS_STENCILFUNC               );
    D3DSTATE_TO_STR(D3DRS_STENCILREF                );
    D3DSTATE_TO_STR(D3DRS_STENCILMASK               );
    D3DSTATE_TO_STR(D3DRS_STENCILWRITEMASK          );
    D3DSTATE_TO_STR(D3DRS_TEXTUREFACTOR             );
    D3DSTATE_TO_STR(D3DRS_WRAP0                     );
    D3DSTATE_TO_STR(D3DRS_WRAP1                     );
    D3DSTATE_TO_STR(D3DRS_WRAP2                     );
    D3DSTATE_TO_STR(D3DRS_WRAP3                     );
    D3DSTATE_TO_STR(D3DRS_WRAP4                     );
    D3DSTATE_TO_STR(D3DRS_WRAP5                     );
    D3DSTATE_TO_STR(D3DRS_WRAP6                     );
    D3DSTATE_TO_STR(D3DRS_WRAP7                     );
    D3DSTATE_TO_STR(D3DRS_CLIPPING                  );
    D3DSTATE_TO_STR(D3DRS_LIGHTING                  );
    D3DSTATE_TO_STR(D3DRS_AMBIENT                   );
    D3DSTATE_TO_STR(D3DRS_FOGVERTEXMODE             );
    D3DSTATE_TO_STR(D3DRS_COLORVERTEX               );
    D3DSTATE_TO_STR(D3DRS_LOCALVIEWER               );
    D3DSTATE_TO_STR(D3DRS_NORMALIZENORMALS          );
    D3DSTATE_TO_STR(D3DRS_DIFFUSEMATERIALSOURCE     );
    D3DSTATE_TO_STR(D3DRS_SPECULARMATERIALSOURCE    );
    D3DSTATE_TO_STR(D3DRS_AMBIENTMATERIALSOURCE     );
    D3DSTATE_TO_STR(D3DRS_EMISSIVEMATERIALSOURCE    );
    D3DSTATE_TO_STR(D3DRS_VERTEXBLEND               );
    D3DSTATE_TO_STR(D3DRS_CLIPPLANEENABLE           );
    D3DSTATE_TO_STR(D3DRS_SOFTWAREVERTEXPROCESSING  );
    D3DSTATE_TO_STR(D3DRS_POINTSIZE                 );
    D3DSTATE_TO_STR(D3DRS_POINTSIZE_MIN             );
    D3DSTATE_TO_STR(D3DRS_POINTSPRITEENABLE         );
    D3DSTATE_TO_STR(D3DRS_POINTSCALEENABLE          );
    D3DSTATE_TO_STR(D3DRS_POINTSCALE_A              );
    D3DSTATE_TO_STR(D3DRS_POINTSCALE_B              );
    D3DSTATE_TO_STR(D3DRS_POINTSCALE_C              );
    D3DSTATE_TO_STR(D3DRS_MULTISAMPLEANTIALIAS      );
    D3DSTATE_TO_STR(D3DRS_MULTISAMPLEMASK           );
    D3DSTATE_TO_STR(D3DRS_PATCHEDGESTYLE            );
    D3DSTATE_TO_STR(D3DRS_PATCHSEGMENTS             );
    D3DSTATE_TO_STR(D3DRS_DEBUGMONITORTOKEN         );
    D3DSTATE_TO_STR(D3DRS_POINTSIZE_MAX             );
    D3DSTATE_TO_STR(D3DRS_INDEXEDVERTEXBLENDENABLE  );
    D3DSTATE_TO_STR(D3DRS_COLORWRITEENABLE          );
    D3DSTATE_TO_STR(D3DRS_TWEENFACTOR               );
    D3DSTATE_TO_STR(D3DRS_BLENDOP                   );
    D3DSTATE_TO_STR(D3DRS_POSITIONORDER             );
    D3DSTATE_TO_STR(D3DRS_NORMALORDER               );
#undef D3DSTATE_TO_STR
  default:
    FIXME("Unrecognized %lu render state!\n", state);
    return "unrecognized";
  }
}

const char* debug_d3dtexturestate(DWORD state) {
  switch (state) {
#define D3DSTATE_TO_STR(u) case u: return #u
    D3DSTATE_TO_STR(D3DTSS_COLOROP               );
    D3DSTATE_TO_STR(D3DTSS_COLORARG1             );
    D3DSTATE_TO_STR(D3DTSS_COLORARG2             );
    D3DSTATE_TO_STR(D3DTSS_ALPHAOP               );
    D3DSTATE_TO_STR(D3DTSS_ALPHAARG1             );
    D3DSTATE_TO_STR(D3DTSS_ALPHAARG2             );
    D3DSTATE_TO_STR(D3DTSS_BUMPENVMAT00          );
    D3DSTATE_TO_STR(D3DTSS_BUMPENVMAT01          );
    D3DSTATE_TO_STR(D3DTSS_BUMPENVMAT10          );
    D3DSTATE_TO_STR(D3DTSS_BUMPENVMAT11          );
    D3DSTATE_TO_STR(D3DTSS_TEXCOORDINDEX         );
    D3DSTATE_TO_STR(D3DTSS_ADDRESSU              );
    D3DSTATE_TO_STR(D3DTSS_ADDRESSV              );
    D3DSTATE_TO_STR(D3DTSS_BORDERCOLOR           );
    D3DSTATE_TO_STR(D3DTSS_MAGFILTER             );
    D3DSTATE_TO_STR(D3DTSS_MINFILTER             );
    D3DSTATE_TO_STR(D3DTSS_MIPFILTER             );
    D3DSTATE_TO_STR(D3DTSS_MIPMAPLODBIAS         );
    D3DSTATE_TO_STR(D3DTSS_MAXMIPLEVEL           );
    D3DSTATE_TO_STR(D3DTSS_MAXANISOTROPY         );
    D3DSTATE_TO_STR(D3DTSS_BUMPENVLSCALE         );
    D3DSTATE_TO_STR(D3DTSS_BUMPENVLOFFSET        );
    D3DSTATE_TO_STR(D3DTSS_TEXTURETRANSFORMFLAGS );
    D3DSTATE_TO_STR(D3DTSS_ADDRESSW              );
    D3DSTATE_TO_STR(D3DTSS_COLORARG0             );
    D3DSTATE_TO_STR(D3DTSS_ALPHAARG0             );
    D3DSTATE_TO_STR(D3DTSS_RESULTARG             );
#undef D3DSTATE_TO_STR
  case 12:
    /* Note D3DTSS are not consecutive, so skip these */
    return "unused";
  default:
    FIXME("Unrecognized %lu texture state!\n", state);
    return "unrecognized";
  }
}

/*
 * Simple utility routines used for dx -> gl mapping of byte formats
 */
int D3DPrimitiveListGetVertexSize(D3DPRIMITIVETYPE PrimitiveType, int iNumPrim) {
  switch (PrimitiveType) {
  case D3DPT_POINTLIST:     return iNumPrim;
  case D3DPT_LINELIST:      return iNumPrim * 2;
  case D3DPT_LINESTRIP:     return iNumPrim + 1;
  case D3DPT_TRIANGLELIST:  return iNumPrim * 3;
  case D3DPT_TRIANGLESTRIP: return iNumPrim + 2;
  case D3DPT_TRIANGLEFAN:   return iNumPrim + 2;
  default:
    FIXME("Unrecognized %u D3DPRIMITIVETYPE!\n", PrimitiveType);
    return 0;
  }
}

int D3DPrimitive2GLenum(D3DPRIMITIVETYPE PrimitiveType) {
  switch (PrimitiveType) {
  case D3DPT_POINTLIST:     return GL_POINTS;
  case D3DPT_LINELIST:      return GL_LINES;
  case D3DPT_LINESTRIP:     return GL_LINE_STRIP;
  case D3DPT_TRIANGLELIST:  return GL_TRIANGLES;
  case D3DPT_TRIANGLESTRIP: return GL_TRIANGLE_STRIP;
  case D3DPT_TRIANGLEFAN:   return GL_TRIANGLE_FAN;
  default:
    FIXME("Unrecognized %u D3DPRIMITIVETYPE!\n", PrimitiveType);
    return GL_POLYGON;
  }
}

int D3DFVFGetSize(D3DFORMAT fvf) {
  int ret = 0;
  if      (fvf & D3DFVF_XYZ)    ret += 3 * sizeof(float);
  else if (fvf & D3DFVF_XYZRHW) ret += 4 * sizeof(float);
  if (fvf & D3DFVF_NORMAL)      ret += 3 * sizeof(float);
  if (fvf & D3DFVF_PSIZE)       ret += sizeof(float);
  if (fvf & D3DFVF_DIFFUSE)     ret += sizeof(DWORD);
  if (fvf & D3DFVF_SPECULAR)    ret += sizeof(DWORD);
  /*if (fvf & D3DFVF_TEX1)        ret += 1;*/
  return ret;
}

GLenum D3DFmt2GLDepthFmt(D3DFORMAT fmt) {
  switch (fmt) {
  /* depth/stencil buffer */
  case D3DFMT_D16_LOCKABLE:
  case D3DFMT_D16:
  case D3DFMT_D15S1:
  case D3DFMT_D24X4S4:
  case D3DFMT_D24S8:
  case D3DFMT_D24X8:
  case D3DFMT_D32:
    return GL_DEPTH_COMPONENT;
  default:
    FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
  }
  return 0;
}

GLenum D3DFmt2GLDepthType(D3DFORMAT fmt) {
  switch (fmt) {
  /* depth/stencil buffer */
  case D3DFMT_D15S1:
  case D3DFMT_D16_LOCKABLE:     
  case D3DFMT_D16:              
    return GL_UNSIGNED_SHORT;
  case D3DFMT_D24X4S4:          
  case D3DFMT_D24S8:            
  case D3DFMT_D24X8:            
  case D3DFMT_D32:              
    return GL_UNSIGNED_INT;
  default:
    FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
  }
  return 0;
}

SHORT D3DFmtGetBpp(IDirect3DDevice8Impl* This, D3DFORMAT fmt) {
    SHORT retVal;

    switch (fmt) {
    /* color buffer */
    case D3DFMT_R3G3B2:           retVal = 1; break;
    case D3DFMT_R5G6B5:           retVal = 2; break;
    case D3DFMT_R8G8B8:           retVal = 3; break;
    case D3DFMT_A1R5G5B5:         retVal = 2; break;
    case D3DFMT_X1R5G5B5:         retVal = 2; break;
    case D3DFMT_A4R4G4B4:         retVal = 2; break;
    case D3DFMT_X4R4G4B4:         retVal = 2; break;
    case D3DFMT_A8R8G8B8:         retVal = 4; break;
    case D3DFMT_X8R8G8B8:         retVal = 4; break;
    /* Paletted */
    case D3DFMT_P8:               retVal = 1; break;
    case D3DFMT_A8P8:             retVal = 2; break;
    /* depth/stencil buffer */
    case D3DFMT_D16_LOCKABLE:     retVal = 2; break;
    case D3DFMT_D16:              retVal = 2; break;
    case D3DFMT_D32:              retVal = 4; break;
    case D3DFMT_D15S1:            retVal = 2; break;
    case D3DFMT_D24X4S4:          retVal = 4; break;
    case D3DFMT_D24S8:            retVal = 4; break;
    case D3DFMT_D24X8:            retVal = 4; break;
    /* Luminance */
    case D3DFMT_L8:               retVal = 1; break;
    case D3DFMT_A4L4:             retVal = 1; break;
    case D3DFMT_A8L8:             retVal = 2; break;
    /* Bump */
    case D3DFMT_V8U8:             retVal = 2; break;
    case D3DFMT_L6V5U5:           retVal = 2; break;
    case D3DFMT_V16U16:           retVal = 4; break;
    case D3DFMT_X8L8V8U8:         retVal = 4; break;
    /* Compressed */				  
    case D3DFMT_DXT1:             retVal = 1; break; /* Actually  8 bytes per 16 pixels - Special cased later */
    case D3DFMT_DXT2:             retVal = 1; break; /* Actually 16 bytes per 16 pixels */
    case D3DFMT_DXT3:             retVal = 1; break; /* Actually 16 bytes per 16 pixels */
    case D3DFMT_DXT4:             retVal = 1; break; /* Actually 16 bytes per 16 pixels */
    case D3DFMT_DXT5:             retVal = 1; break; /* Actually 16 bytes per 16 pixels */
    /* to see */
    case D3DFMT_A8:               retVal = 1; break;      
    /* unknown */				  
    case D3DFMT_UNKNOWN:
      /* Guess at the highest value of the above */
      TRACE("D3DFMT_UNKNOWN - Guessing at 4 bytes/pixel %u\n", fmt);
      retVal = 4;
      break;

    default:
      FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
      retVal = 4;
    }
    TRACE("bytes/Pxl for fmt(%u,%s) = %d\n", fmt, debug_d3dformat(fmt), retVal);
    return retVal;
}

GLint D3DFmt2GLIntFmt(IDirect3DDevice8Impl* This, D3DFORMAT fmt) {
    GLint retVal = 0;

    if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
      switch (fmt) {
      case D3DFMT_DXT1:             retVal = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break;
      case D3DFMT_DXT2:             retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
      case D3DFMT_DXT3:             retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
      case D3DFMT_DXT4:             retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
      case D3DFMT_DXT5:             retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
      default:
	/* stupid compiler */
	break;
      }
    }

    if (retVal == 0) {
        switch (fmt) {
        /* Paletted */
        case D3DFMT_P8:               retVal = GL_COLOR_INDEX8_EXT; break;
        case D3DFMT_A8P8:             retVal = GL_COLOR_INDEX8_EXT; break;
	/* Luminance */
	case D3DFMT_L8:               retVal = GL_LUMINANCE8; break;
	case D3DFMT_A8L8:             retVal = GL_LUMINANCE8_ALPHA8; break;
	case D3DFMT_A4L4:             retVal = GL_LUMINANCE4_ALPHA4; break;
        /* Bump */
        case D3DFMT_V8U8:             retVal = GL_COLOR_INDEX8_EXT; break;
	case D3DFMT_V16U16:           retVal = GL_COLOR_INDEX; break;
        case D3DFMT_L6V5U5:           retVal = GL_COLOR_INDEX8_EXT; break;
	case D3DFMT_X8L8V8U8:         retVal = GL_COLOR_INDEX; break;
        /* color buffer */ 
	case D3DFMT_R3G3B2:           retVal = GL_R3_G3_B2; break;
        case D3DFMT_R5G6B5:           retVal = GL_RGB5; break; /* fixme: internal format 6 for g? */
        case D3DFMT_R8G8B8:           retVal = GL_RGB8; break;
        case D3DFMT_A1R5G5B5:         retVal = GL_RGB5_A1; break;
        case D3DFMT_X1R5G5B5:         retVal = GL_RGB5_A1; break;
        case D3DFMT_A4R4G4B4:         retVal = GL_RGBA4; break;
        case D3DFMT_X4R4G4B4:         retVal = GL_RGBA4; break;
        case D3DFMT_A8R8G8B8:         retVal = GL_RGBA8; break;
        case D3DFMT_X8R8G8B8:         retVal = GL_RGBA8; break;
        /* to see */
        case D3DFMT_A8:               retVal = GL_ALPHA8; break;
        default:
            FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
            retVal = GL_RGB8;
        }
    }
    TRACE("fmt2glintFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
    return retVal;
}

GLenum D3DFmt2GLFmt(IDirect3DDevice8Impl* This, D3DFORMAT fmt) {
    GLenum retVal = 0;

    if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
      switch (fmt) {
      case D3DFMT_DXT1:             retVal = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break;
      case D3DFMT_DXT2:             retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
      case D3DFMT_DXT3:             retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
      case D3DFMT_DXT4:             retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
      case D3DFMT_DXT5:             retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
      default:
	/* stupid compiler */
	break;
      }
    }

    if (retVal == 0) {
        switch (fmt) {
        /* Paletted */
        case D3DFMT_P8:               retVal = GL_COLOR_INDEX; break;
        case D3DFMT_A8P8:             retVal = GL_COLOR_INDEX; break;
	/* Luminance */
	case D3DFMT_L8:               retVal = GL_LUMINANCE; break;
	case D3DFMT_A8L8:             retVal = GL_LUMINANCE_ALPHA; break;
	case D3DFMT_A4L4:             retVal = GL_LUMINANCE_ALPHA; break;
        /* Bump */
        case D3DFMT_V8U8:             retVal = GL_COLOR_INDEX; break;
	case D3DFMT_V16U16:           retVal = GL_COLOR_INDEX; break;
        case D3DFMT_L6V5U5:           retVal = GL_COLOR_INDEX; break;
	case D3DFMT_X8L8V8U8:         retVal = GL_COLOR_INDEX; break;
        /* color buffer */
	case D3DFMT_R3G3B2:           retVal = GL_BGR; break;
        case D3DFMT_R5G6B5:           retVal = GL_RGB; break;
        case D3DFMT_R8G8B8:           retVal = GL_RGB; break;
        case D3DFMT_A1R5G5B5:         retVal = GL_BGRA; break;
        case D3DFMT_X1R5G5B5:         retVal = GL_BGRA; break;
        case D3DFMT_A4R4G4B4:         retVal = GL_BGRA; break;
        case D3DFMT_X4R4G4B4:         retVal = GL_BGRA; break;
        case D3DFMT_A8R8G8B8:         retVal = GL_BGRA; break;
        case D3DFMT_X8R8G8B8:         retVal = GL_BGRA; break;
        /* to see */
        case D3DFMT_A8:               retVal = GL_ALPHA; break;
        default:
            FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
            retVal = GL_BGR;
        }
    }

    TRACE("fmt2glFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
    return retVal;
}

GLenum D3DFmt2GLType(IDirect3DDevice8Impl* This, D3DFORMAT fmt) {
    GLenum retVal = 0;

    if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
      switch (fmt) {
      case D3DFMT_DXT1:             retVal = 0; break;
      case D3DFMT_DXT2:             retVal = 0; break;
      case D3DFMT_DXT3:             retVal = 0; break;
      case D3DFMT_DXT4:             retVal = 0; break;
      case D3DFMT_DXT5:             retVal = 0; break;
      default:
	/* stupid compiler */
	break;
      }
    }

    if (retVal == 0) {
        switch (fmt) {
        /* Paletted */
        case D3DFMT_P8:               retVal = GL_UNSIGNED_BYTE; break;
        case D3DFMT_A8P8:             retVal = GL_UNSIGNED_BYTE; break;        
	/* Luminance */
	case D3DFMT_L8:               retVal = GL_UNSIGNED_BYTE; break;
	case D3DFMT_A8L8:             retVal = GL_UNSIGNED_BYTE; break;
	case D3DFMT_A4L4:             retVal = GL_UNSIGNED_BYTE; break;
        /* Bump */
        case D3DFMT_V8U8:             retVal = GL_UNSIGNED_BYTE; break;
	case D3DFMT_V16U16:           retVal = GL_UNSIGNED_SHORT; break;
        case D3DFMT_L6V5U5:           retVal = GL_UNSIGNED_SHORT_5_5_5_1; break;
	case D3DFMT_X8L8V8U8:         retVal = GL_UNSIGNED_BYTE; break;
        /* Color buffer */
	case D3DFMT_R3G3B2:           retVal = GL_UNSIGNED_BYTE_2_3_3_REV; break;
        case D3DFMT_R5G6B5:           retVal = GL_UNSIGNED_SHORT_5_6_5; break;
        case D3DFMT_R8G8B8:           retVal = GL_UNSIGNED_BYTE; break;
        case D3DFMT_A1R5G5B5:         retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; break;
        case D3DFMT_X1R5G5B5:         retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; break;
        case D3DFMT_A4R4G4B4:         retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break;
        case D3DFMT_X4R4G4B4:         retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break;
        case D3DFMT_A8R8G8B8:         retVal = GL_UNSIGNED_INT_8_8_8_8_REV; break;
        case D3DFMT_X8R8G8B8:         retVal = GL_UNSIGNED_INT_8_8_8_8_REV; break;
        /* to see */
        case D3DFMT_A8:               retVal = GL_ALPHA; break;
        default:
            FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
            retVal = GL_UNSIGNED_BYTE;
        }
    }

    TRACE("fmt2glType for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
    return retVal;
}

int SOURCEx_RGB_EXT(DWORD arg) {
    switch(arg) {
    case D3DTSS_COLORARG0: return GL_SOURCE2_RGB_EXT;
    case D3DTSS_COLORARG1: return GL_SOURCE0_RGB_EXT;
    case D3DTSS_COLORARG2: return GL_SOURCE1_RGB_EXT;
    case D3DTSS_ALPHAARG0:
    case D3DTSS_ALPHAARG1:
    case D3DTSS_ALPHAARG2:
    default:
        FIXME("Invalid arg %ld\n", arg);
        return GL_SOURCE0_RGB_EXT;
    }
}

int OPERANDx_RGB_EXT(DWORD arg) {
    switch(arg) {
    case D3DTSS_COLORARG0: return GL_OPERAND2_RGB_EXT;
    case D3DTSS_COLORARG1: return GL_OPERAND0_RGB_EXT;
    case D3DTSS_COLORARG2: return GL_OPERAND1_RGB_EXT;
    case D3DTSS_ALPHAARG0:
    case D3DTSS_ALPHAARG1:
    case D3DTSS_ALPHAARG2:
    default:
        FIXME("Invalid arg %ld\n", arg);
        return GL_OPERAND0_RGB_EXT;
    }
}

int SOURCEx_ALPHA_EXT(DWORD arg) {
    switch(arg) {
    case D3DTSS_ALPHAARG0:  return GL_SOURCE2_ALPHA_EXT;
    case D3DTSS_ALPHAARG1:  return GL_SOURCE0_ALPHA_EXT;
    case D3DTSS_ALPHAARG2:  return GL_SOURCE1_ALPHA_EXT;
    case D3DTSS_COLORARG0:
    case D3DTSS_COLORARG1:
    case D3DTSS_COLORARG2:
    default:
        FIXME("Invalid arg %ld\n", arg);
        return GL_SOURCE0_ALPHA_EXT;
    }
}

int OPERANDx_ALPHA_EXT(DWORD arg) {
    switch(arg) {
    case D3DTSS_ALPHAARG0:  return GL_OPERAND2_ALPHA_EXT;
    case D3DTSS_ALPHAARG1:  return GL_OPERAND0_ALPHA_EXT;
    case D3DTSS_ALPHAARG2:  return GL_OPERAND1_ALPHA_EXT;
    case D3DTSS_COLORARG0:
    case D3DTSS_COLORARG1:
    case D3DTSS_COLORARG2:
    default:
        FIXME("Invalid arg %ld\n", arg);
        return GL_OPERAND0_ALPHA_EXT;
    }
}

GLenum StencilOp(DWORD op) {
    switch(op) {                
    case D3DSTENCILOP_KEEP    : return GL_KEEP;
    case D3DSTENCILOP_ZERO    : return GL_ZERO;
    case D3DSTENCILOP_REPLACE : return GL_REPLACE;
    case D3DSTENCILOP_INCRSAT : return GL_INCR;
    case D3DSTENCILOP_DECRSAT : return GL_DECR;
    case D3DSTENCILOP_INVERT  : return GL_INVERT; 
    case D3DSTENCILOP_INCR    : return GL_INCR_WRAP_EXT;
    case D3DSTENCILOP_DECR    : return GL_DECR_WRAP_EXT;
    default:
        FIXME("Invalid stencil op %ld\n", op);
        return GL_ALWAYS;
    }
}

/**
 * @nodoc: todo
 */
void GetSrcAndOpFromValue(DWORD iValue, BOOL isAlphaArg, GLenum* source, GLenum* operand) 
{
  BOOL isAlphaReplicate = FALSE;
  BOOL isComplement     = FALSE;
  
  *operand = GL_SRC_COLOR;
  *source = GL_TEXTURE;
  
  /* Catch alpha replicate */
  if (iValue & D3DTA_ALPHAREPLICATE) {
    iValue = iValue & ~D3DTA_ALPHAREPLICATE;
    isAlphaReplicate = TRUE;
  }
  
  /* Catch Complement */
  if (iValue & D3DTA_COMPLEMENT) {
    iValue = iValue & ~D3DTA_COMPLEMENT;
    isComplement = TRUE;
  }
  
  /* Calculate the operand */
  if (isAlphaReplicate && !isComplement) {
    *operand = GL_SRC_ALPHA;
  } else if (isAlphaReplicate && isComplement) {
    *operand = GL_ONE_MINUS_SRC_ALPHA;
  } else if (isComplement) {
    if (isAlphaArg) {
      *operand = GL_ONE_MINUS_SRC_ALPHA;
    } else {
      *operand = GL_ONE_MINUS_SRC_COLOR;
    }
  } else {
    if (isAlphaArg) {
      *operand = GL_SRC_ALPHA;
    } else {
      *operand = GL_SRC_COLOR;
    }
  }
  
  /* Calculate the source */
  switch (iValue & D3DTA_SELECTMASK) {
  case D3DTA_CURRENT:   *source  = GL_PREVIOUS_EXT;
    break;
  case D3DTA_DIFFUSE:   *source  = GL_PRIMARY_COLOR_EXT;
    break;
  case D3DTA_TEXTURE:   *source  = GL_TEXTURE;
    break;
  case D3DTA_TFACTOR:   *source  = GL_CONSTANT_EXT;
    break;
  case D3DTA_SPECULAR:
    /*
     * According to the GL_ARB_texture_env_combine specs, SPECULAR is
     * 'Secondary color' and isn't supported until base GL supports it
     * There is no concept of temp registers as far as I can tell
     */
    FIXME("Unhandled texture arg D3DTA_SPECULAR\n");
    *source = GL_TEXTURE;
    break;

  default:
    FIXME("Unrecognized texture arg %ld\n", iValue);
    *source = GL_TEXTURE;
  }
}


/* Set texture operations up - The following avoids lots of ifdefs in this routine!*/
#if defined (GL_VERSION_1_3)
# define useext(A) A
# define combine_ext 1
#elif defined (GL_EXT_texture_env_combine)
# define useext(A) A##_EXT
# define combine_ext 1
#elif defined (GL_ARB_texture_env_combine)
# define useext(A) A##_ARB
# define combine_ext 1
#else
# undef combine_ext
#endif

#if !defined(combine_ext)
void set_tex_op(LPDIRECT3DDEVICE8 iface, BOOL isAlpha, int Stage, D3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3)
{ 
        FIXME("Requires opengl combine extensions to work\n");
        return;
}
#else
/* Setup the texture operations texture stage states */
void set_tex_op(LPDIRECT3DDEVICE8 iface, BOOL isAlpha, int Stage, D3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3)
{
	GLenum src1, src2, src3;
	GLenum opr1, opr2, opr3;
	GLenum comb_target;
	GLenum src0_target, src1_target, src2_target;
	GLenum opr0_target, opr1_target, opr2_target;
	GLenum scal_target;
	GLenum opr=0, invopr, src3_target, opr3_target;
        BOOL Handled = FALSE;
        IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;

        TRACE("Alpha?(%d), Stage:%d Op(%d), a1(%ld), a2(%ld), a3(%ld)\n", isAlpha, Stage, op, arg1, arg2, arg3);

	ENTER_GL();

        /* Note: Operations usually involve two ars, src0 and src1 and are operations of
           the form (a1 <operation> a2). However, some of the more complex operations
           take 3 parameters. Instead of the (sensible) addition of a3, Microsoft added  
           in a third parameter called a0. Therefore these are operations of the form
           a0 <operation> a1 <operation> a2, ie the new parameter goes to the front.
           
           However, below we treat the new (a0) parameter as src2/opr2, so in the actual
           functions below, expect their syntax to differ slightly to those listed in the
           manuals, ie replace arg1 with arg3, arg2 with arg1 and arg3 with arg2
           This affects D3DTOP_MULTIPLYADD and D3DTOP_LERP                               */
           
	if (isAlpha) {
		comb_target = useext(GL_COMBINE_ALPHA);
		src0_target = useext(GL_SOURCE0_ALPHA);
		src1_target = useext(GL_SOURCE1_ALPHA);
		src2_target = useext(GL_SOURCE2_ALPHA);
		opr0_target = useext(GL_OPERAND0_ALPHA);
		opr1_target = useext(GL_OPERAND1_ALPHA);
		opr2_target = useext(GL_OPERAND2_ALPHA);
		scal_target = GL_ALPHA_SCALE;
	}
	else {
		comb_target = useext(GL_COMBINE_RGB);
		src0_target = useext(GL_SOURCE0_RGB);
		src1_target = useext(GL_SOURCE1_RGB);
		src2_target = useext(GL_SOURCE2_RGB);
		opr0_target = useext(GL_OPERAND0_RGB);
		opr1_target = useext(GL_OPERAND1_RGB);
		opr2_target = useext(GL_OPERAND2_RGB);
		scal_target = useext(GL_RGB_SCALE);
	}

        /* From MSDN (D3DTSS_ALPHAARG1) : 
           The default argument is D3DTA_TEXTURE. If no texture is set for this stage, 
                   then the default argument is D3DTA_DIFFUSE.
                   FIXME? If texture added/removed, may need to reset back as well?    */
        if (isAlpha && This->StateBlock->textures[Stage] == NULL && arg1 == D3DTA_TEXTURE) {
            GetSrcAndOpFromValue(D3DTA_DIFFUSE, isAlpha, &src1, &opr1);  
        } else {
            GetSrcAndOpFromValue(arg1, isAlpha, &src1, &opr1);
        }
        GetSrcAndOpFromValue(arg2, isAlpha, &src2, &opr2);
        GetSrcAndOpFromValue(arg3, isAlpha, &src3, &opr3);
        
        TRACE("ct(%x), 1:(%x,%x), 2:(%x,%x), 3:(%x,%x)\n", comb_target, src1, opr1, src2, opr2, src3, opr3);

        Handled = TRUE; /* Assume will be handled */

        /* Other texture operations require special extensions: */
	if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {
	  if (isAlpha) {
	    opr = GL_SRC_ALPHA;
	    invopr = GL_ONE_MINUS_SRC_ALPHA;
	    src3_target = GL_SOURCE3_ALPHA_NV;
	    opr3_target = GL_OPERAND3_ALPHA_NV;
	  } else {
	    opr = GL_SRC_COLOR;
	    invopr = GL_ONE_MINUS_SRC_COLOR;
	    src3_target = GL_SOURCE3_RGB_NV;
	    opr3_target = GL_OPERAND3_RGB_NV;
	  }
	  switch (op) {
	  case D3DTOP_DISABLE: /* Only for alpha */
	    glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
	    checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
	    glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT);
	    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
	    glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA);
	    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
	    glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);    
	    checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);              
	    checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");  
	    glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);             
	    checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
	    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");  
	    glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);             
	    checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
	    checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");  
	    break;
	  case D3DTOP_SELECTARG1:                                          /* = a1 * 1 + 0 * 0 */
	  case D3DTOP_SELECTARG2:                                          /* = a2 * 1 + 0 * 0 */
	    glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
	    checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
	    if (op == D3DTOP_SELECTARG1) {
	      glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);                
	      checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
	      glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);        
	      checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");  
	    } else {
	      glTexEnvi(GL_TEXTURE_ENV, src0_target, src2);                
	      checkGLcall("GL_TEXTURE_ENV, src0_target, src2");
	      glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2);        
	      checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2");  
	    }
	    glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);             
	    checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);              
	    checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");  
	    glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);             
	    checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
	    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");  
	    glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);             
	    checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
	    checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");  
	    break;
	    
	  case D3DTOP_MODULATE:
	    glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
	    checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
	    glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);    
	    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
	    glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
	    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
	    glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
	    checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);      
	    checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");  
	    glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO); 
	    checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
	    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
	    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
	    glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
	    checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
	    checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
	    glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
	    checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
	    break;
	  case D3DTOP_MODULATE2X:
	    glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
	    checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
	    glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);    
	    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
	    glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
	    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
	    glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
	    checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);      
	    checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");  
	    glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO); 
	    checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
	    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
	    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
	    glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
	    checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
	    checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
	    glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
	    checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
	    break;
	  case D3DTOP_MODULATE4X:
	    glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
	    checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
	    glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);    
	    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
	    glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
	    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
	    glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
	    checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);      
	    checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");  
	    glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO); 
	    checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
	    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
	    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
	    glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
	    checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
	    checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
	    glTexEnvi(GL_TEXTURE_ENV, scal_target, 4);
	    checkGLcall("GL_TEXTURE_ENV, scal_target, 4");
	    break;

	  case D3DTOP_ADD:
	    glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
	    checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
	    glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
	    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
	    glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
	    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
	    glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
	    checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
	    checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
	    glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
	    checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
	    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
	    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
	    glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
	    checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
	    checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
	    glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
	    checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
	    break;

	  case D3DTOP_ADDSIGNED:
	    glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
	    checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)");
	    glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
	    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
	    glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
	    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
	    glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
	    checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
	    checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
	    glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
	    checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
	    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
	    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
	    glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
	    checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
	    checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
	    glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
	    checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
	    break;

	  case D3DTOP_ADDSIGNED2X:
	    glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
	    checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)");
	    glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
	    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
	    glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
	    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
	    glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
	    checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
	    checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
	    glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
	    checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
	    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
	    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
	    glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
	    checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
	    checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
	    glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
	    checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
	    break;

	  case D3DTOP_ADDSMOOTH:
	    glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
	    checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
	    glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
	    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
	    glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
	    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
	    glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
	    checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
	    checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
	    glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
	    checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
	    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
	    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
	    glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
	    checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
	    switch (opr1) {
	    case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
	    case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
	    case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
	    case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
	    }
	    glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
	    checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
	    glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
	    checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
	    break;

	  case D3DTOP_BLENDDIFFUSEALPHA:
	    glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
	    checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
	    glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
	    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
	    glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
	    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
	    glTexEnvi(GL_TEXTURE_ENV, src1_target, useext(GL_PRIMARY_COLOR));
	    checkGLcall("GL_TEXTURE_ENV, src1_target, useext(GL_PRIMARY_COLOR)");
	    glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
	    checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
	    glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
	    checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
	    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
	    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
	    glTexEnvi(GL_TEXTURE_ENV, src3_target, useext(GL_PRIMARY_COLOR));
	    checkGLcall("GL_TEXTURE_ENV, src3_target, useext(GL_PRIMARY_COLOR)");
	    glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
	    checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
	    glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
	    checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
	    break;
	  case D3DTOP_BLENDTEXTUREALPHA:
	    glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
	    checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
	    glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
	    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
	    glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
	    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
	    glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_TEXTURE);
	    checkGLcall("GL_TEXTURE_ENV, src1_target, GL_TEXTURE");
	    glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
	    checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
	    glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
	    checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
	    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
	    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
	    glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE);
	    checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE");
	    glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
	    checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
	    glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
	    checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
	    break;
	  case D3DTOP_BLENDFACTORALPHA:
	    glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
	    checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
	    glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
	    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
	    glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
	    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
	    glTexEnvi(GL_TEXTURE_ENV, src1_target, useext(GL_CONSTANT));
	    checkGLcall("GL_TEXTURE_ENV, src1_target, useext(GL_CONSTANT)");
	    glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
	    checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
	    glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
	    checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
	    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
	    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
	    glTexEnvi(GL_TEXTURE_ENV, src3_target, useext(GL_CONSTANT));
	    checkGLcall("GL_TEXTURE_ENV, src3_target, useext(GL_CONSTANT)");
	    glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
	    checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
	    glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
	    checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
	    break;
	  case D3DTOP_BLENDTEXTUREALPHAPM:
	    glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
	    checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
	    glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
	    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
	    glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
	    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
	    glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
	    checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
	    checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
	    glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
	    checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
	    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
	    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
	    glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE);
	    checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE");
	    glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
	    checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
	    glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
	    checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
	    break;
	  case D3DTOP_MODULATEALPHA_ADDCOLOR:
	    glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
	    checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");  /* Add = a0*a1 + a2*a3 */
	    glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);        /*   a0 = src1/opr1    */
	    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
	    glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
	    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");    /*   a1 = 1 (see docs) */
	    glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
	    checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);      
	    checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");  
	    glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);        /*   a2 = arg2         */
	    checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
	    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
	    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");     /*  a3 = src1 alpha   */
	    glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
	    checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
	    switch (opr) {
	    case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
	    case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
	    }
	    glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
	    checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
	    glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
	    checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
	    break;
	  case D3DTOP_MODULATECOLOR_ADDALPHA:
	    glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
	    checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
	    glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
	    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
	    glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
	    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
	    glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
	    checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
	    glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
	    checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
	    glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
	    checkGLcall("GL_TEXTURE_ENV, src2_target, src1");
	    switch (opr1) {
	    case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
	    case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
	    }
	    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
	    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
	    glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
	    checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
	    checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
	    glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
	    checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
	    break;
	  case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
	    glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
	    checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
	    glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
	    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
	    glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
	    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
	    glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
	    checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
	    checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
	    glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
	    checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
	    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
	    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
	    glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
	    checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
	    switch (opr1) {
	    case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
	    case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_ALPHA; break;
	    case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
	    case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
	    }
	    glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
	    checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
	    glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
	    checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
	    break;
	  case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
	    glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
	    checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
	    glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
	    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
	    switch (opr1) {
	    case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
	    case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
	    case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
	    case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
	    }
	    glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
	    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
	    glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
	    checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
	    glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
	    checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
	    glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
	    checkGLcall("GL_TEXTURE_ENV, src2_target, src1");
	    switch (opr1) {
	    case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
	    case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
	    }
	    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
	    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
	    glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
	    checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
	    checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
	    glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
	    checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
	    break;
	  case D3DTOP_MULTIPLYADD:
	    glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
	    checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
	    glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);
	    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
	    glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);
	    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
	    glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
	    checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
	    glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
	    checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
	    glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
	    checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
	    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);
	    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
	    glTexEnvi(GL_TEXTURE_ENV, src3_target, src2);
	    checkGLcall("GL_TEXTURE_ENV, src3_target, src3");
	    glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr2);
	    checkGLcall("GL_TEXTURE_ENV, opr3_target, opr3");
	    glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
	    checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
	    break;
	    
	  case D3DTOP_BUMPENVMAP:
	    {
	      if (GL_SUPPORT(NV_TEXTURE_SHADER)) {
		/*
		  texture unit 0: GL_TEXTURE_2D
		  texture unit 1: GL_DOT_PRODUCT_NV
		  texture unit 2: GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV
		  texture unit 3: GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV
		*/
		float m[2][2];
		
		union {
		  float f;
		  DWORD d;
		} tmpvalue;
		
		tmpvalue.d = This->StateBlock->texture_state[Stage][D3DTSS_BUMPENVMAT00];
		m[0][0] = tmpvalue.f;
		tmpvalue.d = This->StateBlock->texture_state[Stage][D3DTSS_BUMPENVMAT01];
		m[0][1] = tmpvalue.f;
		tmpvalue.d = This->StateBlock->texture_state[Stage][D3DTSS_BUMPENVMAT10];
		m[1][0] = tmpvalue.f;
		tmpvalue.d = This->StateBlock->texture_state[Stage][D3DTSS_BUMPENVMAT11];
		m[1][1] = tmpvalue.f;
		
		/*FIXME("Stage %d matrix is (%.2f,%.2f),(%.2f,%.2f)\n", Stage, m[0][0], m[0][1], m[1][0], m[1][0]);*/

		if (FALSE == This->texture_shader_active) {
		  This->texture_shader_active = TRUE;
		  glEnable(GL_TEXTURE_SHADER_NV);
		}

		/*
		glEnable(GL_REGISTER_COMBINERS_NV);
		glCombinerParameteriNV (GL_NUM_GENERAL_COMBINERS_NV, 1);
		glCombinerInputNV (GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, GL_TEXTURE0_ARB, GL_SIGNED_IDENTITY_NV, GL_RGB);
		glCombinerInputNV (GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, GL_NONE, GL_UNSIGNED_INVERT_NV, GL_RGB);
		glCombinerInputNV (GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV, GL_TEXTURE2_ARB, GL_SIGNED_IDENTITY_NV, GL_RGB);
		glCombinerInputNV (GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV, GL_NONE, GL_UNSIGNED_INVERT_NV, GL_RGB);
		glCombinerOutputNV (GL_COMBINER0_NV, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV, GL_PRIMARY_COLOR_NV, 0, 0, 0, 0, 0);
		glCombinerInputNV (GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_A_NV, GL_TEXTURE0_ARB, GL_SIGNED_IDENTITY_NV, GL_ALPHA);
		glCombinerInputNV (GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_B_NV, GL_NONE, GL_UNSIGNED_INVERT_NV, GL_ALPHA);
		glCombinerInputNV (GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_C_NV, GL_TEXTURE2_ARB, GL_SIGNED_IDENTITY_NV, GL_ALPHA);
		glCombinerInputNV (GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_D_NV, GL_NONE, GL_UNSIGNED_INVERT_NV, GL_ALPHA);
		glCombinerOutputNV (GL_COMBINER0_NV, GL_ALPHA, GL_DISCARD_NV, GL_DISCARD_NV, GL_PRIMARY_COLOR_NV, 0, 0, 0, 0, 0);
		glDisable (GL_PER_STAGE_CONSTANTS_NV);
		glCombinerParameteriNV (GL_COLOR_SUM_CLAMP_NV, 0);
		glFinalCombinerInputNV (GL_VARIABLE_A_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
		glFinalCombinerInputNV (GL_VARIABLE_B_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
		glFinalCombinerInputNV (GL_VARIABLE_C_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
		glFinalCombinerInputNV (GL_VARIABLE_D_NV, GL_PRIMARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
		glFinalCombinerInputNV (GL_VARIABLE_E_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
		glFinalCombinerInputNV (GL_VARIABLE_F_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
		glFinalCombinerInputNV (GL_VARIABLE_G_NV, GL_PRIMARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
		*/
		/*
		int i;
		for (i = 0; i < Stage; i++) {
		  if (GL_SUPPORT(ARB_MULTITEXTURE)) {
                    glActiveTexture(GL_TEXTURE0 + i);
		    glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_2D);
                    checkGLcall("Activate texture..");
		  } else if (i>0) {
                    FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
		  }
		}
		*/
		/*
		  glActiveTextureARB(GL_TEXTURE0_ARB + Stage - 1);
		  glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_2D);
		*/
		/*
		glActiveTextureARB(GL_TEXTURE0_ARB + Stage);
		checkGLcall("Activate texture.. to update const color");
		glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_OFFSET_TEXTURE_2D_NV);
		checkGLcall("glTexEnv");
		glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, GL_TEXTURE0_ARB + Stage - 1);
		checkGLcall("glTexEnv");
		glTexEnvfv(GL_TEXTURE_SHADER_NV, GL_OFFSET_TEXTURE_MATRIX_NV, (float*)&m[0]);
		checkGLcall("glTexEnv");
		*/
		LEAVE_GL();
		return;
	      }
	    }

	  case D3DTOP_BUMPENVMAPLUMINANCE:

	  default:
	    Handled = FALSE;
	  }
	  if (Handled) {
	    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV);
	    checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV");
	    
	    LEAVE_GL();
	    return;
	  }
	} /* GL_NV_texture_env_combine4 */
	
	Handled = TRUE; /* Again, assume handled */
	switch (op) {
        case D3DTOP_DISABLE: /* Only for alpha */
                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);
                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
                glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT);
                checkGLcall("GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT");
                glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA);
                checkGLcall("GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA");
                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
                break;
	case D3DTOP_SELECTARG1:
		glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);
		checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
		glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
		checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
		glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
		break;
	case D3DTOP_SELECTARG2:
		glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);
		checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
		glTexEnvi(GL_TEXTURE_ENV, src0_target, src2);
		checkGLcall("GL_TEXTURE_ENV, src0_target, src2");
		glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2);
		checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2");
		glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
		break;
	case D3DTOP_MODULATE:
		glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);
		checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");
		glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
		checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
		glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
		checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
		glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
		checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
		glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
		break;
	case D3DTOP_MODULATE2X:
		glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);
		checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");
		glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
		checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
		glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
		checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
		glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
		checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
		glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
		checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
		break;
	case D3DTOP_MODULATE4X:
		glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);
		checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");
		glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
		checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
		glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
		checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
		glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
		checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
		glTexEnvi(GL_TEXTURE_ENV, scal_target, 4);
		checkGLcall("GL_TEXTURE_ENV, scal_target, 4");
		break;
	case D3DTOP_ADD:
		glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
		checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
		glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
		checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
		glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
		checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
		glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
		checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
		glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
		break;
	case D3DTOP_ADDSIGNED:
		glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
		checkGLcall("GL_TEXTURE_ENV, comb_target, useext((GL_ADD_SIGNED)");
		glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
		checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
		glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
		checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
		glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
		checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
		glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
		break;
	case D3DTOP_ADDSIGNED2X:
		glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
		checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)");
		glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
		checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
		glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
		checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
		glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
		checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
		glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
		checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
		break;
        case D3DTOP_SUBTRACT:
	  if (GL_SUPPORT(ARB_TEXTURE_ENV_COMBINE)) {
		glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_SUBTRACT);
		checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_SUBTRACT)");
		glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
		checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
		glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
		checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
		glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
		checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
		glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
	  } else {
                FIXME("This version of opengl does not support GL_SUBTRACT\n");
	  }
	  break;

	case D3DTOP_BLENDDIFFUSEALPHA:
		glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
		checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
		glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
		checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
		glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
		checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
		glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
		checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
		glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_PRIMARY_COLOR));
		checkGLcall("GL_TEXTURE_ENV, src2_target, GL_PRIMARY_COLOR");
		glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
		checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
		glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
		break;
	case D3DTOP_BLENDTEXTUREALPHA:
		glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
		checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
		glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
		checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
		glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
		checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
		glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
		checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
		glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_TEXTURE);
		checkGLcall("GL_TEXTURE_ENV, src2_target, GL_TEXTURE");
		glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
		checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
		glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
		break;
	case D3DTOP_BLENDFACTORALPHA:
		glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
		checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
		glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
		checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
		glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
		checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
		glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
		checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
		glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_CONSTANT));
		checkGLcall("GL_TEXTURE_ENV, src2_target, GL_CONSTANT");
		glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
		checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
		glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
		break;
	case D3DTOP_BLENDCURRENTALPHA:
		glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
		checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
		glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
		checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
		glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
		checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
		glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
		checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
		glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_PREVIOUS));
		checkGLcall("GL_TEXTURE_ENV, src2_target, GL_PREVIOUS");
		glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
		checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
		glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
		break;
        case D3DTOP_DOTPRODUCT3: 
		if (GL_SUPPORT(ARB_TEXTURE_ENV_DOT3)) {
		  glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_ARB);
		  checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_ARB");
		} else if (GL_SUPPORT(EXT_TEXTURE_ENV_DOT3)) {
		  glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_EXT);
		  checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_EXT");
		} else {
		  FIXME("This version of opengl does not support GL_DOT3\n");
		}
		glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
		checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
		glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
		checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
		glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
		checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
		glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
		break;
	case D3DTOP_LERP:
		glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
		checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
		glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
		checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
		glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
		checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
		glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
		checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
		glTexEnvi(GL_TEXTURE_ENV, src2_target, src3);
		checkGLcall("GL_TEXTURE_ENV, src2_target, src3");
		glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr3);
		checkGLcall("GL_TEXTURE_ENV, opr2_target, opr3");
		glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
		break;
	case D3DTOP_ADDSMOOTH:
		if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
		  glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
		  checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
		  glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		  checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		  switch (opr1) {
		  case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
		  case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
		  case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
		  case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
		  }
		  glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
		  checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
		  glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
		  checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
		  glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
		  checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
		  glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
		  checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
		  glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
		  checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
		  glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		  checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
		} else
		  Handled = FALSE;
		break;
	case D3DTOP_BLENDTEXTUREALPHAPM:
		if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
		  glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
		  checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
		  glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_TEXTURE);
		  checkGLcall("GL_TEXTURE_ENV, src0_target, GL_TEXTURE");
		  glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_ONE_MINUS_SRC_ALPHA);
		  checkGLcall("GL_TEXTURE_ENV, opr0_target, GL_ONE_MINUS_SRC_APHA");
		  glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
		  checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
		  glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
		  checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
		  glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
		  checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
		  glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
		  checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
		  glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		  checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
		} else
		  Handled = FALSE;
		break;
	case D3DTOP_MODULATEALPHA_ADDCOLOR:
		if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
		  glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
		  checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
		  glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		  checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		  switch (opr1) {
		  case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
		  case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
		  case GL_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
		  case GL_ONE_MINUS_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
		  }
		  glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
		  checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
		  glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
		  checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
		  glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
		  checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
		  glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
		  checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
		  glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
		  checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
		  glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		  checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
		} else
		  Handled = FALSE;
		break;
	case D3DTOP_MODULATECOLOR_ADDALPHA:
		if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
		  glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
		  checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
		  glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		  checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		  glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
		  checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
		  glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
		  checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
		  switch (opr1) {
		  case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
		  case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
		  case GL_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
		  case GL_ONE_MINUS_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
		  }
		  glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr);
		  checkGLcall("GL_TEXTURE_ENV, opr1_target, opr");
		  glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
		  checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
		  glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
		  checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
		  glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		  checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
		} else
		  Handled = FALSE;
		break;
	case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
		if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
		  glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
		  checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
		  glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		  checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		  switch (opr1) {
		  case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
		  case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_ALPHA; break;
		  case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
		  case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
		  }
		  glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
		  checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
		  glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
		  checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
		  glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
		  checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
		  glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
		  checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
		  glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
		  checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
		  glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		  checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
		} else
		  Handled = FALSE;
		break;
	case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
		if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
		  glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
		  checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
		  glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
		  checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
		  switch (opr1) {
		  case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
		  case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
		  case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
		  case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
		  }
		  glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
		  checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
		  glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
		  checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
		  switch (opr1) {
		  case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
		  case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
		  case GL_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
		  case GL_ONE_MINUS_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
		  }
		  glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr);
		  checkGLcall("GL_TEXTURE_ENV, opr1_target, opr");
		  glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
		  checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
		  glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
		  checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
		  glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		  checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
		} else
		  Handled = FALSE;
		break;
	case D3DTOP_MULTIPLYADD:
		if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
		  glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
		  checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
		  glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);
		  checkGLcall("GL_TEXTURE_ENV, src0_target, src3");
		  glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);
		  checkGLcall("GL_TEXTURE_ENV, opr0_target, opr3");
		  glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
		  checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
		  glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
		  checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
		  glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
		  checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
		  glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
		  checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
		  glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
		  checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
		} else
		  Handled = FALSE;
		break;
	default:
		Handled = FALSE;
	}

        if (Handled) {
	  BOOL  combineOK = TRUE;
	  if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {
	    DWORD op2;
	    
	    if (isAlpha) {
	      op2 = This->UpdateStateBlock->texture_state[Stage][D3DTSS_COLOROP];
	    } else {
	      op2 = This->UpdateStateBlock->texture_state[Stage][D3DTSS_ALPHAOP];
	    }
	    
	    /* Note: If COMBINE4 in effect can't go back to combine! */
	    switch (op2) {
	    case D3DTOP_ADDSMOOTH:
	    case D3DTOP_BLENDTEXTUREALPHAPM:
	    case D3DTOP_MODULATEALPHA_ADDCOLOR:
	    case D3DTOP_MODULATECOLOR_ADDALPHA:
	    case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
	    case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
	    case D3DTOP_MULTIPLYADD:
	      /* Ignore those implemented in both cases */
	      switch (op) {
	      case D3DTOP_SELECTARG1:
	      case D3DTOP_SELECTARG2:
		combineOK = FALSE;
		Handled   = FALSE;
		break;
	      default:
		FIXME("Can't use COMBINE4 and COMBINE together, thisop=%d, otherop=%ld, isAlpha(%d)\n", op, op2, isAlpha);
		LEAVE_GL();
		return;
	      }
	    }
	  }
	  
	  if (combineOK) {
	    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE));
	    checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE)");
	    
	    LEAVE_GL();
	    return;
	  }
        }

	LEAVE_GL();
	
	/* After all the extensions, if still unhandled, report fixme */
	FIXME("Unhandled texture operation %d\n", op);
}
#endif
