Revision: 57652
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57652
Author:   blendix
Date:     2013-06-22 14:35:09 +0000 (Sat, 22 Jun 2013)
Log Message:
-----------
Cycles: ensure any SSE data is allocated 16 byte aligned, happens automatically
on many platforms but is not assured everywhere.

Modified Paths:
--------------
    trunk/blender/intern/cycles/util/util_types.h
    trunk/blender/intern/cycles/util/util_vector.h

Modified: trunk/blender/intern/cycles/util/util_types.h
===================================================================
--- trunk/blender/intern/cycles/util/util_types.h       2013-06-22 12:52:15 UTC 
(rev 57651)
+++ trunk/blender/intern/cycles/util/util_types.h       2013-06-22 14:35:09 UTC 
(rev 57652)
@@ -552,6 +552,30 @@
 }
 #endif
 
+#ifndef __KERNEL_GPU__
+
+static inline void *malloc_aligned(size_t size, size_t alignment)
+{
+       void *data = (void*)malloc(size + sizeof(void*) + alignment - 1);
+
+       union { void *ptr; size_t offset; } u;
+       u.ptr = (char*)data + sizeof(void*);
+       u.offset = (u.offset + alignment - 1) & ~(alignment - 1);
+       *(((void**)u.ptr) - 1) = data;
+
+       return u.ptr;
+}
+
+static inline void free_aligned(void *ptr)
+{
+       if(ptr) {
+               void *data = *(((void**)ptr) - 1);
+               free(data);
+       }
+}
+
+#endif
+
 CCL_NAMESPACE_END
 
 #endif /* __UTIL_TYPES_H__ */

Modified: trunk/blender/intern/cycles/util/util_vector.h
===================================================================
--- trunk/blender/intern/cycles/util/util_vector.h      2013-06-22 12:52:15 UTC 
(rev 57651)
+++ trunk/blender/intern/cycles/util/util_vector.h      2013-06-22 14:35:09 UTC 
(rev 57652)
@@ -24,18 +24,22 @@
 #include <string.h>
 #include <vector>
 
+#include "util_types.h"
+
 CCL_NAMESPACE_BEGIN
 
 using std::vector;
 
 /* Array
  *
- * Simplified version of vector, serving two purposes:
+ * Simplified version of vector, serving multiple purposes:
  * - somewhat faster in that it does not clear memory on resize/alloc,
- *   this was actually showing up in profiles quite significantly
- * - if this is used, we are not tempted to use inefficient operations */
+ *   this was actually showing up in profiles quite significantly. it
+ *   also does not run any constructors/destructors
+ * - if this is used, we are not tempted to use inefficient operations
+ * - aligned allocation for SSE data types */
 
-template<typename T>
+template<typename T, size_t alignment = 16>
 class array
 {
 public:
@@ -52,7 +56,7 @@
                        datasize = 0;
                }
                else {
-                       data = new T[newsize];
+                       data = (T*)malloc_aligned(sizeof(T)*newsize, alignment);
                        datasize = newsize;
                }
        }
@@ -69,7 +73,7 @@
                        datasize = 0;
                }
                else {
-                       data = new T[from.datasize];
+                       data = (T*)malloc_aligned(sizeof(T)*from.datasize, 
alignment);
                        memcpy(data, from.data, from.datasize*sizeof(T));
                        datasize = from.datasize;
                }
@@ -83,8 +87,11 @@
                data = NULL;
 
                if(datasize > 0) {
-                       data = new T[datasize];
+                       data = (T*)malloc_aligned(sizeof(T)*datasize, 
alignment);
                        memcpy(data, &from[0], datasize*sizeof(T));
+                       free_aligned(data);
+                       data = (T*)malloc_aligned(sizeof(T)*datasize, 
alignment);
+                       memcpy(data, &from[0], datasize*sizeof(T));
                }
 
                return *this;
@@ -92,7 +99,7 @@
 
        ~array()
        {
-               delete [] data;
+               free_aligned(data);
        }
 
        void resize(size_t newsize)
@@ -100,10 +107,10 @@
                if(newsize == 0) {
                        clear();
                }
-               else {
-                       T *newdata = new T[newsize];
+               else if(newsize != datasize) {
+                       T *newdata = (T*)malloc_aligned(sizeof(T)*newsize, 
alignment);
                        memcpy(newdata, data, ((datasize < newsize)? datasize: 
newsize)*sizeof(T));
-                       delete [] data;
+                       free_aligned(data);
 
                        data = newdata;
                        datasize = newsize;
@@ -112,7 +119,7 @@
 
        void clear()
        {
-               delete [] data;
+               free_aligned(data);
                data = NULL;
                datasize = 0;
        }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to