// Copyright 2009-2021 Intel Corporation // SPDX-License-Identifier: Apache-2.0 #pragma once #include "bvh.h" #include "../common/ray.h" #include "../common/stack_item.h" #include "node_intersector_frustum.h" namespace embree { namespace isa { template struct TravRayK; /*! BVH hybrid packet intersector. Switches between packet and single ray traversal (optional). */ template class BVHNIntersectorKHybrid { /* shortcuts for frequently used types */ typedef typename PrimitiveIntersectorK::Precalculations Precalculations; typedef typename PrimitiveIntersectorK::Primitive Primitive; typedef BVHN BVH; typedef typename BVH::NodeRef NodeRef; typedef typename BVH::BaseNode BaseNode; typedef typename BVH::AABBNode AABBNode; static const size_t stackSizeSingle = 1+(N-1)*BVH::maxDepth+3; // +3 due to 16-wide store static const size_t stackSizeChunk = 1+(N-1)*BVH::maxDepth; static const size_t switchThresholdIncoherent = \ (K==4) ? 3 : (K==8) ? ((N==4) ? 5 : 7) : (K==16) ? 14 : // 14 seems to work best for KNL due to better ordered chunk traversal 0; private: static void intersect1(Accel::Intersectors* This, const BVH* bvh, NodeRef root, size_t k, Precalculations& pre, RayHitK& ray, const TravRayK& tray, RayQueryContext* context); static bool occluded1(Accel::Intersectors* This, const BVH* bvh, NodeRef root, size_t k, Precalculations& pre, RayK& ray, const TravRayK& tray, RayQueryContext* context); public: static void intersect(vint* valid, Accel::Intersectors* This, RayHitK& ray, RayQueryContext* context); static void occluded (vint* valid, Accel::Intersectors* This, RayK& ray, RayQueryContext* context); static void intersectCoherent(vint* valid, Accel::Intersectors* This, RayHitK& ray, RayQueryContext* context); static void occludedCoherent (vint* valid, Accel::Intersectors* This, RayK& ray, RayQueryContext* context); }; /*! BVH packet intersector. */ template class BVHNIntersectorKChunk : public BVHNIntersectorKHybrid {}; } }