intersector_iterators.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include "../common/scene.h"
  5. #include "../common/ray.h"
  6. #include "../common/point_query.h"
  7. #include "../bvh/node_intersector1.h"
  8. #include "../bvh/node_intersector_packet.h"
  9. namespace embree
  10. {
  11. namespace isa
  12. {
  13. template<typename Intersector>
  14. struct ArrayIntersector1
  15. {
  16. typedef typename Intersector::Primitive Primitive;
  17. typedef typename Intersector::Precalculations Precalculations;
  18. template<int N, bool robust>
  19. static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
  20. {
  21. for (size_t i=0; i<num; i++)
  22. Intersector::intersect(pre,ray,context,prim[i]);
  23. }
  24. template<int N, bool robust>
  25. static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
  26. {
  27. for (size_t i=0; i<num; i++) {
  28. if (Intersector::occluded(pre,ray,context,prim[i]))
  29. return true;
  30. }
  31. return false;
  32. }
  33. template<int N>
  34. static __forceinline bool pointQuery(const Accel::Intersectors* This, PointQuery* query, PointQueryContext* context, const Primitive* prim, size_t num, const TravPointQuery<N> &tquery, size_t& lazy_node)
  35. {
  36. bool changed = false;
  37. for (size_t i=0; i<num; i++)
  38. changed |= Intersector::pointQuery(query, context, prim[i]);
  39. return changed;
  40. }
  41. template<int K>
  42. static __forceinline void intersectK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayHitK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
  43. {
  44. }
  45. template<int K>
  46. static __forceinline vbool<K> occludedK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
  47. {
  48. return valid;
  49. }
  50. };
  51. template<int K, typename Intersector>
  52. struct ArrayIntersectorK_1
  53. {
  54. typedef typename Intersector::Primitive Primitive;
  55. typedef typename Intersector::Precalculations Precalculations;
  56. template<bool robust>
  57. static __forceinline void intersect(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
  58. {
  59. for (size_t i=0; i<num; i++) {
  60. Intersector::intersect(valid,pre,ray,context,prim[i]);
  61. }
  62. }
  63. template<bool robust>
  64. static __forceinline vbool<K> occluded(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
  65. {
  66. vbool<K> valid0 = valid;
  67. for (size_t i=0; i<num; i++) {
  68. valid0 &= !Intersector::occluded(valid0,pre,ray,context,prim[i]);
  69. if (none(valid0)) break;
  70. }
  71. return !valid0;
  72. }
  73. template<int N, bool robust>
  74. static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
  75. {
  76. for (size_t i=0; i<num; i++) {
  77. Intersector::intersect(pre,ray,k,context,prim[i]);
  78. }
  79. }
  80. template<int N, bool robust>
  81. static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
  82. {
  83. for (size_t i=0; i<num; i++) {
  84. if (Intersector::occluded(pre,ray,k,context,prim[i]))
  85. return true;
  86. }
  87. return false;
  88. }
  89. };
  90. // =============================================================================================
  91. template<int K, typename IntersectorK>
  92. struct ArrayIntersectorKStream
  93. {
  94. typedef typename IntersectorK::Primitive PrimitiveK;
  95. typedef typename IntersectorK::Precalculations PrecalculationsK;
  96. static __forceinline void intersectK(const vbool<K>& valid, const Accel::Intersectors* This, /* PrecalculationsK& pre, */ RayHitK<K>& ray, IntersectContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
  97. {
  98. PrecalculationsK pre(valid,ray); // FIXME: might cause trouble
  99. for (size_t i=0; i<num; i++) {
  100. IntersectorK::intersect(valid,pre,ray,context,prim[i]);
  101. }
  102. }
  103. static __forceinline vbool<K> occludedK(const vbool<K>& valid, const Accel::Intersectors* This, /* PrecalculationsK& pre, */ RayK<K>& ray, IntersectContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
  104. {
  105. PrecalculationsK pre(valid,ray); // FIXME: might cause trouble
  106. vbool<K> valid0 = valid;
  107. for (size_t i=0; i<num; i++) {
  108. valid0 &= !IntersectorK::occluded(valid0,pre,ray,context,prim[i]);
  109. if (none(valid0)) break;
  110. }
  111. return !valid0;
  112. }
  113. static __forceinline void intersect(const Accel::Intersectors* This, RayHitK<K>& ray, size_t k, IntersectContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
  114. {
  115. PrecalculationsK pre(ray.tnear() <= ray.tfar,ray); // FIXME: might cause trouble
  116. for (size_t i=0; i<num; i++) {
  117. IntersectorK::intersect(pre,ray,k,context,prim[i]);
  118. }
  119. }
  120. static __forceinline bool occluded(const Accel::Intersectors* This, RayK<K>& ray, size_t k, IntersectContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
  121. {
  122. PrecalculationsK pre(ray.tnear() <= ray.tfar,ray); // FIXME: might cause trouble
  123. for (size_t i=0; i<num; i++) {
  124. if (IntersectorK::occluded(pre,ray,k,context,prim[i]))
  125. return true;
  126. }
  127. return false;
  128. }
  129. static __forceinline size_t occluded(const Accel::Intersectors* This, size_t cur_mask, RayK<K>** __restrict__ inputPackets, IntersectContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
  130. {
  131. size_t m_occluded = 0;
  132. for (size_t i=0; i<num; i++) {
  133. size_t bits = cur_mask & (~m_occluded);
  134. for (; bits!=0; )
  135. {
  136. const size_t rayID = bscf(bits);
  137. RayHitK<K> &ray = *inputPackets[rayID / K];
  138. const size_t k = rayID % K;
  139. PrecalculationsK pre(ray.tnear() <= ray.tfar,ray); // FIXME: might cause trouble
  140. if (IntersectorK::occluded(pre,ray,k,context,prim[i]))
  141. {
  142. m_occluded |= (size_t)1 << rayID;
  143. ray.tfar[k] = neg_inf;
  144. }
  145. }
  146. }
  147. return m_occluded;
  148. }
  149. };
  150. }
  151. }