r600: add support for vertex fetches via texture cache
authorDave Airlie <airlied@redhat.com>
Thu, 31 Mar 2016 05:49:55 +0000 (15:49 +1000)
committerDave Airlie <airlied@redhat.com>
Mon, 26 Jun 2017 06:23:20 +0000 (16:23 +1000)
On evergreen we can route vertex fetches via the texture cache,
and this is required for some images support. So add support
to the asm builder for it.

Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/r600_asm.c
src/gallium/drivers/r600/r600_asm.h

index 27f564768e0e506c8cd2505e23e73389c8f9d532..9761fe0b8df34dafac79b647efa1486a269abd61 100644 (file)
@@ -1336,7 +1336,8 @@ static inline boolean last_inst_was_not_vtx_fetch(struct r600_bytecode *bc)
                        bc->cf_last->op != CF_OP_TEX));
 }
 
-int r600_bytecode_add_vtx(struct r600_bytecode *bc, const struct r600_bytecode_vtx *vtx)
+static int r600_bytecode_add_vtx_internal(struct r600_bytecode *bc, const struct r600_bytecode_vtx *vtx,
+                                         bool use_tc)
 {
        struct r600_bytecode_vtx *nvtx = r600_bytecode_vtx();
        int r;
@@ -1363,9 +1364,14 @@ int r600_bytecode_add_vtx(struct r600_bytecode *bc, const struct r600_bytecode_v
                switch (bc->chip_class) {
                case R600:
                case R700:
-               case EVERGREEN:
                        bc->cf_last->op = CF_OP_VTX;
                        break;
+               case EVERGREEN:
+                       if (use_tc)
+                               bc->cf_last->op = CF_OP_TEX;
+                       else
+                               bc->cf_last->op = CF_OP_VTX;
+                       break;
                case CAYMAN:
                        bc->cf_last->op = CF_OP_TEX;
                        break;
@@ -1388,6 +1394,16 @@ int r600_bytecode_add_vtx(struct r600_bytecode *bc, const struct r600_bytecode_v
        return 0;
 }
 
+int r600_bytecode_add_vtx(struct r600_bytecode *bc, const struct r600_bytecode_vtx *vtx)
+{
+       return r600_bytecode_add_vtx_internal(bc, vtx, false);
+}
+
+int r600_bytecode_add_vtx_tc(struct r600_bytecode *bc, const struct r600_bytecode_vtx *vtx)
+{
+       return r600_bytecode_add_vtx_internal(bc, vtx, true);
+}
+
 int r600_bytecode_add_tex(struct r600_bytecode *bc, const struct r600_bytecode_tex *tex)
 {
        struct r600_bytecode_tex *ntex = r600_bytecode_tex();
index b12913d4374cb04ba08b52696c4a0186680b3470..8992e0dfb221f1f6b79340d9f82d01d3c9dc4951 100644 (file)
@@ -268,6 +268,8 @@ int r600_bytecode_add_alu(struct r600_bytecode *bc,
                const struct r600_bytecode_alu *alu);
 int r600_bytecode_add_vtx(struct r600_bytecode *bc,
                const struct r600_bytecode_vtx *vtx);
+int r600_bytecode_add_vtx_tc(struct r600_bytecode *bc,
+                            const struct r600_bytecode_vtx *vtx);
 int r600_bytecode_add_tex(struct r600_bytecode *bc,
                const struct r600_bytecode_tex *tex);
 int r600_bytecode_add_gds(struct r600_bytecode *bc,