Fix texture upload format.
We were using the effective sized internal format as the upload format
of glTexImage*() calls. This caused issues when using e.g.
GL_RGBA16F with GL_RGBA / GL_FLOAT.
Change-Id: I2dbd7142447c5330eec1895b1a9652ac20f8414a
Reviewed-on: https://swiftshader-review.googlesource.com/16448
Tested-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Lingfeng Yang <lfy@google.com>
Reviewed-by: Lingfeng Yang <lfy@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index f9ad710..e22b252 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -686,7 +686,7 @@
return error(validationError);
}
- texture->setImage(context, level, width, height, depth, sizedInternalFormat, type, context->getUnpackInfo(), data);
+ texture->setImage(context, level, width, height, depth, sizedInternalFormat, format, type, context->getUnpackInfo(), data);
}
}
@@ -3927,6 +3927,7 @@
{
return error(GL_INVALID_ENUM);
}
+ GLenum sizedInternalFormat = GetSizedInternalFormat(internalformat, type);
es2::Context *context = es2::getContext();
@@ -3935,41 +3936,41 @@
switch(target)
{
case GL_TEXTURE_2D:
- {
- es2::Texture2D *texture = context->getTexture2D();
- if(!texture || texture->name == 0 || texture->getImmutableFormat() == GL_TRUE)
{
- return error(GL_INVALID_OPERATION);
- }
+ es2::Texture2D *texture = context->getTexture2D();
+ if(!texture || texture->name == 0 || texture->getImmutableFormat() == GL_TRUE)
+ {
+ return error(GL_INVALID_OPERATION);
+ }
- for(int level = 0; level < levels; ++level)
- {
- texture->setImage(context, level, width, height, GetSizedInternalFormat(internalformat, type), type, context->getUnpackInfo(), nullptr);
- width = std::max(1, (width / 2));
- height = std::max(1, (height / 2));
+ for(int level = 0; level < levels; level++)
+ {
+ texture->setImage(context, level, width, height, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackInfo(), nullptr);
+ width = std::max(1, (width / 2));
+ height = std::max(1, (height / 2));
+ }
+ texture->makeImmutable(levels);
}
- texture->makeImmutable(levels);
- }
break;
case GL_TEXTURE_CUBE_MAP:
- {
- es2::TextureCubeMap *texture = context->getTextureCubeMap();
- if(!texture || texture->name == 0 || texture->getImmutableFormat())
{
- return error(GL_INVALID_OPERATION);
- }
-
- for(int level = 0; level < levels; ++level)
- {
- for(int face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; ++face)
+ es2::TextureCubeMap *texture = context->getTextureCubeMap();
+ if(!texture || texture->name == 0 || texture->getImmutableFormat())
{
- texture->setImage(context, face, level, width, height, GetSizedInternalFormat(internalformat, type), type, context->getUnpackInfo(), nullptr);
+ return error(GL_INVALID_OPERATION);
}
- width = std::max(1, (width / 2));
- height = std::max(1, (height / 2));
+
+ for(int level = 0; level < levels; level++)
+ {
+ for(int face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; face++)
+ {
+ texture->setImage(context, face, level, width, height, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackInfo(), nullptr);
+ }
+ width = std::max(1, (width / 2));
+ height = std::max(1, (height / 2));
+ }
+ texture->makeImmutable(levels);
}
- texture->makeImmutable(levels);
- }
break;
default:
return error(GL_INVALID_ENUM);
@@ -3992,6 +3993,7 @@
{
return error(GL_INVALID_ENUM);
}
+ GLenum sizedInternalFormat = GetSizedInternalFormat(internalformat, type);
es2::Context *context = es2::getContext();
@@ -4000,52 +4002,52 @@
switch(target)
{
case GL_TEXTURE_3D:
- {
- if(levels > es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS || levels > (log2(std::max(std::max(width, height), depth)) + 1))
{
- return error(GL_INVALID_OPERATION);
- }
+ if(levels > es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS || levels > (log2(std::max(std::max(width, height), depth)) + 1))
+ {
+ return error(GL_INVALID_OPERATION);
+ }
- es2::Texture3D *texture = context->getTexture3D();
- if(!texture || texture->name == 0 || texture->getImmutableFormat() == GL_TRUE)
- {
- return error(GL_INVALID_OPERATION);
- }
+ es2::Texture3D *texture = context->getTexture3D();
+ if(!texture || texture->name == 0 || texture->getImmutableFormat() == GL_TRUE)
+ {
+ return error(GL_INVALID_OPERATION);
+ }
- for(int level = 0; level < levels; ++level)
- {
- texture->setImage(context, level, width, height, depth, GetSizedInternalFormat(internalformat, type), type, context->getUnpackInfo(), nullptr);
- width = std::max(1, (width / 2));
- height = std::max(1, (height / 2));
- depth = std::max(1, (depth / 2));
+ for(int level = 0; level < levels; level++)
+ {
+ texture->setImage(context, level, width, height, depth, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackInfo(), nullptr);
+ width = std::max(1, (width / 2));
+ height = std::max(1, (height / 2));
+ depth = std::max(1, (depth / 2));
+ }
+ texture->makeImmutable(levels);
}
- texture->makeImmutable(levels);
- }
break;
case GL_TEXTURE_2D_ARRAY:
- {
- if(levels > es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS || levels > (log2(std::max(width, height)) + 1))
{
- return error(GL_INVALID_OPERATION);
- }
-
- es2::Texture3D *texture = context->getTexture2DArray();
- if(!texture || texture->name == 0 || texture->getImmutableFormat())
- {
- return error(GL_INVALID_OPERATION);
- }
-
- for(int level = 0; level < levels; ++level)
- {
- for(int face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; ++face)
+ if(levels > es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS || levels > (log2(std::max(width, height)) + 1))
{
- texture->setImage(context, level, width, height, depth, GetSizedInternalFormat(internalformat, type), type, context->getUnpackInfo(), nullptr);
+ return error(GL_INVALID_OPERATION);
}
- width = std::max(1, (width / 2));
- height = std::max(1, (height / 2));
+
+ es2::Texture3D *texture = context->getTexture2DArray();
+ if(!texture || texture->name == 0 || texture->getImmutableFormat())
+ {
+ return error(GL_INVALID_OPERATION);
+ }
+
+ for(int level = 0; level < levels; level++)
+ {
+ for(int face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; face++)
+ {
+ texture->setImage(context, level, width, height, depth, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackInfo(), nullptr);
+ }
+ width = std::max(1, (width / 2));
+ height = std::max(1, (height / 2));
+ }
+ texture->makeImmutable(levels);
}
- texture->makeImmutable(levels);
- }
break;
default:
return error(GL_INVALID_ENUM);