sandbox
Loading...
Searching...
No Matches
pipeline.hpp
1#ifndef LIBSBX_GRAPHICS_PIPELINE_PIPELINE_HPP_
2#define LIBSBX_GRAPHICS_PIPELINE_PIPELINE_HPP_
3
4#include <cinttypes>
5#include <optional>
6
7#include <vulkan/vulkan.hpp>
8
9#include <libsbx/utility/noncopyable.hpp>
11
12#include <libsbx/graphics/commands/command_buffer.hpp>
13
14#include <libsbx/graphics/pipeline/shader.hpp>
15
16namespace sbx::graphics {
17
19
20public:
21
22 struct stage {
23 std::uint32_t renderpass;
24 std::uint32_t subpass;
25
26 auto operator==(const stage& rhs) const noexcept -> bool {
27 return renderpass == rhs.renderpass && subpass == rhs.subpass;
28 }
29
30 auto operator<(const stage& rhs) const noexcept -> bool {
31 return renderpass < rhs.renderpass || (renderpass == rhs.renderpass && subpass < rhs.subpass);
32 }
33 }; // struct stage
34
35 pipeline() = default;
36
37 virtual ~pipeline() = default;
38
39 auto bind(command_buffer& command_buffer) const noexcept -> void {
40 vkCmdBindPipeline(command_buffer, bind_point(), handle());
41 }
42
43 operator const VkPipeline&() const noexcept {
44 return handle();
45 }
46
47 virtual auto handle() const noexcept -> const VkPipeline& = 0;
48
49 virtual auto has_variable_descriptors() const noexcept -> bool = 0;
50
51 virtual auto descriptor_counts() const noexcept -> const std::unordered_map<std::uint32_t, std::uint32_t>& = 0;
52
53 virtual auto descriptor_set_layout() const noexcept -> const VkDescriptorSetLayout& = 0;
54
55 virtual auto descriptor_pool() const noexcept -> const VkDescriptorPool& = 0;
56
57 virtual auto layout() const noexcept -> const VkPipelineLayout& = 0;
58
59 virtual auto bind_point() const noexcept -> VkPipelineBindPoint = 0;
60
61 virtual auto descriptor_block(const std::string& name) const -> const shader::uniform_block& = 0;
62
63 virtual auto find_descriptor_binding(const std::string& name) const -> std::optional<std::uint32_t> = 0;
64
65 virtual auto find_descriptor_type_at_binding(std::uint32_t binding) const -> std::optional<VkDescriptorType> = 0;
66
67}; // class pipeline
68
69} // namespace sbx::graphics
70
71template<>
72struct std::hash<sbx::graphics::pipeline::stage> {
73 auto operator()(const sbx::graphics::pipeline::stage& stage) const noexcept -> std::size_t {
74 auto hash = std::size_t{0};
75 sbx::utility::hash_combine(hash, stage.renderpass, stage.subpass);
76 return hash;
77 }
78}; // struct std::hash<sbx::graphics::pipeline::stage>
79
80#endif // LIBSBX_GRAPHICS_PIPELINE_PIPELINE_HPP_
Definition: command_buffer.hpp:14
Definition: pipeline.hpp:18
Definition: pipeline.hpp:22
Definition: noncopyable.hpp:6