diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.cpp b/src/libANGLE/renderer/vulkan/vk_helpers.cpp index 672ca4d92a..11355bd7dd 100644 --- a/src/libANGLE/renderer/vulkan/vk_helpers.cpp +++ b/src/libANGLE/renderer/vulkan/vk_helpers.cpp @@ -10645,6 +10645,18 @@ void ImageHelper::pruneSupersededUpdatesForLevel(ContextVk *contextVk, const gl::LevelIndex level, const PruneReason reason) { + // The bounding-box computation below for Clear/ClearAfterInvalidate updates + // depends on |mLayerCount| and |mExtents| (via getDestSubresource() and + // getLevelExtents()). Those are stale defaults (0, {0,0,0}) until the + // VkImage is created, which would shrink a whole-level robust-init Clear's + // box to {0,0,0,1,1,1} and let a single-layer Buffer update wrongly + // supersede it, leaking uninitialized device memory for the remaining + // layers. Defer the prune until the image properties are known. + if (!valid()) + { + return; + } + constexpr VkDeviceSize kSubresourceUpdateSizeBeforePruning = 16 * 1024 * 1024; // 16 MB constexpr int kUpdateCountThreshold = 1024; SubresourceUpdates *levelUpdates = getLevelUpdates(level);