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;