From: Elizabeth Figura zfigura@codeweavers.com
Ported from 491146fa94c608c241c06114b17a3b4d8b9cea65 in vkd3d. --- dlls/wined3d/glsl_shader.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 9ab3f722d31..59dd82c19a5 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -4330,7 +4330,19 @@ static void shader_glsl_to_int(const struct wined3d_shader_instruction *ins)
static void shader_glsl_to_uint(const struct wined3d_shader_instruction *ins) { - shader_glsl_cast(ins, "uvec", "uint"); + struct wined3d_string_buffer *buffer = ins->ctx->buffer; + struct glsl_src_param src_param; + unsigned int mask_size; + DWORD write_mask; + + write_mask = shader_glsl_append_dst(buffer, ins); + mask_size = shader_glsl_get_write_mask_size(write_mask); + shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src_param); + + if (mask_size > 1) + shader_addline(buffer, "uvec%u(max(%s, vec%u(0.0))));\n", mask_size, src_param.param_str, mask_size); + else + shader_addline(buffer, "uint(max(%s, 0)));\n", src_param.param_str); }
static void shader_glsl_to_float(const struct wined3d_shader_instruction *ins)
From: Elizabeth Figura zfigura@codeweavers.com
Ported from cc893a3368bd8a8a3f638ddde7b97d3819a6b43d in vkd3d. --- dlls/wined3d/adapter_gl.c | 2 ++ dlls/wined3d/glsl_shader.c | 11 ++++++++--- dlls/wined3d/wined3d_gl.h | 1 + 3 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c index bd7bd3a1222..cefe5ec7120 100644 --- a/dlls/wined3d/adapter_gl.c +++ b/dlls/wined3d/adapter_gl.c @@ -194,6 +194,7 @@ static const struct wined3d_extension_map gl_extension_map[] = {"GL_EXT_polygon_offset_clamp", ARB_POLYGON_OFFSET_CLAMP }, {"GL_EXT_provoking_vertex", EXT_PROVOKING_VERTEX }, {"GL_EXT_secondary_color", EXT_SECONDARY_COLOR }, + {"GL_EXT_shader_integer_mix", EXT_SHADER_INTEGER_MIX }, {"GL_EXT_stencil_two_side", EXT_STENCIL_TWO_SIDE }, {"GL_EXT_stencil_wrap", EXT_STENCIL_WRAP }, {"GL_EXT_texture3D", EXT_TEXTURE3D }, @@ -3390,6 +3391,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter_gl *adapter_gl, {ARB_DERIVATIVE_CONTROL, MAKEDWORD_VERSION(4, 5)}, {ARB_SHADER_TEXTURE_IMAGE_SAMPLES, MAKEDWORD_VERSION(4, 5)}, {ARB_TEXTURE_BARRIER, MAKEDWORD_VERSION(4, 5)}, + {EXT_SHADER_INTEGER_MIX, MAKEDWORD_VERSION(4, 5)},
{ARB_PIPELINE_STATISTICS_QUERY, MAKEDWORD_VERSION(4, 6)}, {ARB_POLYGON_OFFSET_CLAMP, MAKEDWORD_VERSION(4, 6)}, diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 59dd82c19a5..9976c8dc211 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -4340,9 +4340,11 @@ static void shader_glsl_to_uint(const struct wined3d_shader_instruction *ins) shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src_param);
if (mask_size > 1) - shader_addline(buffer, "uvec%u(max(%s, vec%u(0.0))));\n", mask_size, src_param.param_str, mask_size); + shader_addline(buffer, "mix(uvec%u(max(%s, vec%u(0.0))), uvec%u(0xffffffffu), greaterThanEqual(%s, vec%u(4294967296.0))));\n", + mask_size, src_param.param_str, mask_size, mask_size, src_param.param_str, mask_size); else - shader_addline(buffer, "uint(max(%s, 0)));\n", src_param.param_str); + shader_addline(buffer, "mix(uint(max(%s, 0.0)), 0xffffffffu, %s >= 4294967296.0));\n", + src_param.param_str, src_param.param_str); }
static void shader_glsl_to_float(const struct wined3d_shader_instruction *ins) @@ -7566,6 +7568,8 @@ static void shader_glsl_enable_extensions(struct wined3d_string_buffer *buffer, shader_addline(buffer, "#extension GL_ARB_viewport_array : enable\n"); if (gl_info->supported[EXT_GPU_SHADER4]) shader_addline(buffer, "#extension GL_EXT_gpu_shader4 : enable\n"); + if (gl_info->supported[EXT_SHADER_INTEGER_MIX]) + shader_addline(buffer, "#extension GL_EXT_shader_integer_mix : enable\n"); if (gl_info->supported[EXT_TEXTURE_ARRAY]) shader_addline(buffer, "#extension GL_EXT_texture_array : enable\n"); if (gl_info->supported[EXT_TEXTURE_SHADOW_LOD]) @@ -11170,7 +11174,8 @@ static unsigned int shader_glsl_get_shader_model(const struct wined3d_gl_info *g { BOOL shader_model_4 = gl_info->glsl_version >= MAKEDWORD_VERSION(1, 50) && gl_info->supported[ARB_SHADER_BIT_ENCODING] - && gl_info->supported[ARB_TEXTURE_SWIZZLE]; + && gl_info->supported[ARB_TEXTURE_SWIZZLE] + && gl_info->supported[EXT_SHADER_INTEGER_MIX];
if (shader_model_4 && gl_info->supported[ARB_COMPUTE_SHADER] diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h index f5cec2ccdd7..b500e112de5 100644 --- a/dlls/wined3d/wined3d_gl.h +++ b/dlls/wined3d/wined3d_gl.h @@ -184,6 +184,7 @@ enum wined3d_gl_extension EXT_POINT_PARAMETERS, EXT_PROVOKING_VERTEX, EXT_SECONDARY_COLOR, + EXT_SHADER_INTEGER_MIX, EXT_STENCIL_TWO_SIDE, EXT_STENCIL_WRAP, EXT_TEXTURE3D,
From: Elizabeth Figura zfigura@codeweavers.com
Ported from 9dee15da5bae0a3cda898f0377b6f1f49abb8a05 in vkd3d. --- dlls/wined3d/glsl_shader.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 9976c8dc211..9ca3ea226ee 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -4325,7 +4325,19 @@ static void shader_glsl_cast(const struct wined3d_shader_instruction *ins,
static void shader_glsl_to_int(const struct wined3d_shader_instruction *ins) { - shader_glsl_cast(ins, "ivec", "int"); + struct wined3d_string_buffer *buffer = ins->ctx->buffer; + struct glsl_src_param src_param; + unsigned int mask_size; + DWORD write_mask; + + write_mask = shader_glsl_append_dst(buffer, ins); + mask_size = shader_glsl_get_write_mask_size(write_mask); + shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src_param); + + if (mask_size > 1) + shader_addline(buffer, "ivec%u(max(%s, vec%u(-2147483648.0))));\n", mask_size, src_param.param_str, mask_size); + else + shader_addline(buffer, "int(max(%s, -2147483648.0)));\n", src_param.param_str); }
static void shader_glsl_to_uint(const struct wined3d_shader_instruction *ins)
From: Elizabeth Figura zfigura@codeweavers.com
Ported from a5b6162d258faa42a03e53af9fb513473b4255a3 in vkd3d. --- dlls/wined3d/glsl_shader.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 9ca3ea226ee..186264a428d 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -4335,9 +4335,11 @@ static void shader_glsl_to_int(const struct wined3d_shader_instruction *ins) shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src_param);
if (mask_size > 1) - shader_addline(buffer, "ivec%u(max(%s, vec%u(-2147483648.0))));\n", mask_size, src_param.param_str, mask_size); + shader_addline(buffer, "mix(ivec%u(max(%s, vec%u(-2147483648.0))), ivec%u(0x7fffffff), greaterThanEqual(%s, vec%u(2147483648.0))));\n", + mask_size, src_param.param_str, mask_size, mask_size, src_param.param_str, mask_size); else - shader_addline(buffer, "int(max(%s, -2147483648.0)));\n", src_param.param_str); + shader_addline(buffer, "mix(int(max(%s, -2147483648.0)), 0x7fffffff, %s >= 2147483648.0));\n", + src_param.param_str, src_param.param_str); }
static void shader_glsl_to_uint(const struct wined3d_shader_instruction *ins)
From: Elizabeth Figura zfigura@codeweavers.com
Ported from 257a351f37b7f17d2e80b5557593a9b0a4998963 in vkd3d. --- dlls/wined3d/glsl_shader.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 186264a428d..bec6c52fdbf 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -4335,11 +4335,11 @@ static void shader_glsl_to_int(const struct wined3d_shader_instruction *ins) shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src_param);
if (mask_size > 1) - shader_addline(buffer, "mix(ivec%u(max(%s, vec%u(-2147483648.0))), ivec%u(0x7fffffff), greaterThanEqual(%s, vec%u(2147483648.0))));\n", - mask_size, src_param.param_str, mask_size, mask_size, src_param.param_str, mask_size); + shader_addline(buffer, "mix(mix(ivec%u(max(%s, vec%u(-2147483648.0))), ivec%u(0x7fffffff), greaterThanEqual(%s, vec%u(2147483648.0))), ivec%u(0), isnan(%s)));\n", + mask_size, src_param.param_str, mask_size, mask_size, src_param.param_str, mask_size, mask_size, src_param.param_str); else - shader_addline(buffer, "mix(int(max(%s, -2147483648.0)), 0x7fffffff, %s >= 2147483648.0));\n", - src_param.param_str, src_param.param_str); + shader_addline(buffer, "mix(mix(int(max(%s, -2147483648.0)), 0x7fffffff, %s >= 2147483648.0), 0, isnan(%s)));\n", + src_param.param_str, src_param.param_str, src_param.param_str); }
static void shader_glsl_to_uint(const struct wined3d_shader_instruction *ins)
This merge request was approved by Jan Sikorski.