mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Previously Skia did not require the clients to pass in the usage flags and Skia would just assumed they contained specific ones depending on how the client wrapped the VkImage. Now Skia allows the client to pass in the specific usage flags used so that Skia knows exactly what type of operations are legal without having to guess/assume what the client did. Also update to set the sample count as well while I'm in here.
101 lines
3.3 KiB
C++
101 lines
3.3 KiB
C++
// 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 "third_party/skia/include/core/SkSize.h"
|
|
#include "third_party/skia/include/core/SkSurface.h"
|
|
#include "vulkan_handle.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 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,
|
|
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 // OS_ANDROID
|
|
|
|
FML_DISALLOW_COPY_AND_ASSIGN(VulkanSwapchain);
|
|
};
|
|
|
|
} // namespace vulkan
|
|
|
|
#endif // FLUTTER_VULKAN_VULKAN_SWAPCHAIN_H_
|