Commit e5bde82d authored by Peng Huang's avatar Peng Huang Committed by Commit Bot

vulkan: fix a crash in SkiaOutputDeviceVulkan.

The crash is because we assume vulkan driver will always create
swapchain with the number of images which is specified by
VkSwapchainCreateInfoKHR::minImageCount, but sometimes, the driver
will not obey it, and then it causes problems. fix the crash by using
the number from the swapchain instead of assuming it.

Bug: 1099132
Change-Id: I70868d1bf9efee4d845ff21a236af33eac401ad5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2281177
Commit-Queue: Vasiliy Telezhnikov <vasilyt@chromium.org>
Auto-Submit: Peng Huang <penghuang@chromium.org>
Reviewed-by: default avatarVasiliy Telezhnikov <vasilyt@chromium.org>
Cr-Commit-Position: refs/heads/master@{#785357}
parent 1df9d364
...@@ -271,7 +271,6 @@ bool SkiaOutputDeviceVulkan::Initialize() { ...@@ -271,7 +271,6 @@ bool SkiaOutputDeviceVulkan::Initialize() {
capabilities_.uses_default_gl_framebuffer = false; capabilities_.uses_default_gl_framebuffer = false;
capabilities_.max_frames_pending = 1; capabilities_.max_frames_pending = 1;
capabilities_.number_of_buffers = vulkan_surface_->image_count();
// Vulkan FIFO swap chain should return vk images in presenting order, so set // Vulkan FIFO swap chain should return vk images in presenting order, so set
// preserve_buffer_content & supports_post_sub_buffer to true to let // preserve_buffer_content & supports_post_sub_buffer to true to let
// SkiaOutputBufferImpl to manager damages. // SkiaOutputBufferImpl to manager damages.
...@@ -279,6 +278,11 @@ bool SkiaOutputDeviceVulkan::Initialize() { ...@@ -279,6 +278,11 @@ bool SkiaOutputDeviceVulkan::Initialize() {
capabilities_.output_surface_origin = gfx::SurfaceOrigin::kTopLeft; capabilities_.output_surface_origin = gfx::SurfaceOrigin::kTopLeft;
capabilities_.supports_post_sub_buffer = true; capabilities_.supports_post_sub_buffer = true;
capabilities_.supports_pre_transform = true; capabilities_.supports_pre_transform = true;
// We don't know the number of buffers until the VulkanSwapChain is
// initialized, so set it to 0. Since |damage_area_from_skia_output_device| is
// assigned to true, so |number_of_buffers| will not be used for tracking
// framebuffer damages.
capabilities_.number_of_buffers = 0;
capabilities_.damage_area_from_skia_output_device = true; capabilities_.damage_area_from_skia_output_device = true;
const auto surface_format = vulkan_surface_->surface_format().format; const auto surface_format = vulkan_surface_->surface_format().format;
...@@ -308,10 +312,11 @@ bool SkiaOutputDeviceVulkan::RecreateSwapChain( ...@@ -308,10 +312,11 @@ bool SkiaOutputDeviceVulkan::RecreateSwapChain(
for (const auto& sk_surface_size_pair : sk_surface_size_pairs_) { for (const auto& sk_surface_size_pair : sk_surface_size_pairs_) {
memory_type_tracker_->TrackMemFree(sk_surface_size_pair.bytes_allocated); memory_type_tracker_->TrackMemFree(sk_surface_size_pair.bytes_allocated);
} }
auto num_images = vulkan_surface_->swap_chain()->num_images();
sk_surface_size_pairs_.clear(); sk_surface_size_pairs_.clear();
sk_surface_size_pairs_.resize(vulkan_surface_->swap_chain()->num_images()); sk_surface_size_pairs_.resize(num_images);
color_space_ = std::move(color_space); color_space_ = std::move(color_space);
damage_of_images_.resize(vulkan_surface_->image_count()); damage_of_images_.resize(num_images);
for (auto& damage : damage_of_images_) for (auto& damage : damage_of_images_)
damage = gfx::Rect(vulkan_surface_->image_size()); damage = gfx::Rect(vulkan_surface_->image_size());
is_new_swap_chain_ = true; is_new_swap_chain_ = true;
......
...@@ -170,8 +170,6 @@ bool VulkanSurface::Initialize(VulkanDeviceQueue* device_queue, ...@@ -170,8 +170,6 @@ bool VulkanSurface::Initialize(VulkanDeviceQueue* device_queue,
return false; return false;
} }
image_count_ = std::max(surface_caps.minImageCount, kMinImageCount);
constexpr auto kRequiredUsageFlags = constexpr auto kRequiredUsageFlags =
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
if ((surface_caps.supportedUsageFlags & kRequiredUsageFlags) != if ((surface_caps.supportedUsageFlags & kRequiredUsageFlags) !=
...@@ -283,11 +281,10 @@ bool VulkanSurface::CreateSwapChain(const gfx::Size& size, ...@@ -283,11 +281,10 @@ bool VulkanSurface::CreateSwapChain(const gfx::Size& size,
transform_ = transform; transform_ = transform;
auto swap_chain = std::make_unique<VulkanSwapChain>(); auto swap_chain = std::make_unique<VulkanSwapChain>();
// Create swap chain. // Create swap chain.
DCHECK_EQ(image_count_, std::max(surface_caps.minImageCount, kMinImageCount)); auto min_image_count = std::max(surface_caps.minImageCount, kMinImageCount);
if (!swap_chain->Initialize(device_queue_, surface_, surface_format_, if (!swap_chain->Initialize(device_queue_, surface_, surface_format_,
image_size_, image_count_, image_usage_flags_, image_size_, min_image_count, image_usage_flags_,
vk_transform, enforce_protected_memory_, vk_transform, enforce_protected_memory_,
std::move(swap_chain_))) { std::move(swap_chain_))) {
return false; return false;
......
...@@ -66,7 +66,6 @@ class COMPONENT_EXPORT(VULKAN) VulkanSurface { ...@@ -66,7 +66,6 @@ class COMPONENT_EXPORT(VULKAN) VulkanSurface {
const gfx::Size& image_size() const { return image_size_; } const gfx::Size& image_size() const { return image_size_; }
VkImageUsageFlags image_usage_flags() const { return image_usage_flags_; } VkImageUsageFlags image_usage_flags() const { return image_usage_flags_; }
gfx::OverlayTransform transform() const { return transform_; } gfx::OverlayTransform transform() const { return transform_; }
uint32_t image_count() const { return image_count_; }
VkSurfaceFormatKHR surface_format() const { return surface_format_; } VkSurfaceFormatKHR surface_format() const { return surface_format_; }
private: private:
...@@ -93,9 +92,6 @@ class COMPONENT_EXPORT(VULKAN) VulkanSurface { ...@@ -93,9 +92,6 @@ class COMPONENT_EXPORT(VULKAN) VulkanSurface {
// Swap chain pre-transform. // Swap chain pre-transform.
gfx::OverlayTransform transform_ = gfx::OVERLAY_TRANSFORM_INVALID; gfx::OverlayTransform transform_ = gfx::OVERLAY_TRANSFORM_INVALID;
// Swap chain image count.
uint32_t image_count_ = 0u;
std::unique_ptr<VulkanSwapChain> swap_chain_; std::unique_ptr<VulkanSwapChain> swap_chain_;
DISALLOW_COPY_AND_ASSIGN(VulkanSurface); DISALLOW_COPY_AND_ASSIGN(VulkanSurface);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment