mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
vkd3d-shader/spirv: Support 64-bit register info component type in spirv_compiler_emit_load_reg().
For 64-bit indexable temps (and any other 64-bit declarations) the write mask must not be converted.
This commit is contained in:
parent
83a67366da
commit
47e56cdfed
Notes:
Alexandre Julliard
2024-03-27 23:07:08 +01:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/707
@ -4094,7 +4094,7 @@ static uint32_t spirv_compiler_emit_load_reg(struct spirv_compiler *compiler,
|
||||
struct vkd3d_shader_register_info reg_info;
|
||||
unsigned int component_count;
|
||||
uint32_t type_id, val_id;
|
||||
uint32_t write_mask32;
|
||||
uint32_t val_write_mask;
|
||||
|
||||
if (reg->type == VKD3DSPR_IMMCONST)
|
||||
return spirv_compiler_emit_load_constant(compiler, reg, swizzle, write_mask);
|
||||
@ -4114,17 +4114,17 @@ static uint32_t spirv_compiler_emit_load_reg(struct spirv_compiler *compiler,
|
||||
type_id = vkd3d_spirv_get_type_id(builder, component_type, component_count);
|
||||
return vkd3d_spirv_get_op_undef(builder, type_id);
|
||||
}
|
||||
assert(reg_info.component_type != VKD3D_SHADER_COMPONENT_DOUBLE);
|
||||
spirv_compiler_emit_dereference_register(compiler, reg, ®_info);
|
||||
|
||||
write_mask32 = data_type_is_64_bit(reg->data_type) ? vsir_write_mask_32_from_64(write_mask) : write_mask;
|
||||
val_write_mask = (data_type_is_64_bit(reg->data_type) && !component_type_is_64_bit(reg_info.component_type))
|
||||
? vsir_write_mask_32_from_64(write_mask) : write_mask;
|
||||
|
||||
/* Intermediate value (no storage class). */
|
||||
if (reg_info.storage_class == SpvStorageClassMax)
|
||||
{
|
||||
val_id = reg_info.id;
|
||||
}
|
||||
else if (vsir_write_mask_component_count(write_mask32) == 1)
|
||||
else if (vsir_write_mask_component_count(val_write_mask) == 1)
|
||||
{
|
||||
return spirv_compiler_emit_load_scalar(compiler, reg, swizzle, write_mask, ®_info);
|
||||
}
|
||||
@ -4137,7 +4137,7 @@ static uint32_t spirv_compiler_emit_load_reg(struct spirv_compiler *compiler,
|
||||
|
||||
swizzle = data_type_is_64_bit(reg->data_type) ? vsir_swizzle_32_from_64(swizzle) : swizzle;
|
||||
val_id = spirv_compiler_emit_swizzle(compiler,
|
||||
val_id, reg_info.write_mask, reg_info.component_type, swizzle, write_mask32);
|
||||
val_id, reg_info.write_mask, reg_info.component_type, swizzle, val_write_mask);
|
||||
|
||||
if (component_type != reg_info.component_type)
|
||||
{
|
||||
|
@ -1611,6 +1611,11 @@ static inline enum vkd3d_shader_component_type vkd3d_component_type_from_resourc
|
||||
}
|
||||
}
|
||||
|
||||
static inline bool component_type_is_64_bit(enum vkd3d_shader_component_type component_type)
|
||||
{
|
||||
return component_type == VKD3D_SHADER_COMPONENT_DOUBLE || component_type == VKD3D_SHADER_COMPONENT_UINT64;
|
||||
}
|
||||
|
||||
enum vkd3d_shader_input_sysval_semantic vkd3d_siv_from_sysval_indexed(enum vkd3d_shader_sysval_semantic sysval,
|
||||
unsigned int index);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user