OSDN Git Service

Handling proper sampler types
authorAlexis Hetu <sugoi@google.com>
Tue, 30 Jun 2015 20:27:50 +0000 (16:27 -0400)
committerAlexis Hétu <sugoi@google.com>
Thu, 16 Jul 2015 19:07:49 +0000 (19:07 +0000)
Some int/uint/array types weren't properly handled by
the Program class yet, so the missing types were added.

Change-Id: I487bbbdcbf798c7430535745386139632346013f
Reviewed-on: https://swiftshader-review.googlesource.com/3610
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/utilities.cpp
src/OpenGL/libGLESv2/utilities.h

index 72d7783..4fb4126 100644 (file)
@@ -2552,23 +2552,37 @@ namespace glsl
                        else UNREACHABLE(0);\r
                        break;\r
                case EbtSampler2D:\r
+                       return GL_SAMPLER_2D;\r
                case EbtISampler2D:\r
+                       return GL_INT_SAMPLER_2D;\r
                case EbtUSampler2D:\r
-                       return GL_SAMPLER_2D;\r
+                       return GL_UNSIGNED_INT_SAMPLER_2D;\r
                case EbtSamplerCube:\r
+                       return GL_SAMPLER_CUBE;\r
                case EbtISamplerCube:\r
+                       return GL_INT_SAMPLER_CUBE;\r
                case EbtUSamplerCube:\r
-                       return GL_SAMPLER_CUBE;\r
+                       return GL_UNSIGNED_INT_SAMPLER_CUBE;\r
                case EbtSamplerExternalOES:\r
                        return GL_SAMPLER_EXTERNAL_OES;\r
                case EbtSampler3D:\r
+                       return GL_SAMPLER_3D_OES;\r
                case EbtISampler3D:\r
+                       return GL_INT_SAMPLER_3D;\r
                case EbtUSampler3D:\r
-                       return GL_SAMPLER_3D_OES;\r
+                       return GL_UNSIGNED_INT_SAMPLER_3D;\r
                case EbtSampler2DArray:\r
+                       return GL_SAMPLER_2D_ARRAY;\r
                case EbtISampler2DArray:\r
+                       return GL_INT_SAMPLER_2D_ARRAY;\r
                case EbtUSampler2DArray:\r
-                       return GL_SAMPLER_2D_ARRAY;\r
+                       return GL_UNSIGNED_INT_SAMPLER_2D_ARRAY;\r
+               case EbtSampler2DShadow:\r
+                       return GL_SAMPLER_2D_SHADOW;\r
+               case EbtSamplerCubeShadow:\r
+                       return GL_SAMPLER_CUBE_SHADOW;\r
+               case EbtSampler2DArrayShadow:\r
+                       return GL_SAMPLER_2D_ARRAY_SHADOW;\r
                default:\r
                        UNREACHABLE(type.getBasicType());\r
                        break;\r
index 636a073..dd4c598 100644 (file)
@@ -630,11 +630,7 @@ namespace es2
        \r
                count = std::min(size - (int)uniformIndex[location].element, count);\r
 \r
-               if(targetUniform->type == GL_INT ||\r
-                  targetUniform->type == GL_SAMPLER_2D ||\r
-                  targetUniform->type == GL_SAMPLER_CUBE ||\r
-           targetUniform->type == GL_SAMPLER_EXTERNAL_OES ||\r
-                  targetUniform->type == GL_SAMPLER_3D_OES)\r
+               if(targetUniform->type == GL_INT || IsSamplerUniform(targetUniform->type))\r
                {\r
                        memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLint),\r
                                   v, sizeof(GLint) * count);\r
@@ -753,11 +749,7 @@ namespace es2
        \r
                count = std::min(size - (int)uniformIndex[location].element, count);\r
 \r
-               if(targetUniform->type == GL_INT ||\r
-                  targetUniform->type == GL_SAMPLER_2D ||\r
-                  targetUniform->type == GL_SAMPLER_CUBE ||\r
-                  targetUniform->type == GL_SAMPLER_EXTERNAL_OES ||\r
-                  targetUniform->type == GL_SAMPLER_3D_OES)\r
+               if(targetUniform->type == GL_INT || IsSamplerUniform(targetUniform->type))\r
                {\r
                        memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLuint),\r
                                   v, sizeof(GLuint)* count);\r
@@ -1066,6 +1058,18 @@ namespace es2
                                case GL_SAMPLER_CUBE:\r
                                case GL_SAMPLER_EXTERNAL_OES:\r
                                case GL_SAMPLER_3D_OES:\r
+                               case GL_SAMPLER_2D_ARRAY:\r
+                               case GL_SAMPLER_2D_SHADOW:\r
+                               case GL_SAMPLER_CUBE_SHADOW:\r
+                               case GL_SAMPLER_2D_ARRAY_SHADOW:\r
+                               case GL_INT_SAMPLER_2D:\r
+                               case GL_UNSIGNED_INT_SAMPLER_2D:\r
+                               case GL_INT_SAMPLER_CUBE:\r
+                               case GL_UNSIGNED_INT_SAMPLER_CUBE:\r
+                               case GL_INT_SAMPLER_3D:\r
+                               case GL_UNSIGNED_INT_SAMPLER_3D:\r
+                               case GL_INT_SAMPLER_2D_ARRAY:\r
+                               case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:\r
                                case GL_INT:        applyUniform1iv(location, size, i);       break;\r
                                case GL_INT_VEC2:   applyUniform2iv(location, size, i);       break;\r
                                case GL_INT_VEC3:   applyUniform3iv(location, size, i);       break;\r
@@ -1347,7 +1351,7 @@ namespace es2
 \r
        bool Program::defineUniform(GLenum shader, GLenum type, GLenum precision, const std::string &name, unsigned int arraySize, int registerIndex)\r
        {\r
-               if(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || type == GL_SAMPLER_EXTERNAL_OES || type == GL_SAMPLER_3D_OES)\r
+               if(IsSamplerUniform(type))\r
            {\r
                        int index = registerIndex;\r
                        \r
@@ -1362,10 +1366,22 @@ namespace es2
                                                switch(type)\r
                                                {\r
                                                default:                      UNREACHABLE(type);\r
+                                               case GL_INT_SAMPLER_2D:\r
+                                               case GL_UNSIGNED_INT_SAMPLER_2D:\r
+                                               case GL_SAMPLER_2D_SHADOW:\r
                                                case GL_SAMPLER_2D:           samplersVS[index].textureType = TEXTURE_2D;       break;\r
+                                               case GL_INT_SAMPLER_CUBE:\r
+                                               case GL_UNSIGNED_INT_SAMPLER_CUBE:\r
+                                               case GL_SAMPLER_CUBE_SHADOW:\r
                                                case GL_SAMPLER_CUBE:         samplersVS[index].textureType = TEXTURE_CUBE;     break;\r
+                                               case GL_INT_SAMPLER_3D:\r
+                                               case GL_UNSIGNED_INT_SAMPLER_3D:\r
                                                case GL_SAMPLER_3D_OES:       samplersVS[index].textureType = TEXTURE_3D;       break;\r
                                                case GL_SAMPLER_EXTERNAL_OES: samplersVS[index].textureType = TEXTURE_EXTERNAL; break;\r
+                                               case GL_INT_SAMPLER_2D_ARRAY:\r
+                                               case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:\r
+                                               case GL_SAMPLER_2D_ARRAY_SHADOW:\r
+                                               case GL_SAMPLER_2D_ARRAY:     samplersVS[index].textureType = TEXTURE_2D_ARRAY; break;\r
                                                }\r
 \r
                                                samplersVS[index].logicalTextureUnit = 0;\r
@@ -1385,10 +1401,22 @@ namespace es2
                                                switch(type)\r
                                                {\r
                                                default:                      UNREACHABLE(type);\r
+                                               case GL_INT_SAMPLER_2D:\r
+                                               case GL_UNSIGNED_INT_SAMPLER_2D:\r
+                                               case GL_SAMPLER_2D_SHADOW:\r
                                                case GL_SAMPLER_2D:           samplersPS[index].textureType = TEXTURE_2D;       break;\r
+                                               case GL_INT_SAMPLER_CUBE:\r
+                                               case GL_UNSIGNED_INT_SAMPLER_CUBE:\r
+                                               case GL_SAMPLER_CUBE_SHADOW:\r
                                                case GL_SAMPLER_CUBE:         samplersPS[index].textureType = TEXTURE_CUBE;     break;\r
+                                               case GL_INT_SAMPLER_3D:\r
+                                               case GL_UNSIGNED_INT_SAMPLER_3D:\r
                                                case GL_SAMPLER_3D_OES:       samplersPS[index].textureType = TEXTURE_3D;       break;\r
                                                case GL_SAMPLER_EXTERNAL_OES: samplersPS[index].textureType = TEXTURE_EXTERNAL; break;\r
+                                               case GL_INT_SAMPLER_2D_ARRAY:\r
+                                               case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:\r
+                                               case GL_SAMPLER_2D_ARRAY_SHADOW:\r
+                                               case GL_SAMPLER_2D_ARRAY:     samplersPS[index].textureType = TEXTURE_2D_ARRAY; break;\r
                                                }\r
 \r
                                                samplersPS[index].logicalTextureUnit = 0;\r
@@ -1953,10 +1981,7 @@ namespace es2
 \r
                if(targetUniform->psRegisterIndex != -1)\r
                {\r
-            if(targetUniform->type == GL_SAMPLER_2D ||\r
-               targetUniform->type == GL_SAMPLER_CUBE ||\r
-                          targetUniform->type == GL_SAMPLER_EXTERNAL_OES ||\r
-                          targetUniform->type == GL_SAMPLER_3D_OES)\r
+                       if(IsSamplerUniform(targetUniform->type))\r
                        {\r
                                for(int i = 0; i < count; i++)\r
                                {\r
@@ -1977,10 +2002,7 @@ namespace es2
 \r
                if(targetUniform->vsRegisterIndex != -1)\r
                {\r
-                       if(targetUniform->type == GL_SAMPLER_2D ||\r
-               targetUniform->type == GL_SAMPLER_CUBE ||\r
-                          targetUniform->type == GL_SAMPLER_EXTERNAL_OES ||\r
-                          targetUniform->type == GL_SAMPLER_3D_OES)\r
+                       if(IsSamplerUniform(targetUniform->type))\r
                        {\r
                                for(int i = 0; i < count; i++)\r
                                {\r
@@ -2105,10 +2127,7 @@ namespace es2
 \r
                if(targetUniform->psRegisterIndex != -1)\r
                {\r
-                       if(targetUniform->type == GL_SAMPLER_2D ||\r
-                          targetUniform->type == GL_SAMPLER_CUBE ||\r
-                          targetUniform->type == GL_SAMPLER_EXTERNAL_OES ||\r
-                          targetUniform->type == GL_SAMPLER_3D_OES)\r
+                       if(IsSamplerUniform(targetUniform->type))\r
                        {\r
                                for(int i = 0; i < count; i++)\r
                                {\r
@@ -2129,10 +2148,7 @@ namespace es2
 \r
                if(targetUniform->vsRegisterIndex != -1)\r
                {\r
-                       if(targetUniform->type == GL_SAMPLER_2D ||\r
-                          targetUniform->type == GL_SAMPLER_CUBE ||\r
-                          targetUniform->type == GL_SAMPLER_EXTERNAL_OES ||\r
-                          targetUniform->type == GL_SAMPLER_3D_OES)\r
+                       if(IsSamplerUniform(targetUniform->type))\r
                        {\r
                                for(int i = 0; i < count; i++)\r
                                {\r
index 001e88d..ea19daf 100644 (file)
@@ -34,6 +34,18 @@ namespace es2
                case GL_SAMPLER_CUBE:\r
         case GL_SAMPLER_EXTERNAL_OES:\r
                case GL_SAMPLER_3D_OES:\r
+               case GL_SAMPLER_2D_ARRAY:\r
+               case GL_SAMPLER_2D_SHADOW:\r
+               case GL_SAMPLER_CUBE_SHADOW:\r
+               case GL_SAMPLER_2D_ARRAY_SHADOW:\r
+               case GL_INT_SAMPLER_2D:\r
+               case GL_UNSIGNED_INT_SAMPLER_2D:\r
+               case GL_INT_SAMPLER_CUBE:\r
+               case GL_UNSIGNED_INT_SAMPLER_CUBE:\r
+               case GL_INT_SAMPLER_3D:\r
+               case GL_UNSIGNED_INT_SAMPLER_3D:\r
+               case GL_INT_SAMPLER_2D_ARRAY:\r
+               case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:\r
                        return 1;\r
                case GL_BOOL_VEC2:\r
                case GL_FLOAT_VEC2:\r
@@ -99,6 +111,18 @@ namespace es2
                case GL_SAMPLER_CUBE:\r
                case GL_SAMPLER_EXTERNAL_OES:\r
                case GL_SAMPLER_3D_OES:\r
+               case GL_SAMPLER_2D_ARRAY:\r
+               case GL_SAMPLER_2D_SHADOW:\r
+               case GL_SAMPLER_CUBE_SHADOW:\r
+               case GL_SAMPLER_2D_ARRAY_SHADOW:\r
+               case GL_INT_SAMPLER_2D:\r
+               case GL_UNSIGNED_INT_SAMPLER_2D:\r
+               case GL_INT_SAMPLER_CUBE:\r
+               case GL_UNSIGNED_INT_SAMPLER_CUBE:\r
+               case GL_INT_SAMPLER_3D:\r
+               case GL_UNSIGNED_INT_SAMPLER_3D:\r
+               case GL_INT_SAMPLER_2D_ARRAY:\r
+               case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:\r
                case GL_INT_VEC2:\r
                case GL_INT_VEC3:\r
                case GL_INT_VEC4:\r
@@ -128,6 +152,32 @@ namespace es2
                return UniformTypeSize(UniformComponentType(type)) * UniformComponentCount(type);\r
        }\r
 \r
+       bool IsSamplerUniform(GLenum type)\r
+       {\r
+               switch(type)\r
+               {\r
+               case GL_SAMPLER_2D:\r
+               case GL_SAMPLER_CUBE:\r
+               case GL_SAMPLER_EXTERNAL_OES:\r
+               case GL_SAMPLER_3D_OES:\r
+               case GL_SAMPLER_2D_ARRAY:\r
+               case GL_SAMPLER_2D_SHADOW:\r
+               case GL_SAMPLER_CUBE_SHADOW:\r
+               case GL_SAMPLER_2D_ARRAY_SHADOW:\r
+               case GL_INT_SAMPLER_2D:\r
+               case GL_UNSIGNED_INT_SAMPLER_2D:\r
+               case GL_INT_SAMPLER_CUBE:\r
+               case GL_UNSIGNED_INT_SAMPLER_CUBE:\r
+               case GL_INT_SAMPLER_3D:\r
+               case GL_UNSIGNED_INT_SAMPLER_3D:\r
+               case GL_INT_SAMPLER_2D_ARRAY:\r
+               case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:\r
+                       return true;\r
+               default:\r
+                       return false;\r
+               }\r
+       }\r
+\r
        int VariableRowCount(GLenum type)\r
        {\r
                switch(type)\r
@@ -154,6 +204,18 @@ namespace es2
                case GL_SAMPLER_CUBE:\r
         case GL_SAMPLER_EXTERNAL_OES:\r
                case GL_SAMPLER_3D_OES:\r
+               case GL_SAMPLER_2D_ARRAY:\r
+               case GL_SAMPLER_2D_SHADOW:\r
+               case GL_SAMPLER_CUBE_SHADOW:\r
+               case GL_SAMPLER_2D_ARRAY_SHADOW:\r
+               case GL_INT_SAMPLER_2D:\r
+               case GL_UNSIGNED_INT_SAMPLER_2D:\r
+               case GL_INT_SAMPLER_CUBE:\r
+               case GL_UNSIGNED_INT_SAMPLER_CUBE:\r
+               case GL_INT_SAMPLER_3D:\r
+               case GL_UNSIGNED_INT_SAMPLER_3D:\r
+               case GL_INT_SAMPLER_2D_ARRAY:\r
+               case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:\r
                        return 1;\r
                case GL_FLOAT_MAT2:\r
                case GL_FLOAT_MAT3x2:\r
index 3f504f0..baa699f 100644 (file)
@@ -30,6 +30,7 @@ namespace es2
        unsigned int UniformComponentCount(GLenum type);\r
        GLenum UniformComponentType(GLenum type);\r
        size_t UniformTypeSize(GLenum type);\r
+       bool IsSamplerUniform(GLenum type);\r
        int VariableRowCount(GLenum type);\r
        int VariableColumnCount(GLenum type);\r
 \r