[Bf-blender-cvs] [a84bc16] compositor-2016: Fix T48472: issue in array refactor, causing performance regression in BVH build.

Brecht Van Lommel noreply at git.blender.org
Wed Jun 8 21:48:19 CEST 2016


Commit: a84bc16220dfd662ceeb4f2f1419b1b38fc95e50
Author: Brecht Van Lommel
Date:   Fri May 20 10:56:10 2016 +0200
Branches: compositor-2016
https://developer.blender.org/rBa84bc16220dfd662ceeb4f2f1419b1b38fc95e50

Fix T48472: issue in array refactor, causing performance regression in BVH build.

===================================================================

M	intern/cycles/util/util_vector.h

===================================================================

diff --git a/intern/cycles/util/util_vector.h b/intern/cycles/util/util_vector.h
index a8a1c4c..8f833af 100644
--- a/intern/cycles/util/util_vector.h
+++ b/intern/cycles/util/util_vector.h
@@ -130,14 +130,8 @@ public:
 	array& operator=(const array& from)
 	{
 		if(this != &from) {
-			clear();
-
-			if(from.datasize_ > 0) {
-				data_ = mem_allocate(from.datasize_);
-				memcpy(data_, from.data_, from.datasize_*sizeof(T));
-				datasize_ = from.datasize_;
-				capacity_ = datasize_;
-			}
+			resize(from.size());
+			memcpy(data_, from.data_, datasize_*sizeof(T));
 		}
 
 		return *this;
@@ -145,12 +139,9 @@ public:
 
 	array& operator=(const vector<T>& from)
 	{
-		clear();
+		resize(from.size());
 
 		if(from.size() > 0) {
-			datasize_ = from.size();
-			capacity_ = datasize_;
-			data_ = mem_allocate(datasize_);
 			memcpy(data_, &from[0], datasize_*sizeof(T));
 		}
 
@@ -164,42 +155,34 @@ public:
 
 	bool operator==(const vector<T>& other)
 	{
-		if(datasize_ != other.datasize_)
+		if(datasize_ != other.datasize_) {
 			return false;
+		}
 
 		return memcmp(data_, other.data_, datasize_*sizeof(T)) == 0;
 	}
 
-	void steal_data(array& from)
-	{
-		if(this != &from)
-		{
-			clear();
-
-			data_ = from.data_;
-			datasize_ = from.datasize_;
-			capacity_ = from.capacity_;
-
-			from.data_ = NULL;
-			from.datasize_ = 0;
-			from.capacity_ = 0;
-		}
-	}
-
 	T* resize(size_t newsize)
 	{
 		if(newsize == 0) {
 			clear();
 		}
-		else if(newsize != capacity_) {
-			T *newdata = mem_allocate(newsize);
-			if(data_ != NULL) {
-				memcpy(newdata, data_, ((datasize_ < newsize)? datasize_: newsize)*sizeof(T));
-				mem_free(data_, capacity_);
+		else if(newsize != datasize_) {
+			if(newsize > capacity_) {
+				T *newdata = mem_allocate(newsize);
+				if(newdata == NULL) {
+					/* Allocation failed, likely out of memory. */
+					clear();
+					return NULL;
+				}
+				else if(data_ != NULL) {
+					memcpy(newdata, data_, ((datasize_ < newsize)? datasize_: newsize)*sizeof(T));
+					mem_free(data_, capacity_);
+				}
+				data_ = newdata;
+				capacity_ = newsize;
 			}
-			data_ = newdata;
 			datasize_ = newsize;
-			capacity_ = newsize;
 		}
 		return data_;
 	}




More information about the Bf-blender-cvs mailing list