Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey@blender.org>2021-09-16 18:01:28 +0300
committerSergey Sharybin <sergey@blender.org>2021-09-20 18:35:30 +0300
commit2413da215160403d026d776bdbe0b883de5516ae (patch)
tree04d6220cccbf8c4dcac5fc85e51c7709baccc45b /intern/cycles
parent2493c470d61a5b4cbfef87734f131a8d2e06d9c0 (diff)
Cycles X: Re-implement tile highlight
Since the GPUDisplay usage for offline rendering we've lost tile highlight functionality. This change brings it back. Introduced new RenderEngine API call to manipulate highlight state without acquiring RenderResult (so that we don't allocate passes). Not fully ideal since the last tile will be highlighted after render is done until first full-frame is done, but is a cosmetic thing we can improve in the future. Differential Revision: https://developer.blender.org/D12519
Diffstat (limited to 'intern/cycles')
-rw-r--r--intern/cycles/blender/blender_session.cpp19
-rw-r--r--intern/cycles/blender/blender_session.h2
-rw-r--r--intern/cycles/integrator/path_trace.cpp28
-rw-r--r--intern/cycles/render/session.cpp5
-rw-r--r--intern/cycles/render/session.h2
5 files changed, 38 insertions, 18 deletions
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index bedbfd8bbc3..63f847398b6 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -325,6 +325,8 @@ void BlenderSession::write_render_tile()
const string_view render_layer_name = session->get_render_tile_layer();
const string_view render_view_name = session->get_render_tile_view();
+ b_engine.tile_highlight_clear_all();
+
/* get render result */
BL::RenderResult b_rr = b_engine.begin_result(tile_offset.x,
tile_offset.y,
@@ -353,6 +355,20 @@ void BlenderSession::write_render_tile()
b_engine.end_result(b_rr, true, false, true);
}
+void BlenderSession::update_render_tile()
+{
+ if (!session->has_multiple_render_tiles()) {
+ /* Don't highlight full-frame tile. */
+ return;
+ }
+
+ const int2 tile_offset = session->get_render_tile_offset();
+ const int2 tile_size = session->get_render_tile_size();
+
+ b_engine.tile_highlight_clear_all();
+ b_engine.tile_highlight_set(tile_offset.x, tile_offset.y, tile_size.x, tile_size.y, true);
+}
+
void BlenderSession::full_buffer_written(string_view filename)
{
full_buffer_files_.emplace_back(filename);
@@ -435,6 +451,9 @@ void BlenderSession::render(BL::Depsgraph &b_depsgraph_)
if (b_engine.is_preview()) {
session->update_render_tile_cb = [&]() { write_render_tile(); };
}
+ else {
+ session->update_render_tile_cb = [&]() { update_render_tile(); };
+ }
session->full_buffer_written_cb = [&](string_view filename) { full_buffer_written(filename); };
diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h
index dce313a0ad4..87c83f51acc 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -72,6 +72,8 @@ class BlenderSession {
void write_render_result(BL::RenderLayer &b_rlay);
void write_render_tile();
+ void update_render_tile();
+
void full_buffer_written(string_view filename);
/* update functions are used to update display buffer only after sample was rendered
diff --git a/intern/cycles/integrator/path_trace.cpp b/intern/cycles/integrator/path_trace.cpp
index a7481461dd0..55f050d7833 100644
--- a/intern/cycles/integrator/path_trace.cpp
+++ b/intern/cycles/integrator/path_trace.cpp
@@ -544,22 +544,8 @@ void PathTrace::update_display(const RenderWork &render_work)
return;
}
- if (!gpu_display_) {
- /* TODO(sergey): Ideally the offline buffers update will be done using same API than the
- * viewport GPU display. Seems to be a matter of moving pixels update API to a more abstract
- * class and using it here instead of `GPUDisplay`. */
- if (tile_buffer_update_cb) {
- VLOG(3) << "Invoke buffer update callback.";
-
- const double start_time = time_dt();
- tile_buffer_update_cb();
- render_scheduler_.report_display_update_time(render_work, time_dt() - start_time);
- }
- else {
- VLOG(3) << "Ignore display update.";
- }
-
- return;
+ if (!gpu_display_ && !tile_buffer_update_cb) {
+ VLOG(3) << "Ignore display update.";
}
if (full_params_.width == 0 || full_params_.height == 0) {
@@ -567,10 +553,16 @@ void PathTrace::update_display(const RenderWork &render_work)
return;
}
- VLOG(3) << "Perform copy to GPUDisplay work.";
-
const double start_time = time_dt();
+ if (tile_buffer_update_cb) {
+ VLOG(3) << "Invoke buffer update callback.";
+
+ tile_buffer_update_cb();
+ }
+
+ 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);
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index f2206454a47..84407f8e6dd 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -615,6 +615,11 @@ void Session::collect_statistics(RenderStats *render_stats)
* Tile and tile pixels aceess.
*/
+bool Session::has_multiple_render_tiles() const
+{
+ return tile_manager_.has_multiple_tiles();
+}
+
int2 Session::get_render_tile_size() const
{
return path_trace_->get_render_tile_size();
diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h
index 8ea8cb67666..492cfdd1c09 100644
--- a/intern/cycles/render/session.h
+++ b/intern/cycles/render/session.h
@@ -157,6 +157,8 @@ class Session {
* Tile and tile pixels aceess.
*/
+ bool has_multiple_render_tiles() const;
+
/* Get size and offset (relative to the buffer's full x/y) of the currently rendering tile. */
int2 get_render_tile_size() const;
int2 get_render_tile_offset() const;