sandbox
Loading...
Searching...
No Matches
separate_image2d_array.hpp
1#ifndef LIBSBX_GRAPHICS_IMAGES_SEPARATE_IMAGE2D_ARRAY_HPP_
2#define LIBSBX_GRAPHICS_IMAGES_SEPARATE_IMAGE2D_ARRAY_HPP_
3
4#include <vector>
5#include <unordered_map>
6
7#include <libsbx/math/uuid.hpp>
8
9#include <libsbx/graphics/graphics_module.hpp>
10
11#include <libsbx/graphics/descriptor/descriptor.hpp>
12
13namespace sbx::graphics {
14
16
17public:
18
19 inline static constexpr auto max_size = std::uint32_t{64u};
20
22
23 }
24
26
27 }
28
29 static auto create_descriptor_set_layout_binding(std::uint32_t binding, VkDescriptorType descriptor_type, VkShaderStageFlags shader_stage_flags) noexcept -> VkDescriptorSetLayoutBinding {
30 auto descriptor_set_layout_binding = VkDescriptorSetLayoutBinding{};
31 descriptor_set_layout_binding.binding = binding;
32 descriptor_set_layout_binding.descriptorType = descriptor_type;
33 descriptor_set_layout_binding.stageFlags = shader_stage_flags;
34 descriptor_set_layout_binding.descriptorCount = max_size;
35 descriptor_set_layout_binding.pImmutableSamplers = nullptr;
36
37 return descriptor_set_layout_binding;
38 }
39
40 auto write_descriptor_set(std::uint32_t binding, VkDescriptorType descriptor_type) const noexcept -> graphics::write_descriptor_set override {
41 auto& graphics_module = core::engine::get_module<graphics::graphics_module>();
42
43 auto descriptor_image_infos = std::vector<VkDescriptorImageInfo>{};
44
45 for (const auto id : _image_ids) {
46 auto& image = graphics_module.get_asset<graphics::image2d>(id);
47
48 auto descriptor_image_info = VkDescriptorImageInfo{};
49 descriptor_image_info.imageLayout = image.layout();
50 descriptor_image_info.imageView = image.view();
51
52 descriptor_image_infos.push_back(descriptor_image_info);
53 }
54
55 auto descriptor_write = VkWriteDescriptorSet{};
56 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
57 descriptor_write.dstSet = nullptr;
58 descriptor_write.dstBinding = binding;
59 descriptor_write.dstArrayElement = 0;
60 descriptor_write.descriptorCount = static_cast<std::uint32_t>(descriptor_image_infos.size());
61 descriptor_write.descriptorType = descriptor_type;
62
63 return graphics::write_descriptor_set{descriptor_write, descriptor_image_infos};
64 }
65
66 auto push_back(const math::uuid& id) -> std::uint32_t {
67 if (_image_ids.size() > max_size) {
68 throw std::runtime_error{"separate_image2d_array::push_back: max_size exceeded"};
69 }
70
71 if (const auto entry = _id_to_indices.find(id); entry != _id_to_indices.cend()) {
72 return entry->second;
73 }
74
75 const auto index = static_cast<std::uint32_t>(_image_ids.size());
76
77 _image_ids.push_back(id);
78 _id_to_indices.insert({id, index});
79
80 return index;
81 }
82
83 auto clear() -> void {
84 _image_ids.clear();
85 _id_to_indices.clear();
86 }
87
88private:
89
90 std::vector<math::uuid> _image_ids;
91 std::unordered_map<math::uuid, std::uint32_t> _id_to_indices;
92
93}; // class separate_image2d_array
94
95} // namespace sbx::graphics
96
97#endif // LIBSBX_GRAPHICS_IMAGES_SEPARATE_IMAGE2D_ARRAY_HPP_
Definition: descriptor.hpp:33
Module for managing rendering specific tasks.
Definition: graphics_module.hpp:59
Definition: image2d.hpp:15
Definition: image.hpp:18
Definition: separate_image2d_array.hpp:15
Definition: descriptor.hpp:12
Definition: uuid.hpp:16