blob: cc372fb1d5113bdad20d44a003f931cc7dd696ec [file] [log] [blame]
Alexis Hetuc8176632019-01-22 17:01:28 -05001// Copyright 2018 The SwiftShader Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef VK_DESCRIPTOR_POOL_HPP_
16#define VK_DESCRIPTOR_POOL_HPP_
17
18#include "VkObject.hpp"
19#include <set>
20
Nicolas Capens157ba262019-12-10 17:49:14 -050021namespace vk {
22
23class DescriptorPool : public Object<DescriptorPool, VkDescriptorPool>
Alexis Hetuc8176632019-01-22 17:01:28 -050024{
Nicolas Capens157ba262019-12-10 17:49:14 -050025public:
Ben Clayton2ed93ab2019-12-17 20:38:03 +000026 DescriptorPool(const VkDescriptorPoolCreateInfo *pCreateInfo, void *mem);
27 void destroy(const VkAllocationCallbacks *pAllocator);
Nicolas Capens157ba262019-12-10 17:49:14 -050028
Ben Clayton2ed93ab2019-12-17 20:38:03 +000029 static size_t ComputeRequiredAllocationSize(const VkDescriptorPoolCreateInfo *pCreateInfo);
Nicolas Capens157ba262019-12-10 17:49:14 -050030
Alexis Hetu2c989e62022-08-26 17:59:41 -040031 VkResult allocateSets(uint32_t descriptorSetCount, const VkDescriptorSetLayout *pSetLayouts, VkDescriptorSet *pDescriptorSets, const VkDescriptorSetVariableDescriptorCountAllocateInfo *variableDescriptorCountAllocateInfo);
Ben Clayton2ed93ab2019-12-17 20:38:03 +000032 void freeSets(uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets);
Nicolas Capens157ba262019-12-10 17:49:14 -050033 VkResult reset();
34
35private:
Ben Clayton2ed93ab2019-12-17 20:38:03 +000036 VkResult allocateSets(size_t *sizes, uint32_t numAllocs, VkDescriptorSet *pDescriptorSets);
37 uint8_t *findAvailableMemory(size_t size);
Nicolas Capens157ba262019-12-10 17:49:14 -050038 void freeSet(const VkDescriptorSet descriptorSet);
39 size_t computeTotalFreeSize() const;
40
41 struct Node
Alexis Hetuc8176632019-01-22 17:01:28 -050042 {
Ben Clayton2ed93ab2019-12-17 20:38:03 +000043 Node(uint8_t *set, size_t size)
44 : set(set)
45 , size(size)
46 {}
47 bool operator<(const Node &node) const { return set < node.set; }
48 bool operator==(const uint8_t *other) const { return set == other; }
Alexis Hetuc8176632019-01-22 17:01:28 -050049
Ben Clayton2ed93ab2019-12-17 20:38:03 +000050 uint8_t *set = nullptr;
Nicolas Capens157ba262019-12-10 17:49:14 -050051 size_t size = 0;
Alexis Hetuc8176632019-01-22 17:01:28 -050052 };
Nicolas Capens157ba262019-12-10 17:49:14 -050053 std::set<Node> nodes;
Alexis Hetuc8176632019-01-22 17:01:28 -050054
Ben Clayton2ed93ab2019-12-17 20:38:03 +000055 uint8_t *pool = nullptr;
Nicolas Capens157ba262019-12-10 17:49:14 -050056 size_t poolSize = 0;
57};
Alexis Hetuc8176632019-01-22 17:01:28 -050058
Ben Clayton2ed93ab2019-12-17 20:38:03 +000059static inline DescriptorPool *Cast(VkDescriptorPool object)
Nicolas Capens157ba262019-12-10 17:49:14 -050060{
61 return DescriptorPool::Cast(object);
62}
63
64} // namespace vk
Alexis Hetuc8176632019-01-22 17:01:28 -050065
Ben Clayton2ed93ab2019-12-17 20:38:03 +000066#endif // VK_DESCRIPTOR_POOL_HPP_