Blender  V2.93
scene.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2011-2013 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <stdlib.h>
18 
19 #include "bvh/bvh.h"
20 #include "device/device.h"
21 #include "render/alembic.h"
22 #include "render/background.h"
23 #include "render/bake.h"
24 #include "render/camera.h"
25 #include "render/curves.h"
26 #include "render/film.h"
27 #include "render/integrator.h"
28 #include "render/light.h"
29 #include "render/mesh.h"
30 #include "render/object.h"
31 #include "render/osl.h"
32 #include "render/particles.h"
33 #include "render/procedural.h"
34 #include "render/scene.h"
35 #include "render/session.h"
36 #include "render/shader.h"
37 #include "render/svm.h"
38 #include "render/tables.h"
39 #include "render/volume.h"
40 
41 #include "util/util_foreach.h"
43 #include "util/util_logging.h"
44 #include "util/util_progress.h"
45 
47 
49  : bvh_nodes(device, "__bvh_nodes", MEM_GLOBAL),
50  bvh_leaf_nodes(device, "__bvh_leaf_nodes", MEM_GLOBAL),
51  object_node(device, "__object_node", MEM_GLOBAL),
52  prim_tri_index(device, "__prim_tri_index", MEM_GLOBAL),
53  prim_tri_verts(device, "__prim_tri_verts", MEM_GLOBAL),
54  prim_type(device, "__prim_type", MEM_GLOBAL),
55  prim_visibility(device, "__prim_visibility", MEM_GLOBAL),
56  prim_index(device, "__prim_index", MEM_GLOBAL),
57  prim_object(device, "__prim_object", MEM_GLOBAL),
58  prim_time(device, "__prim_time", MEM_GLOBAL),
59  tri_shader(device, "__tri_shader", MEM_GLOBAL),
60  tri_vnormal(device, "__tri_vnormal", MEM_GLOBAL),
61  tri_vindex(device, "__tri_vindex", MEM_GLOBAL),
62  tri_patch(device, "__tri_patch", MEM_GLOBAL),
63  tri_patch_uv(device, "__tri_patch_uv", MEM_GLOBAL),
64  curves(device, "__curves", MEM_GLOBAL),
65  curve_keys(device, "__curve_keys", MEM_GLOBAL),
66  patches(device, "__patches", MEM_GLOBAL),
67  objects(device, "__objects", MEM_GLOBAL),
68  object_motion_pass(device, "__object_motion_pass", MEM_GLOBAL),
69  object_motion(device, "__object_motion", MEM_GLOBAL),
70  object_flag(device, "__object_flag", MEM_GLOBAL),
71  object_volume_step(device, "__object_volume_step", MEM_GLOBAL),
72  camera_motion(device, "__camera_motion", MEM_GLOBAL),
73  attributes_map(device, "__attributes_map", MEM_GLOBAL),
74  attributes_float(device, "__attributes_float", MEM_GLOBAL),
75  attributes_float2(device, "__attributes_float2", MEM_GLOBAL),
76  attributes_float3(device, "__attributes_float3", MEM_GLOBAL),
77  attributes_uchar4(device, "__attributes_uchar4", MEM_GLOBAL),
78  light_distribution(device, "__light_distribution", MEM_GLOBAL),
79  lights(device, "__lights", MEM_GLOBAL),
80  light_background_marginal_cdf(device, "__light_background_marginal_cdf", MEM_GLOBAL),
81  light_background_conditional_cdf(device, "__light_background_conditional_cdf", MEM_GLOBAL),
82  particles(device, "__particles", MEM_GLOBAL),
83  svm_nodes(device, "__svm_nodes", MEM_GLOBAL),
84  shaders(device, "__shaders", MEM_GLOBAL),
85  lookup_table(device, "__lookup_table", MEM_GLOBAL),
86  sample_pattern_lut(device, "__sample_pattern_lut", MEM_GLOBAL),
87  ies_lights(device, "__ies", MEM_GLOBAL)
88 {
89  memset((void *)&data, 0, sizeof(data));
90 }
91 
92 Scene::Scene(const SceneParams &params_, Device *device)
93  : name("Scene"),
94  bvh(NULL),
95  default_surface(NULL),
96  default_volume(NULL),
97  default_light(NULL),
98  default_background(NULL),
99  default_empty(NULL),
100  device(device),
101  dscene(device),
102  params(params_),
103  update_stats(NULL),
104  kernels_loaded(false),
105  /* TODO(sergey): Check if it's indeed optimal value for the split kernel. */
106  max_closure_global(1)
107 {
108  memset((void *)&dscene.data, 0, sizeof(dscene.data));
109 
110  /* OSL only works on the CPU */
111  if (device->info.has_osl)
113  else
115 
116  light_manager = new LightManager();
121  bake_manager = new BakeManager();
123 
124  /* Create nodes after managers, since create_node() can tag the managers. */
125  camera = create_node<Camera>();
126  dicing_camera = create_node<Camera>();
127  lookup_tables = new LookupTables();
128  film = create_node<Film>();
129  background = create_node<Background>();
130  integrator = create_node<Integrator>();
131 
132  film->add_default(this);
134 }
135 
137 {
138  free_memory(true);
139 }
140 
141 void Scene::free_memory(bool final)
142 {
143  delete bvh;
144  bvh = NULL;
145 
146  foreach (Shader *s, shaders)
147  delete s;
148  /* delete procedurals before other types as they may hold pointers to those types */
149  foreach (Procedural *p, procedurals)
150  delete p;
151  foreach (Geometry *g, geometry)
152  delete g;
153  foreach (Object *o, objects)
154  delete o;
155  foreach (Light *l, lights)
156  delete l;
157  foreach (ParticleSystem *p, particle_systems)
158  delete p;
159 
160  shaders.clear();
161  geometry.clear();
162  objects.clear();
163  lights.clear();
164  particle_systems.clear();
165  procedurals.clear();
166 
167  if (device) {
168  camera->device_free(device, &dscene, this);
169  film->device_free(device, &dscene, this);
172 
177 
179 
181 
182  if (final)
184  else
186 
188  }
189 
190  if (final) {
191  delete lookup_tables;
192  delete camera;
193  delete dicing_camera;
194  delete film;
195  delete background;
196  delete integrator;
197  delete object_manager;
198  delete geometry_manager;
199  delete shader_manager;
200  delete light_manager;
202  delete image_manager;
203  delete bake_manager;
204  delete update_stats;
205  delete procedural_manager;
206  }
207 }
208 
209 void Scene::device_update(Device *device_, Progress &progress)
210 {
211  if (!device)
212  device = device_;
213 
214  bool print_stats = need_data_update();
215 
216  if (update_stats) {
217  update_stats->clear();
218  }
219 
220  scoped_callback_timer timer([this, print_stats](double time) {
221  if (update_stats) {
222  update_stats->scene.times.add_entry({"device_update", time});
223 
224  if (print_stats) {
225  printf("Update statistics:\n%s\n", update_stats->full_report().c_str());
226  }
227  }
228  });
229 
230  /* The order of updates is important, because there's dependencies between
231  * the different managers, using data computed by previous managers.
232  *
233  * - Image manager uploads images used by shaders.
234  * - Camera may be used for adaptive subdivision.
235  * - Displacement shader must have all shader data available.
236  * - Light manager needs lookup tables and final mesh data to compute emission CDF.
237  * - Film needs light manager to run for use_light_visibility
238  * - Lookup tables are done a second time to handle film tables
239  */
240 
241  progress.set_status("Updating Shaders");
242  shader_manager->device_update(device, &dscene, this, progress);
243 
244  if (progress.get_cancel() || device->have_error())
245  return;
246 
247  procedural_manager->update(this, progress);
248 
249  if (progress.get_cancel())
250  return;
251 
252  progress.set_status("Updating Background");
254 
255  if (progress.get_cancel() || device->have_error())
256  return;
257 
258  progress.set_status("Updating Camera");
259  camera->device_update(device, &dscene, this);
260 
261  if (progress.get_cancel() || device->have_error())
262  return;
263 
265 
266  if (progress.get_cancel() || device->have_error())
267  return;
268 
269  progress.set_status("Updating Objects");
270  object_manager->device_update(device, &dscene, this, progress);
271 
272  if (progress.get_cancel() || device->have_error())
273  return;
274 
275  progress.set_status("Updating Particle Systems");
277 
278  if (progress.get_cancel() || device->have_error())
279  return;
280 
281  progress.set_status("Updating Meshes");
282  geometry_manager->device_update(device, &dscene, this, progress);
283 
284  if (progress.get_cancel() || device->have_error())
285  return;
286 
287  progress.set_status("Updating Objects Flags");
288  object_manager->device_update_flags(device, &dscene, this, progress);
289 
290  if (progress.get_cancel() || device->have_error())
291  return;
292 
293  progress.set_status("Updating Images");
294  image_manager->device_update(device, this, progress);
295 
296  if (progress.get_cancel() || device->have_error())
297  return;
298 
299  progress.set_status("Updating Camera Volume");
300  camera->device_update_volume(device, &dscene, this);
301 
302  if (progress.get_cancel() || device->have_error())
303  return;
304 
305  progress.set_status("Updating Lookup Tables");
307 
308  if (progress.get_cancel() || device->have_error())
309  return;
310 
311  progress.set_status("Updating Lights");
312  light_manager->device_update(device, &dscene, this, progress);
313 
314  if (progress.get_cancel() || device->have_error())
315  return;
316 
317  progress.set_status("Updating Integrator");
319 
320  if (progress.get_cancel() || device->have_error())
321  return;
322 
323  progress.set_status("Updating Film");
324  film->device_update(device, &dscene, this);
325 
326  if (progress.get_cancel() || device->have_error())
327  return;
328 
329  progress.set_status("Updating Lookup Tables");
331 
332  if (progress.get_cancel() || device->have_error())
333  return;
334 
335  progress.set_status("Updating Baking");
336  bake_manager->device_update(device, &dscene, this, progress);
337 
338  if (progress.get_cancel() || device->have_error())
339  return;
340 
341  if (device->have_error() == false) {
342  progress.set_status("Updating Device", "Writing constant memory");
343  device->const_copy_to("__data", &dscene.data, sizeof(dscene.data));
344  }
345 
346  if (print_stats) {
347  size_t mem_used = util_guarded_get_mem_used();
348  size_t mem_peak = util_guarded_get_mem_peak();
349 
350  VLOG(1) << "System memory statistics after full device sync:\n"
351  << " Usage: " << string_human_readable_number(mem_used) << " ("
352  << string_human_readable_size(mem_used) << ")\n"
353  << " Peak: " << string_human_readable_number(mem_peak) << " ("
354  << string_human_readable_size(mem_peak) << ")";
355  }
356 }
357 
359 {
360  if (integrator->get_motion_blur())
361  return MOTION_BLUR;
362  else if (Pass::contains(passes, PASS_MOTION))
363  return MOTION_PASS;
364  else
365  return MOTION_NONE;
366 }
367 
369 {
371  return 2.0f;
372  else
373  return camera->get_shuttertime();
374 }
375 
377 {
378  if (std == ATTR_STD_UV)
379  return Pass::contains(passes, PASS_UV);
381  return need_motion() != MOTION_NONE;
383  return need_motion() == MOTION_BLUR;
384 
385  return false;
386 }
387 
389 {
390  for (int std = ATTR_STD_NONE; std < ATTR_STD_NUM; std++)
392  attributes.add((AttributeStandard)std);
393 }
394 
396 {
397  return (need_reset() || film->is_modified());
398 }
399 
401 {
402  return (background->is_modified() || image_manager->need_update() ||
408 }
409 
411 {
412  return need_data_update() || camera->is_modified();
413 }
414 
416 {
417  shader_manager->reset(this);
419 
420  /* ensure all objects are updated */
421  camera->tag_modified();
423  film->tag_modified();
425 
426  background->tag_update(this);
433 }
434 
436 {
437  free_memory(false);
438 }
439 
441 {
442  geometry_manager->collect_statistics(this, stats);
444 }
445 
447 {
448  if (!update_stats) {
450  }
451 }
452 
454 {
455  DeviceRequestedFeatures requested_features;
456 
457  shader_manager->get_requested_features(this, &requested_features);
458 
459  /* This features are not being tweaked as often as shaders,
460  * so could be done selective magic for the viewport as well.
461  */
462  bool use_motion = need_motion() == Scene::MotionType::MOTION_BLUR;
463  requested_features.use_hair = false;
464  requested_features.use_hair_thick = (params.hair_shape == CURVE_THICK);
465  requested_features.use_object_motion = false;
466  requested_features.use_camera_motion = use_motion && camera->use_motion();
467  foreach (Object *object, objects) {
468  Geometry *geom = object->get_geometry();
469  if (use_motion) {
470  requested_features.use_object_motion |= object->use_motion() | geom->get_use_motion_blur();
471  requested_features.use_camera_motion |= geom->get_use_motion_blur();
472  }
473  if (object->get_is_shadow_catcher()) {
474  requested_features.use_shadow_tricks = true;
475  }
476  if (geom->is_mesh()) {
477  Mesh *mesh = static_cast<Mesh *>(geom);
478 #ifdef WITH_OPENSUBDIV
479  if (mesh->get_subdivision_type() != Mesh::SUBDIVISION_NONE) {
480  requested_features.use_patch_evaluation = true;
481  }
482 #endif
483  requested_features.use_true_displacement |= mesh->has_true_displacement();
484  }
485  else if (geom->is_hair()) {
486  requested_features.use_hair = true;
487  }
488  }
489 
490  requested_features.use_background_light = light_manager->has_background_light(this);
491 
492  requested_features.use_baking = bake_manager->get_baking();
493  requested_features.use_integrator_branched = (integrator->get_method() ==
495  if (film->get_denoising_data_pass()) {
496  requested_features.use_denoising = true;
497  requested_features.use_shadow_tricks = true;
498  }
499 
500  return requested_features;
501 }
502 
503 bool Scene::update(Progress &progress, bool &kernel_switch_needed)
504 {
505  /* update scene */
506  if (need_update()) {
507  /* Updated used shader tag so we know which features are need for the kernel. */
509 
510  /* Update max_closures. */
511  KernelIntegrator *kintegrator = &dscene.data.integrator;
512  if (params.background) {
513  kintegrator->max_closures = get_max_closure_count();
514  }
515  else {
516  /* Currently viewport render is faster with higher max_closures, needs investigating. */
517  kintegrator->max_closures = MAX_CLOSURE;
518  }
519 
520  /* Load render kernels, before device update where we upload data to the GPU. */
521  bool new_kernels_needed = load_kernels(progress, false);
522 
523  progress.set_status("Updating Scene");
524  MEM_GUARDED_CALL(&progress, device_update, device, progress);
525 
526  DeviceKernelStatus kernel_switch_status = device->get_active_kernel_switch_state();
527  kernel_switch_needed = kernel_switch_status == DEVICE_KERNEL_FEATURE_KERNEL_AVAILABLE ||
528  kernel_switch_status == DEVICE_KERNEL_FEATURE_KERNEL_INVALID;
529  if (new_kernels_needed || kernel_switch_needed) {
530  progress.set_kernel_status("Compiling render kernels");
532  progress.set_kernel_status("");
533  }
534 
535  return true;
536  }
537  return false;
538 }
539 
540 bool Scene::load_kernels(Progress &progress, bool lock_scene)
541 {
542  thread_scoped_lock scene_lock;
543  if (lock_scene) {
544  scene_lock = thread_scoped_lock(mutex);
545  }
546 
548 
549  if (!kernels_loaded || loaded_kernel_features.modified(requested_features)) {
550  progress.set_status("Loading render kernels (may take a few minutes the first time)");
551 
552  scoped_timer timer;
553 
554  VLOG(2) << "Requested features:\n" << requested_features;
555  if (!device->load_kernels(requested_features)) {
556  string message = device->error_message();
557  if (message.empty())
558  message = "Failed loading render kernel, see console for errors";
559 
560  progress.set_error(message);
561  progress.set_status(message);
562  progress.set_update();
563  return false;
564  }
565 
566  kernels_loaded = true;
567  loaded_kernel_features = requested_features;
568  return true;
569  }
570  return false;
571 }
572 
574 {
575  if (shader_manager->use_osl()) {
576  /* OSL always needs the maximum as we can't predict the
577  * number of closures a shader might generate. */
578  return MAX_CLOSURE;
579  }
580 
581  int max_closures = 0;
582  for (int i = 0; i < shaders.size(); i++) {
583  Shader *shader = shaders[i];
584  if (shader->used) {
585  int num_closures = shader->graph->get_num_closures();
586  max_closures = max(max_closures, num_closures);
587  }
588  }
589  max_closure_global = max(max_closure_global, max_closures);
590 
592  /* This is usually harmless as more complex shader tend to get many
593  * closures discarded due to mixing or low weights. We need to limit
594  * to MAX_CLOSURE as this is hardcoded in CPU/mega kernels, and it
595  * avoids excessive memory usage for split kernels. */
596  VLOG(2) << "Maximum number of closures exceeded: " << max_closure_global << " > "
597  << MAX_CLOSURE;
598 
600  }
601 
602  return max_closure_global;
603 }
604 
605 template<> Light *Scene::create_node<Light>()
606 {
607  Light *node = new Light();
608  node->set_owner(this);
609  lights.push_back(node);
611  return node;
612 }
613 
614 template<> Mesh *Scene::create_node<Mesh>()
615 {
616  Mesh *node = new Mesh();
617  node->set_owner(this);
618  geometry.push_back(node);
620  return node;
621 }
622 
623 template<> Hair *Scene::create_node<Hair>()
624 {
625  Hair *node = new Hair();
626  node->set_owner(this);
627  geometry.push_back(node);
629  return node;
630 }
631 
632 template<> Volume *Scene::create_node<Volume>()
633 {
634  Volume *node = new Volume();
635  node->set_owner(this);
636  geometry.push_back(node);
638  return node;
639 }
640 
641 template<> Object *Scene::create_node<Object>()
642 {
643  Object *node = new Object();
644  node->set_owner(this);
645  objects.push_back(node);
647  return node;
648 }
649 
650 template<> ParticleSystem *Scene::create_node<ParticleSystem>()
651 {
653  node->set_owner(this);
654  particle_systems.push_back(node);
656  return node;
657 }
658 
659 template<> Shader *Scene::create_node<Shader>()
660 {
661  Shader *node = new Shader();
662  node->set_owner(this);
663  shaders.push_back(node);
665  return node;
666 }
667 
668 template<> AlembicProcedural *Scene::create_node<AlembicProcedural>()
669 {
670 #ifdef WITH_ALEMBIC
671  AlembicProcedural *node = new AlembicProcedural();
672  node->set_owner(this);
673  procedurals.push_back(node);
675  return node;
676 #else
677  return nullptr;
678 #endif
679 }
680 
681 template<typename T> void delete_node_from_array(vector<T> &nodes, T node)
682 {
683  for (size_t i = 0; i < nodes.size(); ++i) {
684  if (nodes[i] == node) {
685  std::swap(nodes[i], nodes[nodes.size() - 1]);
686  break;
687  }
688  }
689 
690  nodes.resize(nodes.size() - 1);
691 
692  delete node;
693 }
694 
696 {
699 }
700 
702 {
703  delete_node_from_array(geometry, static_cast<Geometry *>(node));
705 }
706 
708 {
709  delete_node_from_array(geometry, static_cast<Geometry *>(node));
711 }
712 
714 {
715  delete_node_from_array(geometry, static_cast<Geometry *>(node));
717 }
718 
720 {
721  uint flag;
722  if (node->is_hair()) {
724  }
725  else {
727  }
728 
731 }
732 
734 {
737 }
738 
740 {
743 }
744 
745 template<> void Scene::delete_node_impl(Shader * /*node*/)
746 {
747  /* don't delete unused shaders, not supported */
748 }
749 
751 {
754 }
755 
756 template<> void Scene::delete_node_impl(AlembicProcedural *node)
757 {
758 #ifdef WITH_ALEMBIC
759  delete_node_impl(static_cast<Procedural *>(node));
760 #else
761  (void)node;
762 #endif
763 }
764 
765 template<typename T>
766 static void remove_nodes_in_set(const set<T *> &nodes_set,
767  vector<T *> &nodes_array,
768  const NodeOwner *owner)
769 {
770  size_t new_size = nodes_array.size();
771 
772  for (size_t i = 0; i < new_size; ++i) {
773  T *node = nodes_array[i];
774 
775  if (nodes_set.find(node) != nodes_set.end()) {
776  std::swap(nodes_array[i], nodes_array[new_size - 1]);
777 
778  assert(node->get_owner() == owner);
779  delete node;
780 
781  i -= 1;
782  new_size -= 1;
783  }
784  }
785 
786  nodes_array.resize(new_size);
787  (void)owner;
788 }
789 
790 template<> void Scene::delete_nodes(const set<Light *> &nodes, const NodeOwner *owner)
791 {
792  remove_nodes_in_set(nodes, lights, owner);
794 }
795 
796 template<> void Scene::delete_nodes(const set<Geometry *> &nodes, const NodeOwner *owner)
797 {
798  remove_nodes_in_set(nodes, geometry, owner);
800 }
801 
802 template<> void Scene::delete_nodes(const set<Object *> &nodes, const NodeOwner *owner)
803 {
804  remove_nodes_in_set(nodes, objects, owner);
806 }
807 
808 template<> void Scene::delete_nodes(const set<ParticleSystem *> &nodes, const NodeOwner *owner)
809 {
810  remove_nodes_in_set(nodes, particle_systems, owner);
812 }
813 
814 template<> void Scene::delete_nodes(const set<Shader *> & /*nodes*/, const NodeOwner * /*owner*/)
815 {
816  /* don't delete unused shaders, not supported */
817 }
818 
819 template<> void Scene::delete_nodes(const set<Procedural *> &nodes, const NodeOwner *owner)
820 {
821  remove_nodes_in_set(nodes, procedurals, owner);
823 }
824 
unsigned int uint
Definition: BLI_sys_types.h:83
void swap(T &a, T &b)
Definition: Common.h:33
struct Hair Hair
struct Light Light
struct Mesh Mesh
struct Object Object
struct ParticleSystem ParticleSystem
struct Volume Volume
Group RGB to Bright Vector Camera Vector Combine Material Light Line Style Layer Add Shader
ATTR_WARN_UNUSED_RESULT const BMLoop * l
void add(ustring name)
Definition: attribute.cpp:770
void device_update(Device *device, DeviceScene *dscene, Scene *scene)
void device_free(Device *device, DeviceScene *dscene)
void tag_update(Scene *scene)
bool get_baking()
Definition: bake.cpp:88
bool need_update() const
Definition: bake.cpp:167
void device_free(Device *device, DeviceScene *dscene)
Definition: bake.cpp:158
void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress &progress)
Definition: bake.cpp:122
bool has_osl
Definition: device.h:84
bool use_integrator_branched
Definition: device.h:159
bool modified(const DeviceRequestedFeatures &requested_features)
Definition: device.h:208
DeviceScene(Device *device)
Definition: scene.cpp:48
KernelData data
Definition: scene.h:136
Definition: device.h:293
virtual DeviceKernelStatus get_active_kernel_switch_state()
Definition: device.h:397
virtual void const_copy_to(const char *name, void *host, size_t size)=0
virtual bool wait_for_availability(const DeviceRequestedFeatures &)
Definition: device.h:389
virtual const string & error_message()
Definition: device.h:338
DeviceInfo info
Definition: device.h:337
virtual bool load_kernels(const DeviceRequestedFeatures &)
Definition: device.h:380
bool have_error()
Definition: device.h:342
static void add_default(Scene *scene)
Definition: film.cpp:422
void device_free(Device *device, DeviceScene *dscene, Scene *scene)
Definition: film.cpp:683
void device_update(Device *device, DeviceScene *dscene, Scene *scene)
Definition: film.cpp:427
void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress &progress)
Definition: geometry.cpp:1749
void device_free(Device *device, DeviceScene *dscene, bool force_free)
Definition: geometry.cpp:2085
void tag_update(Scene *scene, uint32_t flag)
Definition: geometry.cpp:2127
void collect_statistics(const Scene *scene, RenderStats *stats)
Definition: geometry.cpp:2142
void device_update_preprocess(Device *device, Scene *scene, Progress &progress)
Definition: geometry.cpp:1451
bool need_update() const
Definition: geometry.cpp:2137
bool has_true_displacement() const
Definition: geometry.cpp:187
bool is_hair() const
Definition: geometry.h:175
bool is_mesh() const
Definition: geometry.h:170
void device_update(Device *device, Scene *scene, Progress &progress)
Definition: image.cpp:807
bool need_update() const
Definition: image.cpp:900
void device_free(Device *device)
Definition: image.cpp:879
void device_free_builtin(Device *device)
Definition: image.cpp:869
void collect_statistics(RenderStats *stats)
Definition: image.cpp:887
@ BRANCHED_PATH
Definition: integrator.h:82
void tag_update(Scene *scene, uint32_t flag)
Definition: integrator.cpp:292
void device_update(Device *device, DeviceScene *dscene, Scene *scene)
Definition: integrator.cpp:107
void device_free(Device *device, DeviceScene *dscene, bool force_free=false)
Definition: integrator.cpp:287
void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress &progress)
Definition: light.cpp:978
void device_free(Device *device, DeviceScene *dscene, const bool free_background=true)
Definition: light.cpp:1025
@ LIGHT_ADDED
Definition: light.h:99
@ UPDATE_ALL
Definition: light.h:106
@ LIGHT_REMOVED
Definition: light.h:100
bool need_update() const
Definition: light.cpp:1041
bool has_background_light(Scene *scene)
Definition: light.cpp:207
void tag_update(Scene *scene, uint32_t flag)
Definition: light.cpp:1036
void device_free(Device *device, DeviceScene *dscene)
Definition: tables.cpp:58
void device_update(Device *device, DeviceScene *dscene, Scene *scene)
Definition: tables.cpp:39
bool need_update() const
Definition: tables.cpp:63
void add_entry(const NamedTimeEntry &entry)
Definition: stats.h:81
void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress &progress)
Definition: object.cpp:604
void tag_update(Scene *scene, uint32_t flag)
Definition: object.cpp:903
@ OBJECT_ADDED
Definition: object.h:132
@ OBJECT_REMOVED
Definition: object.h:133
void device_free(Device *device, DeviceScene *dscene, bool force_free)
Definition: object.cpp:826
bool need_update() const
Definition: object.cpp:931
void device_update_flags(Device *device, DeviceScene *dscene, Scene *scene, Progress &progress, bool bounds_valid=true)
Definition: object.cpp:694
void device_free(Device *device, DeviceScene *dscene)
Definition: particles.cpp:134
void tag_update(Scene *scene)
Definition: particles.cpp:139
bool need_update() const
Definition: particles.cpp:144
void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress &progress)
Definition: particles.cpp:107
static bool contains(const vector< Pass > &passes, PassType)
Definition: film.cpp:295
bool need_update() const
Definition: procedural.cpp:84
void update(Scene *scene, Progress &progress)
Definition: procedural.cpp:50
bool get_cancel()
void set_kernel_status(const string &kernel_status_)
void set_status(const string &status_, const string &substatus_="")
void set_update()
void set_error(const string &error_message_)
bool background
Definition: scene.h:183
CurveShapeType hair_shape
Definition: scene.h:180
ShadingSystem shadingsystem
Definition: scene.h:166
string full_report()
Definition: stats.cpp:361
void clear()
Definition: stats.cpp:382
UpdateTimeStats scene
Definition: stats.h:219
virtual void device_free(Device *device, DeviceScene *dscene, Scene *scene)=0
virtual void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress &progress)=0
void get_requested_features(Scene *scene, DeviceRequestedFeatures *requested_features)
Definition: shader.cpp:729
bool need_update() const
Definition: shader.cpp:796
static ShaderManager * create(int shadingsystem)
Definition: shader.cpp:410
void update_shaders_used(Scene *scene)
Definition: shader.cpp:464
void tag_update(Scene *scene, uint32_t flag)
Definition: shader.cpp:790
@ SHADER_ADDED
Definition: shader.h:169
static void add_default(Scene *scene)
Definition: shader.cpp:625
virtual bool use_osl()
Definition: shader.h:184
virtual void reset(Scene *scene)=0
Definition: shader.h:80
NamedTimeStats times
Definition: stats.h:201
OperationNode * node
double time
DeviceKernelStatus
Definition: device.h:63
@ DEVICE_KERNEL_FEATURE_KERNEL_AVAILABLE
Definition: device.h:64
@ DEVICE_KERNEL_FEATURE_KERNEL_INVALID
Definition: device.h:66
@ MEM_GLOBAL
Definition: device_memory.h:39
IMAGE_Shaders shaders
Definition: image_shader.c:44
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
#define CCL_NAMESPACE_END
void KERNEL_FUNCTION_FULL_NAME() shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int filter, int i, int offset, int sample)
AttributeStandard
Definition: kernel_types.h:744
@ ATTR_STD_UV
Definition: kernel_types.h:748
@ ATTR_STD_MOTION_VERTEX_NORMAL
Definition: kernel_types.h:757
@ ATTR_STD_NONE
Definition: kernel_types.h:745
@ ATTR_STD_NUM
Definition: kernel_types.h:771
@ ATTR_STD_MOTION_VERTEX_POSITION
Definition: kernel_types.h:756
@ CURVE_THICK
Definition: kernel_types.h:715
#define MAX_CLOSURE
Definition: kernel_types.h:795
@ PASS_UV
Definition: kernel_types.h:354
@ PASS_MOTION
Definition: kernel_types.h:357
#define T
void delete_node_from_array(vector< T > &nodes, T node)
Definition: scene.cpp:681
static void remove_nodes_in_set(const set< T * > &nodes_set, vector< T * > &nodes_array, const NodeOwner *owner)
Definition: scene.cpp:766
@ SHADINGSYSTEM_SVM
Definition: shader.h:48
KernelIntegrator integrator
@ SUBDIVISION_NONE
Definition: mesh.h:133
Definition: node.h:94
bool is_modified()
Definition: node.cpp:781
void tag_modified()
Definition: node.cpp:786
bool use_motion() const
Definition: object.cpp:238
bool kernels_loaded
Definition: scene.h:350
BakeManager * bake_manager
Definition: scene.h:249
Film * film
Definition: scene.h:229
BVH * bvh
Definition: scene.h:225
bool need_global_attribute(AttributeStandard std)
Definition: scene.cpp:376
ParticleSystemManager * particle_system_manager
Definition: scene.h:248
vector< Geometry * > geometry
Definition: scene.h:235
void need_global_attributes(AttributeRequestSet &attributes)
Definition: scene.cpp:388
Device * device
Definition: scene.h:260
vector< Shader * > shaders
Definition: scene.h:236
vector< Procedural * > procedurals
Definition: scene.h:240
int get_max_closure_count()
Definition: scene.cpp:573
~Scene()
Definition: scene.cpp:136
void device_free()
Definition: scene.cpp:435
bool load_kernels(Progress &progress, bool lock_scene=true)
Definition: scene.cpp:540
Camera * dicing_camera
Definition: scene.h:227
LookupTables * lookup_tables
Definition: scene.h:228
SceneParams params
Definition: scene.h:264
DeviceRequestedFeatures get_requested_device_features()
Definition: scene.cpp:453
vector< Pass > passes
Definition: scene.h:239
vector< Light * > lights
Definition: scene.h:237
void free_memory(bool final)
Definition: scene.cpp:141
short flag
vector< ParticleSystem * > particle_systems
Definition: scene.h:238
ImageManager * image_manager
Definition: scene.h:243
void enable_update_stats()
Definition: scene.cpp:446
vector< Object * > objects
Definition: scene.h:234
MotionType need_motion()
Definition: scene.cpp:358
ObjectManager * object_manager
Definition: scene.h:247
Background * background
Definition: scene.h:230
MotionType
Definition: scene.h:280
@ MOTION_PASS
Definition: scene.h:280
@ MOTION_NONE
Definition: scene.h:280
@ MOTION_BLUR
Definition: scene.h:280
void delete_nodes(const set< T * > &nodes)
Definition: scene.h:333
ProceduralManager * procedural_manager
Definition: scene.h:250
ShaderManager * shader_manager
Definition: scene.h:245
DeviceRequestedFeatures loaded_kernel_features
Definition: scene.h:351
void delete_node_impl(T *node)
Definition: scene.h:365
int max_closure_global
Definition: scene.h:360
Integrator * integrator
Definition: scene.h:231
LightManager * light_manager
Definition: scene.h:244
thread_mutex mutex
Definition: scene.h:267
bool need_data_update()
Definition: scene.cpp:400
bool update(Progress &progress, bool &kernel_switch_needed)
Definition: scene.cpp:503
struct Object * camera
bool need_update()
Definition: scene.cpp:395
void reset()
Definition: scene.cpp:415
void collect_statistics(RenderStats *stats)
Definition: scene.cpp:440
bool need_reset()
Definition: scene.cpp:410
SceneUpdateStats * update_stats
Definition: scene.h:270
GeometryManager * geometry_manager
Definition: scene.h:246
DeviceScene dscene
Definition: scene.h:261
float motion_shutter_time()
Definition: scene.cpp:368
Scene(const SceneParams &params, Device *device)
Definition: scene.cpp:92
void device_update(Device *device, Progress &progress)
Definition: scene.cpp:209
float max
size_t util_guarded_get_mem_used()
size_t util_guarded_get_mem_peak()
#define MEM_GUARDED_CALL(progress, func,...)
#define VLOG(severity)
Definition: util_logging.h:50
string string_human_readable_size(size_t size)
string string_human_readable_number(size_t num)
std::unique_lock< std::mutex > thread_scoped_lock
Definition: util_thread.h:41