[PATCH] WineD3D: Clamp results in the arbfp pipeline replacement=0A=

Stefan Doesinger stefan at codeweavers.com
Sat Aug 2 13:48:05 CDT 2008


=0A=
Fixed function processing can only deal with values between 0=0A=
and 1 generally. Clamp the results of instructions that could=0A=
produce bigger or smaller values.=0A=
=0A=
This fixes broken Windows in Max Payne 2. A test will hopefully=0A=
follow as soon as I have a chance to test the same behavior with=0A=
atifs.=0A=
---=0A=
 dlls/wined3d/arb_program_shader.c |   37 =
++++++++++++++++++++++---------------=0A=
 1 files changed, 22 insertions(+), 15 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/arb_program_shader.c =
b/dlls/wined3d/arb_program_shader.c=0A=
index 4f0e897..b3946fa 100644=0A=
--- a/dlls/wined3d/arb_program_shader.c=0A=
+++ b/dlls/wined3d/arb_program_shader.c=0A=
@@ -2462,16 +2462,16 @@ static void gen_ffp_instr(SHADER_BUFFER *buffer, =
unsigned int stage, BOOL color,=0A=
             shader_addline(buffer, "SUB arg2, %s, const.w;\n", arg2);=0A=
             arg2 =3D "arg2";=0A=
         case WINED3DTOP_ADD:=0A=
-            shader_addline(buffer, "ADD %s%s, %s, %s;\n", dstreg, =
dstmask, arg1, arg2);=0A=
+            shader_addline(buffer, "ADD_SAT %s%s, %s, %s;\n", dstreg, =
dstmask, arg1, arg2);=0A=
             break;=0A=
 =0A=
         case WINED3DTOP_SUBTRACT:=0A=
-            shader_addline(buffer, "SUB %s%s, %s, %s;\n", dstreg, =
dstmask, arg1, arg2);=0A=
+            shader_addline(buffer, "SUB_SAT %s%s, %s, %s;\n", dstreg, =
dstmask, arg1, arg2);=0A=
             break;=0A=
 =0A=
         case WINED3DTOP_ADDSMOOTH:=0A=
             shader_addline(buffer, "SUB arg1, const.x, %s;\n", arg1);=0A=
-            shader_addline(buffer, "MAD %s%s, arg1, %s, %s;\n", dstreg, =
dstmask, arg2, arg1);=0A=
+            shader_addline(buffer, "MAD_SAT %s%s, arg1, %s, %s;\n", =
dstreg, dstmask, arg2, arg1);=0A=
             break;=0A=
 =0A=
         case WINED3DTOP_BLENDCURRENTALPHA:=0A=
@@ -2493,24 +2493,24 @@ static void gen_ffp_instr(SHADER_BUFFER *buffer, =
unsigned int stage, BOOL color,=0A=
 =0A=
         case WINED3DTOP_BLENDTEXTUREALPHAPM:=0A=
             shader_addline(buffer, "SUB arg0.a, const.x, %s;\n", arg1);=0A=
-            shader_addline(buffer, "MAD %s%s, %s, arg0.a, %s;\n", =
dstreg, dstmask, arg2, arg1);=0A=
+            shader_addline(buffer, "MAD_SAT %s%s, %s, arg0.a, %s;\n", =
dstreg, dstmask, arg2, arg1);=0A=
             break;=0A=
 =0A=
         /* D3DTOP_PREMODULATE ???? */=0A=
 =0A=
         case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR:=0A=
             shader_addline(buffer, "SUB arg0.a, const.x, %s;\n", arg1);=0A=
-            shader_addline(buffer, "MAD %s%s, arg0.a, %s, %s;\n", =
dstreg, dstmask, arg2, arg1);=0A=
+            shader_addline(buffer, "MAD_SAT %s%s, arg0.a, %s, %s;\n", =
dstreg, dstmask, arg2, arg1);=0A=
             break;=0A=
         case WINED3DTOP_MODULATEALPHA_ADDCOLOR:=0A=
-            shader_addline(buffer, "MAD %s%s, %s.a, %s, %s;\n", dstreg, =
dstmask, arg1, arg2, arg1);=0A=
+            shader_addline(buffer, "MAD_SAT %s%s, %s.a, %s, %s;\n", =
dstreg, dstmask, arg1, arg2, arg1);=0A=
             break;=0A=
         case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA:=0A=
             shader_addline(buffer, "SUB arg0, const.x, %s;\n", arg1);=0A=
-            shader_addline(buffer, "MAD %s%s, arg0, %s, %s.a;\n", =
dstreg, dstmask, arg2, arg1);=0A=
+            shader_addline(buffer, "MAD_SAT %s%s, arg0, %s, %s.a;\n", =
dstreg, dstmask, arg2, arg1);=0A=
             break;=0A=
         case WINED3DTOP_MODULATECOLOR_ADDALPHA:=0A=
-            shader_addline(buffer, "MAD %s%s, %s, %s, %s.a;\n", dstreg, =
dstmask, arg1, arg2, arg1);=0A=
+            shader_addline(buffer, "MAD_SAT %s%s, %s, %s, %s.a;\n", =
dstreg, dstmask, arg1, arg2, arg1);=0A=
             break;=0A=
 =0A=
         case WINED3DTOP_DOTPRODUCT3:=0A=
@@ -2521,11 +2521,11 @@ static void gen_ffp_instr(SHADER_BUFFER *buffer, =
unsigned int stage, BOOL color,=0A=
             }=0A=
             shader_addline(buffer, "SUB arg1, %s, const.w;\n", arg1);=0A=
             shader_addline(buffer, "SUB arg2, %s, const.w;\n", arg2);=0A=
-            shader_addline(buffer, "DP3 %s%s, arg1, arg2;\n", dstreg, =
dstmask);=0A=
+            shader_addline(buffer, "DP3_SAT %s%s, arg1, arg2;\n", =
dstreg, dstmask);=0A=
             break;=0A=
 =0A=
         case WINED3DTOP_MULTIPLYADD:=0A=
-            shader_addline(buffer, "MAD %s%s, %s, %s, %s;\n", dstreg, =
dstmask, arg1, arg2, arg0);=0A=
+            shader_addline(buffer, "MAD_SAT %s%s, %s, %s, %s;\n", =
dstreg, dstmask, arg1, arg2, arg0);=0A=
             break;=0A=
 =0A=
         case WINED3DTOP_LERP:=0A=
@@ -2556,7 +2556,7 @@ static GLuint gen_arbfp_ffp_shader(struct =
ffp_settings *settings, IWineD3DStateB=0A=
     BOOL tex_read[MAX_TEXTURES] =3D {FALSE, FALSE, FALSE, FALSE, FALSE, =
FALSE, FALSE, FALSE};=0A=
     BOOL bump_used[MAX_TEXTURES] =3D {FALSE, FALSE, FALSE, FALSE, =
FALSE, FALSE, FALSE, FALSE};=0A=
     const char *textype;=0A=
-    const char *instr;=0A=
+    const char *instr, *sat;=0A=
     char colorcor_dst[8];=0A=
     GLuint ret;=0A=
     DWORD arg0, arg1, arg2;=0A=
@@ -2653,6 +2653,13 @@ static GLuint gen_arbfp_ffp_shader(struct =
ffp_settings *settings, IWineD3DStateB=0A=
             default: textype =3D "unexpected_textype";   break;=0A=
         }=0A=
 =0A=
+        if(settings->op[stage].cop =3D=3D WINED3DTOP_BUMPENVMAP ||=0A=
+           settings->op[stage].cop =3D=3D =
WINED3DTOP_BUMPENVMAPLUMINANCE) {=0A=
+            sat =3D "";=0A=
+        } else {=0A=
+            sat =3D "_SAT";=0A=
+        }=0A=
+=0A=
         if(settings->op[stage].projected =3D=3D proj_none) {=0A=
             instr =3D "TEX";=0A=
         } else if(settings->op[stage].projected =3D=3D proj_count4) {=0A=
@@ -2670,11 +2677,11 @@ static GLuint gen_arbfp_ffp_shader(struct =
ffp_settings *settings, IWineD3DStateB=0A=
             shader_addline(&buffer, "SWZ arg1, bumpmat%u, y, w, 0, =
0;\n", stage - 1);=0A=
             shader_addline(&buffer, "DP3 ret.g, arg1, tex%u;\n", stage =
- 1);=0A=
             shader_addline(&buffer, "ADD ret, ret, =
fragment.texcoord[%u];\n", stage);=0A=
-            shader_addline(&buffer, "%s tex%u, ret, texture[%u], %s;\n",=0A=
-                            instr, stage, stage, textype);=0A=
+            shader_addline(&buffer, "%s%s tex%u, ret, texture[%u], =
%s;\n",=0A=
+                            instr, sat, stage, stage, textype);=0A=
         } else {=0A=
-            shader_addline(&buffer, "%s tex%u, fragment.texcoord[%u], =
texture[%u], %s;\n",=0A=
-                            instr, stage, stage, stage, textype);=0A=
+            shader_addline(&buffer, "%s%s tex%u, fragment.texcoord[%u], =
texture[%u], %s;\n",=0A=
+                            instr, sat, stage, stage, stage, textype);=0A=
         }=0A=
 =0A=
         sprintf(colorcor_dst, "tex%u", stage);=0A=
-- =0A=
1.5.4.5=0A=
=0A=

------=_NextPart_000_0027_01C8F509.301BACD0--




More information about the wine-patches mailing list