diff options
Diffstat (limited to 'intern/cycles/render/scene.cpp')
-rw-r--r-- | intern/cycles/render/scene.cpp | 123 |
1 files changed, 101 insertions, 22 deletions
diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp index 8f863b5d15f..98c256a43b5 100644 --- a/intern/cycles/render/scene.cpp +++ b/intern/cycles/render/scene.cpp @@ -95,7 +95,8 @@ Scene::Scene(const SceneParams ¶ms_, Device *device) default_empty(NULL), device(device), dscene(device), - params(params_) + params(params_), + update_stats(NULL) { memset((void *)&dscene.data, 0, sizeof(dscene.data)); @@ -188,6 +189,7 @@ void Scene::free_memory(bool final) delete particle_system_manager; delete image_manager; delete bake_manager; + delete update_stats; } } @@ -198,6 +200,20 @@ void Scene::device_update(Device *device_, Progress &progress) bool print_stats = need_data_update(); + if (update_stats) { + update_stats->clear(); + } + + scoped_callback_timer timer([this, print_stats](double time) { + if (update_stats) { + update_stats->scene.times.add_entry({"device_update", time}); + + if (print_stats) { + printf("Update statistics:\n%s\n", update_stats->full_report().c_str()); + } + } + }); + /* The order of updates is important, because there's dependencies between * the different managers, using data computed by previous managers. * @@ -269,7 +285,7 @@ void Scene::device_update(Device *device_, Progress &progress) return; progress.set_status("Updating Lookup Tables"); - lookup_tables->device_update(device, &dscene); + lookup_tables->device_update(device, &dscene, this); if (progress.get_cancel() || device->have_error()) return; @@ -293,7 +309,7 @@ void Scene::device_update(Device *device_, Progress &progress) return; progress.set_status("Updating Lookup Tables"); - lookup_tables->device_update(device, &dscene); + lookup_tables->device_update(device, &dscene, this); if (progress.get_cancel() || device->have_error()) return; @@ -323,7 +339,7 @@ void Scene::device_update(Device *device_, Progress &progress) Scene::MotionType Scene::need_motion() { - if (integrator->motion_blur) + if (integrator->get_motion_blur()) return MOTION_BLUR; else if (Pass::contains(passes, PASS_MOTION)) return MOTION_PASS; @@ -336,7 +352,7 @@ float Scene::motion_shutter_time() if (need_motion() == Scene::MOTION_PASS) return 2.0f; else - return camera->shuttertime; + return camera->get_shuttertime(); } bool Scene::need_global_attribute(AttributeStandard std) @@ -360,20 +376,21 @@ void Scene::need_global_attributes(AttributeRequestSet &attributes) bool Scene::need_update() { - return (need_reset() || film->need_update); + return (need_reset() || film->is_modified()); } bool Scene::need_data_update() { - return (background->need_update || image_manager->need_update || object_manager->need_update || + return (background->is_modified() || image_manager->need_update || object_manager->need_update || geometry_manager->need_update || light_manager->need_update || - lookup_tables->need_update || integrator->need_update || shader_manager->need_update || - particle_system_manager->need_update || bake_manager->need_update || film->need_update); + lookup_tables->need_update || integrator->is_modified() || shader_manager->need_update || + particle_system_manager->need_update || bake_manager->need_update || + film->is_modified()); } bool Scene::need_reset() { - return need_data_update() || camera->need_update; + return need_data_update() || camera->is_modified(); } void Scene::reset() @@ -382,9 +399,9 @@ void Scene::reset() shader_manager->add_default(this); /* ensure all objects are updated */ - camera->tag_update(); - dicing_camera->tag_update(); - film->tag_update(this); + camera->tag_modified(); + dicing_camera->tag_modified(); + film->tag_modified(); background->tag_update(this); integrator->tag_update(this); object_manager->tag_update(this); @@ -404,6 +421,13 @@ void Scene::collect_statistics(RenderStats *stats) image_manager->collect_statistics(stats); } +void Scene::enable_update_stats() +{ + if (!update_stats) { + update_stats = new SceneUpdateStats(); + } +} + DeviceRequestedFeatures Scene::get_requested_device_features() { DeviceRequestedFeatures requested_features; @@ -419,24 +443,24 @@ DeviceRequestedFeatures Scene::get_requested_device_features() requested_features.use_object_motion = false; requested_features.use_camera_motion = use_motion && camera->use_motion(); foreach (Object *object, objects) { - Geometry *geom = object->geometry; + Geometry *geom = object->get_geometry(); if (use_motion) { - requested_features.use_object_motion |= object->use_motion() | geom->use_motion_blur; - requested_features.use_camera_motion |= geom->use_motion_blur; + requested_features.use_object_motion |= object->use_motion() | geom->get_use_motion_blur(); + requested_features.use_camera_motion |= geom->get_use_motion_blur(); } - if (object->is_shadow_catcher) { + if (object->get_is_shadow_catcher()) { requested_features.use_shadow_tricks = true; } - if (geom->type == Geometry::MESH) { + if (geom->is_mesh()) { Mesh *mesh = static_cast<Mesh *>(geom); #ifdef WITH_OPENSUBDIV - if (mesh->subdivision_type != Mesh::SUBDIVISION_NONE) { + if (mesh->get_subdivision_type() != Mesh::SUBDIVISION_NONE) { requested_features.use_patch_evaluation = true; } #endif requested_features.use_true_displacement |= mesh->has_true_displacement(); } - else if (geom->type == Geometry::HAIR) { + else if (geom->is_hair()) { requested_features.use_hair = true; } } @@ -444,8 +468,9 @@ DeviceRequestedFeatures Scene::get_requested_device_features() requested_features.use_background_light = light_manager->has_background_light(this); requested_features.use_baking = bake_manager->get_baking(); - requested_features.use_integrator_branched = (integrator->method == Integrator::BRANCHED_PATH); - if (film->denoising_data_pass) { + requested_features.use_integrator_branched = (integrator->get_method() == + Integrator::BRANCHED_PATH); + if (film->get_denoising_data_pass()) { requested_features.use_denoising = true; requested_features.use_shadow_tricks = true; } @@ -684,4 +709,58 @@ template<> void Scene::delete_node_impl(Shader * /*node*/) /* don't delete unused shaders, not supported */ } +template<typename T> +static void remove_nodes_in_set(const set<T *> &nodes_set, + vector<T *> &nodes_array, + const NodeOwner *owner) +{ + size_t new_size = nodes_array.size(); + + for (size_t i = 0; i < new_size; ++i) { + T *node = nodes_array[i]; + + if (nodes_set.find(node) != nodes_set.end()) { + std::swap(nodes_array[i], nodes_array[new_size - 1]); + + assert(node->get_owner() == owner); + delete node; + + i -= 1; + new_size -= 1; + } + } + + nodes_array.resize(new_size); + (void)owner; +} + +template<> void Scene::delete_nodes(const set<Light *> &nodes, const NodeOwner *owner) +{ + remove_nodes_in_set(nodes, lights, owner); + light_manager->tag_update(this); +} + +template<> void Scene::delete_nodes(const set<Geometry *> &nodes, const NodeOwner *owner) +{ + remove_nodes_in_set(nodes, geometry, owner); + geometry_manager->tag_update(this); +} + +template<> void Scene::delete_nodes(const set<Object *> &nodes, const NodeOwner *owner) +{ + remove_nodes_in_set(nodes, objects, owner); + object_manager->tag_update(this); +} + +template<> void Scene::delete_nodes(const set<ParticleSystem *> &nodes, const NodeOwner *owner) +{ + remove_nodes_in_set(nodes, particle_systems, owner); + particle_system_manager->tag_update(this); +} + +template<> void Scene::delete_nodes(const set<Shader *> & /*nodes*/, const NodeOwner * /*owner*/) +{ + /* don't delete unused shaders, not supported */ +} + CCL_NAMESPACE_END |