PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
imgui_layer_helpers_internal.h
1#pragma once
2
3#include <volk.h>
4
5#include <map>
6#include <vector>
7
8namespace pixelbullet::application_layers_internal
9{
11{
12 VkImageView image_view = VK_NULL_HANDLE;
13 VkSampler sampler = VK_NULL_HANDLE;
14
15 bool operator<(const SampledImageTextureKey& other) const noexcept
16 {
17 if (image_view != other.image_view)
18 {
19 return image_view < other.image_view;
20 }
21
22 return sampler < other.sampler;
23 }
24};
25
26inline bool IsValidSampledImageTextureKey(const SampledImageTextureKey& key) noexcept
27{
28 return key.image_view != VK_NULL_HANDLE && key.sampler != VK_NULL_HANDLE;
29}
30
31template <typename CacheMap, typename CreateFn>
32inline VkDescriptorSet GetOrCreateSampledImageTextureDescriptor(CacheMap& cache, const SampledImageTextureKey& key,
33 CreateFn&& create_descriptor)
34{
35 if (!IsValidSampledImageTextureKey(key))
36 {
37 return VK_NULL_HANDLE;
38 }
39
40 if (const auto it = cache.find(key); it != cache.end())
41 {
42 return it->second;
43 }
44
45 const VkDescriptorSet descriptor_set = create_descriptor(key.sampler, key.image_view);
46 if (descriptor_set == VK_NULL_HANDLE)
47 {
48 return VK_NULL_HANDLE;
49 }
50
51 cache.emplace(key, descriptor_set);
52 return descriptor_set;
53}
54
55template <typename CacheMap, typename DestroyFn>
56inline void ClearSampledImageTextureDescriptors(CacheMap& cache, DestroyFn&& destroy_descriptor)
57{
58 for (const auto& [key, descriptor_set] : cache)
59 {
60 destroy_descriptor(descriptor_set);
61 }
62
63 cache.clear();
64}
65
66inline bool RequiresTextureCacheRebuild(const std::vector<VkDescriptorSet>& descriptor_sets, const std::vector<VkImageView>& cached_views,
67 const std::vector<VkSampler>& cached_samplers, const std::vector<VkImageView>& current_views,
68 const std::vector<VkSampler>& current_samplers) noexcept
69{
70 if (descriptor_sets.size() != current_views.size() || current_views.size() != current_samplers.size() ||
71 cached_views.size() != current_views.size() || cached_samplers.size() != current_samplers.size())
72 {
73 return true;
74 }
75
76 for (std::size_t image_index = 0; image_index < current_views.size(); ++image_index)
77 {
78 if (cached_views[image_index] != current_views[image_index] || cached_samplers[image_index] != current_samplers[image_index])
79 {
80 return true;
81 }
82 }
83
84 return false;
85}
86} // namespace pixelbullet::application_layers_internal
Definition imgui_layer_helpers_internal.h:11