145 lines
3.6 KiB
C++
145 lines
3.6 KiB
C++
#pragma once
|
|
|
|
#include <vulkan/vulkan.h>
|
|
|
|
#include "worldpass.h"
|
|
#include "postpass.h"
|
|
#include "dofpass.h"
|
|
|
|
struct RenderTarget {
|
|
VkSurfaceKHR surface = nullptr;
|
|
VkSwapchainKHR swapchain = nullptr;
|
|
|
|
VkExtent2D extent = {};
|
|
uint32_t numImages = 0, currentImage = 0;
|
|
|
|
// swapwchain
|
|
VkImage* swapchainImages = nullptr;
|
|
VkImageView* swapchainImageViews = nullptr;
|
|
VkFramebuffer* swapchainFramebuffers = nullptr;
|
|
|
|
// offscreen color
|
|
VkImage* offscreenColorImages = nullptr;
|
|
VkDeviceMemory* offscreenColorMemory = nullptr;
|
|
VkImageView* offscreenColorImageViews = nullptr;
|
|
|
|
// offscreen depth
|
|
VkImage* offscreenDepthImages = nullptr;
|
|
VkDeviceMemory* offscreenDepthMemory = nullptr;
|
|
VkImageView* offscreenDepthImageViews = nullptr;
|
|
|
|
VkFramebuffer* offscreenFramebuffers = nullptr;
|
|
|
|
// near field
|
|
VkImage* nearFieldImages = nullptr;
|
|
VkDeviceMemory* nearFieldMemory = nullptr;
|
|
VkImageView* nearFieldImageViews = nullptr;
|
|
|
|
VkFramebuffer* nearFieldFramebuffers = nullptr;
|
|
|
|
// far field
|
|
VkImage* farFieldImages = nullptr;
|
|
VkDeviceMemory* farFieldMemory = nullptr;
|
|
VkImageView* farFieldImageViews = nullptr;
|
|
|
|
VkFramebuffer* farFieldFramebuffers = nullptr;
|
|
|
|
VkCommandBuffer* commandBuffers = nullptr;
|
|
|
|
VkSemaphore imageAvailableSemaphore = nullptr;
|
|
VkSemaphore renderFinishedSemaphore = nullptr;
|
|
VkFence* fences = nullptr;
|
|
|
|
VkDescriptorSet* postSets = nullptr;
|
|
VkDescriptorSet* dofSets = nullptr;
|
|
};
|
|
|
|
class World;
|
|
class Mesh;
|
|
class Camera;
|
|
|
|
class Renderer {
|
|
public:
|
|
Renderer();
|
|
~Renderer();
|
|
|
|
void render(World& world, Camera& camera, RenderTarget* target);
|
|
|
|
RenderTarget* createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTarget* oldTarget = nullptr);
|
|
void destroyRenderTarget(RenderTarget* target);
|
|
|
|
void takeScreenshot(const char* path, RenderTarget* target);
|
|
|
|
VkShaderModule createShader(const char* path);
|
|
|
|
uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties);
|
|
|
|
void fillMeshBuffers(Mesh* mesh);
|
|
void destroyMeshBuffers(Mesh* mesh);
|
|
|
|
VkInstance getInstance() const {
|
|
return instance_;
|
|
}
|
|
|
|
VkDevice getDevice() const {
|
|
return device_;
|
|
}
|
|
|
|
VkQueue getGraphicsQueue() const {
|
|
return graphicsQueue_;
|
|
}
|
|
|
|
VkCommandPool getCommandPool() const {
|
|
return commandPool_;
|
|
}
|
|
|
|
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;
|
|
DoFPass* dofPass_ = nullptr;
|
|
};
|