Commit f4e794ec by Geoff Lang

In TextureD3D_2D, don't call Image::redefine directly.

Call the TextureD3D_2D::redefine member which will not make unnecessary modifications to the image and lets the member serve as a callback for redefined images. BUG=angleproject:970 Change-Id: I511310ebfd4d6133219bbef82c53747f9454aee0 Reviewed-on: https://chromium-review.googlesource.com/293904Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 87d3fe04
...@@ -707,7 +707,7 @@ gl::Error TextureD3D_2D::setImage(GLenum target, ...@@ -707,7 +707,7 @@ gl::Error TextureD3D_2D::setImage(GLenum target,
bool fastUnpacked = false; bool fastUnpacked = false;
GLint level = static_cast<GLint>(imageLevel); GLint level = static_cast<GLint>(imageLevel);
redefineImage(level, sizedInternalFormat, size); redefineImage(level, sizedInternalFormat, size, false);
gl::ImageIndex index = gl::ImageIndex::Make2D(level); gl::ImageIndex index = gl::ImageIndex::Make2D(level);
...@@ -797,7 +797,7 @@ gl::Error TextureD3D_2D::setCompressedImage(GLenum target, ...@@ -797,7 +797,7 @@ gl::Error TextureD3D_2D::setCompressedImage(GLenum target,
GLint level = static_cast<GLint>(imageLevel); GLint level = static_cast<GLint>(imageLevel);
// compressed formats don't have separate sized internal formats-- we can just use the compressed format directly // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly
redefineImage(level, internalFormat, size); redefineImage(level, internalFormat, size, false);
return TextureD3D::setCompressedImage(gl::ImageIndex::Make2D(level), unpack, pixels, 0); return TextureD3D::setCompressedImage(gl::ImageIndex::Make2D(level), unpack, pixels, 0);
} }
...@@ -827,7 +827,8 @@ gl::Error TextureD3D_2D::copyImage(GLenum target, ...@@ -827,7 +827,8 @@ gl::Error TextureD3D_2D::copyImage(GLenum target,
GLint level = static_cast<GLint>(imageLevel); GLint level = static_cast<GLint>(imageLevel);
GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalFormat, GL_UNSIGNED_BYTE); GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalFormat, GL_UNSIGNED_BYTE);
redefineImage(level, sizedInternalFormat, gl::Extents(sourceArea.width, sourceArea.height, 1)); redefineImage(level, sizedInternalFormat, gl::Extents(sourceArea.width, sourceArea.height, 1),
false);
gl::ImageIndex index = gl::ImageIndex::Make2D(level); gl::ImageIndex index = gl::ImageIndex::Make2D(level);
gl::Offset destOffset(0, 0, 0); gl::Offset destOffset(0, 0, 0);
...@@ -931,12 +932,12 @@ gl::Error TextureD3D_2D::setStorage(GLenum target, size_t levels, GLenum interna ...@@ -931,12 +932,12 @@ gl::Error TextureD3D_2D::setStorage(GLenum target, size_t levels, GLenum interna
gl::Extents levelSize(std::max(1, size.width >> level), gl::Extents levelSize(std::max(1, size.width >> level),
std::max(1, size.height >> level), std::max(1, size.height >> level),
1); 1);
mImageArray[level]->redefine(GL_TEXTURE_2D, internalFormat, levelSize, true); redefineImage(level, internalFormat, levelSize, true);
} }
for (size_t level = levels; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++) for (size_t level = levels; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
{ {
mImageArray[level]->redefine(GL_TEXTURE_2D, GL_NONE, gl::Extents(0, 0, 0), true); redefineImage(level, GL_NONE, gl::Extents(0, 0, 1), true);
} }
// TODO(geofflang): Verify storage creation had no errors // TODO(geofflang): Verify storage creation had no errors
...@@ -968,7 +969,7 @@ void TextureD3D_2D::bindTexImage(egl::Surface *surface) ...@@ -968,7 +969,7 @@ void TextureD3D_2D::bindTexImage(egl::Surface *surface)
GLenum internalformat = surface->getConfig()->renderTargetFormat; GLenum internalformat = surface->getConfig()->renderTargetFormat;
gl::Extents size(surface->getWidth(), surface->getHeight(), 1); gl::Extents size(surface->getWidth(), surface->getHeight(), 1);
mImageArray[0]->redefine(GL_TEXTURE_2D, internalformat, size, true); redefineImage(0, internalformat, size, true);
if (mTexStorage) if (mTexStorage)
{ {
...@@ -1012,7 +1013,7 @@ void TextureD3D_2D::initMipmapsImages() ...@@ -1012,7 +1013,7 @@ void TextureD3D_2D::initMipmapsImages()
std::max(getBaseLevelHeight() >> level, 1), std::max(getBaseLevelHeight() >> level, 1),
1); 1);
redefineImage(level, getBaseLevelInternalFormat(), levelSize); redefineImage(level, getBaseLevelInternalFormat(), levelSize, false);
} }
} }
...@@ -1222,7 +1223,10 @@ gl::Error TextureD3D_2D::updateStorageLevel(int level) ...@@ -1222,7 +1223,10 @@ gl::Error TextureD3D_2D::updateStorageLevel(int level)
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
void TextureD3D_2D::redefineImage(GLint level, GLenum internalformat, const gl::Extents &size) void TextureD3D_2D::redefineImage(size_t level,
GLenum internalformat,
const gl::Extents &size,
bool forceRelease)
{ {
ASSERT(size.depth == 1); ASSERT(size.depth == 1);
...@@ -1231,18 +1235,18 @@ void TextureD3D_2D::redefineImage(GLint level, GLenum internalformat, const gl:: ...@@ -1231,18 +1235,18 @@ void TextureD3D_2D::redefineImage(GLint level, GLenum internalformat, const gl::
const int storageHeight = std::max(1, getBaseLevelHeight() >> level); const int storageHeight = std::max(1, getBaseLevelHeight() >> level);
const GLenum storageFormat = getBaseLevelInternalFormat(); const GLenum storageFormat = getBaseLevelInternalFormat();
mImageArray[level]->redefine(GL_TEXTURE_2D, internalformat, size, false); mImageArray[level]->redefine(GL_TEXTURE_2D, internalformat, size, forceRelease);
if (mTexStorage) if (mTexStorage)
{ {
const int storageLevels = mTexStorage->getLevelCount(); const size_t storageLevels = mTexStorage->getLevelCount();
if ((level >= storageLevels && storageLevels != 0) || if ((level >= storageLevels && storageLevels != 0) ||
size.width != storageWidth || size.width != storageWidth ||
size.height != storageHeight || size.height != storageHeight ||
internalformat != storageFormat) // Discard mismatched storage internalformat != storageFormat) // Discard mismatched storage
{ {
for (int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) for (size_t i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{ {
mImageArray[i]->markDirty(); mImageArray[i]->markDirty();
} }
......
...@@ -169,7 +169,10 @@ class TextureD3D_2D : public TextureD3D ...@@ -169,7 +169,10 @@ class TextureD3D_2D : public TextureD3D
gl::Error updateStorageLevel(int level); gl::Error updateStorageLevel(int level);
void redefineImage(GLint level, GLenum internalformat, const gl::Extents &size); void redefineImage(size_t level,
GLenum internalformat,
const gl::Extents &size,
bool forceRelease);
ImageD3D *mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; ImageD3D *mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
}; };
......
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