// 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_WINDOW_H_ #define FLUTTER_VULKAN_VULKAN_WINDOW_H_ #include #include #include #include #include "flutter/fml/macros.h" #include "flutter/vulkan/procs/vulkan_proc_table.h" #include "third_party/skia/include/core/SkRefCnt.h" #include "third_party/skia/include/core/SkSize.h" #include "third_party/skia/include/core/SkSurface.h" #include "third_party/skia/include/gpu/ganesh/GrDirectContext.h" #include "third_party/skia/include/gpu/vk/VulkanBackendContext.h" namespace vulkan { class VulkanNativeSurface; class VulkanDevice; class VulkanSurface; class VulkanSwapchain; class VulkanImage; class VulkanApplication; class VulkanBackbuffer; class VulkanWindow { public: //------------------------------------------------------------------------------ /// @brief Construct a VulkanWindow. Let it implicitly create a /// GrDirectContext. /// VulkanWindow(fml::RefPtr proc_table, std::unique_ptr native_surface); //------------------------------------------------------------------------------ /// @brief Construct a VulkanWindow. Let reuse an existing /// GrDirectContext built by another VulkanWindow. /// VulkanWindow(const sk_sp& context, fml::RefPtr proc_table, std::unique_ptr native_surface); ~VulkanWindow(); bool IsValid() const; GrDirectContext* GetSkiaGrContext(); sk_sp AcquireSurface(); bool SwapBuffers(); private: bool valid_; fml::RefPtr vk_; std::unique_ptr application_; std::unique_ptr logical_device_; std::unique_ptr surface_; std::unique_ptr swapchain_; sk_sp memory_allocator_; sk_sp skia_gr_context_; bool CreateSkiaGrContext(); bool CreateSkiaBackendContext(skgpu::VulkanBackendContext*, VkPhysicalDeviceFeatures*, skgpu::VulkanExtensions*); [[nodiscard]] bool RecreateSwapchain(); FML_DISALLOW_COPY_AND_ASSIGN(VulkanWindow); }; } // namespace vulkan #endif // FLUTTER_VULKAN_VULKAN_WINDOW_H_