1
0
Fork 0
Univerxel/src/client/render/vk/CommandCenter.hpp

68 lines
2.0 KiB
C++

#pragma once
#include "forward.hpp"
#include <vector>
#include <glm/mat4x4.hpp>
#include "api/Buffers.hpp"
#include "api/Images.hpp"
#include "api/Models.hpp"
namespace render::vk {
class SwapChain;
class Pipeline;
struct Subpass;
class CommandCenter final {
public:
CommandCenter(VkDevice, const PhysicalDeviceInfo&, const renderOptions&);
~CommandCenter();
void startRecording(uint32_t idx, VkRenderPass, VkExtent2D, const VoxelUBO&);
void startWorldPass(uint32_t idx, const Subpass&);
size_t recordModel(uint32_t idx, const Subpass &worldPass, const UniqueCurvaturePush&, const LodModel *const);
void startEntityPass(uint32_t idx);
void recordIndicator(uint32_t idx, const Subpass&, glm::mat4 model);
void recordPostprocess(uint32_t idx, const Subpass&, bool skybox);
void submitGraphics(uint32_t, VkSemaphore, VkSemaphore, VkFence);
void allocate(const std::vector<VkImageView>&, const Pipeline&, VkExtent2D);
void free();
private:
void loadAtlases(const std::string &texturePath);
VkDevice device;
std::vector<VkFramebuffer> framebuffers;
VkFormat colorFormat;
VkSampleCountFlagBits colorSamples;
std::unique_ptr<Image> colorbuffer;
VkFormat depthFormat;
std::unique_ptr<Image> depthbuffer;
VkQueue graphicsQueue;
VkCommandPool graphicsPool;
std::vector<VkCommandBuffer> graphicsBuffers;
BufferGroup uniformBuffers;
VkDescriptorPool voxelDescriptorPool;
std::vector<VkDescriptorSet> voxelDescriptorSets;
std::unique_ptr<TextureArray> voxelTextureAtlas;
std::unique_ptr<TextureArray> voxelNormalAtlas;
std::unique_ptr<TextureArray> voxelHOSAtlas;
VkDescriptorPool indicDescriptorPool;
std::vector<VkDescriptorSet> indicDescriptorSets;
std::unique_ptr<Indicator> indicCubeBuffer;
VkDescriptorPool skyDescriptorPool;
std::vector<VkDescriptorSet> skyDescriptorSets;
std::unique_ptr<TextureCube> skyboxTexture;
std::unique_ptr<Shape> skyCubeBuffer;
bool freed = true;
};
}