[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