nir: add a base offset for printf indexing

This will allow a driver to use a single table of printf strings
across all shaders.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Karol Herbst <kherbst@redhat.com>
Reviewed-by: Ivan Briano <ivan.briano@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25814>
This commit is contained in:
Lionel Landwerlin 2024-02-27 18:44:25 +02:00 committed by Marge Bot
parent 8d336f069e
commit 2be28ee58a
5 changed files with 15 additions and 1 deletions

View file

@ -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);

View file

@ -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;

View file

@ -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)

View file

@ -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,

View file

@ -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);