56 lines
1.4 KiB
C++
56 lines
1.4 KiB
C++
#pragma once
|
|
|
|
#include <mutex>
|
|
#include <shared_mutex>
|
|
#include <vector>
|
|
#include <unordered_map>
|
|
#include <unordered_set>
|
|
|
|
#include "opengl/resource_management/reference_counter.hpp"
|
|
namespace zgl
|
|
{
|
|
|
|
|
|
template<typename StoreID, typename MetaData>
|
|
class resource_manager : public reference_counter
|
|
{
|
|
public:
|
|
using gl_id_type = GLuint;
|
|
using size_type = std::uint64_t;
|
|
using resource_entry_type = std::pair<gl_id_type, MetaData>;
|
|
|
|
friend class resource_handle;
|
|
|
|
bool has_resource(StoreID store_id);
|
|
|
|
std::optional<std::pair<resource_handle, MetaData>> get_resource(StoreID store_id);
|
|
|
|
void collect_garbage();
|
|
|
|
void add_resource(StoreID store_id, gl_id_type gl_id, MetaData meta);
|
|
|
|
[[nodiscard]] size_type count_garbage();
|
|
|
|
void extract_garbage(std::vector<gl_id_type>& dst);
|
|
|
|
void add_reference(gl_id_type id) override;
|
|
|
|
void remove_reference(gl_id_type id) override;
|
|
|
|
private:
|
|
static constexpr size_type unused_resource_flag = size_type{ 1 } << (sizeof(size_type) * 8 - 1);
|
|
|
|
size_type max_unused_collection_cycle_count;
|
|
|
|
std::shared_mutex m_lock;
|
|
std::unordered_map<StoreID, resource_entry_type> m_resource_lookup;
|
|
std::unordered_map<gl_id_type, size_type> m_reference_counters;
|
|
std::unordered_set<gl_id_type> m_unused_handles;
|
|
};
|
|
|
|
}
|
|
|
|
#define INCLUDE_RESOURCE_MANAGER_IMPLEMENTATION
|
|
#include "opengl/resource_management/resource_manager.ipp"
|
|
#undef INCLUDE_RESOURCE_MANAGER_IMPLEMENTATION
|