pan/bi: Emit TEXC with builder
Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8135>
This commit is contained in:
parent
e477de829f
commit
70d6c5675d
|
@ -3160,6 +3160,171 @@ enum bifrost_tex_dreg {
|
||||||
BIFROST_TEX_DREG_COUNT,
|
BIFROST_TEX_DREG_COUNT,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
bi_emit_texc(bi_builder *b, nir_tex_instr *instr)
|
||||||
|
{
|
||||||
|
/* TODO: support more with other encodings */
|
||||||
|
assert(instr->sampler_index < 16);
|
||||||
|
|
||||||
|
/* TODO: support more ops */
|
||||||
|
switch (instr->op) {
|
||||||
|
case nir_texop_tex:
|
||||||
|
case nir_texop_txl:
|
||||||
|
case nir_texop_txb:
|
||||||
|
case nir_texop_txf:
|
||||||
|
case nir_texop_txf_ms:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
unreachable("Unsupported texture op");
|
||||||
|
}
|
||||||
|
|
||||||
|
struct bifrost_texture_operation desc = {
|
||||||
|
.sampler_index_or_mode = instr->sampler_index,
|
||||||
|
.index = instr->texture_index,
|
||||||
|
.immediate_indices = 1, /* TODO */
|
||||||
|
.op = bi_tex_op(instr->op),
|
||||||
|
.offset_or_bias_disable = false, /* TODO */
|
||||||
|
.shadow_or_clamp_disable = instr->is_shadow,
|
||||||
|
.array = instr->is_array,
|
||||||
|
.dimension = bifrost_tex_format(instr->sampler_dim),
|
||||||
|
.format = bi_texture_format(instr->dest_type | nir_dest_bit_size(instr->dest), BI_CLAMP_NONE), /* TODO */
|
||||||
|
.mask = 0xF,
|
||||||
|
};
|
||||||
|
|
||||||
|
switch (desc.op) {
|
||||||
|
case BIFROST_TEX_OP_TEX:
|
||||||
|
desc.lod_or_fetch = BIFROST_LOD_MODE_COMPUTE;
|
||||||
|
break;
|
||||||
|
case BIFROST_TEX_OP_FETCH:
|
||||||
|
/* TODO: gathers */
|
||||||
|
desc.lod_or_fetch = BIFROST_TEXTURE_FETCH_TEXEL;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
unreachable("texture op unsupported");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 32-bit indices to be allocated as consecutive staging registers */
|
||||||
|
bi_index dregs[BIFROST_TEX_DREG_COUNT] = { };
|
||||||
|
bi_index cx = bi_null(), cy = bi_null();
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < instr->num_srcs; ++i) {
|
||||||
|
bi_index index = bi_src_index(&instr->src[i].src);
|
||||||
|
unsigned sz = nir_src_bit_size(instr->src[i].src);
|
||||||
|
ASSERTED nir_alu_type base = nir_tex_instr_src_type(instr, i);
|
||||||
|
nir_alu_type T = base | sz;
|
||||||
|
|
||||||
|
switch (instr->src[i].src_type) {
|
||||||
|
case nir_tex_src_coord:
|
||||||
|
if (instr->sampler_dim == GLSL_SAMPLER_DIM_CUBE) {
|
||||||
|
cx = bi_emit_texc_cube_coord(b, index, &cy);
|
||||||
|
} else {
|
||||||
|
unsigned components = nir_src_num_components(instr->src[i].src);
|
||||||
|
|
||||||
|
/* Copy XY (for 2D+) or XX (for 1D) */
|
||||||
|
cx = index;
|
||||||
|
cy = bi_word(index, MIN2(1, components - 1));
|
||||||
|
|
||||||
|
assert(components >= 1 && components <= 3);
|
||||||
|
|
||||||
|
if (components < 3) {
|
||||||
|
/* nothing to do */
|
||||||
|
} else if (desc.array) {
|
||||||
|
/* 2D array */
|
||||||
|
dregs[BIFROST_TEX_DREG_ARRAY] =
|
||||||
|
bi_emit_texc_array_index(b,
|
||||||
|
bi_word(index, 2), T);
|
||||||
|
} else {
|
||||||
|
/* 3D */
|
||||||
|
dregs[BIFROST_TEX_DREG_Z_COORD] =
|
||||||
|
bi_word(index, 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case nir_tex_src_lod:
|
||||||
|
if (desc.op == BIFROST_TEX_OP_TEX &&
|
||||||
|
nir_src_is_const(instr->src[i].src) &&
|
||||||
|
nir_src_as_uint(instr->src[i].src) == 0) {
|
||||||
|
desc.lod_or_fetch = BIFROST_LOD_MODE_ZERO;
|
||||||
|
} else if (desc.op == BIFROST_TEX_OP_TEX) {
|
||||||
|
assert(base == nir_type_float);
|
||||||
|
|
||||||
|
assert(sz == 16 || sz == 32);
|
||||||
|
dregs[BIFROST_TEX_DREG_LOD] =
|
||||||
|
bi_emit_texc_lod_88(b, index, sz == 16);
|
||||||
|
desc.lod_or_fetch = BIFROST_LOD_MODE_EXPLICIT;
|
||||||
|
} else {
|
||||||
|
assert(desc.op == BIFROST_TEX_OP_FETCH);
|
||||||
|
assert(base == nir_type_uint || base == nir_type_int);
|
||||||
|
assert(sz == 16 || sz == 32);
|
||||||
|
|
||||||
|
dregs[BIFROST_TEX_DREG_LOD] =
|
||||||
|
bi_emit_texc_lod_cube(b, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case nir_tex_src_bias:
|
||||||
|
/* Upper 16-bits interpreted as a clamp, leave zero */
|
||||||
|
assert(desc.op == BIFROST_TEX_OP_TEX);
|
||||||
|
assert(base == nir_type_float);
|
||||||
|
assert(sz == 16 || sz == 32);
|
||||||
|
dregs[BIFROST_TEX_DREG_LOD] =
|
||||||
|
bi_emit_texc_lod_88(b, index, sz == 16);
|
||||||
|
desc.lod_or_fetch = BIFROST_LOD_MODE_BIAS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case nir_tex_src_ms_index:
|
||||||
|
case nir_tex_src_offset:
|
||||||
|
if (desc.offset_or_bias_disable)
|
||||||
|
break;
|
||||||
|
|
||||||
|
dregs[BIFROST_TEX_DREG_OFFSETMS] =
|
||||||
|
bi_emit_texc_offset_ms_index(b, instr);
|
||||||
|
if (!bi_is_equiv(dregs[BIFROST_TEX_DREG_OFFSETMS], bi_zero()))
|
||||||
|
desc.offset_or_bias_disable = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case nir_tex_src_comparator:
|
||||||
|
dregs[BIFROST_TEX_DREG_SHADOW] = index;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
unreachable("Unhandled src type in texc emit");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (desc.op == BIFROST_TEX_OP_FETCH && bi_is_null(dregs[BIFROST_TEX_DREG_LOD])) {
|
||||||
|
dregs[BIFROST_TEX_DREG_LOD] =
|
||||||
|
bi_emit_texc_lod_cube(b, bi_zero());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate staging registers contiguously by compacting the array.
|
||||||
|
* Index is not SSA (tied operands) */
|
||||||
|
|
||||||
|
bi_index idx = bi_temp_reg(b->shader);
|
||||||
|
unsigned sr_count = 0;
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < ARRAY_SIZE(dregs); ++i) {
|
||||||
|
if (!bi_is_null(dregs[i]))
|
||||||
|
dregs[sr_count++] = dregs[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sr_count)
|
||||||
|
bi_make_vec_to(b, idx, dregs, NULL, sr_count, 32);
|
||||||
|
else
|
||||||
|
bi_mov_i32_to(b, idx, bi_zero()); /* XXX: shouldn't be necessary */
|
||||||
|
|
||||||
|
uint32_t desc_u = 0;
|
||||||
|
memcpy(&desc_u, &desc, sizeof(desc_u));
|
||||||
|
bi_texc_to(b, idx, idx, cx, cy, bi_imm_u32(desc_u), sr_count);
|
||||||
|
|
||||||
|
/* Explicit copy to facilitate tied operands */
|
||||||
|
bi_index srcs[4] = { idx, idx, idx, idx };
|
||||||
|
unsigned channels[4] = { 0, 1, 2, 3 };
|
||||||
|
bi_make_vec_to(b, bi_dest_index(&instr->dest), srcs, channels, 4, 32);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
emit_texc(bi_context *ctx, nir_tex_instr *instr)
|
emit_texc(bi_context *ctx, nir_tex_instr *instr)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue