[Bf-blender-cvs] [2413da21516] cycles-x: Cycles X: Re-implement tile highlight

Sergey Sharybin noreply at git.blender.org
Mon Sep 20 17:35:44 CEST 2021


Commit: 2413da215160403d026d776bdbe0b883de5516ae
Author: Sergey Sharybin
Date:   Thu Sep 16 17:01:28 2021 +0200
Branches: cycles-x
https://developer.blender.org/rB2413da215160403d026d776bdbe0b883de5516ae

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

===================================================================

M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/blender/blender_session.h
M	intern/cycles/integrator/path_trace.cpp
M	intern/cycles/render/session.cpp
M	intern/cycles/render/session.h
M	source/blender/makesrna/intern/rna_render.c
M	source/blender/render/RE_engine.h
M	source/blender/render/intern/engine.c

===================================================================

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;
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index bfbfc6fc055..fcb46904e8d 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -820,6 +820,22 @@ static void rna_def_render_engine(BlenderRNA *brna)
   func = RNA_def_function(srna, "free_blender_memory", "RE_engine_free_blender_memory");
   RNA_def_function_ui_description(func, "Free Blender side memory of render engine");
 
+  func = RNA_def_function(srna, "tile_highlight_set", "RE_engine_tile_highlight_set");
+  RNA_def_function_ui_description(func, "Set highlighted state of the given tile");
+  parm = RNA_def_int(func, "x", 0, 0, INT_MAX, "X", "", 0, INT_MAX);
+  RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+  parm = RNA_def_int(func, "y", 0, 0, INT_MAX, "Y", "", 0, INT_MAX);
+  RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+  parm = RNA_def_int(func, "width", 0, 0, INT_MAX, "Width", "", 0, INT_MAX);
+  RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+  parm = RNA_def_int(func, "height", 0, 0, INT_MAX, "Height", "", 0, INT_MAX);
+  RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+  parm = RNA_def_boolean(func, "highlight", 0, "Highlight", "");
+  RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+
+  func = RNA_def_function(srna, "tile_highlight_clear_all", "RE_engine_tile_highlight_clear_all");
+  RNA_def_function_ui_description(func, "Clear highlight from all tiles");
+
   RNA_define_verify_sdna(0);
 
   prop = RNA_def_property(srna, "is_animation", PROP_BOOLEAN, PROP_NONE);
diff --git a/source/blender/render/RE_engine.h b/source/blender/render/RE_engine.h
index b545f689bb2..2a3a5964262 100644
--- a/source/blender/render/RE_engine.h
+++ b/source/blender/render/RE_engine.h
@@ -286,6 +286,10 @@ void RE_bake_engine_set_engine_parameters(struct Render *re,
 
 void RE_engine_free_blender_memory(struct RenderEngine *engine);
 
+void RE_engine_tile_highlight_set(
+    struct RenderEngine *engine, int x, int y, int width, int height, bool highlight);
+void RE_engine_tile_highlight_clear_all(struct RenderEngine *engine);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/render/intern/engine.c b/source/blender/render/intern/engine.c
index 2eec4496768..389b821ca35 100644
--- a/source/blender/render/intern/engine.c
+++ b/source/blender/render/intern/engine.c
@@ -291,6 +291,37 @@ static HighlightedTile highlighted_tile_from_result_get(Render *re, RenderResult
   return tile;
 }
 
+static void engine_tile_highlight_set(RenderEngine *engine,
+                                      const HighlightedTile *tile,
+                                      bool highlight)
+{
+  if ((engine->flag & RE_ENGINE_HIGHLIGHT_TILES) == 0) {
+    return;
+  }
+
+  Render *re = engine->re;
+
+  BLI_mutex_lock(&re->highlighted_tiles_mutex);
+
+  if (re->highlighted_tiles == NULL) {
+    re->highlighted_tiles = BLI_gset_new(
+        BLI_ghashutil_inthash_v4_p, BLI_ghashutil_inthash_v4_cmp, "highlighted tiles");
+  }
+
+  if (highlight) {
+    HighlightedTile **tile_in_set;
+    if (!BLI_gset_ensure_p_ex(re->highlighted_tiles, tile, (void ***)&tile_in_set)) {
+      *tile_in_set = MEM_mallocN(sizeof(HighlightedTile), __func__);
+      **tile_in_set = *tile;
+    }
+  }
+  else {
+    BLI_gset_remove(re->highlighted_tiles, tile, MEM_freeN);
+  }
+
+  BLI_mutex_unlock(&re->highlighted_tiles_mutex);
+}
+
 RenderResult *RE_engine_begin_result(
     RenderEngine *engine, int x, int y, int w, int h, const char *layername, const char *viewname)
 {
@@ -405,27 +436,9 @@ void RE_engine_end_result(
   re_ensure_passes_allocated_thread_safe(re);
 
   if (re->engine && (re->engine->flag & RE_ENGINE_HIGHLIGHT_TILES)) {
-    BLI_mutex_lock(&re->highlighted_tiles_mutex);
-
-    if (re->highlighted_tiles == NULL) {
-      re->highlighted_tiles = BLI_gset_new(
-          BLI_ghashutil_inthash_v4_p, BLI_ghashutil_inthash_v4_cmp, "highlighted tiles");
-    }
+    const HighlightedTile tile = highlighted_tile_from_result_get(re, result);
 
-    HighlightedTile tile = highlighted_tile_from_result_get(re, result);
-    if (highlight) {
-      void **tile_in_set;
-      if (!BLI_gset_ensure_p_ex(re->highlighted_tiles, &tile, &tile_in_set)) {
-        *tile_in_set = MEM_mallocN(sizeof(HighlightedTile), __func__);
-        memcpy(*tile_in_set, &tile, sizeof(tile));
-      }
-      BLI_gset_add(re->highlighted_tiles, &tile);
-    }
-    else {
-      BLI_gset_remove(re->highlighted_tiles, &tile, MEM_freeN);
-    }
-
-    BLI_mutex_unlock(&re->highlighted_tiles_mutex);
+    engine_tile_highlight_set(engine, &tile, highlight);
   }
 
   if (!cancel || merge_results) {
@@ -1127,6 +1140,32 @@ void RE_engine_draw_release(Render *re)
   BLI_mutex_unlock(&re->engine_draw_mutex);
 }
 
+void RE_engine_tile_highlight_set(
+    RenderEngine *engine, int x, int y, int width, int height, bool highlight)
+{
+  HighlightedTile tile;
+  BLI_rcti_init(&tile.rect, x, x + width, y, y + height);
+
+  engine_tile_highlight_set(engine, &tile, highlight);
+}
+
+void RE_engine_tile_highlight_clear_all(RenderEngine *engine)
+{
+  if ((engine->flag & RE_ENGINE_HIGHLIGHT_TILES) == 0) {
+    return;
+  }
+
+  Render *re = engine->re;
+
+  BLI_mutex_lock(&re->highlighted_tiles_mutex);
+
+  if (re->highlighted_tiles != NULL) {
+    BLI_gset_clear(re->high

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list