#pragma once #include "AssetData.hpp" #include #include #include #define PIPELINE_CREATE_NEW 0 #define PIPELINE_CREATE_DERIVED (1 << 0) struct PipelineBinding { const AssetMaterial *baseMaterial; const VkRenderPass *baseRenderPass; const VkDevice *device; const VkExtent2D *surfaceExtent; const VkVertexInputBindingDescription *vertexBindingConfig; uint32_t vertexAttributesCount; const VkVertexInputAttributeDescription *vertexAttributesConfig; }; struct PipelineConfig { VkPipelineVertexInputStateCreateInfo vertexInputConfig; VkPipelineInputAssemblyStateCreateInfo inputAssemblyConfig; VkPipelineViewportStateCreateInfo viewportStateConfig; VkPipelineRasterizationStateCreateInfo rasterizerConfig; VkPipelineMultisampleStateCreateInfo multisamplingConfig; VkPipelineDepthStencilStateCreateInfo depthStencilConfig; // SRC - new color, DST - old color std::vector colorBlendAttachmentConfigs; VkPipelineColorBlendStateCreateInfo colorBlendConfig; VkPipelineDynamicStateCreateInfo dynamicStateConfig; VkPipelineLayoutCreateInfo pipelineLayoutConfig; VkViewport defaultViewport; VkRect2D defaultScissors; std::vector dynamicStates; VkGraphicsPipelineCreateInfo pipelineConfig; PipelineConfig Copy() const; }; struct Pipeline { VkPipeline instance; VkPipelineLayout layout; VkViewport viewport; VkRect2D scissors; }; class PipelineFactory { public: PipelineFactory(const PipelineBinding &binding); ~PipelineFactory(); Pipeline& Get(const AssetMaterial &material); void Create(const AssetMaterial &material, const VkRenderPass &renderPass, const uint32_t &flags); private: PipelineBinding binding; PipelineConfig basePipelineConfig; Pipeline basePipeline; std::unordered_map pipelines; const VkDevice &device; const VkExtent2D &surfaceExtent; const VkVertexInputBindingDescription &vertexBindingConfig; };