]> git.tdb.fi Git - libs/gl.git/blobdiff - source/resourcemanager.h
Copy ProgramData::uniform_slots in copy constructor and operator=
[libs/gl.git] / source / resourcemanager.h
index 60f61a421fe4b2b54685a2366cd339e9bfa9be2d..a1ff7aee2fc32adda60d12b0a63166c635e81822 100644 (file)
@@ -11,6 +11,8 @@
 namespace Msp {
 namespace GL {
 
+class ResourceWatcher;
+
 class ResourceManager
 {
 public:
@@ -24,57 +26,71 @@ public:
 private:
        struct ManagedResource
        {
+               enum State
+               {
+                       NOT_LOADED,
+                       LOAD_QUEUED,
+                       LOADING,
+                       LOAD_FINISHED,
+                       LOADED
+               };
+
                Resource *resource;
                DataFile::Collection *collection;
                std::string name;
                IO::Seekable *io;
                Resource::AsyncLoader *loader;
-               bool loaded;
+               State state;
                unsigned last_used;
                UInt64 data_size;
+               std::vector<ResourceWatcher *> watchers;
 
                ManagedResource(Resource &);
 
                void start_loading();
+               bool process(bool);
+               void finish_loading(bool);
                void finish_loading();
                void unload();
+
+               void add_watcher(ResourceWatcher &);
+               void remove_watcher(ResourceWatcher &);
        };
 
+       typedef std::list<ManagedResource *> LoadQueue;
+
        class LoadingThread: public Thread
        {
-       public:
-               enum State
-               {
-                       IDLE,
-                       SYNC_PENDING,
-                       BUSY,
-                       LOAD_FINISHED,
-                       TERMINATING
-               };
-
        private:
-               ResourceManager &manager;
                Semaphore sem;
-               ManagedResource *volatile resource;
-               volatile State state;
+               Mutex queue_mutex;
+               LoadQueue async_queue;
+               LoadQueue sync_queue;
+               unsigned capacity;
+               unsigned size;
+               volatile bool done;
 
        public:
-               LoadingThread(ResourceManager &);
+               LoadingThread();
 
        private:
                virtual void main();
 
+               ManagedResource *front(LoadQueue &);
+
+       public:
+               void add_resource(ManagedResource &);
+               void remove_resource(ManagedResource &);
+       private:
+               bool try_remove_resource(ManagedResource &);
        public:
-               void set_resource(ManagedResource *);
-               ManagedResource *get_resource() const { return resource; }
-               void sync();
-               State get_state() const { return state; }
+               bool sync();
+               bool needs_work() const { return size<capacity; }
 
                void terminate();
        };
 
        typedef std::map<const Resource *, ManagedResource> ResourceMap;
-       typedef std::list<ManagedResource *> LoadQueue;
 
        LoadingPolicy policy;
        bool async_loads;
@@ -104,8 +120,19 @@ public:
        void resource_used(const Resource &);
        void remove_resource(Resource &);
 
+       void watch_resource(const Resource &, ResourceWatcher &);
+       void unwatch_resource(const Resource &, ResourceWatcher &);
+
        void tick();
+private:
+       void dispatch_work();
+       void unload_by_age();
+       void unload_by_size();
+public:
        UInt64 get_total_data_size() const;
+
+private:
+       static bool age_order(ManagedResource *, ManagedResource *);
 };
 
 } // namespace GL