[Bf-blender-cvs] [01e1dde74e3] cycles_procedural_api: attempt to make persistent data for final renders

Kévin Dietrich noreply at git.blender.org
Mon Nov 16 13:11:05 CET 2020


Commit: 01e1dde74e31cfafe628ebb236a803f4b76c5d48
Author: Kévin Dietrich
Date:   Tue Nov 10 18:48:57 2020 +0100
Branches: cycles_procedural_api
https://developer.blender.org/rB01e1dde74e31cfafe628ebb236a803f4b76c5d48

attempt to make persistent data for final renders

===================================================================

M	intern/cycles/blender/addon/ui.py
M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/blender/blender_sync.cpp
M	intern/cycles/blender/blender_sync.h
M	intern/cycles/render/scene.cpp
M	intern/cycles/render/shader.cpp

===================================================================

diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index c0c5f146dfb..3362cfd3054 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -741,7 +741,7 @@ class CYCLES_RENDER_PT_performance_final_render(CyclesButtonsPanel, Panel):
         col = layout.column()
 
         col.prop(rd, "use_save_buffers")
-        col.prop(rd, "use_persistent_data", text="Persistent Images")
+        col.prop(rd, "use_persistent_data", text="Persistent Data")
 
 
 class CYCLES_RENDER_PT_performance_viewport(CyclesButtonsPanel, Panel):
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index d4c0041e080..e739d9df114 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -225,7 +225,6 @@ void BlenderSession::reset_session(BL::BlendData &b_data, BL::Depsgraph &b_depsg
   }
 
   session->progress.reset();
-  scene->reset();
 
   session->tile_manager.set_tile_order(session_params.tile_order);
 
@@ -237,9 +236,18 @@ void BlenderSession::reset_session(BL::BlendData &b_data, BL::Depsgraph &b_depsg
   /* There is no single depsgraph to use for the entire render.
    * See note on create_session().
    */
-  /* sync object should be re-created */
-  delete sync;
-  sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, session->progress);
+  if (!scene->params.persistent_data) {
+    delete sync;
+    sync = nullptr;
+    scene->reset();
+  }
+
+  if (!sync) {
+    sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, session->progress);
+  }
+  else {
+    sync->sync_recalc(b_depsgraph, nullptr);
+  }
 
   BL::SpaceView3D b_null_space_view3d(PointerRNA_NULL);
   BL::RegionView3D b_null_region_view3d(PointerRNA_NULL);
@@ -602,6 +610,13 @@ void BlenderSession::render(BL::Depsgraph &b_depsgraph_)
   session->update_render_tile_cb = function_null;
 
   /* TODO: find a way to clear this data for persistent data render */
+  // todo(kevin): from patch
+//  session->device_free();
+
+//  if (!scene->params.persistent_data) {
+//    delete sync;
+//    sync = NULL;
+//  }
 #if 0
   /* free all memory used (host and device), so we wouldn't leave render
    * engine with extra memory allocated
@@ -800,7 +815,7 @@ void BlenderSession::synchronize(BL::Depsgraph &b_depsgraph_)
 
   /* copy recalc flags, outside of mutex so we can decide to do the real
    * synchronization at a later time to not block on running updates */
-  sync->sync_recalc(b_depsgraph_, b_v3d);
+  sync->sync_recalc(b_depsgraph_, &b_v3d);
 
   /* don't do synchronization if on pause */
   if (session_pause) {
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index eb58c49a4a1..7f7ec17cb38 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -92,7 +92,7 @@ void BlenderSync::reset(BL::BlendData &b_data, BL::Scene &b_scene)
 
 /* Sync */
 
-void BlenderSync::sync_recalc(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d)
+void BlenderSync::sync_recalc(BL::Depsgraph &b_depsgraph, BL::SpaceView3D *b_v3d)
 {
   /* Sync recalc flags from blender to cycles. Actual update is done separate,
    * so we can do it later on if doing it immediate is not suitable. */
@@ -213,9 +213,11 @@ void BlenderSync::sync_recalc(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d
     }
   }
 
-  BlenderViewportParameters new_viewport_parameters(b_v3d);
-  if (viewport_parameters.modified(new_viewport_parameters)) {
-    world_recalc = true;
+  if (b_v3d) {
+    BlenderViewportParameters new_viewport_parameters(*b_v3d);
+    if (viewport_parameters.modified(new_viewport_parameters)) {
+      world_recalc = true;
+    }
   }
 }
 
diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h
index 7fc2d05ad9b..900870f2db4 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -65,7 +65,7 @@ class BlenderSync {
   void reset(BL::BlendData &b_data, BL::Scene &b_scene);
 
   /* sync */
-  void sync_recalc(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d);
+  void sync_recalc(BL::Depsgraph &b_depsgraph, BL::SpaceView3D *b_v3d);
   void sync_data(BL::RenderSettings &b_render,
                  BL::Depsgraph &b_depsgraph,
                  BL::SpaceView3D &b_v3d,
diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp
index fb80edfe666..1427fedc872 100644
--- a/intern/cycles/render/scene.cpp
+++ b/intern/cycles/render/scene.cpp
@@ -196,47 +196,51 @@ Scene::~Scene()
 
 void Scene::free_memory(bool final)
 {
-  foreach (Shader *s, shaders)
-    delete s;
-  foreach (Geometry *g, geometry)
-    delete g;
-  foreach (Object *o, objects)
-    delete o;
-  foreach (Light *l, lights)
-    delete l;
-  foreach (ParticleSystem *p, particle_systems)
-    delete p;
-  foreach (Procedural *p, procedurals)
-    delete p;
-
-  shaders.clear();
-  geometry.clear();
-  objects.clear();
-  lights.clear();
-  particle_systems.clear();
-  procedurals.clear();
+  if (!params.persistent_data || final) {
+    foreach (Shader *s, shaders)
+      delete s;
+    foreach (Geometry *g, geometry)
+      delete g;
+    foreach (Object *o, objects)
+      delete o;
+    foreach (Light *l, lights)
+      delete l;
+    foreach (ParticleSystem *p, particle_systems)
+      delete p;
+    foreach (Procedural *p, procedurals)
+      delete p;
+
+    shaders.clear();
+    geometry.clear();
+    objects.clear();
+    lights.clear();
+    particle_systems.clear();
+    procedurals.clear();
+  }
 
   if (device) {
-    camera->device_free(device, &dscene, this);
-    film->device_free(device, &dscene, this);
-    background->device_free(device, &dscene);
-    integrator->device_free(device, &dscene);
+    if (!params.persistent_data || final) {
+      camera->device_free(device, &dscene, this);
+      film->device_free(device, &dscene, this);
+      background->device_free(device, &dscene);
+      integrator->device_free(device, &dscene);
 
-    object_manager->device_free(device, &dscene);
-    geometry_manager->device_free(device, &dscene);
-    shader_manager->device_free(device, &dscene, this);
-    light_manager->device_free(device, &dscene);
+      object_manager->device_free(device, &dscene);
+      geometry_manager->device_free(device, &dscene);
+      shader_manager->device_free(device, &dscene, this);
+      light_manager->device_free(device, &dscene);
 
-    particle_system_manager->device_free(device, &dscene);
+      particle_system_manager->device_free(device, &dscene);
 
-    bake_manager->device_free(device, &dscene);
+      bake_manager->device_free(device, &dscene);
 
-    if (!params.persistent_data || final)
       image_manager->device_free(device);
-    else
-      image_manager->device_free_builtin(device);
 
-    lookup_tables->device_free(device, &dscene);
+      lookup_tables->device_free(device, &dscene);
+    }
+    else {
+      image_manager->device_free_builtin(device);
+    }
   }
 
   if (final) {
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index 44ee714a515..55b50ea8da1 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -632,7 +632,7 @@ void ShaderManager::device_free_common(Device *, DeviceScene *dscene, Scene *sce
 void ShaderManager::add_default(Scene *scene)
 {
   /* default surface */
-  {
+  if (scene->default_surface == nullptr) {
     ShaderGraph *graph = new ShaderGraph();
 
     DiffuseBsdfNode *diffuse = graph->create_node<DiffuseBsdfNode>();
@@ -649,7 +649,7 @@ void ShaderManager::add_default(Scene *scene)
   }
 
   /* default volume */
-  {
+  if (scene->default_volume == nullptr) {
     ShaderGraph *graph = new ShaderGraph();
 
     PrincipledVolumeNode *principled = graph->create_node<PrincipledVolumeNode>();
@@ -665,7 +665,7 @@ void ShaderManager::add_default(Scene *scene)
   }
 
   /* default light */
-  {
+  if (scene->default_light == nullptr) {
     ShaderGraph *graph = new ShaderGraph();
 
     EmissionNode *emission = graph->create_node<EmissionNode>();
@@ -683,7 +683,7 @@ void ShaderManager::add_default(Scene *scene)
   }
 
   /* default background */
-  {
+  if (scene->default_background == nullptr) {
     ShaderGraph *graph = new ShaderGraph();
 
     Shader *shader = scene->create_node<Shader>();
@@ -694,7 +694,7 @@ void ShaderManager::add_default(Scene *scene)
   }
 
   /* default empty */
-  {
+  if (scene->default_empty == nullptr) {
     ShaderGraph *graph = new ShaderGraph();
 
     Shader *shader = scene->create_node<Shader>();



More information about the Bf-blender-cvs mailing list