From: Dave Airlie <[email protected]>

This adds support for emitting RAT instructions to the assembler.
RAT instructions are used to implement image accessors.

Signed-off-by: Dave Airlie <[email protected]>
---
 src/gallium/drivers/r600/eg_asm.c   | 19 +++++++++++++++++++
 src/gallium/drivers/r600/eg_sq.h    | 13 +++++++++++++
 src/gallium/drivers/r600/r600_asm.c |  9 +++++++++
 src/gallium/drivers/r600/r600_asm.h |  7 +++++++
 4 files changed, 48 insertions(+)

diff --git a/src/gallium/drivers/r600/eg_asm.c 
b/src/gallium/drivers/r600/eg_asm.c
index 8b09761..498c9f7 100644
--- a/src/gallium/drivers/r600/eg_asm.c
+++ b/src/gallium/drivers/r600/eg_asm.c
@@ -95,6 +95,25 @@ int eg_bytecode_cf_build(struct r600_bytecode *bc, struct 
r600_bytecode_cf *cf)
                        if (bc->chip_class == EVERGREEN) /* no EOP on cayman */
                                bc->bytecode[id] |= 
S_SQ_CF_ALLOC_EXPORT_WORD1_END_OF_PROGRAM(cf->end_of_program);
                        id++;
+               } else if (cfop->flags & CF_RAT) {
+                       bc->bytecode[id++] = 
S_SQ_CF_ALLOC_EXPORT_WORD0_RAT_RAT_ID(cf->rat.id) |
+                                       
S_SQ_CF_ALLOC_EXPORT_WORD0_RAT_RAT_INST(cf->rat.inst) |
+                                       
S_SQ_CF_ALLOC_EXPORT_WORD0_RAT_RAT_INDEX_MODE(cf->rat.index_mode) |
+                                       
S_SQ_CF_ALLOC_EXPORT_WORD0_RW_GPR(cf->output.gpr) |
+                                       
S_SQ_CF_ALLOC_EXPORT_WORD0_ELEM_SIZE(cf->output.elem_size) |
+                                       
S_SQ_CF_ALLOC_EXPORT_WORD0_TYPE(cf->output.type) |
+                                       
S_SQ_CF_ALLOC_EXPORT_WORD0_INDEX_GPR(cf->output.index_gpr);
+                       bc->bytecode[id] = 
S_SQ_CF_ALLOC_EXPORT_WORD1_BURST_COUNT(cf->output.burst_count - 1) |
+                                       
S_SQ_CF_ALLOC_EXPORT_WORD1_BARRIER(cf->barrier) |
+                                       
S_SQ_CF_ALLOC_EXPORT_WORD1_MARK(cf->mark) |
+                                       
S_SQ_CF_ALLOC_EXPORT_WORD1_VALID_PIXEL_MODE(cf->vpm) |
+                                       
S_SQ_CF_ALLOC_EXPORT_WORD1_CF_INST(opcode) |
+                                       
S_SQ_CF_ALLOC_EXPORT_WORD1_BUF_COMP_MASK(cf->output.comp_mask) |
+                                       
S_SQ_CF_ALLOC_EXPORT_WORD1_BUF_ARRAY_SIZE(cf->output.array_size);
+                       if (bc->chip_class == EVERGREEN) /* no EOP on cayman */
+                               bc->bytecode[id] |= 
S_SQ_CF_ALLOC_EXPORT_WORD1_END_OF_PROGRAM(cf->end_of_program);
+                       id++;
+
                } else if (cfop->flags & CF_MEM) {
                        /* MEM_STREAM, MEM_RING instructions */
                        bc->bytecode[id++] = 
S_SQ_CF_ALLOC_EXPORT_WORD0_RW_GPR(cf->output.gpr) |
diff --git a/src/gallium/drivers/r600/eg_sq.h b/src/gallium/drivers/r600/eg_sq.h
index c118d3a..d37efea 100644
--- a/src/gallium/drivers/r600/eg_sq.h
+++ b/src/gallium/drivers/r600/eg_sq.h
@@ -176,6 +176,19 @@
 #define   G_SQ_CF_ALLOC_EXPORT_WORD0_ELEM_SIZE(x)                    (((x) >> 
30) & 0x3)
 #define   C_SQ_CF_ALLOC_EXPORT_WORD0_ELEM_SIZE                       0x3FFFFFFF
 /* done */
+
+#define P_SQ_CF_ALLOC_EXPORT_WORD0_RAT
+#define   S_SQ_CF_ALLOC_EXPORT_WORD0_RAT_RAT_ID(x)                   (((x) & 
0xF) << 0)
+#define   G_SQ_CF_ALLOC_EXPORT_WORD0_RAT_RAT_ID(x)                   (((x) >> 
0) & 0xF)
+#define   C_SQ_CF_ALLOC_EXPORT_WORD0_RAT_RAT_ID                      0xFFFFFFF0
+#define   S_SQ_CF_ALLOC_EXPORT_WORD0_RAT_RAT_INST(x)                 (((x) & 
0x3F) << 4)
+#define   G_SQ_CF_ALLOC_EXPORT_WORD0_RAT_RAT_INST(x)                 (((x) >> 
4) & 0x3F)
+#define   C_SQ_CF_ALLOC_EXPORT_WORD0_RAT_RAT_INST                    0xFFFFFC0F
+#define   S_SQ_CF_ALLOC_EXPORT_WORD0_RAT_RAT_INDEX_MODE(x)           (((x) & 
0x3) << 11)
+#define   G_SQ_CF_ALLOC_EXPORT_WORD0_RAT_RAT_INDEX_MODE(x)           (((x) >> 
11) & 0x3)
+#define   C_SQ_CF_ALLOC_EXPORT_WORD0_RAT_RAT_INDEX_MODE              0xFFFFE7FF
+
+/* done */
 #define P_SQ_CF_ALLOC_EXPORT_WORD1
 #define   S_SQ_CF_ALLOC_EXPORT_WORD1_BURST_COUNT(x)                  (((x) & 
0xF) << 16)
 #define   G_SQ_CF_ALLOC_EXPORT_WORD1_BURST_COUNT(x)                  (((x) >> 
16) & 0xF)
diff --git a/src/gallium/drivers/r600/r600_asm.c 
b/src/gallium/drivers/r600/r600_asm.c
index 26466c5..fdc174a 100644
--- a/src/gallium/drivers/r600/r600_asm.c
+++ b/src/gallium/drivers/r600/r600_asm.c
@@ -2135,6 +2135,15 @@ void r600_bytecode_disasm(struct r600_bytecode *bc)
                                                bc->bytecode[id], 
bc->bytecode[id + 1], cfop->name);
                                o += print_indent(o, 43);
                                o += fprintf(stderr, "%s ", 
exp_type[cf->output.type]);
+
+                               if (r600_isa_cf(cf->op)->flags & CF_RAT) {
+                                       o += fprintf(stderr, "RAT%d", 
cf->rat.id);
+                                       if (cf->rat.index_mode) {
+                                               o += fprintf(stderr, "[IDX%d]", 
cf->rat.index_mode - 1);
+                                       }
+                                       o += fprintf(stderr, " INST: %d ", 
cf->rat.inst);
+                               }
+
                                if (cf->output.burst_count > 1) {
                                        o += fprintf(stderr, "%d-%d ", 
cf->output.array_base,
                                                        cf->output.array_base + 
cf->output.burst_count - 1);
diff --git a/src/gallium/drivers/r600/r600_asm.h 
b/src/gallium/drivers/r600/r600_asm.h
index 4c7d971..6f5b69b 100644
--- a/src/gallium/drivers/r600/r600_asm.h
+++ b/src/gallium/drivers/r600/r600_asm.h
@@ -153,6 +153,12 @@ struct r600_bytecode_output {
        unsigned                        index_gpr;
 };
 
+struct r600_bytecode_rat {
+       unsigned                        id;
+       unsigned                        inst;
+       unsigned                        index_mode;
+};
+
 struct r600_bytecode_kcache {
        unsigned                        bank;
        unsigned                        mode;
@@ -183,6 +189,7 @@ struct r600_bytecode_cf {
        struct list_head                vtx;
        struct list_head                gds;
        struct r600_bytecode_output             output;
+       struct r600_bytecode_rat                rat;
        struct r600_bytecode_alu                *curr_bs_head;
        struct r600_bytecode_alu                *prev_bs_head;
        struct r600_bytecode_alu                *prev2_bs_head;
-- 
2.5.0

_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to