[Mesa-dev] [PATCH v2] gk104/ir: fix tex use generation to be more careful about eliding uses
Samuel Pitoiset
samuel.pitoiset at gmail.com
Sun Jun 19 13:47:27 UTC 2016
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
On 06/18/2016 10:05 PM, Ilia Mirkin wrote:
> 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 at alum.mit.edu>
> Cc: "11.2 12.0" <mesa-stable at lists.freedesktop.org>
> ---
> .../nouveau/codegen/nv50_ir_lowering_nvc0.cpp | 34 +++++++++++++++-------
> .../nouveau/codegen/nv50_ir_lowering_nvc0.h | 5 ++--
> 2 files changed, 27 insertions(+), 12 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> index 71013eb..67bd73b 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> @@ -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
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.h b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.h
> index 2321956..4b23303 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.h
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.h
> @@ -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
>
More information about the mesa-dev
mailing list