sandbox
Loading...
Searching...
No Matches
image2d_array.hpp
1#ifndef LIBSBX_GRAPHICS_IMAGES_IMAGE2D_ARRAY_HPP_
2#define LIBSBX_GRAPHICS_IMAGES_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
15class image2d_array : public descriptor {
16
17public:
18
19 inline static constexpr auto max_size = std::uint32_t{32u};
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.sampler = image.sampler();
51 descriptor_image_info.imageView = image.view();
52
53 descriptor_image_infos.push_back(descriptor_image_info);
54 }
55
56 auto descriptor_write = VkWriteDescriptorSet{};
57 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
58 descriptor_write.dstSet = nullptr;
59 descriptor_write.dstBinding = binding;
60 descriptor_write.dstArrayElement = 0;
61 descriptor_write.descriptorCount = static_cast<std::uint32_t>(descriptor_image_infos.size());
62 descriptor_write.descriptorType = descriptor_type;
63
64 return graphics::write_descriptor_set{descriptor_write, descriptor_image_infos};
65 }
66
67 auto push_back(const math::uuid& id) -> std::uint32_t {
68 if (_image_ids.size() > max_size) {
69 throw std::runtime_error{"separate_image2d_array::push_back: max_size exceeded"};
70 }
71
72 if (const auto entry = _id_to_indices.find(id); entry != _id_to_indices.cend()) {
73 return entry->second;
74 }
75
76 const auto index = static_cast<std::uint32_t>(_image_ids.size());
77
78 _image_ids.push_back(id);
79 _id_to_indices.insert({id, index});
80
81 return index;
82 }
83
84 auto clear() -> void {
85 _image_ids.clear();
86 _id_to_indices.clear();
87 }
88
89private:
90
91 std::vector<math::uuid> _image_ids;
92 std::unordered_map<math::uuid, std::uint32_t> _id_to_indices;
93
94}; // class image2d_array
95
96} // namespace sbx::graphics
97
98#endif // LIBSBX_GRAPHICS_IMAGES_IMAGE2D_ARRAY_HPP_
Definition: descriptor.hpp:33
Module for managing rendering specific tasks.
Definition: graphics_module.hpp:59
Definition: image2d_array.hpp:15
Definition: image2d.hpp:15
Definition: image.hpp:18
Definition: descriptor.hpp:12
Definition: uuid.hpp:16