2#ifndef LIBSBX_GRAPHICS_COMPUTE_PIPELINE_HPP_
3#define LIBSBX_GRAPHICS_COMPUTE_PIPELINE_HPP_
7#include <vulkan/vulkan.hpp>
11#include <libsbx/math/vector3.hpp>
13#include <libsbx/graphics/pipeline/pipeline.hpp>
14#include <libsbx/graphics/pipeline/shader.hpp>
16namespace sbx::graphics {
28 auto handle()
const noexcept -> VkPipeline
override {
32 auto has_variable_descriptors()
const noexcept ->
bool override {
36 auto descriptor_counts(std::uint32_t set)
const noexcept -> std::vector<std::uint32_t>
override {
37 auto counts = std::vector<std::uint32_t>{};
39 for (
const auto& binding_data : _set_data[set].binding_data) {
40 counts.push_back(binding_data.descriptor_count);
46 auto descriptor_set_layout(std::uint32_t set)
const noexcept -> VkDescriptorSetLayout
override {
47 return _set_data[set].layout;
50 auto descriptor_pool()
const noexcept -> VkDescriptorPool
override {
51 return _descriptor_pool;
54 auto layout()
const noexcept -> VkPipelineLayout
override {
58 auto bind_point()
const noexcept -> VkPipelineBindPoint
override {
62 auto descriptor_block(
const std::string& name, std::uint32_t set)
const ->
const shader::uniform_block&
override {
63 if (
auto it = _set_data[set].uniform_blocks.find(name); it != _set_data[set].uniform_blocks.end()) {
67 throw std::runtime_error(fmt::format(
"Failed to find descriptor block '{}' in graphics pipeline '{}'", name, _name));
70 auto push_constant()
const noexcept ->
const std::optional<shader::uniform_block>&
override {
71 return _push_constant;
74 auto find_descriptor_binding(
const std::string& name, std::uint32_t set)
const -> std::optional<std::uint32_t>
override {
75 if (
auto it = _set_data[set].descriptor_bindings.find(name); it != _set_data[set].descriptor_bindings.end()) {
82 auto find_descriptor_type_at_binding(std::uint32_t set, std::uint32_t binding)
const -> std::optional<VkDescriptorType>
override {
83 if (_set_data[set].binding_data.size() <= binding) {
87 return _set_data[set].binding_data[binding].descriptor_type;
96 struct per_binding_data {
97 VkDescriptorType descriptor_type;
98 std::uint32_t descriptor_count;
101 struct per_set_data {
102 std::unordered_map<std::string, shader::uniform> uniforms;
103 std::unordered_map<std::string, shader::uniform_block> uniform_blocks;
104 std::unordered_map<std::string, std::uint32_t> descriptor_bindings;
105 std::unordered_map<std::string, std::uint32_t> descriptor_sizes;
106 std::vector<per_binding_data> binding_data;
107 VkDescriptorSetLayout layout;
110 auto _get_stage_from_name(
const std::string& name)
const noexcept -> VkShaderStageFlagBits;
112 std::unique_ptr<shader> _shader;
114 std::vector<per_set_data> _set_data;
115 std::optional<shader::uniform_block> _push_constant;
118 VkPipelineLayout _layout;
120 VkPipelineBindPoint _bind_point;
122 VkDescriptorPool _descriptor_pool;
Definition: command_buffer.hpp:15
Definition: compute_pipeline.hpp:18
Definition: pipeline.hpp:21
Definition: resource_storage.hpp:18
Definition: vector3.hpp:23