--- a/src/libANGLE/renderer/vulkan/VkImageImageSiblingVk.cpp +++ b/src/libANGLE/renderer/vulkan/VkImageImageSiblingVk.cpp @@ -53,6 +53,19 @@ angle::Result VkImageImageSiblingVk::initImpl(DisplayVk *displayVk) ? vk::ImageFormatSupport::Renderable : vk::ImageFormatSupport::SampleOnly; angle::FormatID actualImageFormatID = vkFormat.getActualImageFormatID(formatSupport); + // The wrapped VkImage was already created by the caller with + // |mVkImageInfo.format|. ANGLE's per-driver fallback table + // (getActualImageFormatID) is only valid when ANGLE is *creating* the + // image; when wrapping, the format is fixed and any view must use it. + // If the fallback differs (e.g. R4G4B4A4 -> R8G8B8A8 on drivers without + // BLEND for R4G4B4A4), creating a view in the fallback format violates + // VUID-VkImageViewCreateInfo-image-12397/01762 and is driver UB at a + // different bytes-per-pixel. Reject instead of corrupting memory. + if (vk::GetVkFormatFromFormatID(renderer, actualImageFormatID) != mVkImageInfo.format) + { + actualImageFormatID = formatID; + } + if (renderer->getFeatures().preferBGR565ToRGB565.enabled && formatID == angle::FormatID::R5G6B5_UNORM && actualImageFormatID == angle::FormatID::B5G6R5_UNORM)