[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53242] trunk/blender/intern/cycles: Cycles: merge some changes from a local branch to bring network rendering a bit

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Dec 21 12:13:50 CET 2012


Revision: 53242
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53242
Author:   blendix
Date:     2012-12-21 11:13:46 +0000 (Fri, 21 Dec 2012)
Log Message:
-----------
Cycles: merge some changes from a local branch to bring network rendering a bit
more up to date, still nowhere near working though, but might as well commit this
in case someone else is interested in working on it.

Modified Paths:
--------------
    trunk/blender/intern/cycles/CMakeLists.txt
    trunk/blender/intern/cycles/app/cycles_server.cpp
    trunk/blender/intern/cycles/blender/blender_sync.cpp
    trunk/blender/intern/cycles/device/device_network.cpp
    trunk/blender/intern/cycles/device/device_network.h

Modified: trunk/blender/intern/cycles/CMakeLists.txt
===================================================================
--- trunk/blender/intern/cycles/CMakeLists.txt	2012-12-21 10:27:35 UTC (rev 53241)
+++ trunk/blender/intern/cycles/CMakeLists.txt	2012-12-21 11:13:46 UTC (rev 53242)
@@ -68,7 +68,7 @@
 	add_subdirectory(blender)
 endif()
 
-if(WITH_CYCLES_TEST)
+if(WITH_CYCLES_TEST OR WITH_CYCLES_NETWORK)
 	add_subdirectory(app)
 endif()
 

Modified: trunk/blender/intern/cycles/app/cycles_server.cpp
===================================================================
--- trunk/blender/intern/cycles/app/cycles_server.cpp	2012-12-21 10:27:35 UTC (rev 53241)
+++ trunk/blender/intern/cycles/app/cycles_server.cpp	2012-12-21 11:13:46 UTC (rev 53242)
@@ -23,7 +23,9 @@
 #include "util_args.h"
 #include "util_foreach.h"
 #include "util_path.h"
+#include "util_stats.h"
 #include "util_string.h"
+#include "util_task.h"
 
 using namespace ccl;
 
@@ -32,29 +34,29 @@
 	path_init();
 
 	/* device types */
-	string devices = "";
+	string devicelist = "";
 	string devicename = "cpu";
 	bool list = false;
 
 	vector<DeviceType>& types = Device::available_types();
 
 	foreach(DeviceType type, types) {
-		if(devices != "")
-			devices += ", ";
+		if(devicelist != "")
+			devicelist += ", ";
 
-		devices += Device::string_from_type(type);
+		devicelist += Device::string_from_type(type);
 	}
 
 	/* parse options */
 	ArgParse ap;
 
 	ap.options ("Usage: cycles_server [options]",
-		"--device %s", &devicename, ("Devices to use: " + devices).c_str(),
+		"--device %s", &devicename, ("Devices to use: " + devicelist).c_str(),
 		"--list-devices", &list, "List information about all available devices",
 		NULL);
 
 	if(ap.parse(argc, argv) < 0) {
-		fprintf(stderr, "%s\n", ap.error_message().c_str());
+		fprintf(stderr, "%s\n", ap.geterror().c_str());
 		ap.usage();
 		exit(EXIT_FAILURE);
 	}
@@ -84,13 +86,18 @@
 		}
 	}
 
+	TaskScheduler::init();
+
 	while(1) {
-		Device *device = Device::create(device_info);
-		printf("Cycles Server with device: %s\n", device->description().c_str());
+		Stats stats;
+		Device *device = Device::create(device_info, stats);
+		printf("Cycles Server with device: %s\n", device->info.description.c_str());
 		device->server_run();
 		delete device;
 	}
 
+	TaskScheduler::exit();
+
 	return 0;
 }
 

Modified: trunk/blender/intern/cycles/blender/blender_sync.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_sync.cpp	2012-12-21 10:27:35 UTC (rev 53241)
+++ trunk/blender/intern/cycles/blender/blender_sync.cpp	2012-12-21 11:13:46 UTC (rev 53242)
@@ -331,7 +331,13 @@
 	/* device default CPU */
 	params.device = devices[0];
 
-	if(RNA_enum_get(&cscene, "device") != 0) {
+	if(RNA_enum_get(&cscene, "device") == 2) {
+		/* find network device */
+		foreach(DeviceInfo& info, devices)
+			if(info.type == DEVICE_NETWORK)
+				params.device = info;
+	}
+	else if(RNA_enum_get(&cscene, "device") == 1) {
 		/* find GPU device with given id */
 		PointerRNA systemptr = b_userpref.system().ptr;
 		PropertyRNA *deviceprop = RNA_struct_find_property(&systemptr, "compute_device");

Modified: trunk/blender/intern/cycles/device/device_network.cpp
===================================================================
--- trunk/blender/intern/cycles/device/device_network.cpp	2012-12-21 10:27:35 UTC (rev 53241)
+++ trunk/blender/intern/cycles/device/device_network.cpp	2012-12-21 11:13:46 UTC (rev 53242)
@@ -31,6 +31,8 @@
 public:
 	boost::asio::io_service io_service;
 	tcp::socket socket;
+	device_ptr mem_counter;
+	DeviceTask the_task; /* todo: handle multiple tasks */
 
 	NetworkDevice(Stats &stats, const char *address)
 	: Device(stats), socket(io_service)
@@ -49,75 +51,72 @@
 			socket.close();
 			socket.connect(*endpoint_iterator++, error);
 		}
+
 		if(error)
 			throw boost::system::system_error(error);
+
+		mem_counter = 0;
 	}
 
 	~NetworkDevice()
 	{
+		RPCSend snd(socket, "stop");
+		snd.write();
 	}
 
 	void mem_alloc(device_memory& mem, MemoryType type)
 	{
-#if 0
+		mem.device_pointer = ++mem_counter;
+
 		RPCSend snd(socket, "mem_alloc");
 
-		snd.archive & size & type;
+		snd.add(mem);
+		snd.add(type);
 		snd.write();
-
-		RPCReceive rcv(socket);
-
-		device_ptr mem;
-		*rcv.archive & mem;
-
-		return mem;
-#endif
 	}
 
 	void mem_copy_to(device_memory& mem)
 	{
-#if 0
 		RPCSend snd(socket, "mem_copy_to");
 
-		snd.archive & mem & size;
+		snd.add(mem);
 		snd.write();
-		snd.write_buffer(host, size);
-#endif
+		snd.write_buffer((void*)mem.data_pointer, mem.memory_size());
 	}
 
 	void mem_copy_from(device_memory& mem, int y, int w, int h, int elem)
 	{
-#if 0
 		RPCSend snd(socket, "mem_copy_from");
 
-		snd.archive & mem & offset & size;
+		snd.add(mem);
+		snd.add(y);
+		snd.add(w);
+		snd.add(h);
+		snd.add(elem);
 		snd.write();
 
 		RPCReceive rcv(socket);
-		rcv.read_buffer(host, size);
-#endif
+		rcv.read_buffer((void*)mem.data_pointer, mem.memory_size());
 	}
 
 	void mem_zero(device_memory& mem)
 	{
-#if 0
 		RPCSend snd(socket, "mem_zero");
 
-		snd.archive & mem & size;
+		snd.add(mem);
 		snd.write();
-#endif
 	}
 
 	void mem_free(device_memory& mem)
 	{
-#if 0
-		if(mem) {
+		if(mem.device_pointer) {
 			RPCSend snd(socket, "mem_free");
 
-			snd.archive & mem;
+			snd.add(mem);
 			snd.write();
+
+			mem.device_pointer = 0;
 		}
-#endif
 	}
 
 	void const_copy_to(const char *name, void *host, size_t size)
@@ -126,79 +125,107 @@
 
 		string name_string(name);
 
-		snd.archive & name_string & size;
+		snd.add(name_string);
+		snd.add(size);
 		snd.write();
 		snd.write_buffer(host, size);
 	}
 
 	void tex_alloc(const char *name, device_memory& mem, bool interpolation, bool periodic)
 	{
-#if 0
+		mem.device_pointer = ++mem_counter;
+
 		RPCSend snd(socket, "tex_alloc");
 
 		string name_string(name);
 
-		snd.archive & name_string & width & height & datatype & components & interpolation;
+		snd.add(name_string);
+		snd.add(mem);
+		snd.add(interpolation);
+		snd.add(periodic);
 		snd.write();
-
-		size_t size = width*height*components*datatype_size(datatype);
-		snd.write_buffer(host, size);
-
-		RPCReceive rcv(socket);
-
-		device_ptr mem;
-		*rcv.archive & mem;
-
-		return mem;
-#endif
+		snd.write_buffer((void*)mem.data_pointer, mem.memory_size());
 	}
 
 	void tex_free(device_memory& mem)
 	{
-#if 0
-		if(mem) {
+		if(mem.device_pointer) {
 			RPCSend snd(socket, "tex_free");
 
-			snd.archive & mem;
+			snd.add(mem);
 			snd.write();
+
+			mem.device_pointer = 0;
 		}
-#endif
 	}
 
-	void path_trace(int x, int y, int w, int h, device_ptr buffer, device_ptr rng_state, int sample)
+	void task_add(DeviceTask& task)
 	{
-#if 0
-		RPCSend snd(socket, "path_trace");
+		the_task = task;
 
-		snd.archive & x & y & w & h & buffer & rng_state & sample;
+		RPCSend snd(socket, "task_add");
+		snd.add(task);
 		snd.write();
-#endif
 	}
 
-	void tonemap(int x, int y, int w, int h, device_ptr rgba, device_ptr buffer, int sample, int resolution)
+	void task_wait()
 	{
-#if 0
-		RPCSend snd(socket, "tonemap");
-
-		snd.archive & x & y & w & h & rgba & buffer & sample & resolution;
+		RPCSend snd(socket, "task_wait");
 		snd.write();
-#endif
-	}
 
-	void task_add(DeviceTask& task)
-	{
-		if(task.type == DeviceTask::TONEMAP)
-			tonemap(task.x, task.y, task.w, task.h, task.rgba, task.buffer, task.sample, task.resolution);
-		else if(task.type == DeviceTask::PATH_TRACE)
-			path_trace(task.x, task.y, task.w, task.h, task.buffer, task.rng_state, task.sample);
+		list<RenderTile> the_tiles;
+
+		/* todo: run this threaded for connecting to multiple clients */
+		for(;;) {
+			RPCReceive rcv(socket);
+			RenderTile tile;
+
+			if(rcv.name == "acquire_tile") {
+				/* todo: watch out for recursive calls! */
+				if(the_task.acquire_tile(this, tile)) { /* write return as bool */
+					the_tiles.push_back(tile);
+
+					RPCSend snd(socket, "acquire_tile");
+					snd.add(tile);
+					snd.write();
+				}
+				else {
+					RPCSend snd(socket, "acquire_tile_none");
+					snd.write();
+				}
+			}
+			else if(rcv.name == "release_tile") {
+				rcv.read(tile);
+
+				for(list<RenderTile>::iterator it = the_tiles.begin(); it != the_tiles.end(); it++) {
+					if(tile.x == it->x && tile.y == it->y && tile.start_sample == it->start_sample) {
+						tile.buffers = it->buffers;
+						the_tiles.erase(it);
+						break;
+					}
+				}
+
+				assert(tile.buffers != NULL);
+
+				the_task.release_tile(tile);
+
+				RPCSend snd(socket, "release_tile");
+				snd.write();
+			}
+			else if(rcv.name == "task_wait_done")
+				break;
+		}
 	}
 
-	void task_wait()
+	void task_cancel()
 	{
+		RPCSend snd(socket, "task_cancel");
+		snd.write();
 	}
 
-	void task_cancel()
+	bool support_advanced_shading()
 	{
+		return true; /* todo: get this info from device */
 	}
 };
 
@@ -219,163 +246,304 @@
 	devices.push_back(info);
 }
 
-void Device::server_run()
-{
-	try
+class DeviceServer {
+public:
+	DeviceServer(Device *device_, tcp::socket& socket_)
+	: device(device_), socket(socket_)
 	{
-		/* starts thread that responds to discovery requests */
-		ServerDiscovery discovery;
+	}
 
-		for(;;)
-		{
+	void listen()
+	{
+		/* receive remote function calls */
+		for(;;) {
+			RPCReceive rcv(socket);
 
-			/* accept connection */
-			boost::asio::io_service io_service;
-			tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), SERVER_PORT));
+			if(rcv.name == "stop")
+				break;
 
-			tcp::socket socket(io_service);
-			acceptor.accept(socket);
+			process(rcv);
+		}
+	}
 
-			/* receive remote function calls */
-			for(;;) {
-				RPCReceive rcv(socket);
+protected:
+	void process(RPCReceive& rcv)
+	{
+		// fprintf(stderr, "receive process %s\n", rcv.name.c_str());
 
-				if(rcv.name == "description") {
-					string desc = description();
+		if(rcv.name == "mem_alloc") {
+			MemoryType type;
+			network_device_memory mem;
+			device_ptr remote_pointer;
 
-					RPCSend snd(socket);
-					snd.archive & desc;
-					snd.write();
-				}
-				else if(rcv.name == "mem_alloc") {
-#if 0
-					MemoryType type;
-					size_t size;
-					device_ptr mem;
+			rcv.read(mem);
+			rcv.read(type);
 
-					*rcv.archive & size & type;
-					mem = mem_alloc(size, type);
+			/* todo: CPU needs mem.data_pointer */
 
-					RPCSend snd(socket);
-					snd.archive & mem;
-					snd.write();
-#endif
-				}
-				else if(rcv.name == "mem_copy_to") {
-#if 0
-					device_ptr mem;
-					size_t size;
+			remote_pointer = mem.device_pointer;
 
-					*rcv.archive & mem & size;
+			mem_data[remote_pointer] = vector<uint8_t>();
+			mem_data[remote_pointer].resize(mem.memory_size());

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list