From e2a36a6e459fc34b62efb7a957a183b54aa51bf5 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Tue, 25 Jan 2022 17:16:13 +0100 Subject: Cycles: Make Embree compact BVH optional Make the Embree RTC_SCENE_FLAG_COMPACT flag optional and enabled per default. Disabling it makes CPU rendering a bit faster in some scenes at the cost of a higher memory usage. Barbershop renders about 3% faster, victor about 4% on CPU with compact BVH disabled. Differential Revision: https://developer.blender.org/D13592 --- intern/cycles/blender/addon/properties.py | 5 +++++ intern/cycles/blender/addon/ui.py | 2 ++ intern/cycles/blender/sync.cpp | 1 + intern/cycles/bvh/embree.cpp | 4 +++- intern/cycles/bvh/params.h | 3 +++ intern/cycles/scene/geometry.cpp | 1 + intern/cycles/scene/scene.h | 3 +++ 7 files changed, 18 insertions(+), 1 deletion(-) (limited to 'intern') diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index f669adb9f37..93a0717ad5f 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -667,6 +667,11 @@ class CyclesRenderSettings(bpy.types.PropertyGroup): description="Use special type BVH optimized for hair (uses more ram but renders faster)", default=True, ) + debug_use_compact_bvh: BoolProperty( + name="Use Compact BVH", + description="Use compact BVH structure (uses less ram but renders slower)", + default=True, + ) debug_bvh_time_steps: IntProperty( name="BVH Time Steps", description="Split BVH primitives by this number of time steps to speed up render time in cost of memory", diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index 5b600692152..06cf69f90ca 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -689,6 +689,8 @@ 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") + col.prop(cscene, "debug_use_compact_bvh") + class CYCLES_RENDER_PT_performance_final_render(CyclesButtonsPanel, Panel): bl_label = "Final Render" diff --git a/intern/cycles/blender/sync.cpp b/intern/cycles/blender/sync.cpp index 588e057b9ad..7e6f1535d66 100644 --- a/intern/cycles/blender/sync.cpp +++ b/intern/cycles/blender/sync.cpp @@ -787,6 +787,7 @@ SceneParams BlenderSync::get_scene_params(BL::Scene &b_scene, bool background) params.bvh_type = BVH_TYPE_DYNAMIC; params.use_bvh_spatial_split = RNA_boolean_get(&cscene, "debug_use_spatial_splits"); + params.use_bvh_compact_structure = RNA_boolean_get(&cscene, "debug_use_compact_bvh"); 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"); diff --git a/intern/cycles/bvh/embree.cpp b/intern/cycles/bvh/embree.cpp index 618dd9438d5..2e49e29d12b 100644 --- a/intern/cycles/bvh/embree.cpp +++ b/intern/cycles/bvh/embree.cpp @@ -355,10 +355,12 @@ void BVHEmbree::build(Progress &progress, Stats *stats, RTCDevice rtc_device_) } const bool dynamic = params.bvh_type == BVH_TYPE_DYNAMIC; + const bool compact = params.use_compact_structure; scene = rtcNewScene(rtc_device); const RTCSceneFlags scene_flags = (dynamic ? RTC_SCENE_FLAG_DYNAMIC : RTC_SCENE_FLAG_NONE) | - RTC_SCENE_FLAG_COMPACT | RTC_SCENE_FLAG_ROBUST; + (compact ? RTC_SCENE_FLAG_COMPACT : RTC_SCENE_FLAG_NONE) | + RTC_SCENE_FLAG_ROBUST; rtcSetSceneFlags(scene, scene_flags); build_quality = dynamic ? RTC_BUILD_QUALITY_LOW : (params.use_spatial_split ? RTC_BUILD_QUALITY_HIGH : diff --git a/intern/cycles/bvh/params.h b/intern/cycles/bvh/params.h index 16edf2e88e4..9804c7994ef 100644 --- a/intern/cycles/bvh/params.h +++ b/intern/cycles/bvh/params.h @@ -97,6 +97,9 @@ class BVHParams { */ bool use_unaligned_nodes; + /* Use compact acceleration structure (Embree)*/ + bool use_compact_structure; + /* Split time range to this number of steps and create leaf node for each * of this time steps. * diff --git a/intern/cycles/scene/geometry.cpp b/intern/cycles/scene/geometry.cpp index 49d18d00dd7..90f1e1cb021 100644 --- a/intern/cycles/scene/geometry.cpp +++ b/intern/cycles/scene/geometry.cpp @@ -236,6 +236,7 @@ void Geometry::compute_bvh( BVHParams bparams; bparams.use_spatial_split = params->use_bvh_spatial_split; + bparams.use_compact_structure = params->use_bvh_compact_structure; bparams.bvh_layout = bvh_layout; bparams.use_unaligned_nodes = dscene->data.bvh.have_curves && params->use_bvh_unaligned_nodes; diff --git a/intern/cycles/scene/scene.h b/intern/cycles/scene/scene.h index ec935b41be6..77268837070 100644 --- a/intern/cycles/scene/scene.h +++ b/intern/cycles/scene/scene.h @@ -160,6 +160,7 @@ class SceneParams { BVHType bvh_type; bool use_bvh_spatial_split; + bool use_bvh_compact_structure; bool use_bvh_unaligned_nodes; int num_bvh_time_steps; int hair_subdivisions; @@ -174,6 +175,7 @@ class SceneParams { bvh_layout = BVH_LAYOUT_BVH2; bvh_type = BVH_TYPE_DYNAMIC; use_bvh_spatial_split = false; + use_bvh_compact_structure = true; use_bvh_unaligned_nodes = true; num_bvh_time_steps = 0; hair_subdivisions = 3; @@ -187,6 +189,7 @@ class SceneParams { return !(shadingsystem == params.shadingsystem && bvh_layout == params.bvh_layout && bvh_type == params.bvh_type && use_bvh_spatial_split == params.use_bvh_spatial_split && + use_bvh_compact_structure == params.use_bvh_compact_structure && use_bvh_unaligned_nodes == params.use_bvh_unaligned_nodes && num_bvh_time_steps == params.num_bvh_time_steps && hair_subdivisions == params.hair_subdivisions && hair_shape == params.hair_shape && -- cgit v1.2.3