2015-06-15 14:07 GMT+02:00 Henri Verbeet hverbeet@codeweavers.com:
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 5ba246e..eb98ffe 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);
}
-- 2.1.4
FWIW, https://msdn.microsoft.com/en-us/library/windows/desktop/hh446968%28v=vs.85%... mentions two variants of the discard instruction. Any clue how is that _z vs _nz part encoded?
On 15 June 2015 at 18:11, Matteo Bruni matteo.mystral@gmail.com wrote:
FWIW, https://msdn.microsoft.com/en-us/library/windows/desktop/hh446968%28v=vs.85%... mentions two variants of the discard instruction. Any clue how is that _z vs _nz part encoded?
Yeah, there are a couple of other instructions that work like that as well, e.g. if and break. I'd expect the comparison type to be in the same place as e.g. WINED3D_SM4_RESOURCE_TYPE_MASK and WINED3D_SM4_PRIMITIVE_TYPE_MASK, but I haven't specifically searched for it.