Add compilation mode flags for forward-compatible contexts and relaxed error checking. These initiate as arguments to ShCompile() and both default to being off.
git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@20817 e7fa87d3-cd2b-0410-9028-fcbf551c1848
This commit is contained in:
parent
9500dff05e
commit
4055816bc9
@ -259,7 +259,7 @@ bool CompileFile(const char *fileName, ShHandle compiler, int debugOptions, cons
|
||||
for (int i = 0; i < 1000; ++i) {
|
||||
for (int j = 0; j < 100; ++j)
|
||||
#endif
|
||||
ret = ShCompile(compiler, data, OutputMultipleStrings, EShOptNone, resources, debugOptions, 100);
|
||||
ret = ShCompile(compiler, data, OutputMultipleStrings, EShOptNone, resources, debugOptions, 100, false, false);
|
||||
#ifdef MEASURE_MEMORY
|
||||
|
||||
GetProcessMemoryInfo(GetCurrentProcess(), &counters, sizeof(counters));
|
||||
|
||||
@ -178,7 +178,6 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, TIntermTyped* constantNod
|
||||
switch (getType().getBasicType()) {
|
||||
case EbtFloat:
|
||||
if (rightUnionArray[i] == 0.0f) {
|
||||
infoSink.info.message(EPrefixWarning, "Divide by zero error during constant folding", getLine());
|
||||
newConstArray[i].setFConst(FLT_MAX);
|
||||
} else
|
||||
newConstArray[i].setFConst(unionArray[i].getFConst() / rightUnionArray[i].getFConst());
|
||||
@ -186,7 +185,6 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, TIntermTyped* constantNod
|
||||
|
||||
case EbtInt:
|
||||
if (rightUnionArray[i] == 0) {
|
||||
infoSink.info.message(EPrefixWarning, "Divide by zero error during constant folding", getLine());
|
||||
newConstArray[i].setIConst(0xEFFFFFFF);
|
||||
} else
|
||||
newConstArray[i].setIConst(unionArray[i].getIConst() / rightUnionArray[i].getIConst());
|
||||
|
||||
@ -39,11 +39,12 @@
|
||||
#include "osinclude.h"
|
||||
#include <stdarg.h>
|
||||
|
||||
TParseContext::TParseContext(TSymbolTable& symt, TIntermediate& interm, int v, EProfile p, EShLanguage L, TInfoSink& is) :
|
||||
TParseContext::TParseContext(TSymbolTable& symt, TIntermediate& interm, int v, EProfile p, EShLanguage L, TInfoSink& is,
|
||||
bool fc, bool rc) :
|
||||
intermediate(interm), symbolTable(symt), infoSink(is), language(L), treeRoot(0),
|
||||
recoveredFromError(false), numErrors(0), lexAfterType(false), loopNestingLevel(0),
|
||||
switchNestingLevel(0), inTypeParen(false),
|
||||
version(v), profile(p), futureCompatibility(false),
|
||||
version(v), profile(p), forwardCompatible(fc), relaxedChecking(rc),
|
||||
contextPragma(true, false)
|
||||
{
|
||||
for (int type = 0; type < EbtNumTypes; ++type)
|
||||
@ -438,6 +439,7 @@ bool TParseContext::reservedErrorCheck(int line, const TString& identifier)
|
||||
if (identifier.find("__") != TString::npos) {
|
||||
//error(line, "Two consecutive underscores are reserved for future use.", identifier.c_str(), "", "");
|
||||
//return true;
|
||||
// TODO: make this an error
|
||||
infoSink.info.message(EPrefixWarning, "Two consecutive underscores are reserved for future use.", line);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -67,7 +67,8 @@ struct TPragma {
|
||||
// they can be passed to the parser without needing a global.
|
||||
//
|
||||
struct TParseContext {
|
||||
TParseContext(TSymbolTable&, TIntermediate&, int version, EProfile, EShLanguage, TInfoSink&);
|
||||
TParseContext(TSymbolTable&, TIntermediate&, int version, EProfile, EShLanguage, TInfoSink&,
|
||||
bool forwardCompatible = false, bool relaxedChecking = false);
|
||||
TIntermediate& intermediate; // to hold and build a parse tree
|
||||
TSymbolTable& symbolTable; // symbol table that goes with the current language, version, and profile
|
||||
TInfoSink& infoSink;
|
||||
@ -82,8 +83,10 @@ struct TParseContext {
|
||||
const TType* currentFunctionType; // the return type of the function that's currently being parsed
|
||||
bool functionReturnsValue; // true if a non-void function has a return
|
||||
|
||||
int version; // the declared version in the shader (110 by default)
|
||||
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
|
||||
bool relaxedChecking; // suppress warnings and reduce error checking
|
||||
bool futureCompatibility; // true if requesting errors for future compatibility (false by default)
|
||||
TMap<TString, TBehavior> extensionBehavior; // for each extension string, what it's current enablement is
|
||||
|
||||
|
||||
@ -482,7 +482,9 @@ int ShCompile(
|
||||
const EShOptimizationLevel optLevel,
|
||||
const TBuiltInResource* resources,
|
||||
int debugOptions,
|
||||
int defaultVersion
|
||||
int defaultVersion, // use 100 for ES environment, 110 for desktop
|
||||
bool forwardCompatible, // give errors for use of deprecated features
|
||||
bool relaxedChecking // no warnings, reduced errors
|
||||
)
|
||||
{
|
||||
if (!InitThread())
|
||||
@ -520,7 +522,7 @@ int ShCompile(
|
||||
// they get popped again further down.
|
||||
AddContextSpecificSymbols(resources, compiler->infoSink, &symbolTable, version, profile, compiler->getLanguage());
|
||||
|
||||
TParseContext parseContext(symbolTable, intermediate, version, profile, compiler->getLanguage(), compiler->infoSink);
|
||||
TParseContext parseContext(symbolTable, intermediate, version, profile, compiler->getLanguage(), compiler->infoSink, forwardCompatible, relaxedChecking);
|
||||
|
||||
if (! goodProfile)
|
||||
parseContext.error(1, "incorrect", "#version", "");
|
||||
|
||||
@ -132,10 +132,10 @@ void TParseContext::checkDeprecated(int line, EProfile callingProfile, int depVe
|
||||
{
|
||||
if (profile == callingProfile) {
|
||||
if (version >= depVersion) {
|
||||
if (futureCompatibility) {
|
||||
if (forwardCompatible) {
|
||||
error(line, "deprecated, may be removed in future release", featureDesc, "");
|
||||
recover();
|
||||
} else {
|
||||
} else if (! relaxedChecking) {
|
||||
infoSink.info.message(EPrefixWarning, (TString(featureDesc) + " deprecated in version " +
|
||||
String(depVersion) + "; may be removed in future release").c_str(), line);
|
||||
}
|
||||
|
||||
@ -572,8 +572,10 @@ int PaIdentOrReserved(bool reserved, TParseContext& pc, int line, const char* te
|
||||
|
||||
pyylval->lex.line = line;
|
||||
pyylval->lex.string = NewPoolTString(text);
|
||||
pc.infoSink.info.message(EPrefixWarning, pyylval->lex.string->c_str(), yylineno);
|
||||
pc.infoSink.info.message(EPrefixWarning, "using future reserved keyword", yylineno);
|
||||
if (pc.futureCompatibility) {
|
||||
pc.infoSink.info.message(EPrefixWarning, pyylval->lex.string->c_str(), yylineno);
|
||||
pc.infoSink.info.message(EPrefixWarning, "using future reserved keyword", yylineno);
|
||||
}
|
||||
|
||||
return PaIdentOrType(*pyylval->lex.string, pc, pyylval->lex.symbol);
|
||||
}
|
||||
@ -584,8 +586,10 @@ int PaES30ReservedFromGLSL(int version, TParseContext& pc, int line, const char*
|
||||
pc.profile != EEsProfile && pc.version < version) {
|
||||
pyylval->lex.line = yylineno;
|
||||
pyylval->lex.string = NewPoolTString(yytext);
|
||||
pc.infoSink.info.message(EPrefixWarning, pyylval->lex.string->c_str(), yylineno);
|
||||
pc.infoSink.info.message(EPrefixWarning, "future reserved word in ES 300 and keyword in GLSL", yylineno);
|
||||
if (pc.futureCompatibility) {
|
||||
pc.infoSink.info.message(EPrefixWarning, pyylval->lex.string->c_str(), yylineno);
|
||||
pc.infoSink.info.message(EPrefixWarning, "future reserved word in ES 300 and keyword in GLSL", yylineno);
|
||||
}
|
||||
|
||||
return PaIdentOrType(*pyylval->lex.string, pc, pyylval->lex.symbol);
|
||||
} else if (pc.profile == EEsProfile && pc.version >= 300)
|
||||
@ -605,8 +609,10 @@ int PaPrecisionKeyword(TParseContext& pc, int line, const char* text, YYSTYPE* p
|
||||
|
||||
pyylval->lex.line = line;
|
||||
pyylval->lex.string = NewPoolTString(text);
|
||||
pc.infoSink.info.message(EPrefixWarning, pyylval->lex.string->c_str(), yylineno);
|
||||
pc.infoSink.info.message(EPrefixWarning, "using ES precision qualifier keyword", yylineno);
|
||||
if (pc.futureCompatibility) {
|
||||
pc.infoSink.info.message(EPrefixWarning, pyylval->lex.string->c_str(), yylineno);
|
||||
pc.infoSink.info.message(EPrefixWarning, "using ES precision qualifier keyword", yylineno);
|
||||
}
|
||||
|
||||
return PaIdentOrType(*pyylval->lex.string, pc, pyylval->lex.symbol);
|
||||
}
|
||||
@ -618,8 +624,10 @@ int PaMatNxM(TParseContext& pc, int line, const char* text, YYSTYPE* pyylval, in
|
||||
|
||||
pyylval->lex.line = line;
|
||||
pyylval->lex.string = NewPoolTString(text);
|
||||
pc.infoSink.info.message(EPrefixWarning, pyylval->lex.string->c_str(), yylineno);
|
||||
pc.infoSink.info.message(EPrefixWarning, "using future non-square matrix type keyword", yylineno);
|
||||
if (pc.futureCompatibility) {
|
||||
pc.infoSink.info.message(EPrefixWarning, pyylval->lex.string->c_str(), yylineno);
|
||||
pc.infoSink.info.message(EPrefixWarning, "using future non-square matrix type keyword", yylineno);
|
||||
}
|
||||
|
||||
return PaIdentOrType(*pyylval->lex.string, pc, pyylval->lex.symbol);
|
||||
}
|
||||
@ -636,8 +644,10 @@ int PaDMat(TParseContext& pc, int line, const char* text, YYSTYPE* pyylval, int
|
||||
|
||||
pyylval->lex.line = line;
|
||||
pyylval->lex.string = NewPoolTString(text);
|
||||
pc.infoSink.info.message(EPrefixWarning, pyylval->lex.string->c_str(), yylineno);
|
||||
pc.infoSink.info.message(EPrefixWarning, "using future type keyword", yylineno);
|
||||
if (pc.futureCompatibility) {
|
||||
pc.infoSink.info.message(EPrefixWarning, pyylval->lex.string->c_str(), yylineno);
|
||||
pc.infoSink.info.message(EPrefixWarning, "using future type keyword", yylineno);
|
||||
}
|
||||
|
||||
return PaIdentOrType(*pyylval->lex.string, pc, pyylval->lex.symbol);
|
||||
}
|
||||
@ -685,7 +695,8 @@ void CPPWarningToInfoLog(const char *msg)
|
||||
{
|
||||
TParseContext& pc = *((TParseContext *)cpp->pC);
|
||||
|
||||
pc.infoSink.info.message(EPrefixWarning, msg, yylineno);
|
||||
if (! pc.relaxedChecking)
|
||||
pc.infoSink.info.message(EPrefixWarning, msg, yylineno);
|
||||
}
|
||||
|
||||
void CPPShInfoLogMsg(const char *msg)
|
||||
@ -910,6 +921,7 @@ void updateExtensionBehavior(const char* extName, const char* behavior)
|
||||
pc.infoSink.info.message(EPrefixWarning, msg.c_str(), yylineno);
|
||||
break;
|
||||
}
|
||||
|
||||
return;
|
||||
} else
|
||||
iter->second = behaviorVal;
|
||||
|
||||
@ -155,7 +155,9 @@ SH_IMPORT_EXPORT int ShCompile(
|
||||
const EShOptimizationLevel,
|
||||
const TBuiltInResource *resources,
|
||||
int debugOptions,
|
||||
int defaultVersion = 110 // use 100 for ES environment
|
||||
int defaultVersion = 110, // use 100 for ES environment, overridden by #version in shader
|
||||
bool forwardCompatible = false, // give errors for use of deprecated features
|
||||
bool relaxedChecking = false // no warnings, reduced errors
|
||||
);
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user