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 {
25 auto handle()
const noexcept -> VkPipeline
override {
29 auto has_variable_descriptors()
const noexcept ->
bool override {
33 auto descriptor_counts(std::uint32_t set)
const noexcept -> std::vector<std::uint32_t>
override {
34 auto counts = std::vector<std::uint32_t>{};
36 for (
const auto& binding_data : _set_data[set].binding_data) {
37 counts.push_back(binding_data.descriptor_count);
43 auto descriptor_set_layout(std::uint32_t set)
const noexcept -> VkDescriptorSetLayout
override {
44 return _set_data[set].layout;
47 auto descriptor_pool()
const noexcept -> VkDescriptorPool
override {
48 return _descriptor_pool;
51 auto layout()
const noexcept -> VkPipelineLayout
override {
55 auto bind_point()
const noexcept -> VkPipelineBindPoint
override {
59 auto descriptor_block(
const std::string& name, std::uint32_t set)
const ->
const shader::uniform_block&
override {
60 if (
auto it = _set_data[set].uniform_blocks.find(name); it != _set_data[set].uniform_blocks.end()) {
64 throw std::runtime_error(fmt::format(
"Failed to find descriptor block '{}' in graphics pipeline '{}'", name, _name));
67 auto push_constant()
const noexcept ->
const std::optional<shader::uniform_block>&
override {
68 return _push_constant;
71 auto find_descriptor_binding(
const std::string& name, std::uint32_t set)
const -> std::optional<std::uint32_t>
override {
72 if (
auto it = _set_data[set].descriptor_bindings.find(name); it != _set_data[set].descriptor_bindings.end()) {
79 auto find_descriptor_type_at_binding(std::uint32_t set, std::uint32_t binding)
const -> std::optional<VkDescriptorType>
override {
80 if (_set_data[set].binding_data.size() <= binding) {
84 return _set_data[set].binding_data[binding].descriptor_type;
93 struct per_binding_data {
94 VkDescriptorType descriptor_type;
95 std::uint32_t descriptor_count;
99 std::unordered_map<std::string, shader::uniform> uniforms;
100 std::unordered_map<std::string, shader::uniform_block> uniform_blocks;
101 std::unordered_map<std::string, std::uint32_t> descriptor_bindings;
102 std::unordered_map<std::string, std::uint32_t> descriptor_sizes;
103 std::vector<per_binding_data> binding_data;
104 VkDescriptorSetLayout layout;
107 auto _get_stage_from_name(
const std::string& name)
const noexcept -> VkShaderStageFlagBits;
109 std::unique_ptr<shader> _shader;
111 std::vector<per_set_data> _set_data;
112 std::optional<shader::uniform_block> _push_constant;
115 VkPipelineLayout _layout;
117 VkPipelineBindPoint _bind_point;
119 VkDescriptorPool _descriptor_pool;
Definition: command_buffer.hpp:14
Definition: compute_pipeline.hpp:17
Definition: pipeline.hpp:18
Definition: vector3.hpp:22