* commit 'efdf94f7cc875f3dd66036f5962cf70802628ed1': opengl translator: Added GLSL ES builtin constants.
This commit is contained in:
@@ -15,12 +15,10 @@ void ShaderParser::setSrc(const Version& ver,GLsizei count,const GLchar** string
|
|||||||
}
|
}
|
||||||
clearParsedSrc();
|
clearParsedSrc();
|
||||||
|
|
||||||
const char *forceVersion = getenv("GOOGLE_GLES_FORCE_GLSL_VERSION");
|
// parseGLSLversion must be called first since #version should be the
|
||||||
if (forceVersion)
|
// first token in the shader source.
|
||||||
{
|
parseGLSLversion();
|
||||||
fprintf(stderr, "Workaround for nVidia's liberal shader compilation - adding #version token to shader\n");
|
parseBuiltinConstants();
|
||||||
parseGLSLversion(forceVersion);
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
version 1.30.10 is the first version of GLSL Language containing precision qualifiers
|
version 1.30.10 is the first version of GLSL Language containing precision qualifiers
|
||||||
if the glsl version is less than 1.30.10 than we will use a shader parser which omits
|
if the glsl version is less than 1.30.10 than we will use a shader parser which omits
|
||||||
@@ -53,11 +51,117 @@ void ShaderParser::parseOriginalSrc() {
|
|||||||
m_parsedSrc+=m_src;
|
m_parsedSrc+=m_src;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShaderParser::parseGLSLversion(const char *forceVersion) {
|
void ShaderParser::parseGLSLversion() {
|
||||||
//if no version definition is found
|
|
||||||
if (m_src.find("#version ", 0) == std::string::npos) {
|
//
|
||||||
m_parsedSrc += std::string("#version ") + std::string(forceVersion) + std::string("\n");
|
// find in shader the #version token if exist.
|
||||||
|
// That token should be the first non-comment or blank token
|
||||||
|
//
|
||||||
|
const char *src = m_src.c_str();
|
||||||
|
int glslVersion = 0;
|
||||||
|
enum {
|
||||||
|
PARSE_NONE,
|
||||||
|
PARSE_IN_C_COMMENT,
|
||||||
|
PARSE_IN_LINE_COMMENT
|
||||||
|
} parseState = PARSE_NONE;
|
||||||
|
const char *c = src;
|
||||||
|
|
||||||
|
while( c && *c != '\0') {
|
||||||
|
if (parseState == PARSE_IN_C_COMMENT) {
|
||||||
|
if (*c == '*' && *(c+1) == '/') {
|
||||||
|
parseState = PARSE_NONE;
|
||||||
|
c += 2;
|
||||||
}
|
}
|
||||||
|
else c++;
|
||||||
|
}
|
||||||
|
else if (parseState == PARSE_IN_LINE_COMMENT) {
|
||||||
|
if (*c == '\n') {
|
||||||
|
parseState = PARSE_NONE;
|
||||||
|
}
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
else if (*c == '/' && *(c+1) == '/') {
|
||||||
|
parseState = PARSE_IN_LINE_COMMENT;
|
||||||
|
c += 2;
|
||||||
|
}
|
||||||
|
else if (*c == '/' && *(c+1) == '*') {
|
||||||
|
parseState = PARSE_IN_C_COMMENT;
|
||||||
|
c += 2;
|
||||||
|
}
|
||||||
|
else if (*c == ' ' || *c == '\t' || *c == '\r' || *c == '\n') {
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
//
|
||||||
|
// We have reached the first non-blank character outside
|
||||||
|
// a comment, this must be a #version token or else #version
|
||||||
|
// token does not exist in this shader source.
|
||||||
|
//
|
||||||
|
if (!strncmp(c,"#version",8)) {
|
||||||
|
if (sscanf(c+8,"%d",&glslVersion) != 1) {
|
||||||
|
//
|
||||||
|
// #version found but failed to parse the version value!
|
||||||
|
// this must be an error, set glslVersion to -1 to flag
|
||||||
|
// that we do not want to override the version, just let
|
||||||
|
// the shader compiler handle it.
|
||||||
|
//
|
||||||
|
glslVersion = -1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
//
|
||||||
|
// parsed version string correctly, blank out the
|
||||||
|
// version token from the source, we will add it later at
|
||||||
|
// the begining of the shader.
|
||||||
|
//
|
||||||
|
char *cc = (char *)c;
|
||||||
|
for (int i=0; i<8; i++,cc++) *cc = ' ';
|
||||||
|
while (*cc < '0' || *cc > '9') { *cc = ' '; cc++; }
|
||||||
|
while (*cc >= '0' && *cc <= '9') { *cc = ' '; cc++; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// break the loop, no need to go further on the source.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// if no version token found, check if default glsl version
|
||||||
|
// has been requested through environment variable.
|
||||||
|
//
|
||||||
|
if (glslVersion == 0) {
|
||||||
|
const char *defVersion = getenv("GOOGLE_GLES_DEFAULT_GLSL_VERSION");
|
||||||
|
if (defVersion) {
|
||||||
|
if (sscanf(defVersion,"%d",&glslVersion) != 1) {
|
||||||
|
fprintf(stderr,"Wrong value to GOOGLE_GLES_DEFAULT_GLSL_VERSION, should be an integer\n");
|
||||||
|
glslVersion = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// if glslVersion is defined, add it to the parsed source
|
||||||
|
//
|
||||||
|
if (glslVersion > 0) {
|
||||||
|
char vstr[16];
|
||||||
|
sprintf(vstr,"%d",glslVersion);
|
||||||
|
m_parsedSrc += std::string("#version ") +
|
||||||
|
std::string(vstr) +
|
||||||
|
std::string("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShaderParser::parseBuiltinConstants()
|
||||||
|
{
|
||||||
|
m_parsedSrc +=
|
||||||
|
"const int _translator_gl_MaxVertexUniformVectors = 256;\n"
|
||||||
|
"const int _translator_gl_MaxFragmentUniformVectors = 256;\n"
|
||||||
|
"const int _translator_gl_MaxVaryingVectors = 15;\n"
|
||||||
|
"#define gl_MaxVertexUniformVectors _translator_gl_MaxVertexUniformVectors\n"
|
||||||
|
"#define gl_MaxFragmentUniformVectors _translator_gl_MaxFragmentUniformVectors\n"
|
||||||
|
"#define gl_MaxVaryingVectors _translator_gl_MaxVaryingVectors\n";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShaderParser::parseOmitPrecision(){
|
void ShaderParser::parseOmitPrecision(){
|
||||||
|
|||||||
@@ -18,7 +18,8 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void parseOriginalSrc();
|
void parseOriginalSrc();
|
||||||
void parseGLSLversion(const char *forceVersion);
|
void parseGLSLversion();
|
||||||
|
void parseBuiltinConstants();
|
||||||
void parseOmitPrecision();
|
void parseOmitPrecision();
|
||||||
void parseExtendDefaultPrecision();
|
void parseExtendDefaultPrecision();
|
||||||
void clearParsedSrc();
|
void clearParsedSrc();
|
||||||
|
|||||||
Reference in New Issue
Block a user