This commit is contained in:
ZY4N
2025-03-23 21:11:22 +01:00
parent 510398423a
commit c609d49f0d
49 changed files with 1412 additions and 924 deletions

View 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