summaryrefslogtreecommitdiff
path: root/thirdparty/embree-aarch64/kernels/bvh/bvh_builder_twolevel.cpp
diff options
context:
space:
mode:
authorRĂ©mi Verschelde <remi@verschelde.fr>2021-05-21 18:30:02 +0200
committerGitHub <noreply@github.com>2021-05-21 18:30:02 +0200
commit3ee034451a9349e7de26decc662afefd7ab8c460 (patch)
treea8bec3fbb06c2eaca05a075f5ffe2cdd2d94f04a /thirdparty/embree-aarch64/kernels/bvh/bvh_builder_twolevel.cpp
parent8fa07eae145e1e37eb8708ce8c117188b58e3ecc (diff)
parent767e374dced69b45db0afb30ca2ccf0bbbeef672 (diff)
Merge pull request #48885 from JFonS/upgrade_embree
Upgrade Embree to the latest official release (3.13.0).
Diffstat (limited to 'thirdparty/embree-aarch64/kernels/bvh/bvh_builder_twolevel.cpp')
-rw-r--r--thirdparty/embree-aarch64/kernels/bvh/bvh_builder_twolevel.cpp377
1 files changed, 0 insertions, 377 deletions
diff --git a/thirdparty/embree-aarch64/kernels/bvh/bvh_builder_twolevel.cpp b/thirdparty/embree-aarch64/kernels/bvh/bvh_builder_twolevel.cpp
deleted file mode 100644
index 1a78f347ac..0000000000
--- a/thirdparty/embree-aarch64/kernels/bvh/bvh_builder_twolevel.cpp
+++ /dev/null
@@ -1,377 +0,0 @@
-// Copyright 2009-2020 Intel Corporation
-// SPDX-License-Identifier: Apache-2.0
-
-#include "bvh_builder_twolevel.h"
-#include "bvh_statistics.h"
-#include "../builders/bvh_builder_sah.h"
-#include "../common/scene_line_segments.h"
-#include "../common/scene_triangle_mesh.h"
-#include "../common/scene_quad_mesh.h"
-
-#define PROFILE 0
-
-namespace embree
-{
- namespace isa
- {
- template<int N, typename Mesh, typename Primitive>
- BVHNBuilderTwoLevel<N,Mesh,Primitive>::BVHNBuilderTwoLevel (BVH* bvh, Scene* scene, Geometry::GTypeMask gtype, bool useMortonBuilder, const size_t singleThreadThreshold)
- : bvh(bvh), scene(scene), refs(scene->device,0), prims(scene->device,0), singleThreadThreshold(singleThreadThreshold), gtype(gtype), useMortonBuilder_(useMortonBuilder) {}
-
- template<int N, typename Mesh, typename Primitive>
- BVHNBuilderTwoLevel<N,Mesh,Primitive>::~BVHNBuilderTwoLevel () {
- }
-
- // ===========================================================================
- // ===========================================================================
- // ===========================================================================
-
- template<int N, typename Mesh, typename Primitive>
- void BVHNBuilderTwoLevel<N,Mesh,Primitive>::build()
- {
- /* delete some objects */
- size_t num = scene->size();
- if (num < bvh->objects.size()) {
- parallel_for(num, bvh->objects.size(), [&] (const range<size_t>& r) {
- for (size_t i=r.begin(); i<r.end(); i++) {
- builders[i].reset();
- delete bvh->objects[i]; bvh->objects[i] = nullptr;
- }
- });
- }
-
-#if PROFILE
- while(1)
-#endif
- {
- /* reset memory allocator */
- bvh->alloc.reset();
-
- /* skip build for empty scene */
- const size_t numPrimitives = scene->getNumPrimitives(gtype,false);
-
- if (numPrimitives == 0) {
- prims.resize(0);
- bvh->set(BVH::emptyNode,empty,0);
- return;
- }
-
- /* calculate the size of the entire BVH */
- const size_t numLeafBlocks = Primitive::blocks(numPrimitives);
- const size_t node_bytes = 2*numLeafBlocks*sizeof(typename BVH::AABBNode)/N;
- const size_t leaf_bytes = size_t(1.2*numLeafBlocks*sizeof(Primitive));
- bvh->alloc.init_estimate(node_bytes+leaf_bytes);
-
- double t0 = bvh->preBuild(TOSTRING(isa) "::BVH" + toString(N) + "BuilderTwoLevel");
-
- /* resize object array if scene got larger */
- if (bvh->objects.size() < num) bvh->objects.resize(num);
- if (builders.size() < num) builders.resize(num);
- resizeRefsList ();
- nextRef.store(0);
-
- /* create acceleration structures */
- parallel_for(size_t(0), num, [&] (const range<size_t>& r)
- {
- for (size_t objectID=r.begin(); objectID<r.end(); objectID++)
- {
- Mesh* mesh = scene->getSafe<Mesh>(objectID);
-
- /* ignore meshes we do not support */
- if (mesh == nullptr || mesh->numTimeSteps != 1)
- continue;
-
- if (isSmallGeometry(mesh)) {
- setupSmallBuildRefBuilder (objectID, mesh);
- } else {
- setupLargeBuildRefBuilder (objectID, mesh);
- }
- }
- });
-
- /* parallel build of acceleration structures */
- parallel_for(size_t(0), num, [&] (const range<size_t>& r)
- {
- for (size_t objectID=r.begin(); objectID<r.end(); objectID++)
- {
- /* ignore if no triangle mesh or not enabled */
- Mesh* mesh = scene->getSafe<Mesh>(objectID);
- if (mesh == nullptr || !mesh->isEnabled() || mesh->numTimeSteps != 1)
- continue;
-
- builders[objectID]->attachBuildRefs (this);
- }
- });
-
-
-#if PROFILE
- double d0 = getSeconds();
-#endif
- /* fast path for single geometry scenes */
- if (nextRef == 1) {
- bvh->set(refs[0].node,LBBox3fa(refs[0].bounds()),numPrimitives);
- }
-
- else
- {
- /* open all large nodes */
- refs.resize(nextRef);
-
- /* this probably needs some more tuning */
- const size_t extSize = max(max((size_t)SPLIT_MIN_EXT_SPACE,refs.size()*SPLIT_MEMORY_RESERVE_SCALE),size_t((float)numPrimitives / SPLIT_MEMORY_RESERVE_FACTOR));
-
-#if !ENABLE_DIRECT_SAH_MERGE_BUILDER
-
-#if ENABLE_OPEN_SEQUENTIAL
- open_sequential(extSize);
-#endif
- /* compute PrimRefs */
- prims.resize(refs.size());
-#endif
-
-#if defined(TASKING_TBB) && defined(__AVX512ER__) && USE_TASK_ARENA // KNL
- tbb::task_arena limited(min(32,(int)TaskScheduler::threadCount()));
- limited.execute([&]
-#endif
- {
-#if ENABLE_DIRECT_SAH_MERGE_BUILDER
-
- const PrimInfo pinfo = parallel_reduce(size_t(0), refs.size(), PrimInfo(empty), [&] (const range<size_t>& r) -> PrimInfo {
-
- PrimInfo pinfo(empty);
- for (size_t i=r.begin(); i<r.end(); i++) {
- pinfo.add_center2(refs[i]);
- }
- return pinfo;
- }, [] (const PrimInfo& a, const PrimInfo& b) { return PrimInfo::merge(a,b); });
-
-#else
- const PrimInfo pinfo = parallel_reduce(size_t(0), refs.size(), PrimInfo(empty), [&] (const range<size_t>& r) -> PrimInfo {
-
- PrimInfo pinfo(empty);
- for (size_t i=r.begin(); i<r.end(); i++) {
- pinfo.add_center2(refs[i]);
- prims[i] = PrimRef(refs[i].bounds(),(size_t)refs[i].node);
- }
- return pinfo;
- }, [] (const PrimInfo& a, const PrimInfo& b) { return PrimInfo::merge(a,b); });
-#endif
-
- /* skip if all objects where empty */
- if (pinfo.size() == 0)
- bvh->set(BVH::emptyNode,empty,0);
-
- /* otherwise build toplevel hierarchy */
- else
- {
- /* settings for BVH build */
- GeneralBVHBuilder::Settings settings;
- settings.branchingFactor = N;
- settings.maxDepth = BVH::maxBuildDepthLeaf;
- settings.logBlockSize = bsr(N);
- settings.minLeafSize = 1;
- settings.maxLeafSize = 1;
- settings.travCost = 1.0f;
- settings.intCost = 1.0f;
- settings.singleThreadThreshold = singleThreadThreshold;
-
-#if ENABLE_DIRECT_SAH_MERGE_BUILDER
-
- refs.resize(extSize);
-
- NodeRef root = BVHBuilderBinnedOpenMergeSAH::build<NodeRef,BuildRef>(
- typename BVH::CreateAlloc(bvh),
- typename BVH::AABBNode::Create2(),
- typename BVH::AABBNode::Set2(),
-
- [&] (const BuildRef* refs, const range<size_t>& range, const FastAllocator::CachedAllocator& alloc) -> NodeRef {
- assert(range.size() == 1);
- return (NodeRef) refs[range.begin()].node;
- },
- [&] (BuildRef &bref, BuildRef *refs) -> size_t {
- return openBuildRef(bref,refs);
- },
- [&] (size_t dn) { bvh->scene->progressMonitor(0); },
- refs.data(),extSize,pinfo,settings);
-#else
- NodeRef root = BVHBuilderBinnedSAH::build<NodeRef>(
- typename BVH::CreateAlloc(bvh),
- typename BVH::AABBNode::Create2(),
- typename BVH::AABBNode::Set2(),
-
- [&] (const PrimRef* prims, const range<size_t>& range, const FastAllocator::CachedAllocator& alloc) -> NodeRef {
- assert(range.size() == 1);
- return (NodeRef) prims[range.begin()].ID();
- },
- [&] (size_t dn) { bvh->scene->progressMonitor(0); },
- prims.data(),pinfo,settings);
-#endif
-
-
- bvh->set(root,LBBox3fa(pinfo.geomBounds),numPrimitives);
- }
- }
-#if defined(TASKING_TBB) && defined(__AVX512ER__) && USE_TASK_ARENA // KNL
- );
-#endif
-
- }
-
- bvh->alloc.cleanup();
- bvh->postBuild(t0);
-#if PROFILE
- double d1 = getSeconds();
- std::cout << "TOP_LEVEL OPENING/REBUILD TIME " << 1000.0*(d1-d0) << " ms" << std::endl;
-#endif
- }
-
- }
-
- template<int N, typename Mesh, typename Primitive>
- void BVHNBuilderTwoLevel<N,Mesh,Primitive>::deleteGeometry(size_t geomID)
- {
- if (geomID >= bvh->objects.size()) return;
- if (builders[geomID]) builders[geomID].reset();
- delete bvh->objects [geomID]; bvh->objects [geomID] = nullptr;
- }
-
- template<int N, typename Mesh, typename Primitive>
- void BVHNBuilderTwoLevel<N,Mesh,Primitive>::clear()
- {
- for (size_t i=0; i<bvh->objects.size(); i++)
- if (bvh->objects[i]) bvh->objects[i]->clear();
-
- for (size_t i=0; i<builders.size(); i++)
- if (builders[i]) builders[i].reset();
-
- refs.clear();
- }
-
- template<int N, typename Mesh, typename Primitive>
- void BVHNBuilderTwoLevel<N,Mesh,Primitive>::open_sequential(const size_t extSize)
- {
- if (refs.size() == 0)
- return;
-
- refs.reserve(extSize);
-
-#if 1
- for (size_t i=0;i<refs.size();i++)
- {
- NodeRef ref = refs[i].node;
- if (ref.isAABBNode())
- BVH::prefetch(ref);
- }
-#endif
-
- std::make_heap(refs.begin(),refs.end());
- while (refs.size()+N-1 <= extSize)
- {
- std::pop_heap (refs.begin(),refs.end());
- NodeRef ref = refs.back().node;
- if (ref.isLeaf()) break;
- refs.pop_back();
-
- AABBNode* node = ref.getAABBNode();
- for (size_t i=0; i<N; i++) {
- if (node->child(i) == BVH::emptyNode) continue;
- refs.push_back(BuildRef(node->bounds(i),node->child(i)));
-
-#if 1
- NodeRef ref_pre = node->child(i);
- if (ref_pre.isAABBNode())
- ref_pre.prefetch();
-#endif
- std::push_heap (refs.begin(),refs.end());
- }
- }
- }
-
- template<int N, typename Mesh, typename Primitive>
- void BVHNBuilderTwoLevel<N,Mesh,Primitive>::setupSmallBuildRefBuilder (size_t objectID, Mesh const * const /*mesh*/)
- {
- if (builders[objectID] == nullptr || // new mesh
- dynamic_cast<RefBuilderSmall*>(builders[objectID].get()) == nullptr) // size change resulted in large->small change
- {
- builders[objectID].reset (new RefBuilderSmall(objectID));
- }
- }
-
- template<int N, typename Mesh, typename Primitive>
- void BVHNBuilderTwoLevel<N,Mesh,Primitive>::setupLargeBuildRefBuilder (size_t objectID, Mesh const * const mesh)
- {
- if (bvh->objects[objectID] == nullptr || // new mesh
- builders[objectID]->meshQualityChanged (mesh->quality) || // changed build quality
- dynamic_cast<RefBuilderLarge*>(builders[objectID].get()) == nullptr) // size change resulted in small->large change
- {
- Builder* builder = nullptr;
- delete bvh->objects[objectID];
- createMeshAccel(objectID, builder);
- builders[objectID].reset (new RefBuilderLarge(objectID, builder, mesh->quality));
- }
- }
-
-#if defined(EMBREE_GEOMETRY_TRIANGLE)
- Builder* BVH4BuilderTwoLevelTriangle4MeshSAH (void* bvh, Scene* scene, bool useMortonBuilder) {
- return new BVHNBuilderTwoLevel<4,TriangleMesh,Triangle4>((BVH4*)bvh,scene,TriangleMesh::geom_type,useMortonBuilder);
- }
- Builder* BVH4BuilderTwoLevelTriangle4vMeshSAH (void* bvh, Scene* scene, bool useMortonBuilder) {
- return new BVHNBuilderTwoLevel<4,TriangleMesh,Triangle4v>((BVH4*)bvh,scene,TriangleMesh::geom_type,useMortonBuilder);
- }
- Builder* BVH4BuilderTwoLevelTriangle4iMeshSAH (void* bvh, Scene* scene, bool useMortonBuilder) {
- return new BVHNBuilderTwoLevel<4,TriangleMesh,Triangle4i>((BVH4*)bvh,scene,TriangleMesh::geom_type,useMortonBuilder);
- }
-#endif
-
-#if defined(EMBREE_GEOMETRY_QUAD)
- Builder* BVH4BuilderTwoLevelQuadMeshSAH (void* bvh, Scene* scene, bool useMortonBuilder) {
- return new BVHNBuilderTwoLevel<4,QuadMesh,Quad4v>((BVH4*)bvh,scene,QuadMesh::geom_type,useMortonBuilder);
- }
-#endif
-
-#if defined(EMBREE_GEOMETRY_USER)
- Builder* BVH4BuilderTwoLevelVirtualSAH (void* bvh, Scene* scene, bool useMortonBuilder) {
- return new BVHNBuilderTwoLevel<4,UserGeometry,Object>((BVH4*)bvh,scene,UserGeometry::geom_type,useMortonBuilder);
- }
-#endif
-
-#if defined(EMBREE_GEOMETRY_INSTANCE)
- Builder* BVH4BuilderTwoLevelInstanceSAH (void* bvh, Scene* scene, Geometry::GTypeMask gtype, bool useMortonBuilder) {
- return new BVHNBuilderTwoLevel<4,Instance,InstancePrimitive>((BVH4*)bvh,scene,gtype,useMortonBuilder);
- }
-#endif
-
-#if defined(__AVX__)
-#if defined(EMBREE_GEOMETRY_TRIANGLE)
- Builder* BVH8BuilderTwoLevelTriangle4MeshSAH (void* bvh, Scene* scene, bool useMortonBuilder) {
- return new BVHNBuilderTwoLevel<8,TriangleMesh,Triangle4>((BVH8*)bvh,scene,TriangleMesh::geom_type,useMortonBuilder);
- }
- Builder* BVH8BuilderTwoLevelTriangle4vMeshSAH (void* bvh, Scene* scene, bool useMortonBuilder) {
- return new BVHNBuilderTwoLevel<8,TriangleMesh,Triangle4v>((BVH8*)bvh,scene,TriangleMesh::geom_type,useMortonBuilder);
- }
- Builder* BVH8BuilderTwoLevelTriangle4iMeshSAH (void* bvh, Scene* scene, bool useMortonBuilder) {
- return new BVHNBuilderTwoLevel<8,TriangleMesh,Triangle4i>((BVH8*)bvh,scene,TriangleMesh::geom_type,useMortonBuilder);
- }
-#endif
-
-#if defined(EMBREE_GEOMETRY_QUAD)
- Builder* BVH8BuilderTwoLevelQuadMeshSAH (void* bvh, Scene* scene, bool useMortonBuilder) {
- return new BVHNBuilderTwoLevel<8,QuadMesh,Quad4v>((BVH8*)bvh,scene,QuadMesh::geom_type,useMortonBuilder);
- }
-#endif
-
-#if defined(EMBREE_GEOMETRY_USER)
- Builder* BVH8BuilderTwoLevelVirtualSAH (void* bvh, Scene* scene, bool useMortonBuilder) {
- return new BVHNBuilderTwoLevel<8,UserGeometry,Object>((BVH8*)bvh,scene,UserGeometry::geom_type,useMortonBuilder);
- }
-#endif
-
-#if defined(EMBREE_GEOMETRY_INSTANCE)
- Builder* BVH8BuilderTwoLevelInstanceSAH (void* bvh, Scene* scene, Geometry::GTypeMask gtype, bool useMortonBuilder) {
- return new BVHNBuilderTwoLevel<8,Instance,InstancePrimitive>((BVH8*)bvh,scene,gtype,useMortonBuilder);
- }
-#endif
-
-#endif
- }
-}