[Bf-blender-cvs] [3b5805eb326] cycles_procedural_api: add a parameter to control the maximum number of BVH refits

Kévin Dietrich noreply at git.blender.org
Fri Nov 6 18:48:01 CET 2020


Commit: 3b5805eb326966ef9e4474a58c50961ce7214212
Author: Kévin Dietrich
Date:   Fri Nov 6 16:47:59 2020 +0100
Branches: cycles_procedural_api
https://developer.blender.org/rB3b5805eb326966ef9e4474a58c50961ce7214212

add a parameter to control the maximum number of BVH refits

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

M	intern/cycles/blender/addon/properties.py
M	intern/cycles/blender/addon/ui.py
M	intern/cycles/blender/blender_sync.cpp
M	intern/cycles/bvh/bvh.cpp
M	intern/cycles/bvh/bvh.h
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 51492cd4b45..6c46a06e22a 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -677,10 +677,10 @@ 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,
+    max_bvh_refits: IntProperty(
+        name="Max BVH Refits",
+        description="Maximum number of times a BVH is refitted",
+        default=10,
         min=1,
     )
     debug_use_spatial_splits: BoolProperty(
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index f9c7ec9206c..c0c5f146dfb 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -723,7 +723,7 @@ class CYCLES_RENDER_PT_performance_acceleration_structure(CyclesButtonsPanel, Pa
         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")
+        sub.prop(cscene, "max_bvh_refits")
 
 
 class CYCLES_RENDER_PT_performance_final_render(CyclesButtonsPanel, Panel):
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 501bedb43b1..91d33a4478c 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -781,14 +781,7 @@ SceneParams BlenderSync::get_scene_params(BL::Scene &b_scene, bool background)
   params.use_bvh_spatial_split = RNA_boolean_get(&cscene, "debug_use_spatial_splits");
   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;
+  params.max_bvh_refits = RNA_int_get(&cscene, "max_bvh_refits");
 
   PointerRNA csscene = RNA_pointer_get(&b_scene.ptr, "cycles_curves");
   params.hair_subdivisions = get_int(csscene, "subdivisions");
diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp
index a51ac4cf4a9..34f26908a2b 100644
--- a/intern/cycles/bvh/bvh.cpp
+++ b/intern/cycles/bvh/bvh.cpp
@@ -92,7 +92,7 @@ int BVHStackEntry::encodeIdx() const
 BVH::BVH(const BVHParams &params_,
          const vector<Geometry *> &geometry_,
          const vector<Object *> &objects_)
-    : params(params_), geometry(geometry_), objects(objects_)
+    : params(params_), geometry(geometry_), objects(objects_), num_refits(0)
 {
 }
 
@@ -191,6 +191,7 @@ void BVH::refit(Progress &progress)
 
   progress.set_substatus("Refitting BVH nodes");
   refit_nodes();
+  num_refits += 1;
 }
 
 void BVH::refit_primitives(int start, int end, BoundBox &bbox, uint &visibility)
diff --git a/intern/cycles/bvh/bvh.h b/intern/cycles/bvh/bvh.h
index 705151e4e02..7430ae45494 100644
--- a/intern/cycles/bvh/bvh.h
+++ b/intern/cycles/bvh/bvh.h
@@ -89,6 +89,7 @@ class BVH {
 
   device_ptr prim_vert_pointer;
   size_t pack_verts_offset;
+  int num_refits;
 
   static BVH *create(const BVHParams &params,
                      const vector<Geometry *> &geometry,
diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp
index 1db1a28f91e..7613a7ebe38 100644
--- a/intern/cycles/render/geometry.cpp
+++ b/intern/cycles/render/geometry.cpp
@@ -212,7 +212,7 @@ void Geometry::compute_bvh(
     vector<Object *> objects;
     objects.push_back(&object);
 
-    if (bvh && (!need_update_rebuild || params->use_bvh_refit)) {
+    if (bvh && !need_update_rebuild && bvh->num_refits < params->max_bvh_refits) {
       progress->set_status(msg, "Refitting BVH");
 
       bvh->geometry = geometry;
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index 1b8252837f6..066b0f82f66 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -181,7 +181,7 @@ class SceneParams {
   CurveShapeType hair_shape;
   bool persistent_data;
   int texture_limit;
-  bool use_bvh_refit;
+  int max_bvh_refits;
 
   bool background;
 
@@ -198,7 +198,7 @@ class SceneParams {
     persistent_data = false;
     texture_limit = 0;
     background = true;
-    use_bvh_refit = false;
+    max_bvh_refits = 10;
   }
 
   bool modified(const SceneParams &params)
@@ -215,7 +215,7 @@ class SceneParams {
   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;
+    max_bvh_refits = params.max_bvh_refits;
     return modified(params);
   }



More information about the Bf-blender-cvs mailing list