On Thu, Apr 26, 2012 at 04:53:58PM +0200, Christian König wrote:
> On 26.04.2012 16:40, Tom Stellard wrote:
> >On Thu, Apr 26, 2012 at 08:46:52AM -0400, Tom Stellard wrote:
> >>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.
> >>+    */
> >vadimg has pointed out on IRC that this comment is wrong, and the
> >merge_inst_groups function won't rewrite the destination channels.
> >
> >I think this patch might still be useful, so I'll just drop this comment
> >from the final version.
> I would rather prefer to not do workarounds like this, but rather
> teach merge_instruction groups the reason why something can't be
> merged.

OK, I'll drop this patch.

-Tom

> 
> Christian.
> 
> >
> >-Tom
> >
> >>+   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
> >
> 
> 

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

Reply via email to