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