// Copyright 2009-2021 Intel Corporation // SPDX-License-Identifier: Apache-2.0 #pragma once #include "../common/ray.h" #include "../common/context.h" #include "filter_sycl.h" namespace embree { template struct Intersect1Epilog1_HWIF; template<> struct Intersect1Epilog1_HWIF { RayHit& ray; sycl::private_ptr context; const unsigned int geomID; const unsigned int primID; const bool filter; __forceinline Intersect1Epilog1_HWIF(RayHit& ray, sycl::private_ptr context, const unsigned int geomID, const unsigned int primID, const bool filter) : ray(ray), context(context), geomID(geomID), primID(primID), filter(filter) {} template __forceinline bool operator() (Hit_i& hit_i) const { hit_i.finalize(); Scene* scene MAYBE_UNUSED = context->scene; Geometry* geometry MAYBE_UNUSED = scene->get(geomID); /* ray mask test */ #if defined(EMBREE_RAY_MASK) if ((geometry->mask & ray.mask) == 0) return false; #endif /* call intersection filter function */ #if defined(EMBREE_FILTER_FUNCTION) if (filter && (unlikely(context->hasContextFilter() || geometry->hasIntersectionFilter()))) { Hit h(context->user,geomID,primID,Vec2f(hit_i.u,hit_i.v),hit_i.Ng); float old_t = ray.tfar; ray.tfar = hit_i.t; bool found = runIntersectionFilter1SYCL(geometry,ray,context,h); if (!found) { ray.tfar = old_t; return false; } } #endif ray.tfar = hit_i.t; ray.u = hit_i.u; ray.v = hit_i.v; ray.Ng.x = hit_i.Ng.x; ray.Ng.y = hit_i.Ng.y; ray.Ng.z = hit_i.Ng.z; ray.geomID = geomID; ray.primID = primID; instance_id_stack::copy_UU(context->user, context->user->instID, ray.instID); #if defined(EMBREE_GEOMETRY_INSTANCE_ARRAY) instance_id_stack::copy_UU(context->user, context->user->instPrimID, ray.instPrimID); #endif return true; } template __forceinline bool operator() (bool, Hit_i& hit_i) const { hit_i.finalize(); Scene* scene MAYBE_UNUSED = context->scene; Geometry* geometry MAYBE_UNUSED = scene->get(geomID); /* ray mask test */ #if defined(EMBREE_RAY_MASK) if ((geometry->mask & ray.mask) == 0) return false; #endif const Vec3fa Ng = hit_i.Ng(); const Vec2f uv = hit_i.uv(); /* call intersection filter function */ #if defined(EMBREE_FILTER_FUNCTION) if (filter && (unlikely(context->hasContextFilter() || geometry->hasIntersectionFilter()))) { Hit h(context->user,geomID,primID,uv,Ng); float old_t = ray.tfar; ray.tfar = hit_i.t(); bool found = runIntersectionFilter1SYCL(geometry,ray,context,h); if (!found) { ray.tfar = old_t; return false; } } #endif ray.tfar = hit_i.t(); ray.u = uv.x; ray.v = uv.y; ray.Ng.x = Ng.x; ray.Ng.y = Ng.y; ray.Ng.z = Ng.z; ray.geomID = geomID; ray.primID = primID; instance_id_stack::copy_UU(context->user, context->user->instID, ray.instID); #if defined(EMBREE_GEOMETRY_INSTANCE_ARRAY) instance_id_stack::copy_UU(context->user, context->user->instPrimID, ray.instPrimID); #endif return true; } }; template<> struct Intersect1Epilog1_HWIF { Ray& ray; sycl::private_ptr context; const unsigned int geomID; const unsigned int primID; const bool filter; __forceinline Intersect1Epilog1_HWIF(Ray& ray, sycl::private_ptr context, const unsigned int geomID, const unsigned int primID, const bool filter) : ray(ray), context(context), geomID(geomID), primID(primID), filter(filter) {} template __forceinline bool operator() (Hit_i& hit_i) const { hit_i.finalize(); Scene* scene MAYBE_UNUSED = context->scene; Geometry* geometry MAYBE_UNUSED = scene->get(geomID); /* ray mask test */ #if defined(EMBREE_RAY_MASK) if ((geometry->mask & ray.mask) == 0) return false; #endif /* call intersection filter function */ #if defined(EMBREE_FILTER_FUNCTION) if (filter && (unlikely(context->hasContextFilter() || geometry->hasOcclusionFilter()))) { Hit h(context->user,geomID,primID,Vec2f(hit_i.u,hit_i.v),hit_i.Ng); float old_t = ray.tfar; ray.tfar = hit_i.t; bool found = runIntersectionFilter1SYCL(geometry,ray,context,h); if (!found) { ray.tfar = old_t; return false; } } #endif ray.tfar = neg_inf; return true; } template __forceinline bool operator() (bool, Hit_i& hit_i) const { hit_i.finalize(); Scene* scene MAYBE_UNUSED = context->scene; Geometry* geometry MAYBE_UNUSED = scene->get(geomID); /* ray mask test */ #if defined(EMBREE_RAY_MASK) if ((geometry->mask & ray.mask) == 0) return false; #endif /* call intersection filter function */ #if defined(EMBREE_FILTER_FUNCTION) if (filter && (unlikely(context->hasContextFilter() || geometry->hasOcclusionFilter()))) { const Vec3fa Ng = hit_i.Ng(); const Vec2f uv = hit_i.uv(); Hit h(context->user,geomID,primID,uv,Ng); float old_t = ray.tfar; ray.tfar = hit_i.t(); bool found = runIntersectionFilter1SYCL(geometry,ray,context,h); if (!found) { ray.tfar = old_t; return false; } } #endif ray.tfar = neg_inf; return true; } }; }