7#include "render/Renderer.h"
8#include "render/general/resource/frame/FrameResourceManager.h"
9#include "render/vulkan/resource/VulkanResource.h"
10#include "material/Material.h"
13#include "vulkan/vulkan.h"
14#include "VulkanMemoryAllocator/include/vk_mem_alloc.h"
17 class CameraProperties;
19 struct VulkanFrameResource;
20 struct QueuedForExecutionComputeShaders;
21 class ComputeShaderInterface;
76 static std::variant<std::unique_ptr<Renderer>, std::pair<Error, std::string>>
90 Renderer* pRenderer,
void* pObject, VkObjectType objectType,
const std::string& sResourceName);
119 virtual std::variant<std::set<std::pair<unsigned int, unsigned int>>,
Error>
130 virtual std::variant<std::set<std::pair<unsigned int, unsigned int>>,
Error>
138 virtual RendererType
getType()
const override;
182 [[nodiscard]] std::optional<Error>
200 VkFormat imageFormat,
201 VkImageAspectFlags aspect,
204 VkImageLayout oldLayout,
205 VkImageLayout newLayout);
341 virtual std::variant<std::optional<AntialiasingQuality>,
Error>
459 static std::variant<std::string, Error>
473 VkRenderPass pShadowMappingRenderPass,
474 VkCommandBuffer pCommandBuffer,
475 VkFramebuffer pFramebufferToUse,
476 uint32_t iShadowMapSize);
485 [[nodiscard]]
static std::optional<Error> makeSureUsedValidationLayersSupported();
497 static VkResult createDebugUtilsMessengerEXT(
499 const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
500 const VkAllocationCallbacks* pAllocator,
501 VkDebugUtilsMessengerEXT* pDebugMessenger);
510 static void destroyDebugUtilsMessengerEXT(
512 VkDebugUtilsMessengerEXT pDebugMessenger,
513 const VkAllocationCallbacks* pAllocator);
522 static PFN_vkCmdBeginDebugUtilsLabelEXT requestVkCmdBeginDebugUtilsLabelEXT(VkInstance
pInstance);
531 static PFN_vkCmdEndDebugUtilsLabelEXT requestVkCmdEndDebugUtilsLabelEXT(VkInstance
pInstance);
546 [[nodiscard]] std::optional<Error>
initialize(
const std::vector<std::string>& vBlacklistedGpuNames);
556 [[nodiscard]] std::optional<Error>
621 std::variant<VulkanRenderer::QueueFamilyIndices, Error>
650 [[nodiscard]] std::optional<Error>
687 std::variant<VkExtent2D, Error>
701 [[nodiscard]] std::optional<Error>
createRenderPasses(
bool bIsRendererInitialization);
861 size_t iCurrentFrameResourceIndex,
873 size_t iCurrentFrameResourceIndex,
874 const std::vector<Renderer::MeshesInFrustum::PipelineInFrustumInfo>& vOpaquePipelines)
override;
887 size_t iCurrentFrameResourceIndex,
888 ComputeExecutionStage stage)
override;
900 size_t iCurrentFrameResourceIndex,
901 const std::vector<Renderer::MeshesInFrustum::PipelineInFrustumInfo>& vOpaquePipelines,
902 const std::vector<Renderer::MeshesInFrustum::PipelineInFrustumInfo>& vTransparentPipelines)
922 const std::vector<Renderer::MeshesInFrustum::PipelineInFrustumInfo>& pipelinesOfSpecificType,
923 VkCommandBuffer pCommandBuffer,
924 size_t iCurrentFrameResourceIndex);
944 size_t iCurrentFrameResourceIndex,
945 std::unordered_map<
Pipeline*, std::unordered_set<ComputeShaderInterface*>>&
946 computePipelinesToSubmit);
1040 VkDebugUtilsMessengerEXT pValidationLayerDebugMessenger =
nullptr;
1176 VK_KHR_SWAPCHAIN_EXTENSION_NAME};
1184 static inline const std::vector<const char*> vUsedValidationLayerNames = {
1185 "VK_LAYER_KHRONOS_validation"};
Definition: CameraProperties.h:22
Definition: GameManager.h:34
Definition: GpuResource.h:16
Definition: Pipeline.h:20
Definition: Renderer.h:43
GameManager * pGameManager
Definition: Renderer.h:870
Definition: VulkanRenderer.h:26
std::vector< VkImageView > vSwapChainImageViews
Definition: VulkanRenderer.h:1055
std::variant< std::string, Error > isGpuSupportsSwapChain(VkPhysicalDevice pGpu)
Definition: VulkanRenderer.cpp:826
virtual std::optional< Error > onRenderSettingsChangedDerived() override
Definition: VulkanRenderer.cpp:4026
virtual void executeComputeShadersOnGraphicsQueue(FrameResource *pCurrentFrameResource, size_t iCurrentFrameResourceIndex, ComputeExecutionStage stage) override
Definition: VulkanRenderer.cpp:3533
VkInstance getInstance() const
Definition: VulkanRenderer.cpp:2793
VkRenderPass pShadowMappingPointRenderPass
Definition: VulkanRenderer.h:995
std::optional< Error > createSwapChain()
Definition: VulkanRenderer.cpp:1224
VkSampler getTextureSampler(TextureFilteringQuality filtering)
Definition: VulkanRenderer.cpp:2694
std::variant< VulkanRenderer::QueueFamilyIndices, Error > queryQueueFamilyIndices(VkPhysicalDevice pGpu)
Definition: VulkanRenderer.cpp:771
std::optional< Error > createComputeTextureSampler()
Definition: VulkanRenderer.cpp:2026
virtual void present(FrameResource *pCurrentFrameResource, size_t iCurrentFrameResourceIndex) override
Definition: VulkanRenderer.cpp:3635
std::optional< Error > createSwapChainFramebuffers()
Definition: VulkanRenderer.cpp:2330
static constexpr size_t iMainRenderPassColorAttachmentIndex
Definition: VulkanRenderer.h:1128
virtual void drawShadowMappingPass(FrameResource *pCurrentFrameResource, size_t iCurrentFrameResourceIndex, GraphicsPipelineRegistry *pGraphicsPipelines) override
Definition: VulkanRenderer.cpp:3033
static constexpr VkFormat getShadowMappingPointLightColorTargetFormat()
Definition: VulkanRenderer.h:61
VkRenderPass getDepthOnlyRenderPass() const
Definition: VulkanRenderer.cpp:2797
VkRenderPass getShadowMappingRenderPass(bool bIsForPointLights) const
Definition: VulkanRenderer.cpp:2799
VkSampler pTextureSamplerPointFiltering
Definition: VulkanRenderer.h:1005
void destroySwapChainAndDependentResources(bool bDestroyPipelineManager)
Definition: VulkanRenderer.cpp:1888
bool bIsVulkanInitialized
Definition: VulkanRenderer.h:1113
bool bNeedToRecreateSwapchain
Definition: VulkanRenderer.h:1119
virtual GpuResource * getDepthTextureNoMultisampling() override
Definition: VulkanRenderer.cpp:2818
VkCommandPool pCommandPool
Definition: VulkanRenderer.h:998
static constexpr auto depthImageFormat
Definition: VulkanRenderer.h:1149
std::optional< VkExtent2D > swapChainExtent
Definition: VulkanRenderer.h:1101
std::optional< Error > pickPhysicalDevice(const std::vector< std::string > &vBlacklistedGpuNames)
Definition: VulkanRenderer.cpp:902
static constexpr VkFormat getShadowMapFormat()
Definition: VulkanRenderer.h:53
std::optional< Error > createShadowMappingRenderPasses()
Definition: VulkanRenderer.cpp:1760
VkRenderPass getMainRenderPass() const
Definition: VulkanRenderer.cpp:2795
uint32_t iSwapChainImageCount
Definition: VulkanRenderer.h:1107
std::optional< Error > transitionImageLayout(VkImage pImage, VkFormat imageFormat, VkImageAspectFlags aspect, uint32_t levelCount, uint32_t layerCount, VkImageLayout oldLayout, VkImageLayout newLayout)
Definition: VulkanRenderer.cpp:2919
std::unique_ptr< VulkanResource > pDepthImage
Definition: VulkanRenderer.h:970
virtual void waitForGpuToFinishWorkUpToThisPoint() override
Definition: VulkanRenderer.cpp:2742
std::optional< Error > createDepthImage()
Definition: VulkanRenderer.cpp:2146
std::optional< Error > initialize(const std::vector< std::string > &vBlacklistedGpuNames)
Definition: VulkanRenderer.cpp:213
VkSampleCountFlagBits getMsaaSampleCount() const
Definition: VulkanRenderer.cpp:2816
std::optional< Error > initializeVulkan(const std::vector< std::string > &vBlacklistedGpuNames)
Definition: VulkanRenderer.cpp:234
size_t rateGpuSuitability(VkPhysicalDevice pGpuDevice)
Definition: VulkanRenderer.cpp:504
std::variant< SwapChainSupportDetails, Error > querySwapChainSupportDetails(VkPhysicalDevice pGpu)
Definition: VulkanRenderer.cpp:700
static constexpr auto swapChainImageColorSpace
Definition: VulkanRenderer.h:1146
VkDevice pLogicalDevice
Definition: VulkanRenderer.h:958
VkCommandPool getCommandPool() const
Definition: VulkanRenderer.cpp:2806
bool bIsBeingDestroyed
Definition: VulkanRenderer.h:1125
void startDepthOnlyRenderPass(VkCommandBuffer pCommandBuffer, size_t iAcquiredImageIndex)
Definition: VulkanRenderer.cpp:2620
bool isUsedDepthImageFormatSupported()
Definition: VulkanRenderer.cpp:2131
std::unique_ptr< VulkanResource > pMsaaImage
Definition: VulkanRenderer.h:983
VkQueue pPresentQueue
Definition: VulkanRenderer.h:964
std::optional< Error > createWindowSurface()
Definition: VulkanRenderer.cpp:476
static constexpr auto depthImageTiling
Definition: VulkanRenderer.h:1160
VkSampler pComputeTextureSampler
Definition: VulkanRenderer.h:1026
std::optional< Error > submitWaitDestroyOneTimeSubmitCommandBuffer(VkCommandBuffer pOneTimeSubmitCommandBuffer)
Definition: VulkanRenderer.cpp:2869
std::vector< std::string > vSupportedGpuNames
Definition: VulkanRenderer.h:1092
static constexpr auto depthResolveMode
Definition: VulkanRenderer.h:1166
virtual std::string getCurrentlyUsedGpuName() const override
Definition: VulkanRenderer.cpp:2740
VkDevice getLogicalDevice() const
Definition: VulkanRenderer.cpp:2789
virtual std::vector< std::string > getSupportedGpuNames() const override
Definition: VulkanRenderer.cpp:2715
VkRenderPass pShadowMappingDirectionalSpotRenderPass
Definition: VulkanRenderer.h:992
virtual std::variant< std::set< std::pair< unsigned int, unsigned int > >, Error > getSupportedRenderResolutions() const override
Definition: VulkanRenderer.cpp:2718
std::variant< VkCommandBuffer, Error > createOneTimeSubmitCommandBuffer()
Definition: VulkanRenderer.cpp:2831
std::optional< Error > createTextureSamplers()
Definition: VulkanRenderer.cpp:1951
std::unique_ptr< VulkanResource > pDepthImageNoMultisampling
Definition: VulkanRenderer.h:980
static bool dispatchComputeShadersOnGraphicsQueue(VulkanFrameResource *pCurrentFrameResource, size_t iCurrentFrameResourceIndex, std::unordered_map< Pipeline *, std::unordered_set< ComputeShaderInterface * > > &computePipelinesToSubmit)
Definition: VulkanRenderer.cpp:3978
static std::variant< std::unique_ptr< Renderer >, std::pair< Error, std::string > > create(GameManager *pGameManager, const std::vector< std::string > &vBlacklistedGpuNames)
Definition: VulkanRenderer.cpp:2679
static void setObjectDebugOnlyName(Renderer *pRenderer, void *pObject, VkObjectType objectType, const std::string &sResourceName)
Definition: VulkanRenderer.cpp:3337
bool bIsUsingMsaaRenderTarget
Definition: VulkanRenderer.h:1122
static constexpr size_t iDepthOnlyRenderPassDepthImageAttachmentIndex
Definition: VulkanRenderer.h:1137
static const std::vector< const char * > vUsedDeviceExtensionNames
Definition: VulkanRenderer.h:1175
uint32_t iLastAcquiredImageIndex
Definition: VulkanRenderer.h:1110
virtual std::variant< std::set< std::pair< unsigned int, unsigned int > >, Error > getSupportedRefreshRates() const override
Definition: VulkanRenderer.cpp:2728
std::variant< std::string, Error > isDeviceSuitable(VkPhysicalDevice pGpu)
Definition: VulkanRenderer.cpp:560
VkSampler getComputeTextureSampler() const
Definition: VulkanRenderer.cpp:2810
static constexpr VkFormat getDepthImageFormat()
Definition: VulkanRenderer.h:46
QueueFamilyIndices physicalDeviceQueueFamilyIndices
Definition: VulkanRenderer.h:1098
virtual RendererType getType() const override
Definition: VulkanRenderer.cpp:2733
std::optional< Error > updateMsaaSampleCount()
Definition: VulkanRenderer.cpp:3916
static constexpr auto shadowMappingPointLightColorTargetFormat
Definition: VulkanRenderer.h:1157
std::vector< SwapChainImageSemaphores > vImageSemaphores
Definition: VulkanRenderer.h:1086
static constexpr size_t iMainRenderPassDepthAttachmentIndex
Definition: VulkanRenderer.h:1131
static constexpr auto indexTypeFormat
Definition: VulkanRenderer.h:1163
std::optional< Error > createVulkanInstance()
Definition: VulkanRenderer.cpp:377
virtual void drawMeshesDepthPrepass(FrameResource *pCurrentFrameResource, size_t iCurrentFrameResourceIndex, const std::vector< Renderer::MeshesInFrustum::PipelineInFrustumInfo > &vOpaquePipelines) override
Definition: VulkanRenderer.cpp:3391
VkSampleCountFlagBits msaaSampleCount
Definition: VulkanRenderer.h:1104
std::optional< Error > createMsaaImage()
Definition: VulkanRenderer.cpp:2205
VkPhysicalDevice getPhysicalDevice() const
Definition: VulkanRenderer.cpp:2791
virtual std::variant< std::optional< AntialiasingQuality >, Error > getMaxSupportedAntialiasingQuality() const override
Definition: VulkanRenderer.cpp:98
VkSampler pTextureSamplerAnisotropicFiltering
Definition: VulkanRenderer.h:1019
static constexpr size_t iDepthOnlyRenderPassDepthResolveTargetAttachmentIndex
Definition: VulkanRenderer.h:1140
VkSampler pTextureSamplerLinearFiltering
Definition: VulkanRenderer.h:1012
VkPhysicalDevice pPhysicalDevice
Definition: VulkanRenderer.h:955
virtual void drawMeshesMainPass(FrameResource *pCurrentFrameResource, size_t iCurrentFrameResourceIndex, const std::vector< Renderer::MeshesInFrustum::PipelineInFrustumInfo > &vOpaquePipelines, const std::vector< Renderer::MeshesInFrustum::PipelineInFrustumInfo > &vTransparentPipelines) override
Definition: VulkanRenderer.cpp:3600
std::vector< VkFramebuffer > vSwapChainFramebuffersDepthOnlyRenderPass
Definition: VulkanRenderer.h:1069
std::optional< Error > recreateSwapChainAndDependentResources()
Definition: VulkanRenderer.cpp:2249
std::optional< Error > createRenderPasses(bool bIsRendererInitialization)
Definition: VulkanRenderer.cpp:1469
static std::variant< std::string, Error > isGpuSupportsUsedDeviceExtensions(VkPhysicalDevice pGpuDevice)
Definition: VulkanRenderer.cpp:4091
virtual bool isInitialized() const override
Definition: VulkanRenderer.cpp:4062
VkQueue getGraphicsQueue() const
Definition: VulkanRenderer.cpp:2808
static constexpr auto stencilResolveMode
Definition: VulkanRenderer.h:1169
void startMainRenderPass(VkCommandBuffer pCommandBuffer, size_t iAcquiredImageIndex)
Definition: VulkanRenderer.cpp:2589
std::optional< Error > createLogicalDevice()
Definition: VulkanRenderer.cpp:1136
std::optional< Error > createMainRenderPass()
Definition: VulkanRenderer.cpp:1499
std::string sUsedGpuName
Definition: VulkanRenderer.h:1095
virtual void onFramebufferSizeChangedDerived(int iWidth, int iHeight) override
Definition: VulkanRenderer.cpp:3891
std::variant< VkExtent2D, Error > pickSwapChainExtent(const VkSurfaceCapabilitiesKHR &surfaceCapabilities)
Definition: VulkanRenderer.cpp:1434
VkSwapchainKHR pSwapChain
Definition: VulkanRenderer.h:967
std::optional< VkExtent2D > getSwapChainExtent() const
Definition: VulkanRenderer.cpp:2814
static uint32_t getUsedVulkanVersion()
Definition: VulkanRenderer.cpp:211
std::vector< VkImage > vSwapChainImages
Definition: VulkanRenderer.h:1048
static std::variant< std::vector< const char * >, Error > getRequiredVulkanInstanceExtensions()
Definition: VulkanRenderer.cpp:4064
size_t iCurrentImageSemaphore
Definition: VulkanRenderer.h:1089
virtual std::string getUsedApiVersion() const override
Definition: VulkanRenderer.cpp:2735
static void startShadowMappingRenderPass(VkRenderPass pShadowMappingRenderPass, VkCommandBuffer pCommandBuffer, VkFramebuffer pFramebufferToUse, uint32_t iShadowMapSize)
Definition: VulkanRenderer.cpp:2648
VkSurfaceKHR pWindowSurface
Definition: VulkanRenderer.h:952
std::optional< Error > createCommandPool()
Definition: VulkanRenderer.cpp:1417
static constexpr size_t iMainRenderPassColorResolveTargetAttachmentIndex
Definition: VulkanRenderer.h:1134
static constexpr auto shadowMapFormat
Definition: VulkanRenderer.h:1152
VkInstance pInstance
Definition: VulkanRenderer.h:949
VkSampler getShadowTextureSampler() const
Definition: VulkanRenderer.cpp:2812
static constexpr auto swapChainImageFormat
Definition: VulkanRenderer.h:1143
std::optional< Error > createDepthOnlyRenderPass()
Definition: VulkanRenderer.cpp:1627
VkRenderPass pMainRenderPass
Definition: VulkanRenderer.h:989
virtual void prepareRenderTargetForNextFrame() override
Definition: VulkanRenderer.cpp:2479
virtual void prepareForDrawingNextFrame(CameraProperties *pCameraProperties, FrameResource *pCurrentFrameResource) override
Definition: VulkanRenderer.cpp:2501
VkRenderPass pDepthOnlyRenderPass
Definition: VulkanRenderer.h:986
std::vector< std::pair< VkFence, size_t > > vSwapChainImageFenceRefs
Definition: VulkanRenderer.h:1079
static constexpr uint32_t iUsedVulkanVersion
Definition: VulkanRenderer.h:1172
std::vector< VkFramebuffer > vSwapChainFramebuffersMainRenderPass
Definition: VulkanRenderer.h:1062
VkQueue pGraphicsQueue
Definition: VulkanRenderer.h:961
void drawMeshesMainPassSpecificPipelines(const std::vector< Renderer::MeshesInFrustum::PipelineInFrustumInfo > &pipelinesOfSpecificType, VkCommandBuffer pCommandBuffer, size_t iCurrentFrameResourceIndex)
Definition: VulkanRenderer.cpp:3747
virtual void waitForGpuToFinishUsingFrameResource(FrameResource *pFrameResource) override
Definition: VulkanRenderer.cpp:4048
std::optional< Error > createShadowTextureSampler()
Definition: VulkanRenderer.cpp:2077
virtual std::pair< unsigned int, unsigned int > getRenderTargetSize() const override
Definition: VulkanRenderer.cpp:3026
VkSampler pShadowTextureSampler
Definition: VulkanRenderer.h:1033
Definition: FrameResource.h:15
Definition: PipelineRegistry.hpp:31
Definition: VulkanFrameResource.h:17
Definition: VulkanRenderer.h:398
std::optional< uint32_t > iPresentFamilyIndex
Definition: VulkanRenderer.h:417
bool isComplete() const
Definition: VulkanRenderer.h:406
std::optional< uint32_t > iGraphicsFamilyIndex
Definition: VulkanRenderer.h:411
Definition: VulkanRenderer.h:421
VkSemaphore pQueueSubmitSemaphore
Definition: VulkanRenderer.h:434
size_t iUsedFrameResourceIndex
Definition: VulkanRenderer.h:440
VkSemaphore pAcquireImageSemaphore
Definition: VulkanRenderer.h:427
Definition: VulkanRenderer.h:383
std::vector< VkPresentModeKHR > vSupportedPresentModes
Definition: VulkanRenderer.h:391
std::vector< VkSurfaceFormatKHR > vSupportedFormats
Definition: VulkanRenderer.h:388
VkSurfaceCapabilitiesKHR capabilities
Definition: VulkanRenderer.h:385