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