OSDN Git Service

transpose implementation
authorAlexis Hetu <sugoi@google.com>
Wed, 27 May 2015 19:22:18 +0000 (15:22 -0400)
committerAlexis Hétu <sugoi@google.com>
Fri, 29 May 2015 20:23:57 +0000 (20:23 +0000)
transpose is now implemented for dynamic
variables. All NxN transpose dEQP tests pass.
There's still an issue with some NxM matrices,
but it seems to be unrelated to this code.

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

index 2af8826..b2ade0a 100644 (file)
@@ -652,6 +652,24 @@ namespace glsl
                case EOpFwidth:           if(visit == PostVisit) emit(sw::Shader::OPCODE_FWIDTH, result, arg); break;\r
                case EOpAny:              if(visit == PostVisit) emit(sw::Shader::OPCODE_ANY, result, arg); break;\r
                case EOpAll:              if(visit == PostVisit) emit(sw::Shader::OPCODE_ALL, result, arg); break;\r
+               case EOpTranspose:\r
+                       if(visit == PostVisit)\r
+                       {\r
+                               int numCols = arg->getNominalSize();\r
+                               int numRows = arg->getSecondarySize();\r
+                               for(int i = 0; i < numCols; ++i)\r
+                               {\r
+                                       for(int j = 0; j < numRows; ++j)\r
+                                       {\r
+                                               Instruction *mov = emit(sw::Shader::OPCODE_MOV, result, arg);\r
+                                               mov->src[0].index += i;\r
+                                               mov->src[0].swizzle = 0x55 * j;\r
+                                               mov->dst.index += j;\r
+                                               mov->dst.mask = 1 << i;\r
+                                       }\r
+                               }\r
+                       }\r
+                       break;\r
                default: UNREACHABLE();\r
                }\r
 \r