5#ifndef FLUTTER_SHELL_PLATFORM_FUCHSIA_FLUTTER_VULKAN_SURFACE_H_
6#define FLUTTER_SHELL_PLATFORM_FUCHSIA_FLUTTER_VULKAN_SURFACE_H_
8#include <fuchsia/sysmem2/cpp/fidl.h>
9#include <lib/async/cpp/wait.h>
10#include <lib/zx/event.h>
11#include <lib/zx/vmo.h>
22#include "third_party/skia/include/core/SkColorType.h"
23#include "third_party/skia/include/core/SkRefCnt.h"
24#include "third_party/skia/include/core/SkSize.h"
25#include "third_party/skia/include/core/SkSurface.h"
48 fuchsia::sysmem2::AllocatorSyncPtr& sysmem_allocator,
49 fuchsia::ui::composition::AllocatorPtr& flatland_allocator,
65 SkISize
GetSize()
const override;
70 const std::function<
void(
void)>& on_writes_committed)
override;
82 fuchsia::ui::composition::BufferCollectionImportToken
100 return acquire_semaphore_;
105 if (!command_buffer_)
106 command_buffer_ = std::make_unique<vulkan::VulkanCommandBuffer>(
107 vulkan_provider_.
vk(), vulkan_provider_.
vk_device(), pool);
108 return command_buffer_.get();
112 return command_buffer_fence_;
126 return std::equal(size_history_.begin() + 1, size_history_.end(),
127 size_history_.begin());
131 static constexpr int kSizeHistorySize = 4;
133 void OnHandleReady(async_dispatcher_t* dispatcher,
134 async::WaitBase* wait,
136 const zx_packet_signal_t* signal);
138 bool AllocateDeviceMemory(
139 fuchsia::sysmem2::AllocatorSyncPtr& sysmem_allocator,
140 fuchsia::ui::composition::AllocatorPtr& flatland_allocator,
141 sk_sp<GrDirectContext>
context,
142 const SkISize& size);
148 bool SetupSkiaSurface(sk_sp<GrDirectContext>
context,
151 const VkImageCreateInfo& image_create_info,
152 const VkMemoryRequirements& memory_reqs);
159 const zx::event& event)
const;
164 VkMemoryAllocateInfo vk_memory_info_;
166 sk_sp<SkSurface> sk_surface_;
167 fuchsia::ui::composition::BufferCollectionImportToken import_token_;
168 uint32_t image_id_ = 0;
170 zx::event acquire_event_;
172 std::unique_ptr<vulkan::VulkanCommandBuffer> command_buffer_;
173 zx::event release_event_;
174 async::WaitMethod<VulkanSurface, &VulkanSurface::OnHandleReady> wait_;
175 std::function<void()> pending_on_writes_committed_;
176 std::array<SkISize, kSizeHistorySize> size_history_;
177 int size_history_index_ = 0;
const vulkan::VulkanHandle< VkFence > & GetCommandBufferFence()
const vulkan::VulkanHandle< VkImage > & GetVkImage()
void SetReleaseImageCallback(ReleaseImageCallback release_image_callback) override
fuchsia::ui::composition::BufferCollectionImportToken GetBufferCollectionImportToken() override
bool IsValid() const override
vulkan::VulkanCommandBuffer * GetCommandBuffer(const vulkan::VulkanHandle< VkCommandPool > &pool)
zx::event GetAcquireFence() override
~VulkanSurface() override
void SignalWritesFinished(const std::function< void(void)> &on_writes_committed) override
size_t GetAllocationSize() const
SkISize GetSize() const override
bool FlushSessionAcquireAndReleaseEvents() override
uint32_t GetImageId() override
void SetImageId(uint32_t image_id) override
size_t AdvanceAndGetAge() override
const vulkan::VulkanHandle< VkSemaphore > & GetAcquireVkSemaphore()
sk_sp< SkSurface > GetSkiaSurface() const override
zx::event GetReleaseFence() override
size_t GetImageMemoryRequirementsSize() const
bool HasStableSizeHistory() const
virtual const vulkan::VulkanProcTable & vk()=0
virtual const vulkan::VulkanHandle< VkDevice > & vk_device()=0
#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName)
std::function< void()> ReleaseImageCallback
std::shared_ptr< ContextGLES > context
VkImageCreateInfo vk_image_create_info
VkMemoryRequirements vk_memory_requirements
VkBufferCollectionImageCreateInfoFUCHSIA vk_collection_image_create_info
VulkanImage & operator=(VulkanImage &&)=default
vulkan::VulkanHandle< VkImage > vk_image
VulkanImage(VulkanImage &&)=default
FML_DISALLOW_COPY_AND_ASSIGN(VulkanImage)