[PATCH] WineD3D: Make the alphaop =3D=3D colorop matching a bit =

unknown (none) stefan at .
Mon Aug 18 16:50:04 CDT 2008


smarter=0A=
=0A=
I had a generated shader that made my eyes hurt because cop =3D =
selectarg1 and=0A=
aop =3D selectarg2 and colorarg1 =3D=3D colorarg2. This logic sees that =
this can=0A=
be handled in 1 instruction now and doesn't generate two instructions any=0A=
longer.=0A=
---=0A=
 dlls/wined3d/arb_program_shader.c |   25 +++++++++++++++++++++----=0A=
 1 files changed, 21 insertions(+), 4 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/arb_program_shader.c =
b/dlls/wined3d/arb_program_shader.c=0A=
index 99cc130..eb3eed8 100644=0A=
--- a/dlls/wined3d/arb_program_shader.c=0A=
+++ b/dlls/wined3d/arb_program_shader.c=0A=
@@ -2627,6 +2627,7 @@ static GLuint gen_arbfp_ffp_shader(struct =
ffp_settings *settings, IWineD3DStateB=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=
 =0A=
     /* Find out which textures are read */=0A=
     for(stage =3D 0; stage < MAX_TEXTURES; stage++) {=0A=
@@ -2806,6 +2807,25 @@ static GLuint gen_arbfp_ffp_shader(struct =
ffp_settings *settings, IWineD3DStateB=0A=
             last =3D TRUE;=0A=
         }=0A=
 =0A=
+        if(settings->op[stage].cop =3D=3D WINED3DTOP_SELECTARG1 &&=0A=
+           settings->op[stage].aop =3D=3D WINED3DTOP_SELECTARG1) {=0A=
+            op_equal =3D settings->op[stage].carg1 =3D=3D =
settings->op[stage].aarg1;=0A=
+        } else if(settings->op[stage].cop =3D=3D WINED3DTOP_SELECTARG1 =
&&=0A=
+                  settings->op[stage].aop =3D=3D WINED3DTOP_SELECTARG2) =
{=0A=
+            op_equal =3D settings->op[stage].carg1 =3D=3D =
settings->op[stage].aarg2;=0A=
+        } else if(settings->op[stage].cop =3D=3D WINED3DTOP_SELECTARG2 =
&&=0A=
+                  settings->op[stage].aop =3D=3D WINED3DTOP_SELECTARG1) =
{=0A=
+            op_equal =3D settings->op[stage].carg2 =3D=3D =
settings->op[stage].aarg1;=0A=
+        } else if(settings->op[stage].cop =3D=3D WINED3DTOP_SELECTARG2 =
&&=0A=
+                  settings->op[stage].aop =3D=3D WINED3DTOP_SELECTARG2) =
{=0A=
+            op_equal =3D settings->op[stage].carg2 =3D=3D =
settings->op[stage].aarg2;=0A=
+        } else {=0A=
+            op_equal =3D settings->op[stage].aop   =3D=3D =
settings->op[stage].cop &&=0A=
+                       settings->op[stage].carg0 =3D=3D =
settings->op[stage].aarg0 &&=0A=
+                       settings->op[stage].carg1 =3D=3D =
settings->op[stage].aarg1 &&=0A=
+                       settings->op[stage].carg2 =3D=3D =
settings->op[stage].aarg2;=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=
                           settings->op[stage].cop, =
settings->op[stage].carg0,=0A=
@@ -2817,10 +2837,7 @@ static GLuint gen_arbfp_ffp_shader(struct =
ffp_settings *settings, IWineD3DStateB=0A=
             } else if(stage =3D=3D 0) {=0A=
                 shader_addline(&buffer, "MOV ret.a, =
fragment.color.primary.a;\n");=0A=
             }=0A=
-        } else if(settings->op[stage].aop   =3D=3D =
settings->op[stage].cop &&=0A=
-                  settings->op[stage].carg0 =3D=3D =
settings->op[stage].aarg0 &&=0A=
-                  settings->op[stage].carg1 =3D=3D =
settings->op[stage].aarg1 &&=0A=
-                  settings->op[stage].carg2 =3D=3D =
settings->op[stage].aarg2) {=0A=
+        } else if(op_equal) {=0A=
             gen_ffp_instr(&buffer, stage, TRUE, TRUE, last, =
settings->op[stage].dst,=0A=
                           settings->op[stage].cop, =
settings->op[stage].carg0,=0A=
                           settings->op[stage].carg1, =
settings->op[stage].carg2);=0A=
-- =0A=
1.5.6.4=0A=
=0A=

------=_NextPart_000_000B_01C90695.8F5CFEE0--




More information about the wine-patches mailing list