[Bf-blender-cvs] [d7a8e2c] cycles_kernel_split: Cycles kernel split: Get rid of tile-split related logic in RenderTile

Sergey Sharybin noreply at git.blender.org
Sat May 9 13:16:55 CEST 2015


Commit: d7a8e2c3533b0c320dcc71f696a67b790cf3cc34
Author: Sergey Sharybin
Date:   Sat May 9 16:14:40 2015 +0500
Branches: cycles_kernel_split
https://developer.blender.org/rBd7a8e2c3533b0c320dcc71f696a67b790cf3cc34

Cycles kernel split: Get rid of tile-split related logic in RenderTile

It's only used by OpenCL device and needs to be done in some more generic way,
likely involving Blender querying the maximum/best render settings from the
render engine.

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

M	intern/cycles/device/device_opencl.cpp
M	intern/cycles/render/buffers.h

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

diff --git a/intern/cycles/device/device_opencl.cpp b/intern/cycles/device/device_opencl.cpp
index 21c523d..6710315 100644
--- a/intern/cycles/device/device_opencl.cpp
+++ b/intern/cycles/device/device_opencl.cpp
@@ -1427,6 +1427,63 @@ public:
 	}
 };
 
+/* TODO(sergey): This is to keep tile split on OpenCL level working
+ * for now, since withotu this viewport render does not work as it
+ * should.
+ *
+ * Ideally it'll be done on the higher level, but we need to get ready
+ * for merge rather soon, so let's keep split logic private here in
+ * the file.
+ */
+class SplitRenderTile : public RenderTile {
+public:
+	SplitRenderTile()
+		: RenderTile(),
+		  buffer_offset_x(0),
+		  buffer_offset_y(0),
+		  rng_state_offset_x(0),
+		  rng_state_offset_y(0),
+		  buffer_rng_state_stride(0) {}
+
+	explicit SplitRenderTile(RenderTile& tile)
+		: RenderTile(),
+		  buffer_offset_x(0),
+		  buffer_offset_y(0),
+		  rng_state_offset_x(0),
+		  rng_state_offset_y(0),
+		  buffer_rng_state_stride(0)
+	{
+		x = tile.x;
+		y = tile.y;
+		w = tile.w;
+		h = tile.h;
+		start_sample = tile.start_sample;
+		num_samples = tile.num_samples;
+		sample = tile.sample;
+		resolution = tile.resolution;
+		offset = tile.offset;
+		stride = tile.stride;
+		tile_size = tile.tile_size;
+		buffer = tile.buffer;
+		rng_state = tile.rng_state;
+		buffers = tile.buffers;
+	}
+
+	/* Split kernel is device global memory constained;
+	 * hence split kernel cant render big tile size's in
+	 * one go. If the user sets a big tile size (big tile size
+	 * is a term relative to the available device global memory),
+	 * we split the tile further and then call path_trace on
+	 * each of those split tiles. The following variables declared,
+	 * assist in achieving that purpose
+	 */
+	int buffer_offset_x;
+	int buffer_offset_y;
+	int rng_state_offset_x;
+	int rng_state_offset_y;
+	int buffer_rng_state_stride;
+};
+
 /* OpenCLDeviceSplitKernel's declaration/definition. */
 class OpenCLDeviceSplitKernel : public OpenCLDeviceBase
 {
@@ -2128,7 +2185,7 @@ public:
 		}
 	}
 
-	void path_trace(RenderTile& rtile, int2 max_render_feasible_tile_size)
+	void path_trace(SplitRenderTile& rtile, int2 max_render_feasible_tile_size)
 	{
 		/* cast arguments to cl types */
 		cl_mem d_data = CL_MEM_PTR(const_mem_map["__data"]->device_pointer);
@@ -2963,9 +3020,9 @@ public:
 	}
 
 	/* Splits existing tile into multiple tiles of tile size split_tile_size. */
-	vector<RenderTile> split_tiles(RenderTile rtile, int2 split_tile_size)
+	vector<SplitRenderTile> split_tiles(RenderTile rtile, int2 split_tile_size)
 	{
-		vector<RenderTile> to_path_trace_rtile;
+		vector<SplitRenderTile> to_path_trace_rtile;
 		int d_w = rtile.w;
 		int d_h = rtile.h;
 		int num_tiles_x = (((d_w - 1) / split_tile_size.x) + 1);
@@ -3024,11 +3081,6 @@ public:
 			size_t feasible_global_work_size;
 			/* Keep rendering tiles until done. */
 			while (task->acquire_tile(this, tile)) {
-				tile.buffer_offset_x = 0;
-				tile.buffer_offset_y = 0;
-				tile.rng_state_offset_x = 0;
-				tile.rng_state_offset_y = 0;
-
 				if(!initialize_data_and_check_render_feasibility) {
 					/* Initialize data. */
 					/* Calculate per_thread_output_buffer_size. */
@@ -3072,7 +3124,7 @@ public:
 					int2 split_tile_size =
 						get_split_tile_size(tile,
 						                    max_render_feasible_tile_size);
-					vector<RenderTile> to_path_trace_render_tiles =
+					vector<SplitRenderTile> to_path_trace_render_tiles =
 						split_tiles(tile, split_tile_size);
 					/* Print message to console */
 					if(background && (to_path_trace_render_tiles.size() > 1)) {
@@ -3105,8 +3157,9 @@ public:
 						(((tile.tile_size.y - 1) / SPLIT_KERNEL_LOCAL_SIZE_Y) + 1) *
 						SPLIT_KERNEL_LOCAL_SIZE_Y;
 					/* buffer_rng_state_stride is stride itself. */
-					tile.buffer_rng_state_stride = tile.stride;
-					path_trace(tile, max_render_feasible_tile_size);
+					SplitRenderTile split_tile(tile);
+					split_tile.buffer_rng_state_stride = tile.stride;
+					path_trace(split_tile, max_render_feasible_tile_size);
 				}
 				tile.sample = tile.start_sample + tile.num_samples;
 
diff --git a/intern/cycles/render/buffers.h b/intern/cycles/render/buffers.h
index 20bb64f..afff012 100644
--- a/intern/cycles/render/buffers.h
+++ b/intern/cycles/render/buffers.h
@@ -142,20 +142,6 @@ public:
 	/* user set tile-size */
 	int2 tile_size;
 
-	/* Split kernel is device global memory constained;
-	 * hence split kernel cant render big tile size's in
-	 * one go. If the user sets a big tile size (big tile size
-	 * is a term relative to the available device global memory),
-	 * we split the tile further and then call path_trace on
-	 * each of those split tiles. The following variables declared,
-	 * assist in achieving that purpose
-	 */
-	int buffer_offset_x;
-	int buffer_offset_y;
-	int rng_state_offset_x;
-	int rng_state_offset_y;
-	int buffer_rng_state_stride;
-
 	device_ptr buffer;
 	device_ptr rng_state;




More information about the Bf-blender-cvs mailing list