Ilia Mirkin
2015-Jan-05 17:49 UTC
[Nouveau] [PATCH] nv50/ir: change the way float face is returned
The old way made it impossible for the optimizer to reason about what was going on. The new way is the same number of instructions (the neg gets folded into the cvt) but enables the optimizer to be cleverer if comparing to a constant (most common case). [The optimizer is presently not sufficiently clever to work this out, but it could relatively easily be made to be. The old way would have required significant complexity to work out.] Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu> --- This is all a bit annoying, since gl_FrontFacing is a bool in GL, but SEMANTIC_FACE is supposed to return a float -1/1. As-is the shader input load returns an int 0/-1, hence these shenanigans. src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nv50.cpp | 5 +++-- src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nv50.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nv50.cpp index 0d7612e..1ad0860 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nv50.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nv50.cpp @@ -1094,8 +1094,9 @@ NV50LoweringPreSSA::handleRDSV(Instruction *i) case SV_FACE: bld.mkInterp(NV50_IR_INTERP_FLAT, def, addr, NULL); if (i->dType == TYPE_F32) { - bld.mkOp2(OP_AND, TYPE_U32, def, def, bld.mkImm(0x80000000)); - bld.mkOp2(OP_XOR, TYPE_U32, def, def, bld.mkImm(0xbf800000)); + bld.mkOp2(OP_OR, TYPE_U32, def, def, bld.mkImm(0x00000001)); + bld.mkOp1(OP_NEG, TYPE_S32, def, def); + bld.mkCvt(OP_CVT, TYPE_F32, def, TYPE_S32, def); } break; case SV_NCTAID: 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 ff48e94..04cd19e 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp @@ -1455,8 +1455,9 @@ NVC0LoweringPass::handleRDSV(Instruction *i) Value *face = i->getDef(0); bld.mkInterp(NV50_IR_INTERP_FLAT, face, addr, NULL); if (i->dType == TYPE_F32) { - bld.mkOp2(OP_AND, TYPE_U32, face, face, bld.mkImm(0x80000000)); - bld.mkOp2(OP_XOR, TYPE_U32, face, face, bld.mkImm(0xbf800000)); + bld.mkOp2(OP_OR, TYPE_U32, face, face, bld.mkImm(0x00000001)); + bld.mkOp1(OP_NEG, TYPE_S32, face, face); + bld.mkCvt(OP_CVT, TYPE_F32, face, TYPE_S32, face); } } break; -- 2.0.5
Reasonably Related Threads
- [PATCH 1/2] nv50/ir: fix s32 x s32 -> high s32 multiply logic
- [PATCH] nv50: TXF already has integer arguments, don't try to convert from f32
- [PATCH 1/2] nv50/ir: add fp64 support on G200 (NVA0)
- [PATCH] nv50: enable cube map array texture support
- [PATCH] nv50: enable texture query lod