2
0
Daniele Bartolini 10 жил өмнө
parent
commit
3f9cddc294

+ 15 - 16
src/resource/resource_loader.cpp

@@ -30,10 +30,10 @@ ResourceLoader::~ResourceLoader()
 	_thread.stop();
 }
 
-void ResourceLoader::add_request(StringId64 type, StringId64 name, Allocator& a)
+void ResourceLoader::add_request(const ResourceRequest& rr)
 {
 	ScopedMutex sm(_mutex);
-	queue::push_back(_requests, make_request(type, name, a));
+	queue::push_back(_requests, rr);
 }
 
 void ResourceLoader::flush()
@@ -47,17 +47,20 @@ uint32_t ResourceLoader::num_requests()
 	return queue::size(_requests);
 }
 
-void ResourceLoader::add_loaded(ResourceData data)
+void ResourceLoader::add_loaded(ResourceRequest rr)
 {
 	ScopedMutex sm(_loaded_mutex);
-	queue::push_back(_loaded, data);
+	queue::push_back(_loaded, rr);
 }
 
-void ResourceLoader::get_loaded(Array<ResourceData>& loaded)
+void ResourceLoader::get_loaded(Array<ResourceRequest>& loaded)
 {
 	ScopedMutex sm(_loaded_mutex);
-	uint32_t num = queue::size(_loaded);
-	for (uint32_t i = 0; i < num; i++)
+
+	const uint32_t num = queue::size(_loaded);
+	array::reserve(loaded, num);
+
+	for (uint32_t i = 0; i < num; ++i)
 	{
 		array::push_back(loaded, queue::front(_loaded));
 		queue::pop_front(_loaded);
@@ -74,27 +77,23 @@ int32_t ResourceLoader::run()
 			_mutex.unlock();
 			continue;
 		}
-		ResourceRequest id = queue::front(_requests);
+		ResourceRequest rr = queue::front(_requests);
 		_mutex.unlock();
 
-		ResourceData rd;
-		rd.type = id.type;
-		rd.name = id.name;
-
 		char name[1 + 2*StringId64::STRING_LENGTH];
-		id.type.to_string(name);
+		rr.type.to_string(name);
 		name[16] = '-';
-		id.name.to_string(name + 17);
+		rr.name.to_string(name + 17);
 
 		TempAllocator256 alloc;
 		DynamicString path(alloc);
 		path::join(CROWN_DATA_DIRECTORY, name, path);
 
 		File* file = _fs.open(path.c_str(), FOM_READ);
-		rd.data = resource_on_load(id.type, *file, *id.allocator);
+		rr.data = resource_on_load(rr.type, *file, *rr.allocator);
 		_fs.close(file);
 
-		add_loaded(rd);
+		add_loaded(rr);
 		_mutex.lock();
 		queue::pop_front(_requests);
 		_mutex.unlock();

+ 8 - 22
src/resource/resource_loader.h

@@ -15,10 +15,11 @@
 namespace crown
 {
 
-struct ResourceData
+struct ResourceRequest
 {
 	StringId64 type;
 	StringId64 name;
+	Allocator* allocator;
 	void* data;
 };
 
@@ -29,22 +30,23 @@ class ResourceLoader
 {
 public:
 
+	/// Read resources from @a fs.
 	ResourceLoader(Filesystem& fs);
 	~ResourceLoader();
 
-	/// Adds a request for loading the resource @a type @a name.
-	void add_request(StringId64 type, StringId64 name, Allocator& a);
+	/// Adds a request for loading the resource described by @a rr.
+	void add_request(const ResourceRequest& rr);
 
 	/// Blocks until all pending requests have been processed.
 	void flush();
 
 	/// Returns all the resources that have been loaded.
-	void get_loaded(Array<ResourceData>& loaded);
+	void get_loaded(Array<ResourceRequest>& loaded);
 
 private:
 
 	uint32_t num_requests();
-	void add_loaded(ResourceData data);
+	void add_loaded(ResourceRequest rr);
 
 	// Loads resources in the loading queue.
 	int32_t run();
@@ -56,27 +58,11 @@ private:
 
 private:
 
-	struct ResourceRequest
-	{
-		StringId64 type;
-		StringId64 name;
-		Allocator* allocator;
-	};
-
-	ResourceRequest make_request(StringId64 type, StringId64 name, Allocator& a)
-	{
-		ResourceRequest rr;
-		rr.type = type;
-		rr.name = name;
-		rr.allocator = &a;
-		return rr;
-	}
-
 	Thread _thread;
 	Filesystem& _fs;
 
 	Queue<ResourceRequest> _requests;
-	Queue<ResourceData> _loaded;
+	Queue<ResourceRequest> _loaded;
 	Mutex _mutex;
 	Mutex _loaded_mutex;
 	bool _exit;

+ 9 - 3
src/resource/resource_manager.cpp

@@ -42,7 +42,13 @@ void ResourceManager::load(StringId64 type, StringId64 name)
 
 	if (entry == ResourceEntry::NOT_FOUND)
 	{
-		_loader->add_request(type, name, _resource_heap);
+		ResourceRequest rr;
+		rr.type = type;
+		rr.name = name;
+		rr.allocator = &_resource_heap;
+		rr.data = NULL;
+
+		_loader->add_request(rr);
 		return;
 	}
 
@@ -119,10 +125,10 @@ void ResourceManager::flush()
 void ResourceManager::complete_requests()
 {
 	TempAllocator1024 ta;
-	Array<ResourceData> loaded(ta);
+	Array<ResourceRequest> loaded(ta);
 	_loader->get_loaded(loaded);
 
-	for (uint32_t i = 0; i < array::size(loaded); i++)
+	for (uint32_t i = 0; i < array::size(loaded); ++i)
 		complete_request(loaded[i].type, loaded[i].name, loaded[i].data);
 }
 

+ 1 - 1
src/resource/resource_manager.h

@@ -23,7 +23,7 @@ class ResourceManager
 {
 public:
 
-	/// The resources will be loaded from @a fs.
+	/// Uses @a rl to load resources.
 	ResourceManager(ResourceLoader& rl);
 	~ResourceManager();