Henri Verbeet : wined3d: Implement SM4 discard in the GLSL shader backend.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jun 15 08:49:10 CDT 2015


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Mon Jun 15 14:07:33 2015 +0200

wined3d: Implement SM4 discard in the GLSL shader backend.

---

 dlls/wined3d/glsl_shader.c | 35 +++++++++++++++++++++--------------
 1 file changed, 21 insertions(+), 14 deletions(-)

diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index f69a2ce..fa96fbe 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -4704,22 +4704,29 @@ static void shader_glsl_texreg2rgb(const struct wined3d_shader_instruction *ins)
  * If any of the first 3 components are < 0, discard this pixel */
 static void shader_glsl_texkill(const struct wined3d_shader_instruction *ins)
 {
-    struct glsl_dst_param dst_param;
+    if (ins->ctx->reg_maps->shader_version.major >= 4)
+    {
+        struct glsl_src_param src_param;
 
-    /* The argument is a destination parameter, and no writemasks are allowed */
-    shader_glsl_add_dst_param(ins, &ins->dst[0], &dst_param);
-    if (ins->ctx->reg_maps->shader_version.major >= 2)
+        shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_0, &src_param);
+        shader_addline(ins->ctx->buffer, "if (bool(floatBitsToUint(%s))) discard;\n", src_param.param_str);
+    }
+    else
     {
-        if (ins->ctx->reg_maps->shader_version.major >= 4)
-            FIXME("SM4 discard not implemented.\n");
-        /* 2.0 shaders compare all 4 components in texkill */
-        shader_addline(ins->ctx->buffer, "if (any(lessThan(%s.xyzw, vec4(0.0)))) discard;\n", dst_param.reg_name);
-    } else {
-        /* 1.X shaders only compare the first 3 components, probably due to the nature of the texkill
-         * instruction as a tex* instruction, and phase, which kills all a / w components. Even if all
-         * 4 components are defined, only the first 3 are used
-         */
-        shader_addline(ins->ctx->buffer, "if (any(lessThan(%s.xyz, vec3(0.0)))) discard;\n", dst_param.reg_name);
+        struct glsl_dst_param dst_param;
+
+        /* The argument is a destination parameter, and no writemasks are allowed */
+        shader_glsl_add_dst_param(ins, &ins->dst[0], &dst_param);
+
+        /* 2.0 shaders compare all 4 components in texkill. */
+        if (ins->ctx->reg_maps->shader_version.major >= 2)
+            shader_addline(ins->ctx->buffer, "if (any(lessThan(%s.xyzw, vec4(0.0)))) discard;\n", dst_param.reg_name);
+        /* 1.x shaders only compare the first 3 components, probably due to
+         * the nature of the texkill instruction as a tex* instruction, and
+         * phase, which kills all .w components. Even if all 4 components are
+         * defined, only the first 3 are used. */
+        else
+            shader_addline(ins->ctx->buffer, "if (any(lessThan(%s.xyz, vec3(0.0)))) discard;\n", dst_param.reg_name);
     }
 }
 




More information about the wine-cvs mailing list