Commit a1f6dc95 by Yuly Novikov Committed by Commit Bot

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/352743Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Yuly Novikov <ynovikov@chromium.org>
parent cfa48d37
......@@ -1628,6 +1628,8 @@ bool Program::linkVaryings(InfoLog &infoLog,
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 @@ bool Program::linkVaryings(InfoLog &infoLog,
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 @@ bool Program::linkValidateUniforms(InfoLog &infoLog, const std::string &uniformN
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 @@ bool Program::linkValidateVaryings(InfoLog &infoLog, const std::string &varyingN
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;
}
......
......@@ -366,7 +366,11 @@ class Program final : angle::NonCopyable, public LabeledObject
const sh::ShaderVariable &fragmentVariable,
bool validatePrecision);
static bool linkValidateVaryings(InfoLog &infoLog, const std::string &varyingName, const sh::Varying &vertexVarying, const sh::Varying &fragmentVarying);
static bool linkValidateVaryings(InfoLog &infoLog,
const std::string &varyingName,
const sh::Varying &vertexVarying,
const sh::Varying &fragmentVarying,
int shaderVersion);
bool linkValidateTransformFeedback(InfoLog &infoLog,
const std::vector<const sh::Varying *> &linkedVaryings,
const Caps &caps) const;
......
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