r600g/sb: fix handling of PS in source bytecode on cayman
authorVadim Girlin <vadimgirlin@gmail.com>
Wed, 17 Jul 2013 08:00:43 +0000 (12:00 +0400)
committerVadim Girlin <vadimgirlin@gmail.com>
Wed, 17 Jul 2013 14:27:30 +0000 (18:27 +0400)
Actually PS doesn't make sense for cayman and isn't even mentioned in
cayman docs, but llvm backend currently uses it in bytecode and, assuming
that hw seems to be mostly ok with it, this will allow sb to parse such
source bytecode correctly.

Signed-off-by: Vadim Girlin <vadimgirlin@gmail.com>
src/gallium/drivers/r600/sb/sb_bc_parser.cpp

index a7e712816b121866adbd18667f0f585f9b8a287c..67e6c3a582df4535bf48e82fb4d417168cae007e 100644 (file)
@@ -385,6 +385,11 @@ int bc_parser::prepare_alu_group(cf_node* cf, alu_group_node *g) {
                        } else if (src.sel == ALU_SRC_PS || src.sel == ALU_SRC_PV) {
                                unsigned pgroup = !cgroup, prev_slot = src.sel == ALU_SRC_PS ?
                                                SLOT_TRANS : src.chan;
+
+                               // XXX shouldn't happen but llvm backend uses PS on cayman
+                               if (prev_slot == SLOT_TRANS && ctx.is_cayman())
+                                       prev_slot = SLOT_X;
+
                                alu_node *prev_alu = slots[pgroup][prev_slot];
 
                                assert(prev_alu);