mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 04:38:03 +02:00
nir: allow to force line strip out in nir_create_passthrough_gs
`nir_create_passthrough_gs` now allows the user to force the generated GS to always output a line strip from the primitive regardless of whether edgeflags are present. Acked-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com> Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21238>
This commit is contained in:
parent
90a8525d70
commit
3b5fb8b060
3 changed files with 11 additions and 6 deletions
|
|
@ -5087,7 +5087,8 @@ nir_shader * nir_create_passthrough_tcs(const nir_shader_compiler_options *optio
|
|||
nir_shader * nir_create_passthrough_gs(const nir_shader_compiler_options *options,
|
||||
const nir_shader *prev_stage,
|
||||
enum shader_prim primitive_type,
|
||||
bool emulate_edgeflags);
|
||||
bool emulate_edgeflags,
|
||||
bool force_line_strip_out);
|
||||
|
||||
bool nir_lower_fragcolor(nir_shader *shader, unsigned max_cbufs);
|
||||
bool nir_lower_fragcoord_wtrans(nir_shader *shader);
|
||||
|
|
|
|||
|
|
@ -129,18 +129,20 @@ nir_shader *
|
|||
nir_create_passthrough_gs(const nir_shader_compiler_options *options,
|
||||
const nir_shader *prev_stage,
|
||||
enum shader_prim primitive_type,
|
||||
bool emulate_edgeflags)
|
||||
bool emulate_edgeflags,
|
||||
bool force_line_strip_out)
|
||||
{
|
||||
unsigned int vertices_out = vertices_for_prim(primitive_type);
|
||||
emulate_edgeflags = emulate_edgeflags && (prev_stage->info.outputs_written & VARYING_BIT_EDGE);
|
||||
bool needs_closing = emulate_edgeflags && vertices_out >= 3;
|
||||
bool needs_closing = (force_line_strip_out || emulate_edgeflags) && vertices_out >= 3;
|
||||
nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_GEOMETRY,
|
||||
options,
|
||||
"gs passthrough");
|
||||
|
||||
nir_shader *nir = b.shader;
|
||||
nir->info.gs.input_primitive = gs_in_prim_for_topology(primitive_type);
|
||||
nir->info.gs.output_primitive = emulate_edgeflags ? SHADER_PRIM_LINE_STRIP : gs_out_prim_for_topology(primitive_type);
|
||||
nir->info.gs.output_primitive = (force_line_strip_out || emulate_edgeflags) ?
|
||||
SHADER_PRIM_LINE_STRIP : gs_out_prim_for_topology(primitive_type);
|
||||
nir->info.gs.vertices_in = vertices_out;
|
||||
nir->info.gs.vertices_out = needs_closing ? vertices_out + 1 : vertices_out;
|
||||
nir->info.gs.invocations = 1;
|
||||
|
|
|
|||
|
|
@ -2253,7 +2253,8 @@ zink_set_primitive_emulation_keys(struct zink_context *ctx)
|
|||
&screen->nir_options,
|
||||
ctx->gfx_stages[prev_vertex_stage]->nir,
|
||||
ctx->gfx_pipeline_state.gfx_prim_mode,
|
||||
lower_edge_flags);
|
||||
lower_edge_flags,
|
||||
false);
|
||||
|
||||
struct zink_shader *shader = zink_shader_create(screen, nir, NULL);
|
||||
ctx->gfx_stages[prev_vertex_stage]->non_fs.generated_gs[ctx->gfx_pipeline_state.gfx_prim_mode] = shader;
|
||||
|
|
@ -2287,7 +2288,8 @@ zink_create_primitive_emulation_gs(struct zink_context *ctx)
|
|||
&screen->nir_options,
|
||||
ctx->gfx_stages[prev_vertex_stage]->nir,
|
||||
ctx->gfx_pipeline_state.gfx_prim_mode,
|
||||
lower_edge_flags);
|
||||
lower_edge_flags,
|
||||
false);
|
||||
|
||||
struct zink_shader *shader = zink_shader_create(screen, nir, NULL);
|
||||
ctx->gfx_stages[prev_vertex_stage]->non_fs.generated_gs[ctx->gfx_pipeline_state.gfx_prim_mode] = shader;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue