diff --git a/src/gallium/drivers/r600/sb/sb_bc_parser.cpp b/src/gallium/drivers/r600/sb/sb_bc_parser.cpp index abbb26c13c1..446486c36ea 100644 --- a/src/gallium/drivers/r600/sb/sb_bc_parser.cpp +++ b/src/gallium/drivers/r600/sb/sb_bc_parser.cpp @@ -385,6 +385,9 @@ int bc_parser::prepare_alu_group(cf_node* cf, alu_group_node *g) { if (ctx.alu_slots(n->bc.op) & AF_4SLOT) n->flags |= NF_ALU_4SLOT; + if (ctx.alu_slots(n->bc.op) & AF_2SLOT) + n->flags |= NF_ALU_2SLOT; + n->src.resize(src_count); unsigned flags = n->bc.op_ptr->flags; @@ -586,12 +589,16 @@ int bc_parser::prepare_alu_group(cf_node* cf, alu_group_node *g) { alu_node *a = static_cast(*I); unsigned sflags = a->bc.slot_flags; - if (sflags == AF_4V || (ctx.is_cayman() && sflags == AF_S)) { + if (sflags == AF_4V || sflags == AF_2V || (ctx.is_cayman() && sflags == AF_S)) { if (!p) p = sh->create_alu_packed(); a->remove(); p->push_back(a); + if (sflags == AF_2V && p->count() == 2) { + g->push_front(p); + p = NULL; + } } } diff --git a/src/gallium/drivers/r600/sb/sb_dump.cpp b/src/gallium/drivers/r600/sb/sb_dump.cpp index 57dded5ef00..402ba357fb1 100644 --- a/src/gallium/drivers/r600/sb/sb_dump.cpp +++ b/src/gallium/drivers/r600/sb/sb_dump.cpp @@ -396,6 +396,8 @@ void dump::dump_flags(node &n) { sblog << "CH_CONS "; if (n.flags & NF_ALU_4SLOT) sblog << "4S "; + if (n.flags & NF_ALU_2SLOT) + sblog << "2S "; } void dump::dump_val(value* v) { diff --git a/src/gallium/drivers/r600/sb/sb_ir.h b/src/gallium/drivers/r600/sb/sb_ir.h index 2d629443641..7a6742d1fc0 100644 --- a/src/gallium/drivers/r600/sb/sb_ir.h +++ b/src/gallium/drivers/r600/sb/sb_ir.h @@ -713,7 +713,8 @@ enum node_flags { NF_SCHEDULE_EARLY = (1 << 9), // for ALU_PUSH_BEFORE - when set, replace with PUSH + ALU - NF_ALU_STACK_WORKAROUND = (1 << 10) + NF_ALU_STACK_WORKAROUND = (1 << 10), + NF_ALU_2SLOT = (1 << 11), }; inline node_flags operator |(node_flags l, node_flags r) { @@ -1021,8 +1022,9 @@ public: virtual bool fold_dispatch(expr_handler *ex); unsigned forced_bank_swizzle() { - return ((bc.op_ptr->flags & AF_INTERP) && (bc.slot_flags == AF_4V)) ? - VEC_210 : 0; + return ((bc.op_ptr->flags & AF_INTERP) && + ((bc.slot_flags == AF_4V) || + (bc.slot_flags == AF_2V))) ? VEC_210 : 0; } // return param index + 1 if instruction references interpolation param,