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
path: root/intern
diff options
context:
space:
mode:
authorBrecht Van Lommel <brecht@blender.org>2021-02-16 22:45:19 +0300
committerBrecht Van Lommel <brecht@blender.org>2021-02-17 17:22:37 +0300
commit2217719feb250458bef461d405985e79d3c72a14 (patch)
treebfa9d372d8ab8d693c54ada560df1971f49a55ec /intern
parent6ce06957c9bf9c752f0a7ee2cb186948d0d67983 (diff)
Fix T85440: crash with displacement shaders and updating geometry in viewport
When primitive offsets change we need to rebuild or refit BVHs, however this was also tagging other data as modified too late in the geometry update process. Now ensure only the BVHs are updated. Ref D10441
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/render/geometry.cpp9
-rw-r--r--intern/cycles/render/geometry.h1
2 files changed, 8 insertions, 2 deletions
diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp
index 6fc217f2d76..74907292943 100644
--- a/intern/cycles/render/geometry.cpp
+++ b/intern/cycles/render/geometry.cpp
@@ -61,6 +61,7 @@ Geometry::Geometry(const NodeType *node_type, const Type type)
: Node(node_type), geometry_type(type), attributes(this, ATTR_PRIM_GEOMETRY)
{
need_update_rebuild = false;
+ need_update_bvh_for_offset = false;
transform_applied = false;
transform_negative_scaled = false;
@@ -242,6 +243,7 @@ void Geometry::compute_bvh(
clear_modified();
need_update_rebuild = false;
+ need_update_bvh_for_offset = false;
}
bool Geometry::has_motion_blur() const
@@ -944,7 +946,8 @@ void GeometryManager::mesh_calc_offset(Scene *scene, BVHLayout bvh_layout)
const bool has_optix_bvh = bvh_layout == BVH_LAYOUT_OPTIX ||
bvh_layout == BVH_LAYOUT_MULTI_OPTIX ||
bvh_layout == BVH_LAYOUT_MULTI_OPTIX_EMBREE;
- geom->tag_bvh_update(has_optix_bvh);
+ geom->need_update_rebuild |= has_optix_bvh;
+ geom->need_update_bvh_for_offset = true;
}
if (geom->geometry_type == Geometry::MESH || geom->geometry_type == Geometry::VOLUME) {
@@ -1590,7 +1593,9 @@ void GeometryManager::device_update(Device *device,
displacement_done = true;
}
}
+ }
+ if (geom->is_modified() || geom->need_update_bvh_for_offset) {
if (geom->need_build_bvh(bvh_layout)) {
num_bvh++;
}
@@ -1632,7 +1637,7 @@ void GeometryManager::device_update(Device *device,
size_t i = 0;
foreach (Geometry *geom, scene->geometry) {
- if (geom->is_modified()) {
+ if (geom->is_modified() || geom->need_update_bvh_for_offset) {
pool.push(function_bind(
&Geometry::compute_bvh, geom, device, dscene, &scene->params, &progress, i, num_bvh));
if (geom->need_build_bvh(bvh_layout)) {
diff --git a/intern/cycles/render/geometry.h b/intern/cycles/render/geometry.h
index b124e950ad2..0e7c839d3d9 100644
--- a/intern/cycles/render/geometry.h
+++ b/intern/cycles/render/geometry.h
@@ -90,6 +90,7 @@ class Geometry : public Node {
/* Update Flags */
bool need_update_rebuild;
+ bool need_update_bvh_for_offset;
/* Index into scene->geometry (only valid during update) */
size_t index;