[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