sandbox
Loading...
Searching...
No Matches
buffer.hpp
1#ifndef LIBSBX_GRAPHICS_BUFFERS_BUFFER_HPP_
2#define LIBSBX_GRAPHICS_BUFFERS_BUFFER_HPP_
3
4#include <utility>
5#include <span>
6#include <cinttypes>
7
8#include <vulkan/vulkan.hpp>
9
10#include <libsbx/utility/noncopyable.hpp>
11
12#include <libsbx/memory/observer_ptr.hpp>
13
14namespace sbx::graphics {
15
17
18public:
19
20 using size_type = VkDeviceSize;
21
22 buffer_base(size_type size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, memory::observer_ptr<const void> memory = nullptr);
23
24 virtual ~buffer_base();
25
26 auto handle() const noexcept -> const VkBuffer&;
27
28 operator const VkBuffer&() const noexcept;
29
30 auto memory() const noexcept -> const VkDeviceMemory&;
31
32 virtual auto size() const noexcept -> size_type;
33
34 virtual auto write(memory::observer_ptr<const void> data, size_type size, size_type offset = 0) -> void;
35
36protected:
37
38 auto map() -> memory::observer_ptr<void>;
39
40 auto unmap() -> void;
41
42private:
43
44 VkBuffer _handle{};
45 VkDeviceSize _size{};
46 VkDeviceMemory _memory{};
47
48}; // class buffer_base
49
50template<typename Type, VkBufferUsageFlags Usage, VkMemoryPropertyFlags Properties>
51class basic_buffer : public buffer_base {
52
53 using base_type = buffer_base;
54
55public:
56
57 using value_type = Type;
58 using size_type = base_type::size_type;
59
60 basic_buffer(std::span<const Type> elements, VkMemoryPropertyFlags properties = 0, VkBufferUsageFlags usage = 0u)
61 : base_type{elements.size() * sizeof(Type), (usage | Usage) , (properties | Properties), elements.data()} { }
62
63 basic_buffer(size_type size, VkMemoryPropertyFlags properties = 0, VkBufferUsageFlags usage = 0u)
64 : base_type{size * sizeof(Type), (usage | Usage) , (properties | Properties), nullptr} { }
65
66 ~basic_buffer() override = default;
67
68 auto size() const noexcept -> VkDeviceSize override {
69 return size_in_bytes() / sizeof(Type);
70 }
71
72 auto size_in_bytes() const noexcept -> VkDeviceSize {
73 return base_type::size();
74 }
75
76}; // class basic_buffer
77
78using staging_buffer = basic_buffer<std::uint8_t, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, (VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)>;
79
80} // namespace sbx::graphics
81
82#endif // LIBSBX_GRAPHICS_BUFFERS_BUFFER_HPP_
Definition: buffer.hpp:51
Definition: buffer.hpp:16
A non-owning pointer that can be used to observe the value of a pointer.
Definition: observer_ptr.hpp:27
Definition: noncopyable.hpp:6