[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