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

The normal ssa renumbering isn't sufficient for LDS queue access,
this uses two stacks, one for the lds queue, and one for the
lds r/w ordering.

The LDS oq values are incremented in their use in a linear
fashion.
The LDS rw values are incremented in their definitions and used
in the next lds operation to ensure reordering doesn't occur.
---
 src/gallium/drivers/r600/sb/sb_pass.h          |  4 ++++
 src/gallium/drivers/r600/sb/sb_ssa_builder.cpp | 23 ++++++++++++++++++++---
 2 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/r600/sb/sb_pass.h 
b/src/gallium/drivers/r600/sb/sb_pass.h
index b5818039c2..a21b0bf997 100644
--- a/src/gallium/drivers/r600/sb/sb_pass.h
+++ b/src/gallium/drivers/r600/sb/sb_pass.h
@@ -634,7 +634,11 @@ class ssa_rename : public vpass {
        typedef sb_map<value*, unsigned> def_map;
 
        def_map def_count;
+       def_map lds_oq_count;
+       def_map lds_rw_count;
        std::stack<def_map> rename_stack;
+       std::stack<def_map> rename_lds_oq_stack;
+       std::stack<def_map> rename_lds_rw_stack;
 
        typedef std::map<uint32_t, value*> val_map;
        val_map values;
diff --git a/src/gallium/drivers/r600/sb/sb_ssa_builder.cpp 
b/src/gallium/drivers/r600/sb/sb_ssa_builder.cpp
index 3ad628bb68..5cd41c2aab 100644
--- a/src/gallium/drivers/r600/sb/sb_ssa_builder.cpp
+++ b/src/gallium/drivers/r600/sb/sb_ssa_builder.cpp
@@ -132,6 +132,8 @@ bool ssa_prepare::visit(depart_node& n, bool enter) {
 
 int ssa_rename::init() {
        rename_stack.push(def_map());
+       rename_lds_oq_stack.push(def_map());
+       rename_lds_rw_stack.push(def_map());
        return 0;
 }
 
@@ -287,8 +289,16 @@ void ssa_rename::pop() {
 value* ssa_rename::rename_use(node *n, value* v) {
        if (v->version)
                return v;
+       unsigned index;
+       if (v->is_lds_access()) {
+               index = get_index(rename_lds_rw_stack.top(), v);
+       } else if (v->is_lds_oq()) {
+               index = new_index(lds_oq_count, v);
+               set_index(rename_lds_oq_stack.top(), v, index);
+       } else {
+               index = get_index(rename_stack.top(), v);
+       }
 
-       unsigned index = get_index(rename_stack.top(), v);
        v = sh.get_value_version(v, index);
 
        // if (alu) instruction is predicated and source arg comes from psi node
@@ -313,8 +323,15 @@ value* ssa_rename::rename_use(node *n, value* v) {
 }
 
 value* ssa_rename::rename_def(node *n, value* v) {
-       unsigned index = new_index(def_count, v);
-       set_index(rename_stack.top(), v, index);
+       unsigned index;
+
+       if (v->is_lds_access()) {
+               index = new_index(lds_rw_count, v);
+               set_index(rename_lds_rw_stack.top(), v, index);
+       } else {
+               index = new_index(def_count, v);
+               set_index(rename_stack.top(), v, index);
+       }
        value *r = sh.get_value_version(v, index);
        return r;
 }
-- 
2.14.3

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

Reply via email to