...
This commit is contained in:
55
include/opengl/resource_management/resource_manager.hpp
Normal file
55
include/opengl/resource_management/resource_manager.hpp
Normal file
@@ -0,0 +1,55 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user