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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs