OSDN Git Service

Implemented matrix transpose
authorAlexis Hetu <sugoi@google.com>
Thu, 21 May 2015 14:47:04 +0000 (10:47 -0400)
committerAlexis Hétu <sugoi@google.com>
Mon, 25 May 2015 20:21:39 +0000 (20:21 +0000)
Implemented matrix transpose for
uniform matrices. Also found and
fixed a minor issue in OutputASM
which was causing a bad GL error.

Change-Id: I2d6c603770548c60e56d417b240ca276ec33ba45
Reviewed-on: https://swiftshader-review.googlesource.com/3191
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
src/OpenGL/compiler/OutputASM.cpp
src/OpenGL/libGLESv2/Program.cpp
src/OpenGL/libGLESv2/Program.h
src/OpenGL/libGLESv2/libGLESv2.cpp
src/OpenGL/libGLESv2/libGLESv3.cpp

index d66ead1..d95d568 100644 (file)
@@ -2402,7 +2402,7 @@ namespace glsl
                                        {\r
                                        case 2: return GL_FLOAT_MAT3x2;\r
                                        case 3: return GL_FLOAT_MAT3;\r
-                                       case 4: return GL_FLOAT_MAT4x2;\r
+                                       case 4: return GL_FLOAT_MAT3x4;\r
                                        default: UNREACHABLE();\r
                                        }\r
                                case 4:\r
index ba1ed3e..27361ec 100644 (file)
@@ -354,7 +354,7 @@ namespace es2
                return setUniformfv(location, count, v, 4);\r
        }\r
 \r
-       bool Program::setUniformMatrixfv(GLint location, GLsizei count, const GLfloat *value, GLenum type)\r
+       bool Program::setUniformMatrixfv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value, GLenum type)\r
        {\r
                int numElements;\r
                switch(type)\r
@@ -406,55 +406,77 @@ namespace es2
 \r
                count = std::min(size - (int)uniformIndex[location].element, count);\r
 \r
-               memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLfloat)* numElements,\r
-                          value, numElements * sizeof(GLfloat)* count);\r
+               GLfloat* dst = reinterpret_cast<GLfloat*>(targetUniform->data + uniformIndex[location].element * sizeof(GLfloat) * numElements);\r
+\r
+               if(transpose == GL_FALSE)\r
+               {\r
+                       memcpy(dst, value, numElements * sizeof(GLfloat) * count);\r
+               }\r
+               else\r
+               {\r
+                       const int rowSize = VariableRowCount(type);\r
+                       const int colSize = VariableColumnCount(type);\r
+                       for(int n = 0; n < count; ++n)\r
+                       {\r
+                               for(int i = 0; i < colSize; ++i)\r
+                               {\r
+                                       for(int j = 0; j < rowSize; ++j)\r
+                                       {\r
+                                               dst[i * rowSize + j] = value[j * colSize + i];\r
+                                       }\r
+                               }\r
+                               dst += numElements;\r
+                               value += numElements;\r
+                       }\r
+               }\r
+\r
 \r
                return true;\r
        }\r
 \r
-       bool Program::setUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value)\r
+       bool Program::setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r
        {\r
-               return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT2);\r
+               return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT2);\r
        }\r
 \r
-       bool Program::setUniformMatrix2x3fv(GLint location, GLsizei count, const GLfloat *value)\r
+       bool Program::setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r
        {\r
-               return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT2x3);\r
+               return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT2x3);\r
        }\r
 \r
-       bool Program::setUniformMatrix2x4fv(GLint location, GLsizei count, const GLfloat *value)\r
+       bool Program::setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r
        {\r
-               return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT2x4);\r
+               return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT2x4);\r
        }\r
 \r
-       bool Program::setUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value)\r
+       bool Program::setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r
        {\r
-               return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT3);\r
+               return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT3);\r
        }\r
 \r
-       bool Program::setUniformMatrix3x2fv(GLint location, GLsizei count, const GLfloat *value)\r
+       bool Program::setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r
        {\r
-               return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT3x2);\r
+               return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT3x2);\r
        }\r
 \r
-       bool Program::setUniformMatrix3x4fv(GLint location, GLsizei count, const GLfloat *value)\r
+       bool Program::setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r
        {\r
-               return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT3x4);\r
+               return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT3x4);\r
        }\r
 \r
-       bool Program::setUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value)\r
+       bool Program::setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r
        {\r
-               return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT4);\r
+               return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT4);\r
        }\r
 \r
-       bool Program::setUniformMatrix4x2fv(GLint location, GLsizei count, const GLfloat *value)\r
+       bool Program::setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r
        {\r
-               return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT4x2);\r
+               return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT4x2);\r
        }\r
 \r
-       bool Program::setUniformMatrix4x3fv(GLint location, GLsizei count, const GLfloat *value)\r
+       bool Program::setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r
        {\r
-               return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT4x3);\r
+               return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT4x3);\r
        }\r
 \r
        bool Program::setUniform1iv(GLint location, GLsizei count, const GLint *v)\r
index f12be2c..1e5e420 100644 (file)
@@ -90,15 +90,15 @@ namespace es2
                bool setUniform2fv(GLint location, GLsizei count, const GLfloat *v);\r
                bool setUniform3fv(GLint location, GLsizei count, const GLfloat *v);\r
                bool setUniform4fv(GLint location, GLsizei count, const GLfloat *v);\r
-               bool setUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);\r
-               bool setUniformMatrix2x3fv(GLint location, GLsizei count, const GLfloat *value);\r
-               bool setUniformMatrix2x4fv(GLint location, GLsizei count, const GLfloat *value);\r
-               bool setUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);\r
-               bool setUniformMatrix3x2fv(GLint location, GLsizei count, const GLfloat *value);\r
-               bool setUniformMatrix3x4fv(GLint location, GLsizei count, const GLfloat *value);\r
-               bool setUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);\r
-               bool setUniformMatrix4x2fv(GLint location, GLsizei count, const GLfloat *value);\r
-               bool setUniformMatrix4x3fv(GLint location, GLsizei count, const GLfloat *value);\r
+               bool setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r
+               bool setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r
+               bool setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r
+               bool setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r
+               bool setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r
+               bool setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r
+               bool setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r
+               bool setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r
+               bool setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r
                bool setUniform1iv(GLint location, GLsizei count, const GLint *v);\r
                bool setUniform2iv(GLint location, GLsizei count, const GLint *v);\r
                bool setUniform3iv(GLint location, GLsizei count, const GLint *v);\r
@@ -178,7 +178,7 @@ namespace es2
                bool applyUniform4uiv(GLint location, GLsizei count, const GLuint *v);\r
 \r
                bool setUniformfv(GLint location, GLsizei count, const GLfloat *v, int numElements);\r
-               bool setUniformMatrixfv(GLint location, GLsizei count, const GLfloat *value, GLenum type);\r
+               bool setUniformMatrixfv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value, GLenum type);\r
                bool setUniformiv(GLint location, GLsizei count, const GLint *v, int numElements);\r
                bool setUniformuiv(GLint location, GLsizei count, const GLuint *v, int numElements);\r
 \r
index 7120a96..be60c18 100644 (file)
@@ -6348,7 +6348,7 @@ void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const
        TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = %p)",\r
              location, count, transpose, value);\r
 \r
-       if(count < 0 || transpose != GL_FALSE)\r
+       if(count < 0)\r
        {\r
                return error(GL_INVALID_VALUE);\r
        }\r
@@ -6362,6 +6362,11 @@ void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const
 \r
        if(context)\r
        {\r
+               if(context->getClientVersion() < 3 && transpose != GL_FALSE)\r
+               {\r
+                       return error(GL_INVALID_VALUE);\r
+               }\r
+\r
                es2::Program *program = context->getCurrentProgram();\r
 \r
                if(!program)\r
@@ -6369,7 +6374,7 @@ void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const
                        return error(GL_INVALID_OPERATION);\r
                }\r
 \r
-               if(!program->setUniformMatrix2fv(location, count, value))\r
+               if(!program->setUniformMatrix2fv(location, count, transpose, value))\r
                {\r
                        return error(GL_INVALID_OPERATION);\r
                }\r
@@ -6381,7 +6386,7 @@ void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const
        TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = %p)",\r
              location, count, transpose, value);\r
 \r
-       if(count < 0 || transpose != GL_FALSE)\r
+       if(count < 0)\r
        {\r
                return error(GL_INVALID_VALUE);\r
        }\r
@@ -6395,6 +6400,11 @@ void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const
 \r
        if(context)\r
        {\r
+               if(context->getClientVersion() < 3 && transpose != GL_FALSE)\r
+               {\r
+                       return error(GL_INVALID_VALUE);\r
+               }\r
+\r
                es2::Program *program = context->getCurrentProgram();\r
 \r
                if(!program)\r
@@ -6402,7 +6412,7 @@ void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const
                        return error(GL_INVALID_OPERATION);\r
                }\r
 \r
-               if(!program->setUniformMatrix3fv(location, count, value))\r
+               if(!program->setUniformMatrix3fv(location, count, transpose, value))\r
                {\r
                        return error(GL_INVALID_OPERATION);\r
                }\r
@@ -6414,7 +6424,7 @@ void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const
        TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = %p)",\r
              location, count, transpose, value);\r
 \r
-       if(count < 0 || transpose != GL_FALSE)\r
+       if(count < 0)\r
        {\r
                return error(GL_INVALID_VALUE);\r
        }\r
@@ -6428,6 +6438,11 @@ void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const
 \r
        if(context)\r
        {\r
+               if(context->getClientVersion() < 3 && transpose != GL_FALSE)\r
+               {\r
+                       return error(GL_INVALID_VALUE);\r
+               }\r
+\r
                es2::Program *program = context->getCurrentProgram();\r
 \r
                if(!program)\r
@@ -6435,7 +6450,7 @@ void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const
                        return error(GL_INVALID_OPERATION);\r
                }\r
 \r
-               if(!program->setUniformMatrix4fv(location, count, value))\r
+               if(!program->setUniformMatrix4fv(location, count, transpose, value))\r
                {\r
                        return error(GL_INVALID_OPERATION);\r
                }\r
index 3d59a1d..68e9aac 100644 (file)
@@ -1160,7 +1160,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv(GLint location, GLsizei count,
 {\r
        TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = %p)", location, count, transpose, value);\r
 \r
-       if(count < 0 || transpose != GL_FALSE)\r
+       if(count < 0)\r
        {\r
                return error(GL_INVALID_VALUE);\r
        }\r
@@ -1181,7 +1181,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv(GLint location, GLsizei count,
                        return error(GL_INVALID_OPERATION);\r
                }\r
 \r
-               if(!program->setUniformMatrix2x3fv(location, count, value))\r
+               if(!program->setUniformMatrix2x3fv(location, count, transpose, value))\r
                {\r
                        return error(GL_INVALID_OPERATION);\r
                }\r
@@ -1192,7 +1192,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv(GLint location, GLsizei count,
 {\r
        TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = %p)", location, count, transpose, value);\r
 \r
-       if(count < 0 || transpose != GL_FALSE)\r
+       if(count < 0)\r
        {\r
                return error(GL_INVALID_VALUE);\r
        }\r
@@ -1213,7 +1213,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv(GLint location, GLsizei count,
                        return error(GL_INVALID_OPERATION);\r
                }\r
 \r
-               if(!program->setUniformMatrix3x2fv(location, count, value))\r
+               if(!program->setUniformMatrix3x2fv(location, count, transpose, value))\r
                {\r
                        return error(GL_INVALID_OPERATION);\r
                }\r
@@ -1224,7 +1224,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv(GLint location, GLsizei count,
 {\r
        TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = %p)", location, count, transpose, value);\r
 \r
-       if(count < 0 || transpose != GL_FALSE)\r
+       if(count < 0)\r
        {\r
                return error(GL_INVALID_VALUE);\r
        }\r
@@ -1245,7 +1245,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv(GLint location, GLsizei count,
                        return error(GL_INVALID_OPERATION);\r
                }\r
 \r
-               if(!program->setUniformMatrix2x4fv(location, count, value))\r
+               if(!program->setUniformMatrix2x4fv(location, count, transpose, value))\r
                {\r
                        return error(GL_INVALID_OPERATION);\r
                }\r
@@ -1256,7 +1256,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv(GLint location, GLsizei count,
 {\r
        TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = %p)", location, count, transpose, value);\r
 \r
-       if(count < 0 || transpose != GL_FALSE)\r
+       if(count < 0)\r
        {\r
                return error(GL_INVALID_VALUE);\r
        }\r
@@ -1277,7 +1277,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv(GLint location, GLsizei count,
                        return error(GL_INVALID_OPERATION);\r
                }\r
 \r
-               if(!program->setUniformMatrix4x2fv(location, count, value))\r
+               if(!program->setUniformMatrix4x2fv(location, count, transpose, value))\r
                {\r
                        return error(GL_INVALID_OPERATION);\r
                }\r
@@ -1288,7 +1288,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv(GLint location, GLsizei count,
 {\r
        TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = %p)", location, count, transpose, value);\r
 \r
-       if(count < 0 || transpose != GL_FALSE)\r
+       if(count < 0)\r
        {\r
                return error(GL_INVALID_VALUE);\r
        }\r
@@ -1309,7 +1309,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv(GLint location, GLsizei count,
                        return error(GL_INVALID_OPERATION);\r
                }\r
 \r
-               if(!program->setUniformMatrix3x4fv(location, count, value))\r
+               if(!program->setUniformMatrix3x4fv(location, count, transpose, value))\r
                {\r
                        return error(GL_INVALID_OPERATION);\r
                }\r
@@ -1320,7 +1320,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv(GLint location, GLsizei count,
 {\r
        TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = %p)", location, count, transpose, value);\r
 \r
-       if(count < 0 || transpose != GL_FALSE)\r
+       if(count < 0)\r
        {\r
                return error(GL_INVALID_VALUE);\r
        }\r
@@ -1341,7 +1341,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv(GLint location, GLsizei count,
                        return error(GL_INVALID_OPERATION);\r
                }\r
 \r
-               if(!program->setUniformMatrix4x3fv(location, count, value))\r
+               if(!program->setUniformMatrix4x3fv(location, count, transpose, value))\r
                {\r
                        return error(GL_INVALID_OPERATION);\r
                }\r