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;