diff options
author | Christoph Bumiller <[email protected]> | 2013-02-23 00:00:27 +0100 |
---|---|---|
committer | Christoph Bumiller <[email protected]> | 2013-03-12 12:55:35 +0100 |
commit | 4506ed28de7f9d76bbc99c0758a7891b84528729 (patch) | |
tree | 2b045c70b3417739c8eaf36539231f6627e8f7c8 /src/gallium/drivers/nv50 | |
parent | 8ac68b071d5c746b7f0ff175a09647e7dbfc29d1 (diff) |
nvc0/ir: implement lowering of surface ops for nve4
Diffstat (limited to 'src/gallium/drivers/nv50')
-rw-r--r-- | src/gallium/drivers/nv50/codegen/nv50_ir.cpp | 5 | ||||
-rw-r--r-- | src/gallium/drivers/nv50/codegen/nv50_ir.h | 5 | ||||
-rw-r--r-- | src/gallium/drivers/nv50/codegen/nv50_ir_driver.h | 7 | ||||
-rw-r--r-- | src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp | 2 | ||||
-rw-r--r-- | src/gallium/drivers/nv50/codegen/nv50_ir_ra.cpp | 22 | ||||
-rw-r--r-- | src/gallium/drivers/nv50/nv50_program.c | 2 |
6 files changed, 30 insertions, 13 deletions
diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir.cpp b/src/gallium/drivers/nv50/codegen/nv50_ir.cpp index 6a391211dc9..3c05d05b81f 100644 --- a/src/gallium/drivers/nv50/codegen/nv50_ir.cpp +++ b/src/gallium/drivers/nv50/codegen/nv50_ir.cpp @@ -932,7 +932,7 @@ const struct TexInstruction::Target::Desc TexInstruction::Target::descTable[] = { { "1D", 1, 1, false, false, false }, { "2D", 2, 2, false, false, false }, - { "2D_MS", 2, 2, false, false, false }, + { "2D_MS", 2, 3, false, false, false }, { "3D", 3, 3, false, false, false }, { "CUBE", 2, 3, false, true, false }, { "1D_SHADOW", 1, 1, false, false, true }, @@ -940,7 +940,7 @@ const struct TexInstruction::Target::Desc TexInstruction::Target::descTable[] = { "CUBE_SHADOW", 2, 3, false, true, true }, { "1D_ARRAY", 1, 2, true, false, false }, { "2D_ARRAY", 2, 3, true, false, false }, - { "2D_MS_ARRAY", 2, 3, true, false, false }, + { "2D_MS_ARRAY", 2, 4, true, false, false }, { "CUBE_ARRAY", 2, 4, true, true, false }, { "1D_ARRAY_SHADOW", 1, 2, true, false, true }, { "2D_ARRAY_SHADOW", 2, 3, true, false, true }, @@ -1137,6 +1137,7 @@ nv50_ir_generate_code(struct nv50_ir_prog_info *info) nv50_ir::Program *prog = new nv50_ir::Program(type, targ); if (!prog) return -1; + prog->driver = info; prog->dbgFlags = info->dbgFlags; prog->optLevel = info->optLevel; diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir.h b/src/gallium/drivers/nv50/codegen/nv50_ir.h index 637196e4518..bdea48bbdf3 100644 --- a/src/gallium/drivers/nv50/codegen/nv50_ir.h +++ b/src/gallium/drivers/nv50/codegen/nv50_ir.h @@ -829,6 +829,9 @@ public: } inline bool operator==(TexTarget targ) const { return target == targ; } + inline bool operator!=(TexTarget targ) const { return target != targ; } + + enum TexTarget getEnum() const { return target; } private: struct Desc @@ -1149,6 +1152,8 @@ public: void *targetPriv; // e.g. to carry information between passes + const struct nv50_ir_prog_info *driver; // for driver configuration + void releaseInstruction(Instruction *); void releaseValue(Value *); }; diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_driver.h b/src/gallium/drivers/nv50/codegen/nv50_ir_driver.h index 446befa5fb7..deee60cd6a7 100644 --- a/src/gallium/drivers/nv50/codegen/nv50_ir_driver.h +++ b/src/gallium/drivers/nv50/codegen/nv50_ir_driver.h @@ -169,7 +169,7 @@ struct nv50_ir_prog_info uint8_t cullDistanceMask; /* clip distance mode (1 bit per output) */ int8_t genUserClip; /* request user clip planes for ClipVertex */ uint16_t ucpBase; /* base address for UCPs */ - uint8_t ucpBinding; /* constant buffer index of UCP data */ + uint8_t ucpCBSlot; /* constant buffer index of UCP data */ uint8_t pointSize; /* output index for PointSize */ uint8_t instanceId; /* system value index of InstanceID */ uint8_t vertexId; /* system value index of VertexID */ @@ -179,6 +179,11 @@ struct nv50_ir_prog_info uint8_t sampleMask; /* output index of SampleMask */ uint8_t backFaceColor[2]; /* input/output indices of back face colour */ uint8_t globalAccess; /* 1 for read, 2 for wr, 3 for rw */ + uint8_t resInfoCBSlot; /* cX[] used for tex handles, surface info */ + uint16_t texBindBase; /* base address for tex handles (nve4) */ + uint16_t suInfoBase; /* base address for surface info (nve4) */ + uint8_t msInfoCBSlot; /* cX[] used for multisample info */ + uint16_t msInfoBase; /* base address for multisample info */ } io; /* driver callback to assign input/output locations */ diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp b/src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp index 32915174e01..69c05c1464c 100644 --- a/src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp +++ b/src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp @@ -2285,7 +2285,7 @@ Converter::handleUserClipPlanes() for (c = 0; c < 4; ++c) { for (i = 0; i < info->io.genUserClip; ++i) { - Symbol *sym = mkSymbol(FILE_MEMORY_CONST, info->io.ucpBinding, + Symbol *sym = mkSymbol(FILE_MEMORY_CONST, info->io.ucpCBSlot, TYPE_F32, info->io.ucpBase + i * 16 + c * 4); Value *ucp = mkLoadv(TYPE_F32, sym, NULL); if (c == 0) diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_ra.cpp b/src/gallium/drivers/nv50/codegen/nv50_ir_ra.cpp index ed991dac30b..bf2380d2648 100644 --- a/src/gallium/drivers/nv50/codegen/nv50_ir_ra.cpp +++ b/src/gallium/drivers/nv50/codegen/nv50_ir_ra.cpp @@ -1852,17 +1852,23 @@ RegAlloc::InsertConstraintsPass::condenseSrcs(Instruction *insn, void RegAlloc::InsertConstraintsPass::texConstraintNVE0(TexInstruction *tex) { - textureMask(tex); + if (isTextureOp(tex->op)) + textureMask(tex); condenseDefs(tex); - int n = tex->srcCount(0xff, true); - if (n > 4) { - condenseSrcs(tex, 0, 3); - if (n > 5) // NOTE: first call modified positions already - condenseSrcs(tex, 4 - (4 - 1), n - 1 - (4 - 1)); + if (tex->op == OP_SUSTB || tex->op == OP_SUSTP) { + condenseSrcs(tex, 3, (3 + typeSizeof(tex->dType) / 4) - 1); } else - if (n > 1) { - condenseSrcs(tex, 0, n - 1); + if (isTextureOp(tex->op)) { + int n = tex->srcCount(0xff, true); + if (n > 4) { + condenseSrcs(tex, 0, 3); + if (n > 5) // NOTE: first call modified positions already + condenseSrcs(tex, 4 - (4 - 1), n - 1 - (4 - 1)); + } else + if (n > 1) { + condenseSrcs(tex, 0, n - 1); + } } } diff --git a/src/gallium/drivers/nv50/nv50_program.c b/src/gallium/drivers/nv50/nv50_program.c index 10810bf3e07..c17ffdc4111 100644 --- a/src/gallium/drivers/nv50/nv50_program.c +++ b/src/gallium/drivers/nv50/nv50_program.c @@ -315,7 +315,7 @@ nv50_program_translate(struct nv50_program *prog, uint16_t chipset) info->bin.sourceRep = NV50_PROGRAM_IR_TGSI; info->bin.source = (void *)prog->pipe.tokens; - info->io.ucpBinding = 15; + info->io.ucpCBSlot = 15; info->io.ucpBase = 0; info->io.genUserClip = prog->vp.clpd_nr; |