[Bf-blender-cvs] [628a59e36de] cycles_procedural_api: add flags to update tagging for light and shader managers
Kévin Dietrich
noreply at git.blender.org
Fri Nov 6 18:48:00 CET 2020
Commit: 628a59e36de0c8a29521da467255bee1a2161f6a
Author: Kévin Dietrich
Date: Fri Nov 6 10:43:58 2020 +0100
Branches: cycles_procedural_api
https://developer.blender.org/rB628a59e36de0c8a29521da467255bee1a2161f6a
add flags to update tagging for light and shader managers
===================================================================
M intern/cycles/render/geometry.cpp
M intern/cycles/render/integrator.cpp
M intern/cycles/render/light.cpp
M intern/cycles/render/light.h
M intern/cycles/render/object.cpp
M intern/cycles/render/osl.cpp
M intern/cycles/render/scene.cpp
M intern/cycles/render/shader.cpp
M intern/cycles/render/shader.h
M intern/cycles/render/svm.cpp
===================================================================
diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp
index b2be93d2640..c73f9022ae9 100644
--- a/intern/cycles/render/geometry.cpp
+++ b/intern/cycles/render/geometry.cpp
@@ -262,13 +262,17 @@ void Geometry::tag_update(Scene *scene, bool rebuild)
{
if (rebuild) {
need_update_rebuild = true;
- scene->light_manager->need_update = true;
+ scene->light_manager->tag_update(scene, LightManager::MESH_NEED_REBUILD);
}
else {
- foreach (Node *node, used_shaders) {
- Shader *shader = static_cast<Shader *>(node);
- if (shader->has_surface_emission)
- scene->light_manager->need_update = true;
+ if (is_modified()) {
+ foreach (Node *node, used_shaders) {
+ Shader *shader = static_cast<Shader *>(node);
+ if (shader->has_surface_emission) {
+ scene->light_manager->tag_update(scene, LightManager::EMISSIVE_MESH_MODIFIED);
+ break;
+ }
+ }
}
}
diff --git a/intern/cycles/render/integrator.cpp b/intern/cycles/render/integrator.cpp
index 50775b1d08b..341e7274256 100644
--- a/intern/cycles/render/integrator.cpp
+++ b/intern/cycles/render/integrator.cpp
@@ -288,7 +288,7 @@ void Integrator::tag_update(Scene *scene, uint32_t flag)
if (filter_glossy_is_modified()) {
foreach (Shader *shader, scene->shaders) {
if (shader->has_integrator_dependency) {
- scene->shader_manager->need_update = true;
+ scene->shader_manager->tag_update(scene, ShaderManager::INTEGRATOR_MODIFIED);
break;
}
}
diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp
index 80190dcbf82..4b34bf958d7 100644
--- a/intern/cycles/render/light.cpp
+++ b/intern/cycles/render/light.cpp
@@ -162,7 +162,9 @@ Light::Light() : Node(node_type)
void Light::tag_update(Scene *scene)
{
- scene->light_manager->need_update = is_modified();
+ if (is_modified()) {
+ scene->light_manager->tag_update(scene, LightManager::LIGHT_MODIFIED);
+ }
}
bool Light::has_contribution(Scene *scene)
@@ -1013,7 +1015,7 @@ void LightManager::device_free(Device *, DeviceScene *dscene, const bool free_ba
dscene->ies_lights.free();
}
-void LightManager::tag_update(Scene * /*scene*/)
+void LightManager::tag_update(Scene * /*scene*/, uint32_t /*flag*/)
{
need_update = true;
}
diff --git a/intern/cycles/render/light.h b/intern/cycles/render/light.h
index e590e13b489..1f0ca50cad4 100644
--- a/intern/cycles/render/light.h
+++ b/intern/cycles/render/light.h
@@ -91,8 +91,21 @@ class Light : public Node {
class LightManager {
public:
- bool use_light_visibility;
+ enum {
+ LIGHT_MODIFIED = (1 << 0),
+ LIGHT_ADDED = (1 << 1),
+ LIGHT_REMOVED = (1 << 2),
+ MESH_NEED_REBUILD = (1 << 3),
+ EMISSIVE_MESH_MODIFIED = (1 << 4),
+ OBJECT_MANAGER = (1 << 5),
+ SHADER_COMPILED = (1 << 6),
+ SHADER_MODIFIED = (1 << 7),
+
+ UPDATE_ALL = ~0u,
+ };
+
bool need_update;
+ bool use_light_visibility;
/* Need to update background (including multiple importance map) */
bool need_update_background;
@@ -108,7 +121,7 @@ class LightManager {
void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress &progress);
void device_free(Device *device, DeviceScene *dscene, const bool free_background = true);
- void tag_update(Scene *scene);
+ void tag_update(Scene *scene, uint32_t flag);
/* Check whether there is a background light. */
bool has_background_light(Scene *scene);
diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp
index 4cf771646d8..b50b3b76d1b 100644
--- a/intern/cycles/render/object.cpp
+++ b/intern/cycles/render/object.cpp
@@ -226,7 +226,7 @@ void Object::tag_update(Scene *scene)
foreach (Node *node, geometry->get_used_shaders()) {
Shader *shader = static_cast<Shader *>(node);
if (shader->get_use_mis() && shader->has_surface_emission)
- scene->light_manager->need_update = true;
+ scene->light_manager->tag_update(scene, LightManager::EMISSIVE_MESH_MODIFIED);
}
}
@@ -946,7 +946,7 @@ void ObjectManager::tag_update(Scene *scene)
{
need_update = true;
scene->geometry_manager->need_update = true;
- scene->light_manager->need_update = true;
+ scene->light_manager->tag_update(scene, LightManager::OBJECT_MANAGER);
}
string ObjectManager::get_cryptomatte_objects(Scene *scene)
diff --git a/intern/cycles/render/osl.cpp b/intern/cycles/render/osl.cpp
index bea2c534bd1..c392a3b0a60 100644
--- a/intern/cycles/render/osl.cpp
+++ b/intern/cycles/render/osl.cpp
@@ -132,7 +132,7 @@ void OSLShaderManager::device_update(Device *device,
compiler.compile(og, shader);
if (shader->get_use_mis() && shader->has_surface_emission)
- scene->light_manager->need_update = true;
+ scene->light_manager->tag_update(scene, LightManager::SHADER_COMPILED);
}
/* setup shader engine */
diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp
index 7cbd4411cf4..f84bfa82c69 100644
--- a/intern/cycles/render/scene.cpp
+++ b/intern/cycles/render/scene.cpp
@@ -484,7 +484,7 @@ void Scene::reset()
integrator->tag_update(this, 0);
object_manager->tag_update(this);
geometry_manager->tag_update(this, GeometryManager::UPDATE_ALL);
- light_manager->tag_update(this);
+ light_manager->tag_update(this, LightManager::UPDATE_ALL);
particle_system_manager->tag_update(this);
procedural_manager->need_update = true;
}
@@ -674,7 +674,7 @@ template<> Light *Scene::create_node<Light>()
Light *node = new Light();
node->set_owner(this);
lights.push_back(node);
- light_manager->tag_update(this);
+ light_manager->tag_update(this, LightManager::LIGHT_ADDED);
return node;
}
@@ -729,7 +729,7 @@ template<> Shader *Scene::create_node<Shader>()
Shader *node = new Shader();
node->set_owner(this);
shaders.push_back(node);
- shader_manager->need_update = true;
+ shader_manager->tag_update(this, ShaderManager::SHADER_ADDED);
return node;
}
@@ -758,7 +758,7 @@ template<typename T> void delete_node_from_array(vector<T> &nodes, T node)
template<> void Scene::delete_node_impl(Light *node)
{
delete_node_from_array(lights, node);
- light_manager->tag_update(this);
+ light_manager->tag_update(this, LightManager::LIGHT_REMOVED);
}
template<> void Scene::delete_node_impl(Mesh *node)
@@ -845,7 +845,7 @@ static void remove_nodes_in_set(const set<T *> &nodes_set,
template<> void Scene::delete_nodes(const set<Light *> &nodes, const NodeOwner *owner)
{
remove_nodes_in_set(nodes, lights, owner);
- light_manager->tag_update(this);
+ light_manager->tag_update(this, LightManager::LIGHT_REMOVED);
}
template<> void Scene::delete_nodes(const set<Geometry *> &nodes, const NodeOwner *owner)
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index ce95c179ea1..c51a1a41691 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -310,13 +310,14 @@ void Shader::tag_update(Scene *scene)
{
/* update tag */
tag_modified();
- scene->shader_manager->need_update = true;
+
+ 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->need_update = true;
+ 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
@@ -325,7 +326,7 @@ void Shader::tag_update(Scene *scene)
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->need_update = true;
+ scene->light_manager->tag_update(scene, LightManager::SHADER_MODIFIED);
}
}
@@ -373,7 +374,7 @@ void Shader::tag_used(Scene *scene)
* recompiled because it was skipped for compilation before */
if (!used) {
tag_modified();
- scene->shader_manager->need_update = true;
+ scene->shader_manager->tag_update(scene, ShaderManager::SHADER_MODIFIED);
}
}
@@ -793,4 +794,9 @@ string ShaderManager::get_cryptomatte_materials(Scene *scene)
return manifest;
}
+void ShaderManager::tag_update(Scene */*scene*/, uint32_t /*flag*/)
+{
+ need_update = true;
+}
+
CCL_NAMESPACE_END
diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h
index 0a8d0b7adf8..9eb72d46c76 100644
--- a/intern/cycles/render/shader.h
+++ b/intern/cycles/render/shader.h
@@ -165,6 +165,12 @@ class Shader : public Node {
class ShaderManager {
public:
+ enum {
+ INTEGRATOR_MODIFIED = (1 << 0),
+ SHADER_ADDED = (1 << 1),
+ SHADER_MODIFIED = (1 << 2),
+ };
+
bool need_update;
static ShaderManager *create(int shadingsystem);
@@ -208,6 +214,8 @@ class ShaderManager {
string get_cryptomatte_materials(Scene *scene);
+ void tag_update(Scene *scene, uint32_t flag);
+
protected:
ShaderManager();
diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp
index b2bc17aec19..ccd52398d4c 100644
--- a/intern/cycles/render/svm.cpp
+++ b/intern/cycles/render/svm.cpp
@@ -125,7 +125,7 @@ void SVMShaderManager::device_update(Device *device,
shader->clear_modified();
if (shader->get_use_mis() && shader->has_surface_emission) {
- scene->light_manager->need_update = true;
+ scene->light_manager->tag_update(scene, LightManager::SHADER_COMPILED);
}
/* Update the global jump table.
More information about the Bf-blender-cvs
mailing list