• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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