Varying invariance must match between shaders in ESSL 1.00
While in ESSL 3.00 invariant is allowed only for out varyings.
Verify that, and update test expectations.
BUG=angleproject:1293
TEST=GLSLTest*.Invariant*
Change-Id: I5cab6c68f2b94ea2179719119668d905fe7a9b3d
Reviewed-on: https://chromium-review.googlesource.com/352743
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Yuly Novikov <ynovikov@chromium.org>
diff --git a/src/libANGLE/Program.cpp b/src/libANGLE/Program.cpp
index 65cde2f..dc56af3 100644
--- a/src/libANGLE/Program.cpp
+++ b/src/libANGLE/Program.cpp
@@ -1628,6 +1628,8 @@
const Shader *vertexShader,
const Shader *fragmentShader)
{
+ ASSERT(vertexShader->getShaderVersion() == fragmentShader->getShaderVersion());
+
const std::vector<sh::Varying> &vertexVaryings = vertexShader->getVaryings();
const std::vector<sh::Varying> &fragmentVaryings = fragmentShader->getVaryings();
@@ -1646,7 +1648,8 @@
if (output.name == input.name)
{
ASSERT(!input.isBuiltIn());
- if (!linkValidateVaryings(infoLog, output.name, input, output))
+ if (!linkValidateVaryings(infoLog, output.name, input, output,
+ vertexShader->getShaderVersion()))
{
return false;
}
@@ -2103,7 +2106,11 @@
return true;
}
-bool Program::linkValidateVaryings(InfoLog &infoLog, const std::string &varyingName, const sh::Varying &vertexVarying, const sh::Varying &fragmentVarying)
+bool Program::linkValidateVaryings(InfoLog &infoLog,
+ const std::string &varyingName,
+ const sh::Varying &vertexVarying,
+ const sh::Varying &fragmentVarying,
+ int shaderVersion)
{
if (!linkValidateVariablesBase(infoLog, varyingName, vertexVarying, fragmentVarying, false))
{
@@ -2112,7 +2119,15 @@
if (!sh::InterpolationTypesMatch(vertexVarying.interpolation, fragmentVarying.interpolation))
{
- infoLog << "Interpolation types for " << varyingName << " differ between vertex and fragment shaders";
+ infoLog << "Interpolation types for " << varyingName
+ << " differ between vertex and fragment shaders.";
+ return false;
+ }
+
+ if (shaderVersion == 100 && vertexVarying.isInvariant != fragmentVarying.isInvariant)
+ {
+ infoLog << "Invariance for " << varyingName
+ << " differs between vertex and fragment shaders.";
return false;
}