2020-12-28 19:15:37 +04:00
|
|
|
// Copyright 2020 yuzu Emulator Project
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
#include "common/common_types.h"
|
|
|
|
|
|
|
|
namespace Vulkan {
|
|
|
|
|
|
|
|
class MasterSemaphore;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handles a pool of resources protected by fences. Manages resource overflow allocating more
|
|
|
|
* resources.
|
|
|
|
*/
|
|
|
|
class ResourcePool {
|
|
|
|
public:
|
2021-07-10 01:54:15 +04:00
|
|
|
explicit ResourcePool() = default;
|
2020-12-28 19:15:37 +04:00
|
|
|
explicit ResourcePool(MasterSemaphore& master_semaphore, size_t grow_step);
|
2021-07-10 01:54:15 +04:00
|
|
|
|
|
|
|
virtual ~ResourcePool() = default;
|
|
|
|
|
|
|
|
ResourcePool& operator=(ResourcePool&&) noexcept = default;
|
|
|
|
ResourcePool(ResourcePool&&) noexcept = default;
|
|
|
|
|
|
|
|
ResourcePool& operator=(const ResourcePool&) = default;
|
|
|
|
ResourcePool(const ResourcePool&) = default;
|
2020-12-28 19:15:37 +04:00
|
|
|
|
|
|
|
protected:
|
|
|
|
size_t CommitResource();
|
|
|
|
|
|
|
|
/// Called when a chunk of resources have to be allocated.
|
|
|
|
virtual void Allocate(size_t begin, size_t end) = 0;
|
|
|
|
|
|
|
|
private:
|
|
|
|
/// Manages pool overflow allocating new resources.
|
|
|
|
size_t ManageOverflow();
|
|
|
|
|
|
|
|
/// Allocates a new page of resources.
|
|
|
|
void Grow();
|
|
|
|
|
2021-07-10 01:54:15 +04:00
|
|
|
MasterSemaphore* master_semaphore{};
|
2020-12-28 19:15:37 +04:00
|
|
|
size_t grow_step = 0; ///< Number of new resources created after an overflow
|
2021-02-14 06:46:35 +04:00
|
|
|
size_t hint_iterator = 0; ///< Hint to where the next free resources is likely to be found
|
2020-12-28 19:15:37 +04:00
|
|
|
std::vector<u64> ticks; ///< Ticks for each resource
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace Vulkan
|