From 8eada888a95dc02d743b6babc391d25fc9ab9fab Mon Sep 17 00:00:00 2001 From: Alexis Hetu Date: Tue, 30 Jun 2015 16:27:50 -0400 Subject: [PATCH] Handling proper sampler types MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Nicolas Capens --- src/OpenGL/compiler/OutputASM.cpp | 22 +++++++++--- src/OpenGL/libGLESv2/Program.cpp | 70 +++++++++++++++++++++++--------------- src/OpenGL/libGLESv2/utilities.cpp | 62 +++++++++++++++++++++++++++++++++ src/OpenGL/libGLESv2/utilities.h | 1 + 4 files changed, 124 insertions(+), 31 deletions(-) diff --git a/src/OpenGL/compiler/OutputASM.cpp b/src/OpenGL/compiler/OutputASM.cpp index 72d77830d..4fb41262e 100644 --- a/src/OpenGL/compiler/OutputASM.cpp +++ b/src/OpenGL/compiler/OutputASM.cpp @@ -2552,23 +2552,37 @@ namespace glsl else UNREACHABLE(0); break; case EbtSampler2D: + return GL_SAMPLER_2D; case EbtISampler2D: + return GL_INT_SAMPLER_2D; case EbtUSampler2D: - return GL_SAMPLER_2D; + return GL_UNSIGNED_INT_SAMPLER_2D; case EbtSamplerCube: + return GL_SAMPLER_CUBE; case EbtISamplerCube: + return GL_INT_SAMPLER_CUBE; case EbtUSamplerCube: - return GL_SAMPLER_CUBE; + return GL_UNSIGNED_INT_SAMPLER_CUBE; case EbtSamplerExternalOES: return GL_SAMPLER_EXTERNAL_OES; case EbtSampler3D: + return GL_SAMPLER_3D_OES; case EbtISampler3D: + return GL_INT_SAMPLER_3D; case EbtUSampler3D: - return GL_SAMPLER_3D_OES; + return GL_UNSIGNED_INT_SAMPLER_3D; case EbtSampler2DArray: + return GL_SAMPLER_2D_ARRAY; case EbtISampler2DArray: + return GL_INT_SAMPLER_2D_ARRAY; case EbtUSampler2DArray: - return GL_SAMPLER_2D_ARRAY; + return GL_UNSIGNED_INT_SAMPLER_2D_ARRAY; + case EbtSampler2DShadow: + return GL_SAMPLER_2D_SHADOW; + case EbtSamplerCubeShadow: + return GL_SAMPLER_CUBE_SHADOW; + case EbtSampler2DArrayShadow: + return GL_SAMPLER_2D_ARRAY_SHADOW; default: UNREACHABLE(type.getBasicType()); break; diff --git a/src/OpenGL/libGLESv2/Program.cpp b/src/OpenGL/libGLESv2/Program.cpp index 636a07371..dd4c598e7 100644 --- a/src/OpenGL/libGLESv2/Program.cpp +++ b/src/OpenGL/libGLESv2/Program.cpp @@ -630,11 +630,7 @@ namespace es2 count = std::min(size - (int)uniformIndex[location].element, count); - if(targetUniform->type == GL_INT || - targetUniform->type == GL_SAMPLER_2D || - targetUniform->type == GL_SAMPLER_CUBE || - targetUniform->type == GL_SAMPLER_EXTERNAL_OES || - targetUniform->type == GL_SAMPLER_3D_OES) + if(targetUniform->type == GL_INT || IsSamplerUniform(targetUniform->type)) { memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLint), v, sizeof(GLint) * count); @@ -753,11 +749,7 @@ namespace es2 count = std::min(size - (int)uniformIndex[location].element, count); - if(targetUniform->type == GL_INT || - targetUniform->type == GL_SAMPLER_2D || - targetUniform->type == GL_SAMPLER_CUBE || - targetUniform->type == GL_SAMPLER_EXTERNAL_OES || - targetUniform->type == GL_SAMPLER_3D_OES) + if(targetUniform->type == GL_INT || IsSamplerUniform(targetUniform->type)) { memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLuint), v, sizeof(GLuint)* count); @@ -1066,6 +1058,18 @@ namespace es2 case GL_SAMPLER_CUBE: case GL_SAMPLER_EXTERNAL_OES: case GL_SAMPLER_3D_OES: + case GL_SAMPLER_2D_ARRAY: + case GL_SAMPLER_2D_SHADOW: + case GL_SAMPLER_CUBE_SHADOW: + case GL_SAMPLER_2D_ARRAY_SHADOW: + case GL_INT_SAMPLER_2D: + case GL_UNSIGNED_INT_SAMPLER_2D: + case GL_INT_SAMPLER_CUBE: + case GL_UNSIGNED_INT_SAMPLER_CUBE: + case GL_INT_SAMPLER_3D: + case GL_UNSIGNED_INT_SAMPLER_3D: + case GL_INT_SAMPLER_2D_ARRAY: + case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: case GL_INT: applyUniform1iv(location, size, i); break; case GL_INT_VEC2: applyUniform2iv(location, size, i); break; case GL_INT_VEC3: applyUniform3iv(location, size, i); break; @@ -1347,7 +1351,7 @@ namespace es2 bool Program::defineUniform(GLenum shader, GLenum type, GLenum precision, const std::string &name, unsigned int arraySize, int registerIndex) { - if(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || type == GL_SAMPLER_EXTERNAL_OES || type == GL_SAMPLER_3D_OES) + if(IsSamplerUniform(type)) { int index = registerIndex; @@ -1362,10 +1366,22 @@ namespace es2 switch(type) { default: UNREACHABLE(type); + case GL_INT_SAMPLER_2D: + case GL_UNSIGNED_INT_SAMPLER_2D: + case GL_SAMPLER_2D_SHADOW: case GL_SAMPLER_2D: samplersVS[index].textureType = TEXTURE_2D; break; + case GL_INT_SAMPLER_CUBE: + case GL_UNSIGNED_INT_SAMPLER_CUBE: + case GL_SAMPLER_CUBE_SHADOW: case GL_SAMPLER_CUBE: samplersVS[index].textureType = TEXTURE_CUBE; break; + case GL_INT_SAMPLER_3D: + case GL_UNSIGNED_INT_SAMPLER_3D: case GL_SAMPLER_3D_OES: samplersVS[index].textureType = TEXTURE_3D; break; case GL_SAMPLER_EXTERNAL_OES: samplersVS[index].textureType = TEXTURE_EXTERNAL; break; + case GL_INT_SAMPLER_2D_ARRAY: + case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: + case GL_SAMPLER_2D_ARRAY_SHADOW: + case GL_SAMPLER_2D_ARRAY: samplersVS[index].textureType = TEXTURE_2D_ARRAY; break; } samplersVS[index].logicalTextureUnit = 0; @@ -1385,10 +1401,22 @@ namespace es2 switch(type) { default: UNREACHABLE(type); + case GL_INT_SAMPLER_2D: + case GL_UNSIGNED_INT_SAMPLER_2D: + case GL_SAMPLER_2D_SHADOW: case GL_SAMPLER_2D: samplersPS[index].textureType = TEXTURE_2D; break; + case GL_INT_SAMPLER_CUBE: + case GL_UNSIGNED_INT_SAMPLER_CUBE: + case GL_SAMPLER_CUBE_SHADOW: case GL_SAMPLER_CUBE: samplersPS[index].textureType = TEXTURE_CUBE; break; + case GL_INT_SAMPLER_3D: + case GL_UNSIGNED_INT_SAMPLER_3D: case GL_SAMPLER_3D_OES: samplersPS[index].textureType = TEXTURE_3D; break; case GL_SAMPLER_EXTERNAL_OES: samplersPS[index].textureType = TEXTURE_EXTERNAL; break; + case GL_INT_SAMPLER_2D_ARRAY: + case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: + case GL_SAMPLER_2D_ARRAY_SHADOW: + case GL_SAMPLER_2D_ARRAY: samplersPS[index].textureType = TEXTURE_2D_ARRAY; break; } samplersPS[index].logicalTextureUnit = 0; @@ -1953,10 +1981,7 @@ namespace es2 if(targetUniform->psRegisterIndex != -1) { - if(targetUniform->type == GL_SAMPLER_2D || - targetUniform->type == GL_SAMPLER_CUBE || - targetUniform->type == GL_SAMPLER_EXTERNAL_OES || - targetUniform->type == GL_SAMPLER_3D_OES) + if(IsSamplerUniform(targetUniform->type)) { for(int i = 0; i < count; i++) { @@ -1977,10 +2002,7 @@ namespace es2 if(targetUniform->vsRegisterIndex != -1) { - if(targetUniform->type == GL_SAMPLER_2D || - targetUniform->type == GL_SAMPLER_CUBE || - targetUniform->type == GL_SAMPLER_EXTERNAL_OES || - targetUniform->type == GL_SAMPLER_3D_OES) + if(IsSamplerUniform(targetUniform->type)) { for(int i = 0; i < count; i++) { @@ -2105,10 +2127,7 @@ namespace es2 if(targetUniform->psRegisterIndex != -1) { - if(targetUniform->type == GL_SAMPLER_2D || - targetUniform->type == GL_SAMPLER_CUBE || - targetUniform->type == GL_SAMPLER_EXTERNAL_OES || - targetUniform->type == GL_SAMPLER_3D_OES) + if(IsSamplerUniform(targetUniform->type)) { for(int i = 0; i < count; i++) { @@ -2129,10 +2148,7 @@ namespace es2 if(targetUniform->vsRegisterIndex != -1) { - if(targetUniform->type == GL_SAMPLER_2D || - targetUniform->type == GL_SAMPLER_CUBE || - targetUniform->type == GL_SAMPLER_EXTERNAL_OES || - targetUniform->type == GL_SAMPLER_3D_OES) + if(IsSamplerUniform(targetUniform->type)) { for(int i = 0; i < count; i++) { diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp index 001e88df9..ea19dafae 100644 --- a/src/OpenGL/libGLESv2/utilities.cpp +++ b/src/OpenGL/libGLESv2/utilities.cpp @@ -34,6 +34,18 @@ namespace es2 case GL_SAMPLER_CUBE: case GL_SAMPLER_EXTERNAL_OES: case GL_SAMPLER_3D_OES: + case GL_SAMPLER_2D_ARRAY: + case GL_SAMPLER_2D_SHADOW: + case GL_SAMPLER_CUBE_SHADOW: + case GL_SAMPLER_2D_ARRAY_SHADOW: + case GL_INT_SAMPLER_2D: + case GL_UNSIGNED_INT_SAMPLER_2D: + case GL_INT_SAMPLER_CUBE: + case GL_UNSIGNED_INT_SAMPLER_CUBE: + case GL_INT_SAMPLER_3D: + case GL_UNSIGNED_INT_SAMPLER_3D: + case GL_INT_SAMPLER_2D_ARRAY: + case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: return 1; case GL_BOOL_VEC2: case GL_FLOAT_VEC2: @@ -99,6 +111,18 @@ namespace es2 case GL_SAMPLER_CUBE: case GL_SAMPLER_EXTERNAL_OES: case GL_SAMPLER_3D_OES: + case GL_SAMPLER_2D_ARRAY: + case GL_SAMPLER_2D_SHADOW: + case GL_SAMPLER_CUBE_SHADOW: + case GL_SAMPLER_2D_ARRAY_SHADOW: + case GL_INT_SAMPLER_2D: + case GL_UNSIGNED_INT_SAMPLER_2D: + case GL_INT_SAMPLER_CUBE: + case GL_UNSIGNED_INT_SAMPLER_CUBE: + case GL_INT_SAMPLER_3D: + case GL_UNSIGNED_INT_SAMPLER_3D: + case GL_INT_SAMPLER_2D_ARRAY: + case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: case GL_INT_VEC2: case GL_INT_VEC3: case GL_INT_VEC4: @@ -128,6 +152,32 @@ namespace es2 return UniformTypeSize(UniformComponentType(type)) * UniformComponentCount(type); } + bool IsSamplerUniform(GLenum type) + { + switch(type) + { + case GL_SAMPLER_2D: + case GL_SAMPLER_CUBE: + case GL_SAMPLER_EXTERNAL_OES: + case GL_SAMPLER_3D_OES: + case GL_SAMPLER_2D_ARRAY: + case GL_SAMPLER_2D_SHADOW: + case GL_SAMPLER_CUBE_SHADOW: + case GL_SAMPLER_2D_ARRAY_SHADOW: + case GL_INT_SAMPLER_2D: + case GL_UNSIGNED_INT_SAMPLER_2D: + case GL_INT_SAMPLER_CUBE: + case GL_UNSIGNED_INT_SAMPLER_CUBE: + case GL_INT_SAMPLER_3D: + case GL_UNSIGNED_INT_SAMPLER_3D: + case GL_INT_SAMPLER_2D_ARRAY: + case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: + return true; + default: + return false; + } + } + int VariableRowCount(GLenum type) { switch(type) @@ -154,6 +204,18 @@ namespace es2 case GL_SAMPLER_CUBE: case GL_SAMPLER_EXTERNAL_OES: case GL_SAMPLER_3D_OES: + case GL_SAMPLER_2D_ARRAY: + case GL_SAMPLER_2D_SHADOW: + case GL_SAMPLER_CUBE_SHADOW: + case GL_SAMPLER_2D_ARRAY_SHADOW: + case GL_INT_SAMPLER_2D: + case GL_UNSIGNED_INT_SAMPLER_2D: + case GL_INT_SAMPLER_CUBE: + case GL_UNSIGNED_INT_SAMPLER_CUBE: + case GL_INT_SAMPLER_3D: + case GL_UNSIGNED_INT_SAMPLER_3D: + case GL_INT_SAMPLER_2D_ARRAY: + case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: return 1; case GL_FLOAT_MAT2: case GL_FLOAT_MAT3x2: diff --git a/src/OpenGL/libGLESv2/utilities.h b/src/OpenGL/libGLESv2/utilities.h index 3f504f031..baa699fe3 100644 --- a/src/OpenGL/libGLESv2/utilities.h +++ b/src/OpenGL/libGLESv2/utilities.h @@ -30,6 +30,7 @@ namespace es2 unsigned int UniformComponentCount(GLenum type); GLenum UniformComponentType(GLenum type); size_t UniformTypeSize(GLenum type); + bool IsSamplerUniform(GLenum type); int VariableRowCount(GLenum type); int VariableColumnCount(GLenum type); -- 2.11.0