diff options
-rw-r--r-- | chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp index fb0e4864f45..d3ac999806f 100644 --- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp +++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp @@ -1558,12 +1558,25 @@ angle::Result TextureVk::redefineLevel(const gl::Context *context, if (mImage != nullptr) { - // If there is any staged changes for this index, we can remove them since we're going to + // If there are any staged changes for this index, we can remove them since we're going to // override them with this call. gl::LevelIndex levelIndexGL(index.getLevelIndex()); uint32_t layerIndex = index.hasLayer() ? index.getLayerIndex() : 0; - mImage->removeSingleSubresourceStagedUpdates(contextVk, levelIndexGL, layerIndex, - index.getLayerCount()); + if (gl::IsArrayTextureType(index.getType())) + { + // A multi-layer texture is being redefined, remove all updates to this level; the + // number of layers may have changed. + mImage->removeStagedUpdates(contextVk, levelIndexGL, levelIndexGL); + } + else + { + // Otherwise remove only updates to this layer. For example, cube map updates can be + // done through glTexImage2D, one per cube face (i.e. layer) and so should not remove + // updates to the other layers. + ASSERT(index.getLayerCount() == 1); + mImage->removeSingleSubresourceStagedUpdates(contextVk, levelIndexGL, layerIndex, + index.getLayerCount()); + } if (mImage->valid()) { |