#pragma once #include struct RenderTarget { VkSurfaceKHR surface = nullptr; VkSwapchainKHR swapchain = nullptr; VkExtent2D extent = {}; uint32_t numImages = 0; VkImage* images = nullptr; VkImageView* imageViews = nullptr; VkFramebuffer* framebuffers = nullptr; VkCommandBuffer* commandBuffers = nullptr; VkSemaphore imageAvailableSemaphore = nullptr; VkSemaphore renderFinishedSemaphore = nullptr; VkFence* fences = nullptr; }; class Renderer { public: Renderer(); ~Renderer(); void render(RenderTarget* target); RenderTarget* createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTarget* oldRenderTarget = nullptr); void destroyRenderTarget(RenderTarget* target); VkInstance getInstance() const { return instance_; } private: void createInstance(); #ifdef DEBUG void createDebugMessenger(); #endif void createLogicalDevice(); void createCommandPool(); void createPresentationRenderPass(); VkInstance instance_ = nullptr; #ifdef DEBUG bool enableDebug = false; PFN_vkCreateDebugUtilsMessengerEXT createMessenger_ = nullptr; PFN_vkDestroyDebugUtilsMessengerEXT destroyMessenger_ = nullptr; VkDebugUtilsMessengerEXT messenger_ = nullptr; #endif VkPhysicalDevice physicalDevice_ = nullptr; VkDevice device_ = nullptr; struct { uint32_t graphics = 0, presentation = 0; } queueIndices; VkQueue graphicsQueue_ = nullptr; VkCommandPool commandPool_ = nullptr; VkRenderPass presentationRenderPass_ = nullptr; };