From bd055fac1c77b24271550505eb0a1f7aaf8a9167 Mon Sep 17 00:00:00 2001 From: Shaun Ren Date: Wed, 12 Mar 2025 16:09:42 -0400 Subject: [PATCH] vkd3d-shader/hlsl: Store geometry shader properties in struct vsir_program. --- libs/vkd3d-shader/dxil.c | 4 ++++ libs/vkd3d-shader/hlsl_codegen.c | 7 +++++++ libs/vkd3d-shader/tpf.c | 6 ++++++ libs/vkd3d-shader/vkd3d_shader_private.h | 3 +++ 4 files changed, 20 insertions(+) diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index 29e714ee..ac4828d6 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -9963,6 +9963,7 @@ static void sm6_parser_gs_properties_init(struct sm6_parser *sm6, const struct s { input_primitive = VKD3D_PT_PATCH; patch_vertex_count = i - INPUT_PRIMITIVE_PATCH1 + 1; + input_control_point_count = patch_vertex_count; break; } @@ -9973,6 +9974,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_primitive = input_primitive; sm6->p.program->input_control_point_count = input_control_point_count; i = operands[1]; @@ -9984,6 +9986,7 @@ static void sm6_parser_gs_properties_init(struct sm6_parser *sm6, const struct s "Geometry shader output vertex count %u is invalid.", i); } sm6_parser_emit_dcl_count(sm6, VKD3DSIH_DCL_VERTICES_OUT, i); + sm6->p.program->vertices_out_count = i; if (operands[2] > 1) { @@ -10001,6 +10004,7 @@ static void sm6_parser_gs_properties_init(struct sm6_parser *sm6, const struct s output_primitive = VKD3D_PT_TRIANGLELIST; } sm6_parser_emit_dcl_primitive_topology(sm6, VKD3DSIH_DCL_OUTPUT_TOPOLOGY, output_primitive, 0); + sm6->p.program->output_topology = output_primitive; i = operands[4]; if (!i || i > MAX_GS_INSTANCE_COUNT) diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index 4010fff5..2ce9fd66 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -11343,6 +11343,13 @@ static void sm4_generate_vsir(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl ? 0 : ctx->input_control_point_count; program->tess_domain = ctx->domain; } + else if (version.type == VKD3D_SHADER_TYPE_GEOMETRY) + { + program->input_control_point_count = ctx->input_control_point_count; + program->input_primitive = ctx->input_primitive_type; + program->output_topology = VKD3D_PT_UNDEFINED; /* TODO: obtain from stream output parameters. */ + program->vertices_out_count = ctx->max_vertex_count; + } LIST_FOR_EACH_ENTRY(cbuffer, &ctx->buffers, struct hlsl_buffer, entry) { diff --git a/libs/vkd3d-shader/tpf.c b/libs/vkd3d-shader/tpf.c index 0fe5f57c..9664bfd5 100644 --- a/libs/vkd3d-shader/tpf.c +++ b/libs/vkd3d-shader/tpf.c @@ -1077,6 +1077,8 @@ static void shader_sm4_read_dcl_output_topology(struct vkd3d_shader_instruction if (ins->declaration.primitive_type.type == VKD3D_PT_UNDEFINED) FIXME("Unhandled output primitive type %#x.\n", primitive_type); + + priv->p.program->output_topology = ins->declaration.primitive_type.type; } static void shader_sm4_read_dcl_input_primitive(struct vkd3d_shader_instruction *ins, uint32_t opcode, @@ -1104,6 +1106,8 @@ static void shader_sm4_read_dcl_input_primitive(struct vkd3d_shader_instruction if (ins->declaration.primitive_type.type == VKD3D_PT_UNDEFINED) FIXME("Unhandled input primitive type %#x.\n", primitive_type); + + program->input_primitive = ins->declaration.primitive_type.type; } static void shader_sm4_read_declaration_count(struct vkd3d_shader_instruction *ins, uint32_t opcode, @@ -1114,6 +1118,8 @@ static void shader_sm4_read_declaration_count(struct vkd3d_shader_instruction *i ins->declaration.count = *tokens; if (opcode == VKD3D_SM4_OP_DCL_TEMPS) program->temp_count = max(program->temp_count, *tokens); + else if (opcode == VKD3D_SM4_OP_DCL_VERTICES_OUT) + program->vertices_out_count = *tokens; } static void shader_sm4_read_declaration_dst(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 da5944de..7fcee37c 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -1478,6 +1478,9 @@ struct vsir_program enum vkd3d_tessellator_domain tess_domain; enum vkd3d_shader_tessellator_partitioning tess_partitioning; enum vkd3d_shader_tessellator_output_primitive tess_output_primitive; + enum vkd3d_primitive_type input_primitive, output_topology; + unsigned int vertices_out_count; + uint32_t io_dcls[VKD3D_BITMAP_SIZE(VKD3DSPR_COUNT)]; struct vsir_features features;