66 virtual void Cleanup()
override;
81 inline void SetRender(
bool value) { bRender = value; }
85 virtual bool CreateImGUI()
override;
97 virtual void Draw(uint32_t vertexCount)
override;
99 virtual void Draw(uint32_t vertexCount, uint32_t firstVertex)
override;
101 virtual void DrawIndexed(uint32_t indexCount)
override;
103 virtual void DrawIndexed(uint32_t indexCount, uint32_t firstIndex,
104 int32_t baseVertex)
override;
106 virtual void DrawInstance(uint32_t instanceCount,
107 uint32_t vertexPerInstance)
override;
109 virtual void DrawIndexedInstance(uint32_t instanceCount,
110 uint32_t indexPerInstance)
override;
112 virtual void DrawIndexedInstance(uint32_t instanceCount,
113 uint32_t indexPerInstance,
115 int32_t baseVertex)
override;
118 virtual void SetRenderFace(
RenderFace face)
override;
120 virtual void SetRenderMode(
RenderMode mode)
override;
123 float minDepth = 0.0f,
124 float maxDepth = 1.0f)
override;
129 virtual void ClearDepthStencil(
bool clearDepth,
bool clearStencil,
130 float depth, uint8_t stencil)
override;
135 uint32_t slot = 0)
override;
138 uint32_t slot = 0)
override;
142 uint32_t slot = 0)
override;
146 void* data)
override;
148 virtual Shader* CreateShader(
const std::string& shaderSource)
override;
150 virtual Texture* CreateTexture(
const std::string& TexturePath)
override;
153 void* data)
override;
156 Texture* CreateCubemapTexture(
const std::array<std::string, 6>& facePaths);
158 Texture* CreateCubemapTextureFromPanorama(
const std::string& panoramaPath);
163 virtual void BindTextureRaw(
Sleak::Texture* texture, uint32_t slot = 0)
override;
165 virtual void BeginSkyboxPass()
override;
167 virtual void EndSkyboxPass()
override;
171 virtual void BeginSkinnedPass()
override;
173 virtual void EndSkinnedPass()
override;
177 virtual void EndCustomFormatPass()
override;
179 virtual void BeginDebugLinePass()
override;
181 virtual void EndDebugLinePass()
override;
185 virtual void BeginShadowPass()
override;
187 virtual void EndShadowPass()
override;
192 void UpdateShadowLightUBO(
const void* data, uint32_t size)
override;
194 void SetLightVP(
const float* lightVP)
override;
201 virtual void BindGBufferShader()
override;
205 virtual void ExecuteDeferredLightingPass()
override;
207 virtual void BeginForwardTransparentPass()
override;
209 virtual void EndForwardTransparentPass()
override;
211 virtual void UpdateDeferredCB(
const void* data, uint32_t size)
override;
216 void ApplyMSAAChange()
override;
218 void ApplyVSyncChange()
override;
220 void ApplyShadowResolutionChange()
override;
224 bool CreateSkyboxPipeline();
226 bool CreateSkinnedPipeline();
231 bool CreateGBufferResources();
233 bool CreateGBufferRenderPass();
235 bool CreateGBufferFramebuffer();
237 bool CreateGBufferPipeline();
239 bool CreateSkinnedGbufferPipeline();
241 bool CreateLightingRenderPass();
243 bool CreateLightingFramebuffers();
245 bool CreateLightingPipeline();
247 bool CreateForwardRenderPass();
249 bool CreateForwardFramebuffers();
251 bool CreateGBufferDescriptorSets();
253 bool CreateDeferredCBResources();
255 bool CreatePBRMaterialResources();
257 bool AddPBRMaterialChunk(uint32_t frame);
259 void DestroyPBRMaterialChunks();
261 bool CreateIBLResources();
263 void CleanupGBufferResources();
265 void CleanupIBLResources();
267 void UpdateGBufferDescriptors();
271 bool CreateShadowResources();
273 bool CreateShadowPipeline();
275 bool CreateShadowLightUBOResources();
277 void CleanupShadowResources();
281 bool CreateSurface();
285 bool CreateSwapChain();
287 bool RecreateSwapChain();
289 bool CreateImageViews();
291 bool CreateGraphicsPipeline();
293 bool CreateRenderPass();
295 bool CreateFrameBuffer();
297 bool CreateCommandPool();
299 bool CreateCommandBuffer();
302 bool CreateSyncObjects();
304 bool CreateDepthResources();
306 bool CreateDescriptorSetLayout();
308 bool CreateDescriptorPool();
310 bool AllocateDescriptorSets();
312 bool CreateDefaultTexture();
316 bool SetupDebugMessenger();
319 void CleanupSwapChain();
321 void CleanupDepthResources();
325 bool CreateMSAAColorResources();
327 void CleanupMSAAColorResources();
329 VkSampleCountFlagBits GetMaxUsableSampleCount();
332 virtual void ConfigureRenderMode()
override;
334 virtual void ConfigureRenderFace()
override;
337 std::vector<VkDeviceQueueCreateInfo>
338 GetUniqueQueueCreateInfos();
341 std::optional<SwapchainDetails> QuerySwapchain();
344 VkSurfaceFormatKHR ChooseFormat(
345 const std::vector<VkSurfaceFormatKHR>& formats);
347 VkPresentModeKHR ChoosePresentMode(
348 const std::vector<VkPresentModeKHR>& modes);
353 VkFormat FindDepthFormat();
355 uint32_t FindMemoryType(uint32_t typeFilter,
356 VkMemoryPropertyFlags properties);
359 void PopulateDebugMessengerCreateInfo(
360 VkDebugUtilsMessengerCreateInfoEXT& createInfo);
363 static VkBool32 Validation(
364 VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
365 VkDebugUtilsMessageTypeFlagsEXT messageTypes,
366 const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
370 bool bFrameStarted =
false;
372 static constexpr uint32_t MAX_FRAMES_IN_FLIGHT = 2;
373 uint32_t currentFrame = 0;
374 uint32_t CurrentFrameIndex = 0;
375 uint32_t m_semaphoreIndex = 0;
376 VkInstance instance = VK_NULL_HANDLE;
377 VkSurfaceKHR surface = VK_NULL_HANDLE;
378 VkRenderPass renderPass = VK_NULL_HANDLE;
379 VkSwapchainKHR swapChain = VK_NULL_HANDLE;
380 VkCommandPool commands = VK_NULL_HANDLE;
381 std::vector<VkCommandBuffer> commandBuffers;
382 VkCommandBuffer command = VK_NULL_HANDLE;
383 std::vector<VkFramebuffer> swapChainFramebuffers;
384 std::vector<VkImage> swapChainImages;
385 std::vector<VkImageView> swapChainImageViews;
386 VkFormat scImageFormat;
388 VkDevice device = VK_NULL_HANDLE;
389 VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;
390 std::vector<VkPhysicalDevice> GPUs;
391 VkPipeline pipeline = VK_NULL_HANDLE;
392 VkPipelineLayout pipelineLay = VK_NULL_HANDLE;
393 std::vector<VkSemaphore> imageAvailableSemaphores;
394 std::vector<VkSemaphore> renderFinishedSemaphores;
395 std::vector<VkFence> inFlightFences;
396 std::vector<VkFence> imagesInFlight;
398 VkClearValue clearColor;
401 VkImage depthImage = VK_NULL_HANDLE;
402 VkDeviceMemory depthImageMemory = VK_NULL_HANDLE;
403 VkImageView depthImageView = VK_NULL_HANDLE;
404 VkFormat depthFormat;
407 VkSampleCountFlagBits m_msaaSamples = VK_SAMPLE_COUNT_1_BIT;
408 VkImage m_msaaColorImage = VK_NULL_HANDLE;
409 VkDeviceMemory m_msaaColorImageMemory = VK_NULL_HANDLE;
410 VkImageView m_msaaColorImageView = VK_NULL_HANDLE;
413 VkDescriptorSetLayout descriptorSetLayout = VK_NULL_HANDLE;
414 VkDescriptorPool descriptorPool = VK_NULL_HANDLE;
415 std::vector<VkDescriptorSet> descriptorSets;
418 VkQueue graphicsQueue = VK_NULL_HANDLE;
419 VkQueue computeQueue = VK_NULL_HANDLE;
420 VkQueue transferQueue = VK_NULL_HANDLE;
421 VkQueue presentQueue = VK_NULL_HANDLE;
423 VkDebugUtilsMessengerEXT debugMessenger = VK_NULL_HANDLE;
424 PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT =
430 bool m_textureDescriptorsWritten =
false;
434 VkPipeline skyboxPipeline = VK_NULL_HANDLE;
436 VkDescriptorPool skyboxDescriptorPool = VK_NULL_HANDLE;
437 std::vector<VkDescriptorSet> skyboxDescriptorSets;
438 bool m_skyboxDescriptorsWritten =
false;
439 VkImageView m_skyboxCubemapView = VK_NULL_HANDLE;
440 VkSampler m_skyboxCubemapSampler = VK_NULL_HANDLE;
443 VkPipeline skinnedPipeline = VK_NULL_HANDLE;
447 VkPipeline debugLinePipeline = VK_NULL_HANDLE;
450 bool CreateDebugLinePipeline();
456 struct CustomFormatPipelines {
457 VkPipeline main = VK_NULL_HANDLE;
458 VkPipeline shadow = VK_NULL_HANDLE;
459 VkPipeline gbuffer = VK_NULL_HANDLE;
460 VkPipeline transparent = VK_NULL_HANDLE;
461 bool mainFailed =
false;
462 bool shadowFailed =
false;
463 bool gbufferFailed =
false;
464 bool transparentFailed =
false;
466 std::unordered_map<VertexFormatHandle, CustomFormatPipelines>
467 m_customFormatPipelines;
471 bool m_customFormatUnbound =
false;
473 bool CustomFormatDrawsSuppressed()
const;
477 void DestroyCustomFormatPipelines();
480 VkDescriptorSetLayout boneDescriptorSetLayout = VK_NULL_HANDLE;
481 VkDescriptorPool boneDescriptorPool = VK_NULL_HANDLE;
482 std::array<VkBuffer, MAX_FRAMES_IN_FLIGHT> boneUBOBuffers = {};
483 std::array<VkDeviceMemory, MAX_FRAMES_IN_FLIGHT> boneUBOMemory = {};
484 std::array<void*, MAX_FRAMES_IN_FLIGHT> boneUBOMapped = {};
485 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> boneDescriptorSets = {};
486 bool m_boneUBOCreated =
false;
488 bool CreateBoneUBOResources();
490 void CleanupBoneUBOResources();
493 VkDescriptorPool imguiDescriptorPool = VK_NULL_HANDLE;
496 VkImage m_shadowImage = VK_NULL_HANDLE;
497 VkDeviceMemory m_shadowImageMemory = VK_NULL_HANDLE;
498 VkImageView m_shadowImageView = VK_NULL_HANDLE;
499 VkSampler m_shadowSampler = VK_NULL_HANDLE;
500 VkSampler m_shadowRawSampler = VK_NULL_HANDLE;
501 VkRenderPass m_shadowRenderPass = VK_NULL_HANDLE;
502 VkFramebuffer m_shadowFramebuffer = VK_NULL_HANDLE;
503 VkPipeline m_shadowPipeline = VK_NULL_HANDLE;
504 VulkanShader* m_shadowShader =
nullptr;
505 bool m_shadowPassActive =
false;
512 float m_shadowWorldCache[16] = {};
513 float m_shadowPCCache[32] = {};
514 bool m_shadowPCCacheValid =
false;
517 float m_lightVP[16] = {};
521 float m_pendingLightVP[16] = {};
522 bool m_hasPendingLightVP =
false;
525 VkDescriptorSetLayout m_lightUBODescriptorSetLayout = VK_NULL_HANDLE;
526 VkDescriptorPool m_lightUBODescriptorPool = VK_NULL_HANDLE;
527 std::array<VkBuffer, MAX_FRAMES_IN_FLIGHT> m_lightUBOBuffers = {};
528 std::array<VkDeviceMemory, MAX_FRAMES_IN_FLIGHT> m_lightUBOMemory = {};
529 std::array<void*, MAX_FRAMES_IN_FLIGHT> m_lightUBOMapped = {};
530 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_lightUBODescriptorSets = {};
533 VkDescriptorSetLayout m_shadowSamplerDescriptorSetLayout = VK_NULL_HANDLE;
534 VkDescriptorPool m_shadowSamplerDescriptorPool = VK_NULL_HANDLE;
535 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_shadowSamplerDescriptorSets = {};
536 bool m_lightUBOCreated =
false;
539 std::array<VkSemaphore, MAX_FRAMES_IN_FLIGHT> m_transferSemaphores = {};
540 std::array<VulkanBuffer::AsyncFlushResult, MAX_FRAMES_IN_FLIGHT> m_asyncFlush;
547 static constexpr uint32_t GBUFFER_COUNT = 3;
548 VkImage m_gbufferImages[GBUFFER_COUNT] = {};
549 VkDeviceMemory m_gbufferMemory[GBUFFER_COUNT] = {};
550 VkImageView m_gbufferViews[GBUFFER_COUNT] = {};
552 static const VkFormat m_gbufferFormats[GBUFFER_COUNT];
553 VkRenderPass m_gbufferRenderPass = VK_NULL_HANDLE;
554 VkFramebuffer m_gbufferFramebuffer = VK_NULL_HANDLE;
555 VkPipeline m_gbufferPipeline = VK_NULL_HANDLE;
556 VkPipeline m_skinnedGbufferPipeline = VK_NULL_HANDLE;
557 VkPipelineLayout m_gbufferPipelineLayout = VK_NULL_HANDLE;
558 VulkanShader* m_gbufferShader =
nullptr;
559 bool m_gbufferResourcesCreated =
false;
560 bool m_inGeometryPass =
false;
563 VkRenderPass m_lightingRenderPass = VK_NULL_HANDLE;
564 std::vector<VkFramebuffer> m_lightingFramebuffers;
565 VkPipeline m_lightingPipeline = VK_NULL_HANDLE;
566 VkPipelineLayout m_lightingPipelineLayout = VK_NULL_HANDLE;
567 VulkanShader* m_lightingShader =
nullptr;
570 VkRenderPass m_forwardRenderPass = VK_NULL_HANDLE;
571 std::vector<VkFramebuffer> m_forwardFramebuffers;
572 bool m_inForwardTransparentPass =
false;
573 bool m_forwardPassOpen =
false;
576 VkDescriptorSetLayout m_gbufferSamplerDSL = VK_NULL_HANDLE;
577 VkDescriptorPool m_gbufferSamplerPool = VK_NULL_HANDLE;
578 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_gbufferSamplerSets = {};
579 VkSampler m_gbufferSampler = VK_NULL_HANDLE;
580 VkSampler m_depthSampler = VK_NULL_HANDLE;
583 struct DeferredCBData {
584 float InvViewProj[16];
585 float ScreenW, ScreenH, NearP, FarP;
587 VkDescriptorSetLayout m_deferredCBDSL = VK_NULL_HANDLE;
588 VkDescriptorPool m_deferredCBPool = VK_NULL_HANDLE;
589 std::array<VkBuffer, MAX_FRAMES_IN_FLIGHT> m_deferredCBBuffers = {};
590 std::array<VkDeviceMemory, MAX_FRAMES_IN_FLIGHT> m_deferredCBMemory = {};
591 std::array<void*, MAX_FRAMES_IN_FLIGHT> m_deferredCBMapped = {};
592 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_deferredCBSets = {};
593 bool m_deferredCBCreated =
false;
597 struct alignas(16) PBRMaterialParams {
598 float albedoFactorR, albedoFactorG, albedoFactorB, albedoFactorA;
599 float metallicFactor, roughnessFactor, aoFactor, normalIntensity;
600 float emissiveR, emissiveG, emissiveB, emissiveIntensity;
601 float tilingX, tilingY, offsetX, offsetY;
602 uint32_t hasNormalMap, hasMetallicMap, hasRoughnessMap, hasAOMap;
603 uint32_t hasEmissiveMap;
float _pad0, _pad1, _pad2;
609 static constexpr uint32_t PBR_SETS_PER_FRAME = 64;
610 struct PBRMaterialChunk {
611 VkDescriptorPool pool = VK_NULL_HANDLE;
612 std::array<VkDescriptorSet, PBR_SETS_PER_FRAME> sets = {};
613 VkBuffer ubo = VK_NULL_HANDLE;
614 VkDeviceMemory memory = VK_NULL_HANDLE;
615 void* mapped =
nullptr;
617 VkDescriptorSetLayout m_pbrMaterialDSL = VK_NULL_HANDLE;
618 std::array<std::vector<PBRMaterialChunk>, MAX_FRAMES_IN_FLIGHT>
620 VkDeviceSize m_pbrMaterialUBOStride = 0;
621 uint32_t m_pbrMaterialSlot[MAX_FRAMES_IN_FLIGHT] = {};
622 bool m_pbrMaterialResourcesCreated =
false;
623 VkPipelineLayout m_gbufferGeomLayout = VK_NULL_HANDLE;
626 VkImage m_iblIrradianceImage = VK_NULL_HANDLE;
627 VkDeviceMemory m_iblIrradianceMemory = VK_NULL_HANDLE;
628 VkImageView m_iblIrradianceView = VK_NULL_HANDLE;
629 VkSampler m_iblIrradianceSampler = VK_NULL_HANDLE;
631 VkImage m_iblPrefilterImage = VK_NULL_HANDLE;
632 VkDeviceMemory m_iblPrefilterMemory = VK_NULL_HANDLE;
633 VkImageView m_iblPrefilterView = VK_NULL_HANDLE;
634 VkSampler m_iblPrefilterSampler = VK_NULL_HANDLE;
635 static constexpr uint32_t IBL_PREFILTER_MIP_LEVELS = 5;
637 VkImage m_iblBrdfLutImage = VK_NULL_HANDLE;
638 VkDeviceMemory m_iblBrdfLutMemory = VK_NULL_HANDLE;
639 VkImageView m_iblBrdfLutView = VK_NULL_HANDLE;
640 VkSampler m_iblBrdfLutSampler = VK_NULL_HANDLE;
642 VkDescriptorSetLayout m_iblDSL = VK_NULL_HANDLE;
643 VkDescriptorPool m_iblPool = VK_NULL_HANDLE;
644 std::array<VkBuffer, MAX_FRAMES_IN_FLIGHT> m_iblSettingsBuffers = {};
645 std::array<VkDeviceMemory, MAX_FRAMES_IN_FLIGHT> m_iblSettingsMemory = {};
646 std::array<void*, MAX_FRAMES_IN_FLIGHT> m_iblSettingsMapped = {};
647 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_iblSets = {};
648 bool m_iblResourcesCreated =
false;
649 bool m_iblReady =
false;
653 static constexpr uint32_t SSAO_KERNEL_SIZE = 32;
654 static constexpr uint32_t SSAO_NOISE_SIZE = 4;
655 bool m_ssaoResourcesCreated =
false;
656 VkExtent2D m_ssaoExtent = {0, 0};
657 VkFormat m_ssaoFormat = VK_FORMAT_R8_UNORM;
659 VkImage m_ssaoRawImage = VK_NULL_HANDLE;
660 VkDeviceMemory m_ssaoRawMemory = VK_NULL_HANDLE;
661 VkImageView m_ssaoRawView = VK_NULL_HANDLE;
662 VkFramebuffer m_ssaoRawFramebuffer = VK_NULL_HANDLE;
664 VkImage m_ssaoBlurImage = VK_NULL_HANDLE;
665 VkDeviceMemory m_ssaoBlurMemory = VK_NULL_HANDLE;
666 VkImageView m_ssaoBlurView = VK_NULL_HANDLE;
667 VkFramebuffer m_ssaoBlurFramebuffer = VK_NULL_HANDLE;
669 VkRenderPass m_ssaoRenderPass = VK_NULL_HANDLE;
670 VkPipeline m_ssaoPipeline = VK_NULL_HANDLE;
671 VkPipeline m_ssaoBlurPipeline = VK_NULL_HANDLE;
672 VkPipelineLayout m_ssaoPipelineLayout = VK_NULL_HANDLE;
673 VkPipelineLayout m_ssaoBlurPipelineLayout = VK_NULL_HANDLE;
674 VulkanShader* m_ssaoShader =
nullptr;
675 VulkanShader* m_ssaoBlurShader =
nullptr;
677 VkSampler m_ssaoSampler = VK_NULL_HANDLE;
678 VkSampler m_ssaoPointSampler = VK_NULL_HANDLE;
681 VkImage m_ssaoNoiseImage = VK_NULL_HANDLE;
682 VkDeviceMemory m_ssaoNoiseMemory = VK_NULL_HANDLE;
683 VkImageView m_ssaoNoiseView = VK_NULL_HANDLE;
684 VkSampler m_ssaoNoiseSampler = VK_NULL_HANDLE;
687 struct alignas(16) SSAOParams {
689 float Projection[16];
690 float InvViewProj[16];
691 float Kernel[SSAO_KERNEL_SIZE][4];
692 float ScreenW, ScreenH;
693 float NoiseScaleX, NoiseScaleY;
694 float Radius, Bias, Power, Intensity;
696 float _pad0, _pad1, _pad2;
698 VkDescriptorSetLayout m_ssaoInputDSL = VK_NULL_HANDLE;
699 VkDescriptorSetLayout m_ssaoUboDSL = VK_NULL_HANDLE;
700 VkDescriptorSetLayout m_ssaoBlurDSL = VK_NULL_HANDLE;
701 VkDescriptorPool m_ssaoDescriptorPool = VK_NULL_HANDLE;
702 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_ssaoInputSets = {};
703 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_ssaoUboSets = {};
704 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_ssaoBlurSets = {};
705 std::array<VkBuffer, MAX_FRAMES_IN_FLIGHT> m_ssaoUboBuffers = {};
706 std::array<VkDeviceMemory, MAX_FRAMES_IN_FLIGHT> m_ssaoUboMemory = {};
707 std::array<void*, MAX_FRAMES_IN_FLIGHT> m_ssaoUboMapped = {};
711 float m_cachedView[16] = {};
712 float m_cachedProjection[16] = {};
715 float m_cachedInvViewProj[16] = {};
718 bool CreateSSAOResources();
722 void InitDisabledEffectFallbacks();
724 void CleanupSSAOResources();
726 bool CreateSSAOImages();
728 bool CreateSSAORenderPass();
730 bool CreateSSAOFramebuffers();
732 bool CreateSSAOPipelines();
734 bool CreateSSAODescriptorResources();
736 bool CreateSSAONoiseTexture();
738 void UpdateSSAODescriptors();
740 void UpdateSSAOUBO();
742 void RenderSSAOPasses();
747 struct alignas(16) SSRParams {
749 float Projection[16];
750 float InvViewProj[16];
752 float ScreenW, ScreenH;
757 float RoughnessThreshold;
761 bool m_ssrResourcesCreated =
false;
763 VkFormat m_ssrFormat = VK_FORMAT_R16G16B16A16_SFLOAT;
765 VkImage m_ssrImage = VK_NULL_HANDLE;
766 VkDeviceMemory m_ssrMemory = VK_NULL_HANDLE;
767 VkImageView m_ssrView = VK_NULL_HANDLE;
768 VkSampler m_ssrSampler = VK_NULL_HANDLE;
769 VkRenderPass m_ssrRenderPass = VK_NULL_HANDLE;
770 VkFramebuffer m_ssrFramebuffer = VK_NULL_HANDLE;
771 VkPipeline m_ssrPipeline = VK_NULL_HANDLE;
772 VkPipelineLayout m_ssrPipelineLayout = VK_NULL_HANDLE;
773 VulkanShader* m_ssrShader =
nullptr;
775 VkDescriptorSetLayout m_ssrInputDSL = VK_NULL_HANDLE;
776 VkDescriptorSetLayout m_ssrUboDSL = VK_NULL_HANDLE;
777 VkDescriptorPool m_ssrPool = VK_NULL_HANDLE;
779 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_ssrInputSets{};
780 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_ssrUboSets{};
781 std::array<VkBuffer, MAX_FRAMES_IN_FLIGHT> m_ssrUboBuffers{};
782 std::array<VkDeviceMemory, MAX_FRAMES_IN_FLIGHT> m_ssrUboMemory{};
783 std::array<void*, MAX_FRAMES_IN_FLIGHT> m_ssrUboMapped{};
786 bool CreateSSRResources();
788 void CleanupSSRResources();
792 void UpdateSSRDescriptors();
794 void RenderSSRPass();
799 struct alignas(16) TAAParams {
800 float InvCurrentVP[16];
802 float ScreenW, ScreenH;
807 bool m_taaResourcesCreated =
false;
809 uint64_t m_taaFrameIdx = 0;
811 VkImage m_taaImages[2] = {};
812 VkDeviceMemory m_taaMemory[2] = {};
813 VkImageView m_taaViews[2] = {};
814 VkRenderPass m_taaRenderPass = VK_NULL_HANDLE;
815 VkFramebuffer m_taaFramebufs[2] = {};
816 VkSampler m_taaSampler = VK_NULL_HANDLE;
818 VkDescriptorSetLayout m_taaInputDSL = VK_NULL_HANDLE;
819 VkDescriptorSetLayout m_taaUboDSL = VK_NULL_HANDLE;
820 VkDescriptorPool m_taaPool = VK_NULL_HANDLE;
822 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_taaInputSets{};
823 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_taaUboSets{};
824 std::array<VkBuffer, MAX_FRAMES_IN_FLIGHT> m_taaUboBuffers{};
825 std::array<VkDeviceMemory, MAX_FRAMES_IN_FLIGHT> m_taaUboMemory{};
826 std::array<void*, MAX_FRAMES_IN_FLIGHT> m_taaUboMapped{};
828 VkPipelineLayout m_taaPipelineLayout = VK_NULL_HANDLE;
829 VkPipeline m_taaPipeline = VK_NULL_HANDLE;
830 VulkanShader* m_taaShader =
nullptr;
832 float m_prevViewProj[16] = {};
833 float m_taaJitter[2] = {};
836 bool CreateTAAResources();
838 void CleanupTAAResources();
842 void RenderTAAPass();
851 bool m_ssaoFallbackPrimed =
false;
852 bool m_ssrFallbackPrimed =
false;
853 bool m_bloomFallbackPrimed =
false;
859 static constexpr uint32_t BLOOM_MIP_COUNT = 6;
860 bool m_bloomResourcesCreated =
false;
861 VkFormat m_hdrSceneFormat = VK_FORMAT_R16G16B16A16_SFLOAT;
864 VkImage m_hdrSceneImage = VK_NULL_HANDLE;
865 VkDeviceMemory m_hdrSceneMemory = VK_NULL_HANDLE;
866 VkImageView m_hdrSceneView = VK_NULL_HANDLE;
867 VkFramebuffer m_hdrSceneFramebuffer = VK_NULL_HANDLE;
868 VkRenderPass m_hdrLightingRenderPass = VK_NULL_HANDLE;
872 VkImage m_bloomImage = VK_NULL_HANDLE;
873 VkDeviceMemory m_bloomMemory = VK_NULL_HANDLE;
874 std::array<VkImageView, BLOOM_MIP_COUNT> m_bloomMipViews = {};
875 std::array<VkFramebuffer, BLOOM_MIP_COUNT> m_bloomMipFramebuffers = {};
876 std::array<VkExtent2D, BLOOM_MIP_COUNT> m_bloomMipExtents = {};
878 VkRenderPass m_bloomRenderPass = VK_NULL_HANDLE;
879 VkRenderPass m_bloomAddRenderPass = VK_NULL_HANDLE;
880 VkRenderPass m_bloomCompositeRenderPass = VK_NULL_HANDLE;
881 std::vector<VkFramebuffer> m_bloomCompositeFramebuffers;
883 VkPipeline m_bloomThresholdPipeline = VK_NULL_HANDLE;
884 VkPipeline m_bloomDownsamplePipeline = VK_NULL_HANDLE;
885 VkPipeline m_bloomUpsamplePipeline = VK_NULL_HANDLE;
886 VkPipeline m_bloomCompositePipeline = VK_NULL_HANDLE;
887 VkPipelineLayout m_bloomFilterPipelineLayout = VK_NULL_HANDLE;
888 VkPipelineLayout m_bloomCompositePipelineLayout = VK_NULL_HANDLE;
889 VulkanShader* m_bloomThresholdShader =
nullptr;
890 VulkanShader* m_bloomDownsampleShader =
nullptr;
891 VulkanShader* m_bloomUpsampleShader =
nullptr;
892 VulkanShader* m_bloomCompositeShader =
nullptr;
898 VkDescriptorSetLayout m_bloomFilterDSL = VK_NULL_HANDLE;
899 VkDescriptorSetLayout m_bloomCompositeDSL = VK_NULL_HANDLE;
900 VkDescriptorPool m_bloomDescriptorPool = VK_NULL_HANDLE;
905 static constexpr uint32_t BLOOM_TRANSITION_COUNT = 1 + (BLOOM_MIP_COUNT - 1) + (BLOOM_MIP_COUNT - 1);
906 std::array<std::array<VkDescriptorSet, BLOOM_TRANSITION_COUNT>, MAX_FRAMES_IN_FLIGHT> m_bloomFilterSets = {};
907 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_bloomCompositeSets = {};
909 VkSampler m_bloomSampler = VK_NULL_HANDLE;
912 bool CreateBloomResources();
914 void CleanupBloomResources();
916 bool CreateHDRSceneResources();
918 bool CreateBloomImages();
920 bool CreateBloomRenderPasses();
922 bool CreateBloomFramebuffers();
924 bool CreateBloomPipelines();
926 bool CreateBloomDescriptorResources();
928 void RenderBloomPass();
930 void RenderBloomCompositePass();
933 static void FillFullscreenViewportScissor(VkCommandBuffer cmd, VkExtent2D ext);