From 540eafada1eba7e3807a5cf376ad59b8fe7e4e15 Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Fri, 1 Jul 2022 11:38:00 +0800 Subject: [PATCH] ac/nir/ngg: add streamout emitted primitive query MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For radeonsi to implement GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN. Reviewed-by: Marek Olšák Signed-off-by: Qiang Yu Part-of: --- src/amd/common/ac_nir_lower_ngg.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/amd/common/ac_nir_lower_ngg.c b/src/amd/common/ac_nir_lower_ngg.c index cb0d8f81213..3ceb705258b 100644 --- a/src/amd/common/ac_nir_lower_ngg.c +++ b/src/amd/common/ac_nir_lower_ngg.c @@ -1554,6 +1554,7 @@ static void ngg_build_streamout_buffer_info(nir_builder *b, nir_xfb_info *info, unsigned scratch_base, + bool has_prim_query, nir_ssa_def *tid_in_tg, nir_ssa_def *gen_prim[4], nir_ssa_def *prim_stride_ret[4], @@ -1644,6 +1645,18 @@ ngg_build_streamout_buffer_info(nir_builder *b, nir_store_shared(b, emit_prim[stream], nir_imm_int(b, stream * 4), .base = scratch_base + 16); } + + /* Update shader query. */ + if (has_prim_query) { + nir_if *if_shader_query = nir_push_if(b, nir_load_prim_xfb_query_enabled_amd(b)); + { + for (unsigned stream = 0; stream < 4; stream++) { + if (info->streams_written & BITFIELD_BIT(stream)) + nir_atomic_add_xfb_prim_count_amd(b, emit_prim[stream], .stream_id = stream); + } + } + nir_pop_if(b, if_shader_query); + } } nir_pop_if(b, if_invocation_0); @@ -1733,7 +1746,8 @@ ngg_nogs_build_streamout(nir_builder *b, lower_ngg_nogs_state *s) nir_ssa_def *so_buffer[4] = {0}; nir_ssa_def *prim_stride[4] = {0}; nir_ssa_def *tid_in_tg = nir_load_local_invocation_index(b); - ngg_build_streamout_buffer_info(b, info, scratch_base, tid_in_tg, + ngg_build_streamout_buffer_info(b, info, scratch_base, + s->has_prim_query, tid_in_tg, gen_prim_per_stream, prim_stride, so_buffer, buffer_offsets, emit_prim_per_stream); @@ -2692,7 +2706,8 @@ ngg_gs_build_streamout(nir_builder *b, lower_ngg_gs_state *st) nir_ssa_def *buffer_offsets[4] = {0}; nir_ssa_def *so_buffer[4] = {0}; nir_ssa_def *prim_stride[4] = {0}; - ngg_build_streamout_buffer_info(b, info, st->lds_addr_gs_scratch, tid_in_tg, gen_prim, + ngg_build_streamout_buffer_info(b, info, st->lds_addr_gs_scratch, + st->has_xfb_query, tid_in_tg, gen_prim, prim_stride, so_buffer, buffer_offsets, emit_prim); /* GS use packed location for vertex LDS storage. */