brw: fix render target indexing in FS output reads

I forgot that the base indice is actually a more complex value that
encodes the render target index and other things.

Also fix the 1d-layered accesses by checking the size of the
framebuffer.

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/14008
Fixes: d4ab2087cf ("brw: lower non coherent FS load_output in NIR")
Reviewed-by: Alyssa Anne Rosenzweig <alyssa.rosenzweig@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37653>
This commit is contained in:
Lionel Landwerlin 2025-10-01 11:32:09 +03:00 committed by Marge Bot
parent 27c16c46fd
commit 69771e4bfe

View file

@ -20,29 +20,47 @@ brw_nir_lower_fs_load_output_instr(nir_builder *b,
const struct brw_wm_prog_key *key = data;
const unsigned l = GET_FIELD(nir_intrinsic_base(intrin),
BRW_NIR_FRAG_OUTPUT_LOCATION);
assert(l >= FRAG_RESULT_DATA0);
const unsigned load_offset = nir_src_as_uint(intrin->src[0]);
const unsigned target = l - FRAG_RESULT_DATA0 + load_offset;
/* Only used by Iris that never sets this to SOMETIMES */
assert(key->multisample_fbo != INTEL_SOMETIMES);
b->cursor = nir_before_instr(&intrin->instr);
/* Query the framebuffer size to figure out where the layer index should go
* in the coordinates. RESINFO returns 0 in the 3rd component for 1D
* images.
*/
nir_def *size = nir_txs(b, .dim = GLSL_SAMPLER_DIM_3D, .texture_index = target);
nir_def *coords[3] = {
nir_f2u32(b, nir_channel(b, nir_load_frag_coord(b), 0)),
nir_f2u32(b, nir_channel(b, nir_load_frag_coord(b), 1)),
nir_load_layer_id(b),
};
/* For 1D framebuffers, the layer ID goes in .y, not .z */
nir_def *is_1d = nir_ieq_imm(b, nir_channel(b, size, 2), 0);
coords[1] = nir_bcsel(b, is_1d, coords[2], coords[1]);
nir_def *coord = nir_vec(b, coords, 3);
nir_def *tex =
key->multisample_fbo == INTEL_NEVER ?
nir_build_tex(b, nir_texop_txf, coord,
.texture_index = nir_intrinsic_base(intrin),
.texture_index = target,
.dim = GLSL_SAMPLER_DIM_2D,
.is_array = true,
.dest_type = nir_type_uint32) :
nir_build_tex(b, nir_texop_txf_ms, coord,
.texture_index = nir_intrinsic_base(intrin),
.ms_index = nir_load_sample_id(b),
.texture_index = target,
.dim = GLSL_SAMPLER_DIM_MS,
.is_array = true,
.ms_index = nir_load_sample_id(b),
.dest_type = nir_type_uint32);
nir_def_replace(&intrin->def, tex);