pan/bi: Implement nir_intrsinic_load_interpolated_input

Enough for basic varying reads.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4097>
This commit is contained in:
Alyssa Rosenzweig
2020-03-05 17:50:18 -05:00
committed by Marge Bot
parent 806533ba7f
commit 0767182665
+47
View File
@@ -59,6 +59,51 @@ emit_jump(bi_context *ctx, nir_jump_instr *instr)
bi_block_add_successor(ctx->current_block, branch->branch.target);
}
static void
bi_emit_ld_vary(bi_context *ctx, nir_intrinsic_instr *instr)
{
bi_instruction ins = {
.type = BI_LOAD_VAR,
.load_vary = {
.load = {
.location = nir_intrinsic_base(instr),
.channels = instr->num_components,
},
.interp_mode = BIFROST_INTERP_DEFAULT, /* TODO */
.reuse = false, /* TODO */
.flat = instr->intrinsic != nir_intrinsic_load_interpolated_input
},
.dest = bir_dest_index(&instr->dest),
.dest_type = nir_type_float | nir_dest_bit_size(instr->dest),
};
nir_src *offset = nir_get_io_offset_src(instr);
if (nir_src_is_const(*offset))
ins.load_vary.load.location += nir_src_as_uint(*offset);
else
ins.src[0] = bir_src_index(offset);
bi_emit(ctx, ins);
}
static void
emit_intrinsic(bi_context *ctx, nir_intrinsic_instr *instr)
{
switch (instr->intrinsic) {
case nir_intrinsic_load_barycentric_pixel:
/* stub */
break;
case nir_intrinsic_load_interpolated_input:
bi_emit_ld_vary(ctx, instr);
break;
default:
/* todo */
break;
}
}
static void
emit_instr(bi_context *ctx, struct nir_instr *instr)
{
@@ -67,11 +112,13 @@ emit_instr(bi_context *ctx, struct nir_instr *instr)
case nir_instr_type_load_const:
emit_load_const(ctx, nir_instr_as_load_const(instr));
break;
#endif
case nir_instr_type_intrinsic:
emit_intrinsic(ctx, nir_instr_as_intrinsic(instr));
break;
#if 0
case nir_instr_type_alu:
emit_alu(ctx, nir_instr_as_alu(instr));
break;