Stefan Doesinger : wined3d: Deal with instructions that do not support _SAT .

Alexandre Julliard julliard at winehq.org
Wed Jun 17 10:43:27 CDT 2009


Module: wine
Branch: master
Commit: c9ef1ed28c861bc862c92ff68aa37b4ddf01cc39
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c9ef1ed28c861bc862c92ff68aa37b4ddf01cc39

Author: Stefan Doesinger <stefan at codeweavers.com>
Date:   Tue Jun 16 17:20:12 2009 +0200

wined3d: Deal with instructions that do not support _SAT.

---

 dlls/wined3d/arb_program_shader.c |   32 +++++++++++++++++++++++++++-----
 1 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 80bb563..729e6ce 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -1158,6 +1158,7 @@ static void pshader_hw_cnd(const struct wined3d_shader_instruction *ins)
     char src_name[3][50];
     DWORD shader_version = WINED3D_SHADER_VERSION(ins->ctx->reg_maps->shader_version.major,
             ins->ctx->reg_maps->shader_version.minor);
+    BOOL is_color;
 
     shader_arb_get_dst_param(ins, dst, dst_name);
     shader_arb_get_src_param(ins, &ins->src[1], 1, src_name[1]);
@@ -1170,8 +1171,15 @@ static void pshader_hw_cnd(const struct wined3d_shader_instruction *ins)
         shader_arb_get_src_param(ins, &ins->src[0], 0, src_name[0]);
         shader_arb_get_src_param(ins, &ins->src[2], 2, src_name[2]);
         shader_addline(buffer, "ADD TA, -%s, coefdiv.x;\n", src_name[0]);
-        shader_addline(buffer, "CMP%s %s, TA, %s, %s;\n",
-                       shader_arb_get_modifier(ins), dst_name, src_name[1], src_name[2]);
+        /* No modifiers supported on CMP */
+        shader_addline(buffer, "CMP %s, TA, %s, %s;\n", dst_name, src_name[1], src_name[2]);
+
+        /* _SAT on CMP doesn't make much sense, but it is not a pure NOP */
+        if(ins->dst[0].modifiers & WINED3DSPDM_SATURATE)
+        {
+            shader_arb_get_register_name(ins, &dst->reg, src_name[0], &is_color);
+            shader_addline(buffer, "MOV_SAT %s, %s;\n", dst_name, dst_name);
+        }
     }
 }
 
@@ -1181,6 +1189,7 @@ static void pshader_hw_cmp(const struct wined3d_shader_instruction *ins)
     SHADER_BUFFER *buffer = ins->ctx->buffer;
     char dst_name[50];
     char src_name[3][50];
+    BOOL is_color;
 
     shader_arb_get_dst_param(ins, dst, dst_name);
 
@@ -1189,8 +1198,15 @@ static void pshader_hw_cmp(const struct wined3d_shader_instruction *ins)
     shader_arb_get_src_param(ins, &ins->src[1], 1, src_name[1]);
     shader_arb_get_src_param(ins, &ins->src[2], 2, src_name[2]);
 
-    shader_addline(buffer, "CMP%s %s, %s, %s, %s;\n", shader_arb_get_modifier(ins), dst_name,
+    /* No modifiers are supported on CMP */
+    shader_addline(buffer, "CMP %s, %s, %s, %s;\n", dst_name,
                    src_name[0], src_name[2], src_name[1]);
+
+    if(ins->dst[0].modifiers & WINED3DSPDM_SATURATE)
+    {
+        shader_arb_get_register_name(ins, &dst->reg, src_name[0], &is_color);
+        shader_addline(buffer, "MOV_SAT %s, %s;\n", dst_name, src_name[0]);
+    }
 }
 
 /** Process the WINED3DSIO_DP2ADD instruction in ARB.
@@ -2038,8 +2054,14 @@ static void shader_hw_sincos(const struct wined3d_shader_instruction *ins)
     shader_arb_get_src_param(ins, &ins->src[0], 0, src_name0);
     if(shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type)) {
         shader_arb_get_dst_param(ins, &ins->dst[0], dst_name);
-        shader_addline(buffer, "SCS%s %s, %s;\n", shader_arb_get_modifier(ins), dst_name,
-                       src_name0);
+        /* No modifiers are supported on SCS */
+        shader_addline(buffer, "SCS %s, %s;\n", dst_name, src_name0);
+
+        if(ins->dst[0].modifiers & WINED3DSPDM_SATURATE)
+        {
+            shader_arb_get_register_name(ins, &dst->reg, src_name0, &is_color);
+            shader_addline(buffer, "MOV_SAT %s, %s;\n", dst_name, src_name0);
+        }
     } else if(priv->target_version >= NV2) {
         shader_arb_get_register_name(ins, &dst->reg, dst_name, &is_color);
 




More information about the wine-cvs mailing list