#pragma once #include "type.h" #include "render/window.h" namespace vkn { class Device; struct VulkanWindowArgs { uint32_t frames; uint32_t width; uint32_t height; VkFormat imageFormat; VkColorSpaceKHR imageColorSpace; VkPresentModeKHR presentMode; VkImageUsageFlags imageUsage; uint32_t maxFrameInFlightCount; VkExtent2D EnableImageExtent2D(VkSurfaceCapabilitiesKHR& capabilities); static VulkanWindowArgs Default(); }; class VulkanSwapchain { private: Device& mDevice; VkSwapchainKHR mPtr; int mFrames; //pmr::vector mSurfaces{GlobalPool()}; pmr::vector mFences{ GlobalPool() }; pmr::vector mSemaphores{ GlobalPool() }; public: VulkanSwapchain(Device& device, VkSurfaceKHR surface, VulkanWindowArgs& args); }; class VulkanWindow : public api::Window { private: VulkanSwapchain* mSwapchain; public: void* operator new(size_t size) { return ::operator new(size, GlobalPool()); } void operator delete(void* p) {} public: using api::Window::Window; void CreateRender(VulkanWindowArgs& args); static VulkanWindow* Ptr() { return (VulkanWindow*)api::Window::Ptr(); } }; }