[Bf-blender-cvs] [1e964311e5] temp-cycles-denoising: Cycles Denoising: Rework memory offset function for upcoming OpenCL integration

Lukas Stockner noreply at git.blender.org
Fri Mar 24 20:18:39 CET 2017


Commit: 1e964311e538150904ce53d4ff03a86107f27b6f
Author: Lukas Stockner
Date:   Thu Mar 23 23:50:43 2017 +0100
Branches: temp-cycles-denoising
https://developer.blender.org/rB1e964311e538150904ce53d4ff03a86107f27b6f

Cycles Denoising: Rework memory offset function for upcoming OpenCL integration

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

M	intern/cycles/device/device.h
M	intern/cycles/device/device_cpu.cpp
M	intern/cycles/device/device_cuda.cpp
M	intern/cycles/device/device_denoising.cpp
M	intern/cycles/device/device_memory.h

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

diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h
index 7c18ca1f13..397a911f1b 100644
--- a/intern/cycles/device/device.h
+++ b/intern/cycles/device/device.h
@@ -256,12 +256,11 @@ 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 device_ptr mem_get_offset_ptr(device_memory& mem, int offset)
+	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) mem; (void) offset; (void) size; (void) type;
 		return (device_ptr) 0;
 	}
 
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index 5f25ede516..d71ff23093 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -312,9 +312,9 @@ public:
 		}
 	}
 
-	virtual device_ptr mem_get_offset_ptr(device_memory& mem, int offset)
+	virtual device_ptr mem_get_offset_ptr(device_memory& mem, int offset, int /*size*/, MemoryType /*type*/)
 	{
-		return (device_ptr) (((char*) mem.device_pointer) + mem.memory_offset(offset));
+		return (device_ptr) (((char*) mem.device_pointer) + mem.memory_num_to_bytes(offset));
 	}
 
 	void const_copy_to(const char *name, void *host, size_t size)
diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp
index ce9057e75c..5445e5e7b2 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -602,9 +602,9 @@ public:
 		}
 	}
 
-	virtual device_ptr mem_get_offset_ptr(device_memory& mem, int offset)
+	virtual device_ptr mem_get_offset_ptr(device_memory& mem, int offset, int /*size*/, MemoryType /*type*/)
 	{
-		return (device_ptr) (((char*) mem.device_pointer) + mem.memory_offset(offset));
+		return (device_ptr) (((char*) mem.device_pointer) + mem.memory_num_to_bytes(offset));
 	}
 
 	void const_copy_to(const char *name, void *host, size_t size)
diff --git a/intern/cycles/device/device_denoising.cpp b/intern/cycles/device/device_denoising.cpp
index 73f190c8e7..149154c6ed 100644
--- a/intern/cycles/device/device_denoising.cpp
+++ b/intern/cycles/device/device_denoising.cpp
@@ -83,15 +83,15 @@ 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);
-		unfiltered_b              = device->mem_get_offset_ptr(buffer.mem, 1*buffer.pass_stride);
-		sample_var                = device->mem_get_offset_ptr(buffer.mem, 2*buffer.pass_stride);
-		sample_var_var            = device->mem_get_offset_ptr(buffer.mem, 3*buffer.pass_stride);
-		buffer_var                = device->mem_get_offset_ptr(buffer.mem, 5*buffer.pass_stride);
-		filtered_var              = device->mem_get_offset_ptr(buffer.mem, 6*buffer.pass_stride);
-		nlm_state.temporary_1_ptr = device->mem_get_offset_ptr(buffer.mem, 7*buffer.pass_stride);
-		nlm_state.temporary_2_ptr = device->mem_get_offset_ptr(buffer.mem, 8*buffer.pass_stride);
-		nlm_state.temporary_3_ptr = device->mem_get_offset_ptr(buffer.mem, 9*buffer.pass_stride);
+		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);
 
 		/* 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);
@@ -120,23 +120,23 @@ bool DenoisingTask::run_denoising()
 		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);
+		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);
 	}
 
 	/* Prefilter general features. */
 	{
 		device_ptr unfiltered, variance, feature_pass;
-		unfiltered                = device->mem_get_offset_ptr(buffer.mem,  8*buffer.pass_stride);
-		variance                  = device->mem_get_offset_ptr(buffer.mem,  9*buffer.pass_stride);
-		nlm_state.temporary_1_ptr = device->mem_get_offset_ptr(buffer.mem, 10*buffer.pass_stride);
-		nlm_state.temporary_2_ptr = device->mem_get_offset_ptr(buffer.mem, 11*buffer.pass_stride);
-		nlm_state.temporary_3_ptr = device->mem_get_offset_ptr(buffer.mem, 12*buffer.pass_stride);
+		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);
 		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);
+			feature_pass = device->mem_get_offset_ptr(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);
 			/* Smooth the pass and store the result in the denoising buffers. */
@@ -154,8 +154,8 @@ bool DenoisingTask::run_denoising()
 		int variance_to[]   = {11, 12, 13, 17, 18, 19};
 		int num_color_passes = use_cross_denoising? 6 : 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);
-			color_var_pass = device->mem_get_offset_ptr(buffer.mem, variance_to[pass]*buffer.pass_stride);
+			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);
 		}
 	}
@@ -198,10 +198,10 @@ bool DenoisingTask::run_denoising()
 		reconstruction_state.source_h = rect.w-rect.y;
 
 		device_ptr color_a_ptr, color_a_var_ptr, color_b_ptr, color_b_var_ptr;
-		color_a_ptr     = device->mem_get_offset_ptr(buffer.mem,  8*buffer.pass_stride);
-		color_a_var_ptr = device->mem_get_offset_ptr(buffer.mem, 11*buffer.pass_stride);
-		color_b_ptr     = device->mem_get_offset_ptr(buffer.mem, 14*buffer.pass_stride);
-		color_b_var_ptr = device->mem_get_offset_ptr(buffer.mem, 17*buffer.pass_stride);
+		color_a_ptr     = device->mem_get_offset_ptr(buffer.mem,  8*buffer.pass_stride, 3*buffer.pass_stride, MEM_READ_WRITE);
+		color_a_var_ptr = device->mem_get_offset_ptr(buffer.mem, 11*buffer.pass_stride, 3*buffer.pass_stride, MEM_READ_WRITE);
+		color_b_ptr     = device->mem_get_offset_ptr(buffer.mem, 14*buffer.pass_stride, 3*buffer.pass_stride, MEM_READ_WRITE);
+		color_b_var_ptr = device->mem_get_offset_ptr(buffer.mem, 17*buffer.pass_stride, 3*buffer.pass_stride, MEM_READ_WRITE);
 
 		functions.reconstruct(color_a_ptr, color_a_var_ptr, color_b_ptr, color_b_var_ptr, output_a.device_pointer);
 		functions.reconstruct(color_b_ptr, color_b_var_ptr, color_a_ptr, color_a_var_ptr, output_b.device_pointer);
@@ -211,10 +211,10 @@ bool DenoisingTask::run_denoising()
 		for(int channel = 0; channel < 3; channel++) {
 			device_ptr color_ptr, color_var_ptr, output_a_ptr, output_b_ptr;
 			/* Reuse the previously used memory since its contents aren't needed anymore. */
-			color_ptr     = device->mem_get_offset_ptr(buffer.mem, ( 8 + channel)*buffer.pass_stride);
-			color_var_ptr = device->mem_get_offset_ptr(buffer.mem, (11 + channel)*buffer.pass_stride);
-			output_a_ptr  = device->mem_get_offset_ptr(output_a, channel*buffer.pass_stride);
-			output_b_ptr  = device->mem_get_offset_ptr(output_b, channel*buffer.pass_stride);
+			color_ptr     = device->mem_get_offset_ptr(buffer.mem, ( 8 + channel)*buffer.pass_stride, 3*buffer.pass_stride, MEM_READ_WRITE);
+			color_var_ptr = device->mem_get_offset_ptr(buffer.mem, (11 + channel)*buffer.pass_stride, 3*buffer.pass_stride, MEM_READ_WRITE);
+			output_a_ptr  = device->mem_get_offset_ptr(output_a, channel*buffer.pass_stride, 3*buffer.pass_stride, MEM_READ_WRITE);
+			output_b_ptr  = device->mem_get_offset_ptr(output_b, channel*buffer.pass_stride, 3*buffer.pass_stride, MEM_READ_W

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list