mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-30 23:28:06 +02:00
nir/lower_gs_intrinsics: Append EndPrimitive
This is simpler for generic GS lowering. Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Reviewed-by: Antonino Maniscalco <antonino.maniscalco@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26056>
This commit is contained in:
parent
f157a3de4e
commit
0a35aa3a2b
2 changed files with 31 additions and 0 deletions
|
|
@ -6029,6 +6029,7 @@ typedef enum {
|
|||
nir_lower_gs_intrinsics_count_primitives = 1 << 1,
|
||||
nir_lower_gs_intrinsics_count_vertices_per_primitive = 1 << 2,
|
||||
nir_lower_gs_intrinsics_overwrite_incomplete = 1 << 3,
|
||||
nir_lower_gs_intrinsics_always_end_primitive = 1 << 4,
|
||||
} nir_lower_gs_intrinsics_flags;
|
||||
|
||||
bool nir_lower_gs_intrinsics(nir_shader *shader, nir_lower_gs_intrinsics_flags options);
|
||||
|
|
|
|||
|
|
@ -334,6 +334,32 @@ append_set_vertex_and_primitive_count(nir_block *end_block, struct state *state)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Append an EndPrimitive intrinsic to the end of the geometry shader. This
|
||||
* allows the backend to emit primitives only when EndPrimitive is used. If this
|
||||
* EndPrimitive is not needed, it will be predicated out via
|
||||
* overwrite_incomplete_primitives.
|
||||
*/
|
||||
static void
|
||||
append_end_primitive(nir_block *end_block, struct state *state)
|
||||
{
|
||||
nir_builder *b = state->builder;
|
||||
|
||||
/* Only end a primitive if there is a primitive to end */
|
||||
if (b->shader->info.gs.active_stream_mask == 0)
|
||||
return;
|
||||
|
||||
/* Insert the new intrinsic in all of the predecessors of the end block,
|
||||
* but before any jump instructions (return).
|
||||
*/
|
||||
set_foreach(end_block->predecessors, entry) {
|
||||
nir_block *pred = (nir_block *) entry->key;
|
||||
b->cursor = nir_after_block_before_jump(pred);
|
||||
|
||||
nir_end_primitive(b);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check to see if there are any blocks that need set_vertex_and_primitive_count
|
||||
*
|
||||
|
|
@ -381,6 +407,7 @@ nir_lower_gs_intrinsics(nir_shader *shader, nir_lower_gs_intrinsics_flags option
|
|||
bool per_stream = options & nir_lower_gs_intrinsics_per_stream;
|
||||
bool count_primitives = options & nir_lower_gs_intrinsics_count_primitives;
|
||||
bool overwrite_incomplete = options & nir_lower_gs_intrinsics_overwrite_incomplete;
|
||||
bool always_end_primitive_non_points = options & nir_lower_gs_intrinsics_always_end_primitive;
|
||||
bool count_vtx_per_prim =
|
||||
overwrite_incomplete ||
|
||||
(options & nir_lower_gs_intrinsics_count_vertices_per_primitive);
|
||||
|
|
@ -448,6 +475,9 @@ nir_lower_gs_intrinsics(nir_shader *shader, nir_lower_gs_intrinsics_flags option
|
|||
}
|
||||
}
|
||||
|
||||
if (always_end_primitive_non_points && !is_points)
|
||||
append_end_primitive(impl->end_block, &state);
|
||||
|
||||
nir_foreach_block_safe(block, impl)
|
||||
rewrite_intrinsics(block, &state);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue