[PATCH] D3D9: Test for fixed function value clamping=0A=

Stefan Doesinger stefan at codeweavers.com
Thu Aug 14 16:29:47 CDT 2008


=0A=
---=0A=
 dlls/d3d9/tests/visual.c             |  111 =
++++++++++++++++++++++++++++++++++=0A=
 dlls/wined3d/arb_program_shader.c    |    4 +-=0A=
 dlls/wined3d/ati_fragment_shader.c   |   42 +++++++------=0A=
 dlls/wined3d/nvidia_texture_shader.c |    6 +-=0A=
 4 files changed, 140 insertions(+), 23 deletions(-)=0A=
=0A=
diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c=0A=
index 6c460b9..6f184cb 100644=0A=
--- a/dlls/d3d9/tests/visual.c=0A=
+++ b/dlls/d3d9/tests/visual.c=0A=
@@ -9298,6 +9298,116 @@ static void yuv_color_test(IDirect3DDevice9 =
*device) {=0A=
     IDirect3D9_Release(d3d);=0A=
 }=0A=
 =0A=
+static void texop_range_test(IDirect3DDevice9 *device)=0A=
+{=0A=
+    static const struct {=0A=
+        float x, y, z;=0A=
+        D3DCOLOR diffuse;=0A=
+    } quad[] =3D {=0A=
+        {-1.0f, -1.0f, 0.1f, D3DCOLOR_ARGB(0xff, 0xff, 0xff, 0xff)},=0A=
+        {-1.0f,  1.0f, 0.1f, D3DCOLOR_ARGB(0xff, 0xff, 0xff, 0xff)},=0A=
+        { 1.0f, -1.0f, 0.1f, D3DCOLOR_ARGB(0xff, 0xff, 0xff, 0xff)},=0A=
+        { 1.0f,  1.0f, 0.1f, D3DCOLOR_ARGB(0xff, 0xff, 0xff, 0xff)}=0A=
+    };=0A=
+    HRESULT hr;=0A=
+    IDirect3DTexture9 *texture;=0A=
+    D3DLOCKED_RECT locked_rect;=0A=
+    D3DCAPS9 caps;=0A=
+    DWORD color;=0A=
+=0A=
+    /* We need ADD and SUBTRACT operations */=0A=
+    hr =3D IDirect3DDevice9_GetDeviceCaps(device, &caps);=0A=
+    ok(SUCCEEDED(hr), "GetDeviceCaps failed with 0x%08x\n", hr);=0A=
+    if (!(caps.TextureOpCaps & D3DTEXOPCAPS_ADD)) {=0A=
+        skip("D3DTOP_ADD is not supported, skipping value range =
test\n");=0A=
+    }=0A=
+    if (!(caps.TextureOpCaps & D3DTEXOPCAPS_SUBTRACT)) {=0A=
+        skip("D3DTEXOPCAPS_SUBTRACT is not supported, skipping value =
range test\n");=0A=
+    }=0A=
+=0A=
+    hr =3D IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_DIFFUSE);=0A=
+    ok(SUCCEEDED(hr), "SetFVF failed with 0x%08x\n", hr);=0A=
+    /* Stage 1: result =3D diffuse(=3D1.0) + diffuse=0A=
+     * stage 2: result =3D result - tfactor(=3D 0.5)=0A=
+     */=0A=
+    hr =3D IDirect3DDevice9_SetRenderState(device, D3DRS_TEXTUREFACTOR, =
0x80808080);=0A=
+    ok(SUCCEEDED(hr), "SetRenderState failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_SetTextureStageState(device, 0, =
D3DTSS_COLORARG1, D3DTA_DIFFUSE);=0A=
+    ok(SUCCEEDED(hr), "SetTextureStageState failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_SetTextureStageState(device, 0, =
D3DTSS_COLORARG2, D3DTA_DIFFUSE);=0A=
+    ok(SUCCEEDED(hr), "SetTextureStageState failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_SetTextureStageState(device, 0, =
D3DTSS_COLOROP, D3DTOP_ADD);=0A=
+    ok(SUCCEEDED(hr), "SetTextureStageState failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_SetTextureStageState(device, 1, =
D3DTSS_COLORARG1, D3DTA_CURRENT);=0A=
+    ok(SUCCEEDED(hr), "SetTextureStageState failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_SetTextureStageState(device, 1, =
D3DTSS_COLORARG2, D3DTA_TFACTOR);=0A=
+    ok(SUCCEEDED(hr), "SetTextureStageState failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_SetTextureStageState(device, 1, =
D3DTSS_COLOROP, D3DTOP_SUBTRACT);=0A=
+    ok(SUCCEEDED(hr), "SetTextureStageState failed with 0x%08x\n", hr);=0A=
+=0A=
+    hr =3D IDirect3DDevice9_BeginScene(device);=0A=
+    ok(SUCCEEDED(hr), "BeginScene failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_DrawPrimitiveUP(device, =
D3DPT_TRIANGLESTRIP, 2, quad, sizeof(*quad));=0A=
+    ok(SUCCEEDED(hr), "DrawPrimitiveUP failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_EndScene(device);=0A=
+    ok(SUCCEEDED(hr), "EndScene failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);=0A=
+    ok(SUCCEEDED(hr), "Present failed with 0x%08x\n", hr);=0A=
+=0A=
+    color =3D getPixelColor(device, 320, 240);=0A=
+    ok(color_match(color, 0x00808080, 1), "texop Range > 1.0 returned =
0x%08x, expected 0x00808080\n",=0A=
+       color);=0A=
+=0A=
+    hr =3D IDirect3DDevice9_CreateTexture(device, 1, 1, 1, 0, =
D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &texture, NULL);=0A=
+    ok(SUCCEEDED(hr), "IDirect3DDevice9_CreateTexture failed with =
0x%08x\n", hr);=0A=
+    hr =3D IDirect3DTexture9_LockRect(texture, 0, &locked_rect, NULL, =
0);=0A=
+    ok(SUCCEEDED(hr), "LockRect failed with 0x%08x\n", hr);=0A=
+    *((DWORD *)locked_rect.pBits) =3D D3DCOLOR_ARGB(0x00, 0x00, 0x00, =
0x00);=0A=
+    hr =3D IDirect3DTexture9_UnlockRect(texture, 0);=0A=
+    ok(SUCCEEDED(hr), "LockRect failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_SetTexture(device, 0, =
(IDirect3DBaseTexture9 *)texture);=0A=
+    ok(SUCCEEDED(hr), "SetTexture failed with 0x%08x\n", hr);=0A=
+=0A=
+    /* Stage 1: result =3D texture(=3D0.0) - tfactor(=3D 0.5)=0A=
+     * stage 2: result =3D result + diffuse(1.0)=0A=
+     */=0A=
+    hr =3D IDirect3DDevice9_SetRenderState(device, D3DRS_TEXTUREFACTOR, =
0x80808080);=0A=
+    ok(SUCCEEDED(hr), "SetRenderState failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_SetTextureStageState(device, 0, =
D3DTSS_COLORARG1, D3DTA_TEXTURE);=0A=
+    ok(SUCCEEDED(hr), "SetTextureStageState failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_SetTextureStageState(device, 0, =
D3DTSS_COLORARG2, D3DTA_TFACTOR);=0A=
+    ok(SUCCEEDED(hr), "SetTextureStageState failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_SetTextureStageState(device, 0, =
D3DTSS_COLOROP, D3DTOP_SUBTRACT);=0A=
+    ok(SUCCEEDED(hr), "SetTextureStageState failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_SetTextureStageState(device, 1, =
D3DTSS_COLORARG1, D3DTA_CURRENT);=0A=
+    ok(SUCCEEDED(hr), "SetTextureStageState failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_SetTextureStageState(device, 1, =
D3DTSS_COLORARG2, D3DTA_DIFFUSE);=0A=
+    ok(SUCCEEDED(hr), "SetTextureStageState failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_SetTextureStageState(device, 1, =
D3DTSS_COLOROP, D3DTOP_ADD);=0A=
+    ok(SUCCEEDED(hr), "SetTextureStageState failed with 0x%08x\n", hr);=0A=
+=0A=
+    hr =3D IDirect3DDevice9_BeginScene(device);=0A=
+    ok(SUCCEEDED(hr), "BeginScene failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_DrawPrimitiveUP(device, =
D3DPT_TRIANGLESTRIP, 2, quad, sizeof(*quad));=0A=
+    ok(SUCCEEDED(hr), "DrawPrimitiveUP failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_EndScene(device);=0A=
+    ok(SUCCEEDED(hr), "EndScene failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);=0A=
+    ok(SUCCEEDED(hr), "Present failed with 0x%08x\n", hr);=0A=
+=0A=
+    color =3D getPixelColor(device, 320, 240);=0A=
+    ok(color_match(color, 0x00ffffff, 1), "texop Range < 0.0 returned =
0x%08x, expected 0x00ffffff\n",=0A=
+       color);=0A=
+=0A=
+    hr =3D IDirect3DDevice9_SetTextureStageState(device, 0, =
D3DTSS_COLOROP, D3DTOP_DISABLE);=0A=
+    ok(SUCCEEDED(hr), "SetTextureStageState failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_SetTextureStageState(device, 1, =
D3DTSS_COLOROP, D3DTOP_DISABLE);=0A=
+    ok(SUCCEEDED(hr), "SetTextureStageState failed with 0x%08x\n", hr);=0A=
+    hr =3D IDirect3DDevice9_SetTexture(device, 1, =
(IDirect3DBaseTexture9 *)NULL);=0A=
+    ok(SUCCEEDED(hr), "SetTexture failed with 0x%08x\n", hr);=0A=
+    IDirect3DTexture9_Release(texture);=0A=
+}=0A=
+=0A=
 START_TEST(visual)=0A=
 {=0A=
     IDirect3DDevice9 *device_ptr;=0A=
@@ -9455,6 +9565,7 @@ START_TEST(visual)=0A=
     }=0A=
     else skip("No ps_1_1 support\n");=0A=
     texop_test(device_ptr);=0A=
+    texop_range_test(device_ptr);=0A=
 =0A=
 cleanup:=0A=
     if(device_ptr) {=0A=
diff --git a/dlls/wined3d/arb_program_shader.c =
b/dlls/wined3d/arb_program_shader.c=0A=
index 40f33e1..e553828 100644=0A=
--- a/dlls/wined3d/arb_program_shader.c=0A=
+++ b/dlls/wined3d/arb_program_shader.c=0A=
@@ -2561,9 +2561,9 @@ static void gen_ffp_instr(SHADER_BUFFER *buffer, =
unsigned int stage, BOOL color,=0A=
     }=0A=
 =0A=
     if(mul =3D=3D 2) {=0A=
-        shader_addline(buffer, "MUL %s%s, %s, const.y;\n", =
mul_final_dest ? "result.color" : dstreg, dstmask, dstreg);=0A=
+        shader_addline(buffer, "MUL_SAT %s%s, %s, const.y;\n", =
mul_final_dest ? "result.color" : dstreg, dstmask, dstreg);=0A=
     } else if(mul =3D=3D 4) {=0A=
-        shader_addline(buffer, "MUL %s%s, %s, const.z;\n", =
mul_final_dest ? "result.color" : dstreg, dstmask, dstreg);=0A=
+        shader_addline(buffer, "MUL_SAT %s%s, %s, const.z;\n", =
mul_final_dest ? "result.color" : dstreg, dstmask, dstreg);=0A=
     }=0A=
 }=0A=
 =0A=
diff --git a/dlls/wined3d/ati_fragment_shader.c =
b/dlls/wined3d/ati_fragment_shader.c=0A=
index 8e3ed18..e6b43d8 100644=0A=
--- a/dlls/wined3d/ati_fragment_shader.c=0A=
+++ b/dlls/wined3d/ati_fragment_shader.c=0A=
@@ -451,6 +451,7 @@ static GLuint gen_ati_shader(struct texture_stage_op =
op[MAX_TEXTURES], WineD3D_G=0A=
                 if(dstmod =3D=3D GL_NONE) dstmod =3D GL_4X_BIT_ATI;=0A=
             case WINED3DTOP_MODULATE2X:=0A=
                 if(dstmod =3D=3D GL_NONE) dstmod =3D GL_2X_BIT_ATI;=0A=
+                dstmod |=3D GL_SATURATE_BIT_ATI;=0A=
             case WINED3DTOP_MODULATE:=0A=
                 TRACE("glColorFragmentOp2ATI(GL_MUL_ATI, %s, GL_NONE, =
%s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n",=0A=
                       debug_register(dstreg), debug_dstmod(dstmod),=0A=
@@ -466,6 +467,7 @@ static GLuint gen_ati_shader(struct texture_stage_op =
op[MAX_TEXTURES], WineD3D_G=0A=
             case WINED3DTOP_ADDSIGNED:=0A=
                 argmodextra =3D GL_BIAS_BIT_ATI;=0A=
             case WINED3DTOP_ADD:=0A=
+                dstmod |=3D GL_SATURATE_BIT_ATI;=0A=
                 TRACE("glColorFragmentOp2ATI(GL_ADD_ATI, %s, GL_NONE, =
%s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n",=0A=
                       debug_register(dstreg), debug_dstmod(dstmod),=0A=
                       debug_register(arg1), debug_argmod(argmod1),=0A=
@@ -476,6 +478,7 @@ static GLuint gen_ati_shader(struct texture_stage_op =
op[MAX_TEXTURES], WineD3D_G=0A=
                 break;=0A=
 =0A=
             case WINED3DTOP_SUBTRACT:=0A=
+                dstmod |=3D GL_SATURATE_BIT_ATI;=0A=
                 TRACE("glColorFragmentOp2ATI(GL_SUB_ATI, %s, GL_NONE, =
%s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n",=0A=
                       debug_register(dstreg), debug_dstmod(dstmod),=0A=
                       debug_register(arg1), debug_argmod(argmod1),=0A=
@@ -487,7 +490,7 @@ static GLuint gen_ati_shader(struct texture_stage_op =
op[MAX_TEXTURES], WineD3D_G=0A=
 =0A=
             case WINED3DTOP_ADDSMOOTH:=0A=
                 argmodextra =3D argmod1 & GL_COMP_BIT_ATI ? argmod1 & =
~GL_COMP_BIT_ATI : argmod1 | GL_COMP_BIT_ATI;=0A=
-                TRACE("glColorFragmentOp3ATI(GL_MAD_ATI, %s, GL_NONE, =
GL_NONE, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n",=0A=
+                TRACE("glColorFragmentOp3ATI(GL_MAD_ATI, %s, GL_NONE, =
GL_SATURATE_BIT_ATI, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, =
%s)\n",=0A=
                       debug_register(dstreg),=0A=
                       debug_register(arg2), debug_argmod(argmod2),=0A=
                       debug_register(arg1), debug_argmod(argmodextra),=0A=
@@ -495,7 +498,7 @@ static GLuint gen_ati_shader(struct texture_stage_op =
op[MAX_TEXTURES], WineD3D_G=0A=
                 /* Dst =3D arg1 + * arg2(1 -arg 1)=0A=
                  *     =3D arg2 * (1 - arg1) + arg1=0A=
                  */=0A=
-                GL_EXTCALL(glColorFragmentOp3ATI(GL_MAD_ATI, dstreg, =
GL_NONE, GL_NONE,=0A=
+                GL_EXTCALL(glColorFragmentOp3ATI(GL_MAD_ATI, dstreg, =
GL_NONE, GL_SATURATE_BIT_ATI,=0A=
                                                  arg2, GL_NONE, argmod2,=0A=
                                                  arg1, GL_NONE, =
argmodextra,=0A=
                                                  arg1, GL_NONE, =
argmod1));=0A=
@@ -539,11 +542,11 @@ static GLuint gen_ati_shader(struct =
texture_stage_op op[MAX_TEXTURES], WineD3D_G=0A=
                 argmodextra =3D argmod1 & GL_COMP_BIT_ATI ? argmod1 & =
~GL_COMP_BIT_ATI : argmod1 | GL_COMP_BIT_ATI;=0A=
             case WINED3DTOP_MODULATEALPHA_ADDCOLOR:=0A=
                 if(!argmodextra) argmodextra =3D argmod1;=0A=
-                TRACE("glColorFragmentOp3ATI(GL_MAD_ATI, %s, GL_NONE, =
GL_NONE, %s, GL_NONE, %s, %s, GL_ALPHA, %s, %s, GL_NONE, %s)\n",=0A=
+                TRACE("glColorFragmentOp3ATI(GL_MAD_ATI, %s, GL_NONE, =
GL_SATURATE_BIT_ATI, %s, GL_NONE, %s, %s, GL_ALPHA, %s, %s, GL_NONE, =
%s)\n",=0A=
                       debug_register(dstreg),=0A=
                       debug_register(arg2), debug_argmod(argmod2),=0A=
                       debug_register(arg1), debug_argmod(argmodextra), =
debug_register(arg1), debug_argmod(arg1));=0A=
-                GL_EXTCALL(glColorFragmentOp3ATI(GL_MAD_ATI, dstreg, =
GL_NONE, GL_NONE,=0A=
+                GL_EXTCALL(glColorFragmentOp3ATI(GL_MAD_ATI, dstreg, =
GL_NONE, GL_SATURATE_BIT_ATI,=0A=
                                                  arg2, GL_NONE,  =
argmod2,=0A=
                                                  arg1, GL_ALPHA, =
argmodextra,=0A=
                                                  arg1, GL_NONE,  =
argmod1));=0A=
@@ -553,34 +556,34 @@ static GLuint gen_ati_shader(struct =
texture_stage_op op[MAX_TEXTURES], WineD3D_G=0A=
                 argmodextra =3D argmod1 & GL_COMP_BIT_ATI ? argmod1 & =
~GL_COMP_BIT_ATI : argmod1 | GL_COMP_BIT_ATI;=0A=
             case WINED3DTOP_MODULATECOLOR_ADDALPHA:=0A=
                 if(!argmodextra) argmodextra =3D argmod1;=0A=
-                TRACE("glColorFragmentOp3ATI(GL_MAD_ATI, %s, GL_NONE, =
GL_NONE, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_ALPHA, %s)\n",=0A=
+                TRACE("glColorFragmentOp3ATI(GL_MAD_ATI, %s, GL_NONE, =
GL_SATURATE_BIT_ATI, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_ALPHA, =
%s)\n",=0A=
                       debug_register(dstreg),=0A=
                       debug_register(arg2), debug_argmod(argmod2),=0A=
                       debug_register(arg1), debug_argmod(argmodextra),=0A=
                       debug_register(arg1), debug_argmod(argmod1));=0A=
-                GL_EXTCALL(glColorFragmentOp3ATI(GL_MAD_ATI, dstreg, =
GL_NONE, GL_NONE,=0A=
+                GL_EXTCALL(glColorFragmentOp3ATI(GL_MAD_ATI, dstreg, =
GL_NONE, GL_SATURATE_BIT_ATI,=0A=
                                                  arg2, GL_NONE,  =
argmod2,=0A=
                                                  arg1, GL_NONE,  =
argmodextra,=0A=
                                                  arg1, GL_ALPHA, =
argmod1));=0A=
                 break;=0A=
 =0A=
             case WINED3DTOP_DOTPRODUCT3:=0A=
-                TRACE("glColorFragmentOp2ATI(GL_DOT3_ATI, %s, GL_NONE, =
GL_4X_BIT_ATI, %s, GL_NONE, %s, %s, GL_NONE, %s)\n",=0A=
+                TRACE("glColorFragmentOp2ATI(GL_DOT3_ATI, %s, GL_NONE, =
GL_4X_BIT_ATI | GL_SATURATE_BIT_ATI, %s, GL_NONE, %s, %s, GL_NONE, =
%s)\n",=0A=
                       debug_register(dstreg),=0A=
                       debug_register(arg1), debug_argmod(argmod1 | =
GL_BIAS_BIT_ATI),=0A=
                       debug_register(arg2), debug_argmod(argmod2 | =
GL_BIAS_BIT_ATI));=0A=
-                GL_EXTCALL(glColorFragmentOp2ATI(GL_DOT3_ATI, dstreg, =
GL_NONE, GL_4X_BIT_ATI,=0A=
+                GL_EXTCALL(glColorFragmentOp2ATI(GL_DOT3_ATI, dstreg, =
GL_NONE, GL_4X_BIT_ATI | GL_SATURATE_BIT_ATI,=0A=
                                                  arg1, GL_NONE, argmod1 =
| GL_BIAS_BIT_ATI,=0A=
                                                  arg2, GL_NONE, argmod2 =
| GL_BIAS_BIT_ATI));=0A=
                 break;=0A=
 =0A=
             case WINED3DTOP_MULTIPLYADD:=0A=
-                TRACE("glColorFragmentOp3ATI(GL_MAD_ATI, %s, GL_NONE, =
GL_NONE, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n",=0A=
+                TRACE("glColorFragmentOp3ATI(GL_MAD_ATI, %s, GL_NONE, =
GL_SATURATE_BIT_ATI, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, =
%s)\n",=0A=
                       debug_register(dstreg),=0A=
                       debug_register(arg1), debug_argmod(argmod1),=0A=
                       debug_register(arg2), debug_argmod(argmod2),=0A=
                       debug_register(arg0), debug_argmod(argmod0));=0A=
-                GL_EXTCALL(glColorFragmentOp3ATI(GL_MAD_ATI, dstreg, =
GL_NONE, GL_NONE,=0A=
+                GL_EXTCALL(glColorFragmentOp3ATI(GL_MAD_ATI, dstreg, =
GL_NONE, GL_SATURATE_BIT_ATI,=0A=
                                                  arg1, GL_NONE, argmod1,=0A=
                                                  arg2, GL_NONE, argmod2,=0A=
                                                  arg0, GL_NONE, =
argmod0));=0A=
@@ -638,6 +641,7 @@ static GLuint gen_ati_shader(struct texture_stage_op =
op[MAX_TEXTURES], WineD3D_G=0A=
                 if(dstmod =3D=3D GL_NONE) dstmod =3D GL_4X_BIT_ATI;=0A=
             case WINED3DTOP_MODULATE2X:=0A=
                 if(dstmod =3D=3D GL_NONE) dstmod =3D GL_2X_BIT_ATI;=0A=
+                dstmod |=3D GL_SATURATE_BIT_ATI;=0A=
             case WINED3DTOP_MODULATE:=0A=
                 TRACE("glAlphaFragmentOp2ATI(GL_MUL_ATI, %s,          =
%s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n",=0A=
                       debug_register(dstreg), debug_dstmod(dstmod),=0A=
@@ -653,6 +657,7 @@ static GLuint gen_ati_shader(struct texture_stage_op =
op[MAX_TEXTURES], WineD3D_G=0A=
             case WINED3DTOP_ADDSIGNED:=0A=
                 argmodextra =3D GL_BIAS_BIT_ATI;=0A=
             case WINED3DTOP_ADD:=0A=
+                dstmod |=3D GL_SATURATE_BIT_ATI;=0A=
                 TRACE("glAlphaFragmentOp2ATI(GL_ADD_ATI, %s,          =
%s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n",=0A=
                       debug_register(dstreg), debug_dstmod(dstmod),=0A=
                       debug_register(arg1), debug_argmod(argmod1),=0A=
@@ -663,6 +668,7 @@ static GLuint gen_ati_shader(struct texture_stage_op =
op[MAX_TEXTURES], WineD3D_G=0A=
                 break;=0A=
 =0A=
             case WINED3DTOP_SUBTRACT:=0A=
+                dstmod |=3D GL_SATURATE_BIT_ATI;=0A=
                 TRACE("glAlphaFragmentOp2ATI(GL_SUB_ATI, %s, GL_NONE, =
%s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n",=0A=
                       debug_register(dstreg), debug_dstmod(dstmod),=0A=
                       debug_register(arg1), debug_argmod(argmod1),=0A=
@@ -674,7 +680,7 @@ static GLuint gen_ati_shader(struct texture_stage_op =
op[MAX_TEXTURES], WineD3D_G=0A=
 =0A=
             case WINED3DTOP_ADDSMOOTH:=0A=
                 argmodextra =3D argmod1 & GL_COMP_BIT_ATI ? argmod1 & =
~GL_COMP_BIT_ATI : argmod1 | GL_COMP_BIT_ATI;=0A=
-                TRACE("glAlphaFragmentOp3ATI(GL_MAD_ATI, %s,          =
GL_NONE, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n",=0A=
+                TRACE("glAlphaFragmentOp3ATI(GL_MAD_ATI, %s,          =
GL_SATURATE_BIT_ATI, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, =
%s)\n",=0A=
                       debug_register(dstreg),=0A=
                       debug_register(arg2), debug_argmod(argmod2),=0A=
                       debug_register(arg1), debug_argmod(argmodextra),=0A=
@@ -682,7 +688,7 @@ static GLuint gen_ati_shader(struct texture_stage_op =
op[MAX_TEXTURES], WineD3D_G=0A=
                 /* Dst =3D arg1 + * arg2(1 -arg 1)=0A=
                  *     =3D arg2 * (1 - arg1) + arg1=0A=
                  */=0A=
-                GL_EXTCALL(glAlphaFragmentOp3ATI(GL_MAD_ATI, dstreg, =
GL_NONE,=0A=
+                GL_EXTCALL(glAlphaFragmentOp3ATI(GL_MAD_ATI, dstreg, =
GL_SATURATE_BIT_ATI,=0A=
                                                  arg2, GL_NONE, argmod2,=0A=
                                                  arg1, GL_NONE, =
argmodextra,=0A=
                                                  arg1, GL_NONE, =
argmod1));=0A=
@@ -723,34 +729,34 @@ static GLuint gen_ati_shader(struct =
texture_stage_op op[MAX_TEXTURES], WineD3D_G=0A=
             /* D3DTOP_PREMODULATE ???? */=0A=
 =0A=
             case WINED3DTOP_DOTPRODUCT3:=0A=
-                TRACE("glAlphaFragmentOp2ATI(GL_DOT3_ATI, %s, GL_NONE, =
GL_4X_BIT_ATI, %s, GL_NONE, %s, %s, GL_NONE, %s)\n",=0A=
+                TRACE("glAlphaFragmentOp2ATI(GL_DOT3_ATI, %s,          =
GL_4X_BIT_ATI | GL_SATURATE_BIT_ATI, %s, GL_NONE, %s, %s, GL_NONE, =
%s)\n",=0A=
                       debug_register(dstreg),=0A=
                       debug_register(arg1), debug_argmod(argmod1 | =
GL_BIAS_BIT_ATI),=0A=
                       debug_register(arg2), debug_argmod(argmod2 | =
GL_BIAS_BIT_ATI));=0A=
-                GL_EXTCALL(glAlphaFragmentOp2ATI(GL_DOT3_ATI, dstreg, =
GL_4X_BIT_ATI,=0A=
+                GL_EXTCALL(glAlphaFragmentOp2ATI(GL_DOT3_ATI, dstreg, =
GL_4X_BIT_ATI | GL_SATURATE_BIT_ATI,=0A=
                                                  arg1, GL_NONE, argmod1 =
| GL_BIAS_BIT_ATI,=0A=
                                                  arg2, GL_NONE, argmod2 =
| GL_BIAS_BIT_ATI));=0A=
                 break;=0A=
 =0A=
             case WINED3DTOP_MULTIPLYADD:=0A=
-                TRACE("glAlphaFragmentOp3ATI(GL_MAD_ATI, %s,          =
GL_NONE, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n",=0A=
+                TRACE("glAlphaFragmentOp3ATI(GL_MAD_ATI, %s,          =
GL_SATURATE_BIT_ATI, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, =
%s)\n",=0A=
                       debug_register(dstreg),=0A=
                       debug_register(arg1), debug_argmod(argmod1),=0A=
                       debug_register(arg2), debug_argmod(argmod2),=0A=
                       debug_register(arg0), debug_argmod(argmod0));=0A=
-                GL_EXTCALL(glAlphaFragmentOp3ATI(GL_MAD_ATI, dstreg,    =
      GL_NONE,=0A=
+                GL_EXTCALL(glAlphaFragmentOp3ATI(GL_MAD_ATI, dstreg,    =
      GL_SATURATE_BIT_ATI,=0A=
                            arg1, GL_NONE, argmod1,=0A=
                            arg2, GL_NONE, argmod2,=0A=
                            arg0, GL_NONE, argmod0));=0A=
                 break;=0A=
 =0A=
             case WINED3DTOP_LERP:=0A=
-                TRACE("glAlphaFragmentOp3ATI(GL_LERP_ATI, %s,          =
GL_NONE, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n",=0A=
+                TRACE("glAlphaFragmentOp3ATI(GL_LERP_ATI, %s,          =
GL_SATURATE_BIT_ATI, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, =
%s)\n",=0A=
                       debug_register(dstreg),=0A=
                       debug_register(arg1), debug_argmod(argmod1),=0A=
                       debug_register(arg2), debug_argmod(argmod2),=0A=
                       debug_register(arg0), debug_argmod(argmod0));=0A=
-                GL_EXTCALL(glAlphaFragmentOp3ATI(GL_LERP_ATI, dstreg, =
GL_NONE,=0A=
+                GL_EXTCALL(glAlphaFragmentOp3ATI(GL_LERP_ATI, dstreg, =
GL_SATURATE_BIT_ATI,=0A=
                                                  arg1, GL_NONE, argmod1,=0A=
                                                  arg2, GL_NONE, argmod2,=0A=
                                                  arg0, GL_NONE, =
argmod0));=0A=
diff --git a/dlls/wined3d/nvidia_texture_shader.c =
b/dlls/wined3d/nvidia_texture_shader.c=0A=
index aea9960..d11c6af 100644=0A=
--- a/dlls/wined3d/nvidia_texture_shader.c=0A=
+++ b/dlls/wined3d/nvidia_texture_shader.c=0A=
@@ -105,8 +105,8 @@ static GLenum d3dta_to_combiner_input(DWORD d3dta, =
DWORD stage, INT texture_idx)=0A=
 }=0A=
 =0A=
 static GLenum invert_mapping(GLenum mapping) {=0A=
-    if (mapping =3D=3D GL_UNSIGNED_INVERT_NV) return =
GL_SIGNED_IDENTITY_NV;=0A=
-    else if (mapping =3D=3D GL_SIGNED_IDENTITY_NV) return =
GL_UNSIGNED_INVERT_NV;=0A=
+    if (mapping =3D=3D GL_UNSIGNED_INVERT_NV) return =
GL_UNSIGNED_IDENTITY_NV;=0A=
+    else if (mapping =3D=3D GL_UNSIGNED_IDENTITY_NV) return =
GL_UNSIGNED_INVERT_NV;=0A=
 =0A=
     FIXME("Unhandled mapping %#x\n", mapping);=0A=
     return mapping;=0A=
@@ -116,7 +116,7 @@ static void get_src_and_opr_nvrc(DWORD stage, DWORD =
arg, BOOL is_alpha, GLenum*=0A=
     /* The WINED3DTA_COMPLEMENT flag specifies the complement of the =
input should=0A=
     * be used. */=0A=
     if (arg & WINED3DTA_COMPLEMENT) *mapping =3D GL_UNSIGNED_INVERT_NV;=0A=
-    else *mapping =3D GL_SIGNED_IDENTITY_NV;=0A=
+    else *mapping =3D GL_UNSIGNED_IDENTITY_NV; /* Clamp all values to =
positive ranges */=0A=
 =0A=
     /* The WINED3DTA_ALPHAREPLICATE flag specifies the alpha component =
of the input=0A=
     * should be used for all input components. */=0A=
-- =0A=
1.5.4.5=0A=
=0A=

------=_NextPart_000_0069_01C902BC.A8FA6860--




More information about the wine-patches mailing list