From 7c257eb10857e32fec7e0a65882c2666aa49189a Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Sat, 10 May 2014 19:52:01 +0000 Subject: [PATCH] Code simplification: Add (and use) helper functions for building constant scalar AST nodes for bool, int, uint, float, and double, shortening all the code segments that were doing that. git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@26600 e7fa87d3-cd2b-0410-9028-fcbf551c1848 --- glslang/MachineIndependent/Intermediate.cpp | 38 +++++++++++- glslang/MachineIndependent/ParseHelper.cpp | 35 ++++------- glslang/MachineIndependent/glslang.y | 58 +++++-------------- .../MachineIndependent/localintermediate.h | 4 ++ 4 files changed, 65 insertions(+), 70 deletions(-) diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp index 8cdde85b..6143334e 100644 --- a/glslang/MachineIndependent/Intermediate.cpp +++ b/glslang/MachineIndependent/Intermediate.cpp @@ -802,6 +802,40 @@ TIntermConstantUnion* TIntermediate::addConstantUnion(const TConstUnionArray& un return node; } +TIntermConstantUnion* TIntermediate::addConstantUnion(int i, TSourceLoc loc, bool literal) const +{ + TConstUnionArray unionArray(1); + unionArray[0].setIConst(i); + + return addConstantUnion(unionArray, TType(EbtInt, EvqConst), loc, literal); +} + +TIntermConstantUnion* TIntermediate::addConstantUnion(unsigned int u, TSourceLoc loc, bool literal) const +{ + TConstUnionArray unionArray(1); + unionArray[0].setUConst(u); + + return addConstantUnion(unionArray, TType(EbtUint, EvqConst), loc, literal); +} + +TIntermConstantUnion* TIntermediate::addConstantUnion(bool b, TSourceLoc loc, bool literal) const +{ + TConstUnionArray unionArray(1); + unionArray[0].setBConst(b); + + return addConstantUnion(unionArray, TType(EbtBool, EvqConst), loc, literal); +} + +TIntermConstantUnion* TIntermediate::addConstantUnion(double d, TBasicType baseType, TSourceLoc loc, bool literal) const +{ + assert(baseType == EbtFloat || baseType == EbtDouble); + + TConstUnionArray unionArray(1); + unionArray[0].setDConst(d); + + return addConstantUnion(unionArray, TType(baseType, EvqConst), loc, literal); +} + TIntermTyped* TIntermediate::addSwizzle(TVectorFields& fields, TSourceLoc loc) { @@ -812,9 +846,7 @@ TIntermTyped* TIntermediate::addSwizzle(TVectorFields& fields, TSourceLoc loc) TIntermSequence &sequenceVector = node->getSequence(); for (int i = 0; i < fields.num; i++) { - TConstUnionArray unionArray(1); - unionArray[0].setIConst(fields.offsets[i]); - constIntNode = addConstantUnion(unionArray, TType(EbtInt, EvqConst), loc); + constIntNode = addConstantUnion(fields.offsets[i], loc); sequenceVector.push_back(constIntNode); } diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index ab9938bf..0f5f81b5 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -393,9 +393,7 @@ TIntermTyped* TParseContext::handleVariable(TSourceLoc loc, TSymbol* symbol, TSt // Create a subtree for its dereference. variable = anon->getAnonContainer().getAsVariable(); TIntermTyped* container = intermediate.addSymbol(*variable, loc); - TConstUnionArray unionArray(1); - unionArray[0].setUConst(anon->getMemberNumber()); - TIntermTyped* constNode = intermediate.addConstantUnion(unionArray, TType(EbtUint, EvqConst), loc); + TIntermTyped* constNode = intermediate.addConstantUnion(anon->getMemberNumber(), loc); node = intermediate.addIndex(EOpIndexDirectStruct, container, constNode, loc); node->setType(*(*variable->getType().getStruct())[anon->getMemberNumber()].type); @@ -480,9 +478,7 @@ TIntermTyped* TParseContext::handleBracketDereference(TSourceLoc loc, TIntermTyp if (result == 0) { // Insert dummy error-recovery result - TConstUnionArray unionArray(1); - unionArray[0].setDConst(0.0); - result = intermediate.addConstantUnion(unionArray, TType(EbtFloat, EvqConst), loc); + result = intermediate.addConstantUnion(0.0, EbtFloat, loc); } else { // Insert valid dereferenced result TType newType(base->getType(), 0); // dereferenced type @@ -687,7 +683,7 @@ TIntermTyped* TParseContext::handleDotDereference(TSourceLoc loc, TIntermTyped* profileRequires(loc, EEsProfile, 300, 0, ".length"); result = intermediate.addMethod(base, TType(EbtInt), &field, loc); } else - error(loc, "only the length method is supported for array", field.c_str(), ""); + error(loc, "only the length method is supported for array", field.c_str(), ""); } else if (base->isVector() || base->isScalar()) { if (base->isScalar()) { const char* dotFeature = "scalar swizzle"; @@ -714,9 +710,7 @@ TIntermTyped* TParseContext::handleDotDereference(TSourceLoc loc, TIntermTyped* result = intermediate.foldSwizzle(base, fields, loc); else { if (fields.num == 1) { - TConstUnionArray unionArray(1); - unionArray[0].setIConst(fields.offsets[0]); - TIntermTyped* index = intermediate.addConstantUnion(unionArray, TType(EbtInt, EvqConst), loc); + TIntermTyped* index = intermediate.addConstantUnion(fields.offsets[0], loc); result = intermediate.addIndex(EOpIndexDirect, base, index, loc); result->setType(TType(base->getBasicType(), EvqTemporary, base->getType().getQualifier().precision)); } else { @@ -731,8 +725,8 @@ TIntermTyped* TParseContext::handleDotDereference(TSourceLoc loc, TIntermTyped* else if (base->getBasicType() == EbtStruct || base->getBasicType() == EbtBlock) { const TTypeList* fields = base->getType().getStruct(); bool fieldFound = false; - unsigned int member; - for (member = 0; member < fields->size(); ++member) { + int member; + for (member = 0; member < (int)fields->size(); ++member) { if ((*fields)[member].type->getFieldName() == field) { fieldFound = true; break; @@ -742,9 +736,7 @@ TIntermTyped* TParseContext::handleDotDereference(TSourceLoc loc, TIntermTyped* if (base->getType().getQualifier().storage == EvqConst) result = intermediate.foldDereference(base, member, loc); else { - TConstUnionArray unionArray(1); - unionArray[0].setIConst(member); - TIntermTyped* index = intermediate.addConstantUnion(unionArray, TType(EbtInt, EvqConst), loc); + TIntermTyped* index = intermediate.addConstantUnion(member, loc); result = intermediate.addIndex(EOpIndexDirectStruct, base, index, loc); result->setType(*(*fields)[member].type); } @@ -1015,11 +1007,8 @@ TIntermTyped* TParseContext::handleFunctionCall(TSourceLoc loc, TFunction* funct // generic error recovery // TODO: simplification: localize all the error recoveries that look like this, and taking type into account to reduce cascades - if (result == 0) { - TConstUnionArray unionArray(1); - unionArray[0].setDConst(0.0); - result = intermediate.addConstantUnion(unionArray, TType(EbtFloat, EvqConst), loc); - } + if (result == 0) + result = intermediate.addConstantUnion(0.0, EbtFloat, loc); return result; } @@ -1055,10 +1044,8 @@ TIntermTyped* TParseContext::handleLengthMethod(TSourceLoc loc, TFunction* funct if (length == 0) length = 1; - TConstUnionArray unionArray(1); - unionArray[0].setIConst(length); - return intermediate.addConstantUnion(unionArray, TType(EbtInt, EvqConst), loc); + return intermediate.addConstantUnion(length, loc); } // @@ -1658,7 +1645,7 @@ bool TParseContext::lineContinuationCheck(TSourceLoc loc, bool endOfComment) } if (messages & EShMsgRelaxedErrors) { - warn(loc, "not allowed in this version", message, ""); + warn(loc, "not allowed in this version", message, ""); return true; } else { requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, message); diff --git a/glslang/MachineIndependent/glslang.y b/glslang/MachineIndependent/glslang.y index 0105070a..6292bb91 100644 --- a/glslang/MachineIndependent/glslang.y +++ b/glslang/MachineIndependent/glslang.y @@ -226,31 +226,21 @@ primary_expression $$ = $1; } | INTCONSTANT { - TConstUnionArray unionArray(1); - unionArray[0].setIConst($1.i); - $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtInt, EvqConst), $1.loc, true); + $$ = parseContext.intermediate.addConstantUnion($1.i, $1.loc, true); } | UINTCONSTANT { parseContext.fullIntegerCheck($1.loc, "unsigned literal"); - TConstUnionArray unionArray(1); - unionArray[0].setUConst($1.u); - $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtUint, EvqConst), $1.loc, true); + $$ = parseContext.intermediate.addConstantUnion($1.u, $1.loc, true); } | FLOATCONSTANT { - TConstUnionArray unionArray(1); - unionArray[0].setDConst($1.d); - $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtFloat, EvqConst), $1.loc, true); + $$ = parseContext.intermediate.addConstantUnion($1.d, EbtFloat, $1.loc, true); } | DOUBLECONSTANT { parseContext.doubleCheck($1.loc, "double literal"); - TConstUnionArray unionArray(1); - unionArray[0].setDConst($1.d); - $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtDouble, EvqConst), $1.loc, true); + $$ = parseContext.intermediate.addConstantUnion($1.d, EbtDouble, $1.loc, true); } | BOOLCONSTANT { - TConstUnionArray unionArray(1); - unionArray[0].setBConst($1.b); - $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtBool, EvqConst), $1.loc, true); + $$ = parseContext.intermediate.addConstantUnion($1.b, $1.loc, true); } | LEFT_PAREN expression RIGHT_PAREN { $$ = $2; @@ -365,7 +355,7 @@ function_identifier } | postfix_expression { // - // Should be a method or subroutine call, but we don't have arguments yet. + // Should be a method or subroutine call, but we haven't recognized the arguments yet. // $$.function = 0; $$.intermNode = 0; @@ -520,36 +510,28 @@ relational_expression $$ = parseContext.intermediate.addBinaryMath(EOpLessThan, $1, $3, $2.loc); if ($$ == 0) { parseContext.binaryOpError($2.loc, "<", $1->getCompleteString(), $3->getCompleteString()); - TConstUnionArray unionArray(1); - unionArray[0].setBConst(false); - $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtBool, EvqConst), $2.loc); + $$ = parseContext.intermediate.addConstantUnion(false, $2.loc); } } | relational_expression RIGHT_ANGLE shift_expression { $$ = parseContext.intermediate.addBinaryMath(EOpGreaterThan, $1, $3, $2.loc); if ($$ == 0) { parseContext.binaryOpError($2.loc, ">", $1->getCompleteString(), $3->getCompleteString()); - TConstUnionArray unionArray(1); - unionArray[0].setBConst(false); - $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtBool, EvqConst), $2.loc); + $$ = parseContext.intermediate.addConstantUnion(false, $2.loc); } } | relational_expression LE_OP shift_expression { $$ = parseContext.intermediate.addBinaryMath(EOpLessThanEqual, $1, $3, $2.loc); if ($$ == 0) { parseContext.binaryOpError($2.loc, "<=", $1->getCompleteString(), $3->getCompleteString()); - TConstUnionArray unionArray(1); - unionArray[0].setBConst(false); - $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtBool, EvqConst), $2.loc); + $$ = parseContext.intermediate.addConstantUnion(false, $2.loc); } } | relational_expression GE_OP shift_expression { $$ = parseContext.intermediate.addBinaryMath(EOpGreaterThanEqual, $1, $3, $2.loc); if ($$ == 0) { parseContext.binaryOpError($2.loc, ">=", $1->getCompleteString(), $3->getCompleteString()); - TConstUnionArray unionArray(1); - unionArray[0].setBConst(false); - $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtBool, EvqConst), $2.loc); + $$ = parseContext.intermediate.addConstantUnion(false, $2.loc); } } ; @@ -562,9 +544,7 @@ equality_expression $$ = parseContext.intermediate.addBinaryMath(EOpEqual, $1, $3, $2.loc); if ($$ == 0) { parseContext.binaryOpError($2.loc, "==", $1->getCompleteString(), $3->getCompleteString()); - TConstUnionArray unionArray(1); - unionArray[0].setBConst(false); - $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtBool, EvqConst), $2.loc); + $$ = parseContext.intermediate.addConstantUnion(false, $2.loc); } } | equality_expression NE_OP relational_expression { @@ -573,9 +553,7 @@ equality_expression $$ = parseContext.intermediate.addBinaryMath(EOpNotEqual, $1, $3, $2.loc); if ($$ == 0) { parseContext.binaryOpError($2.loc, "!=", $1->getCompleteString(), $3->getCompleteString()); - TConstUnionArray unionArray(1); - unionArray[0].setBConst(false); - $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtBool, EvqConst), $2.loc); + $$ = parseContext.intermediate.addConstantUnion(false, $2.loc); } } ; @@ -622,9 +600,7 @@ logical_and_expression $$ = parseContext.intermediate.addBinaryMath(EOpLogicalAnd, $1, $3, $2.loc); if ($$ == 0) { parseContext.binaryOpError($2.loc, "&&", $1->getCompleteString(), $3->getCompleteString()); - TConstUnionArray unionArray(1); - unionArray[0].setBConst(false); - $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtBool, EvqConst), $2.loc); + $$ = parseContext.intermediate.addConstantUnion(false, $2.loc); } } ; @@ -635,9 +611,7 @@ logical_xor_expression $$ = parseContext.intermediate.addBinaryMath(EOpLogicalXor, $1, $3, $2.loc); if ($$ == 0) { parseContext.binaryOpError($2.loc, "^^", $1->getCompleteString(), $3->getCompleteString()); - TConstUnionArray unionArray(1); - unionArray[0].setBConst(false); - $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtBool, EvqConst), $2.loc); + $$ = parseContext.intermediate.addConstantUnion(false, $2.loc); } } ; @@ -648,9 +622,7 @@ logical_or_expression $$ = parseContext.intermediate.addBinaryMath(EOpLogicalOr, $1, $3, $2.loc); if ($$ == 0) { parseContext.binaryOpError($2.loc, "||", $1->getCompleteString(), $3->getCompleteString()); - TConstUnionArray unionArray(1); - unionArray[0].setBConst(false); - $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtBool, EvqConst), $2.loc); + $$ = parseContext.intermediate.addConstantUnion(false, $2.loc); } } ; diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h index 9f26a116..1e7e5d6c 100644 --- a/glslang/MachineIndependent/localintermediate.h +++ b/glslang/MachineIndependent/localintermediate.h @@ -157,6 +157,10 @@ public: TIntermTyped* addComma(TIntermTyped* left, TIntermTyped* right, TSourceLoc); TIntermTyped* addMethod(TIntermTyped*, const TType&, const TString*, TSourceLoc); TIntermConstantUnion* addConstantUnion(const TConstUnionArray&, const TType&, TSourceLoc, bool literal = false) const; + TIntermConstantUnion* addConstantUnion(int, TSourceLoc, bool literal = false) const; + TIntermConstantUnion* addConstantUnion(unsigned int, TSourceLoc, bool literal = false) const; + TIntermConstantUnion* addConstantUnion(bool, TSourceLoc, bool literal = false) const; + TIntermConstantUnion* addConstantUnion(double, TBasicType, TSourceLoc, bool literal = false) const; TIntermTyped* promoteConstantUnion(TBasicType, TIntermConstantUnion*) const; bool parseConstTree(TIntermNode*, TConstUnionArray, TOperator, const TType&, bool singleConstantParam = false); TIntermLoop* addLoop(TIntermNode*, TIntermTyped*, TIntermTyped*, bool testFirst, TSourceLoc);