mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-11-21 16:46:41 -08:00
vkd3d-shader/ir: Don't shift register write masks by the component index in shader_dst_param_io_normalise().
This loses information about which source elements they want, making "o.yzw = reg.xxyz" compile to "o = reg.xxy" instead of "o = reg.xyz".
This commit is contained in:
parent
b5ccc0e705
commit
c571a45e65
Notes:
Henri Verbeet
2024-10-07 17:54:27 +02:00
Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1151
@ -1667,7 +1667,6 @@ static bool shader_dst_param_io_normalise(struct vkd3d_shader_dst_param *dst_par
|
|||||||
vkd3d_unreachable();
|
vkd3d_unreachable();
|
||||||
e = &signature->elements[element_idx];
|
e = &signature->elements[element_idx];
|
||||||
|
|
||||||
dst_param->write_mask >>= vsir_write_mask_get_component_idx(e->mask);
|
|
||||||
if (is_io_dcl)
|
if (is_io_dcl)
|
||||||
{
|
{
|
||||||
/* Validated in the TPF reader. */
|
/* Validated in the TPF reader. */
|
||||||
|
@ -5510,7 +5510,7 @@ static void spirv_compiler_emit_output(struct spirv_compiler *compiler,
|
|||||||
const struct shader_signature *shader_signature;
|
const struct shader_signature *shader_signature;
|
||||||
const struct vkd3d_spirv_builtin *builtin;
|
const struct vkd3d_spirv_builtin *builtin;
|
||||||
enum vkd3d_shader_sysval_semantic sysval;
|
enum vkd3d_shader_sysval_semantic sysval;
|
||||||
uint32_t write_mask, reg_write_mask;
|
uint32_t write_mask;
|
||||||
bool use_private_variable = false;
|
bool use_private_variable = false;
|
||||||
struct vkd3d_symbol reg_symbol;
|
struct vkd3d_symbol reg_symbol;
|
||||||
SpvStorageClass storage_class;
|
SpvStorageClass storage_class;
|
||||||
@ -5561,7 +5561,6 @@ static void spirv_compiler_emit_output(struct spirv_compiler *compiler,
|
|||||||
use_private_variable = true;
|
use_private_variable = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
reg_write_mask = write_mask >> component_idx;
|
|
||||||
vkd3d_symbol_make_io(®_symbol, reg_type, element_idx);
|
vkd3d_symbol_make_io(®_symbol, reg_type, element_idx);
|
||||||
|
|
||||||
if (rb_get(&compiler->symbol_table, ®_symbol))
|
if (rb_get(&compiler->symbol_table, ®_symbol))
|
||||||
@ -5639,7 +5638,7 @@ static void spirv_compiler_emit_output(struct spirv_compiler *compiler,
|
|||||||
|
|
||||||
vkd3d_symbol_set_register_info(®_symbol, var_id, storage_class,
|
vkd3d_symbol_set_register_info(®_symbol, var_id, storage_class,
|
||||||
use_private_variable ? VKD3D_SHADER_COMPONENT_FLOAT : component_type,
|
use_private_variable ? VKD3D_SHADER_COMPONENT_FLOAT : component_type,
|
||||||
use_private_variable ? VKD3DSP_WRITEMASK_ALL : reg_write_mask);
|
use_private_variable ? VKD3DSP_WRITEMASK_ALL : write_mask);
|
||||||
reg_symbol.info.reg.is_aggregate = array_sizes[0] || array_sizes[1];
|
reg_symbol.info.reg.is_aggregate = array_sizes[0] || array_sizes[1];
|
||||||
VKD3D_ASSERT(!builtin || !builtin->spirv_array_size || use_private_variable || array_sizes[0] || array_sizes[1]);
|
VKD3D_ASSERT(!builtin || !builtin->spirv_array_size || use_private_variable || array_sizes[0] || array_sizes[1]);
|
||||||
|
|
||||||
@ -5650,7 +5649,7 @@ static void spirv_compiler_emit_output(struct spirv_compiler *compiler,
|
|||||||
if (use_private_variable)
|
if (use_private_variable)
|
||||||
{
|
{
|
||||||
compiler->private_output_variable[element_idx] = var_id;
|
compiler->private_output_variable[element_idx] = var_id;
|
||||||
compiler->private_output_variable_write_mask[element_idx] |= reg_write_mask;
|
compiler->private_output_variable_write_mask[element_idx] |= write_mask >> component_idx;
|
||||||
if (!compiler->epilogue_function_id)
|
if (!compiler->epilogue_function_id)
|
||||||
compiler->epilogue_function_id = vkd3d_spirv_alloc_id(builder);
|
compiler->epilogue_function_id = vkd3d_spirv_alloc_id(builder);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user