diff options
-rw-r--r-- | intern/cycles/device/device.h | 8 | ||||
-rw-r--r-- | intern/cycles/device/device_opencl.cpp | 13 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_types.h | 11 | ||||
-rw-r--r-- | intern/cycles/render/session.cpp | 19 |
4 files changed, 51 insertions, 0 deletions
diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h index 8ac3df1797c..6b4a190bbf0 100644 --- a/intern/cycles/device/device.h +++ b/intern/cycles/device/device.h @@ -92,6 +92,11 @@ public: */ int nodes_features; + /* BVH/sampling kernel features. */ + bool use_hair; + bool use_object_motion; + bool use_camera_motion; + DeviceRequestedFeatures() { /* TODO(sergey): Find more meaningful defaults. */ @@ -99,6 +104,9 @@ public: max_closure = 0; max_nodes_group = 0; nodes_features = 0; + use_hair = false; + use_object_motion = false; + use_camera_motion = false; } bool modified(const DeviceRequestedFeatures& requested_features) diff --git a/intern/cycles/device/device_opencl.cpp b/intern/cycles/device/device_opencl.cpp index 6cda617e43a..7873d70c65c 100644 --- a/intern/cycles/device/device_opencl.cpp +++ b/intern/cycles/device/device_opencl.cpp @@ -1977,6 +1977,10 @@ public: #ifdef __WORK_STEALING__ build_options += " -D__WORK_STEALING__"; #endif + + /* TODO(sergey): Make it a separate function to convert requested + * features to build flags in order to make code a bit cleaner. + */ if(requested_features.experimental) { build_options += " -D__KERNEL_EXPERIMENTAL__"; } @@ -1985,6 +1989,15 @@ public: build_options += " -D__NODES_FEATURES__=" + string_printf("%d", requested_features.nodes_features); build_options += string_printf(" -D__MAX_CLOSURE__=%d", max_closure); + if(!requested_features.use_hair) { + build_options += " -D__NO_HAIR__"; + } + if(!requested_features.use_object_motion) { + build_options += " -D__NO_OBJECT_MOTION__"; + } + if(!requested_features.use_camera_motion) { + build_options += " -D__NO_CAMERA_MOTION__"; + } /* Set compute device build option. */ cl_device_type device_type; diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 55b22a1fc54..aec4fd9b325 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -172,6 +172,17 @@ CCL_NAMESPACE_BEGIN # define __KERNEL_DEBUG__ #endif +/* Scene-based selective featrues compilation/ */ +#ifdef __NO_CAMERA_MOTION__ +# undef __CAMERA_MOTION__ +#endif +#ifdef __NO_OBJECT_MOTION__ +# undef __OBJECT_MOTION__ +#endif +#ifdef __NO_HAIR__ +# undef __HAIR__ +#endif + /* Random Numbers */ typedef uint RNG; diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp index a9a03e54cf7..975fa5a76d1 100644 --- a/intern/cycles/render/session.cpp +++ b/intern/cycles/render/session.cpp @@ -22,6 +22,8 @@ #include "device.h" #include "graph.h" #include "integrator.h" +#include "mesh.h" +#include "object.h" #include "scene.h" #include "session.h" #include "bake.h" @@ -604,6 +606,7 @@ void Session::run_cpu() DeviceRequestedFeatures Session::get_requested_device_features() { + /* TODO(sergey): Consider moving this to the Scene level. */ DeviceRequestedFeatures requested_features; requested_features.experimental = params.experimental; if(!params.background) { @@ -618,6 +621,22 @@ DeviceRequestedFeatures Session::get_requested_device_features() requested_features.max_nodes_group, requested_features.nodes_features); } + + /* This features are not being tweaked as often as shaders, + * so could be done selective magic for the viewport as well. + */ + requested_features.use_hair = false; + requested_features.use_object_motion = false; + requested_features.use_camera_motion = scene->camera->use_motion; + foreach(Object *object, scene->objects) { + Mesh *mesh = object->mesh; + if(mesh->curves.size() > 0) { + requested_features.use_hair = true; + } + requested_features.use_object_motion |= object->use_motion | mesh->use_motion_blur; + requested_features.use_camera_motion |= mesh->use_motion_blur; + } + return requested_features; } |