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,20 @@
#pragma once
#include "GL/glew.h"
namespace zgl
{
class reference_counter
{
public:
using gl_id_type = GLuint;
virtual void add_reference(gl_id_type id) = 0;
virtual void remove_reference(gl_id_type id) = 0;
};
}

View File

@@ -0,0 +1,36 @@
#pragma once
#include "resource_manager.hpp"
namespace zgl
{
class resource_handle
{
public:
using id_type = reference_counter::gl_id_type;
resource_handle() = default;
inline resource_handle(id_type id, reference_counter* manager);
resource_handle(const resource_handle& other) = delete;
resource_handle& operator=(const resource_handle& other) = delete;
inline resource_handle(resource_handle&& other) noexcept;
inline resource_handle& operator=(resource_handle&& other) noexcept;
inline ~resource_handle();
protected:
id_type m_id{ 0 };
private:
reference_counter* m_counter{ nullptr };
};
}
#define INCLUDE_RESOURCE_HANDLE_IMPLEMENTATION
#include "opengl/resource_management/resource_handle.ipp"
#undef INCLUDE_RESOURCE_HANDLE_IMPLEMENTATION

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