mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-04-13 05:43:18 -07:00
vkd3d-shader/hlsl: Store geometry shader properties in struct vsir_program.
This commit is contained in:
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
@@ -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)
|
||||
|
@@ -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)
|
||||
{
|
||||
|
@@ -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,
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user