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:
-rw-r--r--intern/cycles/device/device.h8
-rw-r--r--intern/cycles/device/device_opencl.cpp13
-rw-r--r--intern/cycles/kernel/kernel_types.h11
-rw-r--r--intern/cycles/render/session.cpp19
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;
}