mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 02:58:05 +02:00
gk104/ir: fix tex use generation to be more careful about eliding uses
If we have a loop, instructions before the tex might be added as tex
uses, and those may in fact dominate all other uses of the tex results.
This however doesn't mean that we don't need a texbar after the tex.
Only check if uses dominate each other they are dominated by the tex.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=96565
Fixes: 7752bbc44 (gk104/ir: simplify and fool-proof texbar algorithm)
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Cc: "11.2 12.0" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
This commit is contained in:
parent
194bcb49d1
commit
1804aa0b80
2 changed files with 27 additions and 12 deletions
|
|
@ -172,19 +172,33 @@ NVC0LegalizePostRA::addTexUse(std::list<TexUse> &uses,
|
|||
Instruction *usei, const Instruction *texi)
|
||||
{
|
||||
bool add = true;
|
||||
for (std::list<TexUse>::iterator it = uses.begin();
|
||||
it != uses.end();) {
|
||||
if (insnDominatedBy(usei, it->insn)) {
|
||||
add = false;
|
||||
break;
|
||||
}
|
||||
if (insnDominatedBy(it->insn, usei))
|
||||
it = uses.erase(it);
|
||||
else
|
||||
bool dominated = insnDominatedBy(usei, texi);
|
||||
// Uses before the tex have to all be included. Just because an earlier
|
||||
// instruction dominates another instruction doesn't mean that there's no
|
||||
// way to get from the tex to the later instruction. For example you could
|
||||
// have nested loops, with the tex in the inner loop, and uses before it in
|
||||
// both loops - even though the outer loop's instruction would dominate the
|
||||
// inner's, we still want a texbar before the inner loop's instruction.
|
||||
//
|
||||
// However we can still use the eliding logic between uses dominated by the
|
||||
// tex instruction, as that is unambiguously correct.
|
||||
if (dominated) {
|
||||
for (std::list<TexUse>::iterator it = uses.begin(); it != uses.end();) {
|
||||
if (it->after) {
|
||||
if (insnDominatedBy(usei, it->insn)) {
|
||||
add = false;
|
||||
break;
|
||||
}
|
||||
if (insnDominatedBy(it->insn, usei)) {
|
||||
it = uses.erase(it);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
++it;
|
||||
}
|
||||
}
|
||||
if (add)
|
||||
uses.push_back(TexUse(usei, texi));
|
||||
uses.push_back(TexUse(usei, texi, dominated));
|
||||
}
|
||||
|
||||
// While it might be tempting to use the an algorithm that just looks at tex
|
||||
|
|
|
|||
|
|
@ -55,10 +55,11 @@ private:
|
|||
|
||||
struct TexUse
|
||||
{
|
||||
TexUse(Instruction *use, const Instruction *tex)
|
||||
: insn(use), tex(tex), level(-1) { }
|
||||
TexUse(Instruction *use, const Instruction *tex, bool after)
|
||||
: insn(use), tex(tex), after(after), level(-1) { }
|
||||
Instruction *insn;
|
||||
const Instruction *tex; // or split / mov
|
||||
bool after;
|
||||
int level;
|
||||
};
|
||||
struct Limits
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue