- more Extensions work (begin to detect ATI extensions)
- try to fix D3DTADDRESS_BORDER, D3DTADDRESS_MIRROR, D3DTADDRESS_MIRRORONCE using OpenGL extensions - better set_tex_op: now use Runtime Extension support (and not compile support)
This commit is contained in:
parent
49b3982255
commit
114c9077d6
|
@ -78,6 +78,7 @@ typedef void (APIENTRY * PGLFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum intern
|
|||
#endif
|
||||
typedef void (APIENTRY * PGLFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param);
|
||||
typedef void (APIENTRY * PGLFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params);
|
||||
/* GL_EXT_texture_env_combine */
|
||||
#ifndef GL_EXT_texture_env_combine
|
||||
#define GL_EXT_texture_env_combine 1
|
||||
#define GL_COMBINE_EXT 0x8570
|
||||
|
@ -131,10 +132,34 @@ typedef void (APIENTRY * PGLFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GL
|
|||
#endif
|
||||
/* GL_EXT_texture_lod_bias */
|
||||
#ifndef GL_EXT_texture_lod_bias
|
||||
#define GL_EXT_texture_lod_bias 1
|
||||
#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD
|
||||
#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500
|
||||
#define GL_TEXTURE_LOD_BIAS_EXT 0x8501
|
||||
#endif
|
||||
/* GL_ARB_texture_border_clamp */
|
||||
#ifndef GL_ARB_texture_border_clamp
|
||||
#define GL_ARB_texture_border_clamp 1
|
||||
#define GL_CLAMP_TO_BORDER_ARB 0x812D
|
||||
#endif
|
||||
/* GL_ATI_texture_mirror_once */
|
||||
#ifndef GL_ATI_texture_mirror_once
|
||||
#define GL_ATI_texture_mirror_once 1
|
||||
#define GL_MIRROR_CLAMP_ATI 0x8742
|
||||
#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743
|
||||
#endif
|
||||
/* GL_ARB_texture_env_dot3 */
|
||||
#ifndef GL_ARB_texture_env_dot3
|
||||
#define GL_ARB_texture_env_dot3 1
|
||||
#define GL_DOT3_RGB_ARB 0x86AE
|
||||
#define GL_DOT3_RGBA_ARB 0x86AF
|
||||
#endif
|
||||
/* GL_EXT_texture_env_dot3 */
|
||||
#ifndef GL_EXT_texture_env_dot3
|
||||
#define GL_EXT_texture_env_dot3 1
|
||||
#define GL_DOT3_RGB_EXT 0x8740
|
||||
#define GL_DOT3_RGBA_EXT 0x8741
|
||||
#endif
|
||||
|
||||
/*******
|
||||
* OpenGL Official Version
|
||||
|
@ -195,8 +220,10 @@ typedef enum _GL_SupportedExt {
|
|||
ARB_POINT_PARAMETERS,
|
||||
ARB_TEXTURE_COMPRESSION,
|
||||
ARB_TEXTURE_CUBE_MAP,
|
||||
ARB_TEXTURE_ENV_ADD,
|
||||
ARB_TEXTURE_ENV_COMBINE,
|
||||
ARB_TEXTURE_ENV_DOT3,
|
||||
ARB_TEXTURE_BORDER_CLAMP,
|
||||
ARB_VERTEX_PROGRAM,
|
||||
ARB_VERTEX_BLEND,
|
||||
/* EXT */
|
||||
|
@ -208,11 +235,17 @@ typedef enum _GL_SupportedExt {
|
|||
EXT_TEXTURE_FILTER_ANISOTROPIC,
|
||||
EXT_TEXTURE_LOD,
|
||||
EXT_TEXTURE_LOD_BIAS,
|
||||
EXT_TEXTURE_ENV_ADD,
|
||||
EXT_TEXTURE_ENV_COMBINE,
|
||||
EXT_TEXTURE_ENV_DOT3,
|
||||
EXT_VERTEX_WEIGHTING,
|
||||
/* NVIDIA */
|
||||
NV_TEXTURE_ENV_COMBINE4,
|
||||
NV_FRAGMENT_PROGRAM,
|
||||
NV_VERTEX_PROGRAM,
|
||||
/* ATI */
|
||||
ATI_TEXTURE_ENV_COMBINE3,
|
||||
ATI_TEXTURE_MIRROR_ONCE,
|
||||
EXT_VERTEX_SHADER,
|
||||
|
||||
OPENGL_SUPPORTED_EXT_END
|
||||
|
@ -330,7 +363,7 @@ typedef struct _GL_Info {
|
|||
GL_VSVersion vs_nv_version;
|
||||
GL_VSVersion vs_ati_version;
|
||||
|
||||
BOOL supported[30];
|
||||
BOOL supported[40];
|
||||
|
||||
/** OpenGL EXT and ARB functions ptr */
|
||||
GL_EXT_FUNCS_GEN;
|
||||
|
|
|
@ -3361,7 +3361,6 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 ifa
|
|||
}
|
||||
break;
|
||||
|
||||
|
||||
case D3DTSS_ALPHAOP :
|
||||
case D3DTSS_COLOROP :
|
||||
{
|
||||
|
@ -3438,18 +3437,45 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 ifa
|
|||
case D3DTSS_ADDRESSW :
|
||||
{
|
||||
GLint wrapParm = GL_REPEAT;
|
||||
|
||||
switch (Value) {
|
||||
case D3DTADDRESS_WRAP: wrapParm = GL_REPEAT; break;
|
||||
case D3DTADDRESS_CLAMP: wrapParm = GL_CLAMP_TO_EDGE; break;
|
||||
case D3DTADDRESS_BORDER: wrapParm = GL_REPEAT; break; /* FIXME: Not right, but better */
|
||||
case D3DTADDRESS_BORDER:
|
||||
{
|
||||
if (GL_SUPPORT(ARB_TEXTURE_BORDER_CLAMP)) {
|
||||
wrapParm = GL_CLAMP_TO_BORDER_ARB;
|
||||
} else {
|
||||
/* FIXME: Not right, but better */
|
||||
FIXME("Unrecognized or unsupported D3DTADDRESS_* value %ld, state %d\n", Value, Type);
|
||||
wrapParm = GL_REPEAT;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case D3DTADDRESS_MIRROR:
|
||||
{
|
||||
#if defined(GL_VERSION_1_4)
|
||||
case D3DTADDRESS_MIRROR: wrapParm = GL_MIRRORED_REPEAT; break;
|
||||
wrapParm = GL_MIRRORED_REPEAT;
|
||||
#elif defined(GL_ARB_texture_mirrored_repeat)
|
||||
case D3DTADDRESS_MIRROR: wrapParm = GL_MIRRORED_REPEAT_ARB; break;
|
||||
wrapParm = GL_MIRRORED_REPEAT_ARB;
|
||||
#else
|
||||
case D3DTADDRESS_MIRROR: /* Unsupported in OpenGL pre-1.4 */
|
||||
/* Unsupported in OpenGL pre-1.4 */
|
||||
FIXME("Unrecognized or unsupported D3DTADDRESS_* value %ld, state %d\n", Value, Type);
|
||||
wrapParm = GL_REPEAT;
|
||||
#endif
|
||||
case D3DTADDRESS_MIRRORONCE: /* Unsupported in OpenGL */
|
||||
}
|
||||
break;
|
||||
case D3DTADDRESS_MIRRORONCE:
|
||||
{
|
||||
if (GL_SUPPORT(ATI_TEXTURE_MIRROR_ONCE)) {
|
||||
wrapParm = GL_MIRROR_CLAMP_TO_EDGE_ATI;
|
||||
} else {
|
||||
FIXME("Unrecognized or unsupported D3DTADDRESS_* value %ld, state %d\n", Value, Type);
|
||||
wrapParm = GL_REPEAT;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
FIXME("Unrecognized or unsupported D3DTADDRESS_* value %ld, state %d\n", Value, Type);
|
||||
wrapParm = GL_REPEAT;
|
||||
|
|
|
@ -769,14 +769,18 @@ static void IDirect3D8Impl_FillGLCaps(LPDIRECT3D8 iface, Display* display) {
|
|||
} else if (strcmp(ThisExtn, "GL_ARB_texture_compression") == 0) {
|
||||
FIXME(" FOUND: ARB Texture Compression support\n");
|
||||
This->gl_info.supported[ARB_TEXTURE_COMPRESSION] = TRUE;
|
||||
} else if (strcmp(ThisExtn, "GL_ARB_texture_env_add") == 0) {
|
||||
FIXME(" FOUND: ARB Texture Env Add support\n");
|
||||
This->gl_info.supported[ARB_TEXTURE_ENV_ADD] = TRUE;
|
||||
} else if (strcmp(ThisExtn, "GL_ARB_texture_env_combine") == 0) {
|
||||
FIXME(" FOUND: EXT Texture Env combine support\n");
|
||||
FIXME(" FOUND: ARB Texture Env combine support\n");
|
||||
This->gl_info.supported[ARB_TEXTURE_ENV_COMBINE] = TRUE;
|
||||
} else if (strcmp(ThisExtn, "GL_ARB_texture_env_dot3") == 0) {
|
||||
if (FALSE == This->gl_info.supported[ARB_TEXTURE_ENV_DOT3]) {
|
||||
FIXME(" FOUND: EXT Dot3 support\n");
|
||||
This->gl_info.supported[ARB_TEXTURE_ENV_DOT3] = TRUE;
|
||||
}
|
||||
FIXME(" FOUND: ARB Dot3 support\n");
|
||||
This->gl_info.supported[ARB_TEXTURE_ENV_DOT3] = TRUE;
|
||||
} else if (strcmp(ThisExtn, "GL_ARB_texture_border_clamp") == 0) {
|
||||
FIXME(" FOUND: ARB Texture border clamp support\n");
|
||||
This->gl_info.supported[ARB_TEXTURE_BORDER_CLAMP] = TRUE;
|
||||
} else if (strstr(ThisExtn, "GL_ARB_vertex_program")) {
|
||||
This->gl_info.vs_arb_version = VS_VERSION_11;
|
||||
FIXME(" FOUND: ARB Vertex Shader support - version=%02x\n", This->gl_info.vs_arb_version);
|
||||
|
@ -802,11 +806,15 @@ static void IDirect3D8Impl_FillGLCaps(LPDIRECT3D8 iface, Display* display) {
|
|||
FIXME(" FOUND: EXT Texture S3TC compression support\n");
|
||||
This->gl_info.supported[EXT_TEXTURE_COMPRESSION_S3TC] = TRUE;
|
||||
#endif
|
||||
} else if (strcmp(ThisExtn, "GL_EXT_texture_env_add") == 0) {
|
||||
FIXME(" FOUND: EXT Texture Env Add support\n");
|
||||
This->gl_info.supported[EXT_TEXTURE_ENV_ADD] = TRUE;
|
||||
} else if (strcmp(ThisExtn, "GL_EXT_texture_env_combine") == 0) {
|
||||
FIXME(" FOUND: EXT Texture Env combine support\n");
|
||||
This->gl_info.supported[EXT_TEXTURE_ENV_COMBINE] = TRUE;
|
||||
} else if (strcmp(ThisExtn, "GL_EXT_texture_env_dot3") == 0) {
|
||||
if (FALSE == This->gl_info.supported[ARB_TEXTURE_ENV_DOT3]) {
|
||||
FIXME(" FOUND: EXT Dot3 support\n");
|
||||
This->gl_info.supported[ARB_TEXTURE_ENV_DOT3] = TRUE;
|
||||
}
|
||||
FIXME(" FOUND: EXT Dot3 support\n");
|
||||
This->gl_info.supported[EXT_TEXTURE_ENV_DOT3] = TRUE;
|
||||
} else if (strcmp(ThisExtn, "GL_EXT_texture_filter_anisotropic") == 0) {
|
||||
FIXME(" FOUND: EXT Texture Anisotropic filter support\n");
|
||||
This->gl_info.supported[EXT_TEXTURE_FILTER_ANISOTROPIC] = TRUE;
|
||||
|
@ -823,6 +831,9 @@ static void IDirect3D8Impl_FillGLCaps(LPDIRECT3D8 iface, Display* display) {
|
|||
/**
|
||||
* NVIDIA
|
||||
*/
|
||||
} else if (strcmp(ThisExtn, "GL_NV_texture_env_combine4") == 0) {
|
||||
FIXME(" FOUND: NVIDIA (NV) Texture Env combine (4) support\n");
|
||||
This->gl_info.supported[NV_TEXTURE_ENV_COMBINE4] = TRUE;
|
||||
} else if (strstr(ThisExtn, "GL_NV_fragment_program")) {
|
||||
This->gl_info.ps_nv_version = PS_VERSION_11;
|
||||
FIXME(" FOUND: NVIDIA (NV) Pixel Shader support - version=%02x\n", This->gl_info.ps_nv_version);
|
||||
|
@ -837,6 +848,12 @@ static void IDirect3D8Impl_FillGLCaps(LPDIRECT3D8 iface, Display* display) {
|
|||
* ATI
|
||||
*/
|
||||
/** TODO */
|
||||
} else if (strcmp(ThisExtn, "GL_ATI_texture_env_combine3") == 0) {
|
||||
FIXME(" FOUND: ATI Texture Env combine (3) support\n");
|
||||
This->gl_info.supported[ATI_TEXTURE_ENV_COMBINE3] = TRUE;
|
||||
} else if (strcmp(ThisExtn, "GL_ATI_texture_mirror_once") == 0) {
|
||||
FIXME(" FOUND: ATI Texture Mirror Once support\n");
|
||||
This->gl_info.supported[ATI_TEXTURE_MIRROR_ONCE] = TRUE;
|
||||
} else if (strcmp(ThisExtn, "GL_EXT_vertex_shader") == 0) {
|
||||
This->gl_info.vs_ati_version = VS_VERSION_11;
|
||||
FIXME(" FOUND: ATI (EXT) Vertex Shader support - version=%02x\n", This->gl_info.vs_ati_version);
|
||||
|
|
|
@ -671,6 +671,7 @@ void GetSrcAndOpFromValue(DWORD iValue, BOOL isAlphaArg, GLenum* source, GLenum*
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/* Set texture operations up - The following avoids lots of ifdefs in this routine!*/
|
||||
#if defined (GL_VERSION_1_3)
|
||||
# define useext(A) A
|
||||
|
@ -964,8 +965,11 @@ void set_tex_op(LPDIRECT3DDEVICE8 iface, BOOL isAlpha, int Stage, D3DTEXTUREOP o
|
|||
break;
|
||||
case D3DTOP_DOTPRODUCT3:
|
||||
if (GL_SUPPORT(ARB_TEXTURE_ENV_DOT3)) {
|
||||
glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA);
|
||||
checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA");
|
||||
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");
|
||||
}
|
||||
|
@ -1003,297 +1007,293 @@ void set_tex_op(LPDIRECT3DDEVICE8 iface, BOOL isAlpha, int Stage, D3DTEXTUREOP o
|
|||
}
|
||||
|
||||
if (Handled) {
|
||||
BOOL combineOK = TRUE;
|
||||
#if defined(GL_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("Cant have COMBINE4 and COMBINE in efferct together, thisop=%d, otherop=%ld, isAlpha(%d)\n",
|
||||
op, op2, isAlpha);
|
||||
|
||||
LEAVE_GL();
|
||||
return;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (combineOK == TRUE) {
|
||||
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;
|
||||
}
|
||||
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("Cant have COMBINE4 and COMBINE in effect together, thisop=%d, otherop=%ld, isAlpha(%d)\n", op, op2, isAlpha);
|
||||
LEAVE_GL();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (combineOK == TRUE) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/* Other texture operations require special extensions: */
|
||||
#if defined(GL_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;
|
||||
}
|
||||
Handled = TRUE; /* Again, assume handled */
|
||||
switch (op) {
|
||||
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;
|
||||
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;
|
||||
}
|
||||
Handled = TRUE; /* Again, assume handled */
|
||||
switch (op) {
|
||||
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_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: opr1 = GL_ONE_MINUS_SRC_COLOR; break;
|
||||
case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_SRC_COLOR; break;
|
||||
case GL_SRC_ALPHA: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
|
||||
case GL_ONE_MINUS_SRC_ALPHA: opr1 = GL_SRC_ALPHA; break;
|
||||
}
|
||||
glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr1);
|
||||
checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
|
||||
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 (opr1) {
|
||||
case GL_SRC_COLOR: opr1 = GL_SRC_ALPHA; break;
|
||||
case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
|
||||
}
|
||||
glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr1);
|
||||
checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
|
||||
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: opr1 = GL_SRC_ALPHA; break;
|
||||
case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
|
||||
}
|
||||
glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);
|
||||
checkGLcall("GL_TEXTURE_ENV, opr2_target, opr1");
|
||||
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: opr1 = GL_SRC_ALPHA; break;
|
||||
case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
|
||||
}
|
||||
glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);
|
||||
checkGLcall("GL_TEXTURE_ENV, opr2_target, opr1");
|
||||
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_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: opr1 = GL_ONE_MINUS_SRC_COLOR; break;
|
||||
case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_SRC_COLOR; break;
|
||||
case GL_SRC_ALPHA: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
|
||||
case GL_ONE_MINUS_SRC_ALPHA: opr1 = GL_SRC_ALPHA; break;
|
||||
}
|
||||
glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr1);
|
||||
checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
|
||||
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 (opr1) {
|
||||
case GL_SRC_COLOR: opr1 = GL_SRC_ALPHA; break;
|
||||
case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
|
||||
}
|
||||
glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr1);
|
||||
checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
|
||||
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: opr1 = GL_SRC_ALPHA; break;
|
||||
case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
|
||||
}
|
||||
glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);
|
||||
checkGLcall("GL_TEXTURE_ENV, opr2_target, opr1");
|
||||
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: opr1 = GL_SRC_ALPHA; break;
|
||||
case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
|
||||
}
|
||||
glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);
|
||||
checkGLcall("GL_TEXTURE_ENV, opr2_target, opr1");
|
||||
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;
|
||||
|
||||
default:
|
||||
Handled = FALSE;
|
||||
}
|
||||
if (Handled) {
|
||||
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;
|
||||
}
|
||||
#endif /* GL_NV_texture_env_combine4 */
|
||||
|
||||
}
|
||||
} /* GL_NV_texture_env_combine4 */
|
||||
|
||||
LEAVE_GL();
|
||||
|
||||
/* After all the extensions, if still unhandled, report fixme */
|
||||
FIXME("Unhandled texture operation %d\n", op);
|
||||
|
||||
/* After all the extensions, if still unhandled, report fixme */
|
||||
FIXME("Unhandled texture operation %d\n", op);
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue