1bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#include "nv50_ir.h" 3bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#include "nv50_ir_target.h" 4bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#include "nv50_ir_build_util.h" 5bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 6bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#include "nv50_ir_from_sm4.h" 7bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 8bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller// WTF: pass-through is implicit ??? check ReadWriteMask 9bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 10bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillernamespace tgsi { 11bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 12bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerstatic nv50_ir::SVSemantic irSemantic(unsigned sn) 13bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 14bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (sn) { 15bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case TGSI_SEMANTIC_POSITION: return nv50_ir::SV_POSITION; 16bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case TGSI_SEMANTIC_FACE: return nv50_ir::SV_FACE; 17bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case NV50_SEMANTIC_LAYER: return nv50_ir::SV_LAYER; 18bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case NV50_SEMANTIC_VIEWPORTINDEX: return nv50_ir::SV_VIEWPORT_INDEX; 19bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case TGSI_SEMANTIC_PSIZE: return nv50_ir::SV_POINT_SIZE; 20bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case NV50_SEMANTIC_CLIPDISTANCE: return nv50_ir::SV_CLIP_DISTANCE; 217fd802b96cd916e5cadf7eda7329105169dd29bbChristoph Bumiller case TGSI_SEMANTIC_VERTEXID: return nv50_ir::SV_VERTEX_ID; 22bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case TGSI_SEMANTIC_INSTANCEID: return nv50_ir::SV_INSTANCE_ID; 23bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case TGSI_SEMANTIC_PRIMID: return nv50_ir::SV_PRIMITIVE_ID; 24bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case NV50_SEMANTIC_TESSFACTOR: return nv50_ir::SV_TESS_FACTOR; 25bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case NV50_SEMANTIC_TESSCOORD: return nv50_ir::SV_TESS_COORD; 26bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 27bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return nv50_ir::SV_UNDEFINED; 28bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 29bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 30bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 31bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} // namespace tgsi 32bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 33bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillernamespace { 34bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 35bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerusing namespace nv50_ir; 36bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 37bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#define NV50_IR_MAX_RESOURCES 64 38bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 39bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerclass Converter : public BuildUtil 40bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 41bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerpublic: 42bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Converter(Program *, struct nv50_ir_prog_info *); 43bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ~Converter(); 44bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 45bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerprivate: 46bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller DataArray tData32; 47bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller DataArray tData64; 48bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller unsigned int nrRegVals; 49bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 50bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller DataArray *lData; 51bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller unsigned int nrArrays; 52bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller unsigned int arrayVol; 53bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 54bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller DataArray oData; 55bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 56bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller uint8_t interpMode[PIPE_MAX_SHADER_INPUTS]; 57bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 58bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller // outputs for each phase 59bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller struct nv50_ir_varying out[3][PIPE_MAX_SHADER_OUTPUTS]; 60bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 61bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller int phase; 62bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller int subPhaseCnt[2]; 63bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller int subPhase; 64bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller unsigned int phaseStart; 65bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller unsigned int phaseInstance; 66bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller unsigned int *phaseInstCnt[2]; 67bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bool unrollPhase; 68bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bool phaseInstanceUsed; 69bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller int phaseEnded; // (phase + 1) if $phase ended 70bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 71bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bool finalized; 72bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 73bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *srcPtr[3][3]; // for indirect addressing, save pointer values 74bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *dstPtr[3]; 75bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *vtxBase[3]; // base address of vertex in a primitive (TP/GP) 76bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 77bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *domainPt[3]; // pre-fetched TessCoord 78bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 79bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller unsigned int nDstOpnds; 80bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 81bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Stack condBBs; 82bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Stack joinBBs; 83bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Stack loopBBs; 84bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Stack breakBBs; 85bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Stack entryBBs; 86bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Stack leaveBBs; 87bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Stack retIPs; 88bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 89bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bool shadow[NV50_IR_MAX_RESOURCES]; 90bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TexTarget resourceType[NV50_IR_MAX_RESOURCES][2]; 91bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 92bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller struct nv50_ir_prog_info& info; 93bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 94bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *fragCoord[4]; 95bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 96bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerpublic: 97bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bool run(); 98bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 99bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerprivate: 100bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bool handleInstruction(unsigned int pos); 101bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bool inspectInstruction(unsigned int pos); 102bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bool handleDeclaration(const sm4_dcl& dcl); 103bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bool inspectDeclaration(const sm4_dcl& dcl); 104bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bool parseSignature(); 105bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 106bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bool haveNextPhase(unsigned int pos) const; 107bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 108bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller void allocateValues(); 109bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller void exportOutputs(); 110bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 111bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller void emitTex(Value *dst0[4], TexInstruction *, const uint8_t swizzle[4]); 112bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller void handleLOAD(Value *dst0[4]); 113bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller void handleSAMPLE(operation, Value *dst0[4]); 114bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller void handleQUERY(Value *dst0[4], enum TexQuery query); 115bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller void handleDP(Value *dst0[4], int dim); 116bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 117bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Symbol *iSym(int i, int c); 118bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Symbol *oSym(int i, int c); 119bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 120bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *src(int i, int c); 121bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *src(const sm4_op&, int c, int i); 122bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *dst(int i, int c); 123bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *dst(const sm4_op&, int c, int i); 124bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller void saveDst(int i, int c, Value *value); 125bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller void saveDst(const sm4_op&, int c, Value *value, int i); 126bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller void saveFragDepth(operation op, Value *value); 127bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 128bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *interpolate(const sm4_op&, int c, int i); 129bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 130bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *getSrcPtr(int s, int dim, int shl); 131bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *getDstPtr(int d, int dim, int shl); 132bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *getVtxPtr(int s); 133bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 134bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bool checkDstSrcAliasing() const; 135bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller void insertConvergenceOps(BasicBlock *conv, BasicBlock *fork); 136bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller void finalizeShader(); 137bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 138bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller operation cvtOpcode(enum sm4_opcode op) const; 139bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller unsigned int getDstOpndCount(enum sm4_opcode opcode) const; 140bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 141bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller DataType inferSrcType(enum sm4_opcode op) const; 142bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller DataType inferDstType(enum sm4_opcode op) const; 143bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 144bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller unsigned g3dPrim(const unsigned prim, unsigned *patchSize = NULL) const; 145bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller CondCode cvtCondCode(enum sm4_opcode op) const; 146bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller RoundMode cvtRoundingMode(enum sm4_opcode op) const; 147bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TexTarget cvtTexTarget(enum sm4_target, 148bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller enum sm4_opcode, operation *) const; 149bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller SVSemantic cvtSemantic(enum sm4_sv, uint8_t &index) const; 150bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller uint8_t cvtInterpMode(enum sm4_interpolation) const; 151bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 152bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller unsigned tgsiSemantic(SVSemantic, int index); 153bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller void recordSV(unsigned sn, unsigned si, unsigned mask, bool input); 154bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 155bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerprivate: 156bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller sm4_insn *insn; 157bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller DataType dTy, sTy; 158bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 159bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller const struct sm4_program& sm4; 160bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Program *prog; 161bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller}; 162bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 163bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#define PRIM_CASE(a, b) \ 164bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_PRIMITIVE_TOPOLOGY_##a: return PIPE_PRIM_##b; 165bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 166bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerunsigned 167bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::g3dPrim(const unsigned prim, unsigned *patchSize) const 168bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 169bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (prim) { 170bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller PRIM_CASE(UNDEFINED, POINTS); 171bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller PRIM_CASE(POINTLIST, POINTS); 172bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller PRIM_CASE(LINELIST, LINES); 173bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller PRIM_CASE(LINESTRIP, LINE_STRIP); 174bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller PRIM_CASE(TRIANGLELIST, TRIANGLES); 175bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller PRIM_CASE(TRIANGLESTRIP, TRIANGLE_STRIP); 176bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller PRIM_CASE(LINELIST_ADJ, LINES_ADJACENCY); 177bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller PRIM_CASE(LINESTRIP_ADJ, LINE_STRIP_ADJACENCY); 178bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller PRIM_CASE(TRIANGLELIST_ADJ, TRIANGLES_ADJACENCY); 179bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller PRIM_CASE(TRIANGLESTRIP_ADJ, TRIANGLES_ADJACENCY); 180bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 181bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (prim < D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST || 182bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller prim > D3D_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST) 183bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return PIPE_PRIM_POINTS; 184bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (patchSize) 185bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller *patchSize = 186bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller prim - D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST + 1; 187bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return NV50_PRIM_PATCHES; 188bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 189bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 190bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 191bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#define IPM_CASE(n, a, b) \ 192bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_INTERPOLATION_##n: return NV50_IR_INTERP_##a | NV50_IR_INTERP_##b 193bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 194bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumilleruint8_t 195bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::cvtInterpMode(enum sm4_interpolation mode) const 196bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 197bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (mode) { 198bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller IPM_CASE(CONSTANT, FLAT, FLAT); 199bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller IPM_CASE(LINEAR, PERSPECTIVE, PERSPECTIVE); 200bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller IPM_CASE(LINEAR_CENTROID, PERSPECTIVE, CENTROID); 201bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller IPM_CASE(LINEAR_NOPERSPECTIVE, LINEAR, LINEAR); 202bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller IPM_CASE(LINEAR_NOPERSPECTIVE_CENTROID, LINEAR, CENTROID); 203bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller IPM_CASE(LINEAR_SAMPLE, PERSPECTIVE, OFFSET); 204bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller IPM_CASE(LINEAR_NOPERSPECTIVE_SAMPLE, LINEAR, OFFSET); 205bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller IPM_CASE(UNDEFINED, LINEAR, LINEAR); 206bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 207bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(!"invalid interpolation mode"); 208bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return 0; 209bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 210bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 211bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 212bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerstatic void 213bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillersetVaryingInterpMode(struct nv50_ir_varying *var, uint8_t mode) 214bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 215bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (mode & NV50_IR_INTERP_MODE_MASK) { 216bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case NV50_IR_INTERP_LINEAR: 217bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller var->linear = 1; 218bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 219bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case NV50_IR_INTERP_FLAT: 220bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller var->flat = 1; 221bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 222bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 223bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 224bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 225bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (mode & NV50_IR_INTERP_CENTROID) 226bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller var->centroid = 1; 227bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 228bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 229bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerRoundMode 230bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::cvtRoundingMode(enum sm4_opcode op) const 231bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 232bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (op) { 233bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ROUND_NE: return ROUND_NI; 234bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ROUND_NI: return ROUND_MI; 235bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ROUND_PI: return ROUND_PI; 236bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ROUND_Z: return ROUND_ZI; 237bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 238bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return ROUND_N; 239bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 240bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 241bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 242bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerCondCode 243bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::cvtCondCode(enum sm4_opcode op) const 244bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 245bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (op) { 246bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_EQ: 247bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DEQ: 248bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IEQ: return CC_EQ; 249bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_GE: 250bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DGE: 251bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IGE: 252bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UGE: return CC_GE; 253bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_LT: 254bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DLT: 255bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ILT: 256bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ULT: return CC_LT; 257bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_NE: 258bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_INE: 259bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DNE: return CC_NEU; 260bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 261bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return CC_ALWAYS; 262bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 263bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 264bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 265bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerDataType 266bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::inferSrcType(enum sm4_opcode op) const 267bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 268bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (op) { 269bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IADD: 270bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IEQ: 271bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IGE: 272bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ILT: 273bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IMAD: 274bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IMAX: 275bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IMIN: 276bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IMUL: 277bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_INE: 278bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_INEG: 279bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ISHL: 280bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ISHR: 281bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ITOF: 282bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ATOMIC_IADD: 283bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ATOMIC_IMAX: 284bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ATOMIC_IMIN: 285bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return TYPE_S32; 286bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_AND: 287bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_NOT: 288bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_OR: 289bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UDIV: 290bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ULT: 291bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UGE: 292bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UMUL: 293bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UMAD: 294bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UMAX: 295bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UMIN: 296bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_USHR: 297bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UTOF: 298bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_XOR: 299bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UADDC: 300bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_USUBB: 301bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ATOMIC_AND: 302bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ATOMIC_OR: 303bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ATOMIC_XOR: 304bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ATOMIC_UMAX: 305bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ATOMIC_UMIN: 306bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return TYPE_U32; 307bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DADD: 308bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DMAX: 309bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DMIN: 310bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DMUL: 311bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DEQ: 312bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DGE: 313bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DLT: 314bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DNE: 315bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DMOV: 316bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DMOVC: 317bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DTOF: 318bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return TYPE_F64; 319bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_F16TOF32: 320bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return TYPE_F16; 321bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 322bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return TYPE_F32; 323bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 324bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 325bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 326bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerDataType 327bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::inferDstType(enum sm4_opcode op) const 328bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 329bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (op) { 330bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_FTOI: 331bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return TYPE_S32; 332bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_FTOU: 333bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_EQ: 334bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_GE: 335bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_LT: 336bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_NE: 337bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return TYPE_U32; 338bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_FTOD: 339bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return TYPE_F64; 340bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_F32TOF16: 341bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return TYPE_F16; 342bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ITOF: 343bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UTOF: 344bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DTOF: 345bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return TYPE_F32; 346bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 347bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return inferSrcType(op); 348bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 349bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 350bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 351bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumilleroperation 352bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::cvtOpcode(enum sm4_opcode op) const 353bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 354bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (op) { 355bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ADD: return OP_ADD; 356bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_AND: return OP_AND; 357bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_BREAK: return OP_BREAK; 358bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_BREAKC: return OP_BREAK; 359bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CALL: return OP_CALL; 360bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CALLC: return OP_CALL; 361bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CASE: return OP_NOP; 362bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CONTINUE: return OP_CONT; 363bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CONTINUEC: return OP_CONT; 364bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CUT: return OP_RESTART; 365bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DEFAULT: return OP_NOP; 366bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DERIV_RTX: return OP_DFDX; 367bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DERIV_RTY: return OP_DFDY; 368bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DISCARD: return OP_DISCARD; 369bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DIV: return OP_DIV; 370bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DP2: return OP_MAD; 371bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DP3: return OP_MAD; 372bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DP4: return OP_MAD; 373bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ELSE: return OP_BRA; 374bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_EMIT: return OP_EMIT; 375bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_EMITTHENCUT: return OP_EMIT; 376bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ENDIF: return OP_BRA; 377bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ENDLOOP: return OP_PREBREAK; 378bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ENDSWITCH: return OP_NOP; 379bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_EQ: return OP_SET; 380bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_EXP: return OP_EX2; 381bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_FRC: return OP_CVT; 382bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_FTOI: return OP_CVT; 383bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_FTOU: return OP_CVT; 384bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_GE: return OP_SET; 385bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IADD: return OP_ADD; 386bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IF: return OP_BRA; 387bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IEQ: return OP_SET; 388bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IGE: return OP_SET; 389bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ILT: return OP_SET; 390bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IMAD: return OP_MAD; 391bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IMAX: return OP_MAX; 392bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IMIN: return OP_MIN; 393bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IMUL: return OP_MUL; 394bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_INE: return OP_SET; 395bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_INEG: return OP_NEG; 396bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ISHL: return OP_SHL; 397bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ISHR: return OP_SHR; 398bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ITOF: return OP_CVT; 399bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_LD: return OP_TXF; 400bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_LD_MS: return OP_TXF; 401bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_LOG: return OP_LG2; 402bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_LOOP: return OP_PRECONT; 403bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_LT: return OP_SET; 404bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_MAD: return OP_MAD; 405bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_MIN: return OP_MIN; 406bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_MAX: return OP_MAX; 407bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_MOV: return OP_MOV; 408bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_MOVC: return OP_MOV; 409bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_MUL: return OP_MUL; 410bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_NE: return OP_SET; 411bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_NOP: return OP_NOP; 412bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_NOT: return OP_NOT; 413bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_OR: return OP_OR; 414bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_RESINFO: return OP_TXQ; 415bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_RET: return OP_RET; 416bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_RETC: return OP_RET; 417bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ROUND_NE: return OP_CVT; 418bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ROUND_NI: return OP_FLOOR; 419bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ROUND_PI: return OP_CEIL; 420bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ROUND_Z: return OP_TRUNC; 421bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_RSQ: return OP_RSQ; 422bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SAMPLE: return OP_TEX; 423bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SAMPLE_C: return OP_TEX; 424bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SAMPLE_C_LZ: return OP_TEX; 425bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SAMPLE_L: return OP_TXL; 426bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SAMPLE_D: return OP_TXD; 427bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SAMPLE_B: return OP_TXB; 428bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SQRT: return OP_SQRT; 429bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SWITCH: return OP_NOP; 430bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SINCOS: return OP_PRESIN; 431bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UDIV: return OP_DIV; 432bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ULT: return OP_SET; 433bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UGE: return OP_SET; 434bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UMUL: return OP_MUL; 435bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UMAD: return OP_MAD; 436bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UMAX: return OP_MAX; 437bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UMIN: return OP_MIN; 438bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_USHR: return OP_SHR; 439bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UTOF: return OP_CVT; 440bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_XOR: return OP_XOR; 441bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 442bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_GATHER4: return OP_TXG; 443bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SAMPLE_POS: return OP_PIXLD; 444bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SAMPLE_INFO: return OP_PIXLD; 445bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_EMIT_STREAM: return OP_EMIT; 446bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CUT_STREAM: return OP_RESTART; 447bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_EMITTHENCUT_STREAM: return OP_EMIT; 448bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_INTERFACE_CALL: return OP_CALL; 449bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_BUFINFO: return OP_TXQ; 450bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DERIV_RTX_COARSE: return OP_DFDX; 451bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DERIV_RTX_FINE: return OP_DFDX; 452bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DERIV_RTY_COARSE: return OP_DFDY; 453bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DERIV_RTY_FINE: return OP_DFDY; 454bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_GATHER4_C: return OP_TXG; 455bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_GATHER4_PO: return OP_TXG; 456bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_GATHER4_PO_C: return OP_TXG; 457bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 458bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_RCP: return OP_RCP; 459bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_F32TOF16: return OP_CVT; 460bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_F16TOF32: return OP_CVT; 461bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UADDC: return OP_ADD; 462bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_USUBB: return OP_SUB; 463bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_COUNTBITS: return OP_POPCNT; 464bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 465bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ATOMIC_AND: return OP_AND; 466bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ATOMIC_OR: return OP_OR; 467bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ATOMIC_XOR: return OP_XOR; 468bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ATOMIC_CMP_STORE: return OP_STORE; 469bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ATOMIC_IADD: return OP_ADD; 470bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ATOMIC_IMAX: return OP_MAX; 471bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ATOMIC_IMIN: return OP_MIN; 472bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ATOMIC_UMAX: return OP_MAX; 473bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ATOMIC_UMIN: return OP_MIN; 474bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 475bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SYNC: return OP_MEMBAR; 476bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DADD: return OP_ADD; 477bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DMAX: return OP_MAX; 478bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DMIN: return OP_MIN; 479bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DMUL: return OP_MUL; 480bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DEQ: return OP_SET; 481bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DGE: return OP_SET; 482bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DLT: return OP_SET; 483bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DNE: return OP_SET; 484bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DMOV: return OP_MOV; 485bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DMOVC: return OP_MOV; 486bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DTOF: return OP_CVT; 487bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_FTOD: return OP_CVT; 488bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 489bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 490bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return OP_NOP; 491bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 492bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 493bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 494bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerunsigned int 495bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::getDstOpndCount(enum sm4_opcode opcode) const 496bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 497bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (opcode) { 498bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SINCOS: 499bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UDIV: 500bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IMUL: 501bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UMUL: 502bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return 2; 503bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_BREAK: 504bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_BREAKC: 505bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CALL: 506bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CALLC: 507bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CONTINUE: 508bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CONTINUEC: 509bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DISCARD: 510bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_EMIT: 511bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_EMIT_STREAM: 512bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CUT: 513bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CUT_STREAM: 514bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_EMITTHENCUT: 515bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_EMITTHENCUT_STREAM: 516bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IF: 517bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ELSE: 518bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ENDIF: 519bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_LOOP: 520bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ENDLOOP: 521bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_RET: 522bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_RETC: 523bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SYNC: 524bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SWITCH: 525bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CASE: 526bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_HS_DECLS: 527bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_HS_CONTROL_POINT_PHASE: 528bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_HS_FORK_PHASE: 529bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_HS_JOIN_PHASE: 530bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return 0; 531bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 532bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return 1; 533bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 534bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 535bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 536bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#define TARG_CASE_1(a, b) case SM4_TARGET_##a: return TEX_TARGET_##b; 537bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#define TARG_CASE_2(a, b) case SM4_TARGET_##a: \ 538bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return dc ? TEX_TARGET_##b##_SHADOW : TEX_TARGET_##b 539bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 540bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerTexTarget 541bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::cvtTexTarget(enum sm4_target targ, 542bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller enum sm4_opcode op, operation *opr) const 543bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 544bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bool dc = (op == SM4_OPCODE_SAMPLE_C || 545bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller op == SM4_OPCODE_SAMPLE_C_LZ || 546bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller op == SM4_OPCODE_GATHER4_C || 547bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller op == SM4_OPCODE_GATHER4_PO_C); 548bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 549bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (opr) { 550bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (targ) { 551bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_TARGET_RAW_BUFFER: *opr = OP_LOAD; break; 552bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_TARGET_STRUCTURED_BUFFER: *opr = OP_SULD; break; 553bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 554bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller *opr = OP_TEX; 555bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 556bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 557bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 558bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 559bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (targ) { 560bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TARG_CASE_1(UNKNOWN, 2D); 561bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TARG_CASE_2(TEXTURE1D, 1D); 562bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TARG_CASE_2(TEXTURE2D, 2D); 563bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TARG_CASE_1(TEXTURE2DMS, 2D_MS); 564bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TARG_CASE_1(TEXTURE3D, 3D); 565bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TARG_CASE_2(TEXTURECUBE, CUBE); 566bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TARG_CASE_2(TEXTURE1DARRAY, 1D_ARRAY); 567bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TARG_CASE_2(TEXTURE2DARRAY, 2D_ARRAY); 568bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TARG_CASE_1(TEXTURE2DMSARRAY, 2D_MS_ARRAY); 569bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TARG_CASE_2(TEXTURECUBEARRAY, CUBE_ARRAY); 570bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TARG_CASE_1(BUFFER, BUFFER); 571bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TARG_CASE_1(RAW_BUFFER, BUFFER); 572bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TARG_CASE_1(STRUCTURED_BUFFER, BUFFER); 573bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 574bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(!"invalid SM4 texture target"); 575bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return dc ? TEX_TARGET_2D_SHADOW : TEX_TARGET_2D; 576bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 577bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 578bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 579bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerstatic inline uint32_t 580bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillergetSVIndex(enum sm4_sv sv) 581bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 582bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (sv) { 583bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_QUAD_U_EQ_0_EDGE_TESSFACTOR: return 0; 584bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_QUAD_V_EQ_0_EDGE_TESSFACTOR: return 1; 585bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_QUAD_U_EQ_1_EDGE_TESSFACTOR: return 2; 586bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_QUAD_V_EQ_1_EDGE_TESSFACTOR: return 3; 587bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 588bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_QUAD_U_INSIDE_TESSFACTOR: return 4; 589bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_QUAD_V_INSIDE_TESSFACTOR: return 5; 590bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 591bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_TRI_U_EQ_0_EDGE_TESSFACTOR: return 0; 592bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_TRI_V_EQ_0_EDGE_TESSFACTOR: return 1; 593bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_TRI_W_EQ_0_EDGE_TESSFACTOR: return 2; 594bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 595bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_TRI_INSIDE_TESSFACTOR: return 4; 596bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 597bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_LINE_DETAIL_TESSFACTOR: return 0; 598bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 599bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_LINE_DENSITY_TESSFACTOR: return 4; 600bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 601bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 602bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return 0; 603bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 604bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 605bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 606bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerSVSemantic 607bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::cvtSemantic(enum sm4_sv sv, uint8_t &idx) const 608bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 609bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller idx = 0; 610bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 611bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (sv) { 612bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_UNDEFINED: return SV_UNDEFINED; 613bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_POSITION: return SV_POSITION; 614bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_CLIP_DISTANCE: return SV_CLIP_DISTANCE; 615bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_CULL_DISTANCE: return SV_CLIP_DISTANCE; // XXX: distinction 616bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_RENDER_TARGET_ARRAY_INDEX: return SV_LAYER; 617bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_VIEWPORT_ARRAY_INDEX: return SV_VIEWPORT_INDEX; 618bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_VERTEX_ID: return SV_VERTEX_ID; 619bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_PRIMITIVE_ID: return SV_PRIMITIVE_ID; 620bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_INSTANCE_ID: return SV_INSTANCE_ID; 621bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_IS_FRONT_FACE: return SV_FACE; 622bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_SAMPLE_INDEX: return SV_SAMPLE_INDEX; 623bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 624bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_QUAD_U_EQ_0_EDGE_TESSFACTOR: 625bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_QUAD_V_EQ_0_EDGE_TESSFACTOR: 626bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_QUAD_U_EQ_1_EDGE_TESSFACTOR: 627bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_QUAD_V_EQ_1_EDGE_TESSFACTOR: 628bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_QUAD_U_INSIDE_TESSFACTOR: 629bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_QUAD_V_INSIDE_TESSFACTOR: 630bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_TRI_U_EQ_0_EDGE_TESSFACTOR: 631bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_TRI_V_EQ_0_EDGE_TESSFACTOR: 632bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_TRI_W_EQ_0_EDGE_TESSFACTOR: 633bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_TRI_INSIDE_TESSFACTOR: 634bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_LINE_DETAIL_TESSFACTOR: 635bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_FINAL_LINE_DENSITY_TESSFACTOR: 636bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller idx = getSVIndex(sv); 637bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return SV_TESS_FACTOR; 638bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 639bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 640bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(!"invalid SM4 system value"); 641bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return SV_UNDEFINED; 642bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 643bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 644bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 645bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerunsigned 646bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::tgsiSemantic(SVSemantic sv, int index) 647bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 648bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (sv) { 649bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SV_POSITION: return TGSI_SEMANTIC_POSITION; 650bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SV_FACE: return TGSI_SEMANTIC_FACE; 651bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SV_LAYER: return NV50_SEMANTIC_LAYER; 652bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SV_VIEWPORT_INDEX: return NV50_SEMANTIC_VIEWPORTINDEX; 653bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SV_POINT_SIZE: return TGSI_SEMANTIC_PSIZE; 654bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SV_CLIP_DISTANCE: return NV50_SEMANTIC_CLIPDISTANCE; 6557fd802b96cd916e5cadf7eda7329105169dd29bbChristoph Bumiller case SV_VERTEX_ID: return TGSI_SEMANTIC_VERTEXID; 656bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SV_INSTANCE_ID: return TGSI_SEMANTIC_INSTANCEID; 657bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SV_PRIMITIVE_ID: return TGSI_SEMANTIC_PRIMID; 658bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SV_TESS_FACTOR: return NV50_SEMANTIC_TESSFACTOR; 659bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SV_TESS_COORD: return NV50_SEMANTIC_TESSCOORD; 660bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SV_INVOCATION_ID: return NV50_SEMANTIC_INVOCATIONID; 661bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 662bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return TGSI_SEMANTIC_GENERIC; 663bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 664bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 665bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 666bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillervoid 667bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::recordSV(unsigned sn, unsigned si, unsigned mask, bool input) 668bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 669bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller unsigned int i; 670bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (i = 0; i < info.numSysVals; ++i) 671bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (info.sv[i].sn == sn && 672bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.sv[i].si == si) 673bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return; 674bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.numSysVals = i + 1; 675bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.sv[i].sn = sn; 676bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.sv[i].si = si; 677bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.sv[i].mask = mask; 678bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.sv[i].input = input ? 1 : 0; 679bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 680bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 681bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerbool 682bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::parseSignature() 683bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 684bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller struct nv50_ir_varying *patch; 685bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller unsigned int i, r, n; 686bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 687bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.numInputs = 0; 688bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.numOutputs = 0; 689bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.numPatchConstants = 0; 690bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 691bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (n = 0, i = 0; i < sm4.num_params_in; ++i) { 692bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller r = sm4.params_in[i].Register; 693bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 694bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.in[r].mask |= sm4.params_in[i].ReadWriteMask; 695bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller // mask might be uninitialized ... 696bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (!sm4.params_in[i].ReadWriteMask) 697bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.in[r].mask = 0xf; 698bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.in[r].id = r; 699bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (info.in[r].regular) // already assigned semantic name/index 700bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller continue; 701bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.in[r].regular = 1; 702bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.in[r].patch = 0; 703bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 704bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.numInputs = MAX2(info.numInputs, r + 1); 705bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 706bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (sm4.params_in[i].SystemValueType) { 707bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_UNDEFINED: 708bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.in[r].sn = TGSI_SEMANTIC_GENERIC; 709bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.in[r].si = n++; 710bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 711bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_POSITION: 712bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.in[r].sn = TGSI_SEMANTIC_POSITION; 713bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 714bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_VERTEX_ID: 7157fd802b96cd916e5cadf7eda7329105169dd29bbChristoph Bumiller info.in[r].sn = TGSI_SEMANTIC_VERTEXID; 716bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 717bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_PRIMITIVE_ID: 718bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.in[r].sn = TGSI_SEMANTIC_PRIMID; 719bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller // no corresponding output 720bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller recordSV(TGSI_SEMANTIC_PRIMID, 0, 1, true); 721bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 722bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_INSTANCE_ID: 723bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.in[r].sn = TGSI_SEMANTIC_INSTANCEID; 724bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 725bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_IS_FRONT_FACE: 726bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.in[r].sn = TGSI_SEMANTIC_FACE; 727bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller // no corresponding output 728bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller recordSV(TGSI_SEMANTIC_FACE, 0, 1, true); 729bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 730bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 731bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(!"invalid/unsupported input linkage semantic"); 732bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 733bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 734bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 735bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 736bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (n = 0, i = 0; i < sm4.num_params_out; ++i) { 737bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller r = sm4.params_out[i].Register; 738bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 739bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[r].mask |= ~sm4.params_out[i].ReadWriteMask; 740bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[r].id = r; 741bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (info.out[r].regular) // already assigned semantic name/index 742bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller continue; 743bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[r].regular = 1; 744bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[r].patch = 0; 745bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 746bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.numOutputs = MAX2(info.numOutputs, r + 1); 747bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 748bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (sm4.params_out[i].SystemValueType) { 749bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_UNDEFINED: 750bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (prog->getType() == Program::TYPE_FRAGMENT) { 751bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[r].sn = TGSI_SEMANTIC_COLOR; 752bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[r].si = info.prop.fp.numColourResults++; 753bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } else { 754bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[r].sn = TGSI_SEMANTIC_GENERIC; 755bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[r].si = n++; 756bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 757bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 758bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_POSITION: 759bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_DEPTH: 760bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_DEPTH_GREATER_EQUAL: 761bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_DEPTH_LESS_EQUAL: 762bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[r].sn = TGSI_SEMANTIC_POSITION; 763bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.io.fragDepth = r; 764bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 765bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_CULL_DISTANCE: 766bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_CLIP_DISTANCE: 767bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[r].sn = NV50_SEMANTIC_CLIPDISTANCE; 768bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[r].si = sm4.params_out[i].SemanticIndex; 769bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 770bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_RENDER_TARGET_ARRAY_INDEX: 771bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[r].sn = NV50_SEMANTIC_LAYER; 772bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 773bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_VIEWPORT_ARRAY_INDEX: 774bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[r].sn = NV50_SEMANTIC_VIEWPORTINDEX; 775bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 776bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_PRIMITIVE_ID: 777bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[r].sn = TGSI_SEMANTIC_PRIMID; 778bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 779bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_TARGET: 780bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[r].sn = TGSI_SEMANTIC_COLOR; 781bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[r].si = sm4.params_out[i].SemanticIndex; 782bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 783bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_COVERAGE: 784bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[r].sn = NV50_SEMANTIC_SAMPLEMASK; 785bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.io.sampleMask = r; 786bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 787bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_SAMPLE_INDEX: 788bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 789bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(!"invalid/unsupported output linkage semantic"); 790bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 791bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 792bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 793bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 794bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (prog->getType() == Program::TYPE_TESSELLATION_EVAL) 795bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller patch = &info.in[info.numInputs]; 796bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller else 797bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller patch = &info.out[info.numOutputs]; 798bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 799bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (n = 0, i = 0; i < sm4.num_params_patch; ++i) { 800bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller r = sm4.params_patch[i].Register; 801bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 802bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller patch[r].mask |= sm4.params_patch[i].Mask; 803bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller patch[r].id = r; 804bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (patch[r].regular) // already visited 805bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller continue; 806bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller patch[r].regular = 1; 807bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller patch[r].patch = 1; 808bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 809bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.numPatchConstants = MAX2(info.numPatchConstants, r + 1); 810bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 811bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (sm4.params_patch[i].SystemValueType) { 812bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_UNDEFINED: 813bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller patch[r].sn = TGSI_SEMANTIC_GENERIC; 814bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller patch[r].si = n++; 815bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 816bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_FINAL_QUAD_EDGE_TESSFACTOR: 817bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_FINAL_TRI_EDGE_TESSFACTOR: 818bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_FINAL_LINE_DETAIL_TESSFACTOR: 819bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller patch[r].sn = NV50_SEMANTIC_TESSFACTOR; 820bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller patch[r].si = sm4.params_patch[i].SemanticIndex; 821bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 822bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_FINAL_QUAD_INSIDE_TESSFACTOR: 823bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_FINAL_TRI_INSIDE_TESSFACTOR: 824bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_NAME_FINAL_LINE_DENSITY_TESSFACTOR: 825bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller patch[r].sn = NV50_SEMANTIC_TESSFACTOR; 826bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller patch[r].si = sm4.params_patch[i].SemanticIndex + 4; 827bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 828bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 829bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(!"invalid patch-constant linkage semantic"); 830bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 831bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 832bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 833bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (prog->getType() == Program::TYPE_TESSELLATION_EVAL) 834bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.numInputs += info.numPatchConstants; 835bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller else 836bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.numOutputs += info.numPatchConstants; 837bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 838bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return true; 839bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 840bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 841bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerbool 842bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::inspectDeclaration(const sm4_dcl& dcl) 843bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 844bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller int idx = -1; 845bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller enum sm4_interpolation ipa_mode; 846bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 847bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (dcl.op.get() && dcl.op->is_index_simple(0)) 848bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller idx = dcl.op->indices[0].disp; 849bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 850bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (dcl.opcode) { 851bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_SAMPLER: 852bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(idx >= 0); 853bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller shadow[idx] = dcl.dcl_sampler.shadow; 854bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 855bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_RESOURCE: 856bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller { 857bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller enum sm4_target targ = (enum sm4_target)dcl.dcl_resource.target; 858bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 859bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(idx >= 0 && idx < NV50_IR_MAX_RESOURCES); 860bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller resourceType[idx][0] = cvtTexTarget(targ, SM4_OPCODE_SAMPLE, NULL); 861bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller resourceType[idx][1] = cvtTexTarget(targ, SM4_OPCODE_SAMPLE_C, NULL); 862bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 863bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 864bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_CONSTANT_BUFFER: 865bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller // nothing to do 866bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 867bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CUSTOMDATA: 868bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.immd.bufSize = dcl.num * 4; 869bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.immd.buf = (uint32_t *)MALLOC(info.immd.bufSize); 870bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller memcpy(info.immd.buf, dcl.data, info.immd.bufSize); 871bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 872bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_INDEX_RANGE: 873bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller // XXX: ? 874bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 875bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_INPUT_PS_SGV: 876bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_INPUT_PS_SIV: 877bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_INPUT_PS: 878bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller { 879bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(idx >= 0 && idx < info.numInputs); 880bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ipa_mode = (enum sm4_interpolation)dcl.dcl_input_ps.interpolation; 881bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller interpMode[idx] = cvtInterpMode(ipa_mode); 882bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller setVaryingInterpMode(&info.in[idx], interpMode[idx]); 883bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 884bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 885bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_INPUT_SGV: 886bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_INPUT_SIV: 887bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_INPUT: 888bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (dcl.op->file == SM4_FILE_INPUT_DOMAIN_POINT) { 889bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller idx = info.numInputs++; 890bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.in[idx].sn = NV50_SEMANTIC_TESSCOORD; 891bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.in[idx].mask = dcl.op->mask; 892bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 893bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller // rest handled in parseSignature 894bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 895bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_OUTPUT_SGV: 896bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_OUTPUT_SIV: 897bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (dcl.sv) { 898bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_POSITION: 899bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(prog->getType() != Program::TYPE_FRAGMENT); 900bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 901bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_CULL_DISTANCE: // XXX: order ? 902b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller info.io.cullDistanceMask |= 1 << info.io.clipDistanceMask; 903b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller // fall through 904bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_SV_CLIP_DISTANCE: 905b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller info.io.clipDistanceMask++; // abuse as count 906bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 907bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 908bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 909bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 910bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (dcl.op->file) { 911bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_OUTPUT_DEPTH_LESS_EQUAL: 912bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_OUTPUT_DEPTH_GREATER_EQUAL: 913bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_OUTPUT_DEPTH: 914bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (info.io.fragDepth < 0xff) 915bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 916bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller idx = info.io.fragDepth = info.numOutputs++; 917bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[idx].sn = TGSI_SEMANTIC_POSITION; 918bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 919bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_OUTPUT_COVERAGE_MASK: 920bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (info.io.sampleMask < 0xff) 921bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 922bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller idx = info.io.sampleMask = info.numOutputs++; 923bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[idx].sn = NV50_SEMANTIC_SAMPLEMASK; 924bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 925bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 926bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 927bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 928bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 929bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_OUTPUT: 930bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller // handled in parseSignature 931bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 932bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_TEMPS: 933bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller nrRegVals += dcl.num; 934bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 935bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_INDEXABLE_TEMP: 936bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller nrArrays++; 937bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 938bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_GLOBAL_FLAGS: 939bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (prog->getType() == Program::TYPE_FRAGMENT) 940bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.fp.earlyFragTests = dcl.dcl_global_flags.early_depth_stencil; 941bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 942bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 943bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_FUNCTION_BODY: 944bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 945bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_FUNCTION_TABLE: 946bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 947bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_INTERFACE: 948bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 949bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 950bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller // GP 951bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY: 952bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.gp.outputPrim = g3dPrim( 953bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller dcl.dcl_gs_output_primitive_topology.primitive_topology); 954bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 955bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_GS_INPUT_PRIMITIVE: 956bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.gp.inputPrim = g3dPrim(dcl.dcl_gs_input_primitive.primitive); 957bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 958bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_MAX_OUTPUT_VERTEX_COUNT: 959bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.gp.maxVertices = dcl.num; 960bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 961bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_GS_INSTANCE_COUNT: 962bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.gp.instanceCount = dcl.num; 963bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 964bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_STREAM: 965bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 966bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 967bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller // TCP/TEP 968bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_INPUT_CONTROL_POINT_COUNT: 969bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.tp.inputPatchSize = 970bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller dcl.dcl_input_control_point_count.control_points; 971bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 972bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_OUTPUT_CONTROL_POINT_COUNT: 973bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.tp.outputPatchSize = 974bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller dcl.dcl_output_control_point_count.control_points; 975bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 976bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_TESS_DOMAIN: 977bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (dcl.dcl_tess_domain.domain) { 978bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_TESSELLATOR_DOMAIN_ISOLINE: 979bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.tp.domain = PIPE_PRIM_LINES; 980bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 981bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_TESSELLATOR_DOMAIN_TRI: 982bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.tp.domain = PIPE_PRIM_TRIANGLES; 983bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 984bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_TESSELLATOR_DOMAIN_QUAD: 985bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.tp.domain = PIPE_PRIM_QUADS; 986bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 987bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_TESSELLATOR_DOMAIN_UNDEFINED: 988bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 989bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.tp.domain = PIPE_PRIM_MAX; 990bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 991bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 992bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 993bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_TESS_PARTITIONING: 994bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (dcl.dcl_tess_partitioning.partitioning) { 995bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_TESSELLATOR_PARTITIONING_FRACTIONAL_ODD: 996bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.tp.partitioning = NV50_TESS_PART_FRACT_ODD; 997bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 998bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_TESSELLATOR_PARTITIONING_FRACTIONAL_EVEN: 999bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.tp.partitioning = NV50_TESS_PART_FRACT_EVEN; 1000bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1001bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_TESSELLATOR_PARTITIONING_POW2: 1002bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.tp.partitioning = NV50_TESS_PART_POW2; 1003bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1004bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_TESSELLATOR_PARTITIONING_INTEGER: 1005bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_TESSELLATOR_PARTITIONING_UNDEFINED: 1006bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 1007bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.tp.partitioning = NV50_TESS_PART_INTEGER; 1008bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1009bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1010bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1011bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_TESS_OUTPUT_PRIMITIVE: 1012bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (dcl.dcl_tess_output_primitive.primitive) { 1013bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_TESSELLATOR_OUTPUT_LINE: 1014bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.tp.outputPrim = PIPE_PRIM_LINES; 1015bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1016bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_TESSELLATOR_OUTPUT_TRIANGLE_CW: 1017bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.tp.outputPrim = PIPE_PRIM_TRIANGLES; 1018bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.tp.winding = +1; 1019bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1020bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_TESSELLATOR_OUTPUT_TRIANGLE_CCW: 1021bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.tp.outputPrim = PIPE_PRIM_TRIANGLES; 1022bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.tp.winding = -1; 1023bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1024bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_TESSELLATOR_OUTPUT_POINT: 1025bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.tp.outputPrim = PIPE_PRIM_POINTS; 1026bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1027bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case D3D_TESSELLATOR_OUTPUT_UNDEFINED: 1028bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 1029bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.tp.outputPrim = PIPE_PRIM_MAX; 1030bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1031bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1032bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1033bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1034bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_HS_FORK_PHASE: 1035bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ++subPhaseCnt[0]; 1036bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phase = 1; 1037bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1038bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_HS_JOIN_PHASE: 1039bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phase = 2; 1040bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ++subPhaseCnt[1]; 1041bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1042bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_HS_FORK_PHASE_INSTANCE_COUNT: 1043bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_HS_JOIN_PHASE_INSTANCE_COUNT: 1044bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_HS_MAX_TESSFACTOR: 1045bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1046bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1047bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller // weird stuff 1048bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_THREAD_GROUP: 1049bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_UNORDERED_ACCESS_VIEW_TYPED: 1050bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_UNORDERED_ACCESS_VIEW_RAW: 1051bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_UNORDERED_ACCESS_VIEW_STRUCTURED: 1052bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_THREAD_GROUP_SHARED_MEMORY_RAW: 1053bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_THREAD_GROUP_SHARED_MEMORY_STRUCTURED: 1054bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_RESOURCE_RAW: 1055bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_RESOURCE_STRUCTURED: 1056bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ERROR("unhandled declaration\n"); 1057bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller abort(); 1058bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return false; 1059bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1060bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 1061bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(!"invalid SM4 declaration"); 1062bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return false; 1063bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1064bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return true; 1065bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1066bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1067bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillervoid 1068bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::allocateValues() 1069bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1070bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller lData = new DataArray[nrArrays]; 1071bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1072bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (unsigned int i = 0; i < nrArrays; ++i) 1073bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller lData[i].setParent(this); 1074bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1075bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller tData32.setup(0, nrRegVals, 4, 4, FILE_GPR); 1076bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller tData64.setup(0, nrRegVals, 2, 8, FILE_GPR); 1077bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1078bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (prog->getType() == Program::TYPE_FRAGMENT) 1079bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller oData.setup(0, info.numOutputs, 4, 4, FILE_GPR); 1080bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1081bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1082bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerbool Converter::handleDeclaration(const sm4_dcl& dcl) 1083bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1084bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (dcl.opcode) { 1085bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_INDEXABLE_TEMP: 1086bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller lData[nrArrays++].setup(arrayVol, 1087bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller dcl.indexable_temp.num, dcl.indexable_temp.comps, 1088bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 4, FILE_MEMORY_LOCAL); 1089bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller arrayVol += dcl.indexable_temp.num * dcl.indexable_temp.comps * 4; 1090bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1091bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_HS_FORK_PHASE: 1092bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (subPhaseCnt[0]) 1093bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phaseInstCnt[0][subPhaseCnt[0]] = phaseInstCnt[0][subPhaseCnt[0] - 1]; 1094bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ++subPhaseCnt[0]; 1095bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1096bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_HS_JOIN_PHASE: 1097bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (subPhaseCnt[1]) 1098bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phaseInstCnt[1][subPhaseCnt[1]] = phaseInstCnt[1][subPhaseCnt[1] - 1]; 1099bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ++subPhaseCnt[1]; 1100bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1101bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_HS_FORK_PHASE_INSTANCE_COUNT: 1102bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phaseInstCnt[0][subPhaseCnt[0] - 1] = dcl.num; 1103bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1104bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DCL_HS_JOIN_PHASE_INSTANCE_COUNT: 1105bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phaseInstCnt[1][subPhaseCnt[1] - 1] = dcl.num; 1106bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1107bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1108bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 1109bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; // already handled in inspection 1110bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1111bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1112bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return true; 1113bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1114bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1115bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerSymbol * 1116bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::iSym(int i, int c) 1117bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1118bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (info.in[i].regular) { 1119bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return mkSymbol(FILE_SHADER_INPUT, 0, sTy, info.in[i].slot[c] * 4); 1120bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } else { 1121bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return mkSysVal(tgsi::irSemantic(info.in[i].sn), info.in[i].si); 1122bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1123bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1124bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1125bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerSymbol * 1126bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::oSym(int i, int c) 1127bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1128bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (info.out[i].regular) { 1129bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return mkSymbol(FILE_SHADER_OUTPUT, 0, dTy, info.out[i].slot[c] * 4); 1130bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } else { 1131bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return mkSysVal(tgsi::irSemantic(info.out[i].sn), info.out[i].si); 1132bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1133bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1134bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1135bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerValue * 1136bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::getSrcPtr(int s, int dim, int shl) 1137bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1138bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (srcPtr[s][dim]) 1139bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return srcPtr[s][dim]; 1140bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1141bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller sm4_op *op = insn->ops[s + nDstOpnds]->indices[dim].reg.get(); 1142bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1143bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (!op) 1144bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return NULL; 1145bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1146bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *index = src(*op, 0, s); 1147bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1148bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller srcPtr[s][dim] = index; 1149bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (shl) 1150bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller srcPtr[s][dim] = mkOp2v(OP_SHL, TYPE_U32, getSSA(), index, mkImm(shl)); 1151bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return srcPtr[s][dim]; 1152bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1153bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1154bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerValue * 1155bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::getDstPtr(int d, int dim, int shl) 1156bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1157bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(d == 0); 1158bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (dstPtr[dim]) 1159bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return dstPtr[dim]; 1160bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1161bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller sm4_op *op = insn->ops[d]->indices[dim].reg.get(); 1162bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (!op) 1163bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return NULL; 1164bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1165bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *index = src(*op, 0, d); 1166bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (shl) 1167bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller index = mkOp2v(OP_SHL, TYPE_U32, getSSA(), index, mkImm(shl)); 1168bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1169bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return (dstPtr[dim] = index); 1170bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1171bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1172bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerValue * 1173bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::getVtxPtr(int s) 1174bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1175bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(s < 3); 1176bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (vtxBase[s]) 1177bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return vtxBase[s]; 1178bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1179bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller sm4_op *op = insn->ops[s + nDstOpnds].get(); 1180bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (!op) 1181bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return NULL; 1182bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller int idx = op->indices[0].disp; 1183bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1184bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller vtxBase[s] = getSrcPtr(s, 0, 0); 1185bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller vtxBase[s] = mkOp2v(OP_PFETCH, TYPE_U32, getSSA(), mkImm(idx), vtxBase[s]); 1186bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return vtxBase[s]; 1187bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1188bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1189bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerValue * 1190bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::src(int i, int c) 1191bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1192bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return src(*insn->ops[i + nDstOpnds], c, i); 1193bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1194bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1195bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerValue * 1196bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::dst(int i, int c) 1197bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1198bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return dst(*insn->ops[i], c, i); 1199bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1200bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1201bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillervoid 1202bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::saveDst(int i, int c, Value *value) 1203bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1204bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (insn->insn.sat) 1205bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp1(OP_SAT, dTy, value, value); 1206bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return saveDst(*insn->ops[i], c, value, i); 1207bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1208bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1209bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerValue * 1210bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::interpolate(const sm4_op& op, int c, int i) 1211bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1212bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller int idx = op.indices[0].disp; 1213bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller int swz = op.swizzle[c]; 1214bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller operation opr = 1215bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller (info.in[idx].linear || info.in[idx].flat) ? OP_LINTERP : OP_PINTERP; 1216bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1217bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *ptr = getSrcPtr(i, 0, 4); 1218bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1219bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Instruction *insn = new_Instruction(func, opr, TYPE_F32); 1220bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1221bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller insn->setDef(0, getScratch()); 1222bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller insn->setSrc(0, iSym(idx, swz)); 1223bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (opr == OP_PINTERP) 1224bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller insn->setSrc(1, fragCoord[3]); 1225bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (ptr) 1226bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller insn->setIndirect(0, 0, ptr); 1227bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1228bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller insn->setInterpolate(interpMode[idx]); 1229bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1230bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bb->insertTail(insn); 1231bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return insn->getDef(0); 1232bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1233bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1234bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerValue * 1235bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::src(const sm4_op& op, int c, int s) 1236bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1237bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller const int size = typeSizeof(sTy); 1238bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1239bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Instruction *ld; 1240bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *res, *ptr, *vtx; 1241bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller int idx, dim, off; 1242bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller const int swz = op.swizzle[c]; 1243bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1244bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (op.file) { 1245bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_IMMEDIATE32: 1246bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = loadImm(NULL, (uint32_t)op.imm_values[swz].u32); 1247bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1248bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_IMMEDIATE64: 1249bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(c < 2); 1250bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = loadImm(NULL, op.imm_values[swz].u64); 1251bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1252bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_TEMP: 1253bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(op.is_index_simple(0)); 1254bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller idx = op.indices[0].disp; 1255bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (size == 8) 1256bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = tData64.load(idx, swz, NULL); 1257bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller else 1258bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = tData32.load(idx, swz, NULL); 1259bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1260bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_INPUT: 1261bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_INPUT_CONTROL_POINT: 1262bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_INPUT_PATCH_CONSTANT: 1263bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (prog->getType() == Program::TYPE_FRAGMENT) 1264bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return interpolate(op, c, s); 1265bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1266bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller idx = 0; 1267bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (op.file == SM4_FILE_INPUT_PATCH_CONSTANT) 1268bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller idx = info.numInputs - info.numPatchConstants; 1269bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1270bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (op.num_indices == 2) { 1271bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller vtx = getVtxPtr(s); 1272bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ptr = getSrcPtr(s, 1, 4); 1273bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller idx += op.indices[1].disp; 1274bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = getSSA(); 1275bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ld = mkOp1(OP_VFETCH, TYPE_U32, res, iSym(idx, swz)); 1276bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ld->setIndirect(0, 0, ptr); 1277bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ld->setIndirect(0, 1, vtx); 1278bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } else { 1279bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller idx += op.indices[0].disp; 1280bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = mkLoad(sTy, iSym(idx, swz), getSrcPtr(s, 0, 4)); 1281bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1282bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (op.file == SM4_FILE_INPUT_PATCH_CONSTANT) 1283bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res->defs->getInsn()->perPatch = 1; 1284bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1285bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_CONSTANT_BUFFER: 1286bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(op.num_indices == 2); 1287bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(op.is_index_simple(0)); 1288bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1289bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ptr = getSrcPtr(s, 1, 4); 1290bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller dim = op.indices[0].disp; 1291bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller off = (op.indices[1].disp * 4 + swz) * (sTy == TYPE_F64 ? 8 : 4); 1292bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1293bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = mkLoad(sTy, mkSymbol(FILE_MEMORY_CONST, dim, sTy, off), ptr); 1294bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1295bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_IMMEDIATE_CONSTANT_BUFFER: 1296bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ptr = getSrcPtr(s, 0, 4); 1297bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller off = (op.indices[0].disp * 4 + swz) * 4; 1298bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = mkLoad(sTy, mkSymbol(FILE_MEMORY_CONST, 14, sTy, off), ptr); 1299bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1300bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_INDEXABLE_TEMP: 1301bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller { 1302bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(op.is_index_simple(0)); 1303bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller int a = op.indices[0].disp; 1304bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller idx = op.indices[1].disp; 1305bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = lData[a].load(idx, swz, getSrcPtr(s, 1, 4)); 1306bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1307bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1308bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_INPUT_PRIMITIVEID: 1309bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller recordSV(TGSI_SEMANTIC_PRIMID, 0, 1, true); 1310bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = mkOp1v(OP_RDSV, TYPE_U32, getSSA(), mkSysVal(SV_PRIMITIVE_ID, 0)); 1311bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1312bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_INPUT_GS_INSTANCE_ID: 1313bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_OUTPUT_CONTROL_POINT_ID: 1314bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller recordSV(NV50_SEMANTIC_INVOCATIONID, 0, 1, true); 1315bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = mkOp1v(OP_RDSV, TYPE_U32, getSSA(), mkSysVal(SV_INVOCATION_ID, 0)); 1316bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1317bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_CYCLE_COUNTER: 1318bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = 1319bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp1v(OP_RDSV, TYPE_U32, getSSA(), mkSysVal(SV_CLOCK, swz ? 1 : 0)); 1320bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1321bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_INPUT_FORK_INSTANCE_ID: 1322bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_INPUT_JOIN_INSTANCE_ID: 1323bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller { 1324bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phaseInstanceUsed = true; 1325bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (unrollPhase) 1326bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return loadImm(NULL, phaseInstance); 1327bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller const unsigned int cnt = phaseInstCnt[phase - 1][subPhase]; 1328bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = getScratch(); 1329bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = mkOp1v(OP_RDSV, TYPE_U32, res, mkSysVal(SV_INVOCATION_ID, 0)); 1330bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = mkOp2v(OP_MIN, TYPE_U32, res, res, loadImm(NULL, cnt - 1)); 1331bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1332bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1333bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_INPUT_DOMAIN_POINT: 1334bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(swz < 3); 1335bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = domainPt[swz]; 1336bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1337bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_THREAD_GROUP_SHARED_MEMORY: 1338bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller off = (op.indices[0].disp * 4 + swz) * (sTy == TYPE_F64 ? 8 : 4); 1339bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ptr = getSrcPtr(s, 0, 4); 1340bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = mkLoad(sTy, mkSymbol(FILE_MEMORY_SHARED, 0, sTy, off), ptr); 1341bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1342bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_RESOURCE: 1343bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_SAMPLER: 1344bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_UNORDERED_ACCESS_VIEW: 1345bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return NULL; 1346bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_INPUT_THREAD_ID: 1347bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = mkOp1v(OP_RDSV, TYPE_U32, getSSA(), mkSysVal(SV_TID, swz)); 1348bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1349bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_INPUT_THREAD_GROUP_ID: 1350bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = mkOp1v(OP_RDSV, TYPE_U32, getSSA(), mkSysVal(SV_CTAID, swz)); 1351bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1352bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_FUNCTION_INPUT: 1353bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_INPUT_THREAD_ID_IN_GROUP: 1354bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(!"unhandled source file"); 1355bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return NULL; 1356bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 1357bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(!"invalid source file"); 1358bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return NULL; 1359bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1360bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1361bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (op.abs) 1362bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = mkOp1v(OP_ABS, sTy, getSSA(res->reg.size), res); 1363bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (op.neg) 1364bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res = mkOp1v(OP_NEG, sTy, getSSA(res->reg.size), res); 1365bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return res; 1366bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1367bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1368bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerValue * 1369bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::dst(const sm4_op &op, int c, int i) 1370bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1371bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (op.file) { 1372bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_TEMP: 1373bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return tData32.acquire(op.indices[0].disp, c); 1374bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_INDEXABLE_TEMP: 1375bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return getScratch(); 1376bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_OUTPUT: 1377bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (prog->getType() == Program::TYPE_FRAGMENT) 1378bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return oData.acquire(op.indices[0].disp, c); 1379bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return getScratch(); 1380bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_NULL: 1381bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return NULL; 1382bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_OUTPUT_DEPTH: 1383bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_OUTPUT_DEPTH_GREATER_EQUAL: 1384bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_OUTPUT_DEPTH_LESS_EQUAL: 1385bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_OUTPUT_COVERAGE_MASK: 1386bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return getScratch(); 1387bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_IMMEDIATE32: 1388bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_IMMEDIATE64: 1389bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_CONSTANT_BUFFER: 1390bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_RESOURCE: 1391bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_SAMPLER: 1392bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_UNORDERED_ACCESS_VIEW: 1393bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(!"invalid destination file"); 1394bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return NULL; 1395bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 1396bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(!"invalid file"); 1397bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return NULL; 1398bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1399bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1400bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1401bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillervoid 1402bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::saveFragDepth(operation op, Value *value) 1403bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1404bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (op == OP_MIN || op == OP_MAX) { 1405bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *zIn; 1406bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller zIn = mkOp1v(OP_RDSV, TYPE_F32, getSSA(), mkSysVal(SV_POSITION, 2)); 1407bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller value = mkOp2v(op, TYPE_F32, getSSA(), value, zIn); 1408bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1409bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller oData.store(info.io.fragDepth, 2, NULL, value); 1410bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1411bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1412bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillervoid 1413bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::saveDst(const sm4_op &op, int c, Value *value, int s) 1414bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1415bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Symbol *sym; 1416bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Instruction *st; 1417bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller int a, idx; 1418bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1419bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (op.file) { 1420bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_TEMP: 1421bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller idx = op.indices[0].disp; 1422bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller tData32.store(idx, c, NULL, value); 1423bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1424bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_INDEXABLE_TEMP: 1425bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller a = op.indices[0].disp; 1426bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller idx = op.indices[1].disp; 1427bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller // FIXME: shift is wrong, depends in lData 1428bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller lData[a].store(idx, c, getDstPtr(s, 1, 4), value); 1429bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1430bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_OUTPUT: 1431bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(op.num_indices == 1); 1432bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller idx = op.indices[0].disp; 1433bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (prog->getType() == Program::TYPE_FRAGMENT) { 1434bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller oData.store(idx, c, NULL, value); 1435bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } else { 1436bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (phase) 1437bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller idx += info.numOutputs - info.numPatchConstants; 1438bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller const int shl = (info.out[idx].sn == NV50_SEMANTIC_TESSFACTOR) ? 2 : 4; 1439bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller sym = oSym(idx, c); 1440bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (sym->reg.file == FILE_SHADER_OUTPUT) 1441bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller st = mkStore(OP_EXPORT, dTy, sym, getDstPtr(s, 0, shl), value); 1442bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller else 1443bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller st = mkStore(OP_WRSV, dTy, sym, getDstPtr(s, 0, 2), value); 1444bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller st->perPatch = phase ? 1 : 0; 1445bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1446bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1447bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_OUTPUT_DEPTH_GREATER_EQUAL: 1448bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller saveFragDepth(OP_MAX, value); 1449bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1450bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_OUTPUT_DEPTH_LESS_EQUAL: 1451bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller saveFragDepth(OP_MIN, value); 1452bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1453bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_OUTPUT_DEPTH: 1454bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller saveFragDepth(OP_NOP, value); 1455bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1456bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_OUTPUT_COVERAGE_MASK: 1457bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller oData.store(info.io.sampleMask, 0, NULL, value); 1458bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1459bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_IMMEDIATE32: 1460bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_IMMEDIATE64: 1461bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_INPUT: 1462bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_CONSTANT_BUFFER: 1463bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_RESOURCE: 1464bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_FILE_SAMPLER: 1465bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(!"invalid destination file"); 1466bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return; 1467bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 1468bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(!"invalid file"); 1469bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return; 1470bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1471bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1472bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1473bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillervoid 1474bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::emitTex(Value *dst0[4], TexInstruction *tex, const uint8_t swz[4]) 1475bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1476bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *res[4] = { NULL, NULL, NULL, NULL }; 1477bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller unsigned int c, d; 1478bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1479bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < 4; ++c) 1480bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (dst0[c]) 1481bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller tex->tex.mask |= 1 << swz[c]; 1482bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (d = 0, c = 0; c < 4; ++c) 1483bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (tex->tex.mask & (1 << c)) 1484bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller tex->setDef(d++, (res[c] = getScratch())); 1485bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1486bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bb->insertTail(tex); 1487bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1488bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (insn->opcode == SM4_OPCODE_RESINFO) { 1489bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (tex->tex.target.getDim() == 1) { 1490bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res[2] = loadImm(NULL, 0); 1491bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (!tex->tex.target.isArray()) 1492bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res[1] = res[2]; 1493bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } else 1494bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (tex->tex.target.getDim() == 2 && !tex->tex.target.isArray()) { 1495bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller res[2] = loadImm(NULL, 0); 1496bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1497bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < 4; ++c) { 1498bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (!dst0[c]) 1499bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller continue; 1500bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *src = res[swz[c]]; 1501bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(src); 1502bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (insn->insn.resinfo_return_type) { 1503bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case 0: 1504bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkCvt(OP_CVT, TYPE_F32, dst0[c], TYPE_U32, src); 1505bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1506bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case 1: 1507bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkCvt(OP_CVT, TYPE_F32, dst0[c], TYPE_U32, src); 1508bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (swz[c] < tex->tex.target.getDim()) 1509bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp1(OP_RCP, TYPE_F32, dst0[c], dst0[c]); 1510bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1511bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 1512bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkMov(dst0[c], src); 1513bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1514bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1515bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1516bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } else { 1517bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < 4; ++c) 1518bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (dst0[c]) 1519bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkMov(dst0[c], res[swz[c]]); 1520bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1521bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1522bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1523bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillervoid 1524bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::handleQUERY(Value *dst0[4], enum TexQuery query) 1525bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1526bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TexInstruction *texi = new_TexInstruction(func, OP_TXQ); 1527bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller texi->tex.query = query; 1528bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1529bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(insn->ops[2]->file == SM4_FILE_RESOURCE); // TODO: UAVs 1530bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1531bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller const int rOp = (query == TXQ_DIMS) ? 2 : 1; 1532bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller const int sOp = (query == TXQ_DIMS) ? 0 : 1; 1533bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1534bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller const int tR = insn->ops[rOp]->indices[0].disp; 1535bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1536bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller texi->setTexture(resourceType[tR][0], tR, 0); 1537bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1538bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller texi->setSrc(0, src(sOp, 0)); // mip level or sample index 1539bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1540bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller emitTex(dst0, texi, insn->ops[rOp]->swizzle); 1541bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1542bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1543bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillervoid 1544bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::handleLOAD(Value *dst0[4]) 1545bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1546bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TexInstruction *texi = new_TexInstruction(func, OP_TXF); 1547bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller unsigned int c; 1548bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1549bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller const int tR = insn->ops[2]->indices[0].disp; 1550bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1551bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller texi->setTexture(resourceType[tR][0], tR, 0); 1552bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1553bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < texi->tex.target.getArgCount(); ++c) 1554bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller texi->setSrc(c, src(0, c)); 1555bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1556bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (texi->tex.target == TEX_TARGET_BUFFER) { 1557bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller texi->tex.levelZero = true; 1558bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } else { 1559bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller texi->setSrc(c++, src(0, 3)); 1560bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < 3; ++c) { 1561bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller texi->tex.offset[0][c] = insn->sample_offset[c]; 1562bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (texi->tex.offset[0][c]) 1563bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller texi->tex.useOffsets = 1; 1564bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1565bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1566bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1567bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller emitTex(dst0, texi, insn->ops[2]->swizzle); 1568bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1569bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1570bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller// order of nv50 ir sources: x y z/layer lod/bias dc 1571bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillervoid 1572bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::handleSAMPLE(operation opr, Value *dst0[4]) 1573bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1574bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TexInstruction *texi = new_TexInstruction(func, opr); 1575bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller unsigned int c, s; 1576bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *arg[4], *src0[4]; 1577bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *val; 1578bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *lod = NULL, *dc = NULL; 1579bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1580bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller const int tR = insn->ops[2]->indices[0].disp; 1581bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller const int tS = insn->ops[3]->indices[0].disp; 1582bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1583bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller TexInstruction::Target tgt = resourceType[tR][shadow[tS] ? 1 : 0]; 1584bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1585bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < tgt.getArgCount(); ++c) 1586bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller arg[c] = src0[c] = src(0, c); 1587bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1588bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (insn->opcode == SM4_OPCODE_SAMPLE_L || 1589bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller insn->opcode == SM4_OPCODE_SAMPLE_B) { 1590bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller lod = src(3, 0); 1591bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } else 1592bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (insn->opcode == SM4_OPCODE_SAMPLE_C || 1593bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller insn->opcode == SM4_OPCODE_SAMPLE_C_LZ) { 1594bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller dc = src(3, 0); 1595bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (insn->opcode == SM4_OPCODE_SAMPLE_C_LZ) 1596bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller texi->tex.levelZero = true; 1597bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } else 1598bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (insn->opcode == SM4_OPCODE_SAMPLE_D) { 1599bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < tgt.getDim(); ++c) { 1600bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller texi->dPdx[c] = src(3, c); 1601bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller texi->dPdy[c] = src(4, c); 1602bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1603bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1604bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1605bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (tgt.isCube()) { 1606bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < 3; ++c) 1607bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller src0[c] = mkOp1v(OP_ABS, TYPE_F32, getSSA(), arg[c]); 1608bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller val = getScratch(); 1609bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp2(OP_MAX, TYPE_F32, val, src0[0], src0[1]); 1610bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp2(OP_MAX, TYPE_F32, val, src0[2], val); 1611bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp1(OP_RCP, TYPE_F32, val, val); 1612bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < 3; ++c) 1613bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller src0[c] = mkOp2v(OP_MUL, TYPE_F32, getSSA(), arg[c], val); 1614bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1615bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1616bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (s = 0; s < tgt.getArgCount(); ++s) 1617bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller texi->setSrc(s, src0[s]); 1618bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (lod) 1619bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller texi->setSrc(s++, lod); 1620bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (dc) 1621bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller texi->setSrc(s++, dc); 1622bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1623bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < 3; ++c) { 1624bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller texi->tex.offset[0][c] = insn->sample_offset[c]; 1625bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (texi->tex.offset[0][c]) 1626bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller texi->tex.useOffsets = 1; 1627bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1628bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1629bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller texi->setTexture(tgt, tR, tS); 1630bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1631bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller emitTex(dst0, texi, insn->ops[2]->swizzle); 1632bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1633bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1634bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillervoid 1635bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::handleDP(Value *dst0[4], int dim) 1636bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1637bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *src0 = src(0, 0), *src1 = src(1, 0); 1638bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *dotp = getScratch(); 1639bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1640bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(dim > 0); 1641bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1642bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp2(OP_MUL, TYPE_F32, dotp, src0, src1); 1643bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (int c = 1; c < dim; ++c) 1644bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp3(OP_MAD, TYPE_F32, dotp, src(0, c), src(1, c), dotp); 1645bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1646bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (int c = 0; c < 4; ++c) 1647bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller dst0[c] = dotp; 1648bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1649bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1650bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillervoid 1651bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::insertConvergenceOps(BasicBlock *conv, BasicBlock *fork) 1652bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1653bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller FlowInstruction *join = new_FlowInstruction(func, OP_JOIN, NULL); 1654bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller join->fixed = 1; 1655bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller conv->insertHead(join); 1656bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1657bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller fork->joinAt = new_FlowInstruction(func, OP_JOINAT, conv); 1658bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller fork->insertBefore(fork->getExit(), fork->joinAt); 1659bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1660bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1661bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillervoid 1662bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::finalizeShader() 1663bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1664bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (finalized) 1665bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return; 1666bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller BasicBlock *epilogue = reinterpret_cast<BasicBlock *>(leaveBBs.pop().u.p); 1667bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller entryBBs.pop(); 1668bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1669bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller finalized = true; 1670bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1671bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bb->cfg.attach(&epilogue->cfg, Graph::Edge::TREE); 1672bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller setPosition(epilogue, true); 1673bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1674bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (prog->getType() == Program::TYPE_FRAGMENT) 1675bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller exportOutputs(); 1676bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1677bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp(OP_EXIT, TYPE_NONE, NULL)->terminator = 1; 1678bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1679bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1680bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#define FOR_EACH_DST0_ENABLED_CHANNEL32(chan) \ 1681bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for ((chan) = 0; (chan) < 4; ++(chan)) \ 1682bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (insn->ops[0].get()->mask & (1 << (chan))) 1683bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1684bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#define FOR_EACH_DST0_ENABLED_CHANNEL64(chan) \ 1685bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for ((chan) = 0; (chan) < 2; ++(chan)) \ 1686bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (insn->ops[0].get()->mask & (1 << (chan))) 1687bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1688bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerbool 1689bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::checkDstSrcAliasing() const 1690bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1691bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (unsigned int d = 0; d < nDstOpnds; ++d) { 1692bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (unsigned int s = nDstOpnds; s < insn->num_ops; ++s) { 1693bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (insn->ops[d]->file != insn->ops[s]->file) 1694bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller continue; 1695bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller int i = insn->ops[s]->num_indices - 1; 1696bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (i != insn->ops[d]->num_indices - 1) 1697bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller continue; 1698bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (insn->ops[d]->is_index_simple(i) && 1699bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller insn->ops[s]->is_index_simple(i) && 1700bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller insn->ops[d]->indices[i].disp == insn->ops[s]->indices[i].disp) 1701bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return true; 1702bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1703bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1704bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return false; 1705bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 1706bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1707bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerbool 1708bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::handleInstruction(unsigned int pos) 1709bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 1710bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *dst0[4], *rDst0[4]; 1711bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *dst1[4], *rDst1[4]; 1712bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller int c, nc; 1713bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1714bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller insn = sm4.insns[pos]; 1715bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller enum sm4_opcode opcode = static_cast<sm4_opcode>(insn->opcode); 1716bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1717bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller operation op = cvtOpcode(opcode); 1718bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1719bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller sTy = inferSrcType(opcode); 1720bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller dTy = inferDstType(opcode); 1721bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1722bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller nc = dTy == TYPE_F64 ? 2 : 4; 1723bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1724bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller nDstOpnds = getDstOpndCount(opcode); 1725bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1726bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bool useScratchDst = checkDstSrcAliasing(); 1727bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1728bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller INFO("SM4_OPCODE_##%u, aliasing = %u\n", insn->opcode, useScratchDst); 1729bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1730bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (nDstOpnds >= 1) { 1731bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < nc; ++c) 1732bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller rDst0[c] = dst0[c] = 1733bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller insn->ops[0].get()->mask & (1 << c) ? dst(0, c) : NULL; 1734bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (useScratchDst) 1735bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < nc; ++c) 1736bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller dst0[c] = rDst0[c] ? getScratch() : NULL; 1737bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1738bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1739bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (nDstOpnds >= 2) { 1740bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < nc; ++c) 1741bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller rDst1[c] = dst1[c] = 1742bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller insn->ops[1].get()->mask & (1 << c) ? dst(1, c) : NULL; 1743bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (useScratchDst) 1744bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < nc; ++c) 1745bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller dst1[c] = rDst1[c] ? getScratch() : NULL; 1746bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1747bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1748bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller switch (insn->opcode) { 1749bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ADD: 1750bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_AND: 1751bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DIV: 1752bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IADD: 1753bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IMAX: 1754bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IMIN: 1755bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_MIN: 1756bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_MAX: 1757bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_MUL: 1758bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_OR: 1759bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UMAX: 1760bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UMIN: 1761bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_XOR: 1762bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller FOR_EACH_DST0_ENABLED_CHANNEL32(c) { 1763bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Instruction *insn = mkOp2(op, dTy, dst0[c], src(0, c), src(1, c)); 1764bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (dTy == TYPE_F32) 1765bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller insn->ftz = 1; 1766bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1767bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1768bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1769bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ISHL: 1770bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ISHR: 1771bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_USHR: 1772bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller FOR_EACH_DST0_ENABLED_CHANNEL32(c) { 1773bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Instruction *insn = mkOp2(op, dTy, dst0[c], src(0, c), src(1, c)); 1774bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller insn->subOp = NV50_IR_SUBOP_SHIFT_WRAP; 1775bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1776bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1777bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1778bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IMAD: 1779bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_MAD: 1780bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UMAD: 1781bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller FOR_EACH_DST0_ENABLED_CHANNEL32(c) { 1782bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp3(OP_MAD, dTy, dst0[c], src(0, c), src(1, c), src(2, c)); 1783bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1784bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1785bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1786bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DADD: 1787bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DMAX: 1788bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DMIN: 1789bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DMUL: 1790bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller FOR_EACH_DST0_ENABLED_CHANNEL64(c) { 1791bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp2(op, dTy, dst0[c], src(0, c), src(1, c)); 1792bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1793bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1794bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1795bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UDIV: 1796bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < 4; ++c) { 1797bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *dvn, *dvs; 1798bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (dst0[c] || dst1[c]) { 1799bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller dvn = src(0, c); 1800bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller dvs = src(1, c); 1801bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1802bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (dst0[c]) 1803bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp2(OP_DIV, TYPE_U32, dst0[c], dvn, dvs); 1804bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (dst1[c]) 1805bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp2(OP_MOD, TYPE_U32, dst1[c], dvn, dvs); 1806bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1807bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1808bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1809bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IMUL: 1810bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UMUL: 1811bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < 4; ++c) { 1812bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *a, *b; 1813bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (dst0[c] || dst1[c]) { 1814bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller a = src(0, c); 1815bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller b = src(1, c); 1816bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1817bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (dst0[c]) 1818bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp2(OP_MUL, dTy, dst0[c], a, b)->subOp = 1819bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller NV50_IR_SUBOP_MUL_HIGH; 1820bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (dst1[c]) 1821bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp2(OP_MUL, dTy, dst1[c], a, b); 1822bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1823bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1824bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1825bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DP2: 1826bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller handleDP(dst0, 2); 1827bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1828bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DP3: 1829bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller handleDP(dst0, 3); 1830bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1831bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DP4: 1832bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller handleDP(dst0, 4); 1833bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1834bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1835bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DERIV_RTX: 1836bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DERIV_RTX_COARSE: 1837bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DERIV_RTX_FINE: 1838bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DERIV_RTY: 1839bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DERIV_RTY_COARSE: 1840bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DERIV_RTY_FINE: 1841bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_MOV: 1842bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_INEG: 1843bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_NOT: 1844bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SQRT: 1845bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_COUNTBITS: 1846bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_EXP: 1847bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_LOG: 1848bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_RCP: 1849bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller FOR_EACH_DST0_ENABLED_CHANNEL32(c) { 1850bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp1(op, dTy, dst0[c], src(0, c)); 1851bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1852bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1853bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1854bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_FRC: 1855bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller FOR_EACH_DST0_ENABLED_CHANNEL32(c) { 1856bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *val = getScratch(); 1857bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *src0 = src(0, c); 1858bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp1(OP_FLOOR, TYPE_F32, val, src0); 1859bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp2(OP_SUB, TYPE_F32, dst0[c], src0, val); 1860bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1861bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1862bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1863bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_MOVC: 1864bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller FOR_EACH_DST0_ENABLED_CHANNEL32(c) 1865bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkCmp(OP_SLCT, CC_NE, TYPE_U32, dst0[c], src(1, c), src(2, c), 1866bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller src(0, c)); 1867bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1868bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1869bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ROUND_NE: 1870bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ROUND_NI: 1871bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ROUND_PI: 1872bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ROUND_Z: 1873bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller FOR_EACH_DST0_ENABLED_CHANNEL32(c) { 1874bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Instruction *rnd = mkOp1(op, dTy, dst0[c], src(0, c)); 1875bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller rnd->ftz = 1; 1876bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller rnd->rnd = cvtRoundingMode(opcode); 1877bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1878bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1879bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1880bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_RSQ: 1881bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller FOR_EACH_DST0_ENABLED_CHANNEL32(c) 1882bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp1(op, dTy, dst0[c], src(0, c)); 1883bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1884bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1885bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SINCOS: 1886bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < 4; ++c) { 1887bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (!dst0[c] && !dst1[c]) 1888bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller continue; 1889bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *val = mkOp1v(OP_PRESIN, TYPE_F32, getScratch(), src(0, c)); 1890bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (dst0[c]) 1891bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp1(OP_SIN, TYPE_F32, dst0[c], val); 1892bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (dst1[c]) 1893bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp1(OP_COS, TYPE_F32, dst1[c], val); 1894bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1895bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1896bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1897bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_EQ: 1898bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_GE: 1899bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IEQ: 1900bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IGE: 1901bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ILT: 1902bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_LT: 1903bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_NE: 1904bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_INE: 1905bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ULT: 1906bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UGE: 1907bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DEQ: 1908bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DGE: 1909bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DLT: 1910bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DNE: 1911bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller { 1912bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller CondCode cc = cvtCondCode(opcode); 1913bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller FOR_EACH_DST0_ENABLED_CHANNEL32(c) { 1914bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller CmpInstruction *set; 1915bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller set = mkCmp(op, cc, sTy, dst0[c], src(0, c), src(1, c), NULL); 1916bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller set->setType(dTy, sTy); 1917bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (sTy == TYPE_F32) 1918bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller set->ftz = 1; 1919bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1920bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1921bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1922bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1923bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_FTOI: 1924bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_FTOU: 1925bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller FOR_EACH_DST0_ENABLED_CHANNEL32(c) 1926bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkCvt(op, dTy, dst0[c], sTy, src(0, c))->rnd = ROUND_Z; 1927bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1928bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ITOF: 1929bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_UTOF: 1930bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_F32TOF16: 1931bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_F16TOF32: 1932bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DTOF: 1933bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_FTOD: 1934bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller FOR_EACH_DST0_ENABLED_CHANNEL32(c) 1935bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkCvt(op, dTy, dst0[c], sTy, src(0, c)); 1936bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1937bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1938bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CUT: 1939bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CUT_STREAM: 1940bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp1(OP_RESTART, TYPE_U32, NULL, mkImm(0))->fixed = 1; 1941bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1942bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_EMIT: 1943bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_EMIT_STREAM: 1944bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp1(OP_EMIT, TYPE_U32, NULL, mkImm(0))->fixed = 1; 1945bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1946bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_EMITTHENCUT: 1947bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_EMITTHENCUT_STREAM: 1948bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller { 1949bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Instruction *cut = mkOp1(OP_EMIT, TYPE_U32, NULL, mkImm(0)); 1950bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller cut->fixed = 1; 1951bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller cut->subOp = NV50_IR_SUBOP_EMIT_RESTART; 1952bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1953bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1954bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1955bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_DISCARD: 1956bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.prop.fp.usesDiscard = TRUE; 1957bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp(OP_DISCARD, TYPE_NONE, NULL)->setPredicate( 1958bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller insn->insn.test_nz ? CC_P : CC_NOT_P, src(0, 0)); 1959bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1960bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1961bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CALL: 1962bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CALLC: 1963bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(!"CALL/CALLC not implemented"); 1964bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1965bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1966bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_RET: 1967bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller // XXX: the following doesn't work with subroutines / early ret 1968bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (!haveNextPhase(pos)) 1969bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller finalizeShader(); 1970bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller else 1971bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phaseEnded = phase + 1; 1972bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1973bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1974bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_IF: 1975bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller { 1976bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller BasicBlock *ifClause = new BasicBlock(func); 1977bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1978bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bb->cfg.attach(&ifClause->cfg, Graph::Edge::TREE); 1979bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller condBBs.push(bb); 1980bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller joinBBs.push(bb); 1981bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1982bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkFlow(OP_BRA, NULL, insn->insn.test_nz ? CC_NOT_P : CC_P, src(0, 0)); 1983bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1984bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller setPosition(ifClause, true); 1985bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 1986bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 1987bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ELSE: 1988bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller { 1989bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller BasicBlock *elseClause = new BasicBlock(func); 1990bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller BasicBlock *forkPoint = reinterpret_cast<BasicBlock *>(condBBs.pop().u.p); 1991bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1992bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller forkPoint->cfg.attach(&elseClause->cfg, Graph::Edge::TREE); 1993bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller condBBs.push(bb); 1994bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1995bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller forkPoint->getExit()->asFlow()->target.bb = elseClause; 1996bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (!bb->isTerminated()) 1997bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkFlow(OP_BRA, NULL, CC_ALWAYS, NULL); 1998bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 1999bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller setPosition(elseClause, true); 2000bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2001bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2002bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ENDIF: 2003bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller { 2004bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller BasicBlock *convPoint = new BasicBlock(func); 2005bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller BasicBlock *lastBB = reinterpret_cast<BasicBlock *>(condBBs.pop().u.p); 2006bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller BasicBlock *forkPoint = reinterpret_cast<BasicBlock *>(joinBBs.pop().u.p); 2007bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2008bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (!bb->isTerminated()) { 2009bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller // we only want join if none of the clauses ended with CONT/BREAK/RET 2010bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (lastBB->getExit()->op == OP_BRA && joinBBs.getSize() < 6) 2011bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller insertConvergenceOps(convPoint, forkPoint); 2012bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkFlow(OP_BRA, convPoint, CC_ALWAYS, NULL); 2013bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bb->cfg.attach(&convPoint->cfg, Graph::Edge::FORWARD); 2014bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2015bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2016bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (lastBB->getExit()->op == OP_BRA) { 2017bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller lastBB->cfg.attach(&convPoint->cfg, Graph::Edge::FORWARD); 2018bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller lastBB->getExit()->asFlow()->target.bb = convPoint; 2019bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2020bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller setPosition(convPoint, true); 2021bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2022bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2023bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2024bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SWITCH: 2025bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CASE: 2026bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ENDSWITCH: 2027bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(!"SWITCH/CASE/ENDSWITCH not implemented"); 2028bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2029bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2030bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_LOOP: 2031bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller { 2032bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller BasicBlock *loopHeader = new BasicBlock(func); 2033bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller BasicBlock *loopBreak = new BasicBlock(func); 2034bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2035bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller loopBBs.push(loopHeader); 2036bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller breakBBs.push(loopBreak); 2037bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (loopBBs.getSize() > func->loopNestingBound) 2038bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller func->loopNestingBound++; 2039bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2040bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkFlow(OP_PREBREAK, loopBreak, CC_ALWAYS, NULL); 2041bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2042bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bb->cfg.attach(&loopHeader->cfg, Graph::Edge::TREE); 2043bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller setPosition(loopHeader, true); 2044bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkFlow(OP_PRECONT, loopHeader, CC_ALWAYS, NULL); 2045bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2046bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2047bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_ENDLOOP: 2048bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller { 2049bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller BasicBlock *loopBB = reinterpret_cast<BasicBlock *>(loopBBs.pop().u.p); 2050bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2051bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (!bb->isTerminated()) { 2052bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkFlow(OP_CONT, loopBB, CC_ALWAYS, NULL); 2053bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bb->cfg.attach(&loopBB->cfg, Graph::Edge::BACK); 2054bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2055bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller setPosition(reinterpret_cast<BasicBlock *>(breakBBs.pop().u.p), true); 2056bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2057bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2058bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_BREAK: 2059bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller { 2060bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (bb->isTerminated()) 2061bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2062bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller BasicBlock *breakBB = reinterpret_cast<BasicBlock *>(breakBBs.peek().u.p); 2063bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkFlow(OP_BREAK, breakBB, CC_ALWAYS, NULL); 2064bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bb->cfg.attach(&breakBB->cfg, Graph::Edge::CROSS); 2065bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2066bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2067bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_BREAKC: 2068bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller { 2069bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller BasicBlock *nextBB = new BasicBlock(func); 2070bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller BasicBlock *breakBB = reinterpret_cast<BasicBlock *>(breakBBs.peek().u.p); 2071bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller CondCode cc = insn->insn.test_nz ? CC_P : CC_NOT_P; 2072bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkFlow(OP_BREAK, breakBB, cc, src(0, 0)); 2073bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bb->cfg.attach(&breakBB->cfg, Graph::Edge::CROSS); 2074bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bb->cfg.attach(&nextBB->cfg, Graph::Edge::FORWARD); 2075bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller setPosition(nextBB, true); 2076bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2077bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2078bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CONTINUE: 2079bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller { 2080bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (bb->isTerminated()) 2081bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2082bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller BasicBlock *contBB = reinterpret_cast<BasicBlock *>(loopBBs.peek().u.p); 2083bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkFlow(OP_CONT, contBB, CC_ALWAYS, NULL); 2084bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller contBB->explicitCont = true; 2085bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bb->cfg.attach(&contBB->cfg, Graph::Edge::BACK); 2086bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2087bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2088bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_CONTINUEC: 2089bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller { 2090bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller BasicBlock *nextBB = new BasicBlock(func); 2091bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller BasicBlock *contBB = reinterpret_cast<BasicBlock *>(loopBBs.peek().u.p); 2092bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkFlow(OP_CONT, contBB, insn->insn.test_nz ? CC_P : CC_NOT_P, src(0, 0)); 2093bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bb->cfg.attach(&contBB->cfg, Graph::Edge::BACK); 2094bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller bb->cfg.attach(&nextBB->cfg, Graph::Edge::FORWARD); 2095bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller setPosition(nextBB, true); 2096bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2097bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2098bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2099bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SAMPLE: 2100bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SAMPLE_C: 2101bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SAMPLE_C_LZ: 2102bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SAMPLE_L: 2103bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SAMPLE_D: 2104bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SAMPLE_B: 2105bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller handleSAMPLE(op, dst0); 2106bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2107bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_LD: 2108bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_LD_MS: 2109bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller handleLOAD(dst0); 2110bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2111bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2112bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_GATHER4: 2113bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller assert(!"GATHER4 not implemented\n"); 2114bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2115bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2116bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_RESINFO: 2117bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller handleQUERY(dst0, TXQ_DIMS); 2118bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2119bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_SAMPLE_POS: 2120bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller handleQUERY(dst0, TXQ_SAMPLE_POSITION); 2121bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2122bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2123bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_NOP: 2124bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp(OP_NOP, TYPE_NONE, NULL); 2125bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2126bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2127bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_HS_DECLS: 2128bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller // XXX: any significance ? 2129bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2130bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_HS_CONTROL_POINT_PHASE: 2131bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phase = 0; 2132bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2133bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_HS_FORK_PHASE: 2134bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (phase != 1) 2135bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller subPhase = 0; 2136bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phase = 1; 2137bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phaseInstance = (phaseStart == pos) ? (phaseInstance + 1) : 0; 2138bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phaseStart = pos; 2139bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (info.prop.tp.outputPatchSize < phaseInstCnt[0][subPhase]) 2140bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller unrollPhase = true; 2141bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2142bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller case SM4_OPCODE_HS_JOIN_PHASE: 2143bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (phase != 2) 2144bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller subPhase = 0; 2145bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phase = 2; 2146bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phaseInstance = (phaseStart == pos) ? (phaseInstance + 1) : 0; 2147bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phaseStart = pos; 2148bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (info.prop.tp.outputPatchSize < phaseInstCnt[1][subPhase]) 2149bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller unrollPhase = true; 2150bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller break; 2151bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2152bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller default: 2153bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ERROR("SM4_OPCODE_#%u illegal / not supported\n", insn->opcode); 2154bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller abort(); 2155bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return false; 2156bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2157bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2158bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < nc; ++c) { 2159bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (nDstOpnds >= 1 && rDst0[c]) { 2160bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (dst0[c] != rDst0[c]) 2161bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkMov(rDst0[c], dst0[c]); 2162bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller saveDst(0, c, rDst0[c]); 2163bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2164bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (nDstOpnds >= 2 && rDst1[c]) { 2165bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (dst1[c] != rDst1[c]) 2166bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkMov(rDst1[c], dst1[c]); 2167bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller saveDst(1, c, rDst1[c]); 2168bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2169bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2170bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2171bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller memset(srcPtr, 0, sizeof(srcPtr)); 2172bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller memset(dstPtr, 0, sizeof(dstPtr)); 2173bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller memset(vtxBase, 0, sizeof(vtxBase)); 2174bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return true; 2175bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 2176bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2177bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillervoid 2178bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::exportOutputs() 2179bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 2180bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (int i = 0; i < info.numOutputs; ++i) { 2181bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (int c = 0; c < 4; ++c) { 2182bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (!oData.exists(i, c)) 2183bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller continue; 2184bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Symbol *sym = mkSymbol(FILE_SHADER_OUTPUT, 0, TYPE_F32, 2185bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.out[i].slot[c] * 4); 2186bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Value *val = oData.load(i, c, NULL); 2187bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (val) 2188bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkStore(OP_EXPORT, TYPE_F32, sym, NULL, val); 2189bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2190bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2191bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 2192bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2193bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::Converter(Program *p, struct nv50_ir_prog_info *s) 2194bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller : tData32(this), 2195bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller tData64(this), 2196bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller oData(this), 2197bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info(*s), 2198bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller sm4(*reinterpret_cast<const sm4_program *>(s->bin.source)), 2199bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller prog(p) 2200bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 2201bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller memset(srcPtr, 0, sizeof(srcPtr)); 2202bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller memset(dstPtr, 0, sizeof(dstPtr)); 2203bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller memset(vtxBase, 0, sizeof(vtxBase)); 2204bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2205bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller memset(interpMode, 0, sizeof(interpMode)); 2206bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2207bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller nrRegVals = nrArrays = arrayVol = 0; 2208bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2209bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (phase = 3; phase > 0; --phase) 2210bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (unsigned int i = 0; i < PIPE_MAX_SHADER_OUTPUTS; ++i) 2211bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller out[phase - 1][i].sn = TGSI_SEMANTIC_COUNT; 2212bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2213bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller unrollPhase = false; 2214bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phaseStart = 0; 2215bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller subPhaseCnt[0] = subPhaseCnt[1] = 0; 2216bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 2217bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2218bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::~Converter() 2219bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 2220bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (lData) 2221bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller delete[] lData; 2222bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2223bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (subPhaseCnt[0]) 2224bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller delete[] phaseInstCnt[0]; 2225bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (subPhaseCnt[1]) 2226bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller delete[] phaseInstCnt[1]; 2227bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 2228bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2229bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerbool 2230bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::haveNextPhase(unsigned int pos) const 2231bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 2232bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ++pos; 2233bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return (pos < sm4.insns.size()) && 2234bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller (sm4.insns[pos]->opcode == SM4_OPCODE_HS_FORK_PHASE || 2235bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller sm4.insns[pos]->opcode == SM4_OPCODE_HS_JOIN_PHASE); 2236bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 2237bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2238bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerbool 2239bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerConverter::run() 2240bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 2241bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller parseSignature(); 2242bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2243bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (unsigned int pos = 0; pos < sm4.dcls.size(); ++pos) 2244bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller inspectDeclaration(*sm4.dcls[pos]); 2245bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2246bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phaseInstCnt[0] = new unsigned int [subPhaseCnt[0]]; 2247bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phaseInstCnt[1] = new unsigned int [subPhaseCnt[1]]; 2248bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (int i = 0; i < subPhaseCnt[0]; ++i) 2249bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phaseInstCnt[0][i] = -1; 2250bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (int i = 0; i < subPhaseCnt[1]; ++i) 2251bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phaseInstCnt[1][i] = -1; 2252bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller // re-increased in handleDeclaration: 2253bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller subPhaseCnt[0] = subPhaseCnt[1] = 0; 2254bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2255bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller allocateValues(); 2256bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller nrArrays = 0; 2257bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (unsigned int pos = 0; pos < sm4.dcls.size(); ++pos) 2258bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller handleDeclaration(*sm4.dcls[pos]); 2259bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2260b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller info.io.genUserClip = -1; // no UCPs permitted with SM4 shaders 2261b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller info.io.clipDistanceMask = (1 << info.io.clipDistanceMask) - 1; 2262b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller 2263bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller info.assignSlots(&info); 2264bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2265bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (sm4.dcls.size() == 0 && sm4.insns.size() == 0) 2266bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return true; 2267bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2268bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller BasicBlock *entry = new BasicBlock(prog->main); 2269bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller BasicBlock *leave = new BasicBlock(prog->main); 2270bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2271bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller prog->main->setEntry(entry); 2272bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller prog->main->setExit(leave); 2273bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2274bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller setPosition(entry, true); 2275bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2276bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller entryBBs.push(entry); 2277bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller leaveBBs.push(leave); 2278bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2279bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (prog->getType() == Program::TYPE_FRAGMENT) { 2280bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Symbol *sv = mkSysVal(SV_POSITION, 3); 2281bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller fragCoord[3] = mkOp1v(OP_RDSV, TYPE_F32, getSSA(), sv); 2282bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp1(OP_RCP, TYPE_F32, fragCoord[3], fragCoord[3]); 2283bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } else 2284bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (prog->getType() == Program::TYPE_TESSELLATION_EVAL) { 2285bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller const int n = (info.prop.tp.domain == PIPE_PRIM_TRIANGLES) ? 3 : 2; 2286bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller int c; 2287bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (c = 0; c < n; ++c) 2288bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller domainPt[c] = 2289bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mkOp1v(OP_RDSV, TYPE_F32, getSSA(), mkSysVal(SV_TESS_COORD, c)); 2290bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (c == 2) 2291bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller domainPt[2] = loadImm(NULL, 0.0f); 2292bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2293bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2294bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller finalized = false; 2295bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phaseEnded = 0; 2296bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phase = 0; 2297bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller subPhase = 0; 2298bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller for (unsigned int pos = 0; pos < sm4.insns.size(); ++pos) { 2299bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller handleInstruction(pos); 2300bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (likely(phase == 0) || (phaseEnded < 2)) 2301bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller continue; 2302bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phaseEnded = 0; 2303bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (!unrollPhase || !phaseInstanceUsed) { 2304bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ++subPhase; 2305bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller continue; 2306bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2307bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller phaseInstanceUsed = false; 2308bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (phaseInstance < (phaseInstCnt[phase - 1][subPhase] - 1)) 2309bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller pos = phaseStart - 1; 2310bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller else 2311bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ++subPhase; 2312bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 2313bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller finalizeShader(); 2314bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2315bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return true; 2316bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 2317bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2318bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} // anonymous namespace 2319bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2320bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillernamespace nv50_ir { 2321bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2322bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerbool 2323bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph BumillerProgram::makeFromSM4(struct nv50_ir_prog_info *info) 2324bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller{ 2325bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller Converter bld(this, info); 2326bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return bld.run(); 2327bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} 2328bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 2329bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} // namespace nv50_ir 2330