[PATCH] wined3d: Implement casting int to uint.
Zebediah Figura
z.figura12 at gmail.com
Thu Feb 6 10:42:59 CST 2020
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
This supersedes <https://source.winehq.org/patches/data/177793>.
dlls/wined3d/glsl_shader.c | 33 ++++++++++++++++++++++++++-------
1 file changed, 26 insertions(+), 7 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 25e97723255..4a2fbce553e 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -3125,7 +3125,7 @@ static void shader_glsl_get_swizzle(const struct wined3d_shader_src_param *param
}
static void shader_glsl_sprintf_cast(struct wined3d_string_buffer *dst_param, const char *src_param,
- enum wined3d_data_type dst_data_type, enum wined3d_data_type src_data_type)
+ enum wined3d_data_type dst_data_type, enum wined3d_data_type src_data_type, unsigned int size)
{
if (dst_data_type == src_data_type)
{
@@ -3156,10 +3156,22 @@ static void shader_glsl_sprintf_cast(struct wined3d_string_buffer *dst_param, co
return;
}
- if (src_data_type == WINED3D_DATA_INT && dst_data_type == WINED3D_DATA_FLOAT)
+ if (src_data_type == WINED3D_DATA_INT)
{
- string_buffer_sprintf(dst_param, "intBitsToFloat(%s)", src_param);
- return;
+ switch (dst_data_type)
+ {
+ case WINED3D_DATA_FLOAT:
+ string_buffer_sprintf(dst_param, "intBitsToFloat(%s)", src_param);
+ return;
+ case WINED3D_DATA_UINT:
+ if (size == 1)
+ string_buffer_sprintf(dst_param, "uint(%s)", src_param);
+ else
+ string_buffer_sprintf(dst_param, "uvec%u(%s)", size, src_param);
+ return;
+ default:
+ break;
+ }
}
FIXME("Unhandled cast from %#x to %#x.\n", src_data_type, dst_data_type);
@@ -3179,6 +3191,7 @@ static void shader_glsl_add_src_param_ext(const struct wined3d_shader_context *c
enum wined3d_data_type param_data_type;
BOOL is_color = FALSE;
char swizzle_str[6];
+ unsigned int size;
glsl_src->param_str[0] = '\0';
swizzle_str[0] = '\0';
@@ -3190,24 +3203,30 @@ static void shader_glsl_add_src_param_ext(const struct wined3d_shader_context *c
{
case WINED3DSPR_IMMCONST:
param_data_type = data_type;
+ size = wined3d_src->reg.immconst_type == WINED3D_IMMCONST_SCALAR ? 1 : 4;
break;
case WINED3DSPR_FORKINSTID:
case WINED3DSPR_GSINSTID:
case WINED3DSPR_JOININSTID:
- case WINED3DSPR_LOCALTHREADID:
case WINED3DSPR_LOCALTHREADINDEX:
case WINED3DSPR_OUTPOINTID:
case WINED3DSPR_PRIMID:
+ param_data_type = WINED3D_DATA_INT;
+ size = 1;
+ break;
+ case WINED3DSPR_LOCALTHREADID:
case WINED3DSPR_THREADGROUPID:
case WINED3DSPR_THREADID:
param_data_type = WINED3D_DATA_INT;
+ size = 3;
break;
default:
param_data_type = WINED3D_DATA_FLOAT;
+ size = 4;
break;
}
- shader_glsl_sprintf_cast(param_str, reg_name->buffer, data_type, param_data_type);
+ shader_glsl_sprintf_cast(param_str, reg_name->buffer, data_type, param_data_type, size);
shader_glsl_gen_modifier(wined3d_src->modifiers, param_str->buffer, swizzle_str, glsl_src->param_str);
string_buffer_release(priv->string_buffers, reg_name);
@@ -7520,7 +7539,7 @@ static void shader_glsl_generate_color_output(struct wined3d_string_buffer *buff
dst_data_type = component_type_info[output->component_type].data_type;
shader_addline(buffer, "color_out%u = ", output->semantic_idx);
string_buffer_sprintf(src, "ps_out[%u]", output->semantic_idx);
- shader_glsl_sprintf_cast(assignment, src->buffer, dst_data_type, WINED3D_DATA_FLOAT);
+ shader_glsl_sprintf_cast(assignment, src->buffer, dst_data_type, WINED3D_DATA_FLOAT, 4);
swizzle = args->rt_alpha_swizzle & (1u << output->semantic_idx) ? ".argb" : "";
shader_addline(buffer, "%s%s;\n", assignment->buffer, swizzle);
}
--
2.25.0
More information about the wine-devel
mailing list