diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index bbf8ba78e..d223edfd1 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -749,6 +749,21 @@ bool vsir_signature_find_sysval(const struct shader_signature *signature, return false; } +unsigned int vsir_signature_next_location(const struct shader_signature *signature) +{ + unsigned int i, max_row; + + if (!signature) + return 0; + + for (i = 0, max_row = 0; i < signature->element_count; ++i) + { + max_row = max(max_row, signature->elements[i].register_index + signature->elements[i].register_count); + } + + return max_row; +} + struct vkd3d_shader_descriptor_info1 *vsir_program_add_descriptor(struct vsir_program *program, enum vkd3d_shader_descriptor_type type, unsigned int register_id, const struct vkd3d_shader_register_range *range, @@ -8076,9 +8091,9 @@ static enum vkd3d_result vsir_program_insert_clip_planes(struct vsir_program *pr unsigned int low_signature_idx = ~0u, high_signature_idx = ~0u; const struct vkd3d_shader_parameter1 *mask_parameter = NULL; uint32_t position_signature_idx, position_temp, mask; + unsigned int plane_count, next_register_index; struct signature_element *clip_element; struct vkd3d_shader_instruction *ins; - unsigned int plane_count; int ret; if (program->shader_version.type != VKD3D_SHADER_TYPE_VERTEX) @@ -8134,16 +8149,18 @@ static enum vkd3d_result vsir_program_insert_clip_planes(struct vsir_program *pr plane_count = vkd3d_popcount(mask); /* Register mask is ignored since we operate after I/O normalisation. */ + next_register_index = vsir_signature_next_location(signature); if (!(clip_element = add_signature_element(signature, "SV_ClipDistance", 0, - vkd3d_write_mask_from_component_count(min(plane_count, 4)), 0, VKD3DSIM_NONE))) + vkd3d_write_mask_from_component_count(min(plane_count, 4)), next_register_index, VKD3DSIM_NONE))) return VKD3D_ERROR_OUT_OF_MEMORY; low_signature_idx = clip_element - signature->elements; clip_element->sysval_semantic = VKD3D_SHADER_SV_CLIP_DISTANCE; if (plane_count > 4) { + next_register_index = vsir_signature_next_location(signature); if (!(clip_element = add_signature_element(signature, "SV_ClipDistance", 1, - vkd3d_write_mask_from_component_count(plane_count - 4), 0, VKD3DSIM_NONE))) + vkd3d_write_mask_from_component_count(plane_count - 4), next_register_index, VKD3DSIM_NONE))) return VKD3D_ERROR_OUT_OF_MEMORY; high_signature_idx = clip_element - signature->elements; clip_element->sysval_semantic = VKD3D_SHADER_SV_CLIP_DISTANCE; diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 57a686e3e..dcff833f4 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -5552,18 +5552,6 @@ static bool needs_private_io_variable(const struct vkd3d_spirv_builtin *builtin) return builtin && builtin->fixup_pfn; } -static unsigned int shader_signature_next_location(const struct shader_signature *signature) -{ - unsigned int i, max_row; - - if (!signature) - return 0; - - for (i = 0, max_row = 0; i < signature->element_count; ++i) - max_row = max(max_row, signature->elements[i].register_index + signature->elements[i].register_count); - return max_row; -} - static const struct vkd3d_symbol *spirv_compiler_emit_io_register(struct spirv_compiler *compiler, const struct vkd3d_shader_dst_param *dst) { @@ -5720,7 +5708,7 @@ static void spirv_compiler_emit_input(struct spirv_compiler *compiler, if (reg_type == VKD3DSPR_PATCHCONST) { vkd3d_spirv_build_op_decorate(builder, input_id, SpvDecorationPatch, NULL, 0); - location += shader_signature_next_location(&compiler->program->input_signature); + location += vsir_signature_next_location(&compiler->program->input_signature); } vkd3d_spirv_build_op_decorate1(builder, input_id, SpvDecorationLocation, location); if (component_idx) @@ -5996,7 +5984,7 @@ static void spirv_compiler_emit_output(struct spirv_compiler *compiler, unsigned int location = signature_element->target_location; if (is_patch_constant) - location += shader_signature_next_location(&compiler->program->output_signature); + location += vsir_signature_next_location(&compiler->program->output_signature); else if (compiler->shader_type == VKD3D_SHADER_TYPE_PIXEL && signature_element->sysval_semantic == VKD3D_SHADER_SV_TARGET) location = signature_element->semantic_index; diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 22758b566..2fb70bdb4 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -1211,6 +1211,7 @@ struct signature_element *vsir_signature_find_element_for_reg(const struct shade unsigned int reg_idx, unsigned int write_mask); bool vsir_signature_find_sysval(const struct shader_signature *signature, enum vkd3d_shader_sysval_semantic sysval, unsigned int semantic_index, unsigned int *element_index); +unsigned int vsir_signature_next_location(const struct shader_signature *signature); void shader_signature_cleanup(struct shader_signature *signature); struct vsir_features