#pragma once #include #include "worldpass.h" #include "postpass.h" struct RenderTarget { VkSurfaceKHR surface = nullptr; VkSwapchainKHR swapchain = nullptr; VkExtent2D extent = {}; uint32_t numImages = 0, currentImage = 0; VkImage* swapchainImages = nullptr; VkImageView* swapchainImageViews = nullptr; VkFramebuffer* swapchainFramebuffers = nullptr; VkImage* offscreenImages = nullptr; VkDeviceMemory* offscreenMemory = nullptr; VkImageView* offscreenImageViews = nullptr; VkFramebuffer* offscreenFramebuffers = nullptr; VkCommandBuffer* commandBuffers = nullptr; VkSemaphore imageAvailableSemaphore = nullptr; VkSemaphore renderFinishedSemaphore = nullptr; VkFence* fences = nullptr; VkDescriptorSet* postSets = nullptr; }; class World; class Mesh; class Renderer { public: Renderer(); ~Renderer(); void render(World& world, RenderTarget* target); RenderTarget* createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTarget* oldRenderTarget = nullptr); void destroyRenderTarget(RenderTarget* target); VkShaderModule createShader(const char* path); uint32_t findMemoryType(const uint32_t typeFilter, const VkMemoryPropertyFlags properties); void fillMeshBuffers(Mesh* mesh); void destroyMeshBuffers(Mesh* mesh); VkInstance getInstance() const { return instance_; } VkDevice getDevice() const { return device_; } VkRenderPass getRenderPass() const { return presentationRenderPass_; } VkDescriptorPool getDescriptorPool() const { return descriptorPool_; } private: void createInstance(); #ifdef DEBUG void createDebugMessenger(); #endif void createLogicalDevice(); void createCommandPool(); void createPresentationRenderPass(); void createDescriptorPool(); VkInstance instance_ = nullptr; #ifdef DEBUG bool enableDebug = false; PFN_vkCreateDebugUtilsMessengerEXT createMessenger_ = nullptr; PFN_vkDestroyDebugUtilsMessengerEXT destroyMessenger_ = nullptr; VkDebugUtilsMessengerEXT messenger_ = nullptr; #endif VkPhysicalDevice physicalDevice_ = nullptr; VkPhysicalDeviceMemoryProperties deviceMemoryProperties_ = {}; VkDevice device_ = nullptr; struct { uint32_t graphics = 0, presentation = 0; } queueIndices; VkQueue graphicsQueue_ = nullptr; VkCommandPool commandPool_ = nullptr; VkRenderPass presentationRenderPass_ = nullptr; VkDescriptorPool descriptorPool_ = nullptr; WorldPass* worldPass_ = nullptr; PostPass* postPass_ = nullptr; };