From: Dave Airlie <airl...@redhat.com>

This handles parsing the LDS ops and queue accessess.
---
 src/gallium/drivers/r600/sb/sb_bc_parser.cpp | 52 ++++++++++++++++++++++++++--
 1 file changed, 50 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/r600/sb/sb_bc_parser.cpp 
b/src/gallium/drivers/r600/sb/sb_bc_parser.cpp
index 8ab4083a3c..970e4141d5 100644
--- a/src/gallium/drivers/r600/sb/sb_bc_parser.cpp
+++ b/src/gallium/drivers/r600/sb/sb_bc_parser.cpp
@@ -384,7 +384,40 @@ int bc_parser::prepare_alu_group(cf_node* cf, 
alu_group_node *g) {
 
                unsigned flags = n->bc.op_ptr->flags;
 
-               if (flags & AF_PRED) {
+               if (flags & AF_LDS) {
+                       bool need_rw = false, need_oqa = false, need_oqb = 
false;
+                       int ndst = 0, ncount = 0;
+
+                       /* all non-read operations have side effects */
+                       if (n->bc.op != LDS_OP2_LDS_READ2_RET &&
+                           n->bc.op != LDS_OP1_LDS_READ_REL_RET &&
+                           n->bc.op != LDS_OP1_LDS_READ_RET) {
+                               n->flags |= NF_DONT_KILL;
+                               ndst++;
+                               need_rw = true;
+                       }
+
+                       if (n->bc.op >= LDS_OP2_LDS_ADD_RET && n->bc.op <= 
LDS_OP1_LDS_USHORT_READ_RET) {
+                               need_oqa = true;
+                               ndst++;
+                       }
+
+                       if (n->bc.op == LDS_OP2_LDS_READ2_RET || n->bc.op == 
LDS_OP1_LDS_READ_REL_RET) {
+                               need_oqb = true;
+                               ndst++;
+                       }
+
+                       n->dst.resize(ndst);
+                       if (need_oqa)
+                               n->dst[ncount++] = 
sh->get_special_value(SV_LDS_OQA);
+                       if (need_oqb)
+                               n->dst[ncount++] = 
sh->get_special_value(SV_LDS_OQB);
+                       if (need_rw)
+                               n->dst[ncount++] = 
sh->get_special_value(SV_LDS_RW);
+
+                       n->flags |= NF_DONT_MOVE | NF_DONT_HOIST;
+
+               } else if (flags & AF_PRED) {
                        n->dst.resize(3);
                        if (n->bc.update_pred)
                                n->dst[1] = sh->get_special_value(SV_ALU_PRED);
@@ -417,7 +450,7 @@ int bc_parser::prepare_alu_group(cf_node* cf, 
alu_group_node *g) {
 
                        n->flags |= NF_DONT_HOIST;
 
-               } else if (n->bc.op_ptr->src_count == 3 || n->bc.write_mask) {
+               } else if ((n->bc.op_ptr->src_count == 3 || n->bc.write_mask) 
&& !(flags & AF_LDS)) {
                        assert(!n->bc.dst_rel || n->bc.index_mode == 
INDEX_AR_X);
 
                        value *v = sh->get_gpr_value(false, n->bc.dst_gpr, 
n->bc.dst_chan,
@@ -487,6 +520,21 @@ int bc_parser::prepare_alu_group(cf_node* cf, 
alu_group_node *g) {
                                // param index as equal instructions and leave 
only one of them
                                n->src[s] = 
sh->get_special_ro_value(sel_chan(src.sel,
                                                                              
n->bc.slot));
+                       } else if (ctx.is_lds_oq(src.sel)) {
+                               switch (src.sel) {
+                               case ALU_SRC_LDS_OQ_A:
+                               case ALU_SRC_LDS_OQ_B:
+                                       assert(!"Unsupported LDS queue access 
in SB");
+                                       break;
+                               case ALU_SRC_LDS_OQ_A_POP:
+                                       n->src[s] = 
sh->get_special_value(SV_LDS_OQA);
+                                       break;
+                               case ALU_SRC_LDS_OQ_B_POP:
+                                       n->src[s] = 
sh->get_special_value(SV_LDS_OQB);
+                                       break;
+                               }
+                               n->flags |= NF_DONT_HOIST | NF_DONT_MOVE;
+
                        } else {
                                switch (src.sel) {
                                case ALU_SRC_0:
-- 
2.14.3

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

Reply via email to