[Mesa-dev] [PATCH v2] nvc0/ir: use levelZero flag when the lod is set to 0
Ilia Mirkin
imirkin at alum.mit.edu
Mon Nov 14 17:53:34 UTC 2016
On Mon, Nov 14, 2016 at 12:39 PM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
>
>
> 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.
I prefer either all on the same line or 1 per 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.
Will fix.
>
>> 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?
I had to remove the continue, and having
if (a) {
if (b)
c;
}
seemed silly.
>
>
>> 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