forked from bartvdbraak/blender
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:
parent
bc7ff3c2b4
commit
5719ed1225
@ -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: {
|
||||||
#if defined(__KERNEL_DEBUG__)
|
|
||||||
isect->num_traversal_steps++;
|
|
||||||
#endif
|
|
||||||
for(; primAddr < primAddr2; primAddr++) {
|
for(; primAddr < primAddr2; primAddr++) {
|
||||||
|
#if defined(__KERNEL_DEBUG__)
|
||||||
|
isect->num_traversal_steps++;
|
||||||
|
#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)) {
|
||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user