[Bf-blender-cvs] [2bd6de5] master: Cycles: Add debug pass showing average number of ray bounces per pixel

Sergey Sharybin noreply at git.blender.org
Thu Jun 11 14:53:32 CEST 2015


Commit: 2bd6de5bbb1381fa34bf4df59d9f134dd9ccce91
Author: Sergey Sharybin
Date:   Thu Jun 11 10:42:38 2015 +0200
Branches: master
https://developer.blender.org/rB2bd6de5bbb1381fa34bf4df59d9f134dd9ccce91

Cycles: Add debug pass showing average number of ray bounces per pixel

Quite straightforward implementation, but still needs some work for the split
kernel. Includes both regular and split kernel implementation for that.

The pass is not exposed to the interface yet because it's currently not really
easy to have same pass listed in the menu multiple times.

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

M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/kernel/kernel_debug.h
M	intern/cycles/kernel/kernel_path.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/kernel/split/kernel_scene_intersect.h
M	intern/cycles/render/buffers.cpp
M	intern/cycles/render/film.cpp
M	source/blender/makesrna/intern/rna_render.c
M	source/blender/render/extern/include/RE_pipeline.h
M	source/blender/render/intern/source/render_result.c

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

diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index bb345e2..47ede7d 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -271,6 +271,8 @@ static PassType get_pass_type(BL::RenderPass b_pass)
 		{
 			if(b_pass.debug_type() == BL::RenderPass::debug_type_BVH_TRAVERSAL_STEPS)
 				return PASS_BVH_TRAVERSAL_STEPS;
+			if(b_pass.debug_type() == BL::RenderPass::debug_type_RAY_BOUNCES)
+				return PASS_RAY_BOUNCES;
 			break;
 		}
 #endif
@@ -439,6 +441,7 @@ void BlenderSession::render()
 		Pass::add(PASS_COMBINED, passes);
 #ifdef WITH_CYCLES_DEBUG
 		Pass::add(PASS_BVH_TRAVERSAL_STEPS, passes);
+		/* Pass::add(PASS_RAY_BOUNCES, passes); */
 #endif
 
 		if(session_params.device.advanced_shading) {
diff --git a/intern/cycles/kernel/kernel_debug.h b/intern/cycles/kernel/kernel_debug.h
index 94ede39..da9a48a 100644
--- a/intern/cycles/kernel/kernel_debug.h
+++ b/intern/cycles/kernel/kernel_debug.h
@@ -19,6 +19,7 @@ CCL_NAMESPACE_BEGIN
 ccl_device_inline void debug_data_init(DebugData *debug_data)
 {
 	debug_data->num_bvh_traversal_steps = 0;
+	debug_data->num_ray_bounces = 0;
 }
 
 ccl_device_inline void kernel_write_debug_passes(KernelGlobals *kg,
@@ -33,6 +34,11 @@ ccl_device_inline void kernel_write_debug_passes(KernelGlobals *kg,
 		                        sample,
 		                        debug_data->num_bvh_traversal_steps);
 	}
+	if(flag & PASS_RAY_BOUNCES) {
+		kernel_write_pass_float(buffer + kernel_data.film.pass_ray_bounces,
+		                        sample,
+		                        debug_data->num_ray_bounces);
+	}
 }
 
 CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h
index e2dbf6e..857d973 100644
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@ -477,6 +477,7 @@ ccl_device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample,
 		if(state.flag & PATH_RAY_CAMERA) {
 			debug_data.num_bvh_traversal_steps += isect.num_traversal_steps;
 		}
+		debug_data.num_ray_bounces++;
 #endif
 
 #ifdef __LAMP_MIS__
@@ -878,6 +879,7 @@ ccl_device float4 kernel_branched_path_integrate(KernelGlobals *kg, RNG *rng, in
 		if(state.flag & PATH_RAY_CAMERA) {
 			debug_data.num_bvh_traversal_steps += isect.num_traversal_steps;
 		}
+		debug_data.num_ray_bounces++;
 #endif
 
 #ifdef __VOLUME__
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index 1ef0762..67e41a5 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -337,6 +337,7 @@ typedef enum PassType {
 	PASS_LIGHT = (1 << 25), /* no real pass, used to force use_light_pass */
 #ifdef __KERNEL_DEBUG__
 	PASS_BVH_TRAVERSAL_STEPS = (1 << 26),
+	PASS_RAY_BOUNCES = (1 << 27),
 #endif
 } PassType;
 
@@ -848,7 +849,8 @@ typedef struct KernelFilm {
 
 #ifdef __KERNEL_DEBUG__
 	int pass_bvh_traversal_steps;
-	int pass_pad3, pass_pad4, pass_pad5;
+	int pass_ray_bounces;
+	int pass_pad3, pass_pad4;
 #endif
 } KernelFilm;
 
@@ -987,6 +989,7 @@ typedef ccl_addr_space struct DebugData {
 	// Total number of BVH node traversal steps and primitives intersections
 	// for the camera rays.
 	int num_bvh_traversal_steps;
+	int num_ray_bounces;
 } DebugData;
 #endif
 
diff --git a/intern/cycles/kernel/split/kernel_scene_intersect.h b/intern/cycles/kernel/split/kernel_scene_intersect.h
index 09e3e5d..c1e82c7 100644
--- a/intern/cycles/kernel/split/kernel_scene_intersect.h
+++ b/intern/cycles/kernel/split/kernel_scene_intersect.h
@@ -124,6 +124,7 @@ ccl_device void kernel_scene_intersect(
 	if(state.flag & PATH_RAY_CAMERA) {
 		debug_data->num_bvh_traversal_steps += isect->num_traversal_steps;
 	}
+	debug_data->num_ray_bounces++;
 #endif
 
 	if(!hit) {
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index 011c722..fab3f70 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -197,6 +197,12 @@ bool RenderBuffers::get_pass_rect(PassType type, float exposure, int sample, int
 					pixels[0] = f;
 				}
 			}
+			else if(type == PASS_RAY_BOUNCES) {
+				for(int i = 0; i < size; i++, in += pass_stride, pixels++) {
+					float f = *in;
+					pixels[0] = f;
+				}
+			}
 #endif
 			else {
 				for(int i = 0; i < size; i++, in += pass_stride, pixels++) {
diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp
index b23678d..93b29ed 100644
--- a/intern/cycles/render/film.cpp
+++ b/intern/cycles/render/film.cpp
@@ -151,6 +151,10 @@ void Pass::add(PassType type, vector<Pass>& passes)
 			pass.components = 1;
 			pass.exposure = false;
 			break;
+		case PASS_RAY_BOUNCES:
+			pass.components = 1;
+			pass.exposure = false;
+			break;
 #endif
 	}
 
@@ -399,6 +403,9 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene)
 			case PASS_BVH_TRAVERSAL_STEPS:
 				kfilm->pass_bvh_traversal_steps = kfilm->pass_stride;
 				break;
+			case PASS_RAY_BOUNCES:
+				kfilm->pass_ray_bounces = kfilm->pass_stride;
+				break;
 #endif
 
 			case PASS_NONE:
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index ee51dcf..7ec2619 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -769,6 +769,7 @@ static void rna_def_render_pass(BlenderRNA *brna)
 
 	static EnumPropertyItem render_pass_debug_type_items[] = {
 		{RENDER_PASS_DEBUG_BVH_TRAVERSAL_STEPS, "BVH_TRAVERSAL_STEPS", 0, "BVH Traversal Steps", ""},
+		{RENDER_PASS_DEBUG_RAY_BOUNCES, "RAY_BOUNCES", 0, "Ray Steps", ""},
 		{0, NULL, 0, NULL, NULL}
 	};
 
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index 9331c45..98abae2 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -99,6 +99,7 @@ typedef struct RenderPass {
 
 enum {
 	RENDER_PASS_DEBUG_BVH_TRAVERSAL_STEPS = 0,
+	RENDER_PASS_DEBUG_RAY_BOUNCES = 1,
 };
 
 /* a renderlayer is a full image, but with all passes and samples */
diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c
index 1bcde89..ea7b32d 100644
--- a/source/blender/render/intern/source/render_result.c
+++ b/source/blender/render/intern/source/render_result.c
@@ -531,6 +531,8 @@ static const char *debug_pass_type_name_get(int debug_type)
 	switch (debug_type) {
 		case RENDER_PASS_DEBUG_BVH_TRAVERSAL_STEPS:
 			return "BVH Traversal Steps";
+		case RENDER_PASS_DEBUG_RAY_BOUNCES:
+			return "Ray Bounces";
 	}
 	return "Unknown";
 }




More information about the Bf-blender-cvs mailing list