Skip to content

Commit 756ff35

Browse files
committed
Added specialization constants for motion blurred instances
Improves performance in embree_forest_sycl by about 50%.
1 parent 13dcb33 commit 756ff35

1 file changed

Lines changed: 29 additions & 11 deletions

File tree

kernels/sycl/rthwif_embree.cpp

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -214,10 +214,10 @@ __forceinline bool intersect_user_geometry(intel_ray_query_t& query, Ray& ray, U
214214
}
215215

216216
template<typename Ray>
217-
__forceinline bool intersect_instance(intel_ray_query_t& query, Ray& ray, Geometry* geom, Scenes& scenes, sycl::private_ptr<RayQueryContext> context, uint32_t geomID, uint32_t primID, bool instance_array);
217+
__forceinline bool intersect_instance(intel_ray_query_t& query, Ray& ray, Geometry* geom, Scenes& scenes, sycl::private_ptr<RayQueryContext> context, uint32_t geomID, uint32_t primID, bool instance_array, const RTCFeatureFlags feature_mask);
218218

219219
template<>
220-
__forceinline bool intersect_instance(intel_ray_query_t& query, RayHit& ray, Geometry* geom, Scenes& scenes, sycl::private_ptr<RayQueryContext> context, uint32_t geomID, uint32_t primID, bool instance_array)
220+
__forceinline bool intersect_instance(intel_ray_query_t& query, RayHit& ray, Geometry* geom, Scenes& scenes, sycl::private_ptr<RayQueryContext> context, uint32_t geomID, uint32_t primID, bool instance_array, const RTCFeatureFlags feature_mask)
221221
{
222222
/* perform ray mask test */
223223
#if defined(EMBREE_RAY_MASK)
@@ -239,9 +239,18 @@ __forceinline bool intersect_instance(intel_ray_query_t& query, RayHit& ray, Geo
239239
: (Scene*) ((Instance*)geom)->object;
240240
if (!object) return false;
241241

242-
const AffineSpace3fa world2local = instance_array
243-
? ((InstanceArray*)geom)->getWorld2Local(primID, ray.time())
244-
: ((Instance*)geom)->getWorld2Local(ray.time());
242+
AffineSpace3fa world2local;
243+
if (feature_mask & RTC_FEATURE_FLAG_MOTION_BLUR) {
244+
world2local =
245+
instance_array
246+
? ((InstanceArray *)geom)->getWorld2Local(primID, ray.time())
247+
: ((Instance *)geom)->getWorld2Local(ray.time());
248+
} else {
249+
world2local =
250+
instance_array
251+
? ((InstanceArray *)geom)->getWorld2Local(primID)
252+
: ((Instance *)geom)->getWorld2Local();
253+
}
245254

246255
const Vec3fa ray_org = xfmPoint (world2local, (Vec3f) ray.org);
247256
const Vec3fa ray_dir = xfmVector(world2local, (Vec3f) ray.dir);
@@ -260,7 +269,7 @@ __forceinline bool intersect_instance(intel_ray_query_t& query, RayHit& ray, Geo
260269
#endif
261270

262271
uint32_t bvh_id = 0;
263-
if (context->args->feature_mask & RTC_FEATURE_FLAG_MOTION_BLUR) {
272+
if (feature_mask & RTC_FEATURE_FLAG_MOTION_BLUR) {
264273
float time = clamp(ray.time(),0.0f,1.0f);
265274
uint32_t numTimeSegments = object->getMaxTimeSegments();
266275
bvh_id = (uint32_t) clamp(uint32_t(numTimeSegments*time), 0u, numTimeSegments-1);
@@ -274,7 +283,7 @@ __forceinline bool intersect_instance(intel_ray_query_t& query, RayHit& ray, Geo
274283
}
275284

276285
template<>
277-
__forceinline bool intersect_instance(intel_ray_query_t& query, Ray& ray, Geometry* geom, Scenes& scenes, sycl::private_ptr<RayQueryContext> context, uint32_t geomID, uint32_t primID, bool instance_array)
286+
__forceinline bool intersect_instance(intel_ray_query_t& query, Ray& ray, Geometry* geom, Scenes& scenes, sycl::private_ptr<RayQueryContext> context, uint32_t geomID, uint32_t primID, bool instance_array, const RTCFeatureFlags feature_mask)
278287
{
279288
/* perform ray mask test */
280289
#if defined(EMBREE_RAY_MASK)
@@ -296,9 +305,18 @@ __forceinline bool intersect_instance(intel_ray_query_t& query, Ray& ray, Geomet
296305
: (Scene*) ((Instance*)geom)->object;
297306
if (!object) return false;
298307

299-
const AffineSpace3fa world2local = instance_array
300-
? ((InstanceArray*)geom)->getWorld2Local(primID, ray.time())
301-
: ((Instance*)geom)->getWorld2Local(ray.time());
308+
AffineSpace3fa world2local;
309+
if (feature_mask & RTC_FEATURE_FLAG_MOTION_BLUR) {
310+
world2local =
311+
instance_array
312+
? ((InstanceArray *)geom)->getWorld2Local(primID, ray.time())
313+
: ((Instance *)geom)->getWorld2Local(ray.time());
314+
} else {
315+
world2local =
316+
instance_array
317+
? ((InstanceArray *)geom)->getWorld2Local(primID)
318+
: ((Instance *)geom)->getWorld2Local();
319+
}
302320

303321
const Vec3fa ray_org = xfmPoint (world2local, (Vec3f) ray.org);
304322
const Vec3fa ray_dir = xfmVector(world2local, (Vec3f) ray.dir);
@@ -352,7 +370,7 @@ __forceinline bool intersect_primitive(intel_ray_query_t& query, Ray& ray, Scene
352370
#if defined(EMBREE_GEOMETRY_INSTANCE) || defined(EMBREE_GEOMETRY_INSTANCE_ARRAY)
353371
if ((feature_mask & RTC_FEATURE_FLAG_INSTANCE) && (geom->getTypeMask() & Geometry::MTY_INSTANCE) ||
354372
(feature_mask & RTC_FEATURE_FLAG_INSTANCE_ARRAY) && (geom->getTypeMask() & Geometry::MTY_INSTANCE_ARRAY)) {
355-
return intersect_instance(query,ray,(Instance*)geom, scenes, context, geomID, primID, geom->getTypeMask() & Geometry::MTY_INSTANCE_ARRAY);
373+
return intersect_instance(query,ray,(Instance*)geom, scenes, context, geomID, primID, geom->getTypeMask() & Geometry::MTY_INSTANCE_ARRAY, feature_mask);
356374
}
357375
#endif
358376

0 commit comments

Comments
 (0)