mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-04 04:50:11 +01:00
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:
parent
8d336f069e
commit
2be28ee58a
5 changed files with 15 additions and 1 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue