TString TType::getCompleteString() const { char buf[1024]; char *p = &buf[0]; if (varyingModifier != EvmNone) { const char *vm = getVaryingModifierString(); p += sprintf(p, "%s ", vm); delete[] vm; } if (qualifier != EvqTemporary && qualifier != EvqGlobal) { if (qualifier == EvqConstNoValue) { p += sprintf(p, "%s ", "constNoValue"); } else { p += sprintf(p, "%s ", getQualifierString()); } } if (array) { p += sprintf(p, "array<%i> of ", getNumArrays()); } if (matrix) p += sprintf(p, "%dX%d matrix of ", matrixSize[0], matrixSize[1]); else if (size > 1) p += sprintf(p, "%d-component vector of ", size); sprintf(p, "%s", getBasicString()); return TString(buf); }
bool TParseContext::samplerErrorCheck(int line, const TPublicType& pType, const char* reason) { if (pType.type == EbtStruct) { if (containsSampler(*pType.userDef)) { error(line, reason, getBasicString(pType.type), "(structure contains a sampler)"); return true; } return false; } else if (IsSampler(pType.type)) { error(line, reason, getBasicString(pType.type), ""); return true; } return false; }
int ValidateLimitations::validateForLoopInit(TIntermLoop *node) { TIntermNode *init = node->getInit(); if (init == NULL) { error(node->getLine(), "Missing init declaration", "for"); return -1; } // // init-declaration has the form: // type-specifier identifier = constant-expression // TIntermAggregate *decl = init->getAsAggregate(); if ((decl == NULL) || (decl->getOp() != EOpDeclaration)) { error(init->getLine(), "Invalid init declaration", "for"); return -1; } // To keep things simple do not allow declaration list. TIntermSequence &declSeq = decl->getSequence(); if (declSeq.size() != 1) { error(decl->getLine(), "Invalid init declaration", "for"); return -1; } TIntermBinary *declInit = declSeq[0]->getAsBinaryNode(); if ((declInit == NULL) || (declInit->getOp() != EOpInitialize)) { error(decl->getLine(), "Invalid init declaration", "for"); return -1; } TIntermSymbol *symbol = declInit->getLeft()->getAsSymbolNode(); if (symbol == NULL) { error(declInit->getLine(), "Invalid init declaration", "for"); return -1; } // The loop index has type int or float. TBasicType type = symbol->getBasicType(); if ((type != EbtInt) && (type != EbtFloat)) { error(symbol->getLine(), "Invalid type for loop index", getBasicString(type)); return -1; } // The loop index is initialized with constant expression. if (!isConstExpr(declInit->getRight())) { error(declInit->getLine(), "Loop index cannot be initialized with non-constant expression", symbol->getSymbol().c_str()); return -1; } return symbol->getId(); }
TString TType::getCompleteString() const { TStringStream stream; if (qualifier != EvqTemporary && qualifier != EvqGlobal) stream << getQualifierString() << " " << getPrecisionString() << " "; if (array) stream << "array[" << getArraySize() << "] of "; if (matrix) stream << static_cast<int>(size) << "X" << static_cast<int>(size) << " matrix of "; else if (size > 1) stream << static_cast<int>(size) << "-component vector of "; stream << getBasicString(); return stream.str(); }
TString TType::getCompleteString() const { TStringStream stream; if (qualifier != EvqTemporary && qualifier != EvqGlobal) stream << getQualifierString() << " "; if (precision != EbpUndefined) stream << getPrecisionString() << " "; if (array) stream << "array[" << getArraySize() << "] of "; if (isMatrix()) stream << getCols() << "X" << getRows() << " matrix of "; else if (isVector()) stream << getNominalSize() << "-component vector of "; stream << getBasicString(); return stream.str(); }
TString TType::getCompleteString() const { char buf[100]; char *p = &buf[0]; if (qualifier != EvqTemporary && qualifier != EvqGlobal) p += sprintf(p, "%s ", getQualifierString()); sprintf(p, "%s", getBasicString()); if (array) p += sprintf(p, " array"); if (matrix) p += sprintf(p, "matrix%dX%d", size, size); else if (size > 1) p += sprintf(p, "vec%d", size); return TString(buf); }
const char *TType::getBuiltInTypeNameString() const { if (isMatrix()) { switch (getCols()) { case 2: switch (getRows()) { case 2: return "mat2"; case 3: return "mat2x3"; case 4: return "mat2x4"; default: UNREACHABLE(); return nullptr; } case 3: switch (getRows()) { case 2: return "mat3x2"; case 3: return "mat3"; case 4: return "mat3x4"; default: UNREACHABLE(); return nullptr; } case 4: switch (getRows()) { case 2: return "mat4x2"; case 3: return "mat4x3"; case 4: return "mat4"; default: UNREACHABLE(); return nullptr; } default: UNREACHABLE(); return nullptr; } } if (isVector()) { switch (getBasicType()) { case EbtFloat: switch (getNominalSize()) { case 2: return "vec2"; case 3: return "vec3"; case 4: return "vec4"; default: UNREACHABLE(); return nullptr; } case EbtInt: switch (getNominalSize()) { case 2: return "ivec2"; case 3: return "ivec3"; case 4: return "ivec4"; default: UNREACHABLE(); return nullptr; } case EbtBool: switch (getNominalSize()) { case 2: return "bvec2"; case 3: return "bvec3"; case 4: return "bvec4"; default: UNREACHABLE(); return nullptr; } case EbtUInt: switch (getNominalSize()) { case 2: return "uvec2"; case 3: return "uvec3"; case 4: return "uvec4"; default: UNREACHABLE(); return nullptr; } default: UNREACHABLE(); return nullptr; } } ASSERT(getBasicType() != EbtStruct); ASSERT(getBasicType() != EbtInterfaceBlock); return getBasicString(); }