mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 20:08:06 +02:00
ac/nir/ngg: fix ngg_gs_clear_primflags crash
We get current_clear_primflag_idx_var==NULL when stream 0 output number is known, so output_compile_time_known==true. But we also need this variable when stream 1~3 output number is unknown or vertex number is less than a primitive's needs. Fixes:60ac5dda82("ac: Add NIR lowering for NGG GS.") Reviewed-by: Marek Olšák <marek.olsak@amd.com> Reviewed-by: Timur Kristóf <timur.kristof@gmail.com> Signed-off-by: Qiang Yu <yuq825@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23614> (cherry picked from commitc36e0e3f79)
This commit is contained in:
parent
86aba43272
commit
d1f7f07fcb
2 changed files with 11 additions and 10 deletions
|
|
@ -427,7 +427,7 @@
|
|||
"description": "ac/nir/ngg: fix ngg_gs_clear_primflags crash",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": "60ac5dda82e1a5c020aa51a02fa65131e9bfb2ca"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -114,7 +114,6 @@ typedef struct
|
|||
const ac_nir_lower_ngg_options *options;
|
||||
|
||||
nir_function_impl *impl;
|
||||
nir_variable *current_clear_primflag_idx_var;
|
||||
int const_out_vtxcnt[4];
|
||||
int const_out_prmcnt[4];
|
||||
unsigned max_num_waves;
|
||||
|
|
@ -2611,21 +2610,26 @@ ngg_gs_emit_vertex_addr(nir_builder *b, nir_ssa_def *gs_vtx_idx, lower_ngg_gs_st
|
|||
static void
|
||||
ngg_gs_clear_primflags(nir_builder *b, nir_ssa_def *num_vertices, unsigned stream, lower_ngg_gs_state *s)
|
||||
{
|
||||
char name[32];
|
||||
snprintf(name, sizeof(name), "clear_primflag_idx_%u", stream);
|
||||
nir_variable *clear_primflag_idx_var = nir_local_variable_create(b->impl, glsl_uint_type(), name);
|
||||
|
||||
nir_ssa_def *zero_u8 = nir_imm_zero(b, 1, 8);
|
||||
nir_store_var(b, s->current_clear_primflag_idx_var, num_vertices, 0x1u);
|
||||
nir_store_var(b, clear_primflag_idx_var, num_vertices, 0x1u);
|
||||
|
||||
nir_loop *loop = nir_push_loop(b);
|
||||
{
|
||||
nir_ssa_def *current_clear_primflag_idx = nir_load_var(b, s->current_clear_primflag_idx_var);
|
||||
nir_if *if_break = nir_push_if(b, nir_uge(b, current_clear_primflag_idx, nir_imm_int(b, b->shader->info.gs.vertices_out)));
|
||||
nir_ssa_def *clear_primflag_idx = nir_load_var(b, clear_primflag_idx_var);
|
||||
nir_if *if_break = nir_push_if(
|
||||
b, nir_uge(b, clear_primflag_idx, nir_imm_int(b, b->shader->info.gs.vertices_out)));
|
||||
{
|
||||
nir_jump(b, nir_jump_break);
|
||||
}
|
||||
nir_push_else(b, if_break);
|
||||
{
|
||||
nir_ssa_def *emit_vtx_addr = ngg_gs_emit_vertex_addr(b, current_clear_primflag_idx, s);
|
||||
nir_ssa_def *emit_vtx_addr = ngg_gs_emit_vertex_addr(b, clear_primflag_idx, s);
|
||||
nir_store_shared(b, zero_u8, emit_vtx_addr, .base = s->lds_offs_primflags + stream);
|
||||
nir_store_var(b, s->current_clear_primflag_idx_var, nir_iadd_imm_nuw(b, current_clear_primflag_idx, 1), 0x1u);
|
||||
nir_store_var(b, clear_primflag_idx_var, nir_iadd_imm_nuw(b, clear_primflag_idx, 1), 0x1u);
|
||||
}
|
||||
nir_pop_if(b, if_break);
|
||||
}
|
||||
|
|
@ -3401,9 +3405,6 @@ ac_nir_lower_ngg_gs(nir_shader *shader, const ac_nir_lower_ngg_options *options)
|
|||
state.const_out_prmcnt[0] != -1;
|
||||
}
|
||||
|
||||
if (!state.output_compile_time_known)
|
||||
state.current_clear_primflag_idx_var = nir_local_variable_create(impl, glsl_uint_type(), "current_clear_primflag_idx");
|
||||
|
||||
if (shader->info.gs.output_primitive == SHADER_PRIM_POINTS)
|
||||
state.num_vertices_per_primitive = 1;
|
||||
else if (shader->info.gs.output_primitive == SHADER_PRIM_LINE_STRIP)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue