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