[Bf-blender-cvs] [28d52ef] cycles_kernel_split: Cycles kernel split: Simplify closure counting

Sergey Sharybin noreply at git.blender.org
Wed May 6 14:37:53 CEST 2015


Commit: 28d52efdcbf1b9771a888595a1a9aa3b81718f96
Author: Sergey Sharybin
Date:   Wed May 6 17:11:48 2015 +0500
Branches: cycles_kernel_split
https://developer.blender.org/rB28d52efdcbf1b9771a888595a1a9aa3b81718f96

Cycles kernel split: Simplify closure counting

The new way does not require having closure type stored in the most generic
ShaderNode class and uses special_type instead to see if it's BSDF node and
get closure from BsdfNode.

Did not see any difference in the behavior with new implementation in file
with all closures added to the same shader tree via mix nodes.

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

M	intern/cycles/kernel/svm/svm_types.h
M	intern/cycles/render/graph.cpp
M	intern/cycles/render/graph.h
M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/session.cpp
M	intern/cycles/render/session.h

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

diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index ed62860..d9f08a6 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -431,6 +431,7 @@ typedef enum ClosureType {
 #define CLOSURE_IS_BACKGROUND(type) (type == CLOSURE_BACKGROUND_ID)
 #define CLOSURE_IS_AMBIENT_OCCLUSION(type) (type == CLOSURE_AMBIENT_OCCLUSION_ID)
 #define CLOSURE_IS_PHASE(type) (type == CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID)
+#define CLOSURE_IS_GLASS(type) (type >= CLOSURE_BSDF_MICROFACET_BECKMANN_GLASS_ID && type <= CLOSURE_BSDF_SHARP_GLASS_ID)
 
 #define CLOSURE_WEIGHT_CUTOFF 1e-5f
 
diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp
index 0ec18a2..6a63833 100644
--- a/intern/cycles/render/graph.cpp
+++ b/intern/cycles/render/graph.cpp
@@ -834,6 +834,26 @@ void ShaderGraph::transform_multi_closure(ShaderNode *node, ShaderOutput *weight
 	}
 }
 
+int ShaderGraph::get_num_closures()
+{
+	int num_closures = 0;
+	foreach(ShaderNode *node, nodes) {
+		if(node->special_type == SHADER_SPECIAL_TYPE_CLOSURE) {
+			BsdfNode *bsdf_node = static_cast<BsdfNode*>(node);
+			/* TODO(sergey): Make it more generic approach, maybe some utility
+			 * macros like CLOSURE_IS_FOO()?
+			 */
+			if(CLOSURE_IS_BSSRDF(bsdf_node->closure))
+				num_closures = num_closures + 3;
+			else if(CLOSURE_IS_GLASS(bsdf_node->closure))
+				num_closures = num_closures + 2;
+			else
+				num_closures = num_closures + 1;
+		}
+	}
+	return num_closures;
+}
+
 void ShaderGraph::dump_graph(const char *filename)
 {
 	FILE *fd = fopen(filename, "w");
diff --git a/intern/cycles/render/graph.h b/intern/cycles/render/graph.h
index d8b4e0a..59f5a3a 100644
--- a/intern/cycles/render/graph.h
+++ b/intern/cycles/render/graph.h
@@ -82,6 +82,7 @@ enum ShaderNodeSpecialType {
 	SHADER_SPECIAL_TYPE_SCRIPT,
 	SHADER_SPECIAL_TYPE_BACKGROUND,
 	SHADER_SPECIAL_TYPE_IMAGE_SLOT,
+	SHADER_SPECIAL_TYPE_CLOSURE,
 };
 
 /* Enum
@@ -255,6 +256,8 @@ public:
 	void remove_unneeded_nodes();
 	void finalize(bool do_bump = false, bool do_osl = false);
 
+	int get_num_closures();
+
 	void dump_graph(const char *filename);
 
 protected:
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 2df1a29..8f39fbe 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -1520,6 +1520,8 @@ void ProxyNode::compile(OSLCompiler& /*compiler*/)
 BsdfNode::BsdfNode(bool scattering_)
 : ShaderNode("bsdf"), scattering(scattering_)
 {
+	special_type = SHADER_SPECIAL_TYPE_CLOSURE;
+
 	add_input("Color", SHADER_SOCKET_COLOR, make_float3(0.8f, 0.8f, 0.8f));
 	add_input("Normal", SHADER_SOCKET_NORMAL, ShaderInput::NORMAL);
 	add_input("SurfaceMixWeight", SHADER_SOCKET_FLOAT, 0.0f, ShaderInput::USE_SVM);
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index 6c559a7..023cd83 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -663,7 +663,7 @@ static int getClosureCount(Scene *scene)
 void Session::run()
 {
 	if (device->info.use_split_kernel) {
-		device->clos_max = getClosureCount(scene);
+		device->clos_max = max_closure_count_get();
 	}
 
 	/* load kernels */
@@ -986,4 +986,17 @@ void Session::device_free()
 	 */
 }
 
+int Session::max_closure_count_get()
+{
+	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);
+	}
+	if(max_closures > maxclosure) {
+		maxclosure = max_closures;
+	}
+	return maxclosure;
+}
+
 CCL_NAMESPACE_END
diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h
index 8b108b0..b04170c 100644
--- a/intern/cycles/render/session.h
+++ b/intern/cycles/render/session.h
@@ -204,6 +204,9 @@ protected:
 	bool update_progressive_refine(bool cancel);
 
 	vector<RenderBuffers *> tile_buffers;
+
+	/* Number of closures for split kernel. */
+	int max_closure_count_get();
 };
 
 CCL_NAMESPACE_END




More information about the Bf-blender-cvs mailing list