diff options
Diffstat (limited to 'intern/cycles/render/session.cpp')
-rw-r--r-- | intern/cycles/render/session.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp index 6bf2160f9fa..b5d434a604c 100644 --- a/intern/cycles/render/session.cpp +++ b/intern/cycles/render/session.cpp @@ -987,7 +987,8 @@ bool Session::update_scene() /* update scene */ if (scene->need_update()) { - bool new_kernels_needed = load_kernels(false); + /* Updated used shader tag so we know which features are need for the kernel. */ + scene->shader_manager->update_shaders_used(scene); /* Update max_closures. */ KernelIntegrator *kintegrator = &scene->dscene.data.integrator; @@ -999,6 +1000,9 @@ bool Session::update_scene() kintegrator->max_closures = MAX_CLOSURE; } + /* Load render kernels, before device update where we upload data to the GPU. */ + bool new_kernels_needed = load_kernels(false); + progress.set_status("Updating Scene"); MEM_GUARDED_CALL(&progress, scene->device_update, device, progress); @@ -1271,8 +1275,11 @@ int Session::get_max_closure_count() int max_closures = 0; for (int i = 0; i < scene->shaders.size(); i++) { - int num_closures = scene->shaders[i]->graph->get_num_closures(); - max_closures = max(max_closures, num_closures); + Shader *shader = scene->shaders[i]; + if (shader->used) { + int num_closures = shader->graph->get_num_closures(); + max_closures = max(max_closures, num_closures); + } } max_closure_global = max(max_closure_global, max_closures); |