[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