Commit 8eada888 by Alexis Hetu Committed by Alexis Hétu

Handling proper sampler types

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/3610Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 5b9d7ebf
...@@ -2552,23 +2552,37 @@ namespace glsl ...@@ -2552,23 +2552,37 @@ namespace glsl
else UNREACHABLE(0); else UNREACHABLE(0);
break; break;
case EbtSampler2D: case EbtSampler2D:
return GL_SAMPLER_2D;
case EbtISampler2D: case EbtISampler2D:
return GL_INT_SAMPLER_2D;
case EbtUSampler2D: case EbtUSampler2D:
return GL_SAMPLER_2D; return GL_UNSIGNED_INT_SAMPLER_2D;
case EbtSamplerCube: case EbtSamplerCube:
return GL_SAMPLER_CUBE;
case EbtISamplerCube: case EbtISamplerCube:
return GL_INT_SAMPLER_CUBE;
case EbtUSamplerCube: case EbtUSamplerCube:
return GL_SAMPLER_CUBE; return GL_UNSIGNED_INT_SAMPLER_CUBE;
case EbtSamplerExternalOES: case EbtSamplerExternalOES:
return GL_SAMPLER_EXTERNAL_OES; return GL_SAMPLER_EXTERNAL_OES;
case EbtSampler3D: case EbtSampler3D:
return GL_SAMPLER_3D_OES;
case EbtISampler3D: case EbtISampler3D:
return GL_INT_SAMPLER_3D;
case EbtUSampler3D: case EbtUSampler3D:
return GL_SAMPLER_3D_OES; return GL_UNSIGNED_INT_SAMPLER_3D;
case EbtSampler2DArray: case EbtSampler2DArray:
return GL_SAMPLER_2D_ARRAY;
case EbtISampler2DArray: case EbtISampler2DArray:
return GL_INT_SAMPLER_2D_ARRAY;
case EbtUSampler2DArray: 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: default:
UNREACHABLE(type.getBasicType()); UNREACHABLE(type.getBasicType());
break; break;
......
...@@ -630,11 +630,7 @@ namespace es2 ...@@ -630,11 +630,7 @@ namespace es2
count = std::min(size - (int)uniformIndex[location].element, count); count = std::min(size - (int)uniformIndex[location].element, count);
if(targetUniform->type == GL_INT || if(targetUniform->type == GL_INT || IsSamplerUniform(targetUniform->type))
targetUniform->type == GL_SAMPLER_2D ||
targetUniform->type == GL_SAMPLER_CUBE ||
targetUniform->type == GL_SAMPLER_EXTERNAL_OES ||
targetUniform->type == GL_SAMPLER_3D_OES)
{ {
memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLint), memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLint),
v, sizeof(GLint) * count); v, sizeof(GLint) * count);
...@@ -753,11 +749,7 @@ namespace es2 ...@@ -753,11 +749,7 @@ namespace es2
count = std::min(size - (int)uniformIndex[location].element, count); count = std::min(size - (int)uniformIndex[location].element, count);
if(targetUniform->type == GL_INT || if(targetUniform->type == GL_INT || IsSamplerUniform(targetUniform->type))
targetUniform->type == GL_SAMPLER_2D ||
targetUniform->type == GL_SAMPLER_CUBE ||
targetUniform->type == GL_SAMPLER_EXTERNAL_OES ||
targetUniform->type == GL_SAMPLER_3D_OES)
{ {
memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLuint), memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLuint),
v, sizeof(GLuint)* count); v, sizeof(GLuint)* count);
...@@ -1066,6 +1058,18 @@ namespace es2 ...@@ -1066,6 +1058,18 @@ namespace es2
case GL_SAMPLER_CUBE: case GL_SAMPLER_CUBE:
case GL_SAMPLER_EXTERNAL_OES: case GL_SAMPLER_EXTERNAL_OES:
case GL_SAMPLER_3D_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: applyUniform1iv(location, size, i); break;
case GL_INT_VEC2: applyUniform2iv(location, size, i); break; case GL_INT_VEC2: applyUniform2iv(location, size, i); break;
case GL_INT_VEC3: applyUniform3iv(location, size, i); break; case GL_INT_VEC3: applyUniform3iv(location, size, i); break;
...@@ -1347,7 +1351,7 @@ namespace es2 ...@@ -1347,7 +1351,7 @@ namespace es2
bool Program::defineUniform(GLenum shader, GLenum type, GLenum precision, const std::string &name, unsigned int arraySize, int registerIndex) 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; int index = registerIndex;
...@@ -1362,10 +1366,22 @@ namespace es2 ...@@ -1362,10 +1366,22 @@ namespace es2
switch(type) switch(type)
{ {
default: UNREACHABLE(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_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_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_3D_OES: samplersVS[index].textureType = TEXTURE_3D; break;
case GL_SAMPLER_EXTERNAL_OES: samplersVS[index].textureType = TEXTURE_EXTERNAL; 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; samplersVS[index].logicalTextureUnit = 0;
...@@ -1385,10 +1401,22 @@ namespace es2 ...@@ -1385,10 +1401,22 @@ namespace es2
switch(type) switch(type)
{ {
default: UNREACHABLE(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_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_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_3D_OES: samplersPS[index].textureType = TEXTURE_3D; break;
case GL_SAMPLER_EXTERNAL_OES: samplersPS[index].textureType = TEXTURE_EXTERNAL; 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; samplersPS[index].logicalTextureUnit = 0;
...@@ -1953,10 +1981,7 @@ namespace es2 ...@@ -1953,10 +1981,7 @@ namespace es2
if(targetUniform->psRegisterIndex != -1) if(targetUniform->psRegisterIndex != -1)
{ {
if(targetUniform->type == GL_SAMPLER_2D || if(IsSamplerUniform(targetUniform->type))
targetUniform->type == GL_SAMPLER_CUBE ||
targetUniform->type == GL_SAMPLER_EXTERNAL_OES ||
targetUniform->type == GL_SAMPLER_3D_OES)
{ {
for(int i = 0; i < count; i++) for(int i = 0; i < count; i++)
{ {
...@@ -1977,10 +2002,7 @@ namespace es2 ...@@ -1977,10 +2002,7 @@ namespace es2
if(targetUniform->vsRegisterIndex != -1) if(targetUniform->vsRegisterIndex != -1)
{ {
if(targetUniform->type == GL_SAMPLER_2D || if(IsSamplerUniform(targetUniform->type))
targetUniform->type == GL_SAMPLER_CUBE ||
targetUniform->type == GL_SAMPLER_EXTERNAL_OES ||
targetUniform->type == GL_SAMPLER_3D_OES)
{ {
for(int i = 0; i < count; i++) for(int i = 0; i < count; i++)
{ {
...@@ -2105,10 +2127,7 @@ namespace es2 ...@@ -2105,10 +2127,7 @@ namespace es2
if(targetUniform->psRegisterIndex != -1) if(targetUniform->psRegisterIndex != -1)
{ {
if(targetUniform->type == GL_SAMPLER_2D || if(IsSamplerUniform(targetUniform->type))
targetUniform->type == GL_SAMPLER_CUBE ||
targetUniform->type == GL_SAMPLER_EXTERNAL_OES ||
targetUniform->type == GL_SAMPLER_3D_OES)
{ {
for(int i = 0; i < count; i++) for(int i = 0; i < count; i++)
{ {
...@@ -2129,10 +2148,7 @@ namespace es2 ...@@ -2129,10 +2148,7 @@ namespace es2
if(targetUniform->vsRegisterIndex != -1) if(targetUniform->vsRegisterIndex != -1)
{ {
if(targetUniform->type == GL_SAMPLER_2D || if(IsSamplerUniform(targetUniform->type))
targetUniform->type == GL_SAMPLER_CUBE ||
targetUniform->type == GL_SAMPLER_EXTERNAL_OES ||
targetUniform->type == GL_SAMPLER_3D_OES)
{ {
for(int i = 0; i < count; i++) for(int i = 0; i < count; i++)
{ {
......
...@@ -34,6 +34,18 @@ namespace es2 ...@@ -34,6 +34,18 @@ namespace es2
case GL_SAMPLER_CUBE: case GL_SAMPLER_CUBE:
case GL_SAMPLER_EXTERNAL_OES: case GL_SAMPLER_EXTERNAL_OES:
case GL_SAMPLER_3D_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; return 1;
case GL_BOOL_VEC2: case GL_BOOL_VEC2:
case GL_FLOAT_VEC2: case GL_FLOAT_VEC2:
...@@ -99,6 +111,18 @@ namespace es2 ...@@ -99,6 +111,18 @@ namespace es2
case GL_SAMPLER_CUBE: case GL_SAMPLER_CUBE:
case GL_SAMPLER_EXTERNAL_OES: case GL_SAMPLER_EXTERNAL_OES:
case GL_SAMPLER_3D_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_VEC2:
case GL_INT_VEC3: case GL_INT_VEC3:
case GL_INT_VEC4: case GL_INT_VEC4:
...@@ -128,6 +152,32 @@ namespace es2 ...@@ -128,6 +152,32 @@ namespace es2
return UniformTypeSize(UniformComponentType(type)) * UniformComponentCount(type); 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) int VariableRowCount(GLenum type)
{ {
switch(type) switch(type)
...@@ -154,6 +204,18 @@ namespace es2 ...@@ -154,6 +204,18 @@ namespace es2
case GL_SAMPLER_CUBE: case GL_SAMPLER_CUBE:
case GL_SAMPLER_EXTERNAL_OES: case GL_SAMPLER_EXTERNAL_OES:
case GL_SAMPLER_3D_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; return 1;
case GL_FLOAT_MAT2: case GL_FLOAT_MAT2:
case GL_FLOAT_MAT3x2: case GL_FLOAT_MAT3x2:
......
...@@ -30,6 +30,7 @@ namespace es2 ...@@ -30,6 +30,7 @@ namespace es2
unsigned int UniformComponentCount(GLenum type); unsigned int UniformComponentCount(GLenum type);
GLenum UniformComponentType(GLenum type); GLenum UniformComponentType(GLenum type);
size_t UniformTypeSize(GLenum type); size_t UniformTypeSize(GLenum type);
bool IsSamplerUniform(GLenum type);
int VariableRowCount(GLenum type); int VariableRowCount(GLenum type);
int VariableColumnCount(GLenum type); int VariableColumnCount(GLenum type);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment