[Bf-blender-cvs] [578ecba599c] cycles_procedural_api: add an option to only rebuild the BVH every N frame

Kévin Dietrich noreply at git.blender.org
Fri Oct 9 17:56:03 CEST 2020


Commit: 578ecba599c48edd9f30f6e105309cbc7e1a0d06
Author: Kévin Dietrich
Date:   Wed Oct 7 08:42:47 2020 +0200
Branches: cycles_procedural_api
https://developer.blender.org/rB578ecba599c48edd9f30f6e105309cbc7e1a0d06

add an option to only rebuild the BVH every N frame

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

M	intern/cycles/blender/addon/properties.py
M	intern/cycles/blender/addon/ui.py
M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/blender/blender_sync.cpp
M	intern/cycles/render/geometry.cpp
M	intern/cycles/render/scene.h

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

diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index d29f709263e..3cc5c10c9d5 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -675,6 +675,12 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
         items=enum_bvh_types,
         default='DYNAMIC_BVH',
     )
+    bvh_rebuild_rate: IntProperty(
+        name="BVH Rebuild Rate",
+        description="Only rebuild the BVH every N frame, for faster updates on frame change in the viewport",
+        default=1,
+        min=1,
+    )
     debug_use_spatial_splits: BoolProperty(
         name="Use Spatial Splits",
         description="Use BVH spatial splits: longer builder time, faster render",
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index 72d98e78c4d..d4289393a1f 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -722,6 +722,8 @@ class CYCLES_RENDER_PT_performance_acceleration_structure(CyclesButtonsPanel, Pa
         sub = col.column()
         sub.active = not cscene.debug_use_spatial_splits and not use_embree
         sub.prop(cscene, "debug_bvh_time_steps")
+        sub = col.column()
+        sub.prop(cscene, "bvh_rebuild_rate")
 
 
 class CYCLES_RENDER_PT_performance_final_render(CyclesButtonsPanel, Panel):
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 4b7d2265092..101190f643d 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -212,7 +212,7 @@ void BlenderSession::reset_session(BL::BlendData &b_data, BL::Depsgraph &b_depsg
       b_engine, b_userpref, b_scene, background);
   SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background);
 
-  if (scene->params.modified(scene_params) || session->params.modified(session_params) ||
+  if (scene->params.update_params(scene_params) || session->params.modified(session_params) ||
       !scene_params.persistent_data) {
     /* if scene or session parameters changed, it's easier to simply re-create
      * them rather than trying to distinguish which settings need to be updated
@@ -783,7 +783,7 @@ void BlenderSession::synchronize(BL::Depsgraph &b_depsgraph_)
   SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background);
   bool session_pause = BlenderSync::get_session_pause(b_scene, background);
 
-  if (session->params.modified(session_params) || scene->params.modified(scene_params)) {
+  if (session->params.modified(session_params) || scene->params.update_params(scene_params)) {
     free_session();
     create_session();
   }
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 12acff70662..4fe968a6175 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -774,6 +774,14 @@ SceneParams BlenderSync::get_scene_params(BL::Scene &b_scene, bool background)
   params.use_bvh_unaligned_nodes = RNA_boolean_get(&cscene, "debug_use_hair_bvh");
   params.num_bvh_time_steps = RNA_int_get(&cscene, "debug_bvh_time_steps");
 
+  int bvh_rebuild_rate = RNA_int_get(&cscene, "bvh_rebuild_rate");
+  if (bvh_rebuild_rate < 1) {
+    bvh_rebuild_rate = 1;
+  }
+
+  int frame_delta = b_scene.frame_current() - b_scene.frame_start();
+  params.use_bvh_refit = (frame_delta % bvh_rebuild_rate) != 0;
+
   PointerRNA csscene = RNA_pointer_get(&b_scene.ptr, "cycles_curves");
   params.hair_subdivisions = get_int(csscene, "subdivisions");
   params.hair_shape = (CurveShapeType)get_enum(
diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp
index b08982dd4c1..12f2e16ca54 100644
--- a/intern/cycles/render/geometry.cpp
+++ b/intern/cycles/render/geometry.cpp
@@ -198,7 +198,7 @@ void Geometry::compute_bvh(
     vector<Object *> objects;
     objects.push_back(&object);
 
-    if (bvh && !need_update_rebuild) {
+    if (bvh && (!need_update_rebuild || params->use_bvh_refit)) {
       progress->set_status(msg, "Refitting BVH");
 
       bvh->geometry = geometry;
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index 33f6378b7cf..d2efe5f7445 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -179,6 +179,7 @@ class SceneParams {
   CurveShapeType hair_shape;
   bool persistent_data;
   int texture_limit;
+  bool use_bvh_refit;
 
   bool background;
 
@@ -195,6 +196,7 @@ class SceneParams {
     persistent_data = false;
     texture_limit = 0;
     background = true;
+    use_bvh_refit = false;
   }
 
   bool modified(const SceneParams &params)
@@ -208,6 +210,13 @@ class SceneParams {
              persistent_data == params.persistent_data && texture_limit == params.texture_limit);
   }
 
+  bool update_params(const SceneParams &params)
+  {
+    /* We do not want to include use_bvh_refit in the modified detection as this will recreate the entire scene. */
+    use_bvh_refit = params.use_bvh_refit;
+    return modified(params);
+  }
+
   int curve_subdivisions()
   {
     /* Matching the tesselation rate limit in Embree. */



More information about the Bf-blender-cvs mailing list