diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 2f824db1c5b..ed84cb5f98e 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -6444,6 +6444,7 @@ bool nir_lower_helper_writes(nir_shader *shader, bool lower_plain_stores); typedef struct nir_lower_printf_options { unsigned max_buffer_size; + bool use_printf_base_identifier; } nir_lower_printf_options; bool nir_lower_printf(nir_shader *nir, const nir_lower_printf_options *options); diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index 596bf8f0bef..44cb65e85ec 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -267,6 +267,7 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state) case nir_intrinsic_preamble_start_ir3: case nir_intrinsic_optimization_barrier_sgpr_amd: case nir_intrinsic_load_printf_buffer_address: + case nir_intrinsic_load_printf_base_identifier: is_divergent = false; break; diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index 319f0a9acfc..4d6246476fe 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -1227,6 +1227,10 @@ intrinsic("printf", src_comp=[1, 1], dest_comp=1, bit_sizes=[32]) # in a buffer, nir_lower_printf will do that, but requires # the driver to at least provide a base location system_value("printf_buffer_address", 1, bit_sizes=[32,64]) +# If driver wants to have all printfs from various shaders merged into a +# single output buffer, it needs each shader to have its own base identifier +# from which each printf is indexed. +system_value("printf_base_identifier", 1, bit_sizes=[32]) # Mesh shading MultiView intrinsics system_value("mesh_view_count", 1) diff --git a/src/compiler/nir/nir_lower_printf.c b/src/compiler/nir/nir_lower_printf.c index 55d1162a356..6173ff50043 100644 --- a/src/compiler/nir/nir_lower_printf.c +++ b/src/compiler/nir/nir_lower_printf.c @@ -34,7 +34,15 @@ lower_printf_intrin(nir_builder *b, nir_intrinsic_instr *prntf, void *_options) if (prntf->intrinsic != nir_intrinsic_printf) return false; + b->cursor = nir_before_instr(&prntf->instr); + nir_def *fmt_str_id = prntf->src[0].ssa; + if (options && options->use_printf_base_identifier) { + fmt_str_id = nir_iadd(b, + nir_load_printf_base_identifier(b), + fmt_str_id); + } + nir_deref_instr *args = nir_src_as_deref(prntf->src[1]); assert(args->deref_type == nir_deref_type_var); @@ -43,7 +51,6 @@ lower_printf_intrin(nir_builder *b, nir_intrinsic_instr *prntf, void *_options) /* Atomic add a buffer size counter to determine where to write. If * overflowed, return -1, otherwise, store the arguments and return 0. */ - b->cursor = nir_before_instr(&prntf->instr); nir_def *buffer_addr = nir_load_printf_buffer_address(b, ptr_bit_size); nir_deref_instr *buffer = nir_build_deref_cast(b, buffer_addr, nir_var_mem_global, diff --git a/src/gallium/frontends/rusticl/core/kernel.rs b/src/gallium/frontends/rusticl/core/kernel.rs index edd4060479f..010b067dbc5 100644 --- a/src/gallium/frontends/rusticl/core/kernel.rs +++ b/src/gallium/frontends/rusticl/core/kernel.rs @@ -463,6 +463,7 @@ fn lower_and_optimize_nir( nir_pass!(nir, nir_dedup_inline_samplers); let printf_opts = nir_lower_printf_options { + use_printf_base_identifier: false, max_buffer_size: dev.printf_buffer_size() as u32, }; nir_pass!(nir, nir_lower_printf, &printf_opts);