| /* |
| * Copyright © 2025 Valve Corporation |
| * |
| * SPDX-License-Identifier: MIT |
| */ |
| |
| #include "radv_nir.h" |
| #include "radv_printf.h" |
| |
| #include "util/u_printf.h" |
| |
| #include "nir.h" |
| #include "nir_builder.h" |
| |
| static bool |
| pass(nir_builder *b, nir_intrinsic_instr *instr, void *state) |
| { |
| if (instr->intrinsic != nir_intrinsic_printf) |
| return false; |
| |
| u_printf_info *info = &b->shader->printf_info[nir_intrinsic_fmt_idx(instr)]; |
| |
| nir_def **args = malloc(info->num_args * sizeof(nir_def *)); |
| |
| b->cursor = nir_after_instr(&instr->instr); |
| |
| nir_deref_instr *packed_args = nir_src_as_deref(instr->src[0]); |
| for (uint32_t i = 0; i < info->num_args; i++) |
| args[i] = nir_load_deref(b, nir_build_deref_struct(b, packed_args, i)); |
| |
| radv_build_printf_args(b, NULL, info->strings, info->num_args, args); |
| |
| nir_instr_remove(&instr->instr); |
| |
| free(args); |
| |
| return true; |
| } |
| |
| bool |
| radv_nir_lower_printf(nir_shader *shader) |
| { |
| bool progress = nir_shader_intrinsics_pass(shader, pass, nir_metadata_none, NULL); |
| |
| /* cleanup */ |
| if (progress) { |
| nir_split_struct_vars(shader, nir_var_function_temp); |
| nir_lower_vars_to_ssa(shader); |
| } |
| |
| return progress; |
| } |