diff options
Diffstat (limited to 'intern/cycles/integrator')
-rw-r--r-- | intern/cycles/integrator/path_trace.cpp | 20 | ||||
-rw-r--r-- | intern/cycles/integrator/path_trace.h | 7 | ||||
-rw-r--r-- | intern/cycles/integrator/path_trace_display.cpp | 16 | ||||
-rw-r--r-- | intern/cycles/integrator/path_trace_display.h | 12 | ||||
-rw-r--r-- | intern/cycles/integrator/path_trace_work.cpp | 8 | ||||
-rw-r--r-- | intern/cycles/integrator/path_trace_work_gpu.cpp | 6 |
6 files changed, 51 insertions, 18 deletions
diff --git a/intern/cycles/integrator/path_trace.cpp b/intern/cycles/integrator/path_trace.cpp index bdc18b1c0a1..0b55d1078a8 100644 --- a/intern/cycles/integrator/path_trace.cpp +++ b/intern/cycles/integrator/path_trace.cpp @@ -115,7 +115,9 @@ bool PathTrace::ready_to_reset() return false; } -void PathTrace::reset(const BufferParams &full_params, const BufferParams &big_tile_params) +void PathTrace::reset(const BufferParams &full_params, + const BufferParams &big_tile_params, + const bool reset_rendering) { if (big_tile_params_.modified(big_tile_params)) { big_tile_params_ = big_tile_params; @@ -128,7 +130,7 @@ void PathTrace::reset(const BufferParams &full_params, const BufferParams &big_t * It is requires to inform about reset whenever it happens, so that the redraw state tracking is * properly updated. */ if (display_) { - display_->reset(full_params); + display_->reset(big_tile_params, reset_rendering); } render_state_.has_denoised_result = false; @@ -594,6 +596,15 @@ void PathTrace::draw() did_draw_after_reset_ |= display_->draw(); } +void PathTrace::flush_display() +{ + if (!display_) { + return; + } + + display_->flush(); +} + void PathTrace::update_display(const RenderWork &render_work) { if (!render_work.display.update) { @@ -622,9 +633,8 @@ void PathTrace::update_display(const RenderWork &render_work) if (display_) { VLOG(3) << "Perform copy to GPUDisplay work."; - const int resolution_divider = render_work.resolution_divider; - const int texture_width = max(1, full_params_.width / resolution_divider); - const int texture_height = max(1, full_params_.height / resolution_divider); + const int texture_width = render_state_.effective_big_tile_params.window_width; + const int texture_height = render_state_.effective_big_tile_params.window_height; if (!display_->update_begin(texture_width, texture_height)) { LOG(ERROR) << "Error beginning GPUDisplay update."; return; diff --git a/intern/cycles/integrator/path_trace.h b/intern/cycles/integrator/path_trace.h index 9b079352a63..bb41c8c3210 100644 --- a/intern/cycles/integrator/path_trace.h +++ b/intern/cycles/integrator/path_trace.h @@ -72,7 +72,9 @@ class PathTrace { * render result. */ bool ready_to_reset(); - void reset(const BufferParams &full_params, const BufferParams &big_tile_params); + void reset(const BufferParams &full_params, + const BufferParams &big_tile_params, + bool reset_rendering); void device_free(); @@ -112,6 +114,9 @@ class PathTrace { /* Perform drawing of the current state of the DisplayDriver. */ void draw(); + /* Flush outstanding display commands before ending the render loop. */ + void flush_display(); + /* Cancel rendering process as soon as possible, without waiting for full tile to be sampled. * Used in cases like reset of render session. * diff --git a/intern/cycles/integrator/path_trace_display.cpp b/intern/cycles/integrator/path_trace_display.cpp index c1cade923b1..4af622065c2 100644 --- a/intern/cycles/integrator/path_trace_display.cpp +++ b/intern/cycles/integrator/path_trace_display.cpp @@ -26,15 +26,20 @@ PathTraceDisplay::PathTraceDisplay(unique_ptr<DisplayDriver> driver) : driver_(m { } -void PathTraceDisplay::reset(const BufferParams &buffer_params) +void PathTraceDisplay::reset(const BufferParams &buffer_params, const bool reset_rendering) { thread_scoped_lock lock(mutex_); - params_.full_offset = make_int2(buffer_params.full_x, buffer_params.full_y); + params_.full_offset = make_int2(buffer_params.full_x + buffer_params.window_x, + buffer_params.full_y + buffer_params.window_y); params_.full_size = make_int2(buffer_params.full_width, buffer_params.full_height); - params_.size = make_int2(buffer_params.width, buffer_params.height); + params_.size = make_int2(buffer_params.window_width, buffer_params.window_height); texture_state_.is_outdated = true; + + if (!reset_rendering) { + driver_->next_tile_begin(); + } } void PathTraceDisplay::mark_texture_updated() @@ -248,4 +253,9 @@ bool PathTraceDisplay::draw() return !is_outdated; } +void PathTraceDisplay::flush() +{ + driver_->flush(); +} + CCL_NAMESPACE_END diff --git a/intern/cycles/integrator/path_trace_display.h b/intern/cycles/integrator/path_trace_display.h index 47014f43afa..b9aff5f6000 100644 --- a/intern/cycles/integrator/path_trace_display.h +++ b/intern/cycles/integrator/path_trace_display.h @@ -38,14 +38,17 @@ class BufferParams; class PathTraceDisplay { public: - PathTraceDisplay(unique_ptr<DisplayDriver> driver); + explicit PathTraceDisplay(unique_ptr<DisplayDriver> driver); virtual ~PathTraceDisplay() = default; /* Reset the display for the new state of render session. Is called whenever session is reset, * which happens on changes like viewport navigation or viewport dimension change. * - * This call will configure parameters for a changed buffer and reset the texture state. */ - void reset(const BufferParams &buffer_params); + * This call will configure parameters for a changed buffer and reset the texture state. + * + * When the `reset_rendering` a complete displat reset happens. When it is false reset happens + * for a new state of the buffer parameters which is assumed to correspond to the next tile. */ + void reset(const BufferParams &buffer_params, bool reset_rendering); /* -------------------------------------------------------------------- * Update procedure. @@ -151,6 +154,9 @@ class PathTraceDisplay { * Returns true if this call did draw an updated state of the texture. */ bool draw(); + /* Flush outstanding display commands before ending the render loop. */ + void flush(); + private: /* Display driver implemented by the host application. */ unique_ptr<DisplayDriver> driver_; diff --git a/intern/cycles/integrator/path_trace_work.cpp b/intern/cycles/integrator/path_trace_work.cpp index b0c40cfe15c..4ecc7d775ee 100644 --- a/intern/cycles/integrator/path_trace_work.cpp +++ b/intern/cycles/integrator/path_trace_work.cpp @@ -194,10 +194,10 @@ PassAccessor::Destination PathTraceWork::get_display_destination_template( PassAccessor::Destination destination(film_->get_display_pass()); const int2 display_texture_size = display->get_texture_size(); - const int texture_x = effective_buffer_params_.full_x - effective_full_params_.full_x + - effective_buffer_params_.window_x; - const int texture_y = effective_buffer_params_.full_y - effective_full_params_.full_y + - effective_buffer_params_.window_y; + const int texture_x = effective_buffer_params_.full_x - effective_big_tile_params_.full_x + + effective_buffer_params_.window_x - effective_big_tile_params_.window_x; + const int texture_y = effective_buffer_params_.full_y - effective_big_tile_params_.full_y + + effective_buffer_params_.window_y - effective_big_tile_params_.window_y; destination.offset = texture_y * display_texture_size.x + texture_x; destination.stride = display_texture_size.x; diff --git a/intern/cycles/integrator/path_trace_work_gpu.cpp b/intern/cycles/integrator/path_trace_work_gpu.cpp index e5062c6c47e..7a13447f2cf 100644 --- a/intern/cycles/integrator/path_trace_work_gpu.cpp +++ b/intern/cycles/integrator/path_trace_work_gpu.cpp @@ -875,8 +875,10 @@ void PathTraceWorkGPU::copy_to_display_naive(PathTraceDisplay *display, const int final_width = buffers_->params.window_width; const int final_height = buffers_->params.window_height; - const int texture_x = full_x - effective_full_params_.full_x + effective_buffer_params_.window_x; - const int texture_y = full_y - effective_full_params_.full_y + effective_buffer_params_.window_y; + const int texture_x = full_x - effective_big_tile_params_.full_x + + effective_buffer_params_.window_x - effective_big_tile_params_.window_x; + const int texture_y = full_y - effective_big_tile_params_.full_y + + effective_buffer_params_.window_y - effective_big_tile_params_.window_y; /* Re-allocate display memory if needed, and make sure the device pointer is allocated. * |