#pragma once #include "vulkan/system/vk_objects.h" #include "r_data/renderstyle.h" #include class VKDataBuffer; class VkRenderPassKey { public: FRenderStyle RenderStyle; int SpecialEffect; int EffectState; bool AlphaTest; bool operator<(const VkRenderPassKey &other) const { uint64_t a = RenderStyle.AsDWORD | (static_cast(SpecialEffect) << 32) | (static_cast(EffectState) << 40) | (static_cast(AlphaTest) << 48); uint64_t b = other.RenderStyle.AsDWORD | (static_cast(other.SpecialEffect) << 32) | (static_cast(other.EffectState) << 40) | (static_cast(other.AlphaTest) << 48); return a < b; } }; class VkRenderPassSetup { public: VkRenderPassSetup(const VkRenderPassKey &key); std::unique_ptr RenderPass; std::unique_ptr Pipeline; std::unique_ptr Framebuffer; private: void CreatePipeline(const VkRenderPassKey &key); void CreateRenderPass(); void CreateFramebuffer(); }; class VkRenderPassManager { public: VkRenderPassManager(); void BeginFrame(); VkRenderPassSetup *GetRenderPass(const VkRenderPassKey &key); std::unique_ptr DynamicSetLayout; std::unique_ptr TextureSetLayout; std::unique_ptr PipelineLayout; std::unique_ptr DescriptorPool; std::map> RenderPassSetup; std::unique_ptr SceneColor; std::unique_ptr SceneDepthStencil; std::unique_ptr SceneColorView; std::unique_ptr SceneDepthStencilView; std::unique_ptr SceneDepthView; std::unique_ptr DynamicSet; private: void CreateDynamicSetLayout(); void CreateTextureSetLayout(); void CreatePipelineLayout(); void CreateDescriptorPool(); void CreateDynamicSet(); };