More preparatory work to declare I/O variables from the signature.
-- v2: vkd3d-shader/spirv: Use register counts from the signature and shader desc. vkd3d-shader: Store the control point counts in struct vkd3d_shader_desc. vkd3d-shader/spirv: Use the array sizes for shader phase builtins as well.
From: Zebediah Figura zfigura@codeweavers.com
--- libs/vkd3d-shader/spirv.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 6faac0ccd..3fa83e022 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -5003,7 +5003,7 @@ static void spirv_compiler_emit_output_register(struct spirv_compiler *compiler, }
static uint32_t spirv_compiler_emit_shader_phase_builtin_variable(struct spirv_compiler *compiler, - const struct vkd3d_spirv_builtin *builtin) + const struct vkd3d_spirv_builtin *builtin, const unsigned int *array_sizes, unsigned int size_count) { struct vkd3d_spirv_builder *builder = &compiler->spirv_builder; uint32_t *variable_id, id; @@ -5018,7 +5018,7 @@ static uint32_t spirv_compiler_emit_shader_phase_builtin_variable(struct spirv_c if (variable_id && *variable_id) return *variable_id;
- id = spirv_compiler_emit_builtin_variable(compiler, builtin, SpvStorageClassOutput, 0); + id = spirv_compiler_emit_builtin_variable_v(compiler, builtin, SpvStorageClassOutput, array_sizes, size_count); if (is_in_fork_or_join_phase(compiler)) vkd3d_spirv_build_op_decorate(builder, id, SpvDecorationPatch, NULL, 0);
@@ -5100,7 +5100,7 @@ static void spirv_compiler_emit_output(struct spirv_compiler *compiler, const st else if (builtin) { if (spirv_compiler_get_current_shader_phase(compiler)) - id = spirv_compiler_emit_shader_phase_builtin_variable(compiler, builtin); + id = spirv_compiler_emit_shader_phase_builtin_variable(compiler, builtin, array_sizes, 2); else id = spirv_compiler_emit_builtin_variable_v(compiler, builtin, storage_class, array_sizes, 2);
From: Zebediah Figura zfigura@codeweavers.com
--- libs/vkd3d-shader/spirv.c | 8 +++---- libs/vkd3d-shader/tpf.c | 29 ++++++++++++++++-------- libs/vkd3d-shader/vkd3d_shader_private.h | 2 ++ 3 files changed, 25 insertions(+), 14 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 3fa83e022..5b12d09dc 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -9365,11 +9365,7 @@ static int spirv_compiler_handle_instruction(struct spirv_compiler *compiler, case VKD3DSIH_DCL_GS_INSTANCES: spirv_compiler_emit_dcl_gs_instances(compiler, instruction); break; - case VKD3DSIH_DCL_INPUT_CONTROL_POINT_COUNT: - compiler->input_control_point_count = instruction->declaration.count; - break; case VKD3DSIH_DCL_OUTPUT_CONTROL_POINT_COUNT: - compiler->output_control_point_count = instruction->declaration.count; spirv_compiler_emit_output_vertex_count(compiler, instruction); break; case VKD3DSIH_DCL_TESSELLATOR_DOMAIN: @@ -9626,6 +9622,7 @@ static int spirv_compiler_handle_instruction(struct spirv_compiler *compiler, case VKD3DSIH_DCL: case VKD3DSIH_DCL_CONSTANT_BUFFER: case VKD3DSIH_DCL_HS_MAX_TESSFACTOR: + case VKD3DSIH_DCL_INPUT_CONTROL_POINT_COUNT: case VKD3DSIH_DCL_RESOURCE_RAW: case VKD3DSIH_DCL_RESOURCE_STRUCTURED: case VKD3DSIH_DCL_SAMPLER: @@ -9723,6 +9720,9 @@ 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->input_control_point_count = shader_desc->input_control_point_count; + compiler->output_control_point_count = shader_desc->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 afdf84737..ed7fb6c46 100644 --- a/libs/vkd3d-shader/tpf.c +++ b/libs/vkd3d-shader/tpf.c @@ -655,16 +655,18 @@ static const enum vkd3d_primitive_type output_primitive_type_table[] = /* VKD3D_SM4_OUTPUT_PT_TRIANGLESTRIP */ VKD3D_PT_TRIANGLESTRIP, };
-static const enum vkd3d_primitive_type input_primitive_type_table[] = +static const struct { - /* UNKNOWN */ VKD3D_PT_UNDEFINED, - /* VKD3D_SM4_INPUT_PT_POINT */ VKD3D_PT_POINTLIST, - /* VKD3D_SM4_INPUT_PT_LINE */ VKD3D_PT_LINELIST, - /* VKD3D_SM4_INPUT_PT_TRIANGLE */ VKD3D_PT_TRIANGLELIST, - /* UNKNOWN */ VKD3D_PT_UNDEFINED, - /* UNKNOWN */ VKD3D_PT_UNDEFINED, - /* VKD3D_SM4_INPUT_PT_LINEADJ */ VKD3D_PT_LINELIST_ADJ, - /* VKD3D_SM4_INPUT_PT_TRIANGLEADJ */ VKD3D_PT_TRIANGLELIST_ADJ, + unsigned int control_point_count; + enum vkd3d_primitive_type vkd3d_type; +} +input_primitive_type_table[] = +{ + [VKD3D_SM4_INPUT_PT_POINT] = {1, VKD3D_PT_POINTLIST}, + [VKD3D_SM4_INPUT_PT_LINE] = {2, VKD3D_PT_LINELIST}, + [VKD3D_SM4_INPUT_PT_TRIANGLE] = {3, VKD3D_PT_TRIANGLELIST}, + [VKD3D_SM4_INPUT_PT_LINEADJ] = {4, VKD3D_PT_LINELIST_ADJ}, + [VKD3D_SM4_INPUT_PT_TRIANGLEADJ] = {6, VKD3D_PT_TRIANGLELIST_ADJ}, };
static const enum vkd3d_shader_resource_type resource_type_table[] = @@ -1033,6 +1035,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; } else if (primitive_type >= ARRAY_SIZE(input_primitive_type_table)) { @@ -1040,7 +1043,8 @@ static void shader_sm4_read_dcl_input_primitive(struct vkd3d_shader_instruction } else { - ins->declaration.primitive_type.type = input_primitive_type_table[primitive_type]; + 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; }
if (ins->declaration.primitive_type.type == VKD3D_PT_UNDEFINED) @@ -1150,6 +1154,11 @@ static void shader_sm5_read_control_point_count(struct vkd3d_shader_instruction { ins->declaration.count = (opcode_token & VKD3D_SM5_CONTROL_POINT_COUNT_MASK) >> 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; + else + priv->p.shader_desc.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 912267e0e..bf34738bb 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -951,6 +951,8 @@ 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; + uint32_t temp_count; unsigned int ssa_count;
From: Zebediah Figura zfigura@codeweavers.com
--- libs/vkd3d-shader/ir.c | 10 ++----- libs/vkd3d-shader/spirv.c | 33 +++++++++--------------- libs/vkd3d-shader/vkd3d_shader_private.h | 6 +++++ 3 files changed, 20 insertions(+), 29 deletions(-)
diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 8cf92656b..d8e7758e2 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -825,12 +825,6 @@ static bool shader_signature_merge(struct shader_signature *s, uint8_t range_map return true; }
-static bool 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 unsigned int shader_register_normalise_arrayed_addressing(struct vkd3d_shader_register *reg, unsigned int id_idx, unsigned int register_index) { @@ -931,7 +925,7 @@ static bool shader_dst_param_io_normalise(struct vkd3d_shader_dst_param *dst_par id_idx = 1; }
- if ((e->register_count > 1 || sysval_semantic_is_tess_factor(e->sysval_semantic))) + if ((e->register_count > 1 || vsir_sysval_semantic_is_tess_factor(e->sysval_semantic))) { if (is_io_dcl) { @@ -1006,7 +1000,7 @@ static void shader_src_param_io_normalise(struct vkd3d_shader_src_param *src_par element_idx = shader_signature_find_element_for_reg(signature, reg_idx, write_mask);
e = &signature->elements[element_idx]; - if ((e->register_count > 1 || sysval_semantic_is_tess_factor(e->sysval_semantic))) + if ((e->register_count > 1 || vsir_sysval_semantic_is_tess_factor(e->sysval_semantic))) 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; diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 5b12d09dc..ed8b6eb99 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -4583,7 +4583,7 @@ static uint32_t spirv_compiler_emit_builtin_variable_v(struct spirv_compiler *co assert(size_count <= ARRAY_SIZE(sizes)); memcpy(sizes, array_sizes, size_count * sizeof(sizes[0])); array_sizes = sizes; - sizes[0] = max(sizes[0], builtin->spirv_array_size); + sizes[size_count - 1] = max(sizes[size_count - 1], builtin->spirv_array_size);
id = spirv_compiler_emit_array_variable(compiler, &builder->global_stream, storage_class, builtin->component_type, builtin->component_count, array_sizes, size_count); @@ -4621,24 +4621,6 @@ static unsigned int shader_signature_next_location(const struct shader_signature return max_row; }
-static unsigned int shader_register_get_io_indices(const struct vkd3d_shader_register *reg, - unsigned int *array_sizes) -{ - unsigned int i, element_idx; - - array_sizes[0] = 0; - array_sizes[1] = 0; - element_idx = reg->idx[0].offset; - for (i = 1; i < reg->idx_count; ++i) - { - array_sizes[1] = array_sizes[0]; - array_sizes[0] = element_idx; - element_idx = reg->idx[i].offset; - } - - return element_idx; -} - static uint32_t spirv_compiler_emit_input(struct spirv_compiler *compiler, const struct vkd3d_shader_dst_param *dst) { @@ -4668,7 +4650,7 @@ static uint32_t spirv_compiler_emit_input(struct spirv_compiler *compiler, shader_signature = reg->type == VKD3DSPR_PATCHCONST ? &compiler->patch_constant_signature : &compiler->input_signature;
- element_idx = shader_register_get_io_indices(reg, array_sizes); + element_idx = reg->idx[reg->idx_count - 1].offset; signature_element = &shader_signature->elements[element_idx]; sysval = vkd3d_siv_from_sysval(signature_element->sysval_semantic); /* The Vulkan spec does not explicitly forbid passing varyings from the @@ -4679,6 +4661,11 @@ static uint32_t spirv_compiler_emit_input(struct spirv_compiler *compiler,
builtin = get_spirv_builtin_for_sysval(compiler, sysval);
+ array_sizes[0] = (reg->type == VKD3DSPR_PATCHCONST ? 0 : compiler->input_control_point_count); + array_sizes[1] = signature_element->register_count; + if (array_sizes[1] == 1 && !vsir_sysval_semantic_is_tess_factor(signature_element->sysval_semantic)) + array_sizes[1] = 0; + write_mask = signature_element->mask;
if (builtin) @@ -5050,12 +5037,16 @@ static void spirv_compiler_emit_output(struct spirv_compiler *compiler, const st
shader_signature = is_patch_constant ? &compiler->patch_constant_signature : &compiler->output_signature;
- element_idx = shader_register_get_io_indices(reg, array_sizes); + element_idx = reg->idx[reg->idx_count - 1].offset; signature_element = &shader_signature->elements[element_idx]; sysval = vkd3d_siv_from_sysval(signature_element->sysval_semantic); /* Don't use builtins for TCS -> TES varyings. See spirv_compiler_emit_input(). */ if (compiler->shader_type == VKD3D_SHADER_TYPE_HULL && !is_patch_constant) sysval = VKD3D_SIV_NONE; + array_sizes[0] = (reg->type == VKD3DSPR_PATCHCONST ? 0 : compiler->output_control_point_count); + array_sizes[1] = signature_element->register_count; + if (array_sizes[1] == 1 && !vsir_sysval_semantic_is_tess_factor(signature_element->sysval_semantic)) + array_sizes[1] = 0;
builtin = vkd3d_get_spirv_builtin(compiler, dst->reg.type, sysval);
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index bf34738bb..048c8e7b6 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -938,6 +938,12 @@ 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; +} + struct signature_element *vsir_signature_find_element_for_reg(const struct shader_signature *signature, unsigned int reg_idx, unsigned int write_mask); void shader_signature_cleanup(struct shader_signature *signature);