Fix Cycles CUDA adaptive kernel not working correctly after recent closure changes.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Mon, 8 Aug 2016 23:00:57 +0000 (01:00 +0200)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Mon, 8 Aug 2016 23:31:07 +0000 (01:31 +0200)
intern/cycles/kernel/kernel_compat_cuda.h
intern/cycles/kernel/kernel_compat_opencl.h
intern/cycles/kernel/kernel_types.h

index a039b41400625a7601687acff52c3f59c9898e44..063220b542eec1661f628a92a01d039b0bccf7e4 100644 (file)
@@ -47,6 +47,7 @@
 #define ccl_may_alias
 #define ccl_addr_space
 #define ccl_restrict __restrict__
+#define ccl_align(n) __align__(n)
 
 /* No assert supported for CUDA */
 
index 8505cb8557636c789ba352c1d99d829fc10b5ac5..2ae89dde7c42e806b7865ec7978b779a172600b0 100644 (file)
@@ -40,6 +40,7 @@
 #define ccl_local __local
 #define ccl_private __private
 #define ccl_restrict restrict
+#define ccl_align(n) __attribute__((aligned(n)))
 
 #ifdef __SPLIT_KERNEL__
 #  define ccl_addr_space __global
index 3923804ec96f8a930ca2421f6951642ca1c7261f..f3b10c21b9d08a6678a0edb1bc9e858f0a0d0d52 100644 (file)
@@ -656,23 +656,18 @@ typedef struct AttributeDescriptor {
  * ShaderClosure has a fixed size, and any extra space must be allocated
  * with closure_alloc_extra().
  *
- * float3 is 12 bytes on CUDA and 16 bytes on CPU/OpenCL, we set the data
- * size to ensure ShaderClosure is 80 bytes total everywhere. */
+ * We pad the struct to 80 bytes and ensure it is aligned to 16 bytes, which
+ * we assume to be the maximum required alignment for any struct. */
 
 #define SHADER_CLOSURE_BASE \
        float3 weight; \
        ClosureType type; \
        float sample_weight \
 
-typedef ccl_addr_space struct ShaderClosure {
+typedef ccl_addr_space struct ccl_align(16) ShaderClosure {
        SHADER_CLOSURE_BASE;
 
-       /* pad to 80 bytes, data types are aligned to own size */
-#ifdef __KERNEL_CUDA__
-       float data[15];
-#else
-       float data[14];
-#endif
+       float data[14]; /* pad to 80 bytes */
 } ShaderClosure;
 
 /* Shader Context