diff options
Diffstat (limited to 'thirdparty/embree/kernels/builders/heuristic_binning_array_aligned.h')
-rw-r--r-- | thirdparty/embree/kernels/builders/heuristic_binning_array_aligned.h | 79 |
1 files changed, 64 insertions, 15 deletions
diff --git a/thirdparty/embree/kernels/builders/heuristic_binning_array_aligned.h b/thirdparty/embree/kernels/builders/heuristic_binning_array_aligned.h index ab3b97efb9..51dda9b49d 100644 --- a/thirdparty/embree/kernels/builders/heuristic_binning_array_aligned.h +++ b/thirdparty/embree/kernels/builders/heuristic_binning_array_aligned.h @@ -22,6 +22,9 @@ namespace embree __forceinline PrimInfoRange (size_t begin, size_t end, const CentGeomBBox3fa& centGeomBounds) : CentGeomBBox3fa(centGeomBounds), range<size_t>(begin,end) {} + + __forceinline PrimInfoRange (range<size_t> r, const CentGeomBBox3fa& centGeomBounds) + : CentGeomBBox3fa(centGeomBounds), range<size_t>(r) {} __forceinline float leafSAH() const { return expectedApproxHalfArea(geomBounds)*float(size()); @@ -30,7 +33,45 @@ namespace embree __forceinline float leafSAH(size_t block_shift) const { return expectedApproxHalfArea(geomBounds)*float((size()+(size_t(1)<<block_shift)-1) >> block_shift); } + + __forceinline range<size_t> get_range() const { + return range<size_t>(begin(),end()); + } + + template<typename PrimRef> + __forceinline void add_primref(const PrimRef& prim) + { + CentGeomBBox3fa::extend_primref(prim); + _end++; + } }; + + inline void performFallbackSplit(PrimRef* const prims, const PrimInfoRange& pinfo, PrimInfoRange& linfo, PrimInfoRange& rinfo) + { + const size_t begin = pinfo.begin(); + const size_t end = pinfo.end(); + const size_t center = (begin + end)/2; + + CentGeomBBox3fa left(empty); + for (size_t i=begin; i<center; i++) + left.extend_center2(prims[i]); + new (&linfo) PrimInfoRange(begin,center,left); + + CentGeomBBox3fa right(empty); + for (size_t i=center; i<end; i++) + right.extend_center2(prims[i]); + new (&rinfo) PrimInfoRange(center,end,right); + } + + template<typename Type, typename getTypeFunc> + inline void performTypeSplit(const getTypeFunc& getType, Type type, PrimRef* const prims, range<size_t> range, PrimInfoRange& linfo, PrimInfoRange& rinfo) + { + CentGeomBBox3fa local_left(empty), local_right(empty); + auto isLeft = [&] (const PrimRef& ref) { return type == getType(ref.geomID()); }; + const size_t center = serial_partitioning(prims,range.begin(),range.end(),local_left,local_right,isLeft,CentGeomBBox3fa::extend_ref); + linfo = PrimInfoRange(make_range(range.begin(),center ),local_left); + rinfo = PrimInfoRange(make_range(center ,range.end()),local_right); + } /*! Performs standard object binning */ template<typename PrimRef, size_t BINS> @@ -69,6 +110,24 @@ namespace embree return binner.best(mapping,logBlockSize); } + /*! finds the best split */ + __noinline const Split find_block_size(const PrimInfoRange& pinfo, const size_t blockSize) + { + if (likely(pinfo.size() < PARALLEL_THRESHOLD)) + return find_block_size_template<false>(pinfo,blockSize); + else + return find_block_size_template<true>(pinfo,blockSize); + } + + template<bool parallel> + __forceinline const Split find_block_size_template(const PrimInfoRange& pinfo, const size_t blockSize) + { + Binner binner(empty); + const BinMapping<BINS> mapping(pinfo); + bin_serial_or_parallel<parallel>(binner,prims,pinfo.begin(),pinfo.end(),PARALLEL_FIND_BLOCK_SIZE,mapping); + return binner.best_block_size(mapping,blockSize); + } + /*! array partitioning */ __forceinline void split(const Split& split, const PrimInfoRange& pinfo, PrimInfoRange& linfo, PrimInfoRange& rinfo) { @@ -121,21 +180,8 @@ namespace embree std::sort(&prims[pinfo.begin()],&prims[pinfo.end()]); } - void splitFallback(const PrimInfoRange& pinfo, PrimInfoRange& linfo, PrimInfoRange& rinfo) - { - const size_t begin = pinfo.begin(); - const size_t end = pinfo.end(); - const size_t center = (begin + end)/2; - - CentGeomBBox3fa left(empty); - for (size_t i=begin; i<center; i++) - left.extend_center2(prims[i]); - new (&linfo) PrimInfoRange(begin,center,left); - - CentGeomBBox3fa right(empty); - for (size_t i=center; i<end; i++) - right.extend_center2(prims[i]); - new (&rinfo) PrimInfoRange(center,end,right); + void splitFallback(const PrimInfoRange& pinfo, PrimInfoRange& linfo, PrimInfoRange& rinfo) { + performFallbackSplit(prims,pinfo,linfo,rinfo); } void splitByGeometry(const range<size_t>& range, PrimInfoRange& linfo, PrimInfoRange& rinfo) @@ -156,6 +202,8 @@ namespace embree PrimRef* const prims; }; +#if !defined(RTHWIF_STANDALONE) + /*! Performs standard object binning */ template<typename PrimRefMB, size_t BINS> struct HeuristicArrayBinningMB @@ -196,5 +244,6 @@ namespace embree new (&rset) SetMB(right,set.prims,range<size_t>(center,end ),set.time_range); } }; +#endif } } |