Page Menu
Home
Search
Configure Global Search
Log In
Paste
P1966
(An Untitled Masterwork)
Active
Public
Actions
Authored by
Brecht Van Lommel (brecht)
on Feb 17 2021, 3:22 AM.
Edit Paste
Archive Paste
View Raw File
Subscribe
Mute Notifications
Award Token
Tags
None
Subscribers
None
diff --git a/intern/cycles/blender/blender_curves.cpp b/intern/cycles/blender/blender_curves.cpp
index 4fb5c7f57d1..c4713b8f46b 100644
--- a/intern/cycles/blender/blender_curves.cpp
+++ b/intern/cycles/blender/blender_curves.cpp
@@ -848,14 +848,6 @@ void BlenderSync::sync_hair(BL::Depsgraph b_depsgraph, BL::Object b_ob, Hair *ha
}
hair->attributes.update(std::move(new_hair.attributes));
-
- /* tag update */
-
- /* Compares curve_keys rather than strands in order to handle quick hair
- * adjustments in dynamic BVH - other methods could probably do this better. */
- const bool rebuild = (hair->curve_keys_is_modified() || hair->curve_radius_is_modified());
-
- hair->tag_update(scene, rebuild);
}
void BlenderSync::sync_hair_motion(BL::Depsgraph b_depsgraph,
diff --git a/intern/cycles/blender/blender_light.cpp b/intern/cycles/blender/blender_light.cpp
index ff4ecc5a3f9..0f024f36242 100644
--- a/intern/cycles/blender/blender_light.cpp
+++ b/intern/cycles/blender/blender_light.cpp
@@ -154,9 +154,6 @@ void BlenderSync::sync_light(BL::Object &b_parent,
light->set_use_glossy((visibility & PATH_RAY_GLOSSY) != 0);
light->set_use_transmission((visibility & PATH_RAY_TRANSMIT) != 0);
light->set_use_scatter((visibility & PATH_RAY_VOLUME_SCATTER) != 0);
-
- /* tag */
- light->tag_update(scene);
}
void BlenderSync::sync_background_light(BL::SpaceView3D &b_v3d, bool use_portal)
@@ -198,7 +195,6 @@ void BlenderSync::sync_background_light(BL::SpaceView3D &b_v3d, bool use_portal)
else
light->set_samples(samples);
- light->tag_update(scene);
light_map.set_recalc(b_world);
}
}
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 7edf797e096..1811d723c66 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -1061,15 +1061,6 @@ void BlenderSync::sync_mesh(BL::Depsgraph b_depsgraph, BL::Object b_ob, Mesh *me
mesh->subd_attributes.update(std::move(new_mesh.subd_attributes));
mesh->set_num_subd_faces(new_mesh.get_num_subd_faces());
-
- /* tag update */
- bool rebuild = (mesh->triangles_is_modified()) || (mesh->subd_num_corners_is_modified()) ||
- (mesh->subd_shader_is_modified()) || (mesh->subd_smooth_is_modified()) ||
- (mesh->subd_ptex_offset_is_modified()) ||
- (mesh->subd_start_corner_is_modified()) ||
- (mesh->subd_face_corners_is_modified());
-
- mesh->tag_update(scene, rebuild);
}
void BlenderSync::sync_mesh_motion(BL::Depsgraph b_depsgraph,
diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index f0460b129c2..57ad1026d02 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -327,8 +327,6 @@ Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph,
object->set_dupli_uv(make_float2(0.0f, 0.0f));
object->set_random_id(hash_uint2(hash_string(object->name.c_str()), 0));
}
-
- object->tag_update(scene);
}
if (is_instance) {
diff --git a/intern/cycles/blender/blender_particles.cpp b/intern/cycles/blender/blender_particles.cpp
index ae43dae4dc1..723b9f1fbcc 100644
--- a/intern/cycles/blender/blender_particles.cpp
+++ b/intern/cycles/blender/blender_particles.cpp
@@ -63,7 +63,7 @@ bool BlenderSync::sync_dupli_particle(BL::Object &b_ob,
/* first time used in this sync loop? clear and tag update */
if (first_use) {
psys->particles.clear();
- psys->tag_update(scene);
+ scene->particle_system_manager->tag_update(scene);
}
/* add particle */
@@ -84,9 +84,6 @@ bool BlenderSync::sync_dupli_particle(BL::Object &b_ob,
object->set_particle_system(psys);
object->set_particle_index(psys->particles.size() - 1);
- if (object->particle_index_is_modified())
- scene->object_manager->tag_update(scene, ObjectManager::PARTICLE_MODIFIED);
-
/* return that this object has particle data */
return true;
}
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 6fa54356197..0cdc7ca52db 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -826,6 +826,9 @@ void BlenderSession::synchronize(BL::Depsgraph &b_depsgraph_)
session->set_denoising(session_params.denoising);
+ /* TODO: lock used to be after if (scene->need_reset()!) */
+ session->release_scene();
+
/* reset if needed */
if (scene->need_reset()) {
session->reset(buffer_params, session_params.samples);
@@ -838,7 +841,6 @@ void BlenderSession::synchronize(BL::Depsgraph &b_depsgraph_)
}
/* unlock */
- session->release_scene();
/* Start rendering thread, if it's not running already. Do this
* after all scene data has been synced at least once. */
@@ -883,9 +885,10 @@ bool BlenderSession::draw(int w, int h)
/* update camera from 3d view */
sync->sync_view(b_v3d, b_rv3d, width, height);
- if (scene->camera->is_modified() || scene->film->is_modified())
+ if (scene->camera->is_modified())
reset = true;
+ /* TODO: this is too expensive. */
session->release_scene();
}
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index 02a6638b083..acca261b20b 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -1345,20 +1345,10 @@ void BlenderSync::sync_materials(BL::Depsgraph &b_depsgraph, bool update_all)
*/
updated_shaders.insert(shader);
}
- else {
- /* NOTE: Update tagging can access links which are being
- * optimized out.
- */
- shader->tag_update(scene);
- }
}
}
pool.wait_work();
-
- foreach (Shader *shader, updated_shaders) {
- shader->tag_update(scene);
- }
}
/* Sync World */
@@ -1484,7 +1474,6 @@ void BlenderSync::sync_world(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d,
}
shader->set_graph(graph);
- shader->tag_update(scene);
}
PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
@@ -1503,8 +1492,6 @@ void BlenderSync::sync_world(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d,
background->set_use_shader(view_layer.use_background_shader |
viewport_parameters.custom_viewport_parameters());
background->set_use_ao(background->get_use_ao() && view_layer.use_background_ao);
-
- background->tag_update(scene);
}
/* Sync Lights */
@@ -1544,7 +1531,6 @@ void BlenderSync::sync_lights(BL::Depsgraph &b_depsgraph, bool update_all)
}
shader->set_graph(graph);
- shader->tag_update(scene);
}
}
}
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 009bd5dfa16..ab91149a2fe 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -369,9 +369,6 @@ void BlenderSync::sync_integrator()
else {
integrator->set_ao_bounces(0);
}
-
- /* UPDATE_NONE as we don't want to tag the integrator as modified, just tag dependent things */
- integrator->tag_update(scene, Integrator::UPDATE_NONE);
}
/* Film */
@@ -710,7 +707,6 @@ void BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay,
RNA_END;
scene->film->set_pass_alpha_threshold(b_view_layer.pass_alpha_threshold());
- scene->integrator->tag_update(scene, Integrator::UPDATE_ALL);
}
void BlenderSync::free_data_after_sync(BL::Depsgraph &b_depsgraph)
diff --git a/intern/cycles/blender/blender_volume.cpp b/intern/cycles/blender/blender_volume.cpp
index 410f7a72cf5..3b82440ffad 100644
--- a/intern/cycles/blender/blender_volume.cpp
+++ b/intern/cycles/blender/blender_volume.cpp
@@ -311,9 +311,6 @@ void BlenderSync::sync_volume(BL::Object &b_ob, Volume *volume)
sync_smoke_volume(scene, b_ob, volume, b_scene.frame_current());
}
}
-
- /* Tag update. */
- volume->tag_update(scene, true);
}
CCL_NAMESPACE_END
diff --git a/intern/cycles/render/alembic.cpp b/intern/cycles/render/alembic.cpp
index 5942e512e60..0e38a651d05 100644
--- a/intern/cycles/render/alembic.cpp
+++ b/intern/cycles/render/alembic.cpp
@@ -1549,11 +1549,6 @@ void AlembicProcedural::read_mesh(Scene *scene,
memcpy(
attr->data_float3(), mesh->get_verts().data(), sizeof(float3) * mesh->get_verts().size());
}
-
- if (mesh->is_modified()) {
- bool need_rebuild = mesh->triangles_is_modified();
- mesh->tag_update(scene, need_rebuild);
- }
}
void AlembicProcedural::read_subd(Scene *scene,
@@ -1671,17 +1666,6 @@ void AlembicProcedural::read_subd(Scene *scene,
memcpy(
attr->data_float3(), mesh->get_verts().data(), sizeof(float3) * mesh->get_verts().size());
}
-
- if (mesh->is_modified()) {
- bool need_rebuild = (mesh->triangles_is_modified()) ||
- (mesh->subd_num_corners_is_modified()) ||
- (mesh->subd_shader_is_modified()) || (mesh->subd_smooth_is_modified()) ||
- (mesh->subd_ptex_offset_is_modified()) ||
- (mesh->subd_start_corner_is_modified()) ||
- (mesh->subd_face_corners_is_modified());
-
- mesh->tag_update(scene, need_rebuild);
- }
}
void AlembicProcedural::read_curves(Scene *scene,
@@ -1755,9 +1739,6 @@ void AlembicProcedural::read_curves(Scene *scene,
generated[i] = hair->get_curve_keys()[hair->get_curve(i).first_key];
}
}
-
- const bool rebuild = (hair->curve_keys_is_modified() || hair->curve_radius_is_modified());
- hair->tag_update(scene, rebuild);
}
void AlembicProcedural::walk_hierarchy(
diff --git a/intern/cycles/render/attribute.cpp b/intern/cycles/render/attribute.cpp
index ce4ae6e4295..6b984ddc03e 100644
--- a/intern/cycles/render/attribute.cpp
+++ b/intern/cycles/render/attribute.cpp
@@ -429,6 +429,8 @@ Attribute *AttributeSet::add(ustring name, TypeDesc type, AttributeElement eleme
{
Attribute *attr = find(name);
+ geometry->tag_modified();
+
if (attr) {
/* return if same already exists */
if (attr->type == type && attr->element == element)
@@ -465,6 +467,8 @@ void AttributeSet::remove(ustring name)
return;
}
}
+
+ geometry->tag_modified();
}
}
@@ -610,6 +614,8 @@ void AttributeSet::remove(AttributeStandard std)
return;
}
}
+
+ geometry->tag_modified();
}
}
@@ -636,6 +642,8 @@ void AttributeSet::resize(bool reserve_only)
foreach (Attribute &attr, attributes) {
attr.resize(geometry, prim, reserve_only);
}
+
+ geometry->tag_modified();
}
void AttributeSet::clear(bool preserve_voxel_data)
@@ -655,6 +663,8 @@ void AttributeSet::clear(bool preserve_voxel_data)
else {
attributes.clear();
}
+
+ geometry->tag_modified();
}
void AttributeSet::update(AttributeSet &&new_attributes)
diff --git a/intern/cycles/render/background.cpp b/intern/cycles/render/background.cpp
index 1303f894912..ccb6def7a95 100644
--- a/intern/cycles/render/background.cpp
+++ b/intern/cycles/render/background.cpp
@@ -128,10 +128,16 @@ void Background::device_free(Device * /*device*/, DeviceScene * /*dscene*/)
{
}
-void Background::tag_update(Scene *scene)
+void Background::flush_modified(Scene *scene)
{
+ Shader *bg_shader = get_shader(scene);
+
+ if (bg_shader->is_modified()) {
+ tag_modified();
+ }
+
if (ao_factor_is_modified() || use_ao_is_modified()) {
- scene->integrator->tag_update(scene, Integrator::BACKGROUND_AO_MODIFIED);
+ scene->integrator->tag_ao_bounces_modified();
}
}
diff --git a/intern/cycles/render/background.h b/intern/cycles/render/background.h
index e89ffbc2445..af09c909516 100644
--- a/intern/cycles/render/background.h
+++ b/intern/cycles/render/background.h
@@ -53,7 +53,7 @@ class Background : public Node {
void device_update(Device *device, DeviceScene *dscene, Scene *scene);
void device_free(Device *device, DeviceScene *dscene);
- void tag_update(Scene *scene);
+ void flush_modified(Scene *scene);
Shader *get_shader(const Scene *scene);
};
diff --git a/intern/cycles/render/bake.cpp b/intern/cycles/render/bake.cpp
index 2bee7f4477a..bd109f7d635 100644
--- a/intern/cycles/render/bake.cpp
+++ b/intern/cycles/render/bake.cpp
@@ -99,26 +99,34 @@ void BakeManager::set(Scene *scene,
type = type_;
pass_filter = shader_type_to_pass_filter(type_, pass_filter_);
- /* TODO: fix */
+ scene->clear_passes();
-#if 0
- Pass::add(PASS_BAKE_PRIMITIVE, scene->passes);
- Pass::add(PASS_BAKE_DIFFERENTIAL, scene->passes);
+ /* Combined pass for output. */
+ Pass *pass = scene->create_node<Pass>();
+ pass->set_pass_type(PASS_COMBINED);
+ pass->set_name(ustring("Combined"));
+
+ /* Passes for input coordinates and differentials. */
+ pass = scene->create_node<Pass>();
+ pass->set_pass_type(PASS_BAKE_PRIMITIVE);
+ pass = scene->create_node<Pass>();
+ pass->set_pass_type(PASS_BAKE_DIFFERENTIAL);
if (type == SHADER_EVAL_UV) {
/* force UV to be available */
- Pass::add(PASS_UV, scene->passes);
+ pass = scene->create_node<Pass>();
+ pass->set_pass_type(PASS_UV);
}
/* force use_light_pass to be true if we bake more than just colors */
if (pass_filter & ~BAKE_FILTER_COLOR) {
- Pass::add(PASS_LIGHT, scene->passes);
+ pass = scene->create_node<Pass>();
+ pass->set_pass_type(PASS_LIGHT);
}
-#endif
/* create device and update scene */
scene->film->tag_modified();
- scene->integrator->tag_update(scene, Integrator::UPDATE_ALL);
+ scene->integrator->tag_modified();
need_update_ = true;
}
diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp
index 1e2097c439d..1f012b66322 100644
--- a/intern/cycles/render/film.cpp
+++ b/intern/cycles/render/film.cpp
@@ -103,7 +103,6 @@ static bool compare_pass_order(const BufferPass &a, const BufferPass &b)
return (a.components > b.components);
}
-/* TODO: validation! */
void BufferPass::add(vector<BufferPass> &passes, PassType type, const char *name)
{
for (size_t i = 0; i < passes.size(); i++) {
@@ -691,12 +690,12 @@ void Film::device_free(Device * /*device*/, DeviceScene * /*dscene*/, Scene *sce
scene->lookup_tables->remove_table(&filter_table_offset);
}
-void Film::flush_passes(Scene *scene)
+void Film::flush_modified(Scene *scene)
{
- /* Convert passes in the scene to render buffer passes. */
+ /* Convert passes in the scene to render buffer passes. In the process
+ * passes are validated, and additionality utility passes may be added. */
vector<BufferPass> new_buffer_passes;
- /* TODO: NULL name? */
for (Pass *pass : scene->passes) {
BufferPass::add(new_buffer_passes, pass->get_pass_type(), pass->get_name().c_str());
}
@@ -720,7 +719,7 @@ void Film::flush_passes(Scene *scene)
}
else if (BufferPass::contains(buffer_passes, PASS_AO) !=
BufferPass::contains(new_buffer_passes, PASS_AO)) {
- scene->integrator->tag_update(scene, Integrator::AO_PASS_MODIFIED);
+ scene->integrator->tag_ao_bounces_modified();
}
/* Assign new buffer passes. */
diff --git a/intern/cycles/render/film.h b/intern/cycles/render/film.h
index bf16416a2fb..1d3139be58f 100644
--- a/intern/cycles/render/film.h
+++ b/intern/cycles/render/film.h
@@ -120,7 +120,7 @@ class Film : public Node {
void update_denoising(const DenoiseParams &denoising);
bool use_denoising() const;
- void flush_passes(Scene *scene);
+ void flush_modified(Scene *scene);
const bool need_pass(const PassType type);
vector<BufferPass> buffer_passes;
diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp
index 9ea56b30ffa..9e24d249383 100644
--- a/intern/cycles/render/geometry.cpp
+++ b/intern/cycles/render/geometry.cpp
@@ -259,10 +259,13 @@ bool Geometry::has_voxel_attributes() const
return false;
}
-void Geometry::tag_update(Scene *scene, bool rebuild)
+void Geometry::flush_modified(Scene *scene)
{
- if (rebuild) {
- need_update_rebuild = true;
+ if (!is_modified()) {
+ return;
+ }
+
+ if (need_update_rebuild) {
scene->light_manager->tag_update(scene, LightManager::MESH_NEED_REBUILD);
}
else {
@@ -278,15 +281,6 @@ void Geometry::tag_update(Scene *scene, bool rebuild)
scene->geometry_manager->tag_update(scene, GeometryManager::GEOMETRY_MODIFIED);
}
-void Geometry::tag_bvh_update(bool rebuild)
-{
- tag_modified();
-
- if (rebuild) {
- need_update_rebuild = true;
- }
-}
-
/* Geometry Manager */
GeometryManager::GeometryManager()
@@ -964,7 +958,10 @@ 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->tag_modified();
+ if (has_optix_bvh) {
+ geom->need_update_rebuild = true;
+ }
}
if (geom->geometry_type == Geometry::MESH || geom->geometry_type == Geometry::VOLUME) {
diff --git a/intern/cycles/render/geometry.h b/intern/cycles/render/geometry.h
index 88388f31a9b..a955658295b 100644
--- a/intern/cycles/render/geometry.h
+++ b/intern/cycles/render/geometry.h
@@ -161,9 +161,7 @@ class Geometry : public Node {
}
/* Updates */
- void tag_update(Scene *scene, bool rebuild);
-
- void tag_bvh_update(bool rebuild);
+ virtual void flush_modified(Scene *scene);
};
/* Geometry Manager */
diff --git a/intern/cycles/render/hair.cpp b/intern/cycles/render/hair.cpp
index e94cad6b32e..6a4ccd6c81d 100644
--- a/intern/cycles/render/hair.cpp
+++ b/intern/cycles/render/hair.cpp
@@ -530,4 +530,15 @@ void Hair::pack_primitives(PackedBVH *pack, int object, uint visibility, bool pa
}
}
+void Hair::flush_modified(Scene *scene)
+{
+ if (!is_modified()) {
+ return;
+ }
+
+ need_update_rebuild |= (curve_keys_is_modified() || curve_radius_is_modified());
+
+ Geometry::flush_modified(scene);
+}
+
CCL_NAMESPACE_END
diff --git a/intern/cycles/render/hair.h b/intern/cycles/render/hair.h
index 4b949f984e5..e6f25636ff6 100644
--- a/intern/cycles/render/hair.h
+++ b/intern/cycles/render/hair.h
@@ -145,8 +145,10 @@ class Hair : public Geometry {
/* BVH */
void pack_curves(Scene *scene, float4 *curve_key_co, float4 *curve_data, size_t curvekey_offset);
-
void pack_primitives(PackedBVH *pack, int object, uint visibility, bool pack_all) override;
+
+ /* Update */
+ void flush_modified(Scene *scene) override;
};
CCL_NAMESPACE_END
diff --git a/intern/cycles/render/integrator.cpp b/intern/cycles/render/integrator.cpp
index c8436b91871..5c730df4af4 100644
--- a/intern/cycles/render/integrator.cpp
+++ b/intern/cycles/render/integrator.cpp
@@ -289,21 +289,10 @@ void Integrator::device_free(Device *, DeviceScene *dscene, bool force_free)
dscene->sample_pattern_lut.free_if_need_realloc(force_free);
}
-void Integrator::tag_update(Scene *scene, uint32_t flag)
+void Integrator::flush_modified(Scene *scene)
{
- if (flag & UPDATE_ALL) {
- tag_modified();
- }
-
- if (flag & (AO_PASS_MODIFIED | BACKGROUND_AO_MODIFIED)) {
- /* tag only the ao_bounces socket as modified so we avoid updating sample_pattern_lut
- * unnecessarily */
- tag_ao_bounces_modified();
- }
-
- if ((flag & LIGHT_SAMPLES_MODIFIED) && (method == BRANCHED_PATH)) {
- /* the number of light samples may affect the size of the sample_pattern_lut */
- tag_sampling_pattern_modified();
+ if (!is_modified()) {
+ return;
}
if (filter_glossy_is_modified()) {
diff --git a/intern/cycles/render/integrator.h b/intern/cycles/render/integrator.h
index 4eeeda92d41..43f73925c1f 100644
--- a/intern/cycles/render/integrator.h
+++ b/intern/cycles/render/integrator.h
@@ -106,7 +106,7 @@ class Integrator : public Node {
void device_update(Device *device, DeviceScene *dscene, Scene *scene);
void device_free(Device *device, DeviceScene *dscene, bool force_free = false);
- void tag_update(Scene *scene, uint32_t flag);
+ void flush_modified(Scene *scene);
};
CCL_NAMESPACE_END
diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp
index 1e54a237816..39675b4e5cb 100644
--- a/intern/cycles/render/light.cpp
+++ b/intern/cycles/render/light.cpp
@@ -160,13 +160,13 @@ Light::Light() : Node(node_type)
{
}
-void Light::tag_update(Scene *scene)
+void Light::flush_modified(Scene *scene)
{
if (is_modified()) {
scene->light_manager->tag_update(scene, LightManager::LIGHT_MODIFIED);
if (samples_is_modified()) {
- scene->integrator->tag_update(scene, Integrator::LIGHT_SAMPLES_MODIFIED);
+ scene->integrator->tag_sampling_pattern_modified();
}
}
}
@@ -738,6 +738,9 @@ void LightManager::device_update_points(Device *, DeviceScene *dscene, Scene *sc
if (light->is_enabled || light->is_portal) {
num_lights++;
}
+
+ /* TODO: bugfix for master? */
+ light->clear_modified();
}
KernelLight *klights = dscene->lights.alloc(num_lights);
diff --git a/intern/cycles/render/light.h b/intern/cycles/render/light.h
index 39014b5d667..71b9c8d8e7f 100644
--- a/intern/cycles/render/light.h
+++ b/intern/cycles/render/light.h
@@ -81,7 +81,7 @@ class Light : public Node {
NODE_SOCKET_API(int, max_bounces)
NODE_SOCKET_API(uint, random_id)
- void tag_update(Scene *scene);
+ void flush_modified(Scene *scene);
/* Check whether the light has contribution the scene. */
bool has_contribution(Scene *scene);
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 5f62da8f18b..f37dccaa452 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -844,4 +844,18 @@ void Mesh::pack_primitives(ccl::PackedBVH *pack, int object, uint visibility, bo
}
}
+void Mesh::flush_modified(Scene *scene)
+{
+ if (!is_modified()) {
+ return;
+ }
+
+ need_update_rebuild |= (triangles_is_modified()) || (subd_num_corners_is_modified()) ||
+ (subd_shader_is_modified()) || (subd_smooth_is_modified()) ||
+ (subd_ptex_offset_is_modified()) || (subd_start_corner_is_modified()) ||
+ (subd_face_corners_is_modified());
+
+ Geometry::flush_modified(scene);
+}
+
CCL_NAMESPACE_END
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index 2b0ff92ab62..59378a4ddee 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -255,6 +255,8 @@ class Mesh : public Geometry {
return num_subd_verts;
}
+ virtual void flush_modified(Scene *scene) override;
+
protected:
void clear(bool preserve_shaders, bool preserve_voxel_data);
};
diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp
index 0f16a4fc12c..0f708c8b6d6 100644
--- a/intern/cycles/render/object.cpp
+++ b/intern/cycles/render/object.cpp
@@ -207,16 +207,16 @@ void Object::apply_transform(bool apply_to_motion)
* transform_applied boolean */
}
-void Object::tag_update(Scene *scene)
+void Object::flush_modified(Scene *scene)
{
- uint32_t flag = ObjectManager::UPDATE_NONE;
+ if (!is_modified()) {
+ return;
+ }
- if (is_modified()) {
- flag |= ObjectManager::OBJECT_MODIFIED;
+ uint32_t flag = ObjectManager::OBJECT_MODIFIED;
- if (use_holdout_is_modified()) {
- flag |= ObjectManager::HOLDOUT_MODIFIED;
- }
+ if (use_holdout_is_modified()) {
+ flag |= ObjectManager::HOLDOUT_MODIFIED;
}
if (geometry) {
diff --git a/intern/cycles/render/object.h b/intern/cycles/render/object.h
index cf1b9ca510a..39492067a06 100644
--- a/intern/cycles/render/object.h
+++ b/intern/cycles/render/object.h
@@ -75,7 +75,7 @@ class Object : public Node {
Object();
~Object();
- void tag_update(Scene *scene);
+ void flush_modified(Scene *scene);
void compute_bounds(bool motion_blur);
void apply_transform(bool apply_to_motion);
diff --git a/intern/cycles/render/particles.cpp b/intern/cycles/render/particles.cpp
index 0e168050281..7601f99f618 100644
--- a/intern/cycles/render/particles.cpp
+++ b/intern/cycles/render/particles.cpp
@@ -44,11 +44,6 @@ ParticleSystem::~ParticleSystem()
{
}
-void ParticleSystem::tag_update(Scene *scene)
-{
- scene->particle_system_manager->tag_update(scene);
-}
-
/* Particle System Manager */
ParticleSystemManager::ParticleSystemManager()
diff --git a/intern/cycles/render/particles.h b/intern/cycles/render/particles.h
index 8b59756f148..5470d3f58ef 100644
--- a/intern/cycles/render/particles.h
+++ b/intern/cycles/render/particles.h
@@ -49,8 +49,6 @@ class ParticleSystem : public Node {
ParticleSystem();
~ParticleSystem();
- void tag_update(Scene *scene);
-
array<Particle> particles;
};
diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp
index f6b8e6166e2..91ecc0eeca8 100644
--- a/intern/cycles/render/scene.cpp
+++ b/intern/cycles/render/scene.cpp
@@ -210,6 +210,28 @@ void Scene::free_memory(bool final)
}
}
+void Scene::flush_modified()
+{
+ /* Flush modified flags between dependencies, in preparation of updating.
+ * The order of flushing matters. */
+ film->flush_modified(this);
+ background->flush_modified(this);
+ integrator->flush_modified(this);
+
+ foreach (Shader *shader, shaders) {
+ shader->flush_modified(this);
+ }
+ foreach (Light *light, lights) {
+ light->flush_modified(this);
+ }
+ foreach (Object *object, objects) {
+ object->flush_modified(this);
+ }
+ foreach (Geometry *geom, geometry) {
+ geom->flush_modified(this);
+ }
+}
+
void Scene::device_update(Device *device_, Progress &progress)
{
if (!device)
@@ -221,9 +243,6 @@ void Scene::device_update(Device *device_, Progress &progress)
update_stats->clear();
}
- /* TODO: move */
- film->flush_passes(this);
-
scoped_callback_timer timer([this, print_stats](double time) {
if (update_stats) {
update_stats->scene.times.add_entry({"device_update", time});
@@ -429,9 +448,7 @@ void Scene::reset()
dicing_camera->tag_modified();
film->tag_modified();
background->tag_modified();
-
- background->tag_update(this);
- integrator->tag_update(this, Integrator::UPDATE_ALL);
+ integrator->tag_modified();
object_manager->tag_update(this, ObjectManager::UPDATE_ALL);
geometry_manager->tag_update(this, GeometryManager::UPDATE_ALL);
light_manager->tag_update(this, LightManager::UPDATE_ALL);
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index a681b1a329f..e671c6f75bc 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -274,8 +274,6 @@ class Scene : public NodeOwner {
Scene(const SceneParams ¶ms, Device *device);
~Scene();
- void device_update(Device *device, Progress &progress);
-
bool need_global_attribute(AttributeStandard std);
void need_global_attributes(AttributeRequestSet &attributes);
@@ -283,6 +281,10 @@ class Scene : public NodeOwner {
MotionType need_motion();
float motion_shutter_time();
+ /* Must be called after making scene modifications, and before checking
+ * need_update() or need_reset(). */
+ void flush_modified();
+
bool need_update();
bool need_reset();
@@ -345,6 +347,8 @@ class Scene : public NodeOwner {
void clear_passes();
protected:
+ void device_update(Device *device, Progress &progress);
+
/* Check if some heavy data worth logging was updated.
* Mainly used to suppress extra annoying logging.
*/
diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h
index 3a1ef00b105..034d4ad8636 100644
--- a/intern/cycles/render/session.h
+++ b/intern/cycles/render/session.h
@@ -173,8 +173,7 @@ class Session {
void release_scene()
{
/* TODO: assert. */
- /* TODO: flush all */
- scene->film->flush_passes(scene);
+ scene->flush_modified();
scene->mutex.unlock();
}
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index 1e97a7476ca..90c68169333 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -214,6 +214,7 @@ Shader::Shader() : Node(node_type)
has_integrator_dependency = false;
has_volume_connected = false;
prev_volume_step_rate = 0.0f;
+ prev_has_volume = false;
displacement_method = DISPLACE_BUMP;
@@ -306,37 +307,11 @@ void Shader::set_graph(ShaderGraph *graph_)
/* Store info here before graph optimization to make sure that
* nodes that get optimized away still count. */
has_volume_connected = (graph->output()->input("Volume")->link != NULL);
-}
-
-void Shader::tag_update(Scene *scene)
-{
- /* update tag */
- tag_modified();
-
- scene->shader_manager->tag_update(scene, ShaderManager::SHADER_MODIFIED);
-
- /* if the shader previously was emissive, update light distribution,
- * if the new shader is emissive, a light manager update tag will be
- * done in the shader manager device update. */
- if (use_mis && has_surface_emission)
- scene->light_manager->tag_update(scene, LightManager::SHADER_MODIFIED);
-
- /* Special handle of background MIS light for now: for some reason it
- * has use_mis set to false. We are quite close to release now, so
- * better to be safe.
- */
- if (this == scene->background->get_shader(scene)) {
- scene->light_manager->need_update_background = true;
- if (scene->light_manager->has_background_light(scene)) {
- scene->light_manager->tag_update(scene, LightManager::SHADER_MODIFIED);
- }
- }
/* quick detection of which kind of shaders we have to avoid loading
* e.g. surface attributes when there is only a volume shader. this could
* be more fine grained but it's better than nothing */
OutputNode *output = graph->output();
- bool prev_has_volume = has_volume;
has_surface = has_surface || output->input("Surface")->link;
has_volume = has_volume || output->input("Volume")->link;
has_displacement = has_displacement || output->input("Displacement")->link;
@@ -356,17 +331,50 @@ void Shader::tag_update(Scene *scene)
if (displacement_method == DISPLACE_BOTH) {
attributes.add(ATTR_STD_POSITION_UNDISPLACED);
}
- if (displacement_method_is_modified()) {
- need_update_displacement = true;
- scene->geometry_manager->tag_update(scene, GeometryManager::SHADER_DISPLACEMENT_MODIFIED);
- scene->object_manager->need_flags_update = true;
- }
}
/* compare if the attributes changed, mesh manager will check
* need_update_attribute, update the relevant meshes and clear it. */
if (attributes.modified(prev_attributes)) {
need_update_attribute = true;
+ }
+
+ tag_modified();
+}
+
+void Shader::flush_modified(Scene *scene)
+{
+ if (!is_modified()) {
+ return;
+ }
+
+ scene->shader_manager->tag_update(scene, ShaderManager::SHADER_MODIFIED);
+
+ /* if the shader previously was emissive, update light distribution,
+ * if the new shader is emissive, a light manager update tag will be
+ * done in the shader manager device update. */
+ if (use_mis && has_surface_emission) {
+ scene->light_manager->tag_update(scene, LightManager::SHADER_MODIFIED);
+ }
+
+ /* Special handle of background MIS light for now: for some reason it
+ * has use_mis set to false. We are quite close to release now, so
+ * better to be safe.
+ */
+ if (this == scene->background->get_shader(scene)) {
+ scene->light_manager->need_update_background = true;
+ if (scene->light_manager->has_background_light(scene)) {
+ scene->light_manager->tag_update(scene, LightManager::SHADER_MODIFIED);
+ }
+ }
+
+ if (has_displacement && displacement_method_is_modified()) {
+ need_update_displacement = true;
+ scene->geometry_manager->tag_update(scene, GeometryManager::SHADER_DISPLACEMENT_MODIFIED);
+ scene->object_manager->need_flags_update = true;
+ }
+
+ if (need_update_attribute) {
scene->geometry_manager->tag_update(scene, GeometryManager::SHADER_ATTRIBUTE_MODIFIED);
scene->procedural_manager->tag_update();
}
@@ -375,6 +383,7 @@ void Shader::tag_update(Scene *scene)
scene->geometry_manager->need_flags_update = true;
scene->object_manager->need_flags_update = true;
prev_volume_step_rate = volume_step_rate;
+ prev_has_volume = has_volume;
}
}
@@ -638,7 +647,6 @@ void ShaderManager::add_default(Scene *scene)
shader->name = "default_surface";
shader->set_graph(graph);
scene->default_surface = shader;
- shader->tag_update(scene);
}
/* default volume */
@@ -654,7 +662,6 @@ void ShaderManager::add_default(Scene *scene)
shader->name = "default_volume";
shader->set_graph(graph);
scene->default_volume = shader;
- shader->tag_update(scene);
}
/* default light */
@@ -672,7 +679,6 @@ void ShaderManager::add_default(Scene *scene)
shader->name = "default_light";
shader->set_graph(graph);
scene->default_light = shader;
- shader->tag_update(scene);
}
/* default background */
@@ -683,7 +689,6 @@ void ShaderManager::add_default(Scene *scene)
shader->name = "default_background";
shader->set_graph(graph);
scene->default_background = shader;
- shader->tag_update(scene);
}
/* default empty */
@@ -694,7 +699,6 @@ void ShaderManager::add_default(Scene *scene)
shader->name = "default_empty";
shader->set_graph(graph);
scene->default_empty = shader;
- shader->tag_update(scene);
}
}
diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h
index 3f6a1d6af51..26ed353ab7e 100644
--- a/intern/cycles/render/shader.h
+++ b/intern/cycles/render/shader.h
@@ -98,6 +98,7 @@ class Shader : public Node {
NODE_SOCKET_API(DisplacementMethod, displacement_method)
float prev_volume_step_rate;
+ bool prev_has_volume;
/* synchronization */
bool need_update_uvs;
@@ -152,10 +153,10 @@ class Shader : public Node {
bool is_constant_emission(float3 *emission);
void set_graph(ShaderGraph *graph);
- void tag_update(Scene *scene);
void tag_used(Scene *scene);
bool need_update_geometry() const;
+ void flush_modified(Scene *scene);
};
/* Shader Manager virtual base class
diff --git a/intern/cycles/render/volume.cpp b/intern/cycles/render/volume.cpp
index a1bd16798fb..76fb40de4ff 100644
--- a/intern/cycles/render/volume.cpp
+++ b/intern/cycles/render/volume.cpp
@@ -632,4 +632,15 @@ void GeometryManager::create_volume_mesh(Volume *volume, Progress &progress)
<< "Mb.";
}
+void Volume::flush_modified(Scene *scene)
+{
+ if (!is_modified()) {
+ return;
+ }
+
+ need_update_rebuild = true;
+
+ Mesh::flush_modified(scene);
+}
+
CCL_NAMESPACE_END
diff --git a/intern/cycles/render/volume.h b/intern/cycles/render/volume.h
index 2e9703bf7ed..85fff32bc75 100644
--- a/intern/cycles/render/volume.h
+++ b/intern/cycles/render/volume.h
@@ -33,6 +33,7 @@ class Volume : public Mesh {
NODE_SOCKET_API(bool, object_space)
virtual void clear(bool preserve_shaders = false) override;
+ virtual void flush_modified(Scene *scene) override;
};
CCL_NAMESPACE_END
Event Timeline
Brecht Van Lommel (brecht)
created this paste.
Feb 17 2021, 3:22 AM
Brecht Van Lommel (brecht)
mentioned this in
D10210: Cycles: Support for accessing custom mesh attributes.
.
Feb 17 2021, 3:26 AM
Log In to Comment