vkd3d-shader/hlsl: Store geometry shader properties in struct vsir_program.

This commit is contained in:
Shaun Ren
2025-03-12 16:09:42 -04:00
committed by Henri Verbeet
parent b1ace5763a
commit bd055fac1c
Notes: Henri Verbeet 2025-03-18 16:04:44 +01:00
Approved-by: Henri Verbeet (@hverbeet)
Approved-by: Elizabeth Figura (@zfigura)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1431
4 changed files with 20 additions and 0 deletions

View File

@@ -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)

View File

@@ -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)
{

View File

@@ -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,

View File

@@ -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;