nir_imm_int(b, RADV_NGG_QUERY_PRIM_XFB_OFFSET(nir_intrinsic_stream_id(intrin))),
nir_imm_int(b, 0x100));
break;
+ case nir_intrinsic_atomic_add_gs_invocation_count_amd:
+ /* TODO: add gs invocation query emulation. */
+ break;
case nir_intrinsic_load_streamout_config_amd:
replacement = ac_nir_load_arg(b, &s->args->ac, s->args->ac.streamout_config);
intrinsic("atomic_add_gen_prim_count_amd", [1], indices=[STREAM_ID])
intrinsic("atomic_add_xfb_prim_count_amd", [1], indices=[STREAM_ID])
+# Atomically add current wave's invocation count to query result
+# src[] = { invocation_count }.
+intrinsic("atomic_add_gs_invocation_count_amd", [1])
+
# LDS offset for scratch section in NGG shader
system_value("lds_ngg_scratch_base_amd", 1)
# LDS offset for NGG GS shader vertex emit
break;
}
case nir_intrinsic_atomic_add_gs_emit_prim_count_amd:
+ case nir_intrinsic_atomic_add_gs_invocation_count_amd: {
+ nir_ssa_def *buf = load_internal_binding(b, args, SI_GS_QUERY_EMULATED_COUNTERS_BUF);
+
+ enum pipe_statistics_query_index index =
+ intrin->intrinsic == nir_intrinsic_atomic_add_gs_emit_prim_count_amd ?
+ PIPE_STAT_QUERY_GS_PRIMITIVES : PIPE_STAT_QUERY_GS_INVOCATIONS;
+ unsigned offset = si_query_pipestat_end_dw_offset(sel->screen, index) * 4;
+
+ nir_ssa_def *count = intrin->src[0].ssa;
+ nir_buffer_atomic_add_amd(b, 32, buf, count, .base = offset);
+ break;
+ }
case nir_intrinsic_atomic_add_gen_prim_count_amd:
case nir_intrinsic_atomic_add_xfb_prim_count_amd: {
- unsigned offset;
- nir_ssa_def *buf;
- if (intrin->intrinsic == nir_intrinsic_atomic_add_gs_emit_prim_count_amd) {
- buf = load_internal_binding(b, args, SI_GS_QUERY_EMULATED_COUNTERS_BUF);
- offset = si_query_pipestat_end_dw_offset(sel->screen, PIPE_STAT_QUERY_GS_PRIMITIVES) * 4;
- } else {
- unsigned stream = nir_intrinsic_stream_id(intrin);
- buf = load_internal_binding(b, args, SI_GS_QUERY_BUF);
- offset = intrin->intrinsic == nir_intrinsic_atomic_add_gen_prim_count_amd ?
- offsetof(struct gfx10_sh_query_buffer_mem, stream[stream].generated_primitives) :
- offsetof(struct gfx10_sh_query_buffer_mem, stream[stream].emitted_primitives);
- }
+ nir_ssa_def *buf = load_internal_binding(b, args, SI_GS_QUERY_BUF);
+
+ unsigned stream = nir_intrinsic_stream_id(intrin);
+ unsigned offset = intrin->intrinsic == nir_intrinsic_atomic_add_gen_prim_count_amd ?
+ offsetof(struct gfx10_sh_query_buffer_mem, stream[stream].generated_primitives) :
+ offsetof(struct gfx10_sh_query_buffer_mem, stream[stream].emitted_primitives);
nir_ssa_def *prim_count = intrin->src[0].ssa;
nir_buffer_atomic_add_amd(b, 32, buf, prim_count, .base = offset);