#pragma once #include #include #include "buffer_vk.h" class texture; /// 1. add_binding /// 2. create(); /// 3. dispatch(); class pipeline { public: virtual ~pipeline() = default; virtual void add_binding(uint32_t binding, vk::DescriptorType descriptor_type, uint32_t descriptor_count, const vk::Sampler* immutable_samplers) = 0; void add_uniform_buffer(uint32_t binding, const buffer_vk& buf, uint32_t descriptor_count = 1) { add_binding(binding, vk::DescriptorType::eUniformBuffer, descriptor_count, nullptr); buffers_[binding] = buf; } void add_storage_buffer(uint32_t binding, const buffer_vk& buf, uint32_t descriptor_count = 1) { add_binding(binding, vk::DescriptorType::eStorageBuffer, descriptor_count, nullptr); buffers_[binding] = buf; } void add_sampled_image(uint32_t binding, uint32_t descriptor_count = 1, const vk::Sampler* immutable_samplers = nullptr) { add_binding(binding, vk::DescriptorType::eSampledImage, descriptor_count, immutable_samplers); } void add_storage_image(uint32_t binding, std::shared_ptr in_texture, uint32_t descriptor_count = 1) { add_binding(binding, vk::DescriptorType::eStorageImage, descriptor_count, nullptr); textures_[binding] = in_texture; } void add_input_attachment(uint32_t binding, uint32_t descriptor_count = 1) { add_binding(binding, vk::DescriptorType::eInputAttachment, descriptor_count, nullptr); } void add_sampler(uint32_t binding, uint32_t descriptor_count = 1, const vk::Sampler* immutable_samplers = nullptr) { add_binding(binding, vk::DescriptorType::eSampler, descriptor_count, immutable_samplers); } void add_uniform_image(uint32_t binding, std::shared_ptr in_texture, uint32_t descriptor_count = 1, const vk::Sampler* immutable_samplers = nullptr) { add_binding(binding, vk::DescriptorType::eCombinedImageSampler, descriptor_count, immutable_samplers); textures_[binding] = in_texture; } virtual void create() = 0; virtual void destroy() = 0; vk::Pipeline pipeline_; vk::PipelineCache pipeline_cache_; vk::PipelineLayout pipeline_layout_; vk::DescriptorSetLayout descriptor_set_layout_; vk::DescriptorSet descriptor_set_; std::vector descriptor_set_layout_bindings_; std::map buffers_; std::map> textures_; protected: void create_pipeline_layout(); };