Module: wine
Branch: master
Commit: 709025954504b5b3a74cd659ab868832b1a62820
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=709025954504b5b3a74cd65…
Author: H. Verbeet <hverbeet(a)gmail.com>
Date: Wed Jul 12 00:44:15 2006 +0200
wined3d: Fix specular color handling for register combiners.
By default the FinalCombiner is setup to add the specular color to the
final result of the combiner operations. However, it should only do
this when the WINED3DRS_SPECULARENABLE renderstate is enabled.
---
dlls/wined3d/device.c | 30 ++++++++++++++++++++++++++++++
include/wine/wined3d_gl.h | 1 +
2 files changed, 31 insertions(+), 0 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 45dd144..082f92b 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -3842,6 +3842,26 @@ static HRESULT WINAPI IWineD3DDeviceImpl
NOTE: If not supported don't give FIXMEs the impact is really minimal and very few people are
running 1.4 yet!
*/
+ /*
+ * If register combiners are enabled, enabling / disabling GL_COLOR_SUM has no effect.
+ * Instead, we need to setup the FinalCombiner properly.
+ *
+ * The default setup for the FinalCombiner is:
+ *
+ * <variable> <input> <mapping> <usage>
+ * GL_VARIABLE_A_NV GL_FOG, GL_UNSIGNED_IDENTITY_NV GL_ALPHA
+ * GL_VARIABLE_B_NV GL_SPARE0_PLUS_SECONDARY_COLOR_NV GL_UNSIGNED_IDENTITY_NV GL_RGB
+ * GL_VARIABLE_C_NV GL_FOG GL_UNSIGNED_IDENTITY_NV GL_RGB
+ * GL_VARIABLE_D_NV GL_ZERO GL_UNSIGNED_IDENTITY_NV GL_RGB
+ * GL_VARIABLE_E_NV GL_ZERO GL_UNSIGNED_IDENTITY_NV GL_RGB
+ * GL_VARIABLE_F_NV GL_ZERO GL_UNSIGNED_IDENTITY_NV GL_RGB
+ * GL_VARIABLE_G_NV GL_SPARE0_NV GL_UNSIGNED_IDENTITY_NV GL_ALPHA
+ *
+ * That's pretty much fine as it is, except for variable B, which needs to take
+ * either GL_SPARE0_PLUS_SECONDARY_COLOR_NV or GL_SPARE0_NV, depending on
+ * whether WINED3DRS_SPECULARENABLE is enabled or not.
+ */
+
if (Value) {
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float*) &This->updateStateBlock->material.Specular);
checkGLcall("glMaterialfv");
@@ -3851,6 +3871,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl
TRACE("Specular colors cannot be enabled in this version of opengl\n");
}
checkGLcall("glEnable(GL_COLOR_SUM)");
+
+ if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {
+ GL_EXTCALL(glFinalCombinerInputNV(GL_VARIABLE_B_NV, GL_SPARE0_PLUS_SECONDARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB));
+ checkGLcall("glFinalCombinerInputNV()");
+ }
} else {
float black[4] = {0.0f, 0.0f, 0.0f, 0.0f};
@@ -3865,6 +3890,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl
TRACE("Specular colors cannot be disabled in this version of opengl\n");
}
checkGLcall("glDisable(GL_COLOR_SUM)");
+
+ if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {
+ GL_EXTCALL(glFinalCombinerInputNV(GL_VARIABLE_B_NV, GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB));
+ checkGLcall("glFinalCombinerInputNV()");
+ }
}
}
break;
diff --git a/include/wine/wined3d_gl.h b/include/wine/wined3d_gl.h
index 038cbaf..c8d9402 100644
--- a/include/wine/wined3d_gl.h
+++ b/include/wine/wined3d_gl.h
@@ -1537,6 +1537,7 @@ #define GL_EXT_FUNCS_GEN \
USE_GL_FUNC(PGLFNCOMBINERPARAMETERFVNVPROC, glCombinerParameterfvNV); \
USE_GL_FUNC(PGLFNCOMBINERPARAMETERINVPROC, glCombinerParameteriNV); \
USE_GL_FUNC(PGLFNCOMBINERPARAMETERIVNVPROC, glCombinerParameterivNV); \
+ USE_GL_FUNC(PGLFNFINALCOMBINERINPUTNVPROC, glFinalCombinerInputNV); \
/* OpenGL 2.0 functions */
#define GL2_FUNCS_GEN \