blob: 0fcc84ab1969bacef92dbb8cea4da4cf6a85e848 [file] [log] [blame]
// Copyright 2019 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#ifndef IREE_HAL_VULKAN_DESCRIPTOR_POOL_CACHE_H_
#define IREE_HAL_VULKAN_DESCRIPTOR_POOL_CACHE_H_
#include <type_traits>
#include <utility>
#include <vector>
#include "iree/base/api.h"
#include "iree/hal/vulkan/dynamic_symbols.h"
#include "iree/hal/vulkan/handle_util.h"
#include "iree/hal/vulkan/util/ref_ptr.h"
namespace iree {
namespace hal {
namespace vulkan {
class DescriptorPoolCache;
// A descriptor pool with a single descriptor type of some number.
// We only support a single descriptor type for now as we only generate SPIR-V
// that uses a single type.
struct DescriptorPool {
// Type of the descriptor in the set.
VkDescriptorType descriptor_type = VK_DESCRIPTOR_TYPE_MAX_ENUM;
// Maximum number of descriptors of the given type per allocation.
int max_descriptor_count = 0;
// Pool handle.
VkDescriptorPool handle = VK_NULL_HANDLE;
};
// A group of descriptor sets allocated and released together.
// The group must be explicitly reset with Reset() prior to disposing.
class DescriptorSetGroup final {
public:
DescriptorSetGroup() = default;
DescriptorSetGroup(DescriptorPoolCache* descriptor_pool_cache,
std::vector<DescriptorPool> descriptor_pools)
: descriptor_pool_cache_(descriptor_pool_cache),
descriptor_pools_(std::move(descriptor_pools)) {}
DescriptorSetGroup(const DescriptorSetGroup&) = delete;
DescriptorSetGroup& operator=(const DescriptorSetGroup&) = delete;
DescriptorSetGroup(DescriptorSetGroup&& other) noexcept
: descriptor_pool_cache_(std::move(other.descriptor_pool_cache_)),
descriptor_pools_(std::move(other.descriptor_pools_)) {}
DescriptorSetGroup& operator=(DescriptorSetGroup&& other) {
std::swap(descriptor_pool_cache_, other.descriptor_pool_cache_);
std::swap(descriptor_pools_, other.descriptor_pools_);
return *this;
}
~DescriptorSetGroup();
iree_status_t Reset();
private:
DescriptorPoolCache* descriptor_pool_cache_;
std::vector<DescriptorPool> descriptor_pools_;
};
// A "cache" (or really, pool) of descriptor pools. These pools are allocated
// as needed to satisfy different descriptor size requirements and are given
// to command buffers during recording to write descriptor updates and bind
// resources. After the descriptors in the pool are no longer used (all
// command buffers using descriptor sets allocated from the pool have retired)
// the pool is returned here to be reused in the future.
class DescriptorPoolCache final {
public:
explicit DescriptorPoolCache(VkDeviceHandle* logical_device);
VkDeviceHandle* logical_device() const { return logical_device_; }
const DynamicSymbols& syms() const { return *logical_device_->syms(); }
// Acquires a new descriptor pool for use by the caller.
// The pool will have been reset and have all descriptor sets available.
// When all sets allocated from the pool are no longer in use it must be
// returned to the cache with ReleaseDescriptorPool.
iree_status_t AcquireDescriptorPool(VkDescriptorType descriptor_type,
int max_descriptor_count,
DescriptorPool* out_descriptor_pool);
// Releases descriptor pools back to the cache. The pools will be reset
// immediately and must no longer be in use by any in-flight command.
iree_status_t ReleaseDescriptorPools(
const std::vector<DescriptorPool>& descriptor_pools);
private:
VkDeviceHandle* logical_device_;
};
} // namespace vulkan
} // namespace hal
} // namespace iree
#endif // IREE_HAL_VULKAN_DESCRIPTOR_POOL_CACHE_H_