diff --git a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp index 21485ee14c..5f8a1b2c00 100644 --- a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp +++ b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp @@ -470,6 +470,14 @@ void FramebufferVk::destroy(const gl::Context *context) { ContextVk *contextVk = vk::GetImpl(context); + // mFragmentShadingRateImage is embedded by value. startNewRenderPass() may + // have stored its address in the open render pass's attachment list as a + // bare ImageHelper*. gl::Framebuffer is not refcounted, so the heap slot + // backing this embedded member is freed synchronously after we return. + // Clear the reference now, before it dangles. releaseImage() does not do + // this; only releaseImageFromShareContexts() does. + contextVk->finalizeImageLayout(&mFragmentShadingRateImage, {}); + if (mFragmentShadingRateImage.valid()) { vk::Renderer *renderer = contextVk->getRenderer();