From e4e58d46128dc7fe4fb9b881d73b38173f00f5c3 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 6 Jun 2014 14:40:09 +0200 Subject: Fix T40370: cycles CUDA baking timeout with high number of AA samples. Now baking does one AA sample at a time, just like final render. There is also some code for shader antialiasing that solves T40369 but it is disabled for now because there may be unpredictable side effects. --- intern/cycles/render/bake.cpp | 33 +++++++++++++++++++++++++++++++++ intern/cycles/render/bake.h | 8 ++++++-- intern/cycles/render/light.cpp | 1 + intern/cycles/render/mesh_displace.cpp | 1 + 4 files changed, 41 insertions(+), 2 deletions(-) (limited to 'intern/cycles/render') diff --git a/intern/cycles/render/bake.cpp b/intern/cycles/render/bake.cpp index aa317ab672f..c68f6e1f08e 100644 --- a/intern/cycles/render/bake.cpp +++ b/intern/cycles/render/bake.cpp @@ -15,6 +15,7 @@ */ #include "bake.h" +#include "integrator.h" CCL_NAMESPACE_BEGIN @@ -152,6 +153,7 @@ bool BakeManager::bake(Device *device, DeviceScene *dscene, Scene *scene, Progre task.shader_eval_type = shader_type; task.shader_x = 0; task.shader_w = d_output.size(); + task.num_samples = is_aa_pass(shader_type)? scene->integrator->aa_samples: 1; task.get_cancel = function_bind(&Progress::get_cancel, &progress); device->task_add(task); @@ -203,4 +205,35 @@ void BakeManager::device_free(Device *device, DeviceScene *dscene) { } +bool BakeManager::is_aa_pass(ShaderEvalType type) +{ + switch(type) { + case SHADER_EVAL_UV: + case SHADER_EVAL_NORMAL: + return false; + default: + return true; + } +} + +bool BakeManager::is_light_pass(ShaderEvalType type) +{ + switch(type) { + case SHADER_EVAL_AO: + case SHADER_EVAL_COMBINED: + case SHADER_EVAL_SHADOW: + case SHADER_EVAL_DIFFUSE_DIRECT: + case SHADER_EVAL_GLOSSY_DIRECT: + case SHADER_EVAL_TRANSMISSION_DIRECT: + case SHADER_EVAL_SUBSURFACE_DIRECT: + case SHADER_EVAL_DIFFUSE_INDIRECT: + case SHADER_EVAL_GLOSSY_INDIRECT: + case SHADER_EVAL_TRANSMISSION_INDIRECT: + case SHADER_EVAL_SUBSURFACE_INDIRECT: + return true; + default: + return false; + } +} + CCL_NAMESPACE_END diff --git a/intern/cycles/render/bake.h b/intern/cycles/render/bake.h index ea403f7d39a..f91ba589b8b 100644 --- a/intern/cycles/render/bake.h +++ b/intern/cycles/render/bake.h @@ -17,10 +17,11 @@ #ifndef __BAKE_H__ #define __BAKE_H__ -#include "util_vector.h" #include "device.h" #include "scene.h" -#include "session.h" + +#include "util_progress.h" +#include "util_vector.h" CCL_NAMESPACE_BEGIN @@ -64,6 +65,9 @@ public: void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress); void device_free(Device *device, DeviceScene *dscene); + static bool is_light_pass(ShaderEvalType type); + static bool is_aa_pass(ShaderEvalType type); + bool need_update; private: diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp index 1325627ef05..9a0a7ead696 100644 --- a/intern/cycles/render/light.cpp +++ b/intern/cycles/render/light.cpp @@ -66,6 +66,7 @@ static void shade_background_pixels(Device *device, DeviceScene *dscene, int res main_task.shader_eval_type = SHADER_EVAL_BACKGROUND; main_task.shader_x = 0; main_task.shader_w = width*height; + main_task.num_samples = 1; main_task.get_cancel = function_bind(&Progress::get_cancel, &progress); /* disabled splitting for now, there's an issue with multi-GPU mem_copy_from */ diff --git a/intern/cycles/render/mesh_displace.cpp b/intern/cycles/render/mesh_displace.cpp index 661fd9c66c1..4c0ee76299c 100644 --- a/intern/cycles/render/mesh_displace.cpp +++ b/intern/cycles/render/mesh_displace.cpp @@ -119,6 +119,7 @@ bool MeshManager::displace(Device *device, DeviceScene *dscene, Scene *scene, Me task.shader_eval_type = SHADER_EVAL_DISPLACE; task.shader_x = 0; task.shader_w = d_output.size(); + task.num_samples = 1; task.get_cancel = function_bind(&Progress::get_cancel, &progress); device->task_add(task); -- cgit v1.2.3