mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-04-13 05:43:18 -07:00
vkd3d-shader/ir: Use a separate allocation for the vsir program in struct vkd3d_shader_parser.
This commit is contained in:
committed by
Alexandre Julliard
parent
061dc39036
commit
9e4a790de1
Notes:
Alexandre Julliard
2024-05-16 23:13:19 +02:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/869
@@ -2305,7 +2305,7 @@ static struct vkd3d_shader_src_param *instruction_src_params_alloc(struct vkd3d_
|
||||
{
|
||||
struct vkd3d_shader_src_param *params;
|
||||
|
||||
if (!(params = vsir_program_get_src_params(&sm6->p.program, count)))
|
||||
if (!(params = vsir_program_get_src_params(sm6->p.program, count)))
|
||||
{
|
||||
ERR("Failed to allocate src params.\n");
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_OUT_OF_MEMORY,
|
||||
@@ -2322,7 +2322,7 @@ static struct vkd3d_shader_dst_param *instruction_dst_params_alloc(struct vkd3d_
|
||||
{
|
||||
struct vkd3d_shader_dst_param *params;
|
||||
|
||||
if (!(params = vsir_program_get_dst_params(&sm6->p.program, count)))
|
||||
if (!(params = vsir_program_get_dst_params(sm6->p.program, count)))
|
||||
{
|
||||
ERR("Failed to allocate dst params.\n");
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_OUT_OF_MEMORY,
|
||||
@@ -2504,7 +2504,7 @@ static void register_index_address_init(struct vkd3d_shader_register_index *idx,
|
||||
}
|
||||
else
|
||||
{
|
||||
struct vkd3d_shader_src_param *rel_addr = vsir_program_get_src_params(&sm6->p.program, 1);
|
||||
struct vkd3d_shader_src_param *rel_addr = vsir_program_get_src_params(sm6->p.program, 1);
|
||||
if (rel_addr)
|
||||
src_param_init_from_value(rel_addr, address);
|
||||
idx->offset = 0;
|
||||
@@ -2998,7 +2998,7 @@ static enum vkd3d_result value_allocate_constant_array(struct sm6_value *dst, co
|
||||
"Out of memory allocating an immediate constant buffer of count %u.", count);
|
||||
return VKD3D_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
if (!shader_instruction_array_add_icb(&sm6->p.program.instructions, icb))
|
||||
if (!shader_instruction_array_add_icb(&sm6->p.program->instructions, icb))
|
||||
{
|
||||
ERR("Failed to store icb object.\n");
|
||||
vkd3d_free(icb);
|
||||
@@ -3385,12 +3385,14 @@ static bool bitcode_parse_alignment(uint64_t encoded_alignment, unsigned int *al
|
||||
|
||||
static struct vkd3d_shader_instruction *sm6_parser_require_space(struct sm6_parser *sm6, size_t extra)
|
||||
{
|
||||
if (!shader_instruction_array_reserve(&sm6->p.program.instructions, sm6->p.program.instructions.count + extra))
|
||||
struct vkd3d_shader_instruction_array *instructions = &sm6->p.program->instructions;
|
||||
|
||||
if (!shader_instruction_array_reserve(instructions, instructions->count + extra))
|
||||
{
|
||||
ERR("Failed to allocate instruction.\n");
|
||||
return NULL;
|
||||
}
|
||||
return &sm6->p.program.instructions.elements[sm6->p.program.instructions.count];
|
||||
return &instructions->elements[instructions->count];
|
||||
}
|
||||
|
||||
/* Space should be reserved before calling this. It is intended to require no checking of the returned pointer. */
|
||||
@@ -3400,7 +3402,7 @@ static struct vkd3d_shader_instruction *sm6_parser_add_instruction(struct sm6_pa
|
||||
struct vkd3d_shader_instruction *ins = sm6_parser_require_space(sm6, 1);
|
||||
assert(ins);
|
||||
vsir_instruction_init(ins, &sm6->p.location, handler_idx);
|
||||
++sm6->p.program.instructions.count;
|
||||
++sm6->p.program->instructions.count;
|
||||
return ins;
|
||||
}
|
||||
|
||||
@@ -3755,9 +3757,9 @@ static enum vkd3d_result sm6_parser_globals_init(struct sm6_parser *sm6)
|
||||
}
|
||||
|
||||
/* Resolve initialiser forward references. */
|
||||
for (i = 0; i < sm6->p.program.instructions.count; ++i)
|
||||
for (i = 0; i < sm6->p.program->instructions.count; ++i)
|
||||
{
|
||||
ins = &sm6->p.program.instructions.elements[i];
|
||||
ins = &sm6->p.program->instructions.elements[i];
|
||||
if (ins->handler_idx == VKD3DSIH_DCL_INDEXABLE_TEMP && ins->declaration.indexable_temp.initialiser)
|
||||
{
|
||||
ins->declaration.indexable_temp.initialiser = resolve_forward_initialiser(
|
||||
@@ -3837,7 +3839,7 @@ static enum vkd3d_shader_register_type register_type_from_dxil_semantic_kind(
|
||||
static void sm6_parser_init_signature(struct sm6_parser *sm6, const struct shader_signature *s,
|
||||
bool is_input, enum vkd3d_shader_register_type reg_type, struct vkd3d_shader_dst_param *params)
|
||||
{
|
||||
enum vkd3d_shader_type shader_type = sm6->p.program.shader_version.type;
|
||||
enum vkd3d_shader_type shader_type = sm6->p.program->shader_version.type;
|
||||
bool is_patch_constant, is_control_point;
|
||||
struct vkd3d_shader_dst_param *param;
|
||||
const struct signature_element *e;
|
||||
@@ -3882,7 +3884,7 @@ 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 = instruction_array_create_outpointid_param(&sm6->p.program.instructions);
|
||||
param->reg.idx[count].rel_addr = instruction_array_create_outpointid_param(&sm6->p.program->instructions);
|
||||
param->reg.idx[count++].offset = 0;
|
||||
}
|
||||
|
||||
@@ -3908,7 +3910,7 @@ static void sm6_parser_init_input_signature(struct sm6_parser *sm6, const struct
|
||||
static void sm6_parser_init_patch_constant_signature(struct sm6_parser *sm6,
|
||||
const struct shader_signature *patch_constant_signature)
|
||||
{
|
||||
bool is_input = sm6->p.program.shader_version.type == VKD3D_SHADER_TYPE_DOMAIN;
|
||||
bool is_input = sm6->p.program->shader_version.type == VKD3D_SHADER_TYPE_DOMAIN;
|
||||
|
||||
sm6_parser_init_signature(sm6, patch_constant_signature, is_input, VKD3DSPR_PATCHCONST,
|
||||
sm6->patch_constant_params);
|
||||
@@ -5279,6 +5281,7 @@ static void sm6_parser_emit_dx_load_input(struct sm6_parser *sm6, enum dx_intrin
|
||||
bool is_control_point = op == DX_LOAD_OUTPUT_CONTROL_POINT;
|
||||
bool is_patch_constant = op == DX_LOAD_PATCH_CONSTANT;
|
||||
struct vkd3d_shader_instruction *ins = state->ins;
|
||||
struct vsir_program *program = sm6->p.program;
|
||||
unsigned int count, row_index, column_index;
|
||||
const struct vkd3d_shader_dst_param *params;
|
||||
struct vkd3d_shader_src_param *src_param;
|
||||
@@ -5300,17 +5303,17 @@ static void sm6_parser_emit_dx_load_input(struct sm6_parser *sm6, enum dx_intrin
|
||||
|
||||
if (is_patch_constant)
|
||||
{
|
||||
signature = &sm6->p.program.patch_constant_signature;
|
||||
signature = &program->patch_constant_signature;
|
||||
params = sm6->patch_constant_params;
|
||||
}
|
||||
else if (is_control_point)
|
||||
{
|
||||
signature = &sm6->p.program.output_signature;
|
||||
signature = &program->output_signature;
|
||||
params = sm6->output_params;
|
||||
}
|
||||
else
|
||||
{
|
||||
signature = &sm6->p.program.input_signature;
|
||||
signature = &program->input_signature;
|
||||
params = sm6->input_params;
|
||||
}
|
||||
if (row_index >= signature->element_count)
|
||||
@@ -5801,6 +5804,7 @@ static void sm6_parser_emit_dx_store_output(struct sm6_parser *sm6, enum dx_intr
|
||||
{
|
||||
bool is_patch_constant = op == DX_STORE_PATCH_CONSTANT;
|
||||
struct vkd3d_shader_instruction *ins = state->ins;
|
||||
struct vsir_program *program = sm6->p.program;
|
||||
struct vkd3d_shader_src_param *src_param;
|
||||
struct vkd3d_shader_dst_param *dst_param;
|
||||
const struct shader_signature *signature;
|
||||
@@ -5811,7 +5815,7 @@ static void sm6_parser_emit_dx_store_output(struct sm6_parser *sm6, enum dx_intr
|
||||
row_index = sm6_value_get_constant_uint(operands[0]);
|
||||
column_index = sm6_value_get_constant_uint(operands[2]);
|
||||
|
||||
signature = is_patch_constant ? &sm6->p.program.patch_constant_signature : &sm6->p.program.output_signature;
|
||||
signature = is_patch_constant ? &program->patch_constant_signature : &program->output_signature;
|
||||
if (row_index >= signature->element_count)
|
||||
{
|
||||
WARN("Invalid row index %u.\n", row_index);
|
||||
@@ -7771,6 +7775,7 @@ static enum vkd3d_result sm6_function_resolve_phi_incomings(const struct sm6_fun
|
||||
static enum vkd3d_result sm6_parser_function_init(struct sm6_parser *sm6, const struct dxil_block *block,
|
||||
struct sm6_function *function)
|
||||
{
|
||||
struct vsir_program *program = sm6->p.program;
|
||||
struct vkd3d_shader_instruction *ins;
|
||||
size_t i, block_idx, block_count;
|
||||
const struct dxil_record *record;
|
||||
@@ -7862,7 +7867,7 @@ static enum vkd3d_result sm6_parser_function_init(struct sm6_parser *sm6, const
|
||||
{
|
||||
struct function_emission_state state = {code_block, ins};
|
||||
sm6_parser_emit_atomicrmw(sm6, record, &state, dst);
|
||||
sm6->p.program.temp_count = max(sm6->p.program.temp_count, state.temp_idx);
|
||||
program->temp_count = max(program->temp_count, state.temp_idx);
|
||||
break;
|
||||
}
|
||||
case FUNC_CODE_INST_BINOP:
|
||||
@@ -7876,7 +7881,7 @@ static enum vkd3d_result sm6_parser_function_init(struct sm6_parser *sm6, const
|
||||
{
|
||||
struct function_emission_state state = {code_block, ins};
|
||||
sm6_parser_emit_call(sm6, record, &state, dst);
|
||||
sm6->p.program.temp_count = max(sm6->p.program.temp_count, state.temp_idx);
|
||||
program->temp_count = max(program->temp_count, state.temp_idx);
|
||||
break;
|
||||
}
|
||||
case FUNC_CODE_INST_CAST:
|
||||
@@ -8150,9 +8155,10 @@ static void sm6_parser_emit_label(struct sm6_parser *sm6, unsigned int label_id)
|
||||
|
||||
static enum vkd3d_result sm6_function_emit_blocks(const struct sm6_function *function, struct sm6_parser *sm6)
|
||||
{
|
||||
struct vsir_program *program = sm6->p.program;
|
||||
unsigned int i;
|
||||
|
||||
sm6->p.program.block_count = function->block_count;
|
||||
program->block_count = function->block_count;
|
||||
|
||||
for (i = 0; i < function->block_count; ++i)
|
||||
{
|
||||
@@ -8168,9 +8174,9 @@ static enum vkd3d_result sm6_function_emit_blocks(const struct sm6_function *fun
|
||||
sm6_parser_emit_label(sm6, block->id);
|
||||
sm6_block_emit_phi(block, sm6);
|
||||
|
||||
memcpy(&sm6->p.program.instructions.elements[sm6->p.program.instructions.count], block->instructions,
|
||||
memcpy(&program->instructions.elements[program->instructions.count], block->instructions,
|
||||
block->instruction_count * sizeof(*block->instructions));
|
||||
sm6->p.program.instructions.count += block->instruction_count;
|
||||
program->instructions.count += block->instruction_count;
|
||||
|
||||
sm6_block_emit_terminator(block, sm6);
|
||||
}
|
||||
@@ -9140,7 +9146,7 @@ static enum vkd3d_result sm6_parser_descriptor_type_init(struct sm6_parser *sm6,
|
||||
}
|
||||
|
||||
++sm6->descriptor_count;
|
||||
++sm6->p.program.instructions.count;
|
||||
++sm6->p.program->instructions.count;
|
||||
}
|
||||
|
||||
return VKD3D_OK;
|
||||
@@ -9454,6 +9460,7 @@ static enum vkd3d_result sm6_parser_read_signature(struct sm6_parser *sm6, const
|
||||
static enum vkd3d_result sm6_parser_signatures_init(struct sm6_parser *sm6, const struct sm6_metadata_value *m,
|
||||
enum vkd3d_tessellator_domain tessellator_domain)
|
||||
{
|
||||
struct vsir_program *program = sm6->p.program;
|
||||
enum vkd3d_result ret;
|
||||
|
||||
if (!sm6_metadata_value_is_node(m))
|
||||
@@ -9465,24 +9472,24 @@ static enum vkd3d_result sm6_parser_signatures_init(struct sm6_parser *sm6, cons
|
||||
}
|
||||
|
||||
if (m->u.node->operand_count && (ret = sm6_parser_read_signature(sm6, m->u.node->operands[0],
|
||||
&sm6->p.program.input_signature, tessellator_domain)) < 0)
|
||||
&program->input_signature, tessellator_domain)) < 0)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
if (m->u.node->operand_count > 1 && (ret = sm6_parser_read_signature(sm6, m->u.node->operands[1],
|
||||
&sm6->p.program.output_signature, tessellator_domain)) < 0)
|
||||
&program->output_signature, tessellator_domain)) < 0)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
if (m->u.node->operand_count > 1 && (ret = sm6_parser_read_signature(sm6, m->u.node->operands[2],
|
||||
&sm6->p.program.patch_constant_signature, tessellator_domain)) < 0)
|
||||
&program->patch_constant_signature, tessellator_domain)) < 0)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
sm6_parser_init_input_signature(sm6, &sm6->p.program.input_signature);
|
||||
sm6_parser_init_output_signature(sm6, &sm6->p.program.output_signature);
|
||||
sm6_parser_init_patch_constant_signature(sm6, &sm6->p.program.patch_constant_signature);
|
||||
sm6_parser_init_input_signature(sm6, &program->input_signature);
|
||||
sm6_parser_init_output_signature(sm6, &program->output_signature);
|
||||
sm6_parser_init_patch_constant_signature(sm6, &program->patch_constant_signature);
|
||||
|
||||
return VKD3D_OK;
|
||||
}
|
||||
@@ -9511,14 +9518,15 @@ static void sm6_parser_emit_global_flags(struct sm6_parser *sm6, const struct sm
|
||||
|
||||
static enum vkd3d_result sm6_parser_emit_thread_group(struct sm6_parser *sm6, const struct sm6_metadata_value *m)
|
||||
{
|
||||
struct vkd3d_shader_version *version = &sm6->p.program->shader_version;
|
||||
const struct sm6_metadata_node *node;
|
||||
struct vkd3d_shader_instruction *ins;
|
||||
unsigned int group_sizes[3];
|
||||
unsigned int i;
|
||||
|
||||
if (sm6->p.program.shader_version.type != VKD3D_SHADER_TYPE_COMPUTE)
|
||||
if (version->type != VKD3D_SHADER_TYPE_COMPUTE)
|
||||
{
|
||||
WARN("Shader of type %#x has thread group dimensions.\n", sm6->p.program.shader_version.type);
|
||||
WARN("Shader of type %#x has thread group dimensions.\n", version->type);
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_PROPERTIES,
|
||||
"Shader has thread group dimensions but is not a compute shader.");
|
||||
return VKD3D_ERROR_INVALID_SHADER;
|
||||
@@ -9754,7 +9762,7 @@ static void sm6_parser_gs_properties_init(struct sm6_parser *sm6, const struct s
|
||||
}
|
||||
|
||||
sm6_parser_emit_dcl_primitive_topology(sm6, VKD3DSIH_DCL_INPUT_PRIMITIVE, input_primitive, patch_vertex_count);
|
||||
sm6->p.program.input_control_point_count = input_control_point_count;
|
||||
sm6->p.program->input_control_point_count = input_control_point_count;
|
||||
|
||||
i = operands[1];
|
||||
/* Max total scalar count sets an upper limit. We would need to scan outputs to be more precise. */
|
||||
@@ -9836,7 +9844,7 @@ static enum vkd3d_tessellator_domain sm6_parser_ds_properties_init(struct sm6_pa
|
||||
|
||||
sm6_parser_emit_dcl_tessellator_domain(sm6, operands[0]);
|
||||
sm6_parser_validate_control_point_count(sm6, operands[1], "Domain shader input");
|
||||
sm6->p.program.input_control_point_count = operands[1];
|
||||
sm6->p.program->input_control_point_count = operands[1];
|
||||
|
||||
return operands[0];
|
||||
}
|
||||
@@ -9844,6 +9852,7 @@ static enum vkd3d_tessellator_domain sm6_parser_ds_properties_init(struct sm6_pa
|
||||
static enum vkd3d_tessellator_domain sm6_parser_hs_properties_init(struct sm6_parser *sm6,
|
||||
const struct sm6_metadata_value *m)
|
||||
{
|
||||
struct vsir_program *program = sm6->p.program;
|
||||
const struct sm6_metadata_node *node;
|
||||
unsigned int operands[6] = {0};
|
||||
unsigned int i;
|
||||
@@ -9894,10 +9903,10 @@ static enum vkd3d_tessellator_domain sm6_parser_hs_properties_init(struct sm6_pa
|
||||
}
|
||||
|
||||
sm6_parser_validate_control_point_count(sm6, operands[1], "Hull shader input");
|
||||
sm6->p.program.input_control_point_count = operands[1];
|
||||
program->input_control_point_count = operands[1];
|
||||
sm6_parser_validate_control_point_count(sm6, operands[2], "Hull shader output");
|
||||
sm6_parser_emit_dcl_count(sm6, VKD3DSIH_DCL_OUTPUT_CONTROL_POINT_COUNT, operands[2]);
|
||||
sm6->p.program.output_control_point_count = operands[2];
|
||||
program->output_control_point_count = operands[2];
|
||||
sm6_parser_emit_dcl_tessellator_domain(sm6, operands[3]);
|
||||
sm6_parser_emit_dcl_tessellator_partitioning(sm6, operands[4]);
|
||||
sm6_parser_emit_dcl_tessellator_output_primitive(sm6, operands[5]);
|
||||
@@ -10121,7 +10130,8 @@ static void sm6_parser_destroy(struct vkd3d_shader_parser *parser)
|
||||
|
||||
dxil_block_destroy(&sm6->root_block);
|
||||
dxil_global_abbrevs_cleanup(sm6->abbrevs, sm6->abbrev_count);
|
||||
vsir_program_cleanup(&parser->program);
|
||||
vsir_program_cleanup(parser->program);
|
||||
vkd3d_free(parser->program);
|
||||
sm6_type_table_cleanup(sm6->types, sm6->type_count);
|
||||
sm6_symtab_cleanup(sm6->global_symbols, sm6->global_symbol_count);
|
||||
sm6_functions_cleanup(sm6->functions, sm6->function_count);
|
||||
@@ -10149,15 +10159,14 @@ static enum vkd3d_result sm6_parser_init(struct sm6_parser *sm6, const char *sou
|
||||
struct vkd3d_shader_message_context *message_context, struct dxbc_shader_desc *dxbc_desc)
|
||||
{
|
||||
size_t count, length, function_count, expected_function_count, byte_code_size = dxbc_desc->byte_code_size;
|
||||
const struct shader_signature *patch_constant_signature = &sm6->p.program.patch_constant_signature;
|
||||
const struct shader_signature *output_signature = &sm6->p.program.output_signature;
|
||||
const struct shader_signature *input_signature = &sm6->p.program.input_signature;
|
||||
struct shader_signature *patch_constant_signature, *output_signature, *input_signature;
|
||||
const struct vkd3d_shader_location location = {.source_name = source_name};
|
||||
uint32_t version_token, dxil_version, token_count, magic;
|
||||
const uint32_t *byte_code = dxbc_desc->byte_code;
|
||||
unsigned int chunk_offset, chunk_size;
|
||||
enum bitcode_block_abbreviation abbr;
|
||||
struct vkd3d_shader_version version;
|
||||
struct vsir_program *program;
|
||||
struct dxil_block *block;
|
||||
struct sm6_function *fn;
|
||||
enum vkd3d_result ret;
|
||||
@@ -10248,9 +10257,13 @@ static enum vkd3d_result sm6_parser_init(struct sm6_parser *sm6, const char *sou
|
||||
sm6->ptr = &sm6->start[1];
|
||||
sm6->bitpos = 2;
|
||||
|
||||
sm6->p.program.input_signature = dxbc_desc->input_signature;
|
||||
sm6->p.program.output_signature = dxbc_desc->output_signature;
|
||||
sm6->p.program.patch_constant_signature = dxbc_desc->patch_constant_signature;
|
||||
program = sm6->p.program;
|
||||
input_signature = &program->input_signature;
|
||||
output_signature = &program->output_signature;
|
||||
patch_constant_signature = &program->patch_constant_signature;
|
||||
*input_signature = dxbc_desc->input_signature;
|
||||
*output_signature = dxbc_desc->output_signature;
|
||||
*patch_constant_signature = dxbc_desc->patch_constant_signature;
|
||||
memset(dxbc_desc, 0, sizeof(*dxbc_desc));
|
||||
|
||||
block = &sm6->root_block;
|
||||
@@ -10313,9 +10326,9 @@ static enum vkd3d_result sm6_parser_init(struct sm6_parser *sm6, const char *sou
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!(sm6->output_params = vsir_program_get_dst_params(&sm6->p.program, output_signature->element_count))
|
||||
|| !(sm6->input_params = vsir_program_get_dst_params(&sm6->p.program, input_signature->element_count))
|
||||
|| !(sm6->patch_constant_params = vsir_program_get_dst_params(&sm6->p.program,
|
||||
if (!(sm6->output_params = vsir_program_get_dst_params(program, output_signature->element_count))
|
||||
|| !(sm6->input_params = vsir_program_get_dst_params(program, input_signature->element_count))
|
||||
|| !(sm6->patch_constant_params = vsir_program_get_dst_params(program,
|
||||
patch_constant_signature->element_count)))
|
||||
{
|
||||
ERR("Failed to allocate input/output parameters.\n");
|
||||
@@ -10405,7 +10418,7 @@ static enum vkd3d_result sm6_parser_init(struct sm6_parser *sm6, const char *sou
|
||||
return VKD3D_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
sm6->p.program.ssa_count = sm6->ssa_next_id;
|
||||
program->ssa_count = sm6->ssa_next_id;
|
||||
|
||||
if (!(fn = sm6_parser_get_function(sm6, sm6->entry_point)))
|
||||
{
|
||||
|
Reference in New Issue
Block a user