diff options
author | Ilia Mirkin <[email protected]> | 2014-04-21 00:28:13 -0400 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2014-04-26 11:53:34 -0400 |
commit | af38ef907c89ecb1125bf258cafa0793f79a5eb7 (patch) | |
tree | d5cb96bd0d1a8197929d25c14f3c37489cd07d60 /src/gallium/drivers/nouveau/codegen | |
parent | f715a0a39a0f7f19443e7721ae792878ba504eed (diff) |
nvc0: add support for PIPE_CAP_SAMPLE_SHADING
Signed-off-by: Ilia Mirkin <[email protected]>
Diffstat (limited to 'src/gallium/drivers/nouveau/codegen')
7 files changed, 61 insertions, 3 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir.h b/src/gallium/drivers/nouveau/codegen/nv50_ir.h index 96071be0e89..56b01158a4a 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir.h +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir.h @@ -136,6 +136,7 @@ enum operation OP_DFDY, OP_RDSV, // read system value OP_WRSV, // write system value + OP_PIXLD, // get info about raster object or surfaces OP_QUADOP, OP_QUADON, OP_QUADPOP, @@ -214,6 +215,12 @@ enum operation #define NV50_IR_SUBOP_SUCLAMP_SD(r, d) (( 0 + (r)) | ((d == 2) ? 0x10 : 0)) #define NV50_IR_SUBOP_SUCLAMP_PL(r, d) (( 5 + (r)) | ((d == 2) ? 0x10 : 0)) #define NV50_IR_SUBOP_SUCLAMP_BL(r, d) ((10 + (r)) | ((d == 2) ? 0x10 : 0)) +#define NV50_IR_SUBOP_PIXLD_COUNT 0 +#define NV50_IR_SUBOP_PIXLD_COVMASK 1 +#define NV50_IR_SUBOP_PIXLD_COVERED 2 +#define NV50_IR_SUBOP_PIXLD_OFFSET 3 +#define NV50_IR_SUBOP_PIXLD_CENT_OFFSET 4 +#define NV50_IR_SUBOP_PIXLD_SAMPLEID 5 #define NV50_IR_SUBOP_MADSP_SD 0xffff // Yes, we could represent those with DataType. // Or put the type into operation and have a couple 1000 values in that enum. diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp index a4b50ee2082..c258b6b4fef 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp @@ -113,6 +113,8 @@ private: void emitQUADOP(const Instruction *, uint8_t qOp, uint8_t laneMask); + void emitPIXLD(const Instruction *); + void emitFlow(const Instruction *); inline void defId(const ValueDef&, const int pos); @@ -1130,6 +1132,14 @@ CodeEmitterGK110::emitQUADOP(const Instruction *i, uint8_t qOp, uint8_t laneMask } void +CodeEmitterGK110::emitPIXLD(const Instruction *i) +{ + emitForm_L(i, 0x7f4, 2, Modifier(0)); + code[1] |= i->subOp << 2; + code[1] |= 0x00070000; +} + +void CodeEmitterGK110::emitFlow(const Instruction *i) { const FlowInstruction *f = i->asFlow(); @@ -1684,6 +1694,9 @@ CodeEmitterGK110::emitInstruction(Instruction *insn) case OP_TEXBAR: emitTEXBAR(insn); break; + case OP_PIXLD: + emitPIXLD(insn); + break; case OP_BRA: case OP_CALL: case OP_PRERET: diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp index d486c8d39e2..cef92cfcf55 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp @@ -135,6 +135,8 @@ private: void emitVSHL(const Instruction *); void emitVectorSubOp(const Instruction *); + void emitPIXLD(const Instruction *); + inline void defId(const ValueDef&, const int pos); inline void defId(const Instruction *, int d, const int pos); inline void srcId(const ValueRef&, const int pos); @@ -2141,6 +2143,15 @@ CodeEmitterNVC0::emitVSHL(const Instruction *i) code[1] |= 1 << 16; } +void +CodeEmitterNVC0::emitPIXLD(const Instruction *i) +{ + assert(i->encSize == 8); + emitForm_A(i, HEX64(10000000, 00000006)); + code[0] |= i->subOp << 5; + code[1] |= 0x00e00000; +} + bool CodeEmitterNVC0::emitInstruction(Instruction *insn) { @@ -2390,6 +2401,9 @@ CodeEmitterNVC0::emitInstruction(Instruction *insn) case OP_VSHL: emitVSHL(insn); break; + case OP_PIXLD: + emitPIXLD(insn); + break; case OP_PHI: case OP_UNION: case OP_CONSTRAINT: 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 44b5ecdcb13..ebdeee4050d 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp @@ -1426,6 +1426,27 @@ NVC0LoweringPass::handleRDSV(Instruction *i) bld.mkLoad(TYPE_U32, i->getDef(0), bld.mkSymbol(FILE_MEMORY_CONST, 0, TYPE_U32, addr), NULL); break; + case SV_SAMPLE_INDEX: + // TODO: Properly pass source as an address in the PIX address space + // (which can be of the form [r0+offset]). But this is currently + // unnecessary. + ld = bld.mkOp1(OP_PIXLD, TYPE_U32, i->getDef(0), bld.mkImm(0)); + ld->subOp = NV50_IR_SUBOP_PIXLD_SAMPLEID; + break; + case SV_SAMPLE_POS: { + Value *off = new_LValue(func, FILE_GPR); + ld = bld.mkOp1(OP_PIXLD, TYPE_U32, i->getDef(0), bld.mkImm(0)); + ld->subOp = NV50_IR_SUBOP_PIXLD_SAMPLEID; + bld.mkOp2(OP_SHL, TYPE_U32, off, i->getDef(0), bld.mkImm(3)); + bld.mkLoad(TYPE_F32, + i->getDef(0), + bld.mkSymbol( + FILE_MEMORY_CONST, prog->driver->io.resInfoCBSlot, + TYPE_U32, prog->driver->io.sampleInfoBase + + 4 * sym->reg.data.sv.index), + off); + break; + } default: if (prog->getType() == Program::TYPE_TESSELLATION_EVAL) vtx = bld.mkOp1v(OP_PFETCH, TYPE_U32, bld.getSSA(), bld.mkImm(0)); diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_print.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_print.cpp index 1415eb5d209..e74b25f59c2 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_print.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_print.cpp @@ -166,6 +166,7 @@ const char *operationStr[OP_LAST + 1] = "dfdy", "rdsv", "wrsv", + "pixld", "quadop", "quadon", "quadpop", diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_target.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_target.cpp index 53c3c3e7cd0..f479cf4d35b 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_target.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_target.cpp @@ -49,7 +49,7 @@ const uint8_t Target::operationSrcNr[] = 3, 3, 3, 3, // SUBFM, SUCLAMP, SUEAU, MADSP 0, // TEXBAR 1, 1, // DFDX, DFDY - 1, 2, 2, 0, 0, // RDSV, WRSV, QUADOP, QUADON, QUADPOP + 1, 2, 1, 2, 0, 0, // RDSV, WRSV, PIXLD, QUADOP, QUADON, QUADPOP 2, 3, 2, 3, // POPCNT, INSBF, EXTBF, PERMT 2, 2, // ATOM, BAR 2, 2, 2, 2, 3, 2, // VADD, VAVG, VMIN, VMAX, VSAD, VSET, @@ -112,9 +112,9 @@ const OpClass Target::operationClass[] = OPCLASS_OTHER, OPCLASS_OTHER, OPCLASS_OTHER, OPCLASS_ARITH, // TEXBAR OPCLASS_OTHER, - // DFDX, DFDY, RDSV, WRSV; QUADOP, QUADON, QUADPOP + // DFDX, DFDY, RDSV, WRSV; PIXLD, QUADOP, QUADON, QUADPOP OPCLASS_OTHER, OPCLASS_OTHER, OPCLASS_OTHER, OPCLASS_OTHER, - OPCLASS_OTHER, OPCLASS_CONTROL, OPCLASS_CONTROL, + OPCLASS_OTHER, OPCLASS_OTHER, OPCLASS_CONTROL, OPCLASS_CONTROL, // POPCNT, INSBF, EXTBF, PERMT OPCLASS_BITFIELD, OPCLASS_BITFIELD, OPCLASS_BITFIELD, OPCLASS_BITFIELD, // ATOM, BAR diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp index 10a5fe2e062..95ed849561c 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp @@ -282,6 +282,8 @@ TargetNVC0::getSVAddress(DataFile shaderFile, const Symbol *sym) const case SV_NTID: return kepler ? (0x00 + idx * 4) : ~0; case SV_NCTAID: return kepler ? (0x0c + idx * 4) : ~0; case SV_GRIDID: return kepler ? 0x18 : ~0; + case SV_SAMPLE_INDEX: return 0; + case SV_SAMPLE_POS: return 0; default: return 0xffffffff; } |