[Bf-blender-cvs] [8e4e9a5] cycles_split_kernel: Cycles: Fix a few memory leaks in CPU split kernel

Mai Lavelle noreply at git.blender.org
Mon Oct 24 12:35:16 CEST 2016


Commit: 8e4e9a5a1605d1d88763d6848f46542704c3eb19
Author: Mai Lavelle
Date:   Mon Oct 24 12:10:59 2016 +0200
Branches: cycles_split_kernel
https://developer.blender.org/rB8e4e9a5a1605d1d88763d6848f46542704c3eb19

Cycles: Fix a few memory leaks in CPU split kernel

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

M	intern/cycles/device/device_cpu.cpp
M	intern/cycles/device/device_split_kernel.cpp
M	intern/cycles/device/device_split_kernel.h
M	intern/cycles/util/CMakeLists.txt
A	intern/cycles/util/util_memory.h

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

diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index 9f15ac1..57b47d2 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -141,6 +141,11 @@ public:
 	void mem_alloc(device_memory& mem, MemoryType /*type*/)
 	{
 		mem.device_pointer = mem.data_pointer;
+
+		if(!mem.device_pointer) {
+			mem.device_pointer = (device_ptr)malloc(mem.memory_size());
+		}
+
 		mem.device_size = mem.memory_size();
 		stats.mem_alloc(mem.device_size);
 	}
@@ -165,6 +170,10 @@ public:
 	void mem_free(device_memory& mem)
 	{
 		if(mem.device_pointer) {
+			if(!mem.data_pointer) {
+				free((void*)mem.device_pointer);
+			}
+
 			mem.device_pointer = 0;
 			stats.mem_free(mem.device_size);
 			mem.device_size = 0;
@@ -331,17 +340,15 @@ public:
 		KernelGlobals kg = thread_kernel_globals_init();
 		RenderTile tile;
 
-		DeviceSplitKernel *split_kernel = new DeviceSplitKernel(this);
-
-		if(!split_kernel->load_kernels(requested_features)) {
-			delete split_kernel;
+		DeviceSplitKernel split_kernel(this);
 
+		if(!split_kernel.load_kernels(requested_features)) {
 			return;
 		}
 
 		while(task.acquire_tile(this, tile)) {
 			device_memory data;
-			split_kernel->path_trace(&task, tile, data);
+			split_kernel.path_trace(&task, tile, data);
 
 			tile.sample = tile.start_sample + tile.num_samples;
 
@@ -353,8 +360,6 @@ public:
 			}
 		}
 
-		delete split_kernel;
-
 		thread_kernel_globals_free(&kg);
 	}
 
diff --git a/intern/cycles/device/device_split_kernel.cpp b/intern/cycles/device/device_split_kernel.cpp
index 2f6a777..afbb01b 100644
--- a/intern/cycles/device/device_split_kernel.cpp
+++ b/intern/cycles/device/device_split_kernel.cpp
@@ -43,7 +43,7 @@ DeviceSplitKernel::~DeviceSplitKernel()
 bool DeviceSplitKernel::load_kernels(const DeviceRequestedFeatures& requested_features)
 {
 #define LOAD_KERNEL(name) \
-		kernel_##name = device->get_split_kernel_function(#name, requested_features); \
+		kernel_##name = unique_ptr<SplitKernelFunction>(device->get_split_kernel_function(#name, requested_features)); \
 		if(!kernel_##name) { \
 			return false; \
 		}
@@ -157,6 +157,8 @@ bool DeviceSplitKernel::path_trace(DeviceTask *task,
 
 	/* Allocate all required global memory once. */
 	if(first_tile) {
+		first_tile = false;
+
 #ifdef __WORK_STEALING__
 		/* Calculate max groups */
 		size_t max_global_size[2];
@@ -302,8 +304,6 @@ bool DeviceSplitKernel::path_trace(DeviceTask *task,
 		path_iteration_times = numNextPathIterTimes;
 	}
 
-	first_tile = false;
-
 	return true;
 }
 
diff --git a/intern/cycles/device/device_split_kernel.h b/intern/cycles/device/device_split_kernel.h
index 6105143..d679698 100644
--- a/intern/cycles/device/device_split_kernel.h
+++ b/intern/cycles/device/device_split_kernel.h
@@ -18,8 +18,8 @@
 #define __DEVICE_SPLIT_KERNEL_H__
 
 #include "device.h"
-
 #include "buffers.h"
+#include "util_memory.h"
 
 CCL_NAMESPACE_BEGIN
 
@@ -49,16 +49,16 @@ class DeviceSplitKernel {
 private:
 	Device *device;
 
-	SplitKernelFunction *kernel_scene_intersect;
-	SplitKernelFunction *kernel_lamp_emission;
-	SplitKernelFunction *kernel_queue_enqueue;
-	SplitKernelFunction *kernel_background_buffer_update;
-	SplitKernelFunction *kernel_shader_eval;
-	SplitKernelFunction *kernel_holdout_emission_blurring_pathtermination_ao;
-	SplitKernelFunction *kernel_direct_lighting;
-	SplitKernelFunction *kernel_shadow_blocked;
-	SplitKernelFunction *kernel_next_iteration_setup;
-	SplitKernelFunction *kernel_sum_all_radiance;
+	unique_ptr<SplitKernelFunction> kernel_scene_intersect;
+	unique_ptr<SplitKernelFunction> kernel_lamp_emission;
+	unique_ptr<SplitKernelFunction> kernel_queue_enqueue;
+	unique_ptr<SplitKernelFunction> kernel_background_buffer_update;
+	unique_ptr<SplitKernelFunction> kernel_shader_eval;
+	unique_ptr<SplitKernelFunction> kernel_holdout_emission_blurring_pathtermination_ao;
+	unique_ptr<SplitKernelFunction> kernel_direct_lighting;
+	unique_ptr<SplitKernelFunction> kernel_shadow_blocked;
+	unique_ptr<SplitKernelFunction> kernel_next_iteration_setup;
+	unique_ptr<SplitKernelFunction> kernel_sum_all_radiance;
 
 	/* Global memory variables [porting]; These memory is used for
 	 * co-operation between different kernels; Data written by one
diff --git a/intern/cycles/util/CMakeLists.txt b/intern/cycles/util/CMakeLists.txt
index 02ee4cd..8d7e9a7 100644
--- a/intern/cycles/util/CMakeLists.txt
+++ b/intern/cycles/util/CMakeLists.txt
@@ -52,6 +52,7 @@ set(SRC_HEADERS
 	util_math_cdf.h
 	util_math_fast.h
 	util_md5.h
+	util_memory.h
 	util_opengl.h
 	util_optimization.h
 	util_param.h
diff --git a/intern/cycles/util/util_memory.h b/intern/cycles/util/util_memory.h
new file mode 100644
index 0000000..e56e939
--- /dev/null
+++ b/intern/cycles/util/util_memory.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2011-2016 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UTIL_MEMORY_H__
+#define __UTIL_MEMORY_H__
+
+#include <memory>
+
+CCL_NAMESPACE_BEGIN
+
+using std::unique_ptr;
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_MEMORY_H__ */
+




More information about the Bf-blender-cvs mailing list