[Bf-blender-cvs] [7b144e3] temp-cycles-microdisplacement: Cycles: remove duplicate shader storage

Mai Lavelle noreply at git.blender.org
Thu Aug 18 18:22:30 CEST 2016


Commit: 7b144e306bd7d31ae6402b26d92acae970373391
Author: Mai Lavelle
Date:   Tue Aug 16 19:42:08 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB7b144e306bd7d31ae6402b26d92acae970373391

Cycles: remove duplicate shader storage

Storing multiple copies of a shader was needed when the displacement method was
a mesh option and could be different for each mesh. Now that its a shader option
this is unnecessary.

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

M	intern/cycles/render/mesh.cpp
M	intern/cycles/render/osl.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/mesh.cpp b/intern/cycles/render/mesh.cpp
index 257e831..25a3d1d 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -580,7 +580,7 @@ void Mesh::pack_normals(Scene *scene, uint *tri_shader, float4 *vnormal)
 			last_smooth = smooth[i];
 			Shader *shader = (last_shader < used_shaders.size()) ?
 				used_shaders[last_shader] : scene->default_surface;
-			shader_id = scene->shader_manager->get_shader_id(shader, this, last_smooth);
+			shader_id = scene->shader_manager->get_shader_id(shader, last_smooth);
 		}
 
 		tri_shader[i] = shader_id;
@@ -652,7 +652,7 @@ void Mesh::pack_curves(Scene *scene, float4 *curve_key_co, float4 *curve_data, s
 			int shader_id = curve_shader[i];
 			Shader *shader = (shader_id < used_shaders.size()) ?
 				used_shaders[shader_id] : scene->default_surface;
-			shader_id = scene->shader_manager->get_shader_id(shader, this, false);
+			shader_id = scene->shader_manager->get_shader_id(shader, false);
 
 			curve_data[i] = make_float4(
 				__int_as_float(curve.first_key + curvekey_offset),
diff --git a/intern/cycles/render/osl.cpp b/intern/cycles/render/osl.cpp
index 1a6ae5f..8d5e295 100644
--- a/intern/cycles/render/osl.cpp
+++ b/intern/cycles/render/osl.cpp
@@ -1146,13 +1146,14 @@ void OSLCompiler::compile(Scene *scene, OSLGlobals *og, Shader *shader)
 	}
 
 	/* push state to array for lookup */
-	og->surface_state.push_back(shader->osl_surface_ref);
-	og->surface_state.push_back(shader->osl_surface_bump_ref);
+	if(shader->displacement_method == DISPLACE_TRUE || !shader->graph_bump) {
+		og->surface_state.push_back(shader->osl_surface_ref);
+	}
+	else {
+		og->surface_state.push_back(shader->osl_surface_bump_ref);
+	}
 
 	og->volume_state.push_back(shader->osl_volume_ref);
-	og->volume_state.push_back(shader->osl_volume_ref);
-
-	og->displacement_state.push_back(shader->osl_displacement_ref);
 	og->displacement_state.push_back(shader->osl_displacement_ref);
 }
 
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index d000cca..4a3233a 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -312,14 +312,11 @@ uint ShaderManager::get_attribute_id(AttributeStandard std)
 	return (uint)std;
 }
 
-int ShaderManager::get_shader_id(Shader *shader, Mesh *mesh, bool smooth)
+int ShaderManager::get_shader_id(Shader *shader, bool smooth)
 {
 	/* get a shader id to pass to the kernel */
-	int id = shader->id*2;
-	
-	/* index depends bump since this setting is not in the shader */
-	if(mesh && shader->displacement_method != DISPLACE_TRUE)
-		id += 1;
+	int id = shader->id;
+
 	/* smooth flag */
 	if(smooth)
 		id |= SHADER_SMOOTH_NORMAL;
@@ -368,7 +365,7 @@ void ShaderManager::device_update_common(Device *device,
 	if(scene->shaders.size() == 0)
 		return;
 
-	uint shader_flag_size = scene->shaders.size()*4;
+	uint shader_flag_size = scene->shaders.size()*2;
 	uint *shader_flag = dscene->shader_flag.resize(shader_flag_size);
 	uint i = 0;
 	bool has_volumes = false;
@@ -407,14 +404,11 @@ void ShaderManager::device_update_common(Device *device,
 		if(shader->graph_bump)
 			flag |= SD_HAS_BUMP;
 
-		/* regular shader */
-		shader_flag[i++] = flag;
-		shader_flag[i++] = shader->pass_id;
-
 		/* shader with bump mapping */
-		if(shader->graph_bump)
+		if(shader->displacement_method != DISPLACE_TRUE && shader->graph_bump)
 			flag |= SD_HAS_BSSRDF_BUMP;
 
+		/* regular shader */
 		shader_flag[i++] = flag;
 		shader_flag[i++] = shader->pass_id;
 
diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h
index 060ad70..696e22b 100644
--- a/intern/cycles/render/shader.h
+++ b/intern/cycles/render/shader.h
@@ -173,7 +173,7 @@ public:
 	uint get_attribute_id(AttributeStandard std);
 
 	/* get shader id for mesh faces */
-	int get_shader_id(Shader *shader, Mesh *mesh = NULL, bool smooth = false);
+	int get_shader_id(Shader *shader, bool smooth = false);
 
 	/* add default shaders to scene, to use as default for things that don't
 	 * have any shader assigned explicitly */
diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp
index 1a16688..be87b35 100644
--- a/intern/cycles/render/svm.cpp
+++ b/intern/cycles/render/svm.cpp
@@ -63,7 +63,6 @@ void SVMShaderManager::device_update(Device *device, DeviceScene *dscene, Scene
 
 	for(i = 0; i < scene->shaders.size(); i++) {
 		svm_nodes.push_back(make_int4(NODE_SHADER_JUMP, 0, 0, 0));
-		svm_nodes.push_back(make_int4(NODE_SHADER_JUMP, 0, 0, 0));
 	}
 
 	foreach(Shader *shader, scene->shaders) {
@@ -754,18 +753,16 @@ void SVMCompiler::compile(Scene *scene,
 	shader->has_integrator_dependency = false;
 
 	/* generate surface shader */
-	{
+	if(shader->displacement_method == DISPLACE_TRUE || !shader->graph_bump) {
 		scoped_timer timer((summary != NULL)? &summary->time_generate_surface: NULL);
 		compile_type(shader, shader->graph, SHADER_TYPE_SURFACE);
-		global_svm_nodes[index*2 + 0].y = global_svm_nodes.size();
-		global_svm_nodes[index*2 + 1].y = global_svm_nodes.size();
+		global_svm_nodes[index].y = global_svm_nodes.size();
 		global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
 	}
-
-	if(shader->graph_bump) {
+	else {
 		scoped_timer timer((summary != NULL)? &summary->time_generate_bump: NULL);
 		compile_type(shader, shader->graph_bump, SHADER_TYPE_SURFACE);
-		global_svm_nodes[index*2 + 1].y = global_svm_nodes.size();
+		global_svm_nodes[index].y = global_svm_nodes.size();
 		global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
 	}
 
@@ -773,8 +770,7 @@ void SVMCompiler::compile(Scene *scene,
 	{
 		scoped_timer timer((summary != NULL)? &summary->time_generate_volume: NULL);
 		compile_type(shader, shader->graph, SHADER_TYPE_VOLUME);
-		global_svm_nodes[index*2 + 0].z = global_svm_nodes.size();
-		global_svm_nodes[index*2 + 1].z = global_svm_nodes.size();
+		global_svm_nodes[index].z = global_svm_nodes.size();
 		global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
 	}
 
@@ -782,8 +778,7 @@ void SVMCompiler::compile(Scene *scene,
 	{
 		scoped_timer timer((summary != NULL)? &summary->time_generate_displacement: NULL);
 		compile_type(shader, shader->graph, SHADER_TYPE_DISPLACEMENT);
-		global_svm_nodes[index*2 + 0].w = global_svm_nodes.size();
-		global_svm_nodes[index*2 + 1].w = global_svm_nodes.size();
+		global_svm_nodes[index].w = global_svm_nodes.size();
 		global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
 	}




More information about the Bf-blender-cvs mailing list