Setting this flag will skip the merge_inst_groups() function.
---
 src/gallium/drivers/r600/r600_asm.c |    3 ++-
 src/gallium/drivers/r600/r600_asm.h |   10 ++++++++++
 2 files changed, 12 insertions(+), 1 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_asm.c 
b/src/gallium/drivers/r600/r600_asm.c
index 0ecca36..5f83879 100644
--- a/src/gallium/drivers/r600/r600_asm.c
+++ b/src/gallium/drivers/r600/r600_asm.c
@@ -1034,6 +1034,7 @@ static int merge_inst_groups(struct r600_bytecode *bc, 
struct r600_bytecode_alu
        int have_mova = 0, have_rel = 0;
        int max_slots = bc->chip_class == CAYMAN ? 4 : 5;
 
+       assert(!bc->no_merge_inst_groups);
        r = assign_alu_units(bc, alu_prev, prev);
        if (r)
                return r;
@@ -1481,7 +1482,7 @@ int r600_bytecode_add_alu_type(struct r600_bytecode *bc, 
const struct r600_bytec
                if (r)
                        return r;
 
-               if (bc->cf_last->prev_bs_head) {
+               if (!bc->no_merge_inst_groups && bc->cf_last->prev_bs_head) {
                        r = merge_inst_groups(bc, slots, 
bc->cf_last->prev_bs_head);
                        if (r)
                                return r;
diff --git a/src/gallium/drivers/r600/r600_asm.h 
b/src/gallium/drivers/r600/r600_asm.h
index 5790ead..86d44d3 100644
--- a/src/gallium/drivers/r600/r600_asm.h
+++ b/src/gallium/drivers/r600/r600_asm.h
@@ -205,6 +205,16 @@ struct r600_bytecode {
        unsigned        ar_reg;
        unsigned        ar_handling;
        unsigned        r6xx_nop_after_rel_dst;
+
+       /* Setting this bit will prevent the r600 assembler from trying to
+        * merge instruction groups.  This is necessary for compute shaders,
+        * because the CF_ALLOC_EXPORT_WORD0_RAT instructions expects the index
+        * values to be in the X, Y, and Z channels depending on the
+        * dimension of the surface.  The merge_inst_groups function will move
+        * these values around to the wrong channels and the RAT read or write
+        * will fail.
+        */
+       unsigned                        no_merge_inst_groups;
 };
 
 /* eg_asm.c */
-- 
1.7.7.6

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to