From 8a218122f84c3e7a84afe14f291c8930cfe4a346 Mon Sep 17 00:00:00 2001 From: Brian Salomon Date: Fri, 23 Mar 2018 12:38:41 -0400 Subject: [PATCH] Vulkan swap chain setup no longer uses GrPixelConfig and doesn't include from skia/src (#4856) --- content_handler/vulkan_surface.cc | 1 - content_handler/vulkan_surface_producer.cc | 1 - vulkan/vulkan_backbuffer.cc | 2 +- vulkan/vulkan_device.cc | 44 +++-------- vulkan/vulkan_device.h | 5 +- vulkan/vulkan_swapchain.cc | 87 ++++++++++++++-------- vulkan/vulkan_swapchain.h | 8 +- 7 files changed, 80 insertions(+), 68 deletions(-) diff --git a/content_handler/vulkan_surface.cc b/content_handler/vulkan_surface.cc index 7dbcc908e..9f7d7913a 100644 --- a/content_handler/vulkan_surface.cc +++ b/content_handler/vulkan_surface.cc @@ -10,7 +10,6 @@ #include "third_party/skia/include/gpu/GrBackendSemaphore.h" #include "third_party/skia/include/gpu/GrBackendSurface.h" #include "third_party/skia/include/gpu/GrContext.h" -#include "third_party/skia/src/gpu/vk/GrVkImage.h" namespace flutter_runner { diff --git a/content_handler/vulkan_surface_producer.cc b/content_handler/vulkan_surface_producer.cc index a994b0426..6f605c109 100644 --- a/content_handler/vulkan_surface_producer.cc +++ b/content_handler/vulkan_surface_producer.cc @@ -11,7 +11,6 @@ #include "third_party/skia/include/gpu/GrBackendSemaphore.h" #include "third_party/skia/include/gpu/GrContext.h" #include "third_party/skia/include/gpu/vk/GrVkTypes.h" -#include "third_party/skia/src/gpu/vk/GrVkUtil.h" namespace flutter_runner { diff --git a/vulkan/vulkan_backbuffer.cc b/vulkan/vulkan_backbuffer.cc index e12a037f3..0bcfa1643 100644 --- a/vulkan/vulkan_backbuffer.cc +++ b/vulkan/vulkan_backbuffer.cc @@ -6,9 +6,9 @@ #include +#include "flutter/vulkan/skia_vulkan_header.h" #include "flutter/vulkan/vulkan_proc_table.h" #include "third_party/skia/include/gpu/vk/GrVkTypes.h" -#include "third_party/skia/src/gpu/vk/GrVkUtil.h" namespace vulkan { diff --git a/vulkan/vulkan_device.cc b/vulkan/vulkan_device.cc index c989f4f09..bb6c2e8a1 100644 --- a/vulkan/vulkan_device.cc +++ b/vulkan/vulkan_device.cc @@ -12,7 +12,6 @@ #include "flutter/vulkan/vulkan_surface.h" #include "flutter/vulkan/vulkan_utilities.h" #include "third_party/skia/include/gpu/vk/GrVkBackendContext.h" -#include "third_party/skia/src/gpu/vk/GrVkUtil.h" namespace vulkan { @@ -260,65 +259,46 @@ std::vector VulkanDevice::GetQueueFamilyProperties() return properties; } -bool VulkanDevice::ChooseSurfaceFormat(const VulkanSurface& surface, - VkSurfaceFormatKHR* format) const { +int VulkanDevice::ChooseSurfaceFormat(const VulkanSurface& surface, + std::vector desired_formats, + VkSurfaceFormatKHR* format) const { if (!surface.IsValid() || format == nullptr) { - return false; + return -1; } uint32_t format_count = 0; if (VK_CALL_LOG_ERROR(vk.GetPhysicalDeviceSurfaceFormatsKHR( physical_device_, surface.Handle(), &format_count, nullptr)) != VK_SUCCESS) { - return false; + return -1; } if (format_count == 0) { - return false; + return -1; } VkSurfaceFormatKHR formats[format_count]; if (VK_CALL_LOG_ERROR(vk.GetPhysicalDeviceSurfaceFormatsKHR( physical_device_, surface.Handle(), &format_count, formats)) != VK_SUCCESS) { - return false; + return -1; } std::map supported_formats; - for (uint32_t i = 0; i < format_count; i++) { - GrPixelConfig pixel_config = GrVkFormatToPixelConfig(formats[i].format); - if (pixel_config != kUnknown_GrPixelConfig) { - supported_formats[formats[i].format] = formats[i]; - } + supported_formats[formats[i].format] = formats[i]; } - if (supported_formats.size() == 0) { - return false; - } - - const std::vector desired_formats = { - VK_FORMAT_R8G8B8A8_SRGB, // kSRGBA_8888_GrPixelConfig - VK_FORMAT_B8G8R8A8_SRGB, // kSBGRA_8888_GrPixelConfig - VK_FORMAT_R16G16B16A16_SFLOAT, // kRGBA_half_GrPixelConfig - VK_FORMAT_R8G8B8A8_UNORM, // kRGBA_8888_GrPixelConfig - VK_FORMAT_B8G8R8A8_UNORM, // kBGRA_8888_GrPixelConfig - }; - // Try to find the first supported format in the list of desired formats. - for (VkFormat current_format : desired_formats) { - auto found = supported_formats.find(current_format); + for (size_t i = 0; i < desired_formats.size(); ++i) { + auto found = supported_formats.find(desired_formats[i]); if (found != supported_formats.end()) { *format = found->second; - return true; + return static_cast(i); } } - // None of the desired formats were supported. Return the first supported - // format even if we don't like it all that much (it has already returned true - // for GrVkFormatToPixelConfig). - *format = supported_formats.begin()->second; - return true; + return -1; } bool VulkanDevice::ChoosePresentMode(const VulkanSurface& surface, diff --git a/vulkan/vulkan_device.h b/vulkan/vulkan_device.h index bbb7fb66f..e9abf757f 100644 --- a/vulkan/vulkan_device.h +++ b/vulkan/vulkan_device.h @@ -49,8 +49,9 @@ class VulkanDevice { uint32_t* /* mask of GrVkFeatureFlags */ features) const; FXL_WARN_UNUSED_RESULT - bool ChooseSurfaceFormat(const VulkanSurface& surface, - VkSurfaceFormatKHR* format) const; + int ChooseSurfaceFormat(const VulkanSurface& surface, + std::vector desired_formats, + VkSurfaceFormatKHR* format) const; FXL_WARN_UNUSED_RESULT bool ChoosePresentMode(const VulkanSurface& surface, diff --git a/vulkan/vulkan_swapchain.cc b/vulkan/vulkan_swapchain.cc index a43859eca..f3ca6d0c1 100644 --- a/vulkan/vulkan_swapchain.cc +++ b/vulkan/vulkan_swapchain.cc @@ -10,11 +10,32 @@ #include "flutter/vulkan/vulkan_proc_table.h" #include "flutter/vulkan/vulkan_surface.h" #include "third_party/skia/include/gpu/GrBackendSurface.h" +#include "third_party/skia/include/gpu/GrContext.h" #include "third_party/skia/include/gpu/vk/GrVkTypes.h" -#include "third_party/skia/src/gpu/vk/GrVkUtil.h" namespace vulkan { +namespace { +struct FormatInfo { + VkFormat format_; + SkColorType color_type_; + sk_sp color_space_; +}; +} // namespace + +static std::vector DesiredFormatInfos() { + return {{VK_FORMAT_R8G8B8A8_SRGB, kRGBA_8888_SkColorType, + SkColorSpace::MakeSRGB()}, + {VK_FORMAT_B8G8R8A8_SRGB, kRGBA_8888_SkColorType, + SkColorSpace::MakeSRGB()}, + {VK_FORMAT_R16G16B16A16_SFLOAT, kRGBA_F16_SkColorType, + SkColorSpace::MakeSRGBLinear()}, + {VK_FORMAT_R8G8B8A8_UNORM, kRGBA_8888_SkColorType, + SkColorSpace::MakeSRGB()}, + {VK_FORMAT_B8G8R8A8_UNORM, kRGBA_8888_SkColorType, + SkColorSpace::MakeSRGB()}}; +} + VulkanSwapchain::VulkanSwapchain(const VulkanProcTable& p_vk, const VulkanDevice& device, const VulkanSurface& surface, @@ -39,7 +60,20 @@ VulkanSwapchain::VulkanSwapchain(const VulkanProcTable& p_vk, return; } - if (!device_.ChooseSurfaceFormat(surface, &surface_format_)) { + const auto format_infos = DesiredFormatInfos(); + std::vector desired_formats(format_infos.size()); + for (size_t i = 0; i < format_infos.size(); ++i) { + if (skia_context->colorTypeSupportedAsSurface( + format_infos[i].color_type_)) { + desired_formats[i] = format_infos[i].format_; + } else { + desired_formats[i] = VK_FORMAT_UNDEFINED; + } + } + + int format_index = + device_.ChooseSurfaceFormat(surface, desired_formats, &surface_format_); + if (format_index < 0) { FXL_DLOG(INFO) << "Could not choose surface format."; return; } @@ -115,7 +149,9 @@ VulkanSwapchain::VulkanSwapchain(const VulkanProcTable& p_vk, nullptr); }}; - if (!CreateSwapchainImages(skia_context)) { + if (!CreateSwapchainImages(skia_context, + format_infos[format_index].color_type_, + format_infos[format_index].color_space_)) { FXL_DLOG(INFO) << "Could not create swapchain images."; return; } @@ -171,29 +207,18 @@ SkISize VulkanSwapchain::GetSize() const { return SkISize::Make(extents.width, extents.height); } -static sk_sp SkColorSpaceFromVkFormat(VkFormat format) { - if (GrVkFormatIsSRGB(format, nullptr /* dont care */)) { - return SkColorSpace::MakeSRGB(); - } - - if (format == VK_FORMAT_R16G16B16A16_SFLOAT) { - return SkColorSpace::MakeSRGBLinear(); - } - - return nullptr; -} - -sk_sp VulkanSwapchain::CreateSkiaSurface(GrContext* gr_context, - VkImage image, - const SkISize& size) const { +sk_sp VulkanSwapchain::CreateSkiaSurface( + GrContext* gr_context, + VkImage image, + const SkISize& size, + SkColorType color_type, + sk_sp color_space) const { if (gr_context == nullptr) { return nullptr; } - GrPixelConfig pixel_config = GrVkFormatToPixelConfig(surface_format_.format); - - if (pixel_config == kUnknown_GrPixelConfig) { - // Vulkan format unsupported by Skia. + if (color_type == kUnknown_SkColorType) { + // Unexpected Vulkan format. return nullptr; } @@ -212,15 +237,18 @@ sk_sp VulkanSwapchain::CreateSkiaSurface(GrContext* gr_context, SkSurfaceProps props(SkSurfaceProps::InitType::kLegacyFontHost_InitType); return SkSurface::MakeFromBackendRenderTarget( - gr_context, // context - backend_render_target, // backend render target - kTopLeft_GrSurfaceOrigin, - SkColorSpaceFromVkFormat(surface_format_.format), // colorspace - &props // surface properties + gr_context, // context + backend_render_target, // backend render target + kTopLeft_GrSurfaceOrigin, // origin + color_type, // color type + std::move(color_space), // color space + &props // surface properties ); } -bool VulkanSwapchain::CreateSwapchainImages(GrContext* skia_context) { +bool VulkanSwapchain::CreateSwapchainImages(GrContext* skia_context, + SkColorType color_type, + sk_sp color_space) { std::vector images = GetImages(); if (images.size() == 0) { @@ -250,7 +278,8 @@ bool VulkanSwapchain::CreateSwapchainImages(GrContext* skia_context) { images_.emplace_back(std::move(vulkan_image)); // Populate the surface. - auto surface = CreateSkiaSurface(skia_context, image, surface_size); + auto surface = CreateSkiaSurface(skia_context, image, surface_size, + color_type, color_space); if (surface == nullptr) { return false; diff --git a/vulkan/vulkan_swapchain.h b/vulkan/vulkan_swapchain.h index 43cfe8a9c..fcc60b1fe 100644 --- a/vulkan/vulkan_swapchain.h +++ b/vulkan/vulkan_swapchain.h @@ -77,11 +77,15 @@ class VulkanSwapchain { std::vector GetImages() const; - bool CreateSwapchainImages(GrContext* skia_context); + bool CreateSwapchainImages(GrContext* skia_context, + SkColorType color_type, + sk_sp color_space); sk_sp CreateSkiaSurface(GrContext* skia_context, VkImage image, - const SkISize& size) const; + const SkISize& size, + SkColorType color_type, + sk_sp color_space) const; VulkanBackbuffer* GetNextBackbuffer(); -- GitLab