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__ */
+

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

Reply via email to