| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef FLUTTER_VULKAN_VULKAN_SWAPCHAIN_H_ |
| #define FLUTTER_VULKAN_VULKAN_SWAPCHAIN_H_ |
| |
| #include <memory> |
| #include <utility> |
| #include <vector> |
| |
| #include "flutter/fml/compiler_specific.h" |
| #include "flutter/fml/macros.h" |
| #include "flutter/vulkan/procs/vulkan_handle.h" |
| #include "third_party/skia/include/core/SkSize.h" |
| #include "third_party/skia/include/core/SkSurface.h" |
| |
| namespace vulkan { |
| |
| class VulkanProcTable; |
| class VulkanDevice; |
| class VulkanSurface; |
| class VulkanBackbuffer; |
| class VulkanImage; |
| |
| class VulkanSwapchain { |
| public: |
| VulkanSwapchain(const VulkanProcTable& vk, |
| const VulkanDevice& device, |
| const VulkanSurface& surface, |
| GrDirectContext* skia_context, |
| std::unique_ptr<VulkanSwapchain> old_swapchain, |
| uint32_t queue_family_index); |
| |
| ~VulkanSwapchain(); |
| |
| bool IsValid() const; |
| |
| enum class AcquireStatus { |
| /// A valid SkSurface was acquired successfully from the swapchain. |
| Success, |
| /// The underlying surface of the swapchain was permanently lost. This is an |
| /// unrecoverable error. The entire surface must be recreated along with the |
| /// swapchain. |
| ErrorSurfaceLost, |
| /// The swapchain surface is out-of-date with the underlying surface. The |
| /// swapchain must be recreated. |
| ErrorSurfaceOutOfDate, |
| }; |
| using AcquireResult = std::pair<AcquireStatus, sk_sp<SkSurface>>; |
| |
| /// Acquire an SkSurface from the swapchain for the caller to render into for |
| /// later submission via |Submit|. There must not be consecutive calls to |
| /// |AcquireFrame| without and interleaving |Submit|. |
| AcquireResult AcquireSurface(); |
| |
| /// Submit a previously acquired. There must not be consecutive calls to |
| /// |Submit| without and interleaving |AcquireFrame|. |
| [[nodiscard]] bool Submit(); |
| |
| SkISize GetSize() const; |
| |
| #if FML_OS_ANDROID |
| private: |
| const VulkanProcTable& vk; |
| const VulkanDevice& device_; |
| VkSurfaceCapabilitiesKHR capabilities_; |
| VkSurfaceFormatKHR surface_format_; |
| VulkanHandle<VkSwapchainKHR> swapchain_; |
| std::vector<std::unique_ptr<VulkanBackbuffer>> backbuffers_; |
| std::vector<std::unique_ptr<VulkanImage>> images_; |
| std::vector<sk_sp<SkSurface>> surfaces_; |
| VkPipelineStageFlagBits current_pipeline_stage_; |
| size_t current_backbuffer_index_; |
| size_t current_image_index_; |
| bool valid_; |
| |
| std::vector<VkImage> GetImages() const; |
| |
| bool CreateSwapchainImages(GrDirectContext* skia_context, |
| SkColorType color_type, |
| const sk_sp<SkColorSpace>& color_space, |
| VkImageUsageFlags usage_flags); |
| |
| sk_sp<SkSurface> CreateSkiaSurface(GrDirectContext* skia_context, |
| VkImage image, |
| VkImageUsageFlags usage_flags, |
| const SkISize& size, |
| SkColorType color_type, |
| sk_sp<SkColorSpace> color_space) const; |
| |
| VulkanBackbuffer* GetNextBackbuffer(); |
| #endif // FML_OS_ANDROID |
| |
| FML_DISALLOW_COPY_AND_ASSIGN(VulkanSwapchain); |
| }; |
| |
| } // namespace vulkan |
| |
| #endif // FLUTTER_VULKAN_VULKAN_SWAPCHAIN_H_ |