1#ifndef LIBSBX_GRAPHICS_COMPUTE_PIPELINE_HPP_
2#define LIBSBX_GRAPHICS_COMPUTE_PIPELINE_HPP_
6#include <vulkan/vulkan.hpp>
10#include <libsbx/math/vector3.hpp>
12#include <libsbx/graphics/pipeline/pipeline.hpp>
13#include <libsbx/graphics/pipeline/shader.hpp>
15namespace sbx::graphics {
27 auto handle()
const noexcept -> VkPipeline
override {
31 auto has_variable_descriptors()
const noexcept ->
bool override {
35 auto descriptor_counts(std::uint32_t set)
const noexcept -> std::vector<std::uint32_t>
override {
36 auto counts = std::vector<std::uint32_t>{};
38 for (
const auto& binding_data : _set_data[set].binding_data) {
39 counts.push_back(binding_data.descriptor_count);
45 auto descriptor_set_layout(std::uint32_t set)
const noexcept -> VkDescriptorSetLayout
override {
46 return _set_data[set].layout;
49 auto descriptor_pool()
const noexcept -> VkDescriptorPool
override {
50 return _descriptor_pool;
53 auto layout()
const noexcept -> VkPipelineLayout
override {
57 auto bind_point()
const noexcept -> VkPipelineBindPoint
override {
61 auto descriptor_block(
const std::string& name, std::uint32_t set)
const ->
const shader::uniform_block&
override {
62 if (
auto it = _set_data[set].uniform_blocks.find(name); it != _set_data[set].uniform_blocks.end()) {
66 throw std::runtime_error(fmt::format(
"Failed to find descriptor block '{}' in graphics pipeline '{}'", name, _name));
69 auto push_constant()
const noexcept ->
const std::optional<shader::uniform_block>&
override {
70 return _push_constant;
73 auto find_descriptor_binding(
const std::string& name, std::uint32_t set)
const -> std::optional<std::uint32_t>
override {
74 if (
auto it = _set_data[set].descriptor_bindings.find(name); it != _set_data[set].descriptor_bindings.end()) {
81 auto find_descriptor_type_at_binding(std::uint32_t set, std::uint32_t binding)
const -> std::optional<VkDescriptorType>
override {
82 if (_set_data[set].binding_data.size() <= binding) {
86 return _set_data[set].binding_data[binding].descriptor_type;
95 struct per_binding_data {
96 VkDescriptorType descriptor_type;
97 std::uint32_t descriptor_count;
100 struct per_set_data {
101 std::unordered_map<std::string, shader::uniform> uniforms;
102 std::unordered_map<std::string, shader::uniform_block> uniform_blocks;
103 std::unordered_map<std::string, std::uint32_t> descriptor_bindings;
104 std::unordered_map<std::string, std::uint32_t> descriptor_sizes;
105 std::vector<per_binding_data> binding_data;
106 VkDescriptorSetLayout layout;
109 auto _get_stage_from_name(
const std::string& name)
const noexcept -> VkShaderStageFlagBits;
113 std::unique_ptr<shader> _shader;
115 std::vector<per_set_data> _set_data;
116 std::optional<shader::uniform_block> _push_constant;
119 VkPipelineLayout _layout;
121 VkPipelineBindPoint _bind_point;
123 VkDescriptorPool _descriptor_pool;
Definition: command_buffer.hpp:14
Definition: compute_pipeline.hpp:17
Definition: render_graph.hpp:242
Definition: pipeline.hpp:20
Definition: vector3.hpp:22