1 // 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
21 namespace vk {
22
23 class DescriptorPool : public Object<DescriptorPool, VkDescriptorPool>
24 {
25 public:
26 DescriptorPool(const VkDescriptorPoolCreateInfo *pCreateInfo, void *mem);
27 void destroy(const VkAllocationCallbacks *pAllocator);
28
29 static size_t ComputeRequiredAllocationSize(const VkDescriptorPoolCreateInfo *pCreateInfo);
30
31 VkResult allocateSets(uint32_t descriptorSetCount, const VkDescriptorSetLayout *pSetLayouts, VkDescriptorSet *pDescriptorSets);
32 void freeSets(uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets);
33 VkResult reset();
34
35 private:
36 VkResult allocateSets(size_t *sizes, uint32_t numAllocs, VkDescriptorSet *pDescriptorSets);
37 uint8_t *findAvailableMemory(size_t size);
38 void freeSet(const VkDescriptorSet descriptorSet);
39 size_t computeTotalFreeSize() const;
40
41 struct Node
42 {
Nodevk::DescriptorPool::Node43 Node(uint8_t *set, size_t size)
44 : set(set)
45 , size(size)
46 {}
operator <vk::DescriptorPool::Node47 bool operator<(const Node &node) const { return set < node.set; }
operator ==vk::DescriptorPool::Node48 bool operator==(const uint8_t *other) const { return set == other; }
49
50 uint8_t *set = nullptr;
51 size_t size = 0;
52 };
53 std::set<Node> nodes;
54
55 uint8_t *pool = nullptr;
56 size_t poolSize = 0;
57 };
58
Cast(VkDescriptorPool object)59 static inline DescriptorPool *Cast(VkDescriptorPool object)
60 {
61 return DescriptorPool::Cast(object);
62 }
63
64 } // namespace vk
65
66 #endif // VK_DESCRIPTOR_POOL_HPP_
67