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 DrawIndexed(uint32_t indexCount)
override;
101 virtual void DrawInstance(uint32_t instanceCount,
102 uint32_t vertexPerInstance)
override;
104 virtual void DrawIndexedInstance(uint32_t instanceCount,
105 uint32_t indexPerInstance)
override;
108 virtual void SetRenderFace(
RenderFace face)
override;
110 virtual void SetRenderMode(
RenderMode mode)
override;
113 float minDepth = 0.0f,
114 float maxDepth = 1.0f)
override;
119 virtual void ClearDepthStencil(
bool clearDepth,
bool clearStencil,
120 float depth, uint8_t stencil)
override;
125 uint32_t slot = 0)
override;
128 uint32_t slot = 0)
override;
132 uint32_t slot = 0)
override;
136 void* data)
override;
138 virtual Shader* CreateShader(
const std::string& shaderSource)
override;
140 virtual Texture* CreateTexture(
const std::string& TexturePath)
override;
143 void* data)
override;
146 Texture* CreateCubemapTexture(
const std::array<std::string, 6>& facePaths);
148 Texture* CreateCubemapTextureFromPanorama(
const std::string& panoramaPath);
153 virtual void BindTextureRaw(
Sleak::Texture* texture, uint32_t slot = 0)
override;
155 virtual void BeginSkyboxPass()
override;
157 virtual void EndSkyboxPass()
override;
161 virtual void BeginSkinnedPass()
override;
163 virtual void EndSkinnedPass()
override;
167 virtual void EndCustomFormatPass()
override;
169 virtual void BeginDebugLinePass()
override;
171 virtual void EndDebugLinePass()
override;
175 virtual void BeginShadowPass()
override;
177 virtual void EndShadowPass()
override;
182 void UpdateShadowLightUBO(
const void* data, uint32_t size)
override;
184 void SetLightVP(
const float* lightVP)
override;
191 virtual void BindGBufferShader()
override;
195 virtual void ExecuteDeferredLightingPass()
override;
197 virtual void BeginForwardTransparentPass()
override;
199 virtual void EndForwardTransparentPass()
override;
201 virtual void UpdateDeferredCB(
const void* data, uint32_t size)
override;
206 void ApplyMSAAChange()
override;
208 void ApplyVSyncChange()
override;
210 void ApplyShadowResolutionChange()
override;
214 bool CreateSkyboxPipeline();
216 bool CreateSkinnedPipeline();
221 bool CreateGBufferResources();
223 bool CreateGBufferRenderPass();
225 bool CreateGBufferFramebuffer();
227 bool CreateGBufferPipeline();
229 bool CreateSkinnedGbufferPipeline();
231 bool CreateLightingRenderPass();
233 bool CreateLightingFramebuffers();
235 bool CreateLightingPipeline();
237 bool CreateForwardRenderPass();
239 bool CreateForwardFramebuffers();
241 bool CreateGBufferDescriptorSets();
243 bool CreateDeferredCBResources();
245 bool CreatePBRMaterialResources();
247 bool CreateIBLResources();
249 void CleanupGBufferResources();
251 void CleanupIBLResources();
253 void UpdateGBufferDescriptors();
257 bool CreateShadowResources();
259 bool CreateShadowPipeline();
261 bool CreateShadowLightUBOResources();
263 void CleanupShadowResources();
267 bool CreateSurface();
271 bool CreateSwapChain();
273 bool RecreateSwapChain();
275 bool CreateImageViews();
277 bool CreateGraphicsPipeline();
279 bool CreateRenderPass();
281 bool CreateFrameBuffer();
283 bool CreateCommandPool();
285 bool CreateCommandBuffer();
288 bool CreateSyncObjects();
290 bool CreateDepthResources();
292 bool CreateDescriptorSetLayout();
294 bool CreateDescriptorPool();
296 bool AllocateDescriptorSets();
298 bool CreateDefaultTexture();
302 bool SetupDebugMessenger();
305 void CleanupSwapChain();
307 void CleanupDepthResources();
311 bool CreateMSAAColorResources();
313 void CleanupMSAAColorResources();
315 VkSampleCountFlagBits GetMaxUsableSampleCount();
318 virtual void ConfigureRenderMode()
override;
320 virtual void ConfigureRenderFace()
override;
323 std::vector<VkDeviceQueueCreateInfo>
324 GetUniqueQueueCreateInfos();
327 std::optional<SwapchainDetails> QuerySwapchain();
330 VkSurfaceFormatKHR ChooseFormat(
331 const std::vector<VkSurfaceFormatKHR>& formats);
333 VkPresentModeKHR ChoosePresentMode(
334 const std::vector<VkPresentModeKHR>& modes);
339 VkFormat FindDepthFormat();
341 uint32_t FindMemoryType(uint32_t typeFilter,
342 VkMemoryPropertyFlags properties);
345 void PopulateDebugMessengerCreateInfo(
346 VkDebugUtilsMessengerCreateInfoEXT& createInfo);
349 static VkBool32 Validation(
350 VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
351 VkDebugUtilsMessageTypeFlagsEXT messageTypes,
352 const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
356 bool bFrameStarted =
false;
358 static constexpr uint32_t MAX_FRAMES_IN_FLIGHT = 2;
359 uint32_t currentFrame = 0;
360 uint32_t CurrentFrameIndex = 0;
361 uint32_t m_semaphoreIndex = 0;
362 VkInstance instance = VK_NULL_HANDLE;
363 VkSurfaceKHR surface = VK_NULL_HANDLE;
364 VkRenderPass renderPass = VK_NULL_HANDLE;
365 VkSwapchainKHR swapChain = VK_NULL_HANDLE;
366 VkCommandPool commands = VK_NULL_HANDLE;
367 std::vector<VkCommandBuffer> commandBuffers;
368 VkCommandBuffer command = VK_NULL_HANDLE;
369 std::vector<VkFramebuffer> swapChainFramebuffers;
370 std::vector<VkImage> swapChainImages;
371 std::vector<VkImageView> swapChainImageViews;
372 VkFormat scImageFormat;
374 VkDevice device = VK_NULL_HANDLE;
375 VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;
376 std::vector<VkPhysicalDevice> GPUs;
377 VkPipeline pipeline = VK_NULL_HANDLE;
378 VkPipelineLayout pipelineLay = VK_NULL_HANDLE;
379 std::vector<VkSemaphore> imageAvailableSemaphores;
380 std::vector<VkSemaphore> renderFinishedSemaphores;
381 std::vector<VkFence> inFlightFences;
382 std::vector<VkFence> imagesInFlight;
384 VkClearValue clearColor;
387 VkImage depthImage = VK_NULL_HANDLE;
388 VkDeviceMemory depthImageMemory = VK_NULL_HANDLE;
389 VkImageView depthImageView = VK_NULL_HANDLE;
390 VkFormat depthFormat;
393 VkSampleCountFlagBits m_msaaSamples = VK_SAMPLE_COUNT_1_BIT;
394 VkImage m_msaaColorImage = VK_NULL_HANDLE;
395 VkDeviceMemory m_msaaColorImageMemory = VK_NULL_HANDLE;
396 VkImageView m_msaaColorImageView = VK_NULL_HANDLE;
399 VkDescriptorSetLayout descriptorSetLayout = VK_NULL_HANDLE;
400 VkDescriptorPool descriptorPool = VK_NULL_HANDLE;
401 std::vector<VkDescriptorSet> descriptorSets;
404 VkQueue graphicsQueue = VK_NULL_HANDLE;
405 VkQueue computeQueue = VK_NULL_HANDLE;
406 VkQueue transferQueue = VK_NULL_HANDLE;
407 VkQueue presentQueue = VK_NULL_HANDLE;
409 VkDebugUtilsMessengerEXT debugMessenger = VK_NULL_HANDLE;
410 PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT =
416 bool m_textureDescriptorsWritten =
false;
420 VkPipeline skyboxPipeline = VK_NULL_HANDLE;
422 VkDescriptorPool skyboxDescriptorPool = VK_NULL_HANDLE;
423 std::vector<VkDescriptorSet> skyboxDescriptorSets;
424 bool m_skyboxDescriptorsWritten =
false;
425 VkImageView m_skyboxCubemapView = VK_NULL_HANDLE;
426 VkSampler m_skyboxCubemapSampler = VK_NULL_HANDLE;
429 VkPipeline skinnedPipeline = VK_NULL_HANDLE;
433 VkPipeline debugLinePipeline = VK_NULL_HANDLE;
436 bool CreateDebugLinePipeline();
442 struct CustomFormatPipelines {
443 VkPipeline main = VK_NULL_HANDLE;
444 VkPipeline shadow = VK_NULL_HANDLE;
445 VkPipeline gbuffer = VK_NULL_HANDLE;
446 VkPipeline transparent = VK_NULL_HANDLE;
447 bool mainFailed =
false;
448 bool shadowFailed =
false;
449 bool gbufferFailed =
false;
450 bool transparentFailed =
false;
452 std::unordered_map<VertexFormatHandle, CustomFormatPipelines>
453 m_customFormatPipelines;
457 bool m_customFormatUnbound =
false;
459 bool CustomFormatDrawsSuppressed()
const;
463 void DestroyCustomFormatPipelines();
466 VkDescriptorSetLayout boneDescriptorSetLayout = VK_NULL_HANDLE;
467 VkDescriptorPool boneDescriptorPool = VK_NULL_HANDLE;
468 std::array<VkBuffer, MAX_FRAMES_IN_FLIGHT> boneUBOBuffers = {};
469 std::array<VkDeviceMemory, MAX_FRAMES_IN_FLIGHT> boneUBOMemory = {};
470 std::array<void*, MAX_FRAMES_IN_FLIGHT> boneUBOMapped = {};
471 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> boneDescriptorSets = {};
472 bool m_boneUBOCreated =
false;
474 bool CreateBoneUBOResources();
476 void CleanupBoneUBOResources();
479 VkDescriptorPool imguiDescriptorPool = VK_NULL_HANDLE;
482 VkImage m_shadowImage = VK_NULL_HANDLE;
483 VkDeviceMemory m_shadowImageMemory = VK_NULL_HANDLE;
484 VkImageView m_shadowImageView = VK_NULL_HANDLE;
485 VkSampler m_shadowSampler = VK_NULL_HANDLE;
486 VkSampler m_shadowRawSampler = VK_NULL_HANDLE;
487 VkRenderPass m_shadowRenderPass = VK_NULL_HANDLE;
488 VkFramebuffer m_shadowFramebuffer = VK_NULL_HANDLE;
489 VkPipeline m_shadowPipeline = VK_NULL_HANDLE;
490 VulkanShader* m_shadowShader =
nullptr;
491 bool m_shadowPassActive =
false;
498 float m_shadowWorldCache[16] = {};
499 float m_shadowPCCache[32] = {};
500 bool m_shadowPCCacheValid =
false;
503 float m_lightVP[16] = {};
507 float m_pendingLightVP[16] = {};
508 bool m_hasPendingLightVP =
false;
511 VkDescriptorSetLayout m_lightUBODescriptorSetLayout = VK_NULL_HANDLE;
512 VkDescriptorPool m_lightUBODescriptorPool = VK_NULL_HANDLE;
513 std::array<VkBuffer, MAX_FRAMES_IN_FLIGHT> m_lightUBOBuffers = {};
514 std::array<VkDeviceMemory, MAX_FRAMES_IN_FLIGHT> m_lightUBOMemory = {};
515 std::array<void*, MAX_FRAMES_IN_FLIGHT> m_lightUBOMapped = {};
516 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_lightUBODescriptorSets = {};
519 VkDescriptorSetLayout m_shadowSamplerDescriptorSetLayout = VK_NULL_HANDLE;
520 VkDescriptorPool m_shadowSamplerDescriptorPool = VK_NULL_HANDLE;
521 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_shadowSamplerDescriptorSets = {};
522 bool m_lightUBOCreated =
false;
525 std::array<VkSemaphore, MAX_FRAMES_IN_FLIGHT> m_transferSemaphores = {};
526 std::array<VulkanBuffer::AsyncFlushResult, MAX_FRAMES_IN_FLIGHT> m_asyncFlush;
533 static constexpr uint32_t GBUFFER_COUNT = 3;
534 VkImage m_gbufferImages[GBUFFER_COUNT] = {};
535 VkDeviceMemory m_gbufferMemory[GBUFFER_COUNT] = {};
536 VkImageView m_gbufferViews[GBUFFER_COUNT] = {};
538 static const VkFormat m_gbufferFormats[GBUFFER_COUNT];
539 VkRenderPass m_gbufferRenderPass = VK_NULL_HANDLE;
540 VkFramebuffer m_gbufferFramebuffer = VK_NULL_HANDLE;
541 VkPipeline m_gbufferPipeline = VK_NULL_HANDLE;
542 VkPipeline m_skinnedGbufferPipeline = VK_NULL_HANDLE;
543 VkPipelineLayout m_gbufferPipelineLayout = VK_NULL_HANDLE;
544 VulkanShader* m_gbufferShader =
nullptr;
545 bool m_gbufferResourcesCreated =
false;
546 bool m_inGeometryPass =
false;
549 VkRenderPass m_lightingRenderPass = VK_NULL_HANDLE;
550 std::vector<VkFramebuffer> m_lightingFramebuffers;
551 VkPipeline m_lightingPipeline = VK_NULL_HANDLE;
552 VkPipelineLayout m_lightingPipelineLayout = VK_NULL_HANDLE;
553 VulkanShader* m_lightingShader =
nullptr;
556 VkRenderPass m_forwardRenderPass = VK_NULL_HANDLE;
557 std::vector<VkFramebuffer> m_forwardFramebuffers;
558 bool m_inForwardTransparentPass =
false;
559 bool m_forwardPassOpen =
false;
562 VkDescriptorSetLayout m_gbufferSamplerDSL = VK_NULL_HANDLE;
563 VkDescriptorPool m_gbufferSamplerPool = VK_NULL_HANDLE;
564 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_gbufferSamplerSets = {};
565 VkSampler m_gbufferSampler = VK_NULL_HANDLE;
566 VkSampler m_depthSampler = VK_NULL_HANDLE;
569 struct DeferredCBData {
570 float InvViewProj[16];
571 float ScreenW, ScreenH, NearP, FarP;
573 VkDescriptorSetLayout m_deferredCBDSL = VK_NULL_HANDLE;
574 VkDescriptorPool m_deferredCBPool = VK_NULL_HANDLE;
575 std::array<VkBuffer, MAX_FRAMES_IN_FLIGHT> m_deferredCBBuffers = {};
576 std::array<VkDeviceMemory, MAX_FRAMES_IN_FLIGHT> m_deferredCBMemory = {};
577 std::array<void*, MAX_FRAMES_IN_FLIGHT> m_deferredCBMapped = {};
578 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_deferredCBSets = {};
579 bool m_deferredCBCreated =
false;
583 struct alignas(16) PBRMaterialParams {
584 float albedoFactorR, albedoFactorG, albedoFactorB, albedoFactorA;
585 float metallicFactor, roughnessFactor, aoFactor, normalIntensity;
586 float emissiveR, emissiveG, emissiveB, emissiveIntensity;
587 float tilingX, tilingY, offsetX, offsetY;
588 uint32_t hasNormalMap, hasMetallicMap, hasRoughnessMap, hasAOMap;
589 uint32_t hasEmissiveMap;
float _pad0, _pad1, _pad2;
594 static constexpr uint32_t PBR_SETS_PER_FRAME = 64;
595 static constexpr uint32_t PBR_SET_COUNT = MAX_FRAMES_IN_FLIGHT * PBR_SETS_PER_FRAME;
596 VkDescriptorSetLayout m_pbrMaterialDSL = VK_NULL_HANDLE;
597 VkDescriptorPool m_pbrMaterialPool = VK_NULL_HANDLE;
599 std::array<VkBuffer, MAX_FRAMES_IN_FLIGHT> m_pbrMaterialCBBuffers = {};
600 std::array<VkDeviceMemory, MAX_FRAMES_IN_FLIGHT> m_pbrMaterialCBMemory = {};
601 std::array<void*, MAX_FRAMES_IN_FLIGHT> m_pbrMaterialCBMapped = {};
602 std::array<VkDescriptorSet, PBR_SET_COUNT> m_pbrMaterialSets = {};
603 VkDeviceSize m_pbrMaterialUBOStride = 0;
604 uint32_t m_pbrMaterialSlot[MAX_FRAMES_IN_FLIGHT] = {};
605 bool m_pbrMaterialResourcesCreated =
false;
606 VkPipelineLayout m_gbufferGeomLayout = VK_NULL_HANDLE;
609 VkImage m_iblIrradianceImage = VK_NULL_HANDLE;
610 VkDeviceMemory m_iblIrradianceMemory = VK_NULL_HANDLE;
611 VkImageView m_iblIrradianceView = VK_NULL_HANDLE;
612 VkSampler m_iblIrradianceSampler = VK_NULL_HANDLE;
614 VkImage m_iblPrefilterImage = VK_NULL_HANDLE;
615 VkDeviceMemory m_iblPrefilterMemory = VK_NULL_HANDLE;
616 VkImageView m_iblPrefilterView = VK_NULL_HANDLE;
617 VkSampler m_iblPrefilterSampler = VK_NULL_HANDLE;
618 static constexpr uint32_t IBL_PREFILTER_MIP_LEVELS = 5;
620 VkImage m_iblBrdfLutImage = VK_NULL_HANDLE;
621 VkDeviceMemory m_iblBrdfLutMemory = VK_NULL_HANDLE;
622 VkImageView m_iblBrdfLutView = VK_NULL_HANDLE;
623 VkSampler m_iblBrdfLutSampler = VK_NULL_HANDLE;
625 VkDescriptorSetLayout m_iblDSL = VK_NULL_HANDLE;
626 VkDescriptorPool m_iblPool = VK_NULL_HANDLE;
627 std::array<VkBuffer, MAX_FRAMES_IN_FLIGHT> m_iblSettingsBuffers = {};
628 std::array<VkDeviceMemory, MAX_FRAMES_IN_FLIGHT> m_iblSettingsMemory = {};
629 std::array<void*, MAX_FRAMES_IN_FLIGHT> m_iblSettingsMapped = {};
630 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_iblSets = {};
631 bool m_iblResourcesCreated =
false;
632 bool m_iblReady =
false;
636 static constexpr uint32_t SSAO_KERNEL_SIZE = 32;
637 static constexpr uint32_t SSAO_NOISE_SIZE = 4;
638 bool m_ssaoResourcesCreated =
false;
639 VkExtent2D m_ssaoExtent = {0, 0};
640 VkFormat m_ssaoFormat = VK_FORMAT_R8_UNORM;
642 VkImage m_ssaoRawImage = VK_NULL_HANDLE;
643 VkDeviceMemory m_ssaoRawMemory = VK_NULL_HANDLE;
644 VkImageView m_ssaoRawView = VK_NULL_HANDLE;
645 VkFramebuffer m_ssaoRawFramebuffer = VK_NULL_HANDLE;
647 VkImage m_ssaoBlurImage = VK_NULL_HANDLE;
648 VkDeviceMemory m_ssaoBlurMemory = VK_NULL_HANDLE;
649 VkImageView m_ssaoBlurView = VK_NULL_HANDLE;
650 VkFramebuffer m_ssaoBlurFramebuffer = VK_NULL_HANDLE;
652 VkRenderPass m_ssaoRenderPass = VK_NULL_HANDLE;
653 VkPipeline m_ssaoPipeline = VK_NULL_HANDLE;
654 VkPipeline m_ssaoBlurPipeline = VK_NULL_HANDLE;
655 VkPipelineLayout m_ssaoPipelineLayout = VK_NULL_HANDLE;
656 VkPipelineLayout m_ssaoBlurPipelineLayout = VK_NULL_HANDLE;
657 VulkanShader* m_ssaoShader =
nullptr;
658 VulkanShader* m_ssaoBlurShader =
nullptr;
660 VkSampler m_ssaoSampler = VK_NULL_HANDLE;
661 VkSampler m_ssaoPointSampler = VK_NULL_HANDLE;
664 VkImage m_ssaoNoiseImage = VK_NULL_HANDLE;
665 VkDeviceMemory m_ssaoNoiseMemory = VK_NULL_HANDLE;
666 VkImageView m_ssaoNoiseView = VK_NULL_HANDLE;
667 VkSampler m_ssaoNoiseSampler = VK_NULL_HANDLE;
670 struct alignas(16) SSAOParams {
672 float Projection[16];
673 float InvViewProj[16];
674 float Kernel[SSAO_KERNEL_SIZE][4];
675 float ScreenW, ScreenH;
676 float NoiseScaleX, NoiseScaleY;
677 float Radius, Bias, Power, Intensity;
679 float _pad0, _pad1, _pad2;
681 VkDescriptorSetLayout m_ssaoInputDSL = VK_NULL_HANDLE;
682 VkDescriptorSetLayout m_ssaoUboDSL = VK_NULL_HANDLE;
683 VkDescriptorSetLayout m_ssaoBlurDSL = VK_NULL_HANDLE;
684 VkDescriptorPool m_ssaoDescriptorPool = VK_NULL_HANDLE;
685 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_ssaoInputSets = {};
686 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_ssaoUboSets = {};
687 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_ssaoBlurSets = {};
688 std::array<VkBuffer, MAX_FRAMES_IN_FLIGHT> m_ssaoUboBuffers = {};
689 std::array<VkDeviceMemory, MAX_FRAMES_IN_FLIGHT> m_ssaoUboMemory = {};
690 std::array<void*, MAX_FRAMES_IN_FLIGHT> m_ssaoUboMapped = {};
694 float m_cachedView[16] = {};
695 float m_cachedProjection[16] = {};
698 float m_cachedInvViewProj[16] = {};
701 bool CreateSSAOResources();
705 void InitDisabledEffectFallbacks();
707 void CleanupSSAOResources();
709 bool CreateSSAOImages();
711 bool CreateSSAORenderPass();
713 bool CreateSSAOFramebuffers();
715 bool CreateSSAOPipelines();
717 bool CreateSSAODescriptorResources();
719 bool CreateSSAONoiseTexture();
721 void UpdateSSAODescriptors();
723 void UpdateSSAOUBO();
725 void RenderSSAOPasses();
730 struct alignas(16) SSRParams {
732 float Projection[16];
733 float InvViewProj[16];
735 float ScreenW, ScreenH;
740 float RoughnessThreshold;
744 bool m_ssrResourcesCreated =
false;
746 VkFormat m_ssrFormat = VK_FORMAT_R16G16B16A16_SFLOAT;
748 VkImage m_ssrImage = VK_NULL_HANDLE;
749 VkDeviceMemory m_ssrMemory = VK_NULL_HANDLE;
750 VkImageView m_ssrView = VK_NULL_HANDLE;
751 VkSampler m_ssrSampler = VK_NULL_HANDLE;
752 VkRenderPass m_ssrRenderPass = VK_NULL_HANDLE;
753 VkFramebuffer m_ssrFramebuffer = VK_NULL_HANDLE;
754 VkPipeline m_ssrPipeline = VK_NULL_HANDLE;
755 VkPipelineLayout m_ssrPipelineLayout = VK_NULL_HANDLE;
756 VulkanShader* m_ssrShader =
nullptr;
758 VkDescriptorSetLayout m_ssrInputDSL = VK_NULL_HANDLE;
759 VkDescriptorSetLayout m_ssrUboDSL = VK_NULL_HANDLE;
760 VkDescriptorPool m_ssrPool = VK_NULL_HANDLE;
762 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_ssrInputSets{};
763 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_ssrUboSets{};
764 std::array<VkBuffer, MAX_FRAMES_IN_FLIGHT> m_ssrUboBuffers{};
765 std::array<VkDeviceMemory, MAX_FRAMES_IN_FLIGHT> m_ssrUboMemory{};
766 std::array<void*, MAX_FRAMES_IN_FLIGHT> m_ssrUboMapped{};
769 bool CreateSSRResources();
771 void CleanupSSRResources();
775 void UpdateSSRDescriptors();
777 void RenderSSRPass();
782 struct alignas(16) TAAParams {
783 float InvCurrentVP[16];
785 float ScreenW, ScreenH;
790 bool m_taaResourcesCreated =
false;
792 uint64_t m_taaFrameIdx = 0;
794 VkImage m_taaImages[2] = {};
795 VkDeviceMemory m_taaMemory[2] = {};
796 VkImageView m_taaViews[2] = {};
797 VkRenderPass m_taaRenderPass = VK_NULL_HANDLE;
798 VkFramebuffer m_taaFramebufs[2] = {};
799 VkSampler m_taaSampler = VK_NULL_HANDLE;
801 VkDescriptorSetLayout m_taaInputDSL = VK_NULL_HANDLE;
802 VkDescriptorSetLayout m_taaUboDSL = VK_NULL_HANDLE;
803 VkDescriptorPool m_taaPool = VK_NULL_HANDLE;
805 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_taaInputSets{};
806 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_taaUboSets{};
807 std::array<VkBuffer, MAX_FRAMES_IN_FLIGHT> m_taaUboBuffers{};
808 std::array<VkDeviceMemory, MAX_FRAMES_IN_FLIGHT> m_taaUboMemory{};
809 std::array<void*, MAX_FRAMES_IN_FLIGHT> m_taaUboMapped{};
811 VkPipelineLayout m_taaPipelineLayout = VK_NULL_HANDLE;
812 VkPipeline m_taaPipeline = VK_NULL_HANDLE;
813 VulkanShader* m_taaShader =
nullptr;
815 float m_prevViewProj[16] = {};
816 float m_taaJitter[2] = {};
819 bool CreateTAAResources();
821 void CleanupTAAResources();
825 void RenderTAAPass();
834 bool m_ssaoFallbackPrimed =
false;
835 bool m_ssrFallbackPrimed =
false;
836 bool m_bloomFallbackPrimed =
false;
842 static constexpr uint32_t BLOOM_MIP_COUNT = 6;
843 bool m_bloomResourcesCreated =
false;
844 VkFormat m_hdrSceneFormat = VK_FORMAT_R16G16B16A16_SFLOAT;
847 VkImage m_hdrSceneImage = VK_NULL_HANDLE;
848 VkDeviceMemory m_hdrSceneMemory = VK_NULL_HANDLE;
849 VkImageView m_hdrSceneView = VK_NULL_HANDLE;
850 VkFramebuffer m_hdrSceneFramebuffer = VK_NULL_HANDLE;
851 VkRenderPass m_hdrLightingRenderPass = VK_NULL_HANDLE;
855 VkImage m_bloomImage = VK_NULL_HANDLE;
856 VkDeviceMemory m_bloomMemory = VK_NULL_HANDLE;
857 std::array<VkImageView, BLOOM_MIP_COUNT> m_bloomMipViews = {};
858 std::array<VkFramebuffer, BLOOM_MIP_COUNT> m_bloomMipFramebuffers = {};
859 std::array<VkExtent2D, BLOOM_MIP_COUNT> m_bloomMipExtents = {};
861 VkRenderPass m_bloomRenderPass = VK_NULL_HANDLE;
862 VkRenderPass m_bloomAddRenderPass = VK_NULL_HANDLE;
863 VkRenderPass m_bloomCompositeRenderPass = VK_NULL_HANDLE;
864 std::vector<VkFramebuffer> m_bloomCompositeFramebuffers;
866 VkPipeline m_bloomThresholdPipeline = VK_NULL_HANDLE;
867 VkPipeline m_bloomDownsamplePipeline = VK_NULL_HANDLE;
868 VkPipeline m_bloomUpsamplePipeline = VK_NULL_HANDLE;
869 VkPipeline m_bloomCompositePipeline = VK_NULL_HANDLE;
870 VkPipelineLayout m_bloomFilterPipelineLayout = VK_NULL_HANDLE;
871 VkPipelineLayout m_bloomCompositePipelineLayout = VK_NULL_HANDLE;
872 VulkanShader* m_bloomThresholdShader =
nullptr;
873 VulkanShader* m_bloomDownsampleShader =
nullptr;
874 VulkanShader* m_bloomUpsampleShader =
nullptr;
875 VulkanShader* m_bloomCompositeShader =
nullptr;
881 VkDescriptorSetLayout m_bloomFilterDSL = VK_NULL_HANDLE;
882 VkDescriptorSetLayout m_bloomCompositeDSL = VK_NULL_HANDLE;
883 VkDescriptorPool m_bloomDescriptorPool = VK_NULL_HANDLE;
888 static constexpr uint32_t BLOOM_TRANSITION_COUNT = 1 + (BLOOM_MIP_COUNT - 1) + (BLOOM_MIP_COUNT - 1);
889 std::array<std::array<VkDescriptorSet, BLOOM_TRANSITION_COUNT>, MAX_FRAMES_IN_FLIGHT> m_bloomFilterSets = {};
890 std::array<VkDescriptorSet, MAX_FRAMES_IN_FLIGHT> m_bloomCompositeSets = {};
892 VkSampler m_bloomSampler = VK_NULL_HANDLE;
895 bool CreateBloomResources();
897 void CleanupBloomResources();
899 bool CreateHDRSceneResources();
901 bool CreateBloomImages();
903 bool CreateBloomRenderPasses();
905 bool CreateBloomFramebuffers();
907 bool CreateBloomPipelines();
909 bool CreateBloomDescriptorResources();
911 void RenderBloomPass();
913 void RenderBloomCompositePass();
916 static void FillFullscreenViewportScissor(VkCommandBuffer cmd, VkExtent2D ext);