diff --git a/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp b/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp index edee73da58..9d4e43b370 100644 --- a/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp +++ b/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp @@ -8652,16 +8652,13 @@ void SamplerCache::destroy(vk::Renderer *renderer, bool orphanReferencedSamplers { for (auto &iter : mPayload) { - // If the EGL_ANGLE_display_texture_share_group extension is causing some samplers to - // stay alive, stash them in the renderer to be destroyed when possible. - if (!iter.second.unique()) - { - renderer->addSamplerToOrphanList(iter.second); - } - else - { - renderer->onDeallocateHandle(vk::HandleType::Sampler, 1); - } + // If the EGL_ANGLE_display_texture_share_group extension is in use, + // a "unique" sampler may still be referenced by an in-flight command + // buffer belonging to a different ShareGroup (the descriptor write + // copies only the raw VkSampler handle). SamplerHelper carries no + // ResourceUse, so always defer destruction through the orphan list, + // which is gated on queue idle in cleanupOrphanedSamplers(). + renderer->addSamplerToOrphanList(iter.second); } } else diff --git a/src/libANGLE/renderer/vulkan/vk_renderer.cpp b/src/libANGLE/renderer/vulkan/vk_renderer.cpp index 9fd124e604..49b9161d54 100644 --- a/src/libANGLE/renderer/vulkan/vk_renderer.cpp +++ b/src/libANGLE/renderer/vulkan/vk_renderer.cpp @@ -7477,6 +7477,15 @@ bool Renderer::cleanupOrphanedSamplers() return false; } + // SamplerHelper carries no ResourceUse, so we cannot know which in-flight + // command buffers still reference an orphaned sampler through a + // COMBINED_IMAGE_SAMPLER descriptor. Conservatively defer destruction + // until the queue is idle (VUID-vkDestroySampler-sampler-01082). + if (mCommandQueue.isBusy(this)) + { + return false; + } + // Destroy any sampler that is no longer referenced. const size_t samplerCountBefore = mOrphanedSamplers.size(); // Using remove_if to avoid unnecessary reference counter updates.