17 vkDestroyDescriptorSetLayout(
_device, pair.second,
nullptr);
26 layoutinfo.
bindings.reserve(info->bindingCount);
30 for (
U32 i = 0u; i < info->bindingCount; i++)
32 layoutinfo.bindings.push_back(info->pBindings[i]);
35 if (
to_I32(info->pBindings[i].binding) > lastBinding)
37 lastBinding = info->pBindings[i].binding;
47 eastl::sort(eastl::begin(layoutinfo.bindings),
48 eastl::end(layoutinfo.bindings),
49 [](
const VkDescriptorSetLayoutBinding& a,
const VkDescriptorSetLayoutBinding& b ) {
50 return a.binding < b.binding;
60 VkDescriptorSetLayout layout;
61 vkCreateDescriptorSetLayout(
_device, info,
nullptr, &layout);
74 for (
size_t i = 0u; i <
bindings.size(); i++)
92 for (
const VkDescriptorSetLayoutBinding& b : bindings)
99 if (b.pImmutableSamplers !=
nullptr)
113 builder.
cache = layoutCache;
114 builder.alloc = allocator;
121 VkDescriptorSetLayoutBinding& newBinding = bindings.emplace_back();
123 newBinding.descriptorCount = 1;
124 newBinding.descriptorType = type;
125 newBinding.stageFlags = stageFlags;
126 newBinding.binding = binding;
127 newBinding.pImmutableSamplers =
nullptr;
136 VkDescriptorSetLayoutBinding& newBinding = bindings.emplace_back();
138 newBinding.descriptorCount = 1;
139 newBinding.descriptorType = type;
140 newBinding.stageFlags = stageFlags;
141 newBinding.binding = binding;
142 newBinding.pImmutableSamplers =
nullptr;
155 if ( !alloc->Allocate( layoutIn, set ) )
164 for ( VkWriteDescriptorSet& w : writes )
169 vkUpdateDescriptorSets( device,
to_U32( writes.size() ), writes.data(), 0,
nullptr );
178 VkDescriptorSetLayoutCreateInfo layoutInfo{ .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO };
179 layoutInfo.pBindings = bindings.data();
180 layoutInfo.bindingCount =
to_U32( bindings.size() );
181 layoutOut = cache->createDescriptorLayout(&layoutInfo);
183 return buildSetFromLayout(set, layoutOut, device);
VkFlags VkShaderStageFlags
#define PROFILE_SCOPE_AUTO(CATEGORY)
#define PROFILE_SCOPE(NAME, CATEGORY)
DescriptorLayoutCache * cache
static DescriptorBuilder Begin(DescriptorLayoutCache *layoutCache, vke::DescriptorAllocatorHandle *allocator)
DescriptorBuilder & bindBuffer(U32 binding, VkDescriptorBufferInfo *bufferInfo, VkDescriptorType type, VkShaderStageFlags stageFlags)
bool buildSetFromLayout(VkDescriptorSet &set, const VkDescriptorSetLayout &layoutIn, VkDevice device)
bool buildSetAndLayout(VkDescriptorSet &set, VkDescriptorSetLayout &layoutOut, VkDevice device)
DescriptorBuilder & bindImage(U32 binding, VkDescriptorImageInfo *imageInfo, VkDescriptorType type, VkShaderStageFlags stageFlags)
DescriptorLayoutCache(VkDevice device)
VkDescriptorSetLayout createDescriptorLayout(VkDescriptorSetLayoutCreateInfo *info)
hashMap< DescriptorLayoutInfo, VkDescriptorSetLayout, DescriptorLayoutHash > _layoutCache
constexpr Optick::Category::Type Graphics
void Hash_combine(size_t &seed, const T &v, const Rest &... rest) noexcept
a la Boost
VkWriteDescriptorSet writeDescriptorSet(VkDescriptorType type, uint32_t binding, VkDescriptorBufferInfo *bufferInfo, uint32_t descriptorCount=1)
Handle console commands that start with a forward slash.
constexpr U32 to_U32(const T value)
constexpr I32 to_I32(const T value)
Divide::hashPairReturn< K, V, HashFun > emplace(Divide::hashMap< K, V, HashFun, Predicate > &map, K key, Args &&... args)
vector< VkDescriptorSetLayoutBinding > bindings
bool operator==(const DescriptorLayoutInfo &other) const