From f518d918b13cc7ee7eef3ca7b057e7fcb6443018 Mon Sep 17 00:00:00 2001 From: Kaushik Iska Date: Wed, 16 Nov 2022 18:39:04 -0500 Subject: [PATCH] [Impeller] Fix glyph atlas uploads and renders Fixes https://github.com/flutter/flutter/issues/115461 --- impeller/renderer/backend/vulkan/allocator_vk.cc | 10 ++++++++++ impeller/renderer/backend/vulkan/formats_vk.h | 5 +---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/impeller/renderer/backend/vulkan/allocator_vk.cc b/impeller/renderer/backend/vulkan/allocator_vk.cc index bb034b0b3870b..cfe7f5533e78b 100644 --- a/impeller/renderer/backend/vulkan/allocator_vk.cc +++ b/impeller/renderer/backend/vulkan/allocator_vk.cc @@ -12,6 +12,7 @@ #include "impeller/renderer/backend/vulkan/device_buffer_vk.h" #include "impeller/renderer/backend/vulkan/formats_vk.h" #include "impeller/renderer/backend/vulkan/texture_vk.h" +#include "impeller/renderer/formats.h" namespace impeller { @@ -146,6 +147,15 @@ std::shared_ptr AllocatorVK::OnCreateTexture( view_create_info.subresourceRange.levelCount = image_create_info.mipLevels; view_create_info.subresourceRange.layerCount = image_create_info.arrayLayers; + // Vulkan does not have an image format that is equivalent to + // `MTLPixelFormatA8Unorm`, so we use `R8Unorm` instead. Given that the + // shaders expect that alpha channel to be set in the cases, we swizzle. + // See: https://github.com/flutter/flutter/issues/115461 for more details. + if (desc.format == PixelFormat::kA8UNormInt) { + view_create_info.components.a = vk::ComponentSwizzle::eR; + view_create_info.components.r = vk::ComponentSwizzle::eA; + } + auto img_view_res = device_.createImageView(view_create_info); if (img_view_res.result != vk::Result::eSuccess) { VALIDATION_LOG << "Unable to create an image view: " diff --git a/impeller/renderer/backend/vulkan/formats_vk.h b/impeller/renderer/backend/vulkan/formats_vk.h index bee134d8ed221..70a4220347094 100644 --- a/impeller/renderer/backend/vulkan/formats_vk.h +++ b/impeller/renderer/backend/vulkan/formats_vk.h @@ -139,7 +139,7 @@ constexpr vk::Format ToVKImageFormat(PixelFormat format) { case PixelFormat::kUnknown: return vk::Format::eUndefined; case PixelFormat::kA8UNormInt: - return vk::Format::eA8B8G8R8UnormPack32; + return vk::Format::eR8Unorm; case PixelFormat::kR8G8B8A8UNormInt: return vk::Format::eR8G8B8A8Unorm; case PixelFormat::kR8G8B8A8UNormIntSRGB: @@ -164,9 +164,6 @@ constexpr PixelFormat ToPixelFormat(vk::Format format) { case vk::Format::eUndefined: return PixelFormat::kUnknown; - case vk::Format::eA8B8G8R8UnormPack32: - return PixelFormat::kA8UNormInt; - case vk::Format::eR8G8B8A8Unorm: return PixelFormat::kR8G8B8A8UNormInt;