Cycles: Add leaf primitives sanity check asserts to the kernel

This way we'll notice that leaf splitting didn't happen correct pretty easily
in debug builds.

There'll be absolutely no impact on release builds.
This commit is contained in:
Sergey Sharybin 2015-01-12 02:04:35 +05:00
parent bc7ff3c2b4
commit 5719ed1225
8 changed files with 23 additions and 3 deletions

@ -216,6 +216,8 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
/* primitive intersection */ /* primitive intersection */
while(primAddr < primAddr2) { while(primAddr < primAddr2) {
kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
bool hit; bool hit;
/* todo: specialized intersect functions which don't fill in /* todo: specialized intersect functions which don't fill in

@ -205,6 +205,7 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
case PRIMITIVE_TRIANGLE: { case PRIMITIVE_TRIANGLE: {
/* intersect ray against primitive */ /* intersect ray against primitive */
for(; primAddr < primAddr2; primAddr++) { for(; primAddr < primAddr2; primAddr++) {
kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
/* only primitives from the same object */ /* only primitives from the same object */
uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object; uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object;
if(tri_object != subsurface_object) if(tri_object != subsurface_object)
@ -217,6 +218,7 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
case PRIMITIVE_MOTION_TRIANGLE: { case PRIMITIVE_MOTION_TRIANGLE: {
/* intersect ray against primitive */ /* intersect ray against primitive */
for(; primAddr < primAddr2; primAddr++) { for(; primAddr < primAddr2; primAddr++) {
kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
/* only primitives from the same object */ /* only primitives from the same object */
uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object; uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object;
if(tri_object != subsurface_object) if(tri_object != subsurface_object)

@ -268,6 +268,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
#if defined(__KERNEL_DEBUG__) #if defined(__KERNEL_DEBUG__)
isect->num_traversal_steps++; isect->num_traversal_steps++;
#endif #endif
kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
if(triangle_intersect(kg, &isect_precalc, isect, P, dir, visibility, object, primAddr)) { if(triangle_intersect(kg, &isect_precalc, isect, P, dir, visibility, object, primAddr)) {
/* shadow ray early termination */ /* shadow ray early termination */
#if defined(__KERNEL_SSE2__) #if defined(__KERNEL_SSE2__)
@ -288,6 +289,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
#if defined(__KERNEL_DEBUG__) #if defined(__KERNEL_DEBUG__)
isect->num_traversal_steps++; isect->num_traversal_steps++;
#endif #endif
kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
if(motion_triangle_intersect(kg, isect, P, dir, ray->time, visibility, object, primAddr)) { if(motion_triangle_intersect(kg, isect, P, dir, ray->time, visibility, object, primAddr)) {
/* shadow ray early termination */ /* shadow ray early termination */
#if defined(__KERNEL_SSE2__) #if defined(__KERNEL_SSE2__)
@ -310,6 +312,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
#if defined(__KERNEL_DEBUG__) #if defined(__KERNEL_DEBUG__)
isect->num_traversal_steps++; isect->num_traversal_steps++;
#endif #endif
kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
bool hit; bool hit;
if(kernel_data.curve.curveflags & CURVE_KN_INTERPOLATE) if(kernel_data.curve.curveflags & CURVE_KN_INTERPOLATE)
hit = bvh_cardinal_curve_intersect(kg, isect, P, dir, visibility, object, primAddr, ray->time, type, lcg_state, difl, extmax); hit = bvh_cardinal_curve_intersect(kg, isect, P, dir, visibility, object, primAddr, ray->time, type, lcg_state, difl, extmax);

@ -206,6 +206,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
case PRIMITIVE_TRIANGLE: { case PRIMITIVE_TRIANGLE: {
/* intersect ray against primitive */ /* intersect ray against primitive */
for(; primAddr < primAddr2; primAddr++) { for(; primAddr < primAddr2; primAddr++) {
kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
/* only primitives from volume object */ /* only primitives from volume object */
uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object; uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object;
int object_flag = kernel_tex_fetch(__object_flag, tri_object); int object_flag = kernel_tex_fetch(__object_flag, tri_object);
@ -220,6 +221,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
case PRIMITIVE_MOTION_TRIANGLE: { case PRIMITIVE_MOTION_TRIANGLE: {
/* intersect ray against primitive */ /* intersect ray against primitive */
for(; primAddr < primAddr2; primAddr++) { for(; primAddr < primAddr2; primAddr++) {
kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
/* only primitives from volume object */ /* only primitives from volume object */
uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object; uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object;
int object_flag = kernel_tex_fetch(__object_flag, tri_object); int object_flag = kernel_tex_fetch(__object_flag, tri_object);
@ -236,6 +238,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
case PRIMITIVE_MOTION_CURVE: { case PRIMITIVE_MOTION_CURVE: {
/* intersect ray against primitive */ /* intersect ray against primitive */
for(; primAddr < primAddr2; primAddr++) { for(; primAddr < primAddr2; primAddr++) {
kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
/* only primitives from volume object */ /* only primitives from volume object */
uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object; uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object;
int object_flag = kernel_tex_fetch(__object_flag, tri_object); int object_flag = kernel_tex_fetch(__object_flag, tri_object);

@ -225,6 +225,8 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
/* Primitive intersection. */ /* Primitive intersection. */
while(primAddr < primAddr2) { while(primAddr < primAddr2) {
kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
bool hit; bool hit;
/* todo: specialized intersect functions which don't fill in /* todo: specialized intersect functions which don't fill in

@ -214,6 +214,7 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
case PRIMITIVE_TRIANGLE: { case PRIMITIVE_TRIANGLE: {
/* Intersect ray against primitive, */ /* Intersect ray against primitive, */
for(; primAddr < primAddr2; primAddr++) { for(; primAddr < primAddr2; primAddr++) {
kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
/* Only primitives from the same object. */ /* Only primitives from the same object. */
uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object; uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object;
if(tri_object != subsurface_object) { if(tri_object != subsurface_object) {
@ -227,6 +228,7 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
case PRIMITIVE_MOTION_TRIANGLE: { case PRIMITIVE_MOTION_TRIANGLE: {
/* Intersect ray against primitive. */ /* Intersect ray against primitive. */
for(; primAddr < primAddr2; primAddr++) { for(; primAddr < primAddr2; primAddr++) {
kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
/* Only primitives from the same object. */ /* Only primitives from the same object. */
uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object; uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object;
if(tri_object != subsurface_object) { if(tri_object != subsurface_object) {

@ -285,10 +285,11 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
/* Primitive intersection. */ /* Primitive intersection. */
switch(type & PRIMITIVE_ALL) { switch(type & PRIMITIVE_ALL) {
case PRIMITIVE_TRIANGLE: { case PRIMITIVE_TRIANGLE: {
for(; primAddr < primAddr2; primAddr++) {
#if defined(__KERNEL_DEBUG__) #if defined(__KERNEL_DEBUG__)
isect->num_traversal_steps++; isect->num_traversal_steps++;
#endif #endif
for(; primAddr < primAddr2; primAddr++) { kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
if(triangle_intersect(kg, &isect_precalc, isect, P, dir, visibility, object, primAddr)) { if(triangle_intersect(kg, &isect_precalc, isect, P, dir, visibility, object, primAddr)) {
tfar = ssef(isect->t); tfar = ssef(isect->t);
/* Shadow ray early termination. */ /* Shadow ray early termination. */
@ -304,6 +305,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
#if defined(__KERNEL_DEBUG__) #if defined(__KERNEL_DEBUG__)
isect->num_traversal_steps++; isect->num_traversal_steps++;
#endif #endif
kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
if(motion_triangle_intersect(kg, isect, P, dir, ray->time, visibility, object, primAddr)) { if(motion_triangle_intersect(kg, isect, P, dir, ray->time, visibility, object, primAddr)) {
tfar = ssef(isect->t); tfar = ssef(isect->t);
/* Shadow ray early termination. */ /* Shadow ray early termination. */
@ -321,6 +323,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
#if defined(__KERNEL_DEBUG__) #if defined(__KERNEL_DEBUG__)
isect->num_traversal_steps++; isect->num_traversal_steps++;
#endif #endif
kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
bool hit; bool hit;
if(kernel_data.curve.curveflags & CURVE_KN_INTERPOLATE) if(kernel_data.curve.curveflags & CURVE_KN_INTERPOLATE)
hit = bvh_cardinal_curve_intersect(kg, isect, P, dir, visibility, object, primAddr, ray->time, type, lcg_state, difl, extmax); hit = bvh_cardinal_curve_intersect(kg, isect, P, dir, visibility, object, primAddr, ray->time, type, lcg_state, difl, extmax);

@ -220,6 +220,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
switch(p_type) { switch(p_type) {
case PRIMITIVE_TRIANGLE: { case PRIMITIVE_TRIANGLE: {
for(; primAddr < primAddr2; primAddr++) { for(; primAddr < primAddr2; primAddr++) {
kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
/* Only primitives from volume object. */ /* Only primitives from volume object. */
uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object; uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object;
int object_flag = kernel_tex_fetch(__object_flag, tri_object); int object_flag = kernel_tex_fetch(__object_flag, tri_object);
@ -234,6 +235,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
#if BVH_FEATURE(BVH_MOTION) #if BVH_FEATURE(BVH_MOTION)
case PRIMITIVE_MOTION_TRIANGLE: { case PRIMITIVE_MOTION_TRIANGLE: {
for(; primAddr < primAddr2; primAddr++) { for(; primAddr < primAddr2; primAddr++) {
kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
/* Only primitives from volume object. */ /* Only primitives from volume object. */
uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object; uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object;
int object_flag = kernel_tex_fetch(__object_flag, tri_object); int object_flag = kernel_tex_fetch(__object_flag, tri_object);
@ -250,6 +252,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
case PRIMITIVE_CURVE: case PRIMITIVE_CURVE:
case PRIMITIVE_MOTION_CURVE: { case PRIMITIVE_MOTION_CURVE: {
for(; primAddr < primAddr2; primAddr++) { for(; primAddr < primAddr2; primAddr++) {
kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
/* Only primitives from volume object. */ /* Only primitives from volume object. */
uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object; uint tri_object = (object == OBJECT_NONE)? kernel_tex_fetch(__prim_object, primAddr): object;
int object_flag = kernel_tex_fetch(__object_flag, tri_object); int object_flag = kernel_tex_fetch(__object_flag, tri_object);