[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52743] trunk/blender/intern/cycles/kernel : Fix cycles issue when NaN is used for RGB ramp, can access array out of bounds then.
Brecht Van Lommel
brechtvanlommel at pandora.be
Mon Dec 3 13:21:46 CET 2012
Revision: 52743
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52743
Author: blendix
Date: 2012-12-03 12:21:44 +0000 (Mon, 03 Dec 2012)
Log Message:
-----------
Fix cycles issue when NaN is used for RGB ramp, can access array out of bounds then.
OSL noise() function is generating NaN's in certain cases, fix for that goes to our
OSL branch.
Also add missing minimum weight and max closure checks to OSL, forgot to add these
when fixing another bug.
Modified Paths:
--------------
trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp
trunk/blender/intern/cycles/kernel/shaders/node_rgb_ramp.osl
trunk/blender/intern/cycles/kernel/svm/svm_ramp.h
Modified: trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp 2012-12-03 12:04:15 UTC (rev 52742)
+++ trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp 2012-12-03 12:21:44 UTC (rev 52743)
@@ -150,13 +150,14 @@
/* sample weight */
float sample_weight = fabsf(average(weight));
- sd->flag |= bsdf->shaderdata_flag();
-
sc.sample_weight = sample_weight;
sc.type = bsdf->shaderclosure_type();
/* add */
- sd->closure[sd->num_closure++] = sc;
+ if(sc.sample_weight > 1e-5f && sd->num_closure < MAX_CLOSURE) {
+ sd->closure[sd->num_closure++] = sc;
+ sd->flag |= bsdf->shaderdata_flag();
+ }
break;
}
case OSL::ClosurePrimitive::Emissive: {
@@ -170,9 +171,10 @@
sc.type = CLOSURE_EMISSION_ID;
/* flag */
- sd->flag |= SD_EMISSION;
-
- sd->closure[sd->num_closure++] = sc;
+ if(sd->num_closure < MAX_CLOSURE) {
+ sd->closure[sd->num_closure++] = sc;
+ sd->flag |= SD_EMISSION;
+ }
break;
}
case AmbientOcclusion: {
@@ -185,8 +187,10 @@
sc.sample_weight = sample_weight;
sc.type = CLOSURE_AMBIENT_OCCLUSION_ID;
- sd->closure[sd->num_closure++] = sc;
- sd->flag |= SD_AO;
+ if(sd->num_closure < MAX_CLOSURE) {
+ sd->closure[sd->num_closure++] = sc;
+ sd->flag |= SD_AO;
+ }
break;
}
case OSL::ClosurePrimitive::Holdout:
@@ -195,8 +199,11 @@
sc.sample_weight = 0.0f;
sc.type = CLOSURE_HOLDOUT_ID;
- sd->flag |= SD_HOLDOUT;
- sd->closure[sd->num_closure++] = sc;
+
+ if(sd->num_closure < MAX_CLOSURE) {
+ sd->closure[sd->num_closure++] = sc;
+ sd->flag |= SD_HOLDOUT;
+ }
break;
case OSL::ClosurePrimitive::BSSRDF:
case OSL::ClosurePrimitive::Debug:
@@ -334,7 +341,8 @@
sc.type = CLOSURE_VOLUME_ID;
/* add */
- sd->closure[sd->num_closure++] = sc;
+ if(sc.sample_weight > 1e-5f && sd->num_closure < MAX_CLOSURE)
+ sd->closure[sd->num_closure++] = sc;
break;
}
case OSL::ClosurePrimitive::Holdout:
Modified: trunk/blender/intern/cycles/kernel/shaders/node_rgb_ramp.osl
===================================================================
--- trunk/blender/intern/cycles/kernel/shaders/node_rgb_ramp.osl 2012-12-03 12:04:15 UTC (rev 52742)
+++ trunk/blender/intern/cycles/kernel/shaders/node_rgb_ramp.osl 2012-12-03 12:21:44 UTC (rev 52743)
@@ -29,7 +29,10 @@
{
float f = clamp(Fac, 0.0, 1.0) * (RAMP_TABLE_SIZE - 1);
+ /* clamp int as well in case of NaN */
int i = (int)f;
+ if(i < 0) i = 0;
+ if(i >= RAMP_TABLE_SIZE) i = RAMP_TABLE_SIZE-1;
float t = f - (float)i;
Color = ramp_color[i];
Modified: trunk/blender/intern/cycles/kernel/svm/svm_ramp.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/svm_ramp.h 2012-12-03 12:04:15 UTC (rev 52742)
+++ trunk/blender/intern/cycles/kernel/svm/svm_ramp.h 2012-12-03 12:21:44 UTC (rev 52743)
@@ -25,7 +25,8 @@
{
f = clamp(f, 0.0f, 1.0f)*(RAMP_TABLE_SIZE-1);
- int i = (int)f;
+ /* clamp int as well in case of NaN */
+ int i = clamp((int)f, 0, RAMP_TABLE_SIZE-1);
float t = f - (float)i;
float4 a = fetch_node_float(kg, offset+i);
More information about the Bf-blender-cvs
mailing list