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