sandbox
Loading...
Searching...
No Matches
compute_pipeline.hpp
1#ifndef LIBSBX_GRAPHICS_COMPUTE_PIPELINE_HPP_
2#define LIBSBX_GRAPHICS_COMPUTE_PIPELINE_HPP_
3
4#include <vector>
5
6#include <vulkan/vulkan.hpp>
7
8#include <fmt/format.h>
9
10#include <libsbx/math/vector3.hpp>
11
12#include <libsbx/graphics/pipeline/pipeline.hpp>
13#include <libsbx/graphics/pipeline/shader.hpp>
14
15namespace sbx::graphics {
16
17class compute_pipeline : public pipeline {
18
19public:
20
21 compute_pipeline(const std::filesystem::path& path);
22
23 ~compute_pipeline() override;
24
25 auto handle() const noexcept -> VkPipeline override {
26 return _handle;
27 }
28
29 auto has_variable_descriptors() const noexcept -> bool override {
30 return false;
31 }
32
33 auto descriptor_counts(std::uint32_t set) const noexcept -> std::vector<std::uint32_t> override {
34 auto counts = std::vector<std::uint32_t>{};
35
36 for (const auto& binding_data : _set_data[set].binding_data) {
37 counts.push_back(binding_data.descriptor_count);
38 }
39
40 return counts;
41 }
42
43 auto descriptor_set_layout(std::uint32_t set) const noexcept -> VkDescriptorSetLayout override {
44 return _set_data[set].layout;
45 }
46
47 auto descriptor_pool() const noexcept -> VkDescriptorPool override {
48 return _descriptor_pool;
49 }
50
51 auto layout() const noexcept -> VkPipelineLayout override {
52 return _layout;
53 }
54
55 auto bind_point() const noexcept -> VkPipelineBindPoint override {
56 return _bind_point;
57 }
58
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()) {
61 return it->second;
62 }
63
64 throw std::runtime_error(fmt::format("Failed to find descriptor block '{}' in graphics pipeline '{}'", name, _name));
65 }
66
67 auto push_constant() const noexcept -> const std::optional<shader::uniform_block>& override {
68 return _push_constant;
69 }
70
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()) {
73 return it->second;
74 }
75
76 return std::nullopt;
77 }
78
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) {
81 return std::nullopt;
82 }
83
84 return _set_data[set].binding_data[binding].descriptor_type;
85 }
86
87 auto dispatch(command_buffer& command_buffer, const math::vector3u& groups) -> void {
88 vkCmdDispatch(command_buffer, groups.x(), groups.y(), groups.z());
89 }
90
91private:
92
93 struct per_binding_data {
94 VkDescriptorType descriptor_type;
95 std::uint32_t descriptor_count;
96 }; // struct per_binding_data
97
98 struct per_set_data {
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;
105 }; // struct per_set_data
106
107 auto _get_stage_from_name(const std::string& name) const noexcept -> VkShaderStageFlagBits;
108
109 std::unique_ptr<shader> _shader;
110
111 std::vector<per_set_data> _set_data;
112 std::optional<shader::uniform_block> _push_constant;
113
114 std::string _name;
115 VkPipelineLayout _layout;
116 VkPipeline _handle;
117 VkPipelineBindPoint _bind_point;
118
119 VkDescriptorPool _descriptor_pool;
120
121}; // class compute_pipeline
122
123} // namespace sbx::graphics
124
125#endif // LIBSBX_GRAPHICS_COMPUTE_PIPELINE_HPP_
Definition: command_buffer.hpp:14
Definition: compute_pipeline.hpp:17
Definition: pipeline.hpp:18
Definition: shader.hpp:125
Definition: vector3.hpp:22