Varying interpolation qualifier check
Made sure varyings had the same interpolation qualifier in fragment
shader and vertex shader (either both flat or both smooth ).
Fixes:
dEQP-GLES3.functional.shaders.linkage.varying.rules.interpolation_mismatch_1
Change-Id: I7f68490dc19a3365e492b666acda6f5db91d10ab
Reviewed-on: https://swiftshader-review.googlesource.com/15768
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/compiler/OutputASM.cpp b/src/OpenGL/compiler/OutputASM.cpp
index 019a47f..df28913 100644
--- a/src/OpenGL/compiler/OutputASM.cpp
+++ b/src/OpenGL/compiler/OutputASM.cpp
@@ -2921,7 +2921,7 @@
}
}
- activeVaryings.push_back(glsl::Varying(glVariableType(type), name, type.getArraySize(), registerIndex, 0));
+ activeVaryings.push_back(glsl::Varying(glVariableType(type), name, type.getArraySize(), type.getQualifier(), registerIndex, 0));
}
}
diff --git a/src/OpenGL/compiler/OutputASM.h b/src/OpenGL/compiler/OutputASM.h
index 72bf974..67c49db 100644
--- a/src/OpenGL/compiler/OutputASM.h
+++ b/src/OpenGL/compiler/OutputASM.h
@@ -152,8 +152,8 @@
struct Varying
{
- Varying(GLenum type, const std::string &name, int arraySize, int reg = -1, int col = -1)
- : type(type), name(name), arraySize(arraySize), reg(reg), col(col)
+ Varying(GLenum type, const std::string &name, int arraySize, TQualifier qualifier, int reg = -1, int col = -1)
+ : type(type), name(name), arraySize(arraySize), qualifier(qualifier), reg(reg), col(col)
{
}
@@ -170,6 +170,7 @@
GLenum type;
std::string name;
int arraySize;
+ TQualifier qualifier;
int reg; // First varying register, assigned during link
int col; // First register element, assigned during link
diff --git a/src/OpenGL/libGLESv2/Program.cpp b/src/OpenGL/libGLESv2/Program.cpp
index 5abf345..0d37ed7 100644
--- a/src/OpenGL/libGLESv2/Program.cpp
+++ b/src/OpenGL/libGLESv2/Program.cpp
@@ -1330,6 +1330,13 @@
return false;
}
+ if((output.qualifier == EvqFlatOut) ^ (input.qualifier == EvqFlatIn))
+ {
+ appendToInfoLog("Interpolation qualifiers for %s differ between vertex and fragment shaders", output.name.c_str());
+
+ return false;
+ }
+
matched = true;
break;
}