blob: 6055c3c0bab763c1a4c5681da246496858a68ac4 [file] [log] [blame]
/*
* 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;
}