Commit 1c0ad625 by Geoff Lang

Emulate TextureStorage when it is not available.

BUG=angleproject:884 Change-Id: Ie6e809477253502d88f599172eaed17638e58dd3 Reviewed-on: https://chromium-review.googlesource.com/262112Reviewed-by: 's avatarBrandon Jones <bajones@chromium.org> Reviewed-by: 's avatarKenneth Russell <kbr@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 9d3ae5fe
...@@ -223,11 +223,72 @@ gl::Error TextureGL::setStorage(GLenum target, size_t levels, GLenum internalFor ...@@ -223,11 +223,72 @@ gl::Error TextureGL::setStorage(GLenum target, size_t levels, GLenum internalFor
if (UseTexImage2D(mTextureType)) if (UseTexImage2D(mTextureType))
{ {
ASSERT(size.depth == 1); ASSERT(size.depth == 1);
mFunctions->texStorage2D(target, levels, internalFormat, size.width, size.height); if (mFunctions->texStorage2D)
{
mFunctions->texStorage2D(target, levels, internalFormat, size.width, size.height);
}
else
{
// Make sure no pixel unpack buffer is bound
mStateManager->bindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat);
// Internal format must be sized
ASSERT(internalFormatInfo.pixelBytes != 0);
for (size_t level = 0; level < levels; level++)
{
gl::Extents levelSize(std::max(size.width >> level, 1),
std::max(size.height >> level, 1),
1);
if (mTextureType == GL_TEXTURE_2D)
{
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);
}
}
else
{
UNREACHABLE();
}
}
}
} }
else if (UseTexImage3D(mTextureType)) else if (UseTexImage3D(mTextureType))
{ {
mFunctions->texStorage3D(target, levels, internalFormat, size.width, size.height, size.depth); if (mFunctions->texStorage3D)
{
mFunctions->texStorage3D(target, levels, internalFormat, size.width, size.height, size.depth);
}
else
{
// Make sure no pixel unpack buffer is bound
mStateManager->bindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat);
// Internal format must be sized
ASSERT(internalFormatInfo.pixelBytes != 0);
for (size_t i = 0; i < levels; i++)
{
gl::Extents levelSize(std::max(size.width >> i, 1),
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);
}
}
} }
else else
{ {
......
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