Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey@blender.org>2021-10-06 12:43:58 +0300
committerSergey Sharybin <sergey@blender.org>2021-10-11 13:27:28 +0300
commit0ceded7bc97852564c4d26951b41853e8289925e (patch)
tree4f7d69f3c596f63b39c031bb021281b5f88f6820 /intern/cycles/render/osl.cpp
parentf9755add6544667e04b2b0d39c7c3bc794b6bdb8 (diff)
Cycles: Introduce scene host_update function
The longer-term goal is to separate host-only scene update from device update: make it possible to make kernel features depend on actual scene state and flags. This change makes it so shaders are compiled before kernel load, making checks like "has_volume" available at the kernel features calculation state. No functional changes are expected at this point. Differential Revision: https://developer.blender.org/D12795
Diffstat (limited to 'intern/cycles/render/osl.cpp')
-rw-r--r--intern/cycles/render/osl.cpp75
1 files changed, 47 insertions, 28 deletions
diff --git a/intern/cycles/render/osl.cpp b/intern/cycles/render/osl.cpp
index 5a43b641872..b6c743ac295 100644
--- a/intern/cycles/render/osl.cpp
+++ b/intern/cycles/render/osl.cpp
@@ -91,24 +91,20 @@ void OSLShaderManager::reset(Scene * /*scene*/)
shading_system_init();
}
-void OSLShaderManager::device_update_specific(Device *device,
- DeviceScene *dscene,
- Scene *scene,
- Progress &progress)
+void OSLShaderManager::host_update_specific(Device *device, 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({"device_update", time});
+ scene->update_stats->osl.times.add_entry({"host_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);
@@ -116,13 +112,14 @@ void OSLShaderManager::device_update_specific(Device *device,
OSLGlobals *og = (OSLGlobals *)device->get_cpu_osl_memory();
Shader *background_shader = scene->background->get_shader(scene);
- foreach (Shader *shader, scene->shaders) {
+ for (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 ShadingSytem
+ /* we can only compile one shader at the time as the OSL ShadingSystem
* has a single state, but we put the lock here so different renders can
* compile shaders alternating */
thread_scoped_lock lock(ss_mutex);
@@ -131,30 +128,15 @@ void OSLShaderManager::device_update_specific(Device *device,
compiler.background = (shader == background_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.
*
@@ -172,6 +154,43 @@ void OSLShaderManager::device_update_specific(Device *device,
}
}
+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;
+
+ const 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;
+
+ 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();