From: Henri Verbeet hverbeet@codeweavers.com
--- libs/vkd3d-shader/spirv.c | 4 ++-- libs/vkd3d-shader/tpf.c | 8 ++++---- libs/vkd3d-shader/vkd3d_shader_private.h | 3 +-- 3 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index e837fc2ef..7efe882f4 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -9763,8 +9763,8 @@ static int spirv_compiler_generate_spirv(struct spirv_compiler *compiler, compiler->block_names = parser->shader_desc.block_names; compiler->block_name_count = parser->shader_desc.block_name_count;
- compiler->input_control_point_count = shader_desc->input_control_point_count; - compiler->output_control_point_count = shader_desc->output_control_point_count; + compiler->input_control_point_count = program->input_control_point_count; + compiler->output_control_point_count = program->output_control_point_count;
if (compiler->shader_type != VKD3D_SHADER_TYPE_HULL) spirv_compiler_emit_shader_signature_outputs(compiler); diff --git a/libs/vkd3d-shader/tpf.c b/libs/vkd3d-shader/tpf.c index df10cd254..50146c2c7 100644 --- a/libs/vkd3d-shader/tpf.c +++ b/libs/vkd3d-shader/tpf.c @@ -1051,7 +1051,7 @@ static void shader_sm4_read_dcl_input_primitive(struct vkd3d_shader_instruction { ins->declaration.primitive_type.type = VKD3D_PT_PATCH; ins->declaration.primitive_type.patch_vertex_count = primitive_type - VKD3D_SM5_INPUT_PT_PATCH1 + 1; - priv->p.shader_desc.input_control_point_count = ins->declaration.primitive_type.patch_vertex_count; + priv->p.program.input_control_point_count = ins->declaration.primitive_type.patch_vertex_count; } else if (primitive_type >= ARRAY_SIZE(input_primitive_type_table)) { @@ -1060,7 +1060,7 @@ static void shader_sm4_read_dcl_input_primitive(struct vkd3d_shader_instruction else { ins->declaration.primitive_type.type = input_primitive_type_table[primitive_type].vkd3d_type; - priv->p.shader_desc.input_control_point_count = input_primitive_type_table[primitive_type].control_point_count; + priv->p.program.input_control_point_count = input_primitive_type_table[primitive_type].control_point_count; }
if (ins->declaration.primitive_type.type == VKD3D_PT_UNDEFINED) @@ -1174,9 +1174,9 @@ static void shader_sm5_read_control_point_count(struct vkd3d_shader_instruction >> VKD3D_SM5_CONTROL_POINT_COUNT_SHIFT;
if (opcode == VKD3D_SM5_OP_DCL_INPUT_CONTROL_POINT_COUNT) - priv->p.shader_desc.input_control_point_count = ins->declaration.count; + priv->p.program.input_control_point_count = ins->declaration.count; else - priv->p.shader_desc.output_control_point_count = ins->declaration.count; + priv->p.program.output_control_point_count = ins->declaration.count; }
static void shader_sm5_read_dcl_tessellator_domain(struct vkd3d_shader_instruction *ins, uint32_t opcode, diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 887c47fcf..332b39af7 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -1020,8 +1020,6 @@ struct vkd3d_shader_desc struct shader_signature output_signature; struct shader_signature patch_constant_signature;
- unsigned int input_control_point_count, output_control_point_count; - unsigned int block_count;
struct @@ -1271,6 +1269,7 @@ struct vsir_program struct vkd3d_shader_version shader_version; struct vkd3d_shader_instruction_array instructions;
+ unsigned int input_control_point_count, output_control_point_count; unsigned int temp_count; unsigned int ssa_count; bool use_vocp;
From: Henri Verbeet hverbeet@codeweavers.com
--- libs/vkd3d-shader/dxil.c | 2 +- libs/vkd3d-shader/ir.c | 16 +++++++++------- libs/vkd3d-shader/spirv.c | 2 +- libs/vkd3d-shader/vkd3d_shader_private.h | 3 +-- 4 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index 15cc380f5..ca3895779 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -5489,7 +5489,7 @@ static enum vkd3d_result sm6_function_emit_blocks(const struct sm6_function *fun { unsigned int i;
- sm6->p.shader_desc.block_count = function->block_count; + sm6->p.program.block_count = function->block_count;
for (i = 0; i < function->block_count; ++i) { diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index a797e4930..2a53be8d5 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -2224,6 +2224,7 @@ static enum vkd3d_result cf_flattener_iterate_instruction_array(struct cf_flatte
static enum vkd3d_result flatten_control_flow_constructs(struct vkd3d_shader_parser *parser) { + struct vsir_program *program = &parser->program; struct cf_flattener flattener = {0}; enum vkd3d_result result;
@@ -2233,10 +2234,10 @@ static enum vkd3d_result flatten_control_flow_constructs(struct vkd3d_shader_par if (result >= 0) { vkd3d_free(parser->program.instructions.elements); - parser->program.instructions.elements = flattener.instructions; - parser->program.instructions.capacity = flattener.instruction_capacity; - parser->program.instructions.count = flattener.instruction_count; - parser->shader_desc.block_count = flattener.block_id; + program->instructions.elements = flattener.instructions; + program->instructions.capacity = flattener.instruction_capacity; + program->instructions.count = flattener.instruction_count; + program->block_count = flattener.block_id; } else { @@ -2524,9 +2525,10 @@ static void vsir_validate_register(struct validation_context *ctx, /* Index == 0 is invalid, but it is temporarily allowed * for intermediate stages. Once we support validation * dialects we can selectively check for that. */ - if (reg->idx[0].offset > ctx->parser->shader_desc.block_count) - validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_INDEX, "LABEL register index %u exceeds the maximum count %u.", - reg->idx[0].offset, ctx->parser->shader_desc.block_count); + if (reg->idx[0].offset > ctx->program->block_count) + validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_INDEX, + "LABEL register index %u exceeds the maximum count %u.", + reg->idx[0].offset, ctx->program->block_count); break;
case VKD3DSPR_NULL: diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 7efe882f4..7da068226 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -9747,7 +9747,7 @@ static int spirv_compiler_generate_spirv(struct spirv_compiler *compiler, compiler->location.column = 0; compiler->location.line = 1;
- if (parser->shader_desc.block_count && !spirv_compiler_init_blocks(compiler, parser->shader_desc.block_count)) + if (program->block_count && !spirv_compiler_init_blocks(compiler, program->block_count)) return VKD3D_ERROR_OUT_OF_MEMORY;
instructions = program->instructions; diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 332b39af7..5bf40359b 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -1020,8 +1020,6 @@ struct vkd3d_shader_desc struct shader_signature output_signature; struct shader_signature patch_constant_signature;
- unsigned int block_count; - struct { uint32_t used, external; @@ -1270,6 +1268,7 @@ struct vsir_program struct vkd3d_shader_instruction_array instructions;
unsigned int input_control_point_count, output_control_point_count; + unsigned int block_count; unsigned int temp_count; unsigned int ssa_count; bool use_vocp;
From: Henri Verbeet hverbeet@codeweavers.com
--- libs/vkd3d-shader/dxbc.c | 5 ----- libs/vkd3d-shader/ir.c | 9 +++++++-- libs/vkd3d-shader/spirv.c | 4 ++-- libs/vkd3d-shader/vkd3d_shader_private.h | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c index edb65d2e9..37ebc73c0 100644 --- a/libs/vkd3d-shader/dxbc.c +++ b/libs/vkd3d-shader/dxbc.c @@ -552,14 +552,9 @@ static int shdr_handler(const struct vkd3d_shader_dxbc_section_desc *section,
void free_shader_desc(struct vkd3d_shader_desc *desc) { - size_t i; - shader_signature_cleanup(&desc->input_signature); shader_signature_cleanup(&desc->output_signature); shader_signature_cleanup(&desc->patch_constant_signature); - for (i = 0; i < desc->block_name_count; ++i) - vkd3d_free((void *)desc->block_names[i]); - vkd3d_free(desc->block_names); }
int shader_extract_from_dxbc(const struct vkd3d_shader_code *dxbc, diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 2a53be8d5..d53b82f0c 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -26,6 +26,11 @@ bool vsir_program_init(struct vsir_program *program, const struct vkd3d_shader_v
void vsir_program_cleanup(struct vsir_program *program) { + size_t i; + + for (i = 0; i < program->block_name_count; ++i) + vkd3d_free((void *)program->block_names[i]); + vkd3d_free(program->block_names); shader_instruction_array_destroy(&program->instructions); }
@@ -2246,8 +2251,8 @@ static enum vkd3d_result flatten_control_flow_constructs(struct vkd3d_shader_par
vkd3d_free(flattener.control_flow_info); /* Simpler to always free these in free_shader_desc(). */ - parser->shader_desc.block_names = flattener.block_names; - parser->shader_desc.block_name_count = flattener.block_name_count; + program->block_names = flattener.block_names; + program->block_name_count = flattener.block_name_count;
return result; } diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 7da068226..546b9a5a8 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -9760,8 +9760,8 @@ static int spirv_compiler_generate_spirv(struct spirv_compiler *compiler, memset(&shader_desc->output_signature, 0, sizeof(shader_desc->output_signature)); memset(&shader_desc->patch_constant_signature, 0, sizeof(shader_desc->patch_constant_signature)); compiler->use_vocp = program->use_vocp; - compiler->block_names = parser->shader_desc.block_names; - compiler->block_name_count = parser->shader_desc.block_name_count; + compiler->block_names = program->block_names; + compiler->block_name_count = program->block_name_count;
compiler->input_control_point_count = program->input_control_point_count; compiler->output_control_point_count = program->output_control_point_count; diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 5bf40359b..9a00b7bc2 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -1024,9 +1024,6 @@ struct vkd3d_shader_desc { uint32_t used, external; } flat_constant_count[3]; - - const char **block_names; - size_t block_name_count; };
struct vkd3d_shader_register_semantic @@ -1272,6 +1269,9 @@ struct vsir_program unsigned int temp_count; unsigned int ssa_count; bool use_vocp; + + const char **block_names; + size_t block_name_count; };
bool vsir_program_init(struct vsir_program *program, const struct vkd3d_shader_version *version, unsigned int reserve);