1#ifndef LIBSBX_GRAPHICS_IMAGES_IMAGE2D_ARRAY_HPP_
2#define LIBSBX_GRAPHICS_IMAGES_IMAGE2D_ARRAY_HPP_
5#include <unordered_map>
7#include <libsbx/math/uuid.hpp>
9#include <libsbx/graphics/graphics_module.hpp>
11#include <libsbx/graphics/descriptor/descriptor.hpp>
13namespace sbx::graphics {
19 inline static constexpr auto max_size = std::uint32_t{32u};
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;
37 return descriptor_set_layout_binding;
41 auto&
graphics_module = core::engine::get_module<graphics::graphics_module>();
43 auto descriptor_image_infos = std::vector<VkDescriptorImageInfo>{};
45 for (
const auto id : _image_ids) {
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();
53 descriptor_image_infos.push_back(descriptor_image_info);
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;
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"};
72 if (
const auto entry = _id_to_indices.find(
id); entry != _id_to_indices.cend()) {
76 const auto index =
static_cast<std::uint32_t
>(_image_ids.size());
78 _image_ids.push_back(
id);
79 _id_to_indices.insert({id, index});
84 auto clear() ->
void {
86 _id_to_indices.clear();
91 std::vector<math::uuid> _image_ids;
92 std::unordered_map<math::uuid, std::uint32_t> _id_to_indices;
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: descriptor.hpp:12