From 0476e2c87a7137469584735caab8b7b4405a694b Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 25 Dec 2014 00:06:49 +0500 Subject: Cycles: Rework BVH functions calls a little bit Basic idea is to allow multiple implementation per feature-set, meaning this commit tries to make it easier to hook new algorithms for BVH traversal. --- intern/cycles/kernel/geom/geom_bvh.h | 8 ++++++ intern/cycles/kernel/geom/geom_bvh_shadow.h | 21 ++++++++++++--- intern/cycles/kernel/geom/geom_bvh_subsurface.h | 24 ++++++++++++++--- intern/cycles/kernel/geom/geom_bvh_traversal.h | 36 +++++++++++++++++++++---- intern/cycles/kernel/geom/geom_bvh_volume.h | 16 ++++++++--- 5 files changed, 90 insertions(+), 15 deletions(-) (limited to 'intern/cycles/kernel') diff --git a/intern/cycles/kernel/geom/geom_bvh.h b/intern/cycles/kernel/geom/geom_bvh.h index c5336e086b7..d070a94fa29 100644 --- a/intern/cycles/kernel/geom/geom_bvh.h +++ b/intern/cycles/kernel/geom/geom_bvh.h @@ -42,6 +42,10 @@ CCL_NAMESPACE_BEGIN #define BVH_HAIR 4 #define BVH_HAIR_MINIMUM_WIDTH 8 +#define BVH_NAME_JOIN(x,y) x ## _ ## y +#define BVH_NAME_EVAL(x,y) BVH_NAME_JOIN(x,y) +#define BVH_FUNCTION_FULL_NAME(prefix) BVH_NAME_EVAL(prefix, BVH_FUNCTION_NAME) + /* Regular BVH traversal */ #define BVH_FUNCTION_NAME bvh_intersect @@ -168,6 +172,10 @@ CCL_NAMESPACE_BEGIN #include "geom_bvh_volume.h" #endif +#undef BVH_NAME_JOIN +#undef BVH_NAME_EVAL +#undef BVH_FUNCTION_FULL_NAME + ccl_device_intersect bool scene_intersect(KernelGlobals *kg, const Ray *ray, const uint visibility, Intersection *isect, uint *lcg_state, float difl, float extmax) { diff --git a/intern/cycles/kernel/geom/geom_bvh_shadow.h b/intern/cycles/kernel/geom/geom_bvh_shadow.h index db7c564c4a3..56af1abb2c3 100644 --- a/intern/cycles/kernel/geom/geom_bvh_shadow.h +++ b/intern/cycles/kernel/geom/geom_bvh_shadow.h @@ -29,8 +29,11 @@ #define FEATURE(f) (((BVH_FUNCTION_FEATURES) & (f)) != 0) -ccl_device bool BVH_FUNCTION_NAME -(KernelGlobals *kg, const Ray *ray, Intersection *isect_array, const uint max_hits, uint *num_hits) +ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg, + const Ray *ray, + Intersection *isect_array, + const uint max_hits, + uint *num_hits) { /* todo: * - likely and unlikely for if() statements @@ -373,7 +376,19 @@ ccl_device bool BVH_FUNCTION_NAME return false; } +ccl_device_inline bool BVH_FUNCTION_NAME(KernelGlobals *kg, + const Ray *ray, + Intersection *isect_array, + const uint max_hits, + uint *num_hits) +{ + return BVH_FUNCTION_FULL_NAME(BVH)(kg, + ray, + isect_array, + max_hits, + num_hits); +} + #undef FEATURE #undef BVH_FUNCTION_NAME #undef BVH_FUNCTION_FEATURES - diff --git a/intern/cycles/kernel/geom/geom_bvh_subsurface.h b/intern/cycles/kernel/geom/geom_bvh_subsurface.h index 756130be3da..41a8be9701f 100644 --- a/intern/cycles/kernel/geom/geom_bvh_subsurface.h +++ b/intern/cycles/kernel/geom/geom_bvh_subsurface.h @@ -28,8 +28,12 @@ #define FEATURE(f) (((BVH_FUNCTION_FEATURES) & (f)) != 0) -ccl_device uint BVH_FUNCTION_NAME(KernelGlobals *kg, const Ray *ray, Intersection *isect_array, - int subsurface_object, uint *lcg_state, int max_hits) +ccl_device uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg, + const Ray *ray, + Intersection *isect_array, + int subsurface_object, + uint *lcg_state, + int max_hits) { /* todo: * - test if pushing distance on the stack helps (for non shadow rays) @@ -291,7 +295,21 @@ ccl_device uint BVH_FUNCTION_NAME(KernelGlobals *kg, const Ray *ray, Intersectio return num_hits; } +ccl_device_inline uint BVH_FUNCTION_NAME(KernelGlobals *kg, + const Ray *ray, + Intersection *isect_array, + int subsurface_object, + uint *lcg_state, + int max_hits) +{ + return BVH_FUNCTION_FULL_NAME(BVH)(kg, + ray, + isect_array, + subsurface_object, + lcg_state, + max_hits); +} + #undef FEATURE #undef BVH_FUNCTION_NAME #undef BVH_FUNCTION_FEATURES - diff --git a/intern/cycles/kernel/geom/geom_bvh_traversal.h b/intern/cycles/kernel/geom/geom_bvh_traversal.h index 7be22c0f3bf..393c9f9542c 100644 --- a/intern/cycles/kernel/geom/geom_bvh_traversal.h +++ b/intern/cycles/kernel/geom/geom_bvh_traversal.h @@ -30,12 +30,16 @@ #define FEATURE(f) (((BVH_FUNCTION_FEATURES) & (f)) != 0) -ccl_device bool BVH_FUNCTION_NAME -(KernelGlobals *kg, const Ray *ray, Intersection *isect, const uint visibility +ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg, + const Ray *ray, + Intersection *isect, + const uint visibility #if FEATURE(BVH_HAIR_MINIMUM_WIDTH) -, uint *lcg_state, float difl, float extmax + , uint *lcg_state, + float difl, + float extmax #endif -) + ) { /* todo: * - test if pushing distance on the stack helps (for non shadow rays) @@ -368,7 +372,29 @@ ccl_device bool BVH_FUNCTION_NAME return (isect->prim != PRIM_NONE); } +ccl_device_inline bool BVH_FUNCTION_NAME(KernelGlobals *kg, + const Ray *ray, + Intersection *isect, + const uint visibility +#if FEATURE(BVH_HAIR_MINIMUM_WIDTH) + , uint *lcg_state, + float difl, + float extmax +#endif + ) +{ + return BVH_FUNCTION_FULL_NAME(BVH)(kg, + ray, + isect, + visibility +#if FEATURE(BVH_HAIR_MINIMUM_WIDTH) + , lcg_state, + difl, + extmax +#endif + ); +} + #undef FEATURE #undef BVH_FUNCTION_NAME #undef BVH_FUNCTION_FEATURES - diff --git a/intern/cycles/kernel/geom/geom_bvh_volume.h b/intern/cycles/kernel/geom/geom_bvh_volume.h index 7d6b9bdd8db..eb2761725fc 100644 --- a/intern/cycles/kernel/geom/geom_bvh_volume.h +++ b/intern/cycles/kernel/geom/geom_bvh_volume.h @@ -29,9 +29,9 @@ #define FEATURE(f) (((BVH_FUNCTION_FEATURES) & (f)) != 0) -ccl_device bool BVH_FUNCTION_NAME(KernelGlobals *kg, - const Ray *ray, - Intersection *isect) +ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg, + const Ray *ray, + Intersection *isect) { /* todo: * - test if pushing distance on the stack helps (for non shadow rays) @@ -312,7 +312,15 @@ ccl_device bool BVH_FUNCTION_NAME(KernelGlobals *kg, return (isect->prim != PRIM_NONE); } +ccl_device_inline bool BVH_FUNCTION_NAME(KernelGlobals *kg, + const Ray *ray, + Intersection *isect) +{ + return BVH_FUNCTION_FULL_NAME(BVH)(kg, + ray, + isect); +} + #undef FEATURE #undef BVH_FUNCTION_NAME #undef BVH_FUNCTION_FEATURES - -- cgit v1.2.3