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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to