[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15479] branches/apricot/source/blender/ gpu/intern: Apricot Branch: GLSL

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Jul 7 23:25:10 CEST 2008


Revision: 15479
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15479
Author:   blendix
Date:     2008-07-07 23:25:10 +0200 (Mon, 07 Jul 2008)

Log Message:
-----------
Apricot Branch: GLSL
====================

* Second attemp at solving exp/log incompatibility, some compilers
  don't seem to properly support preprocessor defines?
* Some simple optimizations to skip diffuse/specular/emit if they
  are set to zero.

Modified Paths:
--------------
    branches/apricot/source/blender/gpu/intern/gpu_codegen.c
    branches/apricot/source/blender/gpu/intern/gpu_codegen.h
    branches/apricot/source/blender/gpu/intern/gpu_material.c
    branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl
    branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl.c

Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_codegen.c	2008-07-07 21:18:30 UTC (rev 15478)
+++ branches/apricot/source/blender/gpu/intern/gpu_codegen.c	2008-07-07 21:25:10 UTC (rev 15479)
@@ -894,6 +894,20 @@
 static void gpu_node_input_link(GPUNode *node, GPUNodeLink *link, int type)
 {
 	GPUInput *input;
+	GPUNode *outnode;
+	char *name;
+
+	if(link->output) {
+		outnode = link->output->node;
+		name = outnode->name;
+
+		if(strcmp(name, "set_value")==0 || strcmp(name, "set_rgb")==0) {
+			input = MEM_dupallocN(outnode->inputs.first);
+			input->type = type;
+			BLI_addtail(&node->inputs, input);
+			return;
+		}
+	}
 	
 	input = MEM_callocN(sizeof(GPUInput), "GPUInput");
 	input->node = node;
@@ -1280,6 +1294,27 @@
 	return 1;
 }
 
+int GPU_link_changed(GPUNodeLink *link)
+{
+	GPUNode *node;
+	GPUInput *input;
+	char *name;
+
+	if(link->output) {
+		node = link->output->node;
+		name = node->name;
+
+		if(strcmp(name, "set_value")==0 || strcmp(name, "set_rgb")==0) {
+			input = node->inputs.first;
+			return (input->link != NULL);
+		}
+
+		return 1;
+	}
+	else
+		return 0;
+}
+
 /* Pass create/free */
 
 void gpu_nodes_tag(GPUNodeLink *link)

Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.h
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_codegen.h	2008-07-07 21:18:30 UTC (rev 15478)
+++ branches/apricot/source/blender/gpu/intern/gpu_codegen.h	2008-07-07 21:25:10 UTC (rev 15479)
@@ -80,6 +80,7 @@
 
 char *GPU_builtin_name(GPUBuiltin builtin);
 void gpu_material_add_node(struct GPUMaterial *material, struct GPUNode *node);
+int GPU_link_changed(struct GPUNodeLink *link);
 
 #endif
 

Modified: branches/apricot/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_material.c	2008-07-07 21:18:30 UTC (rev 15478)
+++ branches/apricot/source/blender/gpu/intern/gpu_material.c	2008-07-07 21:25:10 UTC (rev 15479)
@@ -579,13 +579,16 @@
 	else
 		GPU_link(mat, "set_value", GPU_uniform(&one), &shadfac);
 
-	if(!(lamp->mode & LA_NO_DIFF)) {
-		GPUNodeLink *rgb;
-		GPU_link(mat, "shade_mul_value", i, GPU_dynamic_uniform(lamp->dyncol), &rgb);
-		add_to_diffuse(mat, ma, shi, is, rgb, &shr->diff);
+	if(GPU_link_changed(shi->refl) || ma->ref != 0.0f) {
+		if(!(lamp->mode & LA_NO_DIFF)) {
+			GPUNodeLink *rgb;
+			GPU_link(mat, "shade_mul_value", i, GPU_dynamic_uniform(lamp->dyncol), &rgb);
+			add_to_diffuse(mat, ma, shi, is, rgb, &shr->diff);
+		}
 	}
 
-	if(!(lamp->mode & LA_NO_SPEC) && !(lamp->mode & LA_ONLYSHADOW)) {
+	if(!(lamp->mode & LA_NO_SPEC) && !(lamp->mode & LA_ONLYSHADOW) &&
+	   (GPU_link_changed(shi->spec) || ma->spec != 0.0f)) {
 		if(lamp->type == LA_HEMI) {
 			GPU_link(mat, "shade_hemi_spec", vn, lv, view, GPU_uniform(&ma->spec), shi->har, visifac, &t);
 			GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol), shi->specrgb, &outcol);
@@ -955,12 +958,16 @@
 		shr->alpha = shi->alpha;
 	}
 	else {
-		if((ma->mode & (MA_VERTEXCOL|MA_VERTEXCOLP))== MA_VERTEXCOL) {
-			GPU_link(mat, "shade_add", shi->emit, shi->vcol, &emit);
-			GPU_link(mat, "shade_mul", emit, shi->rgb, &shr->diff);
+		if(GPU_link_changed(shi->emit) || ma->emit != 0.0f) {
+			if((ma->mode & (MA_VERTEXCOL|MA_VERTEXCOLP))== MA_VERTEXCOL) {
+				GPU_link(mat, "shade_add", shi->emit, shi->vcol, &emit);
+				GPU_link(mat, "shade_mul", emit, shi->rgb, &shr->diff);
+			}
+			else
+				GPU_link(mat, "shade_mul_value", shi->emit, shi->rgb, &shr->diff);
 		}
 		else
-			GPU_link(mat, "shade_mul_value", shi->emit, shi->rgb, &shr->diff);
+			GPU_link(mat, "set_rgb_zero", &shr->diff);
 
 		GPU_link(mat, "set_rgb_zero", &shr->spec);
 
@@ -972,10 +979,12 @@
 		if(ma->mode & MA_RAMP_COL) ramp_diffuse_result(shi, &shr->combined);
 		if(ma->mode & MA_RAMP_SPEC) ramp_spec_result(shi, &shr->spec);
 
-		GPU_link(mat, "shade_add", shr->combined, shr->spec, &shr->combined);
+		if(GPU_link_changed(shi->spec) || ma->spec != 0.0f)
+			GPU_link(mat, "shade_add", shr->combined, shr->spec, &shr->combined);
 	}
 
-	GPU_link(mat, "mtex_alpha_to_col", shr->combined, shr->alpha, &shr->combined);
+	if(mat->alpha)
+		GPU_link(mat, "mtex_alpha_to_col", shr->combined, shr->alpha, &shr->combined);
 }
 
 GPUNodeLink *GPU_blender_material(GPUMaterial *mat, Material *ma)

Modified: branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl	2008-07-07 21:18:30 UTC (rev 15478)
+++ branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl	2008-07-07 21:25:10 UTC (rev 15479)
@@ -1,18 +1,9 @@
 
-#if __VERSION__ < 110
-
-float exp(float f)
+float exp_blender(float f)
 {
 	return pow(2.71828182846, f);
 }
 
-float log(float f)
-{
-	return log2(f)/log2(2.71828182846);
-}
-
-#endif
-
 void rgb_to_hsv(vec4 rgb, out vec4 outcol)
 {
 	float cmax, cmin, h, s, v, cdelta;
@@ -197,7 +188,7 @@
 void math_log(float val1, float val2, out float outval)
 {
 	if(val1 > 0.0  && val2 > 0.0)
-		outval= log(val1) / log(val2);
+		outval= log2(val1) / log2(val2);
 	else
 		outval= 0.0;
 }
@@ -1429,7 +1420,7 @@
 				float f = (((p-vh)*(p-vh))/((p+vh)*(p+vh)))*(1.0+((((vh*(p+vh))-1.0)*((vh*(p+vh))-1.0))/(((vh*(p-vh))+1.0)*((vh*(p-vh))+1.0))));
 				float ang = acos(nh);
 
-				specfac = max(f*g*exp((-(ang*ang)/(2.0*spec_power*spec_power))), 0.0);
+				specfac = max(f*g*exp_blender((-(ang*ang)/(2.0*spec_power*spec_power))), 0.0);
 			}
 		}
 	}
@@ -1444,7 +1435,7 @@
 	float angle = tan(acos(nh));
 	float alpha = max(rms, 0.001);
 
-	specfac= nl * (1.0/(4.0*M_PI*alpha*alpha))*(exp(-(angle*angle)/(alpha*alpha))/(sqrt(nv*nl)));
+	specfac= nl * (1.0/(4.0*M_PI*alpha*alpha))*(exp_blender(-(angle*angle)/(alpha*alpha))/(sqrt(nv*nl)));
 }
 
 void shade_toon_spec(vec3 n, vec3 l, vec3 v, float size, float tsmooth, out float specfac)

Modified: branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl.c	2008-07-07 21:18:30 UTC (rev 15478)
+++ branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl.c	2008-07-07 21:25:10 UTC (rev 15479)
@@ -1,12 +1,10 @@
 /* DataToC output of file <gpu_shader_material_glsl> */
 
-int datatoc_gpu_shader_material_glsl_size= 33564;
+int datatoc_gpu_shader_material_glsl_size= 32712;
 char datatoc_gpu_shader_material_glsl[]= {
- 10, 35,105,102, 32, 95, 95, 86, 69, 82, 83, 73, 79, 78, 95, 95, 32, 60, 32, 49, 49, 48, 10, 10,102,108,111, 97,
-116, 32,101,120,112, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10,  9,114,101,116,117,114,110, 32,112,111,119, 40, 50, 46, 55,
- 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,108,111,103, 40,102,108,111,
- 97,116, 32,102, 41, 10,123, 10,  9,114,101,116,117,114,110, 32,108,111,103, 50, 40,102, 41, 47,108,111,103, 50, 40, 50, 46, 55,
- 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 41, 59, 10,125, 10, 10, 35,101,110,100,105,102, 10, 10,118,111,105,100, 32,114,103, 98,
+ 10,102,108,111, 97,116, 32,101,
+120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10,  9,114,101,116,117,114,110, 32,112,111,
+119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98,
  95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,
 108, 41, 10,123, 10,  9,102,108,111, 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105,110, 44, 32,104, 44, 32,115, 44, 32,118, 44,
  32, 99,100,101,108,116, 97, 59, 10,  9,118,101, 99, 51, 32, 99, 59, 10, 10,  9, 99,109, 97,120, 32, 61, 32,109, 97,120, 40,114,
@@ -116,910 +114,886 @@
  59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,111,103, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,
 108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,
 105,102, 40,118, 97,108, 49, 32, 62, 32, 48, 46, 48, 32, 32, 38, 38, 32,118, 97,108, 50, 32, 62, 32, 48, 46, 48, 41, 10,  9,  9,
-111,117,116,118, 97,108, 61, 32,108,111,103, 40,118, 97,108, 49, 41, 32, 47, 32,108,111,103, 40,118, 97,108, 50, 41, 59, 10,  9,
-101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104,
- 95,109, 97,120, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116,
- 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40,118,
- 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,105,110, 40,102,108,111,
- 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
-117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,109,105,110, 40,118, 97,108, 49, 44, 32,118, 97,108,
- 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,114,111,117,110,100, 40,102,108,111, 97,116, 32,118, 97,108,
- 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 61, 32,102,
-108,111,111,114, 40,118, 97,108, 32, 43, 32, 48, 46, 53, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,101,
-115,115, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 60, 32,118,
- 97,108, 50, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,
-118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,103,114,101, 97,116,101,114, 95,
-116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116,

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list