Commit 6cb4c7f0 by Olli Etuaho

Set __VERSION__ macro when the #version directive is parsed

__VERSION__ macro needs to be set to 300 when #version 300 es is on the first line of the shader, since section 3.4 of ESSL 3.00.4 spec mentions that the value of __VERSION__ should match the shading language being parsed. The value from parsing the version directive replaces the default value 100. BUG=angleproject:524 TEST=dEQP-GLES3.functional.shaders.preprocessor.predefined_macros.* (4 tests start passing, 2 still fail) dEQP-GLES3.functional.shaders.preprocessor.conditionals.* (2 tests start passing) dEQP-GLES2.functional.shaders.preprocessor.predefined_macros.* (no regression) Change-Id: I15bfdeb73d1e343d131ded56b1fd52ca5ef32408 Reviewed-on: https://chromium-review.googlesource.com/293440Reviewed-by: 's avatarZhenyao Mo <zmo@chromium.org> Tested-by: 's avatarOlli Etuaho <oetuaho@nvidia.com>
parent bc384230
...@@ -821,6 +821,7 @@ void DirectiveParser::parseVersion(Token *token) ...@@ -821,6 +821,7 @@ void DirectiveParser::parseVersion(Token *token)
{ {
mDirectiveHandler->handleVersion(token->location, version); mDirectiveHandler->handleVersion(token->location, version);
mShaderVersion = version; mShaderVersion = version;
PredefineMacro(mMacroSet, "__VERSION__", version);
} }
} }
......
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
#include "Macro.h" #include "Macro.h"
#include <sstream>
#include "Token.h" #include "Token.h"
namespace pp namespace pp
...@@ -19,5 +21,23 @@ bool Macro::equals(const Macro &other) const ...@@ -19,5 +21,23 @@ bool Macro::equals(const Macro &other) const
(replacements == other.replacements); (replacements == other.replacements);
} }
void PredefineMacro(MacroSet *macroSet, const char *name, int value)
{
std::ostringstream stream;
stream << value;
Token token;
token.type = Token::CONST_INT;
token.text = stream.str();
Macro macro;
macro.predefined = true;
macro.type = Macro::kTypeObj;
macro.name = name;
macro.replacements.push_back(token);
(*macroSet)[name] = macro;
}
} // namespace pp } // namespace pp
...@@ -45,6 +45,8 @@ struct Macro ...@@ -45,6 +45,8 @@ struct Macro
typedef std::map<std::string, Macro> MacroSet; typedef std::map<std::string, Macro> MacroSet;
void PredefineMacro(MacroSet *macroSet, const char *name, int value);
} // namespace pp } // namespace pp
#endif // COMPILER_PREPROCESSOR_MACRO_H_ #endif // COMPILER_PREPROCESSOR_MACRO_H_
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#include "Preprocessor.h" #include "Preprocessor.h"
#include <cassert> #include <cassert>
#include <sstream>
#include "DiagnosticsBase.h" #include "DiagnosticsBase.h"
#include "DirectiveParser.h" #include "DirectiveParser.h"
...@@ -52,12 +51,12 @@ bool Preprocessor::init(size_t count, ...@@ -52,12 +51,12 @@ bool Preprocessor::init(size_t count,
const char * const string[], const char * const string[],
const int length[]) const int length[])
{ {
static const int kGLSLVersion = 100; static const int kDefaultGLSLVersion = 100;
// Add standard pre-defined macros. // Add standard pre-defined macros.
predefineMacro("__LINE__", 0); predefineMacro("__LINE__", 0);
predefineMacro("__FILE__", 0); predefineMacro("__FILE__", 0);
predefineMacro("__VERSION__", kGLSLVersion); predefineMacro("__VERSION__", kDefaultGLSLVersion);
predefineMacro("GL_ES", 1); predefineMacro("GL_ES", 1);
return mImpl->tokenizer.init(count, string, length); return mImpl->tokenizer.init(count, string, length);
...@@ -65,20 +64,7 @@ bool Preprocessor::init(size_t count, ...@@ -65,20 +64,7 @@ bool Preprocessor::init(size_t count,
void Preprocessor::predefineMacro(const char *name, int value) void Preprocessor::predefineMacro(const char *name, int value)
{ {
std::ostringstream stream; PredefineMacro(&mImpl->macroSet, name, value);
stream << value;
Token token;
token.type = Token::CONST_INT;
token.text = stream.str();
Macro macro;
macro.predefined = true;
macro.type = Macro::kTypeObj;
macro.name = name;
macro.replacements.push_back(token);
mImpl->macroSet[name] = macro;
} }
void Preprocessor::lex(Token *token) void Preprocessor::lex(Token *token)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment