mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
This is part of a larger effort to expose the difference between GrDirectContext, which runs on the GPU thread and can directly perform operations like uploading textures, and GrRecordingContext, which can only queue up work to be delivered to the GrDirectContext later.
99 lines
3.1 KiB
C++
99 lines
3.1 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);
|
|
|
|
sk_sp<SkSurface> CreateSkiaSurface(GrDirectContext* skia_context,
|
|
VkImage image,
|
|
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_
|