Archived
1
Fork 0
This repository has been archived on 2025-04-12. You can view files and clone it, but cannot push or open issues or pull requests.
graph/include/renderer.h

241 lines
6.2 KiB
C++
Executable file

#pragma once
#include <vulkan/vulkan.h>
#include <string_view>
#include "worldpass.h"
#include "postpass.h"
#include "dofpass.h"
#include "imguipass.h"
#include "skypass.h"
#include "shadowpass.h"
#include "smaapass.h"
#include "debugpass.h"
constexpr int numFrameResources = 3;
struct RenderTarget {
VkSurfaceKHR surface = nullptr;
VkSwapchainKHR swapchain = nullptr;
VkExtent2D extent = {};
uint32_t numImages = 0, imageIndex = 0, currentResource = 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;
// sobel
VkImage* sobelImages = nullptr;
VkDeviceMemory* sobelMemorys = nullptr;
VkImageView* sobelImageViews = nullptr;
VkFramebuffer* sobelFramebuffers = 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;
// smaa
VkImage* edgeImages = nullptr;
VkDeviceMemory* edgeMemorys = nullptr;
VkImageView* edgeImageViews = nullptr;
VkFramebuffer* edgeFramebuffers = nullptr;
VkDescriptorSet* edgeDescriptorSets = nullptr;
VkImage* blendImages = nullptr;
VkDeviceMemory* blendMemorys = nullptr;
VkImageView* blendImageViews = nullptr;
VkFramebuffer* blendFramebuffers = nullptr;
VkDescriptorSet* blendDescriptorSets = nullptr;
// imgui
VkBuffer* imguiVertexBuffers = nullptr;
VkDeviceMemory* imguiVertexMemorys = nullptr;
size_t* imguiVertexBufferSizes = nullptr;
VkBuffer* imguiIndexBuffers = nullptr;
VkDeviceMemory* imguiIndexMemorys = nullptr;
size_t* imguiIndexBufferSizes = nullptr;
VkDescriptorSet* postSets = nullptr;
VkDescriptorSet* dofSets = nullptr;
};
struct GraphicsConfig {
int shadowResolution, dofDownscale;
bool vsync = true, filterPCF;
#ifdef DEBUG
bool enableImgui = true;
#endif
};
using EntityID = uint64_t;
struct RenderExtraInfo {
EntityID* selectedEntities = nullptr;
size_t numSelectedEntities = 0;
};
struct World;
class MeshAsset;
class Camera;
class MaterialAsset;
class Renderer {
public:
Renderer(GraphicsConfig config);
~Renderer();
void render(World& world, RenderTarget* target, RenderExtraInfo* extraInfo = nullptr);
RenderTarget* createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTarget* oldTarget = nullptr);
void destroyRenderTarget(RenderTarget* target);
void takeScreenshot(const char* path, RenderTarget* target);
VkShaderModule createShader(const char* path);
void uploadImageData(VkImage image, int width, int height, VkDeviceSize size, const void* src);
uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties);
void fillMeshBuffers(MeshAsset* mesh);
void destroyMeshBuffers(MeshAsset* mesh);
void fillMaterialBuffers(MaterialAsset* material);
void destroyMaterialBuffers(MaterialAsset* material);
GraphicsConfig getConfig() const {
return config_;
}
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_;
}
VkDescriptorSetLayout getMaterialSetLayout() const {
return materialSetLayout_;
}
WorldPass& getWorldPass() const {
return *worldPass_;
}
ShadowPass& getShadowPass() const {
return *shadowPass_;
}
private:
void createInstance();
#ifdef DEBUG
void createDebugMessenger();
#endif
void createLogicalDevice();
void createCommandPool();
void createPresentationRenderPass();
void createDescriptorPool();
void createMaterialSetLayout();
void createEmptyMaterialSet();
GraphicsConfig config_;
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;
VkDescriptorSetLayout materialSetLayout_ = nullptr;
VkImage emptyImage_ = nullptr;
VkDeviceMemory emptyMemory_ = nullptr;
VkImageView emptyImageView_ = nullptr;
VkSampler emptySampler_ = nullptr;
VkDescriptorSet emptyMaterialSet_ = nullptr;
WorldPass* worldPass_ = nullptr;
PostPass* postPass_ = nullptr;
DoFPass* dofPass_ = nullptr;
#ifdef DEBUG
ImGuiPass* imguiPass_ = nullptr;
#endif
SkyPass* skyPass_ = nullptr;
ShadowPass* shadowPass_ = nullptr;
SMAAPass* smaaPass_ = nullptr;
DebugPass* debugPass_ = nullptr;
};
VkResult name_object(VkDevice device, VkObjectType type, uint64_t object, std::string_view name);