68 lines
1.8 KiB
C++
68 lines
1.8 KiB
C++
// 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"
|
|
#include "video_core/renderer_vulkan/vk_common.h"
|
|
|
|
namespace Vulkan {
|
|
|
|
class Instance;
|
|
class MasterSemaphore;
|
|
|
|
/**
|
|
* Handles a pool of resources protected by fences. Manages resource overflow allocating more
|
|
* resources.
|
|
*/
|
|
class ResourcePool {
|
|
public:
|
|
explicit ResourcePool() = default;
|
|
explicit ResourcePool(MasterSemaphore* master_semaphore, std::size_t grow_step);
|
|
virtual ~ResourcePool() = default;
|
|
|
|
ResourcePool& operator=(ResourcePool&&) noexcept = default;
|
|
ResourcePool(ResourcePool&&) noexcept = default;
|
|
|
|
ResourcePool& operator=(const ResourcePool&) = default;
|
|
ResourcePool(const ResourcePool&) = default;
|
|
|
|
protected:
|
|
std::size_t CommitResource();
|
|
|
|
/// Called when a chunk of resources have to be allocated.
|
|
virtual void Allocate(std::size_t begin, std::size_t end) = 0;
|
|
|
|
private:
|
|
/// Manages pool overflow allocating new resources.
|
|
std::size_t ManageOverflow();
|
|
|
|
/// Allocates a new page of resources.
|
|
void Grow();
|
|
|
|
protected:
|
|
MasterSemaphore* master_semaphore{nullptr};
|
|
std::size_t grow_step = 0; ///< Number of new resources created after an overflow
|
|
std::size_t hint_iterator = 0; ///< Hint to where the next free resources is likely to be found
|
|
std::vector<u64> ticks; ///< Ticks for each resource
|
|
};
|
|
|
|
class CommandPool final : public ResourcePool {
|
|
public:
|
|
explicit CommandPool(const Instance& instance, MasterSemaphore* master_semaphore);
|
|
~CommandPool() override;
|
|
|
|
void Allocate(std::size_t begin, std::size_t end) override;
|
|
|
|
vk::CommandBuffer Commit();
|
|
|
|
private:
|
|
struct Pool;
|
|
const Instance& instance;
|
|
std::vector<Pool> pools;
|
|
};
|
|
|
|
} // namespace Vulkan
|