glGetFragDataLocation implementation

Implemented glGetFragDataLocation. There's very little coverage for
this function in dEQP, but the one test that uses it passes.

Change-Id: I6cfc93d7eaad54f23c922e45dafee9cba3401c83
Note: Chromium's ES3 path requires this function to be implemented.
Reviewed-on: https://swiftshader-review.googlesource.com/11728
Tested-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 24d1f3c..7eda6f5 100644
--- a/src/OpenGL/libGLESv2/Program.cpp
+++ b/src/OpenGL/libGLESv2/Program.cpp
@@ -254,6 +254,27 @@
 		return vertexBinary;
 	}
 
+	GLint Program::getFragDataLocation(const GLchar *name)
+	{
+		if(name && linked)
+		{
+			std::string baseName(name);
+			unsigned int subscript = GL_INVALID_INDEX;
+			baseName = ParseUniformName(baseName, &subscript);
+			for(glsl::VaryingList::iterator input = fragmentShader->varyings.begin(); input != fragmentShader->varyings.end(); ++input)
+			{
+				if(input->name == baseName)
+				{
+					int rowCount = VariableRowCount(input->type);
+					int colCount = VariableColumnCount(input->type);
+					return (subscript == GL_INVALID_INDEX) ? input->reg : input->reg + (rowCount > 1 ? colCount * subscript : subscript);
+				}
+			}
+		}
+
+		return -1;
+	}
+
 	void Program::bindAttributeLocation(GLuint index, const char *name)
 	{
 		if(index < MAX_VERTEX_ATTRIBS)
diff --git a/src/OpenGL/libGLESv2/Program.h b/src/OpenGL/libGLESv2/Program.h
index 56f7df7..9d4621e 100644
--- a/src/OpenGL/libGLESv2/Program.h
+++ b/src/OpenGL/libGLESv2/Program.h
@@ -182,6 +182,8 @@
 		void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog);
 		void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
 
+		GLint getFragDataLocation(const GLchar *name);
+
 		void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
 		size_t getActiveAttributeCount() const;
 		GLint getActiveAttributeMaxLength() const;
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index 642e5bb..f995d2d 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -2280,11 +2280,6 @@
 
 	es2::Context *context = es2::getContext();
 
-	if(strstr(name, "gl_") == name)
-	{
-		return -1;
-	}
-
 	if(context)
 	{
 		es2::Program *programObject = context->getProgram(program);
@@ -2305,9 +2300,10 @@
 		{
 			return error(GL_INVALID_OPERATION, -1);
 		}
+
+		return programObject->getFragDataLocation(name);
 	}
 
-	UNIMPLEMENTED();
 	return -1;
 }