From d78070ded5eb97c2087045c3a7c496f11e1c3373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Wed, 25 Jun 2025 18:02:03 -0400 Subject: [PATCH] nir: move nir_io_add_intrinsic_xfb_info into its own file Acked-by: Alyssa Rosenzweig Part-of: --- src/compiler/nir/meson.build | 1 + src/compiler/nir/nir_io_add_xfb_info.c | 82 ++++++++++++++++++++++++++ src/compiler/nir/nir_lower_io.c | 76 ------------------------ 3 files changed, 83 insertions(+), 76 deletions(-) create mode 100644 src/compiler/nir/nir_io_add_xfb_info.c diff --git a/src/compiler/nir/meson.build b/src/compiler/nir/meson.build index e8ba5a6dc97..24cb4edd07f 100644 --- a/src/compiler/nir/meson.build +++ b/src/compiler/nir/meson.build @@ -129,6 +129,7 @@ else 'nir_inline_uniforms.c', 'nir_instr_set.c', 'nir_instr_set.h', + 'nir_io_add_xfb_info.c', 'nir_legacy.c', 'nir_legacy.h', 'nir_linking_helpers.c', diff --git a/src/compiler/nir/nir_io_add_xfb_info.c b/src/compiler/nir/nir_io_add_xfb_info.c new file mode 100644 index 00000000000..2bd59710247 --- /dev/null +++ b/src/compiler/nir/nir_io_add_xfb_info.c @@ -0,0 +1,82 @@ +/* + * Copyright 2025 Advanced Micro Devices, Inc. + * SPDX-License-Identifier: MIT + */ + +#include "nir.h" +#include "nir_xfb_info.h" + +bool +nir_io_add_intrinsic_xfb_info(nir_shader *nir) +{ + nir_function_impl *impl = nir_shader_get_entrypoint(nir); + bool progress = false; + + for (unsigned i = 0; i < NIR_MAX_XFB_BUFFERS; i++) + nir->info.xfb_stride[i] = nir->xfb_info->buffers[i].stride / 4; + + nir_foreach_block(block, impl) { + nir_foreach_instr_safe(instr, block) { + if (instr->type != nir_instr_type_intrinsic) + continue; + + nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); + + if (!nir_intrinsic_has_io_xfb(intr)) + continue; + + /* No indirect indexing allowed. The index is implied to be 0. */ + ASSERTED nir_src offset = *nir_get_io_offset_src(intr); + assert(nir_src_is_const(offset) && nir_src_as_uint(offset) == 0); + + /* Calling this pass for the second time shouldn't do anything. */ + if (nir_intrinsic_io_xfb(intr).out[0].num_components || + nir_intrinsic_io_xfb(intr).out[1].num_components || + nir_intrinsic_io_xfb2(intr).out[0].num_components || + nir_intrinsic_io_xfb2(intr).out[1].num_components) + continue; + + nir_io_semantics sem = nir_intrinsic_io_semantics(intr); + unsigned writemask = nir_intrinsic_write_mask(intr) << nir_intrinsic_component(intr); + + nir_io_xfb xfb[2]; + memset(xfb, 0, sizeof(xfb)); + + for (unsigned i = 0; i < nir->xfb_info->output_count; i++) { + nir_xfb_output_info *out = &nir->xfb_info->outputs[i]; + if (out->location == sem.location) { + unsigned xfb_mask = writemask & out->component_mask; + + /*fprintf(stdout, "output%u: buffer=%u, offset=%u, location=%u, " + "component_offset=%u, component_mask=0x%x, xfb_mask=0x%x, slots=%u\n", + i, out->buffer, + out->offset, + out->location, + out->component_offset, + out->component_mask, + xfb_mask, sem.num_slots);*/ + + while (xfb_mask) { + int start, count; + u_bit_scan_consecutive_range(&xfb_mask, &start, &count); + + xfb[start / 2].out[start % 2].num_components = count; + xfb[start / 2].out[start % 2].buffer = out->buffer; + /* out->offset is relative to the first stored xfb component */ + /* start is relative to component 0 */ + xfb[start / 2].out[start % 2].offset = + out->offset / 4 - out->component_offset + start; + + progress = true; + } + } + } + + nir_intrinsic_set_io_xfb(intr, xfb[0]); + nir_intrinsic_set_io_xfb2(intr, xfb[1]); + } + } + + nir_no_progress(impl); + return progress; +} diff --git a/src/compiler/nir/nir_lower_io.c b/src/compiler/nir/nir_lower_io.c index 03dab9bce44..23cba0b1ed8 100644 --- a/src/compiler/nir/nir_lower_io.c +++ b/src/compiler/nir/nir_lower_io.c @@ -29,7 +29,6 @@ #include "nir.h" #include "nir_builder.h" #include "nir_deref.h" -#include "nir_xfb_info.h" #include "util/u_math.h" @@ -3272,81 +3271,6 @@ nir_io_add_const_offset_to_base(nir_shader *nir, nir_variable_mode modes) return progress; } -bool -nir_io_add_intrinsic_xfb_info(nir_shader *nir) -{ - nir_function_impl *impl = nir_shader_get_entrypoint(nir); - bool progress = false; - - for (unsigned i = 0; i < NIR_MAX_XFB_BUFFERS; i++) - nir->info.xfb_stride[i] = nir->xfb_info->buffers[i].stride / 4; - - nir_foreach_block(block, impl) { - nir_foreach_instr_safe(instr, block) { - if (instr->type != nir_instr_type_intrinsic) - continue; - - nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); - - if (!nir_intrinsic_has_io_xfb(intr)) - continue; - - /* No indirect indexing allowed. The index is implied to be 0. */ - ASSERTED nir_src offset = *nir_get_io_offset_src(intr); - assert(nir_src_is_const(offset) && nir_src_as_uint(offset) == 0); - - /* Calling this pass for the second time shouldn't do anything. */ - if (nir_intrinsic_io_xfb(intr).out[0].num_components || - nir_intrinsic_io_xfb(intr).out[1].num_components || - nir_intrinsic_io_xfb2(intr).out[0].num_components || - nir_intrinsic_io_xfb2(intr).out[1].num_components) - continue; - - nir_io_semantics sem = nir_intrinsic_io_semantics(intr); - unsigned writemask = nir_intrinsic_write_mask(intr) << nir_intrinsic_component(intr); - - nir_io_xfb xfb[2]; - memset(xfb, 0, sizeof(xfb)); - - for (unsigned i = 0; i < nir->xfb_info->output_count; i++) { - nir_xfb_output_info *out = &nir->xfb_info->outputs[i]; - if (out->location == sem.location) { - unsigned xfb_mask = writemask & out->component_mask; - - /*fprintf(stdout, "output%u: buffer=%u, offset=%u, location=%u, " - "component_offset=%u, component_mask=0x%x, xfb_mask=0x%x, slots=%u\n", - i, out->buffer, - out->offset, - out->location, - out->component_offset, - out->component_mask, - xfb_mask, sem.num_slots);*/ - - while (xfb_mask) { - int start, count; - u_bit_scan_consecutive_range(&xfb_mask, &start, &count); - - xfb[start / 2].out[start % 2].num_components = count; - xfb[start / 2].out[start % 2].buffer = out->buffer; - /* out->offset is relative to the first stored xfb component */ - /* start is relative to component 0 */ - xfb[start / 2].out[start % 2].offset = - out->offset / 4 - out->component_offset + start; - - progress = true; - } - } - } - - nir_intrinsic_set_io_xfb(intr, xfb[0]); - nir_intrinsic_set_io_xfb2(intr, xfb[1]); - } - } - - nir_no_progress(impl); - return progress; -} - static int type_size_vec4(const struct glsl_type *type, bool bindless) {