sandbox
Loading...
Searching...
No Matches
command_buffer.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_GRAPHICS_COMMANDS_COMMAND_BUFFER_HPP_
3#define LIBSBX_GRAPHICS_COMMANDS_COMMAND_BUFFER_HPP_
4
5#include <memory>
6
7#include <vulkan/vulkan.hpp>
8
9#include <libsbx/graphics/devices/logical_device.hpp>
10
11#include <libsbx/graphics/commands/command_pool.hpp>
12
13namespace sbx::graphics {
14
16
17public:
18
19 struct wait_data {
20 VkSemaphore semaphore;
21 VkPipelineStageFlags stage;
22 }; // struct wait_data
23
25 std::vector<VkBuffer> buffers;
26 VkPipelineStageFlags src_stage_mask;
27 VkPipelineStageFlags dst_stage_mask;
28 VkAccessFlags src_access_mask;
29 VkAccessFlags dst_access_mask;
30 std::uint32_t src_queue_family{VK_QUEUE_FAMILY_IGNORED};
31 std::uint32_t dst_queue_family{VK_QUEUE_FAMILY_IGNORED};
32 }; // struct buffer_barrier
33
35 VkPipelineStageFlags2 dst_stage_mask;
36 VkAccessFlags2 dst_access_mask;
37 std::uint32_t src_queue_family;
38 std::uint32_t dst_queue_family;
39 VkBuffer buffer;
40 VkDeviceSize size{VK_WHOLE_SIZE};
41 VkDeviceSize offset{0};
42 }; // struct buffer_acquire_data
43
45 VkPipelineStageFlags2 src_stage_mask;
46 VkAccessFlags2 src_access_mask;
47 std::uint32_t src_queue_family;
48 std::uint32_t dst_queue_family;
49 VkBuffer buffer;
50 VkDeviceSize size{VK_WHOLE_SIZE};
51 VkDeviceSize offset{0};
52 }; // struct buffer_release_data
53
55 VkImage image;
56 std::uint32_t mip_levels;
57 std::uint32_t base_array_layer;
58 std::uint32_t layer_count;
59 VkPipelineStageFlags2 src_stage_mask;
60 VkAccessFlags2 src_access_mask;
61 std::uint32_t src_queue_family;
62 std::uint32_t dst_queue_family;
63 VkImageLayout old_layout;
64 VkImageLayout new_layout;
65 }; // struct image_release_data
66
68 VkImage image;
69 std::uint32_t mip_levels;
70 std::uint32_t base_array_layer;
71 std::uint32_t layer_count;
72 VkPipelineStageFlags2 dst_stage_mask;
73 VkAccessFlags2 dst_access_mask;
74 std::uint32_t src_queue_family;
75 std::uint32_t dst_queue_family;
76 VkImageLayout old_layout;
77 VkImageLayout new_layout;
78 }; // struct image_acquire_data
79
80 command_buffer(bool should_begin = true, VkQueueFlagBits queue_type = VK_QUEUE_GRAPHICS_BIT, VkCommandBufferLevel buffer_level = VK_COMMAND_BUFFER_LEVEL_PRIMARY);
81
82 command_buffer(const command_buffer&) = delete;
83
85
87
88 auto operator=(const command_buffer&) -> command_buffer& = delete;
89
90 auto operator=(command_buffer&&) noexcept -> command_buffer&;
91
92 auto handle() const noexcept -> VkCommandBuffer;
93
94 operator VkCommandBuffer() const noexcept;
95
96 auto is_running() const noexcept -> bool;
97
98 auto begin(VkCommandBufferUsageFlags usage = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) -> void;
99
100 auto end() -> void;
101
102 auto submit_idle() -> void;
103
104 auto submit(const std::vector<wait_data>& wait_data = {}, const VkSemaphore &signal_semaphore = nullptr, const VkFence& fence = nullptr) -> void;
105
106 auto copy_buffer(const VkBuffer& source, const VkBuffer& destination, const VkBufferCopy& region) -> void;
107
108 auto buffer_barrier(const buffer_barrier_data& buffer_barrier_data) -> void;
109
110 auto memory_dependency(const VkMemoryBarrier2& memory_barrier) -> void;
111
112 auto release_buffer_ownership(const std::vector<buffer_release_data>& releases) -> void;
113
114 auto acquire_buffer_ownership(const std::vector<buffer_acquire_data>& acquires) -> void;
115
116 auto acquire_image_ownership(const std::vector<image_acquire_data>& acquires) -> void;
117
118 auto release_image_ownership(const std::vector<image_release_data>& releases) -> void;
119
120 auto set_viewport(const VkViewport& viewport) -> void;
121
122 auto set_scissor(const VkRect2D& scissor) -> void;
123
124 auto bind_vertex_buffer(std::uint32_t first_binding, const VkBuffer& buffer) -> void;
125
126 auto bind_index_buffer(const VkBuffer& buffer, VkDeviceSize offset, VkIndexType index_type) -> void;
127
128 auto draw(std::uint32_t vertex_count, std::uint32_t instance_count, std::uint32_t first_vertex, std::uint32_t first_instance) -> void;
129
130 auto draw_indexed(std::uint32_t index_count, std::uint32_t instance_count, std::uint32_t first_index, std::int32_t vertex_offset, std::uint32_t first_instance) -> void;
131
132 auto draw_indirect(VkBuffer buffer, std::uint32_t offset, std::uint32_t count) -> void;
133
134 auto draw_indexed_indirect(VkBuffer buffer, std::uint32_t offset, std::uint32_t count) -> void;
135
136 auto draw_indexed_indirect_count(VkBuffer buffer, std::uint32_t offset, VkBuffer count_buffer, std::uint32_t count_buffer_offset, std::uint32_t max_draw_count) -> void;
137
138 auto begin_render_pass(const VkRenderPassBeginInfo& renderpass_begin_info, VkSubpassContents subpass_contents) -> void;
139
140 auto end_render_pass() -> void;
141
142 auto fill_buffer(const VkBuffer& buffer, VkDeviceSize offset, VkDeviceSize size, std::uint32_t data) -> void;
143
144 auto begin_rendering(const VkRenderingInfo& rendering_info) -> void;
145
146 auto end_rendering() -> void;
147
148 auto reset(VkCommandBufferResetFlags flags = 0) -> void;
149
150 auto execute_commands(const std::vector<command_buffer>& commands) -> void;
151
152private:
153
154 auto _queue() const -> const graphics::queue&;
155
156 std::shared_ptr<command_pool> _command_pool{};
157
158 VkCommandBuffer _handle{};
159 VkQueueFlagBits _queue_type{};
160 bool _is_running{};
161
162}; // class command_buffer
163
164} // namespace sbx::graphics
165
166#endif // LIBSBX_GRAPHICS_COMMANDS_COMMAND_BUFFER_HPP_
Definition: buffer.hpp:21
Definition: command_buffer.hpp:15
Definition: command_pool.hpp:13
Definition: image.hpp:21
Definition: logical_device.hpp:19
Definition: viewport.hpp:13
Definition: command_buffer.hpp:67
Definition: command_buffer.hpp:54
Definition: command_buffer.hpp:19