Updated command-line options, adding -o for saving binaries, -G for OpenGL SPIR-V validation, -v etc.
Old uses should still work as they did before. Also encapsulated use of these flags during parsing, for the parse context. Added SPIR-V version to -v.
This commit is contained in:
parent
b329715caf
commit
68d78fd31e
11 changed files with 159 additions and 97 deletions
|
|
@ -50,10 +50,10 @@ namespace glslang {
|
|||
TParseContext::TParseContext(TSymbolTable& symt, TIntermediate& interm, bool pb, int v, EProfile p, EShLanguage L, TInfoSink& is,
|
||||
bool fc, EShMessages m) :
|
||||
intermediate(interm), symbolTable(symt), infoSink(is), language(L),
|
||||
version(v), profile(p), forwardCompatible(fc), messages(m),
|
||||
version(v), profile(p), forwardCompatible(fc),
|
||||
contextPragma(true, false), loopNestingLevel(0), structNestingLevel(0), controlFlowNestingLevel(0), statementNestingLevel(0),
|
||||
postMainReturn(false),
|
||||
tokensBeforeEOF(false), limits(resources.limits), currentScanner(0),
|
||||
tokensBeforeEOF(false), limits(resources.limits), messages(m), currentScanner(0),
|
||||
numErrors(0), parsingBuiltins(pb), afterEOF(false),
|
||||
atomicUintOffsets(0), anyIndexLimits(false)
|
||||
{
|
||||
|
|
@ -364,7 +364,7 @@ void C_DECL TParseContext::error(TSourceLoc loc, const char* szReason, const cha
|
|||
void C_DECL TParseContext::warn(TSourceLoc loc, const char* szReason, const char* szToken,
|
||||
const char* szExtraInfoFormat, ...)
|
||||
{
|
||||
if (messages & EShMsgSuppressWarnings)
|
||||
if (suppressWarnings())
|
||||
return;
|
||||
|
||||
const int maxSize = GlslangMaxTokenLength + 200;
|
||||
|
|
@ -1852,7 +1852,7 @@ bool TParseContext::lineContinuationCheck(TSourceLoc loc, bool endOfComment)
|
|||
return lineContinuationAllowed;
|
||||
}
|
||||
|
||||
if (messages & EShMsgRelaxedErrors) {
|
||||
if (relaxedErrors()) {
|
||||
if (! lineContinuationAllowed)
|
||||
warn(loc, "not allowed in this version", message, "");
|
||||
return true;
|
||||
|
|
@ -2347,7 +2347,7 @@ void TParseContext::precisionQualifierCheck(TSourceLoc loc, TBasicType baseType,
|
|||
|
||||
if (baseType == EbtFloat || baseType == EbtUint || baseType == EbtInt || baseType == EbtSampler || baseType == EbtAtomicUint) {
|
||||
if (qualifier.precision == EpqNone) {
|
||||
if (messages & EShMsgRelaxedErrors)
|
||||
if (relaxedErrors())
|
||||
warn(loc, "type requires declaration of default precision qualifier", TType::getBasicString(baseType), "substituting 'mediump'");
|
||||
else
|
||||
error(loc, "type requires declaration of default precision qualifier", TType::getBasicString(baseType), "");
|
||||
|
|
@ -4265,7 +4265,7 @@ TIntermNode* TParseContext::executeInitializer(TSourceLoc loc, TIntermTyped* ini
|
|||
// qualifier any initializer must be a constant expression."
|
||||
if (symbolTable.atGlobalLevel() && initializer->getType().getQualifier().storage != EvqConst) {
|
||||
const char* initFeature = "non-constant global initializer";
|
||||
if (messages & EShMsgRelaxedErrors)
|
||||
if (relaxedErrors())
|
||||
warn(loc, "not allowed in this version", initFeature, "");
|
||||
else
|
||||
requireProfile(loc, ~EEsProfile, initFeature);
|
||||
|
|
@ -5211,7 +5211,7 @@ TIntermNode* TParseContext::addSwitch(TSourceLoc loc, TIntermTyped* expression,
|
|||
// "it is an error to have no statement between a label and the end of the switch statement."
|
||||
// The specifications were updated to remove this (being ill-defined what a "statement" was),
|
||||
// so, this became a warning. However, 3.0 tests still check for the error.
|
||||
if (profile == EEsProfile && version <= 300 && (messages & EShMsgRelaxedErrors) == 0)
|
||||
if (profile == EEsProfile && version <= 300 && ! relaxedErrors())
|
||||
error(loc, "last case/default label not followed by statements", "switch", "");
|
||||
else
|
||||
warn(loc, "last case/default label not followed by statements", "switch", "");
|
||||
|
|
|
|||
|
|
@ -78,6 +78,12 @@ public:
|
|||
const char* szExtraInfoFormat, ...);
|
||||
void C_DECL warn(TSourceLoc, const char* szReason, const char* szToken,
|
||||
const char* szExtraInfoFormat, ...);
|
||||
|
||||
bool relaxedErrors() const { return (messages & EShMsgRelaxedErrors) != 0; }
|
||||
bool suppressWarnings() const { return (messages & EShMsgSuppressWarnings) != 0; }
|
||||
bool vulkanRules() const { return (messages & EShMsgVulkanRules) != 0; }
|
||||
bool spirvRules() const { return (messages & EShMsgSpvRules) != 0; }
|
||||
|
||||
void reservedErrorCheck(TSourceLoc, const TString&);
|
||||
void reservedPpErrorCheck(TSourceLoc, const char* name, const char* op);
|
||||
bool lineContinuationCheck(TSourceLoc, bool endOfComment);
|
||||
|
|
@ -258,7 +264,6 @@ public:
|
|||
int version; // version, updated by #version in the shader
|
||||
EProfile profile; // the declared profile in the shader (core by default)
|
||||
bool forwardCompatible; // true if errors are to be given for use of deprecated features
|
||||
EShMessages messages; // errors/warnings
|
||||
|
||||
// Current state of parsing
|
||||
struct TPragma contextPragma;
|
||||
|
|
@ -284,6 +289,7 @@ protected:
|
|||
TParseContext(TParseContext&);
|
||||
TParseContext& operator=(TParseContext&);
|
||||
|
||||
EShMessages messages; // errors/warnings/rule-sets
|
||||
TScanContext* scanContext;
|
||||
TPpContext* ppContext;
|
||||
TInputScanner* currentScanner;
|
||||
|
|
|
|||
|
|
@ -897,7 +897,7 @@ int TScanContext::tokenizeIdentifier()
|
|||
if (parseContext.profile == EEsProfile)
|
||||
reservedWord();
|
||||
else if (parseContext.version < 140 && ! parseContext.symbolTable.atBuiltInLevel() && ! parseContext.extensionsTurnedOn(1, &E_GL_ARB_texture_rectangle)) {
|
||||
if (parseContext.messages & EShMsgRelaxedErrors)
|
||||
if (parseContext.relaxedErrors())
|
||||
parseContext.requireExtensions(loc, 1, &E_GL_ARB_texture_rectangle, "texture-rectangle sampler keyword");
|
||||
else
|
||||
reservedWord();
|
||||
|
|
|
|||
|
|
@ -505,7 +505,7 @@ bool ProcessDeferred(
|
|||
bool versionNotFirst = userInput.scanVersion(version, profile, versionNotFirstToken);
|
||||
bool versionNotFound = version == 0;
|
||||
if (forceDefaultVersionAndProfile) {
|
||||
if (!(messages & EShMsgSuppressWarnings) && !versionNotFound &&
|
||||
if (! (messages & EShMsgSuppressWarnings) && ! versionNotFound &&
|
||||
(version != defaultVersion || profile != defaultProfile)) {
|
||||
compiler->infoSink.info << "Warning, (version, profile) forced to be ("
|
||||
<< defaultVersion << ", " << ProfileName(defaultProfile)
|
||||
|
|
|
|||
|
|
@ -377,7 +377,7 @@ void TParseContext::checkDeprecated(TSourceLoc loc, int profileMask, int depVers
|
|||
if (version >= depVersion) {
|
||||
if (forwardCompatible)
|
||||
error(loc, "deprecated, may be removed in future release", featureDesc, "");
|
||||
else if (! (messages & EShMsgSuppressWarnings))
|
||||
else if (! suppressWarnings())
|
||||
infoSink.info.message(EPrefixWarning, (TString(featureDesc) + " deprecated in version " +
|
||||
String(depVersion) + "; may be removed in future release").c_str(), loc);
|
||||
}
|
||||
|
|
@ -417,7 +417,7 @@ void TParseContext::requireExtensions(TSourceLoc loc, int numExtensions, const c
|
|||
bool warned = false;
|
||||
for (int i = 0; i < numExtensions; ++i) {
|
||||
TExtensionBehavior behavior = getExtensionBehavior(extensions[i]);
|
||||
if (behavior == EBhDisable && (messages & EShMsgRelaxedErrors)) {
|
||||
if (behavior == EBhDisable && relaxedErrors()) {
|
||||
infoSink.info.message(EPrefixWarning, "The following extension must be enabled to use this feature:", loc);
|
||||
behavior = EBhWarn;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -357,7 +357,7 @@ int TPpContext::extraTokenCheck(int atom, TPpToken* ppToken, int token)
|
|||
else
|
||||
label = "";
|
||||
|
||||
if (parseContext.messages & EShMsgRelaxedErrors)
|
||||
if (parseContext.relaxedErrors())
|
||||
parseContext.warn(ppToken->loc, message, label, "");
|
||||
else
|
||||
parseContext.error(ppToken->loc, message, label, "");
|
||||
|
|
@ -553,7 +553,7 @@ int TPpContext::evalToToken(int token, bool shortCircuit, int& res, bool& err, T
|
|||
if (! shortCircuit && parseContext.profile == EEsProfile) {
|
||||
const char* message = "undefined macro in expression not allowed in es profile";
|
||||
const char* name = GetAtomString(ppToken->atom);
|
||||
if (parseContext.messages & EShMsgRelaxedErrors)
|
||||
if (parseContext.relaxedErrors())
|
||||
parseContext.warn(ppToken->loc, message, "preprocessor evaluation", name);
|
||||
else
|
||||
parseContext.error(ppToken->loc, message, "preprocessor evaluation", name);
|
||||
|
|
|
|||
|
|
@ -204,7 +204,7 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken)
|
|||
}
|
||||
} else if (ch == 'f' || ch == 'F') {
|
||||
parseContext.profileRequires(ppToken->loc, EEsProfile, 300, nullptr, "floating-point suffix");
|
||||
if ((parseContext.messages & EShMsgRelaxedErrors) == 0)
|
||||
if (! parseContext.relaxedErrors())
|
||||
parseContext.profileRequires(ppToken->loc, ~EEsProfile, 120, nullptr, "floating-point suffix");
|
||||
if (! HasDecimalOrExponent)
|
||||
parseContext.error(ppToken->loc, "float literal needs a decimal point or exponent", "", "");
|
||||
|
|
|
|||
|
|
@ -129,6 +129,8 @@ enum EShMessages {
|
|||
EShMsgRelaxedErrors = (1 << 0), // be liberal in accepting input
|
||||
EShMsgSuppressWarnings = (1 << 1), // suppress all warnings, except those required by the specification
|
||||
EShMsgAST = (1 << 2), // print the AST intermediate representation
|
||||
EShMsgSpvRules = (1 << 3), // issue messages for SPIR-V generation
|
||||
EShMsgVulkanRules = (1 << 4), // issue messages for Vulkan-requirements of GLSL for SPIR-V
|
||||
};
|
||||
|
||||
//
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue