...
This commit is contained in:
20
include/opengl/resource_management/reference_counter.hpp
Normal file
20
include/opengl/resource_management/reference_counter.hpp
Normal 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;
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
36
include/opengl/resource_management/resource_handle.hpp
Normal file
36
include/opengl/resource_management/resource_handle.hpp
Normal 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
|
||||
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