AronaCore/core/rhi/pipeline.h
2024-02-20 10:06:45 +08:00

59 lines
2.5 KiB
C++

#pragma once
#include <vulkan/vulkan.hpp>
#include <map>
#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<texture> 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<texture> 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<vk::DescriptorSetLayoutBinding> descriptor_set_layout_bindings_;
std::map<uint32_t, buffer_vk> buffers_;
std::map<uint32_t, std::shared_ptr<texture>> textures_;
protected:
void create_pipeline_layout();
};