Commit: cf028a8f680650a0d33ce8dd288523b494b0fa00 Author: Sergey Sharybin Date: Tue Jun 29 13:03:51 2021 +0200 Branches: cycles-x https://developer.blender.org/rBcf028a8f680650a0d33ce8dd288523b494b0fa00
Cycles X: Avoid device copy for every pass Differential Revision: https://developer.blender.org/D11743 =================================================================== M intern/cycles/blender/blender_session.cpp M intern/cycles/integrator/path_trace.cpp M intern/cycles/integrator/path_trace.h M intern/cycles/integrator/path_trace_work.cpp M intern/cycles/integrator/path_trace_work.h M intern/cycles/render/session.cpp M intern/cycles/render/session.h =================================================================== diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index 61f20b018af..373cc821401 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -683,6 +683,10 @@ void BlenderSession::bake(BL::Depsgraph &b_depsgraph_, void BlenderSession::write_render_result(BL::RenderLayer &b_rlay) { + if (!session->copy_render_tile_from_device()) { + return; + } + const int2 tile_size = session->get_render_tile_size(); vector<float> pixels(tile_size.x * tile_size.y * 4); @@ -698,6 +702,10 @@ void BlenderSession::write_render_result(BL::RenderLayer &b_rlay) void BlenderSession::update_render_result(BL::RenderLayer &b_rlay) { + if (!session->copy_render_tile_from_device()) { + return; + } + const int2 tile_size = session->get_render_tile_size(); vector<float> pixels(tile_size.x * tile_size.y * 4); diff --git a/intern/cycles/integrator/path_trace.cpp b/intern/cycles/integrator/path_trace.cpp index 09aa4e8a8da..ffbd7b19db6 100644 --- a/intern/cycles/integrator/path_trace.cpp +++ b/intern/cycles/integrator/path_trace.cpp @@ -578,6 +578,22 @@ void PathTrace::copy_from_render_buffers(RenderBuffers *render_buffers) }); } +bool PathTrace::copy_render_tile_from_device() +{ + bool success = true; + + tbb::parallel_for_each(path_trace_works_, [&](unique_ptr<PathTraceWork> &path_trace_work) { + if (!success) { + return; + } + if (!path_trace_work->copy_render_tile_from_device()) { + success = false; + } + }); + + return success; +} + bool PathTrace::get_render_tile_pixels(const PassAccessor &pass_accessor, const PassAccessor::Destination &destination) { diff --git a/intern/cycles/integrator/path_trace.h b/intern/cycles/integrator/path_trace.h index 4985aa62d12..57f9ae885ca 100644 --- a/intern/cycles/integrator/path_trace.h +++ b/intern/cycles/integrator/path_trace.h @@ -107,9 +107,15 @@ class PathTrace { * buffers and will be copied to all devices of the path trace. */ void copy_from_render_buffers(RenderBuffers *render_buffers); + /* Copy render buffers of the big tile from the device to hsot. + * Return true if all copies are successful. */ + bool copy_render_tile_from_device(); + /* Get pass data of the entire big tile. * This call puts pass render result from all devices into the final pixels storage. * + * NOTE: Expects buffers to be copied to the host using `copy_render_tile_from_device()`. + * * Returns false if any of the accessor's `get_render_tile_pixels()` returned false. */ bool get_render_tile_pixels(const PassAccessor &pass_accessor, const PassAccessor::Destination &destination); diff --git a/intern/cycles/integrator/path_trace_work.cpp b/intern/cycles/integrator/path_trace_work.cpp index 54446f25f83..c7e0c06145c 100644 --- a/intern/cycles/integrator/path_trace_work.cpp +++ b/intern/cycles/integrator/path_trace_work.cpp @@ -112,13 +112,14 @@ void PathTraceWork::copy_from_render_buffers(const RenderBuffers *render_buffers buffers_->copy_to_device(); } +bool PathTraceWork::copy_render_tile_from_device() +{ + return buffers_->copy_from_device(); +} + bool PathTraceWork::get_render_tile_pixels(const PassAccessor &pass_accessor, const PassAccessor::Destination &destination) { - if (!buffers_->copy_from_device()) { - return false; - } - const int offset_y = effective_buffer_params_.full_y - effective_big_tile_params_.full_y; const int width = effective_buffer_params_.width; diff --git a/intern/cycles/integrator/path_trace_work.h b/intern/cycles/integrator/path_trace_work.h index d588528d086..3cc9abacc00 100644 --- a/intern/cycles/integrator/path_trace_work.h +++ b/intern/cycles/integrator/path_trace_work.h @@ -91,8 +91,13 @@ class PathTraceWork { * - Copies work's render buffer to its device. */ void copy_from_render_buffers(const RenderBuffers *render_buffers); + bool copy_render_tile_from_device(); + /* Access pixels rendered by this work and copy them to the coresponding location in the - * destination. */ + * destination. + * + * NOTE: Does not perform copy of buffers from the device. Use `copy_render_tile_from_device()` + * to update host-side data. */ bool get_render_tile_pixels(const PassAccessor &pass_accessor, const PassAccessor::Destination &destination); diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp index b2fe670a7db..bc6dfc6ce47 100644 --- a/intern/cycles/render/session.cpp +++ b/intern/cycles/render/session.cpp @@ -574,6 +574,11 @@ int2 Session::get_render_tile_offset() const return make_int2(tile.x - tile.full_x, tile.y - tile.full_y); } +bool Session::copy_render_tile_from_device() +{ + return path_trace_->copy_render_tile_from_device(); +} + bool Session::get_render_tile_pixels(const string &pass_name, int num_components, float *pixels) { const Pass *pass = Pass::find(scene->passes, pass_name); diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h index 6969c1d7dbf..e3ae91ce2fc 100644 --- a/intern/cycles/render/session.h +++ b/intern/cycles/render/session.h @@ -150,6 +150,8 @@ class Session { int2 get_render_tile_size() const; int2 get_render_tile_offset() const; + bool copy_render_tile_from_device(); + bool get_render_tile_pixels(const string &pass_name, int num_components, float *pixels); bool set_render_tile_pixels(const string &pass_name, int num_components, const float *pixels); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs