From 85b7b9c6b4b4500fd4182606aab3c58027978780 Mon Sep 17 00:00:00 2001 From: Francisco Casas Date: Mon, 6 Oct 2025 15:03:42 -0300 Subject: [PATCH] vkd3d-shader/ir: Introduce vsir_signature_element_is_array(). --- libs/vkd3d-shader/ir.c | 7 +++-- libs/vkd3d-shader/spirv.c | 6 ++--- libs/vkd3d-shader/vkd3d_shader_private.h | 33 ++++++++++++++++-------- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index d223edfd1..dd59aa4f1 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -3952,7 +3952,7 @@ static bool shader_dst_param_io_normalise(struct vkd3d_shader_dst_param *dst_par vkd3d_unreachable(); e = &signature->elements[element_idx]; - if ((e->register_count > 1 || vsir_sysval_semantic_is_tess_factor(e->sysval_semantic))) + if (vsir_signature_element_is_array(e)) id_idx = shader_register_normalise_arrayed_addressing(reg, id_idx, e->register_index); /* Replace the register index with the signature element index */ @@ -4034,7 +4034,7 @@ static void shader_src_param_io_normalise(struct vkd3d_shader_src_param *src_par } e = &signature->elements[element_idx]; - if ((e->register_count > 1 || vsir_sysval_semantic_is_tess_factor(e->sysval_semantic))) + if (vsir_signature_element_is_array(e)) id_idx = shader_register_normalise_arrayed_addressing(reg, id_idx, e->register_index); reg->idx[id_idx].offset = element_idx; reg->idx_count = id_idx + 1; @@ -10529,8 +10529,7 @@ static void vsir_validate_io_register(struct validation_context *ctx, const stru } element = &signature->elements[signature_idx]; - if (element->register_count > 1 || vsir_sysval_semantic_is_tess_factor(element->sysval_semantic)) - is_array = true; + is_array = vsir_signature_element_is_array(element); expected_idx_count = 1 + !!has_control_point + !!is_array; control_point_index = !!is_array; diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index dcff833f4..5dd529451 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -5646,11 +5646,9 @@ static void spirv_compiler_emit_input(struct spirv_compiler *compiler, array_sizes[0] = signature_element->register_count; array_sizes[1] = (reg_type == VKD3DSPR_PATCHCONST ? 0 : compiler->input_control_point_count); - if (array_sizes[0] == 1 && !vsir_sysval_semantic_is_tess_factor(signature_element->sysval_semantic) + if (!vsir_signature_element_is_array(signature_element) && (!vsir_sysval_semantic_is_clip_cull(signature_element->sysval_semantic) || array_sizes[1])) - { array_sizes[0] = 0; - } write_mask = signature_element->mask; @@ -5919,7 +5917,7 @@ static void spirv_compiler_emit_output(struct spirv_compiler *compiler, sysval = VKD3D_SHADER_SV_NONE; array_sizes[0] = signature_element->register_count; array_sizes[1] = (reg_type == VKD3DSPR_PATCHCONST ? 0 : compiler->output_control_point_count); - if (array_sizes[0] == 1 && !vsir_sysval_semantic_is_tess_factor(signature_element->sysval_semantic)) + if (!vsir_signature_element_is_array(signature_element)) array_sizes[0] = 0; builtin = vkd3d_get_spirv_builtin(compiler, reg_type, sysval); diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 2fb70bdb4..b01e62298 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -1166,6 +1166,17 @@ enum vkd3d_shader_input_sysval_semantic #define SIGNATURE_TARGET_LOCATION_UNUSED (~0u) +static inline bool vsir_sysval_semantic_is_tess_factor(enum vkd3d_shader_sysval_semantic sysval_semantic) +{ + return sysval_semantic >= VKD3D_SHADER_SV_TESS_FACTOR_QUADEDGE + && sysval_semantic <= VKD3D_SHADER_SV_TESS_FACTOR_LINEDEN; +} + +static inline bool vsir_sysval_semantic_is_clip_cull(enum vkd3d_shader_sysval_semantic sysval_semantic) +{ + return sysval_semantic == VKD3D_SHADER_SV_CLIP_DISTANCE || sysval_semantic == VKD3D_SHADER_SV_CULL_DISTANCE; +} + struct signature_element { /* sort_index is not a property of the signature element, it is just a @@ -1189,6 +1200,17 @@ struct signature_element unsigned int target_location; }; +static inline bool vsir_signature_element_is_array(const struct signature_element *element) +{ + enum vkd3d_shader_sysval_semantic semantic = element->sysval_semantic; + + if (element->register_count > 1) + return true; + if (vsir_sysval_semantic_is_tess_factor(semantic)) + return true; + return false; +} + struct shader_signature { struct signature_element *elements; @@ -1196,17 +1218,6 @@ struct shader_signature unsigned int element_count; }; -static inline bool vsir_sysval_semantic_is_tess_factor(enum vkd3d_shader_sysval_semantic sysval_semantic) -{ - return sysval_semantic >= VKD3D_SHADER_SV_TESS_FACTOR_QUADEDGE - && sysval_semantic <= VKD3D_SHADER_SV_TESS_FACTOR_LINEDEN; -} - -static inline bool vsir_sysval_semantic_is_clip_cull(enum vkd3d_shader_sysval_semantic sysval_semantic) -{ - return sysval_semantic == VKD3D_SHADER_SV_CLIP_DISTANCE || sysval_semantic == VKD3D_SHADER_SV_CULL_DISTANCE; -} - struct signature_element *vsir_signature_find_element_for_reg(const struct shader_signature *signature, unsigned int reg_idx, unsigned int write_mask); bool vsir_signature_find_sysval(const struct shader_signature *signature,