vOOlkan
An object oriented approach to Vulkan
StaticSet.h
Go to the documentation of this file.
1#ifndef VULKAN_STATICSET
2#define VULKAN_STATICSET
3
4#include <glm/glm.hpp>
5#include <tuple>
6#include <concepts>
7#include <type_traits>
8
9#include "UniformBuffer.h"
10#include "TextureImage.h"
11#include "LogicalDevice.h"
12#include "PhysicalDevice.h"
13#include "Set.h"
14
15
16namespace Vulkan {
17
21 class StaticSet : public Set {
22 public:
23 //TODO comment
24 struct StaticBufferBindingInfo : public Set::BindingInfo {
25 StaticBufferBindingInfo(int size, const Buffers::UniformBuffer& buffer, int offset) : size{ size }, buffer{ buffer }, offset{ offset } {}
26
27 DescriptorSetBindingCreationInfo generateDescriptorSetBindingInfo(const VkDescriptorSet& descriptorSet) const override {
28 return DescriptorSetBindingCreationInfo{ binding, descriptorSet, size, buffer, offset };
29 }
30
31 int size; //the size of the binding
32 const Buffers::UniformBuffer& buffer; //reference to the buffer of the binding
33 int offset; //offset in his buffer of the binding
34 };
35
36
37 struct ImageBindingInfo : public Set::BindingInfo {
38 ImageBindingInfo(const TextureImage& texture) : texture{ texture } {}
39
40 DescriptorSetBindingCreationInfo generateDescriptorSetBindingInfo(const VkDescriptorSet& descriptorSet) const override {
41 return DescriptorSetBindingCreationInfo{ binding, descriptorSet, texture };
42 }
43
44 const TextureImage& texture;
45 };
46
47
48
60 template<typename... Structs, typename... T> requires
61 ((std::same_as<T, std::tuple<VkShaderStageFlagBits, Structs, Buffers::UniformBuffer*, int>> || std::same_as<T, std::tuple<VkShaderStageFlagBits, TextureImage*>>) && ...)
62 StaticSet(const LogicalDevice& virtualGpu, const T&... bindingsInfo) : Set{ virtualGpu } {
63 (this->bindingsInfo.push_back(createBindingInfo(bindingsInfo)), ...);
64
65 createDescriptorSetLayout(std::pair{ std::get<0>(bindingsInfo), std::same_as<T, std::tuple<VkShaderStageFlagBits, TextureImage*>> ? VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER }...);
66 }
67
68
69
82 template<typename... Bindings>
83 void fillBuffer(Buffers::UniformBuffer& buffer, const Bindings&... bindings) const {
84 std::vector<StaticBufferBindingInfo*> bindingsInfo;
85 try {
86 bindingsInfo = bindingsPerBuffer.at(&buffer); //get the info of the bindings of the buffer
87 }
88 catch (const std::out_of_range&) {
89 throw VulkanException{ "Failed to fill the uniform buffer", "The buffer to be filled isn't used in this set" };
90 }
91
92 //fill the buffer by placing the n-th binding at the position pointed by the n-th bindingInfo (for the buffer) offset
93 int counter = 0;
94 ([&bindingsInfo, &counter, &buffer](Bindings binding) {
95 buffer.fillBuffer(binding, bindingsInfo[counter]->offset);
96 counter++;
97 }(bindings), ...);
98
99 }
100
101
102
103 private:
104
105 template<typename Struct>
106 std::unique_ptr<StaticBufferBindingInfo> createBindingInfo(const std::tuple<VkShaderStageFlagBits, Struct, Buffers::UniformBuffer*, int>& info) {
107 auto tmp = std::make_unique<StaticBufferBindingInfo>(sizeof(std::get<1>(info)), *std::get<2>(info), std::get<3>(info));
108 tmp->binding = bindingsInfo.size();
109 bindingsPerBuffer[std::get<2>(info)].push_back(tmp.get());
110 return tmp;
111 }
112
113
114 std::unique_ptr<ImageBindingInfo> createBindingInfo(const std::tuple<VkShaderStageFlagBits, TextureImage*>& info) {
115 auto tmp = std::make_unique<ImageBindingInfo>(*std::get<1>(info));
116 tmp->binding = bindingsInfo.size();
117 return tmp;
118 }
119
120
121 std::map<const Buffers::UniformBuffer*, std::vector<StaticBufferBindingInfo*>> bindingsPerBuffer; //this map holds the bindings relative to each buffer used in the Set
122
123
124 };
125
126}
127
128
129
130#endif
Types of queue families.
Definition: Animations.h:17