// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) // This file is part of the "Nazara Engine - Vulkan renderer" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_VULKANRENDERER_VULKANRENDERPIPELINE_HPP #define NAZARA_VULKANRENDERER_VULKANRENDERPIPELINE_HPP #include #include #include #include #include #include #include #include #include #include namespace Nz { class VulkanDevice; class NAZARA_VULKANRENDERER_API VulkanRenderPipeline : public RenderPipeline { public: struct CreateInfo; VulkanRenderPipeline(VulkanDevice& device, RenderPipelineInfo pipelineInfo); VulkanRenderPipeline(const VulkanRenderPipeline&) = delete; VulkanRenderPipeline(VulkanRenderPipeline&&) = delete; ~VulkanRenderPipeline() = default; VkPipeline Get(const VulkanRenderPass& renderPass, std::size_t subpassIndex) const; inline const RenderPipelineInfo& GetPipelineInfo() const override; void UpdateDebugName(std::string_view name) override; VulkanRenderPipeline& operator=(const VulkanRenderPipeline&) = delete; VulkanRenderPipeline& operator=(VulkanRenderPipeline&&) = delete; static std::vector BuildColorBlendAttachmentStateList(const RenderPipelineInfo& pipelineInfo); static VkPipelineColorBlendStateCreateInfo BuildColorBlendInfo(const RenderPipelineInfo& pipelineInfo, const std::vector& attachmentState); static VkPipelineDepthStencilStateCreateInfo BuildDepthStencilInfo(const RenderPipelineInfo& pipelineInfo); static VkPipelineDynamicStateCreateInfo BuildDynamicStateInfo(const RenderPipelineInfo& pipelineInfo, const std::vector& dynamicStates); static std::vector BuildDynamicStateList(const RenderPipelineInfo& pipelineInfo); static VkPipelineInputAssemblyStateCreateInfo BuildInputAssemblyInfo(const RenderPipelineInfo& pipelineInfo); static VkPipelineMultisampleStateCreateInfo BuildMultisampleInfo(const RenderPipelineInfo& pipelineInfo); static VkPipelineRasterizationStateCreateInfo BuildRasterizationInfo(const RenderPipelineInfo& pipelineInfo); static VkPipelineViewportStateCreateInfo BuildViewportInfo(const RenderPipelineInfo& pipelineInfo); static VkStencilOpState BuildStencilOp(const RenderPipelineInfo& pipelineInfo, bool front); static std::vector BuildShaderStageInfo(const RenderPipelineInfo& pipelineInfo); static std::vector BuildVertexAttributeDescription(const RenderPipelineInfo& pipelineInfo); static std::vector BuildVertexBindingDescription(const RenderPipelineInfo& pipelineInfo); static VkPipelineVertexInputStateCreateInfo BuildVertexInputInfo(const RenderPipelineInfo& pipelineInfo, const std::vector& vertexAttributes, const std::vector& bindingDescription); static CreateInfo BuildCreateInfo(const RenderPipelineInfo& pipelineInfo); struct CreateInfo { struct StateData { VkPipelineColorBlendStateCreateInfo colorBlendState; VkPipelineDepthStencilStateCreateInfo depthStencilState; VkPipelineDynamicStateCreateInfo dynamicState; VkPipelineMultisampleStateCreateInfo multiSampleState; VkPipelineInputAssemblyStateCreateInfo inputAssemblyState; VkPipelineRasterizationStateCreateInfo rasterizationState; VkPipelineVertexInputStateCreateInfo vertexInputState; VkPipelineViewportStateCreateInfo viewportState; }; std::vector colorBlendAttachmentState; std::vector dynamicStates; std::vector shaderStages; std::vector vertexAttributesDescription; std::vector vertexBindingDescription; std::unique_ptr stateData; VkGraphicsPipelineCreateInfo pipelineInfo; }; private: void UpdateCreateInfo(std::size_t colorBufferCount) const; struct PipelineHasher { inline std::size_t operator()(const std::pair& renderPass) const; }; struct PipelineData { NazaraSlot(VulkanRenderPass, OnRenderPassRelease, onRenderPassRelease); Vk::Pipeline pipeline; }; std::string m_debugName; mutable std::unordered_map, PipelineData, PipelineHasher> m_pipelines; MovablePtr m_device; mutable CreateInfo m_pipelineCreateInfo; RenderPipelineInfo m_pipelineInfo; }; } #include #endif // NAZARA_VULKANRENDERER_VULKANRENDERPIPELINE_HPP