#ifndef MSP_GL_RESOURCEMANAGER_H_
#define MSP_GL_RESOURCEMANAGER_H_
+#include <msp/core/inttypes.h>
#include <msp/core/mutex.h>
#include <msp/core/semaphore.h>
#include <msp/core/thread.h>
namespace Msp {
namespace GL {
+class ResourceWatcher;
+
class ResourceManager
{
public:
private:
struct ManagedResource
{
+ enum ResourceState
+ {
+ NOT_LOADED,
+ LOAD_QUEUED,
+ LOADING,
+ LOADED
+ };
+
Resource *resource;
DataFile::Collection *collection;
std::string name;
IO::Seekable *io;
Resource::AsyncLoader *loader;
+ ResourceState state;
+ unsigned last_used;
+ UInt64 data_size;
+ std::vector<ResourceWatcher *> watchers;
ManagedResource(Resource &);
+
+ void start_loading();
+ void finish_loading();
+ void unload();
+
+ void add_watcher(ResourceWatcher &);
+ void remove_watcher(ResourceWatcher &);
};
class LoadingThread: public Thread
bool async_loads;
ResourceMap resources;
LoadQueue queue;
+ UInt64 size_limit;
+ unsigned frame;
+ unsigned min_retain_frames;
+ unsigned max_retain_frames;
+ unsigned next_unload;
LoadingThread thread;
public:
void set_loading_policy(LoadingPolicy);
void set_async_loads(bool);
+ void set_size_limit(UInt64);
+ void set_min_retain_frames(unsigned);
+ void set_max_retain_frames(unsigned);
void add_resource(Resource &);
+ void *get_data_for_resource(const Resource &);
void set_resource_location(Resource &, DataFile::Collection &, const std::string &);
- void load_resource(const Resource &);
+ void load_resource(Resource &);
+ void resource_used(const Resource &);
void remove_resource(Resource &);
+ void watch_resource(const Resource &, ResourceWatcher &);
+ void unwatch_resource(const Resource &, ResourceWatcher &);
+
void tick();
+ UInt64 get_total_data_size() const;
};
} // namespace GL