diff options
author | Christoph Bumiller <[email protected]> | 2012-05-25 17:27:03 +0200 |
---|---|---|
committer | Christoph Bumiller <[email protected]> | 2012-05-29 15:01:41 +0200 |
commit | 40c224a573f2b763046001e622aafca90f68c693 (patch) | |
tree | f2959fedde5d2c3571c1e2632aecaaeac01f8c65 /src/gallium/drivers/nv50 | |
parent | 0d818cdacce0299fabe4ac2aa735247c651fdcfa (diff) |
nvc0/ir: fix texture barrier insertion to prevent WAW hazards
Fixes, for instance, object highlighting in Diablo 3 (wine).
Diffstat (limited to 'src/gallium/drivers/nv50')
-rw-r--r-- | src/gallium/drivers/nv50/codegen/nv50_ir.h | 2 | ||||
-rw-r--r-- | src/gallium/drivers/nv50/codegen/nv50_ir_graph.cpp | 12 | ||||
-rw-r--r-- | src/gallium/drivers/nv50/codegen/nv50_ir_graph.h | 2 | ||||
-rw-r--r-- | src/gallium/drivers/nv50/codegen/nv50_ir_inlines.h | 2 |
4 files changed, 10 insertions, 8 deletions
diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir.h b/src/gallium/drivers/nv50/codegen/nv50_ir.h index 9b47e3e13c1..0b47c32527f 100644 --- a/src/gallium/drivers/nv50/codegen/nv50_ir.h +++ b/src/gallium/drivers/nv50/codegen/nv50_ir.h @@ -864,7 +864,7 @@ public: inline bool isTerminated() const { return exit && exit->terminator; } bool dominatedBy(BasicBlock *bb); - inline bool reachableBy(BasicBlock *by, BasicBlock *term); + inline bool reachableBy(const BasicBlock *by, const BasicBlock *term); // returns mask of conditional out blocks // e.g. 3 for IF { .. } ELSE { .. } ENDIF, 1 for IF { .. } ENDIF diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_graph.cpp b/src/gallium/drivers/nv50/codegen/nv50_ir_graph.cpp index f1bff973636..33e35eea950 100644 --- a/src/gallium/drivers/nv50/codegen/nv50_ir_graph.cpp +++ b/src/gallium/drivers/nv50/codegen/nv50_ir_graph.cpp @@ -23,6 +23,7 @@ #include "nv50_ir_graph.h" #include <limits> #include <list> +#include <stack> #include "nv50_ir.h" namespace nv50_ir { @@ -165,16 +166,17 @@ Graph::Edge::Edge(Node *org, Node *tgt, Type kind) } bool -Graph::Node::reachableBy(Node *node, Node *term) +Graph::Node::reachableBy(const Node *node, const Node *term) const { - Stack stack; - Node *pos; + std::stack<const Node *> stack; + const Node *pos = NULL; const int seq = graph->nextSequence(); stack.push(node); - while (stack.getSize()) { - pos = reinterpret_cast<Node *>(stack.pop().u.p); + while (!stack.empty()) { + pos = stack.top(); + stack.pop(); if (pos == this) return true; diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_graph.h b/src/gallium/drivers/nv50/codegen/nv50_ir_graph.h index 9ef317f943c..3bf84ba1e36 100644 --- a/src/gallium/drivers/nv50/codegen/nv50_ir_graph.h +++ b/src/gallium/drivers/nv50/codegen/nv50_ir_graph.h @@ -117,7 +117,7 @@ public: inline Node *parent() const; // returns NULL if count(incident edges) != 1 - bool reachableBy(Node *node, Node *term); + bool reachableBy(const Node *node, const Node *term) const; inline bool visit(int); inline int getSequence() const; diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_inlines.h b/src/gallium/drivers/nv50/codegen/nv50_ir_inlines.h index b62431f1e31..ab4c98fbcd7 100644 --- a/src/gallium/drivers/nv50/codegen/nv50_ir_inlines.h +++ b/src/gallium/drivers/nv50/codegen/nv50_ir_inlines.h @@ -359,7 +359,7 @@ Value *Value::get(Iterator &it) return reinterpret_cast<Value *>(it.get()); } -bool BasicBlock::reachableBy(BasicBlock *by, BasicBlock *term) +bool BasicBlock::reachableBy(const BasicBlock *by, const BasicBlock *term) { return cfg.reachableBy(&by->cfg, &term->cfg); } |