// Copyright 2018 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef VK_DESCRIPTOR_POOL_HPP_
#define VK_DESCRIPTOR_POOL_HPP_

#include "VkObject.hpp"
#include <set>

namespace vk {

class DescriptorPool : public Object<DescriptorPool, VkDescriptorPool>
{
public:
	DescriptorPool(const VkDescriptorPoolCreateInfo *pCreateInfo, void *mem);
	void destroy(const VkAllocationCallbacks *pAllocator);

	static size_t ComputeRequiredAllocationSize(const VkDescriptorPoolCreateInfo *pCreateInfo);

	VkResult allocateSets(uint32_t descriptorSetCount, const VkDescriptorSetLayout *pSetLayouts, VkDescriptorSet *pDescriptorSets);
	void freeSets(uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets);
	VkResult reset();

private:
	VkResult allocateSets(size_t *sizes, uint32_t numAllocs, VkDescriptorSet *pDescriptorSets);
	uint8_t *findAvailableMemory(size_t size);
	void freeSet(const VkDescriptorSet descriptorSet);
	size_t computeTotalFreeSize() const;

	struct Node
	{
		Node(uint8_t *set, size_t size)
		    : set(set)
		    , size(size)
		{}
		bool operator<(const Node &node) const { return set < node.set; }
		bool operator==(const uint8_t *other) const { return set == other; }

		uint8_t *set = nullptr;
		size_t size = 0;
	};
	std::set<Node> nodes;

	uint8_t *pool = nullptr;
	size_t poolSize = 0;
};

static inline DescriptorPool *Cast(VkDescriptorPool object)
{
	return DescriptorPool::Cast(object);
}

}  // namespace vk

#endif  // VK_DESCRIPTOR_POOL_HPP_
