[Bf-blender-cvs] [8733d310e54] master: Cycles: Revert all host update specific changes

Sergey Sharybin noreply at git.blender.org
Mon Oct 25 09:48:33 CEST 2021


Commit: 8733d310e54766d7c07d101e8959bd9f3eaf0daf
Author: Sergey Sharybin
Date:   Thu Oct 21 14:52:34 2021 +0200
Branches: master
https://developer.blender.org/rB8733d310e54766d7c07d101e8959bd9f3eaf0daf

Cycles: Revert all host update specific changes

The approach didn't turn out to be that useful after all as there
are unavoidable dependencies of data from the device. For example,
to know whether object intersects volume or not it is required to
run displacement kernels.

The way of splitting host and device updates caused state where
some data is not yet available, causing confusion and leaving
code to be error-prone.

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

M	intern/cycles/render/osl.cpp
M	intern/cycles/render/osl.h
M	intern/cycles/render/scene.cpp
M	intern/cycles/render/scene.h
M	intern/cycles/render/shader.cpp
M	intern/cycles/render/shader.h
M	intern/cycles/render/svm.cpp
M	intern/cycles/render/svm.h

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

diff --git a/intern/cycles/render/osl.cpp b/intern/cycles/render/osl.cpp
index dd8f1b31177..1037ebcae7e 100644
--- a/intern/cycles/render/osl.cpp
+++ b/intern/cycles/render/osl.cpp
@@ -91,51 +91,70 @@ void OSLShaderManager::reset(Scene * /*scene*/)
   shading_system_init();
 }
 
-void OSLShaderManager::host_update_specific(Scene *scene, Progress &progress)
+void OSLShaderManager::device_update_specific(Device *device,
+                                              DeviceScene *dscene,
+                                              Scene *scene,
+                                              Progress &progress)
 {
-  if (!need_update()) {
+  if (!need_update())
     return;
-  }
 
   scoped_callback_timer timer([scene](double time) {
     if (scene->update_stats) {
-      scene->update_stats->osl.times.add_entry({"host_update", time});
+      scene->update_stats->osl.times.add_entry({"device_update", time});
     }
   });
 
   VLOG(1) << "Total " << scene->shaders.size() << " shaders.";
 
+  device_free(device, dscene, scene);
+
   /* set texture system */
   scene->image_manager->set_osl_texture_system((void *)ts);
 
   /* create shaders */
+  OSLGlobals *og = (OSLGlobals *)device->get_cpu_osl_memory();
   Shader *background_shader = scene->background->get_shader(scene);
 
-  for (Shader *shader : scene->shaders) {
+  foreach (Shader *shader, scene->shaders) {
     assert(shader->graph);
 
-    if (progress.get_cancel()) {
+    if (progress.get_cancel())
       return;
-    }
 
-    /* we can only compile one shader at the time as the OSL ShadingSystem
+    /* we can only compile one shader at the time as the OSL ShadingSytem
      * has a single state, but we put the lock here so different renders can
      * compile shaders alternating */
     thread_scoped_lock lock(ss_mutex);
 
     OSLCompiler compiler(this, services, ss, scene);
     compiler.background = (shader == background_shader);
-    compiler.compile(shader);
+    compiler.compile(og, shader);
 
-    if (shader->get_use_mis() && shader->has_surface_emission) {
+    if (shader->get_use_mis() && shader->has_surface_emission)
       scene->light_manager->tag_update(scene, LightManager::SHADER_COMPILED);
-    }
   }
 
+  /* setup shader engine */
+  og->ss = ss;
+  og->ts = ts;
+  og->services = services;
+
+  int background_id = scene->shader_manager->get_shader_id(background_shader);
+  og->background_state = og->surface_state[background_id & SHADER_MASK];
+  og->use = true;
+
+  foreach (Shader *shader, scene->shaders)
+    shader->clear_modified();
+
+  update_flags = UPDATE_NONE;
+
   /* add special builtin texture types */
   services->textures.insert(ustring("@ao"), new OSLTextureHandle(OSLTextureHandle::AO));
   services->textures.insert(ustring("@bevel"), new OSLTextureHandle(OSLTextureHandle::BEVEL));
 
+  device_update_common(device, dscene, scene, progress);
+
   {
     /* Perform greedyjit optimization.
      *
@@ -153,51 +172,6 @@ void OSLShaderManager::host_update_specific(Scene *scene, Progress &progress)
   }
 }
 
-void OSLShaderManager::device_update_specific(Device *device,
-                                              DeviceScene *dscene,
-                                              Scene *scene,
-                                              Progress &progress)
-{
-  if (!need_update())
-    return;
-
-  scoped_callback_timer timer([scene](double time) {
-    if (scene->update_stats) {
-      scene->update_stats->osl.times.add_entry({"device_update", time});
-    }
-  });
-
-  device_free(device, dscene, scene);
-
-  OSLGlobals *og = (OSLGlobals *)device->get_cpu_osl_memory();
-  Shader *background_shader = scene->background->get_shader(scene);
-
-  /* Setup shader engine. */
-  og->ss = ss;
-  og->ts = ts;
-  og->services = services;
-
-  for (Shader *shader : scene->shaders) {
-    /* push state to array for lookup */
-    og->surface_state.push_back(shader->osl_surface_ref);
-    og->volume_state.push_back(shader->osl_volume_ref);
-    og->displacement_state.push_back(shader->osl_displacement_ref);
-    og->bump_state.push_back(shader->osl_surface_bump_ref);
-
-    shader->clear_modified();
-  }
-
-  const int background_id = scene->shader_manager->get_shader_id(background_shader);
-  const int background_state_index = (background_id & SHADER_MASK);
-  DCHECK_LT(background_state_index, og->surface_state.size());
-  og->background_state = og->surface_state[background_state_index];
-  og->use = true;
-
-  update_flags = UPDATE_NONE;
-
-  device_update_common(device, dscene, scene, progress);
-}
-
 void OSLShaderManager::device_free(Device *device, DeviceScene *dscene, Scene *scene)
 {
   OSLGlobals *og = (OSLGlobals *)device->get_cpu_osl_memory();
@@ -1158,7 +1132,7 @@ OSL::ShaderGroupRef OSLCompiler::compile_type(Shader *shader, ShaderGraph *graph
   return group;
 }
 
-void OSLCompiler::compile(Shader *shader)
+void OSLCompiler::compile(OSLGlobals *og, Shader *shader)
 {
   if (shader->is_modified()) {
     ShaderGraph *graph = shader->graph;
@@ -1220,6 +1194,12 @@ void OSLCompiler::compile(Shader *shader)
     else
       shader->osl_displacement_ref = OSL::ShaderGroupRef();
   }
+
+  /* push state to array for lookup */
+  og->surface_state.push_back(shader->osl_surface_ref);
+  og->volume_state.push_back(shader->osl_volume_ref);
+  og->displacement_state.push_back(shader->osl_displacement_ref);
+  og->bump_state.push_back(shader->osl_surface_bump_ref);
 }
 
 void OSLCompiler::parameter_texture(const char *name, ustring filename, ustring colorspace)
diff --git a/intern/cycles/render/osl.h b/intern/cycles/render/osl.h
index 1da8d8d0026..dfeec54d915 100644
--- a/intern/cycles/render/osl.h
+++ b/intern/cycles/render/osl.h
@@ -79,8 +79,6 @@ class OSLShaderManager : public ShaderManager {
     return true;
   }
 
-  void host_update_specific(Scene *scene, Progress &progress) override;
-
   void device_update_specific(Device *device,
                               DeviceScene *dscene,
                               Scene *scene,
@@ -140,7 +138,7 @@ class OSLCompiler {
               OSL::ShadingSystem *shadingsys,
               Scene *scene);
 #endif
-  void compile(Shader *shader);
+  void compile(OSLGlobals *og, Shader *shader);
 
   void add(ShaderNode *node, const char *name, bool isfilepath = false);
 
diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp
index 6d79536061e..da6666babe6 100644
--- a/intern/cycles/render/scene.cpp
+++ b/intern/cycles/render/scene.cpp
@@ -228,22 +228,6 @@ void Scene::free_memory(bool final)
   }
 }
 
-void Scene::host_update(Progress &progress)
-{
-  if (update_stats) {
-    update_stats->clear();
-  }
-
-  scoped_callback_timer timer([this](double time) {
-    if (update_stats) {
-      update_stats->scene.times.add_entry({"host_update", time});
-    }
-  });
-
-  progress.set_status("Updating Shaders");
-  shader_manager->host_update(this, progress);
-}
-
 void Scene::device_update(Device *device_, Progress &progress)
 {
   if (!device)
@@ -251,6 +235,10 @@ 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});
@@ -549,17 +537,11 @@ bool Scene::update(Progress &progress)
     return false;
   }
 
-  /* Update scene data on the host side.
-   * Only updates which do not depend on the kernel (including kernel features). */
-  progress.set_status("Updating Scene");
-  MEM_GUARDED_CALL(&progress, host_update, progress);
-
-  /* Load render kernels. After host scene update so that the required kernel features are known.
-   */
+  /* Load render kernels, before device update where we upload data to the GPU. */
   load_kernels(progress, false);
 
-  /* Upload scene data to the device. */
-  progress.set_status("Updating Scene Device");
+  /* Upload scene data to the GPU. */
+  progress.set_status("Updating Scene");
   MEM_GUARDED_CALL(&progress, device_update, device, progress);
 
   return true;
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index 87fbc872c0a..001da31e893 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -251,8 +251,6 @@ class Scene : public NodeOwner {
   Scene(const SceneParams &params, Device *device);
   ~Scene();
 
-  void host_update(Progress &progress);
-
   void device_update(Device *device, Progress &progress);
 
   bool need_global_attribute(AttributeStandard std);
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index 171cbb89549..23786a3390f 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -462,7 +462,10 @@ int ShaderManager::get_shader_id(Shader *shader, bool smooth)
   return id;
 }
 
-void ShaderManager::host_update(Scene *scene, Progress &progress)
+void ShaderManager::device_update(Device *device,
+                                  DeviceScene *dscene,
+                                  Scene *scene,
+                                  Progress &progress)
 {
   if (!need_update()) {
     return;
@@ -480,18 +483,6 @@ void ShaderManager::host_update(Scene *scene, Progress &progress)
   assert(scene->default_background->reference_count() != 0);
   assert(scene->default_empty->reference_count() != 0);
 
-  host_update_specific(scene, progress);
-}
-
-void ShaderManager::device_update(Device *device,
-                                  DeviceScene *dscene,
-                                  Scene *scene,
-                                  Progress &progress)
-{
-  if (!need_update()) {
-    return;
-  }
-
   device_update_specific(device, dscene, scene, progress);
 }
 
diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h
index 44d88ac0e93..5f9adea3949 100644
--- a/intern/cycles/render/shader.h
+++ b/intern/cycles/render/shader.h
@@ -193,9 +193,6 @@ class ShaderManager {
     return false;
   }
 
-  void host_update(Scene *scene, Progress &progress);
-  virtual void host_update_specific(Scene *scene, Progress &progress) = 0;
-
   /* device update */
   void device_update(De

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list