Module: wine Branch: master Commit: c9227bccc5a1bf94fbf5bf335fae7f4b16c888ed URL: http://source.winehq.org/git/wine.git/?a=commit;h=c9227bccc5a1bf94fbf5bf335f...
Author: Henri Verbeet hverbeet@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); } }