nir: allow to force line strip out in nir_create_passthrough_gs
authorantonino <antonino.maniscalco@collabora.com>
Fri, 3 Feb 2023 14:42:20 +0000 (15:42 +0100)
committerMarge Bot <emma+marge@anholt.net>
Wed, 29 Mar 2023 19:18:40 +0000 (19:18 +0000)
`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>

src/compiler/nir/nir.h
src/compiler/nir/nir_passthrough_gs.c
src/gallium/drivers/zink/zink_program.c

index a2e381e..c6a45d8 100644 (file)
@@ -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);
index c53e8f4..c6b24ff 100644 (file)
@@ -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;
index 34f64a9..4046473 100644 (file)
@@ -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;