[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43743] trunk/blender/intern/cycles: Cycles: another fix for CUDA render passes, needed to align float4 passes.

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Jan 27 14:58:41 CET 2012


Revision: 43743
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43743
Author:   blendix
Date:     2012-01-27 13:58:32 +0000 (Fri, 27 Jan 2012)
Log Message:
-----------
Cycles: another fix for CUDA render passes, needed to align float4 passes.

Modified Paths:
--------------
    trunk/blender/intern/cycles/device/device_cuda.cpp
    trunk/blender/intern/cycles/render/buffers.cpp
    trunk/blender/intern/cycles/render/film.cpp
    trunk/blender/intern/cycles/util/util_types.h

Modified: trunk/blender/intern/cycles/device/device_cuda.cpp
===================================================================
--- trunk/blender/intern/cycles/device/device_cuda.cpp	2012-01-27 09:03:47 UTC (rev 43742)
+++ trunk/blender/intern/cycles/device/device_cuda.cpp	2012-01-27 13:58:32 UTC (rev 43743)
@@ -106,11 +106,6 @@
 		}
 	}
 
-	static int cuda_align_up(int& offset, int alignment)
-	{
-		return (offset + alignment - 1) & ~(alignment - 1);
-	}
-
 #ifdef NDEBUG
 #define cuda_abort()
 #else
@@ -485,7 +480,7 @@
 		offset += sizeof(d_rng_state);
 
 		int sample = task.sample;
-		offset = cuda_align_up(offset, __alignof(sample));
+		offset = align_up(offset, __alignof(sample));
 
 		cuda_assert(cuParamSeti(cuPathTrace, offset, task.sample))
 		offset += sizeof(task.sample);
@@ -549,7 +544,7 @@
 		offset += sizeof(d_buffer);
 
 		int sample = task.sample;
-		offset = cuda_align_up(offset, __alignof(sample));
+		offset = align_up(offset, __alignof(sample));
 
 		cuda_assert(cuParamSeti(cuFilmConvert, offset, task.sample))
 		offset += sizeof(task.sample);
@@ -618,7 +613,7 @@
 		offset += sizeof(d_offset);
 
 		int shader_eval_type = task.shader_eval_type;
-		offset = cuda_align_up(offset, __alignof(shader_eval_type));
+		offset = align_up(offset, __alignof(shader_eval_type));
 
 		cuda_assert(cuParamSeti(cuDisplace, offset, task.shader_eval_type))
 		offset += sizeof(task.shader_eval_type);

Modified: trunk/blender/intern/cycles/render/buffers.cpp
===================================================================
--- trunk/blender/intern/cycles/render/buffers.cpp	2012-01-27 09:03:47 UTC (rev 43742)
+++ trunk/blender/intern/cycles/render/buffers.cpp	2012-01-27 13:58:32 UTC (rev 43743)
@@ -71,7 +71,7 @@
 	foreach(Pass& pass, passes)
 		size += pass.components;
 	
-	return size;
+	return align_up(size, 4);
 }
 
 /* Render Buffers */

Modified: trunk/blender/intern/cycles/render/film.cpp
===================================================================
--- trunk/blender/intern/cycles/render/film.cpp	2012-01-27 09:03:47 UTC (rev 43742)
+++ trunk/blender/intern/cycles/render/film.cpp	2012-01-27 13:58:32 UTC (rev 43743)
@@ -21,12 +21,20 @@
 #include "film.h"
 #include "scene.h"
 
+#include "util_algorithm.h"
 #include "util_foreach.h"
 
 CCL_NAMESPACE_BEGIN
 
 /* Pass */
 
+static bool compare_pass_order(const Pass& a, const Pass& b)
+{
+	if(a.components == b.components)
+		return (a.type < b.type);
+	return (a.components > b.components);
+}
+
 void Pass::add(PassType type, vector<Pass>& passes)
 {
 	Pass pass;
@@ -106,6 +114,10 @@
 	}
 
 	passes.push_back(pass);
+
+	/* order from by components, to ensure alignment so passes with size 4
+	   come first and then passes with size 1 */
+	sort(passes.begin(), passes.end(), compare_pass_order);
 }
 
 bool Pass::equals(const vector<Pass>& A, const vector<Pass>& B)
@@ -219,6 +231,8 @@
 		kfilm->pass_stride += pass.components;
 	}
 
+	kfilm->pass_stride = align_up(kfilm->pass_stride, 4);
+
 	need_update = false;
 }
 

Modified: trunk/blender/intern/cycles/util/util_types.h
===================================================================
--- trunk/blender/intern/cycles/util/util_types.h	2012-01-27 09:03:47 UTC (rev 43742)
+++ trunk/blender/intern/cycles/util/util_types.h	2012-01-27 13:58:32 UTC (rev 43743)
@@ -277,6 +277,11 @@
 	return a;
 }
 
+__device int align_up(int offset, int alignment)
+{
+	return (offset + alignment - 1) & ~(alignment - 1);
+}
+
 #endif
 
 CCL_NAMESPACE_END




More information about the Bf-blender-cvs mailing list