Path: blob/master/thirdparty/embree/kernels/geometry/intersector_epilog_sycl.h
9905 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#pragma once45#include "../common/ray.h"6#include "../common/context.h"7#include "filter_sycl.h"89namespace embree10{11template<typename Ray>12struct Intersect1Epilog1_HWIF;1314template<>15struct Intersect1Epilog1_HWIF<RayHit>16{17RayHit& ray;18sycl::private_ptr<RayQueryContext> context;19const unsigned int geomID;20const unsigned int primID;21const bool filter;2223__forceinline Intersect1Epilog1_HWIF(RayHit& ray,24sycl::private_ptr<RayQueryContext> context,25const unsigned int geomID,26const unsigned int primID,27const bool filter)28: ray(ray), context(context), geomID(geomID), primID(primID), filter(filter) {}2930template<typename Hit_i>31__forceinline bool operator() (Hit_i& hit_i) const32{33hit_i.finalize();3435Scene* scene MAYBE_UNUSED = context->scene;36Geometry* geometry MAYBE_UNUSED = scene->get(geomID);3738/* ray mask test */39#if defined(EMBREE_RAY_MASK)40if ((geometry->mask & ray.mask) == 0)41return false;42#endif4344/* call intersection filter function */45#if defined(EMBREE_FILTER_FUNCTION)46if (filter && (unlikely(context->hasContextFilter() || geometry->hasIntersectionFilter())))47{48Hit h(context->user,geomID,primID,Vec2f(hit_i.u,hit_i.v),hit_i.Ng);49float old_t = ray.tfar;50ray.tfar = hit_i.t;51bool found = runIntersectionFilter1SYCL(geometry,ray,context,h);52if (!found) {53ray.tfar = old_t;54return false;55}56}57#endif5859ray.tfar = hit_i.t;60ray.u = hit_i.u;61ray.v = hit_i.v;62ray.Ng.x = hit_i.Ng.x;63ray.Ng.y = hit_i.Ng.y;64ray.Ng.z = hit_i.Ng.z;65ray.geomID = geomID;66ray.primID = primID;67instance_id_stack::copy_UU(context->user, context->user->instID, ray.instID);68#if defined(EMBREE_GEOMETRY_INSTANCE_ARRAY)69instance_id_stack::copy_UU(context->user, context->user->instPrimID, ray.instPrimID);70#endif71return true;72}7374template<typename Hit_i>75__forceinline bool operator() (bool, Hit_i& hit_i) const76{77hit_i.finalize();7879Scene* scene MAYBE_UNUSED = context->scene;80Geometry* geometry MAYBE_UNUSED = scene->get(geomID);8182/* ray mask test */83#if defined(EMBREE_RAY_MASK)84if ((geometry->mask & ray.mask) == 0)85return false;86#endif8788const Vec3fa Ng = hit_i.Ng();89const Vec2f uv = hit_i.uv();9091/* call intersection filter function */92#if defined(EMBREE_FILTER_FUNCTION)93if (filter && (unlikely(context->hasContextFilter() || geometry->hasIntersectionFilter())))94{95Hit h(context->user,geomID,primID,uv,Ng);96float old_t = ray.tfar;97ray.tfar = hit_i.t();98bool found = runIntersectionFilter1SYCL(geometry,ray,context,h);99if (!found) {100ray.tfar = old_t;101return false;102}103}104#endif105106ray.tfar = hit_i.t();107ray.u = uv.x;108ray.v = uv.y;109ray.Ng.x = Ng.x;110ray.Ng.y = Ng.y;111ray.Ng.z = Ng.z;112ray.geomID = geomID;113ray.primID = primID;114instance_id_stack::copy_UU(context->user, context->user->instID, ray.instID);115#if defined(EMBREE_GEOMETRY_INSTANCE_ARRAY)116instance_id_stack::copy_UU(context->user, context->user->instPrimID, ray.instPrimID);117#endif118return true;119}120};121122template<>123struct Intersect1Epilog1_HWIF<Ray>124{125Ray& ray;126sycl::private_ptr<RayQueryContext> context;127const unsigned int geomID;128const unsigned int primID;129const bool filter;130131__forceinline Intersect1Epilog1_HWIF(Ray& ray,132sycl::private_ptr<RayQueryContext> context,133const unsigned int geomID,134const unsigned int primID,135const bool filter)136: ray(ray), context(context), geomID(geomID), primID(primID), filter(filter) {}137138template<typename Hit_i>139__forceinline bool operator() (Hit_i& hit_i) const140{141hit_i.finalize();142143Scene* scene MAYBE_UNUSED = context->scene;144Geometry* geometry MAYBE_UNUSED = scene->get(geomID);145146/* ray mask test */147#if defined(EMBREE_RAY_MASK)148if ((geometry->mask & ray.mask) == 0)149return false;150#endif151152/* call intersection filter function */153#if defined(EMBREE_FILTER_FUNCTION)154if (filter && (unlikely(context->hasContextFilter() || geometry->hasOcclusionFilter())))155{156Hit h(context->user,geomID,primID,Vec2f(hit_i.u,hit_i.v),hit_i.Ng);157float old_t = ray.tfar;158ray.tfar = hit_i.t;159bool found = runIntersectionFilter1SYCL(geometry,ray,context,h);160if (!found) {161ray.tfar = old_t;162return false;163}164}165#endif166167ray.tfar = neg_inf;168return true;169}170171template<typename Hit_i>172__forceinline bool operator() (bool, Hit_i& hit_i) const173{174hit_i.finalize();175176Scene* scene MAYBE_UNUSED = context->scene;177Geometry* geometry MAYBE_UNUSED = scene->get(geomID);178179/* ray mask test */180#if defined(EMBREE_RAY_MASK)181if ((geometry->mask & ray.mask) == 0)182return false;183#endif184185/* call intersection filter function */186#if defined(EMBREE_FILTER_FUNCTION)187if (filter && (unlikely(context->hasContextFilter() || geometry->hasOcclusionFilter())))188{189const Vec3fa Ng = hit_i.Ng();190const Vec2f uv = hit_i.uv();191Hit h(context->user,geomID,primID,uv,Ng);192float old_t = ray.tfar;193ray.tfar = hit_i.t();194bool found = runIntersectionFilter1SYCL(geometry,ray,context,h);195if (!found) {196ray.tfar = old_t;197return false;198}199}200#endif201202ray.tfar = neg_inf;203return true;204}205};206}207208209