From d1f7f07fcb4fea795976587b5d2768eab4a6381f Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Mon, 12 Jun 2023 17:50:50 +0800 Subject: [PATCH] ac/nir/ngg: fix ngg_gs_clear_primflags crash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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: 60ac5dda82e1 ("ac: Add NIR lowering for NGG GS.") Reviewed-by: Marek Olšák Reviewed-by: Timur Kristóf Signed-off-by: Qiang Yu Part-of: (cherry picked from commit c36e0e3f792b1ea69fc11320f4ebba70f0239b4a) --- .pick_status.json | 2 +- src/amd/common/ac_nir_lower_ngg.c | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index e5d4461b2f9..1e03adff447 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -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" }, diff --git a/src/amd/common/ac_nir_lower_ngg.c b/src/amd/common/ac_nir_lower_ngg.c index 27d9ca4e5c8..1ffc03dd2f0 100644 --- a/src/amd/common/ac_nir_lower_ngg.c +++ b/src/amd/common/ac_nir_lower_ngg.c @@ -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)