79 ccl::Film::add_default(
this);
80 ccl::ShaderManager::add_default(
this);
178 bool kernels_reloaded =
false;
187 update_stats->scene.times.add_entry({
"device_update", time});
198 if (
film->update_lightgroups(
this)) {
199 light_manager->tag_update(
this, ccl::LightManager::LIGHT_MODIFIED);
200 object_manager->tag_update(
this, ccl::ObjectManager::OBJECT_MODIFIED);
203 if (
film->exposure_is_modified()) {
217 film->update_passes(
this);
231 const uint kernel_features =
dscene.data.kernel_features;
290 progress.
set_status(
"Updating Particle Systems");
306 progress.
set_status(
"Updating Objects Flags");
314 progress.
set_status(
"Updating Primitive Offsets");
338 progress.
set_status(
"Updating Camera Volume");
345 progress.
set_status(
"Updating Lookup Tables");
375 progress.
set_status(
"Updating Lookup Tables");
389 if (
device->have_error() ==
false) {
392 progress.
set_status(
"Updating Device",
"Writing constant memory");
396 device->optimize_for_scene(
this);
402 LOG_INFO <<
"System memory statistics after full device sync:\n"
426 return camera->get_shuttertime();
486 film->tag_modified();
531 size_t kernel_max_prim_count = 0;
536 bool has_caustics_receiver =
false;
537 bool has_caustics_caster =
false;
538 bool has_caustics_light =
false;
541 if (object->get_is_caustics_caster()) {
542 has_caustics_caster =
true;
544 else if (object->get_is_caustics_receiver()) {
545 has_caustics_receiver =
true;
547 Geometry *geom =
object->get_geometry();
549 if (object->use_motion() || geom->get_use_motion_blur()) {
553 if (object->get_is_shadow_catcher() && !geom->
is_light()) {
557 const Hair *hair =
static_cast<const Hair *
>(geom);
560 kernel_max_prim_count =
max(kernel_max_prim_count, hair->
num_segments());
564 kernel_max_prim_count =
max(kernel_max_prim_count,
565 static_cast<PointCloud *
>(geom)->num_points());
568 kernel_max_prim_count =
max(kernel_max_prim_count,
569 static_cast<Mesh *
>(geom)->num_triangles());
572 const Light *light =
static_cast<const Light *
>(
object->get_geometry());
573 if (light->get_use_caustics()) {
574 has_caustics_light =
true;
577 if (object->has_light_linking()) {
580 if (object->has_shadow_linking()) {
585 dscene.data.integrator.use_caustics =
false;
586 if (
device->info.has_mnee && has_caustics_caster && has_caustics_receiver && has_caustics_light)
588 dscene.data.integrator.use_caustics =
true;
600 kernel_features |=
film->get_kernel_features(
this);
601 kernel_features |=
integrator->get_kernel_features();
602 kernel_features |=
camera->get_kernel_features();
604 dscene.data.kernel_features = kernel_features;
609 dscene.data.max_closures = max_closures;
614 if (
device->set_bvh_limits(
objects.size(), kernel_max_prim_count)) {
617 geom->need_update_rebuild =
true;
618 geom->tag_modified();
638 if (!
camera->set_screen_size(width, height)) {
644 progress.
set_status(
"Updating Device",
"Writing constant memory");
674 progress.
set_status(
"Loading render kernels (may take a few minutes the first time)");
678 const uint kernel_features =
dscene.data.kernel_features;
680 if (!
device->load_kernels(kernel_features)) {
681 string message =
device->error_message();
682 if (message.empty()) {
683 message =
"Failed loading render kernel, see console for errors";
705 int max_closures = 0;
709 const int num_closures = shader->
graph->get_num_closures();
710 max_closures =
max(max_closures, num_closures);
731 int volume_stack_size = 0;
738 volume_stack_size += 2;
742 bool has_volume_object =
false;
744 if (!object->get_geometry()->has_volume) {
748 if (object->intersects_volume) {
757 else if (!has_volume_object) {
762 has_volume_object =
true;
771 LOG_DEBUG <<
"Detected required volume stack size " << volume_stack_size;
773 return volume_stack_size;
784 if (object->get_is_shadow_catcher() && !object->get_geometry()->is_light()) {
804 return dscene.data.integrator.use_volumes;
820 Light *node_ptr = node.get();
821 node->set_owner(
this);
822 geometry.push_back(std::move(node));
830 Mesh *node_ptr = node.get();
831 node->set_owner(
this);
832 geometry.push_back(std::move(node));
840 Hair *node_ptr = node.get();
841 node->set_owner(
this);
842 geometry.push_back(std::move(node));
850 Volume *node_ptr = node.get();
851 node->set_owner(
this);
852 geometry.push_back(std::move(node));
861 node->set_owner(
this);
862 geometry.push_back(std::move(node));
870 Object *node_ptr = node.get();
871 node->set_owner(
this);
872 objects.push_back(std::move(node));
881 node->set_owner(
this);
890 Shader *node_ptr = node.get();
891 node->set_owner(
this);
892 shaders.push_back(std::move(node));
900 Pass *node_ptr = node.get();
901 node->set_owner(
this);
902 passes.push_back(std::move(node));
903 film->tag_modified();
910 Camera *node_ptr = node.get();
911 node->set_owner(
this);
912 cameras.push_back(std::move(node));
920 node->set_owner(
this);
929 node->set_owner(
this);
937 Film *node_ptr = node.get();
938 node->set_owner(
this);
939 films.push_back(std::move(node));
1002 if (node->get_geometry()->has_volume) {
1034 passes.erase_by_swap(node);
1035 film->tag_modified();
1044 for (
const T *node : nodes) {
1045 assert(node->get_owner() == owner);
1075 for (
Shader *shader : nodes) {
1076 shader->clear_reference_count();
1090 passes.erase_in_set(nodes);
1091 film->tag_modified();
bool is_pointcloud() const
size_t num_segments() const
CurveShapeType curve_shape
static bool contains(const unique_ptr_vector< Pass > &passes, PassType type)
void set_status(const string &status_, const string &substatus_="")
void set_error(const string &error_message_)
static unique_ptr< ShaderManager > create(const int shadingsystem)
static void add_default(Scene *scene)
NODE_DECLARE unique_ptr< ShaderGraph > graph
#define KERNEL_FEATURE_VOLUME
#define KERNEL_FEATURE_HAIR_RIBBON
#define KERNEL_FEATURE_NODE_PORTAL
#define MAX_VOLUME_STACK_SIZE
#define KERNEL_FEATURE_SHADOW_CATCHER
#define KERNEL_FEATURE_OBJECT_MOTION
#define KERNEL_FEATURE_PATH_GUIDING
#define KERNEL_FEATURE_TRANSPARENT
#define KERNEL_FEATURE_SUBSURFACE
#define KERNEL_FEATURE_NODE_BSDF
#define KERNEL_FEATURE_HAIR_THICK
#define KERNEL_FEATURE_NODE_VORONOI_EXTRA
#define KERNEL_FEATURE_NODE_VOLUME
#define KERNEL_FEATURE_PATH_TRACING
#define KERNEL_FEATURE_SHADOW_LINKING
#define KERNEL_FEATURE_DENOISING
#define KERNEL_FEATURE_LIGHT_LINKING
#define KERNEL_FEATURE_HAIR
#define KERNEL_FEATURE_NODE_RAYTRACE
#define KERNEL_FEATURE_BAKING
#define KERNEL_FEATURE_MNEE
#define KERNEL_FEATURE_POINTCLOUD
#define KERNEL_FEATURE_NODE_EMISSION
#define KERNEL_FEATURE_NODE_BUMP
#define CCL_NAMESPACE_END
#define assert(assertion)
size_t util_guarded_get_mem_used()
size_t util_guarded_get_mem_peak()
@ ATTR_STD_MOTION_VERTEX_NORMAL
@ ATTR_STD_VOLUME_VELOCITY_Y
@ ATTR_STD_VOLUME_VELOCITY_Z
@ ATTR_STD_VOLUME_VELOCITY
@ ATTR_STD_MOTION_VERTEX_POSITION
@ ATTR_STD_VOLUME_VELOCITY_X
#define MEM_GUARDED_CALL(progress, func,...)
static void assert_same_owner(const set< T * > &nodes, const NodeOwner *owner)
static void log_kernel_features(const uint features)
string string_from_bool(bool var)
string string_human_readable_size(size_t size)
string string_human_readable_number(size_t num)
int reference_count() const
const NodeOwner * get_owner() const
void clear_reference_count()
bool has_volume_modified() const
unique_ptr_vector< Procedural > procedurals
unique_ptr< ObjectManager > object_manager
bool need_global_attribute(AttributeStandard std)
MotionType need_motion() const
void need_global_attributes(AttributeRequestSet &attributes)
bool update(Progress &progress)
unique_ptr< LightManager > light_manager
unique_ptr< ParticleSystemManager > particle_system_manager
int get_max_closure_count()
bool scene_updated_while_loading_kernels
unique_ptr_vector< Geometry > geometry
unique_ptr< SceneUpdateStats > update_stats
bool has_volume_modified_
void tag_shadow_catcher_modified()
void free_memory(bool final)
unique_ptr_vector< Camera > cameras
unique_ptr_vector< Background > backgrounds
void enable_update_stats()
Shader * default_background
uint loaded_kernel_features
unique_ptr< BakeManager > bake_manager
bool shadow_catcher_modified_
void tag_has_volume_modified()
unique_ptr_vector< Shader > shaders
void update_kernel_features()
unique_ptr< ShaderManager > shader_manager
void delete_nodes(const set< T * > &nodes)
unique_ptr_vector< ParticleSystem > particle_systems
bool has_shadow_catcher()
unique_ptr< GeometryManager > geometry_manager
void delete_node(T *node)=delete
unique_ptr< OSLManager > osl_manager
unique_ptr_vector< Integrator > integrators
bool load_kernels(Progress &progress)
unique_ptr_vector< Object > objects
int get_volume_stack_size() const
unique_ptr< ImageManager > image_manager
unique_ptr< ProceduralManager > procedural_manager
bool need_reset(const bool check_camera=true)
bool update_camera_resolution(Progress &progress, int width, int height)
void collect_statistics(RenderStats *stats)
unique_ptr_vector< Pass > passes
unique_ptr_vector< Film > films
float motion_shutter_time()
unique_ptr< VolumeManager > volume_manager
unique_ptr< LookupTables > lookup_tables
void device_update(Device *device, Progress &progress)