Daniele Bartolini 10 years ago
parent
commit
6eb5566e2c

+ 4 - 4
src/device.cpp

@@ -58,6 +58,7 @@ Device::Device(DeviceOptions& opts)
 	, _boot_script_id(uint64_t(0))
 	, _boot_package(NULL)
 	, _lua_environment(NULL)
+	, _resource_loader(NULL)
 	, _resource_manager(NULL)
 	, _input_manager(NULL)
 	, _worlds(default_allocator())
@@ -82,9 +83,8 @@ void Device::init()
 	physics_globals::init();
 	bgfx::init();
 
-	// Create resource manager
-	CE_LOGD("Creating resource manager...");
-	_resource_manager = CE_NEW(_allocator, ResourceManager)(*_bundle_filesystem);
+	_resource_loader = CE_NEW(_allocator, ResourceLoader)(*_bundle_filesystem);
+	_resource_manager = CE_NEW(_allocator, ResourceManager)(*_resource_loader);
 
 	CE_LOGD("Creating material manager...");
 	material_manager::init();
@@ -128,8 +128,8 @@ void Device::shutdown()
 	debug_line::shutdown();
 	material_manager::shutdown();
 
-	CE_LOGD("Releasing resource manager...");
 	CE_DELETE(_allocator, _resource_manager);
+	CE_DELETE(_allocator, _resource_loader);
 
 	bgfx::shutdown();
 	physics_globals::shutdown();

+ 1 - 0
src/device.h

@@ -139,6 +139,7 @@ private:
 	ResourcePackage* _boot_package;
 
 	LuaEnvironment* _lua_environment;
+	ResourceLoader* _resource_loader;
 	ResourceManager* _resource_manager;
 	InputManager* _input_manager;
 

+ 5 - 11
src/resource/resource_loader.cpp

@@ -15,9 +15,8 @@
 namespace crown
 {
 
-ResourceLoader::ResourceLoader(Filesystem& fs, Allocator& resource_heap)
+ResourceLoader::ResourceLoader(Filesystem& fs)
 	: _fs(fs)
-	, _resource_heap(resource_heap)
 	, _requests(default_allocator())
 	, _loaded(default_allocator())
 	, _exit(false)
@@ -31,9 +30,10 @@ ResourceLoader::~ResourceLoader()
 	_thread.stop();
 }
 
-void ResourceLoader::load(StringId64 type, StringId64 name)
+void ResourceLoader::add_request(StringId64 type, StringId64 name, Allocator& a)
 {
-	add_request(type, name);
+	ScopedMutex sm(_mutex);
+	queue::push_back(_requests, make_request(type, name, a));
 }
 
 void ResourceLoader::flush()
@@ -41,12 +41,6 @@ void ResourceLoader::flush()
 	while (num_requests()) {}
 }
 
-void ResourceLoader::add_request(StringId64 type, StringId64 name)
-{
-	ScopedMutex sm(_mutex);
-	queue::push_back(_requests, make_request(type, name));
-}
-
 uint32_t ResourceLoader::num_requests()
 {
 	ScopedMutex sm(_mutex);
@@ -97,7 +91,7 @@ int32_t ResourceLoader::run()
 		path::join(CROWN_DATA_DIRECTORY, name, path);
 
 		File* file = _fs.open(path.c_str(), FOM_READ);
-		rd.data = resource_on_load(id.type, *file, _resource_heap);
+		rd.data = resource_on_load(id.type, *file, *id.allocator);
 		_fs.close(file);
 
 		add_loaded(rd);

+ 12 - 13
src/resource/resource_loader.h

@@ -10,7 +10,6 @@
 #include "thread.h"
 #include "container_types.h"
 #include "mutex.h"
-#include "memory_types.h"
 #include "string_id.h"
 
 namespace crown
@@ -30,22 +29,20 @@ class ResourceLoader
 {
 public:
 
-	/// Reads the resources data from the given @a fs using
-	/// @a resource_heap to allocate memory for them.
-	ResourceLoader(Filesystem& fs, Allocator& resource_heap);
+	ResourceLoader(Filesystem& fs);
 	~ResourceLoader();
 
-	/// Loads the @a resource in a background thread.
-	void load(StringId64 type, StringId64 name);
+	/// Adds a request for loading the resource @a type @a name.
+	void add_request(StringId64 type, StringId64 name, Allocator& a);
 
 	/// Blocks until all pending requests have been processed.
 	void flush();
 
+	/// Returns all the resources that have been loaded.
 	void get_loaded(Array<ResourceData>& loaded);
 
 private:
 
-	void add_request(StringId64 type, StringId64 name);
 	uint32_t num_requests();
 	void add_loaded(ResourceData data);
 
@@ -54,8 +51,7 @@ private:
 
 	static int32_t thread_proc(void* thiz)
 	{
-		ResourceLoader* rl = (ResourceLoader*)thiz;
-		return rl->run();
+		return ((ResourceLoader*)thiz)->run();
 	}
 
 private:
@@ -64,17 +60,20 @@ private:
 	{
 		StringId64 type;
 		StringId64 name;
+		Allocator* allocator;
 	};
 
-	ResourceRequest make_request(StringId64 type, StringId64 name)
+	ResourceRequest make_request(StringId64 type, StringId64 name, Allocator& a)
 	{
-		ResourceRequest request = { type, name };
-		return request;
+		ResourceRequest rr;
+		rr.type = type;
+		rr.name = name;
+		rr.allocator = &a;
+		return rr;
 	}
 
 	Thread _thread;
 	Filesystem& _fs;
-	Allocator& _resource_heap;
 
 	Queue<ResourceRequest> _requests;
 	Queue<ResourceData> _loaded;

+ 5 - 5
src/resource/resource_manager.cpp

@@ -14,9 +14,9 @@ namespace crown
 
 const ResourceManager::ResourceEntry ResourceManager::ResourceEntry::NOT_FOUND = { 0xffffffffu, NULL };
 
-ResourceManager::ResourceManager(Filesystem& fs)
+ResourceManager::ResourceManager(ResourceLoader& rl)
 	: _resource_heap("resource", default_allocator())
-	, _loader(fs, _resource_heap)
+	, _loader(&rl)
 	, _rm(default_allocator())
 	, _autoload(false)
 {
@@ -41,7 +41,7 @@ void ResourceManager::load(StringId64 type, StringId64 name)
 
 	if (entry == ResourceEntry::NOT_FOUND)
 	{
-		_loader.load(type, name);
+		_loader->add_request(type, name, _resource_heap);
 		return;
 	}
 
@@ -111,7 +111,7 @@ void ResourceManager::enable_autoload(bool enable)
 
 void ResourceManager::flush()
 {
-	_loader.flush();
+	_loader->flush();
 	complete_requests();
 }
 
@@ -119,7 +119,7 @@ void ResourceManager::complete_requests()
 {
 	TempAllocator1024 ta;
 	Array<ResourceData> loaded(ta);
-	_loader.get_loaded(loaded);
+	_loader->get_loaded(loaded);
 
 	for (uint32_t i = 0; i < array::size(loaded); i++)
 		complete_request(loaded[i].type, loaded[i].name, loaded[i].data);

+ 2 - 2
src/resource/resource_manager.h

@@ -24,7 +24,7 @@ class ResourceManager
 public:
 
 	/// The resources will be loaded from @a fs.
-	ResourceManager(Filesystem& fs);
+	ResourceManager(ResourceLoader& rl);
 	~ResourceManager();
 
 	/// Loads the resource (@a type, @a name).
@@ -92,7 +92,7 @@ private:
 	typedef SortMap<ResourcePair, ResourceEntry> ResourceMap;
 
 	ProxyAllocator _resource_heap;
-	ResourceLoader _loader;
+	ResourceLoader* _loader;
 	ResourceMap _rm;
 	bool _autoload;
 };

+ 1 - 0
src/resource/resource_types.h

@@ -53,6 +53,7 @@
 namespace crown
 {
 	class ResourceManager;
+	class ResourceLoader;
 	struct ResourcePackage;
 
 	struct FontResource;