Fix varying validation.
glGetFragDataLocation() should only query fragment output varyings.
Also fix checking for too many varyings.
Change-Id: I0981fb69a28762b6d41a22e0544d63c76510000c
Reviewed-on: https://swiftshader-review.googlesource.com/16209
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/libGLESv2/Program.cpp b/src/OpenGL/libGLESv2/Program.cpp
index 0d43096..b93bd2a 100644
--- a/src/OpenGL/libGLESv2/Program.cpp
+++ b/src/OpenGL/libGLESv2/Program.cpp
@@ -261,13 +261,24 @@
std::string baseName(name);
unsigned int subscript = GL_INVALID_INDEX;
baseName = ParseUniformName(baseName, &subscript);
- for(auto const &input : fragmentShader->varyings)
+ for(auto const &varying : fragmentShader->varyings)
{
- if(input.name == baseName)
+ if(varying.qualifier == EvqFragmentOut)
{
- int rowCount = VariableRowCount(input.type);
- int colCount = VariableColumnCount(input.type);
- return (subscript == GL_INVALID_INDEX) ? input.registerIndex : input.registerIndex + (rowCount > 1 ? colCount * subscript : subscript);
+ if(varying.name == baseName)
+ {
+ ASSERT(varying.registerIndex >= 0);
+
+ if(subscript == GL_INVALID_INDEX) // No subscript
+ {
+ return varying.registerIndex;
+ }
+
+ int rowCount = VariableRowCount(varying.type);
+ int colCount = VariableColumnCount(varying.type);
+
+ return varying.registerIndex + (rowCount > 1 ? colCount * subscript : subscript);
+ }
}
}
}
@@ -1372,9 +1383,12 @@
int components = VariableRegisterSize(output.type);
int registers = VariableRegisterCount(output.type) * output.size();
- ASSERT(in >= 0);
+ if(in < 0) // Fragment varying declared but not used
+ {
+ continue;
+ }
- if(in + registers > MAX_VARYING_VECTORS)
+ if(in + registers >= MAX_VARYING_VECTORS)
{
appendToInfoLog("Too many varyings");
return false;
@@ -1382,7 +1396,7 @@
if(out >= 0)
{
- if(out + registers > MAX_VARYING_VECTORS)
+ if(out + registers >= MAX_VARYING_VECTORS)
{
appendToInfoLog("Too many varyings");
return false;
@@ -1421,7 +1435,7 @@
if(out >= 0)
{
- if(out + registers > MAX_VARYING_VECTORS)
+ if(out + registers >= MAX_VARYING_VECTORS)
{
appendToInfoLog("Too many varyings");
return false;