[Mesa-dev] [PATCH v2] nvc0/ir: use levelZero flag when the lod is set to 0

Samuel Pitoiset samuel.pitoiset at gmail.com
Mon Nov 14 17:39:10 UTC 2016



On 11/10/2016 03:42 AM, Ilia Mirkin wrote:
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
>
> v1 -> v2:
>   Move to handling this at SSA time. This is a lot more fragile since the
>   texture arguments have been reordered already, but it's still easy enough
>   to find the LOD argument.
>
>  .../nouveau/codegen/nv50_ir_lowering_nvc0.cpp      | 49 +++++++++++++++++++---
>  .../nouveau/codegen/nv50_ir_lowering_nvc0.h        |  1 +
>  2 files changed, 44 insertions(+), 6 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 68f2b15..68bae08 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> @@ -115,6 +115,39 @@ NVC0LegalizeSSA::handleFTZ(Instruction *i)
>     i->ftz = true;
>  }
>
> +void
> +NVC0LegalizeSSA::handleTEXLOD(TexInstruction *i)
> +{
> +   if (i->tex.target.isMS())
> +      return;
> +
> +   ImmediateValue lod;
> +
> +   // The LOD argument comes right after the coordinates (before depth bias,
> +   // offsets, etc).
> +   int arg = i->tex.target.getArgCount();
> +
> +   // SM30+ stores the indirect handle as a separate arg, which comes before
> +   // the LOD.
> +   if (prog->getTarget()->getChipset() >= NVISA_GK104_CHIPSET &&
> +       i->tex.rIndirectSrc >= 0)
> +      arg++;
> +   // SM20 stores indirect handle combined with array coordinate
> +   if (prog->getTarget()->getChipset() < NVISA_GK104_CHIPSET &&
> +       !i->tex.target.isArray() &&
> +       i->tex.rIndirectSrc >= 0)

This could be on the same line.

> +      arg++;
> +
> +   if (!i->src(arg).getImmediate(lod) || !lod.isInteger(0))
> +      return;
> +
> +   if (i->op == OP_TXL)
> +      i->op = OP_TEX;
> +   i->tex.levelZero = true;
> +   i->moveSources(arg + 1, -1);
> +}
> +
> +

Extra empty line.

>  bool
>  NVC0LegalizeSSA::visit(Function *fn)
>  {
> @@ -128,21 +161,25 @@ NVC0LegalizeSSA::visit(BasicBlock *bb)
>     Instruction *next;
>     for (Instruction *i = bb->getEntry(); i; i = next) {
>        next = i->next;
> -      if (i->sType == TYPE_F32) {
> -         if (prog->getType() != Program::TYPE_COMPUTE)
> -            handleFTZ(i);
> -         continue;
> -      }
> +
> +      if (i->sType == TYPE_F32 && prog->getType() != Program::TYPE_COMPUTE)
> +         handleFTZ(i);
> +

Why do you need to change this?

>        switch (i->op) {
>        case OP_DIV:
>        case OP_MOD:
> -         handleDIV(i);
> +         if (i->sType != TYPE_F32)
> +            handleDIV(i);
>           break;
>        case OP_RCP:
>        case OP_RSQ:
>           if (i->dType == TYPE_F64)
>              handleRCPRSQ(i);
>           break;
> +      case OP_TXL:
> +      case OP_TXF:
> +         handleTEXLOD(i->asTex());
> +         break;
>        default:
>           break;
>        }
> 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 6f4da8c..d91b6aa 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.h
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.h
> @@ -35,6 +35,7 @@ private:
>     void handleDIV(Instruction *); // integer division, modulus
>     void handleRCPRSQ(Instruction *); // double precision float recip/rsqrt
>     void handleFTZ(Instruction *);
> +   void handleTEXLOD(TexInstruction *);
>
>  protected:
>     BuildUtil bld;
>


More information about the mesa-dev mailing list