[PATCH] WineD3D: Implement secondary color in the arbfp ffp =

Stefan Doesinger stefan at codeweavers.com
Tue Aug 26 15:17:09 CDT 2008


pipeline=0A=
=0A=
---=0A=
 dlls/wined3d/arb_program_shader.c |   68 =
++++++++++++++++++++++++-------------=0A=
 1 files changed, 44 insertions(+), 24 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/arb_program_shader.c =
b/dlls/wined3d/arb_program_shader.c=0A=
index c96feec..335e54b 100644=0A=
--- a/dlls/wined3d/arb_program_shader.c=0A=
+++ b/dlls/wined3d/arb_program_shader.c=0A=
@@ -2221,10 +2221,11 @@ const shader_backend_t =
arb_program_shader_backend =3D {=0A=
 };=0A=
 =0A=
 /* ARB_fragment_program fixed function pipeline replacement definitions =
*/=0A=
-#define ARB_FFP_CONST_TFACTOR       0=0A=
-#define ARB_FFP_CONST_CONSTANT(i)   ((ARB_FFP_CONST_TFACTOR) + 1 + i)=0A=
-#define ARB_FFP_CONST_BUMPMAT(i)    ((ARB_FFP_CONST_CONSTANT(7)) + 1 + =
i)=0A=
-#define ARB_FFP_CONST_LUMINANCE(i)  ((ARB_FFP_CONST_BUMPMAT(7)) + 1 + i)=0A=
+#define ARB_FFP_CONST_TFACTOR           0=0A=
+#define ARB_FFP_CONST_SPECULAR_ENABLE   ((ARB_FFP_CONST_TFACTOR) + 1)=0A=
+#define ARB_FFP_CONST_CONSTANT(i)       =
((ARB_FFP_CONST_SPECULAR_ENABLE) + 1 + i)=0A=
+#define ARB_FFP_CONST_BUMPMAT(i)        ((ARB_FFP_CONST_CONSTANT(7)) + =
1 + i)=0A=
+#define ARB_FFP_CONST_LUMINANCE(i)      ((ARB_FFP_CONST_BUMPMAT(7)) + 1 =
+ i)=0A=
 =0A=
 struct arbfp_ffp_desc=0A=
 {=0A=
@@ -2340,6 +2341,31 @@ static void state_texfactor_arbfp(DWORD state, =
IWineD3DStateBlockImpl *statebloc=0A=
     }=0A=
 }=0A=
 =0A=
+static void state_arb_specularenable(DWORD state, =
IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {=0A=
+    float col[4];=0A=
+    IWineD3DDeviceImpl *device =3D stateblock->wineD3DDevice;=0A=
+=0A=
+    /* Do not overwrite pixel shader constants if a pshader is in use */=0A=
+    if(use_ps(device)) return;=0A=
+=0A=
+    if(stateblock->renderState[WINED3DRS_SPECULARENABLE]) {=0A=
+        /* The specular color has no alpha */=0A=
+        col[0] =3D 1.0; col[1] =3D 1.0;=0A=
+        col[2] =3D 1.0; col[3] =3D 0.0;=0A=
+    } else {=0A=
+        col[0] =3D 0.0; col[1] =3D 0.0;=0A=
+        col[2] =3D 0.0; col[3] =3D 0.0;=0A=
+    }=0A=
+    GL_EXTCALL(glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, =
ARB_FFP_CONST_SPECULAR_ENABLE, col));=0A=
+    checkGLcall("glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, =
ARB_FFP_CONST_SPECULAR_ENABLE, col)");=0A=
+=0A=
+    if(device->shader_backend =3D=3D &arb_program_shader_backend) {=0A=
+        device =3D stateblock->wineD3DDevice;=0A=
+        =
device->activeContext->pshader_const_dirty[ARB_FFP_CONST_SPECULAR_ENABLE]=
 =3D 1;=0A=
+        device->highest_dirty_ps_const =3D =
max(device->highest_dirty_ps_const, ARB_FFP_CONST_SPECULAR_ENABLE + 1);=0A=
+    }=0A=
+}=0A=
+=0A=
 static void set_bumpmat_arbfp(DWORD state, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
     DWORD stage =3D (state - STATE_TEXTURESTAGE(0, 0)) / =
WINED3D_HIGHEST_TEXTURE_STATE;=0A=
     IWineD3DDeviceImpl *device =3D stateblock->wineD3DDevice;=0A=
@@ -2474,7 +2500,7 @@ static const char *get_argreg(SHADER_BUFFER =
*buffer, DWORD argnum, unsigned int=0A=
     return ret;=0A=
 }=0A=
 =0A=
-static void gen_ffp_instr(SHADER_BUFFER *buffer, unsigned int stage, =
BOOL color, BOOL alpha, BOOL last,=0A=
+static void gen_ffp_instr(SHADER_BUFFER *buffer, unsigned int stage, =
BOOL color, BOOL alpha,=0A=
                           DWORD dst, DWORD op, DWORD dw_arg0, DWORD =
dw_arg1, DWORD dw_arg2) {=0A=
     const char *dstmask, *dstreg, *arg0, *arg1, *arg2;=0A=
     unsigned int mul =3D 1;=0A=
@@ -2484,9 +2510,7 @@ static void gen_ffp_instr(SHADER_BUFFER *buffer, =
unsigned int stage, BOOL color,=0A=
     else if(color) dstmask =3D ".rgb";=0A=
     else dstmask =3D ".a";=0A=
 =0A=
-    if(dst =3D=3D tempreg && last) FIXME("Last texture stage writes to =
D3DTA_TEMP\n");=0A=
     if(dst =3D=3D tempreg) dstreg =3D "tempreg";=0A=
-    else if(last) dstreg =3D "result.color";=0A=
     else dstreg =3D "ret";=0A=
 =0A=
     arg0 =3D get_argreg(buffer, 0, stage, dw_arg0);=0A=
@@ -2627,8 +2651,8 @@ static GLuint gen_arbfp_ffp_shader(struct =
ffp_settings *settings, IWineD3DStateB=0A=
     GLuint ret;=0A=
     DWORD arg0, arg1, arg2;=0A=
     BOOL tempreg_used =3D FALSE, tfactor_used =3D FALSE;=0A=
-    BOOL last =3D FALSE;=0A=
     BOOL op_equal;=0A=
+    const char *final_combiner_src =3D "ret";=0A=
 =0A=
     /* Find out which textures are read */=0A=
     for(stage =3D 0; stage < MAX_TEXTURES; stage++) {=0A=
@@ -2712,6 +2736,7 @@ static GLuint gen_arbfp_ffp_shader(struct =
ffp_settings *settings, IWineD3DStateB=0A=
     if(tfactor_used) {=0A=
         shader_addline(&buffer, "PARAM tfactor =3D program.env[%u];\n", =
ARB_FFP_CONST_TFACTOR);=0A=
     }=0A=
+        shader_addline(&buffer, "PARAM specular_enable =3D =
program.env[%u];\n", ARB_FFP_CONST_SPECULAR_ENABLE);=0A=
 =0A=
     if(settings->sRGB_write) {=0A=
         shader_addline(&buffer, "PARAM srgb_mul_low =3D {%f, %f, %f, =
1.0};\n",=0A=
@@ -2808,15 +2833,9 @@ static GLuint gen_arbfp_ffp_shader(struct =
ffp_settings *settings, IWineD3DStateB=0A=
     for(stage =3D 0; stage < MAX_TEXTURES; stage++) {=0A=
         if(settings->op[stage].cop =3D=3D WINED3DTOP_DISABLE) {=0A=
             if(stage =3D=3D 0) {=0A=
-                shader_addline(&buffer, "MOV result.color, =
fragment.color.primary;\n");=0A=
+                final_combiner_src =3D "fragment.color.primary";=0A=
             }=0A=
             break;=0A=
-        } else if(settings->sRGB_write) {=0A=
-            last =3D FALSE;=0A=
-        } else if(stage =3D=3D (MAX_TEXTURES - 1)) {=0A=
-            last =3D TRUE;=0A=
-        } else if(settings->op[stage + 1].cop =3D=3D =
WINED3DTOP_DISABLE) {=0A=
-            last =3D TRUE;=0A=
         }=0A=
 =0A=
         if(settings->op[stage].cop =3D=3D WINED3DTOP_SELECTARG1 &&=0A=
@@ -2839,33 +2858,32 @@ static GLuint gen_arbfp_ffp_shader(struct =
ffp_settings *settings, IWineD3DStateB=0A=
         }=0A=
 =0A=
         if(settings->op[stage].aop =3D=3D WINED3DTOP_DISABLE) {=0A=
-            gen_ffp_instr(&buffer, stage, TRUE, FALSE, last, =
settings->op[stage].dst,=0A=
+            gen_ffp_instr(&buffer, stage, TRUE, FALSE, =
settings->op[stage].dst,=0A=
                           settings->op[stage].cop, =
settings->op[stage].carg0,=0A=
                           settings->op[stage].carg1, =
settings->op[stage].carg2);=0A=
-            if(last && stage =3D=3D 0) {=0A=
-                shader_addline(&buffer, "MOV result.color.a, =
fragment.color.primary.a;\n");=0A=
-            } else if(last) {=0A=
-                shader_addline(&buffer, "MOV result.color.a, ret.a;\n");=0A=
-            } else if(stage =3D=3D 0) {=0A=
+            if(stage =3D=3D 0) {=0A=
                 shader_addline(&buffer, "MOV ret.a, =
fragment.color.primary.a;\n");=0A=
             }=0A=
         } else if(op_equal) {=0A=
-            gen_ffp_instr(&buffer, stage, TRUE, TRUE, last, =
settings->op[stage].dst,=0A=
+            gen_ffp_instr(&buffer, stage, TRUE, TRUE, =
settings->op[stage].dst,=0A=
                           settings->op[stage].cop, =
settings->op[stage].carg0,=0A=
                           settings->op[stage].carg1, =
settings->op[stage].carg2);=0A=
         } else {=0A=
-            gen_ffp_instr(&buffer, stage, TRUE, FALSE, last, =
settings->op[stage].dst,=0A=
+            gen_ffp_instr(&buffer, stage, TRUE, FALSE, =
settings->op[stage].dst,=0A=
                           settings->op[stage].cop, =
settings->op[stage].carg0,=0A=
                           settings->op[stage].carg1, =
settings->op[stage].carg2);=0A=
-            gen_ffp_instr(&buffer, stage, FALSE, TRUE, last, =
settings->op[stage].dst,=0A=
+            gen_ffp_instr(&buffer, stage, FALSE, TRUE, =
settings->op[stage].dst,=0A=
                           settings->op[stage].aop, =
settings->op[stage].aarg0,=0A=
                           settings->op[stage].aarg1, =
settings->op[stage].aarg2);=0A=
         }=0A=
     }=0A=
 =0A=
     if(settings->sRGB_write) {=0A=
+        shader_addline(&buffer, "MAD ret, fragment.color.secondary, =
specular_enable, %s;\n", final_combiner_src);=0A=
         arbfp_add_sRGB_correction(&buffer, "ret", "arg0", "arg1", =
"arg2", "tempreg");=0A=
         shader_addline(&buffer, "MOV result.color.a, ret.a;\n");=0A=
+    } else {=0A=
+        shader_addline(&buffer, "MAD result.color, =
fragment.color.secondary, specular_enable, %s;\n", final_combiner_src);=0A=
     }=0A=
 =0A=
     /* Footer */=0A=
@@ -2938,6 +2956,7 @@ static void fragment_prog_arbfp(DWORD state, =
IWineD3DStateBlockImpl *stateblock,=0A=
                 set_bumpmat_arbfp(STATE_TEXTURESTAGE(i, =
WINED3DTSS_BUMPENVMAT00), stateblock, context);=0A=
             }=0A=
             =
state_texfactor_arbfp(STATE_RENDER(WINED3DRS_TEXTUREFACTOR), stateblock, =
context);=0A=
+            =
state_arb_specularenable(STATE_RENDER(WINED3DRS_SPECULARENABLE), =
stateblock, context);=0A=
         }=0A=
     }=0A=
 =0A=
@@ -3125,6 +3144,7 @@ static const struct StateEntryTemplate =
arbfp_fragmentstate_template[] =3D {=0A=
     =
{STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTA=
GE(5, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform      }, 0          =
                     },=0A=
     =
{STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTA=
GE(6, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform      }, 0          =
                     },=0A=
     =
{STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTA=
GE(7, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform      }, 0          =
                     },=0A=
+    { STATE_RENDER(WINED3DRS_SPECULARENABLE),             { =
STATE_RENDER(WINED3DRS_SPECULARENABLE),             =
state_arb_specularenable}, 0                               },=0A=
     {0 /* Terminate */,                                   { 0,          =
                                        0                       }, 0     =
                          },=0A=
 };=0A=
 =0A=
-- =0A=
1.5.6.4=0A=
=0A=

------=_NextPart_000_0005_01C909E0.DBE17540--




More information about the wine-patches mailing list