Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2015-06-12 01:12:03 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2015-06-12 01:12:03 +0300
commit596eadf0e181ddf3ab7472b5e1607a15546a9586 (patch)
tree9573d9dcecb226b3049edc33acb0010e15ddf785
parentb3cc602adcde882926f1f9b59c66a4aa44bce1d0 (diff)
Cycles: Add debug pass which shows number of instance pushes during camera ray intersection
TODO: We might want to refactor debug passes into PASS_DEBUG and some debug_type (similar to Blender's side passes) to avoid issue of running out of bits.
-rw-r--r--intern/cycles/blender/blender_session.cpp2
-rw-r--r--intern/cycles/kernel/geom/geom_bvh_traversal.h5
-rw-r--r--intern/cycles/kernel/geom/geom_qbvh_traversal.h5
-rw-r--r--intern/cycles/kernel/kernel_debug.h6
-rw-r--r--intern/cycles/kernel/kernel_path.h2
-rw-r--r--intern/cycles/kernel/kernel_types.h8
-rw-r--r--intern/cycles/kernel/split/kernel_scene_intersect.h1
-rw-r--r--intern/cycles/render/film.cpp7
-rw-r--r--source/blender/makesrna/intern/rna_render.c1
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h3
-rw-r--r--source/blender/render/intern/source/render_result.c2
11 files changed, 39 insertions, 3 deletions
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 47ede7d9b88..bc1fd37962e 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_BVH_TRAVERSED_INSTANCES)
+ return PASS_BVH_TRAVERSED_INSTANCES;
if(b_pass.debug_type() == BL::RenderPass::debug_type_RAY_BOUNCES)
return PASS_RAY_BOUNCES;
break;
diff --git a/intern/cycles/kernel/geom/geom_bvh_traversal.h b/intern/cycles/kernel/geom/geom_bvh_traversal.h
index 87f8ccd01b1..73d79fd78ee 100644
--- a/intern/cycles/kernel/geom/geom_bvh_traversal.h
+++ b/intern/cycles/kernel/geom/geom_bvh_traversal.h
@@ -76,6 +76,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
#if defined(__KERNEL_DEBUG__)
isect->num_traversal_steps = 0;
+ isect->num_traversed_instances = 0;
#endif
#if defined(__KERNEL_SSE2__)
@@ -362,6 +363,10 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
traversalStack[stackPtr] = ENTRYPOINT_SENTINEL;
nodeAddr = kernel_tex_fetch(__object_node, object);
+
+#if defined(__KERNEL_DEBUG__)
+ isect->num_traversed_instances++;
+#endif
}
}
#endif /* FEATURE(BVH_INSTANCING) */
diff --git a/intern/cycles/kernel/geom/geom_qbvh_traversal.h b/intern/cycles/kernel/geom/geom_qbvh_traversal.h
index cc20ebd8154..be7519d0cff 100644
--- a/intern/cycles/kernel/geom/geom_qbvh_traversal.h
+++ b/intern/cycles/kernel/geom/geom_qbvh_traversal.h
@@ -80,6 +80,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
#if defined(__KERNEL_DEBUG__)
isect->num_traversal_steps = 0;
+ isect->num_traversed_instances = 0;
#endif
ssef tnear(0.0f), tfar(ray->t);
@@ -377,6 +378,10 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
traversalStack[stackPtr].dist = -FLT_MAX;
nodeAddr = kernel_tex_fetch(__object_node, object);
+
+#if defined(__KERNEL_DEBUG__)
+ isect->num_traversed_instances++;
+#endif
}
}
#endif /* FEATURE(BVH_INSTANCING) */
diff --git a/intern/cycles/kernel/kernel_debug.h b/intern/cycles/kernel/kernel_debug.h
index da9a48a11f9..24d6458567e 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_bvh_traversed_instances = 0;
debug_data->num_ray_bounces = 0;
}
@@ -34,6 +35,11 @@ ccl_device_inline void kernel_write_debug_passes(KernelGlobals *kg,
sample,
debug_data->num_bvh_traversal_steps);
}
+ if(flag & PASS_BVH_TRAVERSED_INSTANCES) {
+ kernel_write_pass_float(buffer + kernel_data.film.pass_bvh_traversed_instances,
+ sample,
+ debug_data->num_bvh_traversed_instances);
+ }
if(flag & PASS_RAY_BOUNCES) {
kernel_write_pass_float(buffer + kernel_data.film.pass_ray_bounces,
sample,
diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h
index 857d97329b6..1804c8bfbe3 100644
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@ -476,6 +476,7 @@ ccl_device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample,
#ifdef __KERNEL_DEBUG__
if(state.flag & PATH_RAY_CAMERA) {
debug_data.num_bvh_traversal_steps += isect.num_traversal_steps;
+ debug_data.num_bvh_traversed_instances += isect.num_traversed_instances;
}
debug_data.num_ray_bounces++;
#endif
@@ -878,6 +879,7 @@ ccl_device float4 kernel_branched_path_integrate(KernelGlobals *kg, RNG *rng, in
#ifdef __KERNEL_DEBUG__
if(state.flag & PATH_RAY_CAMERA) {
debug_data.num_bvh_traversal_steps += isect.num_traversal_steps;
+ debug_data.num_bvh_traversed_instances += isect.num_traversed_instances;
}
debug_data.num_ray_bounces++;
#endif
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index 26b286a5c9f..2a70bfcb8f0 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -339,7 +339,8 @@ 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),
+ PASS_BVH_TRAVERSED_INSTANCES = (1 << 27),
+ PASS_RAY_BOUNCES = (1 << 28),
#endif
} PassType;
@@ -501,6 +502,7 @@ typedef ccl_addr_space struct Intersection {
#ifdef __KERNEL_DEBUG__
int num_traversal_steps;
+ int num_traversed_instances;
#endif
} Intersection;
@@ -851,8 +853,9 @@ typedef struct KernelFilm {
#ifdef __KERNEL_DEBUG__
int pass_bvh_traversal_steps;
+ int pass_bvh_traversed_instances;
int pass_ray_bounces;
- int pass_pad3, pass_pad4;
+ int pass_pad3;
#endif
} KernelFilm;
@@ -991,6 +994,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_bvh_traversed_instances;
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 c1e82c7a21b..73aa005a496 100644
--- a/intern/cycles/kernel/split/kernel_scene_intersect.h
+++ b/intern/cycles/kernel/split/kernel_scene_intersect.h
@@ -123,6 +123,7 @@ ccl_device void kernel_scene_intersect(
#ifdef __KERNEL_DEBUG__
if(state.flag & PATH_RAY_CAMERA) {
debug_data->num_bvh_traversal_steps += isect->num_traversal_steps;
+ debug_data->num_bvh_traversed_instances += isect->num_traversed_instances;
}
debug_data->num_ray_bounces++;
#endif
diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp
index 93b29ed90a9..7282b04a22e 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_BVH_TRAVERSED_INSTANCES:
+ pass.components = 1;
+ pass.exposure = false;
+ break;
case PASS_RAY_BOUNCES:
pass.components = 1;
pass.exposure = false;
@@ -403,6 +407,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_BVH_TRAVERSED_INSTANCES:
+ kfilm->pass_bvh_traversed_instances = kfilm->pass_stride;
+ break;
case PASS_RAY_BOUNCES:
kfilm->pass_ray_bounces = kfilm->pass_stride;
break;
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index a759779d6a3..61eb2c69bfe 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -79,6 +79,7 @@ EnumPropertyItem render_pass_type_items[] = {
EnumPropertyItem render_pass_debug_type_items[] = {
{RENDER_PASS_DEBUG_BVH_TRAVERSAL_STEPS, "BVH_TRAVERSAL_STEPS", 0, "BVH Traversal Steps", ""},
+ {RENDER_PASS_DEBUG_BVH_TRAVERSED_INSTANCES, "BVH_TRAVERSED_INSTANCES", 0, "BVH Traversed Instances", ""},
{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 98abae26488..4b6004cea3d 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -99,7 +99,8 @@ typedef struct RenderPass {
enum {
RENDER_PASS_DEBUG_BVH_TRAVERSAL_STEPS = 0,
- RENDER_PASS_DEBUG_RAY_BOUNCES = 1,
+ RENDER_PASS_DEBUG_BVH_TRAVERSED_INSTANCES = 1,
+ RENDER_PASS_DEBUG_RAY_BOUNCES = 2,
};
/* 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 7f54bebd673..05a46927b63 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_BVH_TRAVERSED_INSTANCES:
+ return "BVH Traversed Instances";
case RENDER_PASS_DEBUG_RAY_BOUNCES:
return "Ray Bounces";
}