diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index 8c0ef8b8b..63dcbd3c0 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -919,6 +919,7 @@ struct sm6_parser struct vkd3d_shader_dst_param *input_params; struct vkd3d_shader_dst_param *patch_constant_params; uint32_t io_regs_declared[VKD3D_BITMAP_SIZE(VKD3DSPR_COUNT)]; + struct vkd3d_shader_src_param *outpointid_param; struct sm6_function *functions; size_t function_count; @@ -4217,7 +4218,10 @@ static void sm6_parser_init_signature(struct sm6_parser *sm6, const struct shade if (is_control_point) { if (reg_type == VKD3DSPR_OUTPUT) - param->reg.idx[count].rel_addr = vsir_program_create_outpointid_param(sm6->program); + { + VKD3D_ASSERT(sm6->outpointid_param); + param->reg.idx[count].rel_addr = sm6->outpointid_param; + } param->reg.idx[count++].offset = 0; } @@ -10007,6 +10011,14 @@ static enum vkd3d_result sm6_parser_signatures_init(struct sm6_parser *sm6, cons &program->patch_constant_signature, tessellator_domain, false)) < 0) return ret; + if (sm6->program->shader_version.type == VKD3D_SHADER_TYPE_HULL + && !(sm6->outpointid_param = vsir_program_create_outpointid_param(sm6->program))) + { + vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_OUT_OF_MEMORY, + "Failed to allocate outpointid parameter."); + return VKD3D_ERROR_OUT_OF_MEMORY; + } + if ((ret = sm6_parser_init_input_signature(sm6, &program->input_signature)) < 0) return ret; diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index c28641cd1..5d2fe86b3 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -2784,9 +2784,6 @@ struct vkd3d_shader_src_param *vsir_program_create_outpointid_param(struct vsir_ struct vkd3d_shader_instruction_array *instructions = &program->instructions; struct vkd3d_shader_src_param *rel_addr; - if (instructions->outpointid_param) - return instructions->outpointid_param; - if (!(rel_addr = shader_src_param_allocator_get(&instructions->src_params, 1))) return NULL; @@ -2794,7 +2791,6 @@ struct vkd3d_shader_src_param *vsir_program_create_outpointid_param(struct vsir_ rel_addr->swizzle = 0; rel_addr->modifiers = 0; - instructions->outpointid_param = rel_addr; return rel_addr; } diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 5bcdcb5bc..527578711 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -1443,8 +1443,6 @@ struct vkd3d_shader_instruction_array struct vkd3d_shader_param_allocator src_params; struct vkd3d_shader_param_allocator dst_params; - - struct vkd3d_shader_src_param *outpointid_param; }; bool shader_instruction_array_reserve(struct vkd3d_shader_instruction_array *instructions, size_t reserve);