[PATCH] WineD3D: Give nv* fixed function stuff its own state =

Stefan Doesinger stefan at codeweavers.com
Sat Jul 5 18:31:34 CDT 2008


template=0A=
=0A=
This gets us rid of a few more if(GL_SUPPORTED()) statements in the =
code, and simplifies the functions a bit. The=0A=
drawback is that the opengl ffp and nv* code has more relation than the =
atifs, so there is a little code duplication,=0A=
and in some cases the nv* code borrows some code form the opengl fixed =
function implementation.=0A=
=0A=
Currently the nvts and nvrc state templates are the same, the following =
patch will change that=0A=
---=0A=
 dlls/wined3d/nvidia_texture_shader.c |  374 =
+++++++++++++++++++++++++++++++++-=0A=
 dlls/wined3d/state.c                 |  117 +++--------=0A=
 dlls/wined3d/wined3d_private.h       |    4 +-=0A=
 3 files changed, 402 insertions(+), 93 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/nvidia_texture_shader.c =
b/dlls/wined3d/nvidia_texture_shader.c=0A=
index 5058ab4..0c2301c 100644=0A=
--- a/dlls/wined3d/nvidia_texture_shader.c=0A=
+++ b/dlls/wined3d/nvidia_texture_shader.c=0A=
@@ -28,6 +28,136 @@=0A=
 =0A=
 WINE_DEFAULT_DEBUG_CHANNEL(d3d);=0A=
 =0A=
+#define GLINFO_LOCATION stateblock->wineD3DDevice->adapter->gl_info=0A=
+static void nvrc_colorop(DWORD state, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
+    DWORD stage =3D (state - STATE_TEXTURESTAGE(0, 0)) / =
WINED3D_HIGHEST_TEXTURE_STATE;=0A=
+    DWORD mapped_stage =3D stateblock->wineD3DDevice->texUnitMap[stage];=0A=
+    BOOL tex_used =3D =
stateblock->wineD3DDevice->fixed_function_usage_map[stage];=0A=
+=0A=
+    TRACE("Setting color op for stage %d\n", stage);=0A=
+=0A=
+    if (stateblock->pixelShader && =
stateblock->wineD3DDevice->ps_selected_mode !=3D SHADER_NONE &&=0A=
+        ((IWineD3DPixelShaderImpl =
*)stateblock->pixelShader)->baseShader.function) {=0A=
+        /* Using a pixel shader? Don't care for anything here, the =
shader applying does it */=0A=
+        return;=0A=
+    }=0A=
+=0A=
+    if (stage !=3D mapped_stage) WARN("Using non 1:1 mapping: %d -> =
%d!\n", stage, mapped_stage);=0A=
+=0A=
+    if (mapped_stage !=3D -1) {=0A=
+        if (GL_SUPPORT(ARB_MULTITEXTURE)) {=0A=
+            if (tex_used && mapped_stage >=3D GL_LIMITS(textures)) {=0A=
+                FIXME("Attempt to enable unsupported stage!\n");=0A=
+                return;=0A=
+            }=0A=
+            GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + =
mapped_stage));=0A=
+            checkGLcall("glActiveTextureARB");=0A=
+        } else if (stage > 0) {=0A=
+            WARN("Program using multiple concurrent textures which this =
opengl implementation doesn't support\n");=0A=
+            return;=0A=
+        }=0A=
+    }=0A=
+=0A=
+    if(stateblock->lowest_disabled_stage > 0) {=0A=
+        glEnable(GL_REGISTER_COMBINERS_NV);=0A=
+        GL_EXTCALL(glCombinerParameteriNV(GL_NUM_GENERAL_COMBINERS_NV, =
stateblock->lowest_disabled_stage));=0A=
+    } else {=0A=
+        glDisable(GL_REGISTER_COMBINERS_NV);=0A=
+    }=0A=
+    if(stage >=3D stateblock->lowest_disabled_stage) {=0A=
+        TRACE("Stage disabled\n");=0A=
+        if (mapped_stage !=3D -1) {=0A=
+            /* Disable everything here */=0A=
+            glDisable(GL_TEXTURE_2D);=0A=
+            checkGLcall("glDisable(GL_TEXTURE_2D)");=0A=
+            glDisable(GL_TEXTURE_3D);=0A=
+            checkGLcall("glDisable(GL_TEXTURE_3D)");=0A=
+            if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
+                glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
+                checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
+            }=0A=
+            if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
+                glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
+                checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
+            }=0A=
+            if(GL_SUPPORT(NV_TEXTURE_SHADER2) && mapped_stage < =
GL_LIMITS(textures)) {=0A=
+                glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, =
GL_NONE);=0A=
+            }=0A=
+        }=0A=
+        /* All done */=0A=
+        return;=0A=
+    }=0A=
+=0A=
+    /* The sampler will also activate the correct texture dimensions, =
so no need to do it here=0A=
+     * if the sampler for this stage is dirty=0A=
+     */=0A=
+    if(!isStateDirty(context, STATE_SAMPLER(stage))) {=0A=
+        if (tex_used) texture_activate_dimensions(stage, stateblock, =
context);=0A=
+    }=0A=
+=0A=
+    /* Set the texture combiners */=0A=
+    set_tex_op_nvrc((IWineD3DDevice *)stateblock->wineD3DDevice, FALSE, =
stage,=0A=
+                        =
stateblock->textureState[stage][WINED3DTSS_COLOROP],=0A=
+                        =
stateblock->textureState[stage][WINED3DTSS_COLORARG1],=0A=
+                        =
stateblock->textureState[stage][WINED3DTSS_COLORARG2],=0A=
+                        =
stateblock->textureState[stage][WINED3DTSS_COLORARG0],=0A=
+                        mapped_stage,=0A=
+                        =
stateblock->textureState[stage][WINED3DTSS_RESULTARG]);=0A=
+=0A=
+    /* In register combiners bump mapping is done in the stage AFTER =
the one that has the bump map operation set,=0A=
+     * thus the texture shader may have to be updated=0A=
+     */=0A=
+    if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
+        BOOL usesBump =3D =
(stateblock->textureState[stage][WINED3DTSS_COLOROP] =3D=3D =
WINED3DTOP_BUMPENVMAPLUMINANCE ||=0A=
+                            =
stateblock->textureState[stage][WINED3DTSS_COLOROP] =3D=3D =
WINED3DTOP_BUMPENVMAP) ? TRUE : FALSE;=0A=
+        BOOL usedBump =3D (context->texShaderBumpMap & 1 << (stage + =
1)) ? TRUE : FALSE;=0A=
+        if(usesBump !=3D usedBump) {=0A=
+            GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + =
mapped_stage + 1));=0A=
+            checkGLcall("glActiveTextureARB");=0A=
+            texture_activate_dimensions(stage + 1, stateblock, context);=0A=
+            GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + =
mapped_stage));=0A=
+            checkGLcall("glActiveTextureARB");=0A=
+        }=0A=
+    }=0A=
+}=0A=
+=0A=
+static void nvts_bumpenvmat(DWORD state, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
+    DWORD stage =3D (state - STATE_TEXTURESTAGE(0, 0)) / =
WINED3D_HIGHEST_TEXTURE_STATE;=0A=
+    float mat[2][2];=0A=
+    if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
+        /* Direct3D sets the matrix in the stage reading the =
perturbation map. The result is used to=0A=
+         * offset the destination stage(always stage + 1 in d3d). In =
GL_NV_texture_shader, the bump=0A=
+         * map offsetting is done in the stage reading the bump mapped =
texture, and the perturbation=0A=
+         * map is read from a specified source stage(always stage - 1 =
for d3d). Thus set the matrix=0A=
+         * for stage + 1. Keep the nvrc tex unit mapping in mind too=0A=
+         */=0A=
+        DWORD mapped_stage =3D =
stateblock->wineD3DDevice->texUnitMap[stage + 1];=0A=
+=0A=
+        if(mapped_stage < GL_LIMITS(textures)) {=0A=
+            GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + =
mapped_stage));=0A=
+            checkGLcall("GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB =
+ mapped_stage))");=0A=
+=0A=
+            /* We can't just pass a pointer to the stateblock to GL due =
to the different matrix=0A=
+             * format(column major vs row major)=0A=
+             */=0A=
+            mat[0][0] =3D *((float *) =
&stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT00]);=0A=
+            mat[1][0] =3D *((float *) =
&stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT01]);=0A=
+            mat[0][1] =3D *((float *) =
&stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT10]);=0A=
+            mat[1][1] =3D *((float *) =
&stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT11]);=0A=
+            glTexEnvfv(GL_TEXTURE_SHADER_NV, =
GL_OFFSET_TEXTURE_MATRIX_NV, (float *) mat);=0A=
+            checkGLcall("glTexEnvfv(GL_TEXTURE_SHADER_NV, =
GL_OFFSET_TEXTURE_MATRIX_NV, mat)");=0A=
+        }=0A=
+    }=0A=
+}=0A=
+=0A=
+static void nvrc_texfactor(DWORD state, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
+    float col[4];=0A=
+    =
D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_TEXTUREFACTOR], =
col);=0A=
+    GL_EXTCALL(glCombinerParameterfvNV(GL_CONSTANT_COLOR0_NV, &col[0]));=0A=
+}=0A=
+=0A=
+#undef GLINFO_LOCATION=0A=
+=0A=
 #define GLINFO_LOCATION (*gl_info)=0A=
 static void nvrc_enable(IWineD3DDevice *iface, BOOL enable) { }=0A=
 =0A=
@@ -102,18 +232,258 @@ static void nvrc_fragment_free(IWineD3DDevice =
*iface) {}=0A=
  * are available(geforce 3 and newer), while nvrc_fragment_pipeline =
uses only the=0A=
  * register combiners extension(Pre-GF3).=0A=
  */=0A=
+=0A=
+const struct StateEntryTemplate nvts_fragmentstate_template[] =3D {=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP),          { =
STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1),        { =
STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2),        { =
STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP),          { =
STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1),        { =
STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2),        { =
STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00),     { =
STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01),     { =
STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10),     { =
STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11),     { =
STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0),        { =
STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0),        { =
STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG),        { =
STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP),          { =
STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1),        { =
STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2),        { =
STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP),          { =
STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1),        { =
STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2),        { =
STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00),     { =
STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01),     { =
STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10),     { =
STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11),     { =
STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0),        { =
STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0),        { =
STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG),        { =
STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP),          { =
STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1),        { =
STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2),        { =
STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP),          { =
STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1),        { =
STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2),        { =
STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00),     { =
STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01),     { =
STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10),     { =
STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11),     { =
STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0),        { =
STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0),        { =
STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG),        { =
STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP),          { =
STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1),        { =
STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2),        { =
STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP),          { =
STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1),        { =
STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2),        { =
STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00),     { =
STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01),     { =
STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10),     { =
STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11),     { =
STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0),        { =
STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0),        { =
STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG),        { =
STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP),          { =
STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1),        { =
STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2),        { =
STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP),          { =
STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1),        { =
STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2),        { =
STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00),     { =
STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01),     { =
STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10),     { =
STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11),     { =
STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0),        { =
STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0),        { =
STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG),        { =
STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP),          { =
STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1),        { =
STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2),        { =
STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP),          { =
STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1),        { =
STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2),        { =
STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00),     { =
STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01),     { =
STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10),     { =
STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11),     { =
STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0),        { =
STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0),        { =
STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG),        { =
STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP),          { =
STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1),        { =
STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2),        { =
STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP),          { =
STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1),        { =
STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2),        { =
STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00),     { =
STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01),     { =
STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10),     { =
STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11),     { =
STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0),        { =
STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0),        { =
STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG),        { =
STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP),          { =
STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1),        { =
STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2),        { =
STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP),          { =
STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1),        { =
STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2),        { =
STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00),     { =
STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01),     { =
STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10),     { =
STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11),     { =
STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0),        { =
STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0),        { =
STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG),        { =
STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_PIXELSHADER,                                  { =
STATE_PIXELSHADER,                                  apply_pixelshader   =
}},=0A=
+    { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE),            { =
STATE_PIXELSHADER,                                  apply_pixelshader   =
}},=0A=
+    { STATE_RENDER(WINED3DRS_TEXTUREFACTOR),              { =
STATE_RENDER(WINED3DRS_TEXTUREFACTOR),              nvrc_texfactor      =
}},=0A=
+    { STATE_SAMPLER(0),                                   { =
STATE_SAMPLER(0),                                   sampler_texdim      =
}},=0A=
+    { STATE_SAMPLER(1),                                   { =
STATE_SAMPLER(1),                                   sampler_texdim      =
}},=0A=
+    { STATE_SAMPLER(2),                                   { =
STATE_SAMPLER(2),                                   sampler_texdim      =
}},=0A=
+    { STATE_SAMPLER(3),                                   { =
STATE_SAMPLER(3),                                   sampler_texdim      =
}},=0A=
+    { STATE_SAMPLER(4),                                   { =
STATE_SAMPLER(4),                                   sampler_texdim      =
}},=0A=
+    { STATE_SAMPLER(5),                                   { =
STATE_SAMPLER(5),                                   sampler_texdim      =
}},=0A=
+    { STATE_SAMPLER(6),                                   { =
STATE_SAMPLER(6),                                   sampler_texdim      =
}},=0A=
+    { STATE_SAMPLER(7),                                   { =
STATE_SAMPLER(7),                                   sampler_texdim      =
}},=0A=
+    {0 /* Terminate */,                                   { 0,          =
                                        0                   }},=0A=
+};=0A=
+=0A=
 const struct fragment_pipeline nvts_fragment_pipeline =3D {=0A=
     nvts_enable,=0A=
     nvrc_fragment_get_caps,=0A=
     nvrc_fragment_alloc,=0A=
     nvrc_fragment_free,=0A=
-    ffp_fragmentstate_template=0A=
+    nvts_fragmentstate_template=0A=
+};=0A=
+=0A=
+const struct StateEntryTemplate nvrc_fragmentstate_template[] =3D {=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP),          { =
STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1),        { =
STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2),        { =
STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP),          { =
STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1),        { =
STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2),        { =
STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00),     { =
STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01),     { =
STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10),     { =
STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11),     { =
STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0),        { =
STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0),        { =
STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG),        { =
STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP),          { =
STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1),        { =
STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2),        { =
STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP),          { =
STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1),        { =
STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2),        { =
STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00),     { =
STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01),     { =
STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10),     { =
STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11),     { =
STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0),        { =
STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0),        { =
STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG),        { =
STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP),          { =
STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1),        { =
STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2),        { =
STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP),          { =
STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1),        { =
STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2),        { =
STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00),     { =
STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01),     { =
STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10),     { =
STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11),     { =
STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0),        { =
STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0),        { =
STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG),        { =
STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP),          { =
STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1),        { =
STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2),        { =
STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP),          { =
STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1),        { =
STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2),        { =
STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00),     { =
STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01),     { =
STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10),     { =
STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11),     { =
STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0),        { =
STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0),        { =
STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG),        { =
STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP),          { =
STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1),        { =
STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2),        { =
STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP),          { =
STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1),        { =
STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2),        { =
STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00),     { =
STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01),     { =
STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10),     { =
STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11),     { =
STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0),        { =
STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0),        { =
STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG),        { =
STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP),          { =
STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1),        { =
STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2),        { =
STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP),          { =
STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1),        { =
STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2),        { =
STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00),     { =
STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01),     { =
STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10),     { =
STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11),     { =
STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0),        { =
STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0),        { =
STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG),        { =
STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP),          { =
STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1),        { =
STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2),        { =
STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP),          { =
STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1),        { =
STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2),        { =
STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00),     { =
STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01),     { =
STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10),     { =
STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11),     { =
STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0),        { =
STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0),        { =
STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG),        { =
STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP),          { =
STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1),        { =
STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2),        { =
STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP),          { =
STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1),        { =
STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2),        { =
STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00),     { =
STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01),     { =
STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10),     { =
STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11),     { =
STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00),     nvts_bumpenvmat     =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0),        { =
STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0),        { =
STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
+    { STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG),        { =
STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP),          nvrc_colorop        =
}},=0A=
+    { STATE_PIXELSHADER,                                  { =
STATE_PIXELSHADER,                                  apply_pixelshader   =
}},=0A=
+    { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE),            { =
STATE_PIXELSHADER,                                  apply_pixelshader   =
}},=0A=
+    { STATE_RENDER(WINED3DRS_TEXTUREFACTOR),              { =
STATE_RENDER(WINED3DRS_TEXTUREFACTOR),              nvrc_texfactor      =
}},=0A=
+    { STATE_SAMPLER(0),                                   { =
STATE_SAMPLER(0),                                   sampler_texdim      =
}},=0A=
+    { STATE_SAMPLER(1),                                   { =
STATE_SAMPLER(1),                                   sampler_texdim      =
}},=0A=
+    { STATE_SAMPLER(2),                                   { =
STATE_SAMPLER(2),                                   sampler_texdim      =
}},=0A=
+    { STATE_SAMPLER(3),                                   { =
STATE_SAMPLER(3),                                   sampler_texdim      =
}},=0A=
+    { STATE_SAMPLER(4),                                   { =
STATE_SAMPLER(4),                                   sampler_texdim      =
}},=0A=
+    { STATE_SAMPLER(5),                                   { =
STATE_SAMPLER(5),                                   sampler_texdim      =
}},=0A=
+    { STATE_SAMPLER(6),                                   { =
STATE_SAMPLER(6),                                   sampler_texdim      =
}},=0A=
+    { STATE_SAMPLER(7),                                   { =
STATE_SAMPLER(7),                                   sampler_texdim      =
}},=0A=
+    {0 /* Terminate */,                                   { 0,          =
                                        0                   }},=0A=
 };=0A=
 =0A=
+=0A=
 const struct fragment_pipeline nvrc_fragment_pipeline =3D {=0A=
     nvrc_enable,=0A=
     nvrc_fragment_get_caps,=0A=
     nvrc_fragment_alloc,=0A=
     nvrc_fragment_free,=0A=
-    ffp_fragmentstate_template=0A=
+    nvrc_fragmentstate_template=0A=
 };=0A=
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c=0A=
index aad117a..d86fb6e 100644=0A=
--- a/dlls/wined3d/state.c=0A=
+++ b/dlls/wined3d/state.c=0A=
@@ -749,24 +749,20 @@ static void state_texfactor(DWORD state, =
IWineD3DStateBlockImpl *stateblock, Win=0A=
     float col[4];=0A=
     =
D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_TEXTUREFACTOR], =
col);=0A=
 =0A=
-    if (!GL_SUPPORT(NV_REGISTER_COMBINERS)) {=0A=
-        /* And now the default texture color as well */=0A=
-        for (i =3D 0; i < GL_LIMITS(texture_stages); i++) {=0A=
-            /* Note the WINED3DRS value applies to all textures, but GL =
has one=0A=
-             * per texture, so apply it now ready to be used!=0A=
-             */=0A=
-            if (GL_SUPPORT(ARB_MULTITEXTURE)) {=0A=
-                GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + i));=0A=
-                checkGLcall("glActiveTextureARB");=0A=
-            } else if (i>0) {=0A=
-                FIXME("Program using multiple concurrent textures which =
this opengl implementation doesn't support\n");=0A=
-            }=0A=
-=0A=
-            glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &col[0]);=0A=
-            checkGLcall("glTexEnvfv(GL_TEXTURE_ENV, =
GL_TEXTURE_ENV_COLOR, color);");=0A=
+    /* And now the default texture color as well */=0A=
+    for (i =3D 0; i < GL_LIMITS(texture_stages); i++) {=0A=
+        /* Note the WINED3DRS value applies to all textures, but GL has =
one=0A=
+            * per texture, so apply it now ready to be used!=0A=
+            */=0A=
+        if (GL_SUPPORT(ARB_MULTITEXTURE)) {=0A=
+            GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + i));=0A=
+            checkGLcall("glActiveTextureARB");=0A=
+        } else if (i>0) {=0A=
+            FIXME("Program using multiple concurrent textures which =
this opengl implementation doesn't support\n");=0A=
         }=0A=
-    } else {=0A=
-        GL_EXTCALL(glCombinerParameterfvNV(GL_CONSTANT_COLOR0_NV, =
&col[0]));=0A=
+=0A=
+        glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &col[0]);=0A=
+        checkGLcall("glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, =
color);");=0A=
     }=0A=
 }=0A=
 =0A=
@@ -1836,14 +1832,6 @@ static void tex_colorop(DWORD state, =
IWineD3DStateBlockImpl *stateblock, WineD3D=0A=
         }=0A=
     }=0A=
 =0A=
-    if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {=0A=
-        if(stateblock->lowest_disabled_stage > 0) {=0A=
-            glEnable(GL_REGISTER_COMBINERS_NV);=0A=
-            =
GL_EXTCALL(glCombinerParameteriNV(GL_NUM_GENERAL_COMBINERS_NV, =
stateblock->lowest_disabled_stage));=0A=
-        } else {=0A=
-            glDisable(GL_REGISTER_COMBINERS_NV);=0A=
-        }=0A=
-    }=0A=
     if(stage >=3D stateblock->lowest_disabled_stage) {=0A=
         TRACE("Stage disabled\n");=0A=
         if (mapped_stage !=3D -1) {=0A=
@@ -1860,9 +1848,6 @@ static void tex_colorop(DWORD state, =
IWineD3DStateBlockImpl *stateblock, WineD3D=0A=
                 glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
                 checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
             }=0A=
-            if(GL_SUPPORT(NV_TEXTURE_SHADER2) && mapped_stage < =
GL_LIMITS(textures)) {=0A=
-                glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, =
GL_NONE);=0A=
-            }=0A=
         }=0A=
         /* All done */=0A=
         return;=0A=
@@ -1875,41 +1860,14 @@ static void tex_colorop(DWORD state, =
IWineD3DStateBlockImpl *stateblock, WineD3D=0A=
         if (tex_used) texture_activate_dimensions(stage, stateblock, =
context);=0A=
     }=0A=
 =0A=
-    /* Set the texture combiners */=0A=
-    if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {=0A=
-        set_tex_op_nvrc((IWineD3DDevice *)stateblock->wineD3DDevice, =
FALSE, stage,=0A=
-                         =
stateblock->textureState[stage][WINED3DTSS_COLOROP],=0A=
-                         =
stateblock->textureState[stage][WINED3DTSS_COLORARG1],=0A=
-                         =
stateblock->textureState[stage][WINED3DTSS_COLORARG2],=0A=
-                         =
stateblock->textureState[stage][WINED3DTSS_COLORARG0],=0A=
-                         mapped_stage,=0A=
-                         =
stateblock->textureState[stage][WINED3DTSS_RESULTARG]);=0A=
-=0A=
-        /* In register combiners bump mapping is done in the stage =
AFTER the one that has the bump map operation set,=0A=
-         * thus the texture shader may have to be updated=0A=
-         */=0A=
-        if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
-            BOOL usesBump =3D =
(stateblock->textureState[stage][WINED3DTSS_COLOROP] =3D=3D =
WINED3DTOP_BUMPENVMAPLUMINANCE ||=0A=
-                             =
stateblock->textureState[stage][WINED3DTSS_COLOROP] =3D=3D =
WINED3DTOP_BUMPENVMAP) ? TRUE : FALSE;=0A=
-            BOOL usedBump =3D (context->texShaderBumpMap & 1 << (stage =
+ 1)) ? TRUE : FALSE;=0A=
-            if(usesBump !=3D usedBump) {=0A=
-                GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + =
mapped_stage + 1));=0A=
-                checkGLcall("glActiveTextureARB");=0A=
-                texture_activate_dimensions(stage + 1, stateblock, =
context);=0A=
-                GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + =
mapped_stage));=0A=
-                checkGLcall("glActiveTextureARB");=0A=
-            }=0A=
-        }=0A=
-    } else {=0A=
-        set_tex_op((IWineD3DDevice *)stateblock->wineD3DDevice, FALSE, =
stage,=0A=
-                    stateblock->textureState[stage][WINED3DTSS_COLOROP],=0A=
-                    =
stateblock->textureState[stage][WINED3DTSS_COLORARG1],=0A=
-                    =
stateblock->textureState[stage][WINED3DTSS_COLORARG2],=0A=
-                    =
stateblock->textureState[stage][WINED3DTSS_COLORARG0]);=0A=
-    }=0A=
+    set_tex_op((IWineD3DDevice *)stateblock->wineD3DDevice, FALSE, =
stage,=0A=
+                stateblock->textureState[stage][WINED3DTSS_COLOROP],=0A=
+                stateblock->textureState[stage][WINED3DTSS_COLORARG1],=0A=
+                stateblock->textureState[stage][WINED3DTSS_COLORARG2],=0A=
+                stateblock->textureState[stage][WINED3DTSS_COLORARG0]);=0A=
 }=0A=
 =0A=
-static void tex_alphaop(DWORD state, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
+void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, =
WineD3DContext *context) {=0A=
     DWORD stage =3D (state - STATE_TEXTURESTAGE(0, 0)) / =
WINED3D_HIGHEST_TEXTURE_STATE;=0A=
     DWORD mapped_stage =3D stateblock->wineD3DDevice->texUnitMap[stage];=0A=
     BOOL tex_used =3D =
stateblock->wineD3DDevice->fixed_function_usage_map[stage];=0A=
@@ -1985,6 +1943,9 @@ static void tex_alphaop(DWORD state, =
IWineD3DStateBlockImpl *stateblock, WineD3D=0A=
         }=0A=
     }=0A=
 =0A=
+    /* tex_alphaop is shared between the ffp and nvrc because the =
difference only comes down to=0A=
+     * this if block here, and the other code(color keying, texture =
unit selection) are the same=0A=
+     */=0A=
     TRACE("Setting alpha op for stage %d\n", stage);=0A=
     if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {=0A=
         set_tex_op_nvrc((IWineD3DDevice *)stateblock->wineD3DDevice, =
TRUE, stage,=0A=
@@ -2452,7 +2413,7 @@ static void sampler(DWORD state, =
IWineD3DStateBlockImpl *stateblock, WineD3DCont=0A=
     }=0A=
 }=0A=
 =0A=
-static void pixelshader(DWORD state, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
+void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, =
WineD3DContext *context) {=0A=
     IWineD3DDeviceImpl *device =3D stateblock->wineD3DDevice;=0A=
     BOOL use_pshader =3D use_ps(device);=0A=
     BOOL use_vshader =3D use_vs(device);=0A=
@@ -2485,7 +2446,8 @@ static void pixelshader(DWORD state, =
IWineD3DStateBlockImpl *stateblock, WineD3D=0A=
          */=0A=
         for(i=3D0; i < MAX_TEXTURES; i++) {=0A=
             if(!isStateDirty(context, STATE_TEXTURESTAGE(i, =
WINED3DTSS_COLOROP))) {=0A=
-                tex_colorop(STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP), =
stateblock, context);=0A=
+                device->StateTable[STATE_TEXTURESTAGE(i, =
WINED3DTSS_COLOROP)].apply=0A=
+                        (STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP), =
stateblock, context);=0A=
             }=0A=
         }=0A=
         if(context->last_was_pshader)=0A=
@@ -2536,29 +2498,6 @@ static void tex_bumpenvmat(DWORD state, =
IWineD3DStateBlockImpl *stateblock, Wine=0A=
         mat[1][1] =3D *((float *) =
&stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT11]);=0A=
         GL_EXTCALL(glTexBumpParameterfvATI(GL_BUMP_ROT_MATRIX_ATI, =
(float *) mat));=0A=
         checkGLcall("glTexBumpParameterfvATI");=0A=
-    } else if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
-        /* Direct3D sets the matrix in the stage reading the =
perturbation map. The result is used to=0A=
-         * offset the destination stage(always stage + 1 in d3d). In =
GL_NV_texture_shader, the bump=0A=
-         * map offsetting is done in the stage reading the bump mapped =
texture, and the perturbation=0A=
-         * map is read from a specified source stage(always stage - 1 =
for d3d). Thus set the matrix=0A=
-         * for stage + 1. Keep the nvrc tex unit mapping in mind too=0A=
-         */=0A=
-        DWORD mapped_stage =3D =
stateblock->wineD3DDevice->texUnitMap[stage + 1];=0A=
-=0A=
-        if(mapped_stage < GL_LIMITS(textures)) {=0A=
-            GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + =
mapped_stage));=0A=
-            checkGLcall("GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB =
+ mapped_stage))");=0A=
-=0A=
-            /* We can't just pass a pointer to the stateblock to GL due =
to the different matrix=0A=
-             * format(column major vs row major)=0A=
-             */=0A=
-            mat[0][0] =3D *((float *) =
&stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT00]);=0A=
-            mat[1][0] =3D *((float *) =
&stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT01]);=0A=
-            mat[0][1] =3D *((float *) =
&stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT10]);=0A=
-            mat[1][1] =3D *((float *) =
&stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT11]);=0A=
-            glTexEnvfv(GL_TEXTURE_SHADER_NV, =
GL_OFFSET_TEXTURE_MATRIX_NV, (float *) mat);=0A=
-            checkGLcall("glTexEnvfv(GL_TEXTURE_SHADER_NV, =
GL_OFFSET_TEXTURE_MATRIX_NV, mat)");=0A=
-        }=0A=
     }=0A=
 }=0A=
 =0A=
@@ -4370,7 +4309,7 @@ const struct StateEntryTemplate =
ffp_vertexstate_template[] =3D {=0A=
     {0 /* Terminate */,                                   { 0,          =
                                        0                   }},=0A=
 };=0A=
 =0A=
-const struct StateEntryTemplate ffp_fragmentstate_template[] =3D {=0A=
+static const struct StateEntryTemplate ffp_fragmentstate_template[] =3D =
{=0A=
     { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP),          { =
STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP),          tex_colorop         =
}},=0A=
     { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1),        { =
STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP),          tex_colorop         =
}},=0A=
     { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2),        { =
STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP),          tex_colorop         =
}},=0A=
@@ -4483,8 +4422,8 @@ const struct StateEntryTemplate =
ffp_fragmentstate_template[] =3D {=0A=
     { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0),        { =
STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP),          tex_alphaop         =
}},=0A=
     { STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG),        { =
STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP),          tex_colorop         =
}},=0A=
     { STATE_TEXTURESTAGE(7, WINED3DTSS_CONSTANT),         { 0 /* As =
long as we don't support D3DTA_CONSTANT */, state_nogl          }},=0A=
-    { STATE_PIXELSHADER,                                  { =
STATE_PIXELSHADER,                                  pixelshader         =
}},=0A=
-    { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE),            { =
STATE_PIXELSHADER,                                  pixelshader         =
}},=0A=
+    { STATE_PIXELSHADER,                                  { =
STATE_PIXELSHADER,                                  apply_pixelshader   =
}},=0A=
+    { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE),            { =
STATE_PIXELSHADER,                                  apply_pixelshader   =
}},=0A=
     { STATE_RENDER(WINED3DRS_BORDERCOLOR),                { =
STATE_RENDER(WINED3DRS_BORDERCOLOR),                state_bordercolor   =
}},=0A=
     { STATE_RENDER(WINED3DRS_TEXTUREFACTOR),              { =
STATE_RENDER(WINED3DRS_TEXTUREFACTOR),              state_texfactor     =
}},=0A=
     { STATE_SAMPLER(0),                                   { =
STATE_SAMPLER(0),                                   sampler_texdim      =
}},=0A=
diff --git a/dlls/wined3d/wined3d_private.h =
b/dlls/wined3d/wined3d_private.h=0A=
index 05952d7..874f972 100644=0A=
--- a/dlls/wined3d/wined3d_private.h=0A=
+++ b/dlls/wined3d/wined3d_private.h=0A=
@@ -563,8 +563,6 @@ extern const struct fragment_pipeline =
atifs_fragment_pipeline;=0A=
 extern const struct fragment_pipeline nvts_fragment_pipeline;=0A=
 extern const struct fragment_pipeline nvrc_fragment_pipeline;=0A=
 =0A=
-extern const struct StateEntryTemplate ffp_fragmentstate_template[]; /* =
temporary */=0A=
-=0A=
 /* "Base" state table */=0A=
 void compile_state_table(struct StateEntry *StateTable,=0A=
                          APPLYSTATEFUNC **dev_multistate_funcs,=0A=
@@ -1738,6 +1736,8 @@ void   set_tex_op_nvrc(IWineD3DDevice *iface, BOOL =
is_alpha, int stage, WINED3DT=0A=
 void   set_texture_matrix(const float *smat, DWORD flags, BOOL =
calculatedCoords, BOOL transformed, DWORD coordtype);=0A=
 void texture_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context);=0A=
 void sampler_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, =
WineD3DContext *context);=0A=
+void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, =
WineD3DContext *context);=0A=
+void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, =
WineD3DContext *context);=0A=
 =0A=
 void surface_set_compatible_renderbuffer(IWineD3DSurface *iface, =
unsigned int width, unsigned int height);=0A=
 GLenum surface_get_gl_buffer(IWineD3DSurface *iface, IWineD3DSwapChain =
*swapchain);=0A=
-- =0A=
1.5.4.5=0A=
=0A=

------=_NextPart_000_0015_01C8E33C.73290470--




More information about the wine-patches mailing list