Handle compressed texture formats in the emulated TextureStorage for TextureGL.
BUG=angleproject:884
Change-Id: Id54d9ff2845af52807161e0b589d8b76cfba412d
Reviewed-on: https://chromium-review.googlesource.com/272424
Reviewed-by: Kenneth Russell <kbr@chromium.org>
Reviewed-by: Brandon Jones <bajones@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/gl/TextureGL.cpp b/src/libANGLE/renderer/gl/TextureGL.cpp
index f06c1c8..1860615 100644
--- a/src/libANGLE/renderer/gl/TextureGL.cpp
+++ b/src/libANGLE/renderer/gl/TextureGL.cpp
@@ -267,15 +267,33 @@
if (mTextureType == GL_TEXTURE_2D)
{
- mFunctions->texImage2D(target, level, internalFormat, levelSize.width, levelSize.height,
- 0, internalFormatInfo.format, internalFormatInfo.type, nullptr);
+ if (internalFormatInfo.compressed)
+ {
+ size_t dataSize = internalFormatInfo.computeBlockSize(GL_UNSIGNED_BYTE, levelSize.width, levelSize.height);
+ mFunctions->compressedTexImage2D(target, level, internalFormat, levelSize.width, levelSize.height,
+ 0, dataSize, nullptr);
+ }
+ else
+ {
+ mFunctions->texImage2D(target, level, internalFormat, levelSize.width, levelSize.height,
+ 0, internalFormatInfo.format, internalFormatInfo.type, nullptr);
+ }
}
else if (mTextureType == GL_TEXTURE_CUBE_MAP)
{
for (GLenum face = gl::FirstCubeMapTextureTarget; face <= gl::LastCubeMapTextureTarget; face++)
{
- mFunctions->texImage2D(face, level, internalFormat, levelSize.width, levelSize.height,
- 0, internalFormatInfo.format, internalFormatInfo.type, nullptr);
+ if (internalFormatInfo.compressed)
+ {
+ size_t dataSize = internalFormatInfo.computeBlockSize(GL_UNSIGNED_BYTE, levelSize.width, levelSize.height);
+ mFunctions->compressedTexImage2D(face, level, internalFormat, levelSize.width, levelSize.height,
+ 0, dataSize, nullptr);
+ }
+ else
+ {
+ mFunctions->texImage2D(face, level, internalFormat, levelSize.width, levelSize.height,
+ 0, internalFormatInfo.format, internalFormatInfo.type, nullptr);
+ }
}
}
else
@@ -307,8 +325,17 @@
std::max(size.height >> i, 1),
mTextureType == GL_TEXTURE_3D ? std::max(size.depth >> i, 1) : size.depth);
- mFunctions->texImage3D(target, i, internalFormat, levelSize.width, levelSize.height, levelSize.depth,
- 0, internalFormatInfo.format, internalFormatInfo.type, nullptr);
+ if (internalFormatInfo.compressed)
+ {
+ size_t dataSize = internalFormatInfo.computeBlockSize(GL_UNSIGNED_BYTE, levelSize.width, levelSize.height) * levelSize.depth;
+ mFunctions->compressedTexImage3D(target, i, internalFormat, levelSize.width, levelSize.height, levelSize.depth,
+ 0, dataSize, nullptr);
+ }
+ else
+ {
+ mFunctions->texImage3D(target, i, internalFormat, levelSize.width, levelSize.height, levelSize.depth,
+ 0, internalFormatInfo.format, internalFormatInfo.type, nullptr);
+ }
}
}
}