24 #if defined(WITH_NETWORK)
28 typedef map<device_ptr, device_ptr> PtrMap;
30 typedef map<device_ptr, DataVector> DataMap;
36 static TileList::iterator tile_list_find(TileList &tile_list,
RenderTile &tile)
38 for (TileList::iterator it = tile_list.begin(); it != tile_list.end(); ++it)
39 if (tile.
x == it->x && tile.
y == it->y && tile.
start_sample == it->start_sample)
41 return tile_list.end();
44 class NetworkDevice :
public Device {
46 boost::asio::io_service io_service;
59 :
Device(info, stats, profiler, true), socket(io_service)
61 error_func = NetworkError();
63 portstr << SERVER_PORT;
65 tcp::resolver resolver(io_service);
67 tcp::resolver::iterator endpoint_iterator = resolver.resolve(
query);
68 tcp::resolver::iterator end;
70 boost::system::error_code
error = boost::asio::error::host_not_found;
71 while (
error && endpoint_iterator != end) {
73 socket.connect(*endpoint_iterator++,
error);
77 error_func.network_error(
error.message());
84 RPCSend snd(socket, &error_func,
"stop");
96 VLOG(1) <<
"Buffer allocate: " << mem.
name <<
", "
105 RPCSend snd(socket, &error_func,
"mem_alloc");
114 RPCSend snd(socket, &error_func,
"mem_copy_to");
127 RPCSend snd(socket, &error_func,
"mem_copy_from");
136 RPCReceive rcv(socket, &error_func);
144 RPCSend snd(socket, &error_func,
"mem_zero");
155 RPCSend snd(socket, &error_func,
"mem_free");
168 RPCSend snd(socket, &error_func,
"const_copy_to");
170 string name_string(name);
172 snd.add(name_string);
175 snd.write_buffer(host,
size);
180 if (error_func.have_error())
185 RPCSend snd(socket, &error_func,
"load_kernels");
187 snd.add(requested_features.max_closure);
193 RPCReceive rcv(socket, &error_func);
205 RPCSend snd(socket, &error_func,
"task_add");
214 RPCSend snd(socket, &error_func,
"task_wait");
223 if (error_func.have_error())
229 RPCReceive rcv(socket, &error_func);
231 if (rcv.name ==
"acquire_tile") {
236 the_tiles.push_back(tile);
239 RPCSend snd(socket, &error_func,
"acquire_tile");
246 RPCSend snd(socket, &error_func,
"acquire_tile_none");
251 else if (rcv.name ==
"release_tile") {
255 TileList::iterator it = tile_list_find(the_tiles, tile);
256 if (it != the_tiles.end()) {
266 RPCSend snd(socket, &error_func,
"release_tile");
270 else if (rcv.name ==
"task_wait_done") {
282 RPCSend snd(socket, &error_func,
"task_cancel");
292 NetworkError error_func;
300 return new NetworkDevice(info, stats, profiler, address);
325 void network_error(
const string &message)
327 error_func.network_error(message);
332 return error_func.have_error();
335 DeviceServer(
Device *device_, tcp::socket &socket_)
336 : device(device_), socket(socket_), stop(false), blocked_waiting(false)
338 error_func = NetworkError();
356 RPCReceive rcv(socket, &error_func);
358 if (rcv.name ==
"stop")
365 DataVector &data_vector_insert(
device_ptr client_pointer,
size_t data_size)
368 pair<DataMap::iterator, bool> data_ins = mem_data.insert(
369 DataMap::value_type(client_pointer, DataVector()));
372 assert(data_ins.second);
375 DataVector &data_v = data_ins.first->second;
378 data_v.resize(data_size);
383 DataVector &data_vector_find(
device_ptr client_pointer)
385 DataMap::iterator i = mem_data.find(client_pointer);
386 assert(i != mem_data.end());
393 pair<PtrMap::iterator, bool> mapins;
396 mapins = ptr_map.insert(PtrMap::value_type(client_pointer, real_pointer));
397 assert(mapins.second);
400 mapins = ptr_imap.insert(PtrMap::value_type(real_pointer, client_pointer));
401 assert(mapins.second);
406 PtrMap::iterator i = ptr_map.find(client_pointer);
407 assert(i != ptr_map.end());
413 PtrMap::iterator i = ptr_map.find(client_pointer);
414 assert(i != ptr_map.end());
422 PtrMap::iterator irev = ptr_imap.find(
result);
423 assert(irev != ptr_imap.end());
424 ptr_imap.erase(irev);
427 DataMap::iterator idata = mem_data.find(client_pointer);
428 assert(idata != mem_data.end());
429 mem_data.erase(idata);
441 if (rcv.name ==
"mem_alloc") {
443 network_device_memory mem(device);
451 DataVector &data_v = data_vector_insert(client_pointer, data_size);
452 mem.
host_pointer = (data_size) ? (
void *)&(data_v[0]) : 0;
455 device->mem_alloc(mem);
460 else if (rcv.name ==
"mem_copy_to") {
462 network_device_memory mem(device);
469 if (client_pointer) {
471 DataVector &data_v = data_vector_find(client_pointer);
475 mem.
device_pointer = device_ptr_from_client_pointer(client_pointer);
479 DataVector &data_v = data_vector_insert(client_pointer, data_size);
480 mem.
host_pointer = (data_size) ? (
void *)&(data_v[0]) : 0;
487 device->mem_copy_to(mem);
489 if (!client_pointer) {
494 else if (rcv.name ==
"mem_copy_from") {
496 network_device_memory mem(device);
506 mem.
device_pointer = device_ptr_from_client_pointer(client_pointer);
508 DataVector &data_v = data_vector_find(client_pointer);
512 device->mem_copy_from(mem,
y,
w, h, elem);
516 RPCSend snd(socket, &error_func,
"mem_copy_from");
521 else if (rcv.name ==
"mem_zero") {
523 network_device_memory mem(device);
530 if (client_pointer) {
532 DataVector &data_v = data_vector_find(client_pointer);
536 mem.
device_pointer = device_ptr_from_client_pointer(client_pointer);
540 DataVector &data_v = data_vector_insert(client_pointer, data_size);
545 device->mem_zero(mem);
547 if (!client_pointer) {
552 else if (rcv.name ==
"mem_free") {
554 network_device_memory mem(device);
561 mem.
device_pointer = device_ptr_from_client_pointer_erase(client_pointer);
563 device->mem_free(mem);
565 else if (rcv.name ==
"const_copy_to") {
569 rcv.read(name_string);
573 rcv.read_buffer(&host_vector[0],
size);
576 device->const_copy_to(name_string.c_str(), &host_vector[0],
size);
578 else if (rcv.name ==
"load_kernels") {
581 rcv.read(requested_features.max_closure);
586 result = device->load_kernels(requested_features);
587 RPCSend snd(socket, &error_func,
"load_kernels");
592 else if (rcv.name ==
"task_add") {
599 task.buffer = device_ptr_from_client_pointer(
task.buffer);
602 task.rgba_half = device_ptr_from_client_pointer(
task.rgba_half);
605 task.rgba_byte = device_ptr_from_client_pointer(
task.rgba_byte);
607 if (
task.shader_input)
608 task.shader_input = device_ptr_from_client_pointer(
task.shader_input);
610 if (
task.shader_output)
611 task.shader_output = device_ptr_from_client_pointer(
task.shader_output);
613 task.acquire_tile =
function_bind(&DeviceServer::task_acquire_tile,
this, _1, _2);
615 task.update_progress_sample =
function_bind(&DeviceServer::task_update_progress_sample,
617 task.update_tile_sample =
function_bind(&DeviceServer::task_update_tile_sample,
this, _1);
620 device->task_add(
task);
622 else if (rcv.name ==
"task_wait") {
625 blocked_waiting =
true;
627 blocked_waiting =
false;
630 RPCSend snd(socket, &error_func,
"task_wait_done");
634 else if (rcv.name ==
"task_cancel") {
636 device->task_cancel();
638 else if (rcv.name ==
"acquire_tile") {
640 entry.name = rcv.name;
641 rcv.read(entry.tile);
642 acquire_queue.push_back(entry);
645 else if (rcv.name ==
"acquire_tile_none") {
647 entry.name = rcv.name;
648 acquire_queue.push_back(entry);
651 else if (rcv.name ==
"release_tile") {
653 entry.name = rcv.name;
654 acquire_queue.push_back(entry);
658 cout <<
"Error: unexpected RPC receive call \"" + rcv.name +
"\"\n";
669 RPCSend snd(socket, &error_func,
"acquire_tile");
679 if (!acquire_queue.empty()) {
680 AcquireEntry entry = acquire_queue.front();
681 acquire_queue.pop_front();
683 if (entry.name ==
"acquire_tile") {
692 else if (entry.name ==
"acquire_tile_none") {
696 cout <<
"Error: unexpected acquire RPC receive call \"" + entry.name +
"\"\n";
699 }
while (acquire_queue.empty() && !stop && !have_error());
704 void task_update_progress_sample()
723 RPCSend snd(socket, &error_func,
"release_tile");
736 if (!acquire_queue.empty()) {
737 AcquireEntry entry = acquire_queue.front();
738 acquire_queue.pop_front();
740 if (entry.name ==
"release_tile") {
745 cout <<
"Error: unexpected release RPC receive call \"" + entry.name +
"\"\n";
748 }
while (acquire_queue.empty() && !stop);
751 bool task_get_cancel()
765 struct AcquireEntry {
771 list<AcquireEntry> acquire_queue;
774 bool blocked_waiting;
777 NetworkError error_func;
782 void Device::server_run()
786 ServerDiscovery discovery;
790 boost::asio::io_service io_service;
791 tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), SERVER_PORT));
793 tcp::socket socket(io_service);
794 acceptor.accept(socket);
796 string remote_address = socket.remote_endpoint().address().to_string();
797 printf(
"Connected to remote client at: %s\n", remote_address.c_str());
802 printf(
"Disconnected.\n");
805 catch (exception &
e) {
806 fprintf(stderr,
"Network server exception: %s\n",
e.what());
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum query
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void process(btMatrix3x3 &B, btMatrix3x3 &U, btVector3 &sigma, btMatrix3x3 &V)
Helper function of 3X3 SVD for processing 2X2 SVD.
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
DenoiserTypeMask denoisers
bool has_adaptive_stop_per_sample
bool has_volume_decoupled
function< void(RenderTile &)> release_tile
function< bool(Device *device, RenderTile &, uint)> acquire_tile
virtual BVHLayoutMask get_bvh_layout_mask() const =0
virtual void const_copy_to(const char *name, void *host, size_t size)=0
virtual void mem_zero(device_memory &mem)=0
virtual void task_wait()=0
virtual void mem_copy_from(device_memory &mem, int y, int w, int h, int elem)=0
virtual void task_cancel()=0
virtual int get_split_task_count(DeviceTask &)
virtual void mem_free(device_memory &mem)=0
virtual void mem_copy_to(device_memory &mem)=0
friend class DeviceServer
virtual void task_add(DeviceTask &task)=0
virtual void mem_alloc(device_memory &mem)=0
virtual bool load_kernels(const DeviceRequestedFeatures &)
virtual bool show_samples() const
device_ptr device_pointer
void device_network_info(vector< DeviceInfo > &devices)
Device * device_network_create(DeviceInfo &info, Stats &stats, Profiler &profiler, const char *address)
#define CCL_NAMESPACE_END
static void error(const char *str)
Vector< CPUDevice > devices
list of all CPUDevices. for every hardware thread an instance of CPUDevice is created
struct blender::compositor::@172::@174 task
string string_human_readable_size(size_t size)
string string_human_readable_number(size_t num)
std::unique_lock< std::mutex > thread_scoped_lock
CCL_NAMESPACE_BEGIN typedef std::mutex thread_mutex