[Bf-blender-cvs] [79799595274] temp-cycles-denoising: Cycles Denoising: Move offset pointer handling to a separate class

Lukas Stockner noreply at git.blender.org
Fri Apr 14 00:57:43 CEST 2017


Commit: 797995952749f7b4a6c18c2d9b9f4618cd901fcb
Author: Lukas Stockner
Date:   Thu Apr 13 23:05:23 2017 +0200
Branches: temp-cycles-denoising
https://developer.blender.org/rB797995952749f7b4a6c18c2d9b9f4618cd901fcb

Cycles Denoising: Move offset pointer handling to a separate class

This also fixes the memory leak on OpenCL.

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

M	intern/cycles/device/device.cpp
M	intern/cycles/device/device.h
M	intern/cycles/device/device_denoising.cpp
M	intern/cycles/device/device_memory.h
M	intern/cycles/device/opencl/opencl.h
M	intern/cycles/device/opencl/opencl_base.cpp

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

diff --git a/intern/cycles/device/device.cpp b/intern/cycles/device/device.cpp
index 968af447e29..9c37e3fa5cb 100644
--- a/intern/cycles/device/device.cpp
+++ b/intern/cycles/device/device.cpp
@@ -400,4 +400,16 @@ void Device::free_memory()
 	devices.free_memory();
 }
 
+
+offset_ptr::offset_ptr(Device *device, device_memory& mem, int offset, int size, MemoryType type)
+ : device(device)
+{
+	ptr = device->mem_get_offset_ptr(mem, offset, size, type);
+}
+
+offset_ptr::~offset_ptr()
+{
+	device->mem_free_offset_ptr(ptr);
+}
+
 CCL_NAMESPACE_END
diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h
index ef0c5810f3c..cc929bedfa6 100644
--- a/intern/cycles/device/device.h
+++ b/intern/cycles/device/device.h
@@ -256,14 +256,15 @@ public:
 		int y, int w, int h, int elem) = 0;
 	virtual void mem_zero(device_memory& mem) = 0;
 	virtual void mem_free(device_memory& mem) = 0;
+
 	virtual int mem_get_offset_alignment() { return 1; }
-	virtual device_ptr mem_get_offset_ptr(device_memory& mem, int offset, int size, MemoryType type)
+	virtual device_ptr mem_get_offset_ptr(device_memory& /*mem*/, int /*offset*/, int /*size*/, MemoryType /*type*/)
 	{
 		/* Only required for devices that implement denoising. */
 		assert(false);
-		(void) mem; (void) offset; (void) size; (void) type;
 		return (device_ptr) 0;
 	}
+	virtual void mem_free_offset_ptr(device_ptr /*ptr*/) {};
 
 	/* constant memory */
 	virtual void const_copy_to(const char *name, void *host, size_t size) = 0;
diff --git a/intern/cycles/device/device_denoising.cpp b/intern/cycles/device/device_denoising.cpp
index 92ceb75673c..deca358cd30 100644
--- a/intern/cycles/device/device_denoising.cpp
+++ b/intern/cycles/device/device_denoising.cpp
@@ -77,81 +77,87 @@ bool DenoisingTask::run_denoising()
 
 	/* Prefilter shadow feature. */
 	{
-		device_ptr unfiltered_a, unfiltered_b, sample_var, sample_var_var, buffer_var, filtered_var;
-		unfiltered_a              = device->mem_get_offset_ptr(buffer.mem, 0,                    buffer.pass_stride, MEM_READ_WRITE);
-		unfiltered_b              = device->mem_get_offset_ptr(buffer.mem, 1*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
-		sample_var                = device->mem_get_offset_ptr(buffer.mem, 2*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
-		sample_var_var            = device->mem_get_offset_ptr(buffer.mem, 3*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
-		buffer_var                = device->mem_get_offset_ptr(buffer.mem, 5*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
-		filtered_var              = device->mem_get_offset_ptr(buffer.mem, 6*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
-		nlm_state.temporary_1_ptr = device->mem_get_offset_ptr(buffer.mem, 7*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
-		nlm_state.temporary_2_ptr = device->mem_get_offset_ptr(buffer.mem, 8*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
-		nlm_state.temporary_3_ptr = device->mem_get_offset_ptr(buffer.mem, 9*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+		offset_ptr unfiltered_a   (device, buffer.mem, 0,                    buffer.pass_stride, MEM_READ_WRITE);
+		offset_ptr unfiltered_b   (device, buffer.mem, 1*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+		offset_ptr sample_var     (device, buffer.mem, 2*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+		offset_ptr sample_var_var (device, buffer.mem, 3*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+		offset_ptr buffer_var     (device, buffer.mem, 5*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+		offset_ptr filtered_var   (device, buffer.mem, 6*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+		offset_ptr nlm_temporary_1(device, buffer.mem, 7*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+		offset_ptr nlm_temporary_2(device, buffer.mem, 8*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+		offset_ptr nlm_temporary_3(device, buffer.mem, 9*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+
+		nlm_state.temporary_1_ptr = *nlm_temporary_1;
+		nlm_state.temporary_2_ptr = *nlm_temporary_2;
+		nlm_state.temporary_3_ptr = *nlm_temporary_3;
 
 		/* Get the A/B unfiltered passes, the combined sample variance, the estimated variance of the sample variance and the buffer variance. */
-		functions.divide_shadow(unfiltered_a, unfiltered_b, sample_var, sample_var_var, buffer_var);
+		functions.divide_shadow(*unfiltered_a, *unfiltered_b, *sample_var, *sample_var_var, *buffer_var);
 
 		/* Smooth the (generally pretty noisy) buffer variance using the spatial information from the sample variance. */
 		nlm_state.set_parameters(6, 3, 4.0f, 1.0f);
-		functions.non_local_means(buffer_var, sample_var, sample_var_var, filtered_var);
+		functions.non_local_means(*buffer_var, *sample_var, *sample_var_var, *filtered_var);
 
 		/* Reuse memory, the previous data isn't needed anymore. */
-		device_ptr filtered_a = buffer_var,
-		           filtered_b = sample_var;
+		device_ptr filtered_a = *buffer_var,
+		           filtered_b = *sample_var;
 		/* Use the smoothed variance to filter the two shadow half images using each other for weight calculation. */
 		nlm_state.set_parameters(5, 3, 1.0f, 0.25f);
-		functions.non_local_means(unfiltered_a, unfiltered_b, filtered_var, filtered_a);
-		functions.non_local_means(unfiltered_b, unfiltered_a, filtered_var, filtered_b);
+		functions.non_local_means(*unfiltered_a, *unfiltered_b, *filtered_var, filtered_a);
+		functions.non_local_means(*unfiltered_b, *unfiltered_a, *filtered_var, filtered_b);
 
-		device_ptr residual_var = sample_var_var;
+		device_ptr residual_var = *sample_var_var;
 		/* Estimate the residual variance between the two filtered halves. */
 		functions.combine_halves(filtered_a, filtered_b, null_ptr, residual_var, 2, rect);
 
-		device_ptr final_a = unfiltered_a,
-		           final_b = unfiltered_b;
+		device_ptr final_a = *unfiltered_a,
+		           final_b = *unfiltered_b;
 		/* Use the residual variance for a second filter pass. */
 		nlm_state.set_parameters(4, 2, 1.0f, 0.5f);
 		functions.non_local_means(filtered_a, filtered_b, residual_var, final_a);
 		functions.non_local_means(filtered_b, filtered_a, residual_var, final_b);
 
 		/* Combine the two double-filtered halves to a final shadow feature. */
-		device_ptr shadow_pass = device->mem_get_offset_ptr(buffer.mem, 4*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
-		functions.combine_halves(final_a, final_b, shadow_pass, null_ptr, 0, rect);
+		offset_ptr shadow_pass(device, buffer.mem, 4*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+		functions.combine_halves(final_a, final_b, *shadow_pass, null_ptr, 0, rect);
 	}
 
 	/* Prefilter general features. */
 	{
-		device_ptr unfiltered, variance, feature_pass;
-		unfiltered                = device->mem_get_offset_ptr(buffer.mem,  8*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
-		variance                  = device->mem_get_offset_ptr(buffer.mem,  9*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
-		nlm_state.temporary_1_ptr = device->mem_get_offset_ptr(buffer.mem, 10*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
-		nlm_state.temporary_2_ptr = device->mem_get_offset_ptr(buffer.mem, 11*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
-		nlm_state.temporary_3_ptr = device->mem_get_offset_ptr(buffer.mem, 12*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+		offset_ptr unfiltered     (device, buffer.mem,  8*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+		offset_ptr variance       (device, buffer.mem,  9*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+		offset_ptr nlm_temporary_1(device, buffer.mem, 10*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+		offset_ptr nlm_temporary_2(device, buffer.mem, 11*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+		offset_ptr nlm_temporary_3(device, buffer.mem, 12*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+
+		nlm_state.temporary_1_ptr = *nlm_temporary_1;
+		nlm_state.temporary_2_ptr = *nlm_temporary_2;
+		nlm_state.temporary_3_ptr = *nlm_temporary_3;
+
 		int mean_from[]     = { 0, 1, 2, 6,  7,  8, 12 };
 		int variance_from[] = { 3, 4, 5, 9, 10, 11, 13 };
 		int pass_to[]       = { 1, 2, 3, 0,  5,  6,  7 };
 		for(int pass = 0; pass < 7; pass++) {
-			feature_pass = device->mem_get_offset_ptr(buffer.mem, pass_to[pass]*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+			offset_ptr feature_pass(device, buffer.mem, pass_to[pass]*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
 			/* Get the unfiltered pass and its variance from the RenderBuffers. */
-			functions.get_feature(mean_from[pass], variance_from[pass], unfiltered, variance);
+			functions.get_feature(mean_from[pass], variance_from[pass], *unfiltered, *variance);
 			/* Smooth the pass and store the result in the denoising buffers. */
 			nlm_state.set_parameters(2, 2, 1.0f, 0.25f);
-			functions.non_local_means(unfiltered, unfiltered, variance, feature_pass);
+			functions.non_local_means(*unfiltered, *unfiltered, *variance, *feature_pass);
 		}
 	}
 
 	/* Copy color passes. */
 	{
-		device_ptr color_pass, color_var_pass;
 		int mean_from[]     = {20, 21, 22};
 		int variance_from[] = {23, 24, 25};
 		int mean_to[]       = { 8,  9, 10};
 		int variance_to[]   = {11, 12, 13};
 		int num_color_passes = 3;
 		for(int pass = 0; pass < num_color_passes; pass++) {
-			color_pass     = device->mem_get_offset_ptr(buffer.mem,     mean_to[pass]*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
-			color_var_pass = device->mem_get_offset_ptr(buffer.mem, variance_to[pass]*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
-			functions.get_feature(mean_from[pass], variance_from[pass], color_pass, color_var_pass);
+			offset_ptr color_pass    (device, buffer.mem,     mean_to[pass]*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+			offset_ptr color_var_pass(device, buffer.mem, variance_to[pass]*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+			functions.get_feature(mean_from[pass], variance_from[pass], *color_pass, *color_var_pass);
 		}
 	}
 
@@ -1

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list