OSDN Git Service

Uniform block related fixes
authorAlexis Hetu <sugoi@google.com>
Mon, 1 Feb 2016 20:26:46 +0000 (15:26 -0500)
committerAlexis Hétu <sugoi@google.com>
Tue, 2 Feb 2016 15:07:10 +0000 (15:07 +0000)
- The rowMajor qualifier should only be set for matrices
- Shared and std140 layouts are always considered active
- Fixed registerSize() for uniform blocks

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

index 76bedfa..14f5674 100644 (file)
@@ -103,7 +103,7 @@ namespace glsl
                const BlockMemberInfo memberInfo(static_cast<int>(mCurrentOffset * BytesPerComponent),\r
                                                 static_cast<int>(arrayStride * BytesPerComponent),\r
                                                 static_cast<int>(matrixStride * BytesPerComponent),\r
-                                                isRowMajor);\r
+                                                (matrixStride > 0) && isRowMajor);\r
 \r
                advanceOffset(type, type.getArraySize(), isRowMajor, arrayStride, matrixStride);\r
 \r
@@ -451,6 +451,16 @@ namespace glsl
                                declareVarying(symbol, -1);\r
                        }\r
                }\r
+\r
+               TInterfaceBlock* block = symbol->getType().getInterfaceBlock();\r
+               // OpenGL ES 3.0.4 spec, section 2.12.6 Uniform Variables:\r
+               // "All members of a named uniform block declared with a shared or std140 layout qualifier\r
+               // are considered active, even if they are not referenced in any shader in the program.\r
+               // The uniform block itself is also considered active, even if no member of the block is referenced."\r
+               if(block && ((block->blockStorage() == EbsShared) || (block->blockStorage() == EbsStd140)))\r
+               {\r
+                       uniformRegister(symbol);\r
+               }\r
        }\r
 \r
        bool OutputASM::visitBinary(Visit visit, TIntermBinary *node)\r
@@ -2012,6 +2022,10 @@ namespace glsl
                        {\r
                                return registerSize(*((*(type.getStruct()->fields().begin()))->type()), 0);\r
                        }\r
+                       else if(type.isInterfaceBlock())\r
+                       {\r
+                               return registerSize(*((*(type.getInterfaceBlock()->fields().begin()))->type()), 0);\r
+                       }\r
 \r
                        return type.registerSize();\r
                }\r