From: Conor McCarthy cmccarthy@codeweavers.com
--- libs/vkd3d-shader/d3dbc.c | 1 + libs/vkd3d-shader/dxbc.c | 1 + libs/vkd3d-shader/spirv.c | 18 ++++++++++++++++-- libs/vkd3d-shader/vkd3d_shader_private.h | 1 + 4 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d-shader/d3dbc.c b/libs/vkd3d-shader/d3dbc.c index ed81137d..2e5a130d 100644 --- a/libs/vkd3d-shader/d3dbc.c +++ b/libs/vkd3d-shader/d3dbc.c @@ -662,6 +662,7 @@ static void shader_sm1_read_immconst(struct vkd3d_shader_sm1_parser *sm1, const src_param->reg.idx[2].offset = ~0u; src_param->reg.idx[2].rel_addr = NULL; src_param->reg.immconst_type = type; + src_param->reg.immconst_data_type = data_type; memcpy(src_param->reg.u.immconst_uint, *ptr, count * sizeof(uint32_t)); src_param->swizzle = VKD3D_SHADER_NO_SWIZZLE; src_param->modifiers = 0; diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c index 4041e0f5..9a71cec9 100644 --- a/libs/vkd3d-shader/dxbc.c +++ b/libs/vkd3d-shader/dxbc.c @@ -1198,6 +1198,7 @@ static bool shader_sm4_read_param(struct vkd3d_shader_sm4_parser *priv, const ui enum vkd3d_sm4_dimension dimension = (token & VKD3D_SM4_DIMENSION_MASK) >> VKD3D_SM4_DIMENSION_SHIFT; unsigned int dword_count;
+ param->immconst_data_type = data_type; switch (dimension) { case VKD3D_SM4_DIMENSION_SCALAR: diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index f0cfee47..75211980 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -3491,8 +3491,10 @@ static uint32_t spirv_compiler_emit_load_constant(struct spirv_compiler *compile const struct vkd3d_shader_register *reg, DWORD swizzle, DWORD write_mask) { unsigned int component_count = vkd3d_write_mask_component_count(write_mask); + struct vkd3d_spirv_builder *builder = &compiler->spirv_builder; uint32_t values[VKD3D_VEC4_SIZE] = {0}; unsigned int i, j; + uint32_t val_id;
assert(reg->type == VKD3DSPR_IMMCONST);
@@ -3510,16 +3512,23 @@ static uint32_t spirv_compiler_emit_load_constant(struct spirv_compiler *compile } }
- return spirv_compiler_get_constant(compiler, + val_id = spirv_compiler_get_constant(compiler, vkd3d_component_type_from_data_type(reg->data_type), component_count, values); + if (reg->immconst_data_type != reg->data_type) + val_id = vkd3d_spirv_build_op_bitcast(builder, vkd3d_spirv_get_type_id(builder, + vkd3d_component_type_from_data_type(reg->immconst_data_type), component_count), val_id); + + return val_id; }
static uint32_t spirv_compiler_emit_load_constant64(struct spirv_compiler *compiler, const struct vkd3d_shader_register *reg, DWORD swizzle, DWORD write_mask) { unsigned int component_count = vkd3d_write_mask_component_count(write_mask); + struct vkd3d_spirv_builder *builder = &compiler->spirv_builder; uint64_t values[VKD3D_DVEC2_SIZE] = {0}; unsigned int i, j; + uint32_t val_id;
assert(reg->type == VKD3DSPR_IMMCONST64);
@@ -3537,8 +3546,13 @@ static uint32_t spirv_compiler_emit_load_constant64(struct spirv_compiler *compi } }
- return spirv_compiler_get_constant64(compiler, + val_id = spirv_compiler_get_constant64(compiler, vkd3d_component_type_from_data_type(reg->data_type), component_count, values); + if (reg->immconst_data_type != reg->data_type) + val_id = vkd3d_spirv_build_op_bitcast(builder, vkd3d_spirv_get_type_id(builder, + vkd3d_component_type_from_data_type(reg->immconst_data_type), component_count), val_id); + + return val_id; }
static uint32_t spirv_compiler_emit_load_scalar(struct spirv_compiler *compiler, diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 6c5a1917..d5fa1786 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -674,6 +674,7 @@ struct vkd3d_shader_register enum vkd3d_data_type data_type; struct vkd3d_shader_register_index idx[3]; enum vkd3d_immconst_type immconst_type; + enum vkd3d_data_type immconst_data_type; union { DWORD immconst_uint[VKD3D_VEC4_SIZE];