pan/bi: Add data register passing infrastructure
Lower to a COMBINE, which in turn will lower to moves so RA does the right thing. Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7081>
This commit is contained in:
@@ -1030,6 +1030,24 @@ bi_texture_format(nir_alu_type T, enum bifrost_outmod outmod)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Data registers required by texturing in the order they appear. All are
|
||||||
|
* optional, the texture operation descriptor determines which are present.
|
||||||
|
* Note since 3D arrays are not permitted at an API level, Z_COORD and
|
||||||
|
* ARRAY/SHADOW are exlusive, so TEXC in practice reads at most 8 registers */
|
||||||
|
|
||||||
|
enum bifrost_tex_dreg {
|
||||||
|
BIFROST_TEX_DREG_Z_COORD = 0,
|
||||||
|
BIFROST_TEX_DREG_Y_DELTAS = 1,
|
||||||
|
BIFROST_TEX_DREG_LOD = 2,
|
||||||
|
BIFROST_TEX_DREG_GRDESC_HI = 3,
|
||||||
|
BIFROST_TEX_DREG_SHADOW = 4,
|
||||||
|
BIFROST_TEX_DREG_ARRAY = 5,
|
||||||
|
BIFROST_TEX_DREG_OFFSETMS = 6,
|
||||||
|
BIFROST_TEX_DREG_SAMPLER = 7,
|
||||||
|
BIFROST_TEX_DREG_TEXTURE = 8,
|
||||||
|
BIFROST_TEX_DREG_COUNT,
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
emit_texc(bi_context *ctx, nir_tex_instr *instr)
|
emit_texc(bi_context *ctx, nir_tex_instr *instr)
|
||||||
{
|
{
|
||||||
@@ -1072,6 +1090,9 @@ emit_texc(bi_context *ctx, nir_tex_instr *instr)
|
|||||||
.mask = (1 << tex.vector_channels) - 1
|
.mask = (1 << tex.vector_channels) - 1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* 32-bit indices to be allocated as consecutive data registers. */
|
||||||
|
unsigned dregs[BIFROST_TEX_DREG_COUNT] = { 0 };
|
||||||
|
|
||||||
for (unsigned i = 0; i < instr->num_srcs; ++i) {
|
for (unsigned i = 0; i < instr->num_srcs; ++i) {
|
||||||
unsigned index = pan_src_index(&instr->src[i].src);
|
unsigned index = pan_src_index(&instr->src[i].src);
|
||||||
|
|
||||||
@@ -1088,6 +1109,35 @@ emit_texc(bi_context *ctx, nir_tex_instr *instr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Allocate data registers contiguously */
|
||||||
|
bi_instruction combine = {
|
||||||
|
.type = BI_COMBINE,
|
||||||
|
.dest_type = nir_type_uint32,
|
||||||
|
.dest = bi_make_temp(ctx),
|
||||||
|
.src_types = {
|
||||||
|
nir_type_uint32, nir_type_uint32,
|
||||||
|
nir_type_uint32, nir_type_uint32,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned dreg_index = 0;
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < ARRAY_SIZE(dregs); ++i) {
|
||||||
|
assert(dreg_index < 4);
|
||||||
|
|
||||||
|
if (dregs[i])
|
||||||
|
combine.src[dreg_index++] = dregs[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Pass combined data registers together */
|
||||||
|
if (dreg_index > 0) {
|
||||||
|
tex.src[0] = combine.dest;
|
||||||
|
bi_emit(ctx, combine);
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < dreg_index; ++i)
|
||||||
|
tex.swizzle[0][i] = i;
|
||||||
|
}
|
||||||
|
|
||||||
/* Pass the texture operation descriptor in src2 */
|
/* Pass the texture operation descriptor in src2 */
|
||||||
tex.src[3] = BIR_INDEX_CONSTANT;
|
tex.src[3] = BIR_INDEX_CONSTANT;
|
||||||
memcpy(&tex.constant.u64, &desc, sizeof(desc));
|
memcpy(&tex.constant.u64, &desc, sizeof(desc));
|
||||||
|
Reference in New Issue
Block a user