[Bf-blender-cvs] [f547bf2] master: Cycles: Make requested features struct aware of subsurface BSDF

Sergey Sharybin noreply at git.blender.org
Sat Nov 21 19:09:37 CET 2015


Commit: f547bf2f1013a86dc5a6646707256a174c2a1b47
Author: Sergey Sharybin
Date:   Sat Nov 21 22:31:58 2015 +0500
Branches: master
https://developer.blender.org/rBf547bf2f1013a86dc5a6646707256a174c2a1b47

Cycles: Make requested features struct aware of subsurface BSDF

This way we'll be able to disable SSS for the scene-adaptive kernel.

===================================================================

M	intern/cycles/device/device.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/render/session.cpp
M	intern/cycles/render/shader.cpp
M	intern/cycles/render/shader.h

===================================================================

diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h
index 769fb3c..b956090 100644
--- a/intern/cycles/device/device.h
+++ b/intern/cycles/device/device.h
@@ -100,6 +100,9 @@ public:
 	/* Denotes whether baking functionality is needed. */
 	bool use_baking;
 
+	/* Use subsurface scattering materials. */
+	bool use_subsurface;
+
 	DeviceRequestedFeatures()
 	{
 		/* TODO(sergey): Find more meaningful defaults. */
@@ -111,6 +114,7 @@ public:
 		use_object_motion = false;
 		use_camera_motion = false;
 		use_baking = false;
+		use_subsurface = false;
 	}
 
 	bool modified(const DeviceRequestedFeatures& requested_features)
@@ -122,7 +126,8 @@ public:
 		         use_hair == requested_features.use_hair &&
 		         use_object_motion == requested_features.use_object_motion &&
 		         use_camera_motion == requested_features.use_camera_motion &&
-		         use_baking == requested_features.use_baking);
+		         use_baking == requested_features.use_baking &&
+		         use_subsurface == requested_features.use_subsurface);
 	}
 
 	/* Convert the requested features structure to a build options,
@@ -151,6 +156,9 @@ public:
 		if(!use_baking) {
 			build_options += " -D__NO_BAKING__";
 		}
+		if(!use_subsurface) {
+			build_options += " -D__NO_SUBSURFACE__";
+		}
 		return build_options;
 	}
 };
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index 75a9e21..31ad494 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -180,7 +180,7 @@ CCL_NAMESPACE_BEGIN
 #  define __KERNEL_DEBUG__
 #endif
 
-/* Scene-based selective featrues compilation/ */
+/* Scene-based selective featrues compilation. */
 #ifdef __NO_CAMERA_MOTION__
 #  undef __CAMERA_MOTION__
 #endif
@@ -190,6 +190,9 @@ CCL_NAMESPACE_BEGIN
 #ifdef __NO_HAIR__
 #  undef __HAIR__
 #endif
+#ifdef __NO_SUBSURFACE__
+#  undef __SUBSURFACE__
+#endif
 
 /* Random Numbers */
 
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index 837c269..b5bc410 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -619,8 +619,7 @@ DeviceRequestedFeatures Session::get_requested_device_features()
 		requested_features.max_closure = get_max_closure_count();
 		scene->shader_manager->get_requested_features(
 		        scene,
-		        requested_features.max_nodes_group,
-		        requested_features.nodes_features);
+		        &requested_features);
 	}
 
 	/* This features are not being tweaked as often as shaders,
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index ae00bfb..556fbe4 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -490,42 +490,42 @@ void ShaderManager::add_default(Scene *scene)
 	}
 }
 
-/* NOTE: Expects max_group and features to be initialized in the callee. */
 void ShaderManager::get_requested_graph_features(ShaderGraph *graph,
-                                                 int& max_group,
-                                                 int& features)
+                                                 DeviceRequestedFeatures *requested_features)
 {
 	foreach(ShaderNode *node, graph->nodes) {
-		max_group = max(max_group, node->get_group());
-		features |= node->get_feature();
+		requested_features->max_nodes_group = max(requested_features->max_nodes_group,
+		                                          node->get_group());
+		requested_features->nodes_features |= node->get_feature();
 		if(node->special_type == SHADER_SPECIAL_TYPE_CLOSURE) {
 			BsdfNode *bsdf_node = static_cast<BsdfNode*>(node);
 			if(CLOSURE_IS_VOLUME(bsdf_node->closure)) {
-				features |= NODE_FEATURE_VOLUME;
+				requested_features->nodes_features |= NODE_FEATURE_VOLUME;
 			}
 		}
+		if(node->has_surface_bssrdf()) {
+			requested_features->use_subsurface = true;
+		}
 	}
 }
 
 void ShaderManager::get_requested_features(Scene *scene,
-                                           int& max_group,
-                                           int& features)
+                                           DeviceRequestedFeatures *requested_features)
 {
-	max_group = NODE_GROUP_LEVEL_0;
-	features = 0;
+	requested_features->max_nodes_group = NODE_GROUP_LEVEL_0;
+	requested_features->nodes_features = 0;
 	for(int i = 0; i < scene->shaders.size(); i++) {
 		Shader *shader = scene->shaders[i];
 		/* Gather requested features from all the nodes from the graph nodes. */
-		get_requested_graph_features(shader->graph, max_group, features);
+		get_requested_graph_features(shader->graph, requested_features);
 		/* Gather requested features from the graph itself. */
 		if(shader->graph_bump) {
 			get_requested_graph_features(shader->graph_bump,
-			                             max_group,
-			                             features);
+			                             requested_features);
 		}
 		ShaderNode *output_node = shader->graph->output();
 		if(output_node->input("Displacement")->link != NULL) {
-			features |= NODE_FEATURE_BUMP;
+			requested_features->nodes_features |= NODE_FEATURE_BUMP;
 		}
 	}
 }
diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h
index e34e784..b19b1c6 100644
--- a/intern/cycles/render/shader.h
+++ b/intern/cycles/render/shader.h
@@ -43,6 +43,7 @@ CCL_NAMESPACE_BEGIN
 
 class Device;
 class DeviceScene;
+class DeviceRequestedFeatures;
 class Mesh;
 class Progress;
 class Scene;
@@ -168,8 +169,7 @@ public:
 
 	/* Selective nodes compilation. */
 	void get_requested_features(Scene *scene,
-	                            int& max_group,
-	                            int& features);
+	                            DeviceRequestedFeatures *requested_features);
 
 protected:
 	ShaderManager();
@@ -183,8 +183,7 @@ protected:
 	size_t beckmann_table_offset;
 
 	void get_requested_graph_features(ShaderGraph *graph,
-	                                  int& max_group,
-	                                  int& features);
+	                                  DeviceRequestedFeatures *requested_features);
 };
 
 CCL_NAMESPACE_END




More information about the Bf-blender-cvs mailing list