1#ifndef VULKAN_STATICSET
2#define VULKAN_STATICSET
21 class StaticSet :
public Set {
24 struct StaticBufferBindingInfo :
public Set::BindingInfo {
25 StaticBufferBindingInfo(
int size,
const Buffers::UniformBuffer& buffer,
int offset) : size{ size }, buffer{ buffer }, offset{ offset } {}
27 DescriptorSetBindingCreationInfo generateDescriptorSetBindingInfo(
const VkDescriptorSet& descriptorSet)
const override {
28 return DescriptorSetBindingCreationInfo{ binding, descriptorSet, size, buffer, offset };
32 const Buffers::UniformBuffer& buffer;
37 struct ImageBindingInfo :
public Set::BindingInfo {
38 ImageBindingInfo(
const TextureImage& texture) : texture{ texture } {}
40 DescriptorSetBindingCreationInfo generateDescriptorSetBindingInfo(
const VkDescriptorSet& descriptorSet)
const override {
41 return DescriptorSetBindingCreationInfo{ binding, descriptorSet, texture };
44 const TextureImage& texture;
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)), ...);
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 }...);
82 template<
typename... Bindings>
83 void fillBuffer(Buffers::UniformBuffer& buffer,
const Bindings&... bindings)
const {
84 std::vector<StaticBufferBindingInfo*> bindingsInfo;
86 bindingsInfo = bindingsPerBuffer.at(&buffer);
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" };
94 ([&bindingsInfo, &counter, &buffer](Bindings binding) {
95 buffer.fillBuffer(binding, bindingsInfo[counter]->offset);
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());
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();
121 std::map<const Buffers::UniformBuffer*, std::vector<StaticBufferBindingInfo*>> bindingsPerBuffer;
Types of queue families.
Definition: Animations.h:17