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;
 				}