[Bf-blender-cvs] [9912c31] cycles_kernel_split: Cycles kernel split: Get rid of loading kernels from run_cpu/run_gpu

Sergey Sharybin noreply at git.blender.org
Thu May 7 15:53:56 CEST 2015


Commit: 9912c3127ebc15526b259b8f7eba15e8d473c8f9
Author: Sergey Sharybin
Date:   Thu May 7 16:32:53 2015 +0500
Branches: cycles_kernel_split
https://developer.blender.org/rB9912c3127ebc15526b259b8f7eba15e8d473c8f9

Cycles kernel split: Get rid of loading kernels from run_cpu/run_gpu

It's not proper way to do it and proper approach should be:

- Requested device capabilities should be calculatable prior to device_update.
  This basically means all the things are to be coming from C++ classes, not
  from packed textures and so.

- Kernel might be needed to be reloaded (for example if node set is changed
  in the viewport, but it'll need to have proper check around if kernel really
  need to be reloaded.

- Device capabilities are to be fast to calculate and for the clearity of the
  model should be always passed to the device, without extra checks whether
  device actually needs those capabilities.

Current code is not totally optimal for the viewport, but in terms of node
set it matches previous behavior and it also fixes issues around possible
wrong max closure counter passed to the kernel after tweaks in the shader
tree.

P.S. Capability is getting a bit overused here, would need to make clear
naming for it.

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

M	intern/cycles/render/session.cpp
M	intern/cycles/render/shader.cpp
M	intern/cycles/render/shader.h
M	intern/cycles/render/svm.cpp

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

diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index 9d6e925..a46d624 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -270,11 +270,6 @@ void Session::run_gpu()
 			/* update status and timing */
 			update_status_time();
 
-			if (device->info.use_split_kernel) {
-				/* OpenCL split - load kernels */
-				load_kernels();
-			}
-
 			/* path trace */
 			path_trace();
 
@@ -559,11 +554,6 @@ void Session::run_cpu()
 			/* update status and timing */
 			update_status_time();
 
-			if (device->info.use_split_kernel) {
-				/* OpenCL split - load kernels */
-				load_kernels();
-			}
-
 			/* path trace */
 			path_trace();
 
@@ -645,17 +635,21 @@ void Session::load_kernels()
 void Session::run()
 {
 	if (device->info.use_split_kernel) {
-		device->clos_max = max_closure_count_get();
+		if(!params.background) {
+			device->clos_max = 64;
+			device->nodes_max_group = NODE_GROUP_LEVEL_2;
+			device->nodes_features = NODE_FEATURE_ALL;
+		}
+		else {
+			device->clos_max = max_closure_count_get();
+			scene->shader_manager->get_requested_features(scene,
+			                                              device->nodes_max_group,
+			                                              device->nodes_features);
+		}
 	}
 
 	/* load kernels */
-	/* Note : OpenCL split kernel does not load kernels here. OpenCL split kernel needs to know
-	 * closures that will be used in rendering, which is not known at this point; Hence we
-	 * defer OpenCL split kernel load_kernels() to after device_update
-	 */
-	if (!device->info.use_split_kernel) {
-		load_kernels();
-	}
+	load_kernels();
 
 	/* session thread loop */
 	progress.set_status("Waiting for render to start");
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index 971cd50..2ff29e5 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -480,5 +480,24 @@ void ShaderManager::add_default(Scene *scene)
 	}
 }
 
+void ShaderManager::get_requested_features(Scene *scene, int& max_group, int& features)
+{
+	max_group = NODE_GROUP_LEVEL_0;
+	features = 0;
+	for(int i = 0; i < scene->shaders.size(); i++) {
+		Shader *shader = scene->shaders[i];
+		foreach(ShaderNode *node, shader->graph->nodes) {
+			max_group = min(max_group, node->group_get());
+			features |= node->feature_get();
+			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;
+				}
+			}
+		}
+	}
+}
+
 CCL_NAMESPACE_END
 
diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h
index 5bcb2c4..27b2396 100644
--- a/intern/cycles/render/shader.h
+++ b/intern/cycles/render/shader.h
@@ -165,6 +165,9 @@ public:
 	 * have any shader assigned explicitly */
 	static void add_default(Scene *scene);
 
+	/* Selective nodes compilation. */
+	void get_requested_features(Scene *scene, int& max_group, int& features);
+
 protected:
 	ShaderManager();
 
diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp
index 16c07e9..d0bd349 100644
--- a/intern/cycles/render/svm.cpp
+++ b/intern/cycles/render/svm.cpp
@@ -81,25 +81,6 @@ void SVMShaderManager::device_update(Device *device, DeviceScene *dscene, Scene
 		compiler.compile(shader, svm_nodes, i);
 	}
 
-	/* TODO(sergey): Move this outside of device_update(). */
-	int max_group = NODE_GROUP_LEVEL_0;
-	int features = 0;
-	for(i = 0; i < scene->shaders.size(); i++) {
-		Shader *shader = scene->shaders[i];
-		foreach(ShaderNode *node, shader->graph->nodes) {
-			max_group = min(max_group, node->group_get());
-			features |= node->feature_get();
-			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;
-				}
-			}
-		}
-	}
-	device->nodes_max_group = max_group;
-	device->nodes_features = features;
-
 	dscene->svm_nodes.copy((uint4*)&svm_nodes[0], svm_nodes.size());
 	device->tex_alloc("__svm_nodes", dscene->svm_nodes);




More information about the Bf-blender-cvs mailing list