[Mesa-dev] [PATCH 16/21] etnaviv: compiler: generate texture loads
Philipp Zabel
p.zabel at pengutronix.de
Tue Jun 5 14:38:40 UTC 2018
Emit TEXLD, TEXLDB, and TEXLDL instructions from nir_texop_tex,
nir_texop_txb, and nir_texop_txl texture loads, respectively.
Signed-off-by: Philipp Zabel <p.zabel at pengutronix.de>
Signed-off-by: Michael Tretter <m.tretter at pengutronix.de>
---
.../drivers/etnaviv/etnaviv_compiler.c | 65 +++++++++++++++++++
1 file changed, 65 insertions(+)
diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler.c b/src/gallium/drivers/etnaviv/etnaviv_compiler.c
index f17b9979b705..b2499a7e2f6c 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_compiler.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_compiler.c
@@ -2186,6 +2186,68 @@ etna_emit_intr(struct etna_compile *c, nir_intrinsic_instr *intr)
}
}
+static void
+etna_emit_tex(struct etna_compile *c, nir_tex_instr *instr)
+{
+ struct etna_inst_dst dst;
+ struct etna_inst_tex tex;
+ struct etna_inst_src src;
+
+ dst.use = 1;
+ dst.amode = 0;
+ dst.reg = instr->dest.is_ssa ? 0 : instr->dest.reg.reg->index;
+ /* nir_tex_instr does not support write mask */
+ dst.comps = INST_COMPS_X | INST_COMPS_Y | INST_COMPS_Z | INST_COMPS_W;
+
+ assert(!instr->texture);
+ assert(nir_tex_instr_src_index(instr, nir_tex_src_texture_offset) == -1);
+ tex.id = instr->texture_index;
+ tex.amode = 0;
+ tex.swiz = INST_SWIZ_IDENTITY;
+
+ src.use = 1;
+ src.reg = instr->src[0].src.is_ssa ? 0 : instr->src[0].src.reg.reg->index;
+ src.swiz = INST_SWIZ_IDENTITY;
+ src.neg = 0;
+ src.abs = 0;
+ src.amode = 0;
+ src.rgroup = 0;
+
+ switch (instr->op) {
+ case nir_texop_tex:
+ emit_inst(c, &(struct etna_inst) {
+ .opcode = INST_OPCODE_TEXLD,
+ .sat = 0,
+ .dst = dst,
+ .tex = tex,
+ .src[0] = src,
+ });
+ break;
+ case nir_texop_txb:
+ emit_inst(c, &(struct etna_inst) {
+ .opcode = INST_OPCODE_TEXLDB,
+ .sat = 0,
+ .dst = dst,
+ .tex = tex,
+ .src[0] = src,
+ });
+ break;
+ case nir_texop_txl:
+ emit_inst(c, &(struct etna_inst) {
+ .opcode = INST_OPCODE_TEXLDL,
+ .sat = 0,
+ .dst = dst,
+ .tex = tex,
+ .src[0] = src,
+ });
+ break;
+ default:
+ BUG("Unhandled nir_tex_instr: %d\n", instr->op);
+ assert(0);
+ break;
+ }
+}
+
static void
etna_emit_instr(struct etna_compile *c, nir_instr *instr)
{
@@ -2193,6 +2255,9 @@ etna_emit_instr(struct etna_compile *c, nir_instr *instr)
case nir_instr_type_alu:
etna_emit_alu(c, nir_instr_as_alu(instr));
break;
+ case nir_instr_type_tex:
+ etna_emit_tex(c, nir_instr_as_tex(instr));
+ break;
case nir_instr_type_intrinsic:
etna_emit_intr(c, nir_instr_as_intrinsic(instr));
break;
--
2.17.1
More information about the mesa-dev
mailing list