• 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 		~DescriptorPool() = delete;
28 		void destroy(const VkAllocationCallbacks* pAllocator);
29 
30 		static size_t ComputeRequiredAllocationSize(const VkDescriptorPoolCreateInfo* pCreateInfo);
31 
32 		VkResult allocateSets(uint32_t descriptorSetCount, const VkDescriptorSetLayout* pSetLayouts, VkDescriptorSet* pDescriptorSets);
33 		void freeSets(uint32_t descriptorSetCount, const VkDescriptorSet* pDescriptorSets);
34 		VkResult reset();
35 
36 	private:
37 		VkResult allocateSets(size_t* sizes, uint32_t numAllocs, VkDescriptorSet* pDescriptorSets);
38 		VkDescriptorSet findAvailableMemory(size_t size);
39 		void freeSet(const VkDescriptorSet descriptorSet);
40 		size_t computeTotalFreeSize() const;
41 
42 		struct Node
43 		{
Nodevk::DescriptorPool::Node44 			Node(VkDescriptorSet set, size_t size) : set(set), size(size) {}
operator <vk::DescriptorPool::Node45 			bool operator<(const Node& node) const { return this->set < node.set; }
operator ==vk::DescriptorPool::Node46 			bool operator==(VkDescriptorSet set) const { return this->set == set; }
47 
48 			VkDescriptorSet set;
49 			size_t size;
50 		};
51 		std::set<Node> nodes;
52 
53 		VkDescriptorSet pool = nullptr;
54 		size_t poolSize = 0;
55 	};
56 
Cast(VkDescriptorPool object)57 	static inline DescriptorPool* Cast(VkDescriptorPool object)
58 	{
59 		return reinterpret_cast<DescriptorPool*>(object);
60 	}
61 
62 } // namespace vk
63 
64 #endif // VK_DESCRIPTOR_POOL_HPP_
65