diff options
author | Sergey Sharybin <sergey@blender.org> | 2021-10-06 12:43:58 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey@blender.org> | 2021-10-11 13:27:28 +0300 |
commit | 0ceded7bc97852564c4d26951b41853e8289925e (patch) | |
tree | 4f7d69f3c596f63b39c031bb021281b5f88f6820 /intern/cycles/render/osl.cpp | |
parent | f9755add6544667e04b2b0d39c7c3bc794b6bdb8 (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.cpp | 75 |
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(); |