r600g: fix sampler/ubo indexing on cayman
authorDave Airlie <airlied@redhat.com>
Thu, 9 Jul 2015 05:22:09 +0000 (15:22 +1000)
committerDave Airlie <airlied@redhat.com>
Sat, 11 Jul 2015 06:30:39 +0000 (16:30 +1000)
Cayman needs a different method to upload the CF IDX0/1

This fixes 31 piglits when ARB_gpu_shader5 is forced on
with cayman.

Reviewed-by: Glenn Kennard <glenn.kennard@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/eg_asm.c
src/gallium/drivers/r600/eg_sq.h

index 295cb4d80b7b1474d1e35843ea4f794e3e51b260..42e8b0b176158bc54f31a0eae3d8697fb7abad10 100644 (file)
@@ -160,6 +160,9 @@ int egcm_load_index_reg(struct r600_bytecode *bc, unsigned id, bool inside_alu_c
        alu.op = ALU_OP1_MOVA_INT;
        alu.src[0].sel = bc->index_reg[id];
        alu.src[0].chan = 0;
+       if (bc->chip_class == CAYMAN)
+               alu.dst.sel = id == 0 ? CM_V_SQ_MOVA_DST_CF_IDX0 : CM_V_SQ_MOVA_DST_CF_IDX1;
+
        alu.last = 1;
        r = r600_bytecode_add_alu(bc, &alu);
        if (r)
@@ -167,12 +170,14 @@ int egcm_load_index_reg(struct r600_bytecode *bc, unsigned id, bool inside_alu_c
 
        bc->ar_loaded = 0; /* clobbered */
 
-       memset(&alu, 0, sizeof(alu));
-       alu.op = id == 0 ? ALU_OP0_SET_CF_IDX0 : ALU_OP0_SET_CF_IDX1;
-       alu.last = 1;
-       r = r600_bytecode_add_alu(bc, &alu);
-       if (r)
-               return r;
+       if (bc->chip_class == EVERGREEN) {
+               memset(&alu, 0, sizeof(alu));
+               alu.op = id == 0 ? ALU_OP0_SET_CF_IDX0 : ALU_OP0_SET_CF_IDX1;
+               alu.last = 1;
+               r = r600_bytecode_add_alu(bc, &alu);
+               if (r)
+                       return r;
+       }
 
        /* Must split ALU group as index only applies to following group */
        if (inside_alu_clause) {
index b534872f0625581a2299fefa958d1ceef6c9c288..97e230f56c715e3b38f5e4996467b4786ee8b744 100644 (file)
 
 #define V_SQ_REL_ABSOLUTE 0
 #define V_SQ_REL_RELATIVE 1
+
+/* CAYMAN has special encoding for MOVA_INT destination */
+#define CM_V_SQ_MOVA_DST_AR_X 0
+#define CM_V_SQ_MOVA_DST_CF_PC 1
+#define CM_V_SQ_MOVA_DST_CF_IDX0 2
+#define CM_V_SQ_MOVA_DST_CF_IDX1 3
+
 #endif