Path: blob/master/thirdparty/embree/kernels/bvh/bvh_statistics.cpp
9912 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#include "bvh_statistics.h"4#include "../../common/algorithms/parallel_reduce.h"56namespace embree7{8template<int N>9BVHNStatistics<N>::BVHNStatistics (BVH* bvh) : bvh(bvh)10{11double A = max(0.0f,bvh->getLinearBounds().expectedHalfArea());12stat = statistics(bvh->root,A,BBox1f(0.0f,1.0f));13}1415template<int N>16std::string BVHNStatistics<N>::str()17{18std::ostringstream stream;19stream.setf(std::ios::fixed, std::ios::floatfield);20stream << " primitives = " << bvh->numPrimitives << ", vertices = " << bvh->numVertices << ", depth = " << stat.depth << std::endl;21size_t totalBytes = stat.bytes(bvh);22double totalSAH = stat.sah(bvh);23stream << " total : sah = " << std::setw(7) << std::setprecision(3) << totalSAH << " (100.00%), ";24stream << "#bytes = " << std::setw(7) << std::setprecision(2) << totalBytes/1E6 << " MB (100.00%), ";25stream << "#nodes = " << std::setw(7) << stat.size() << " (" << std::setw(6) << std::setprecision(2) << 100.0*stat.fillRate(bvh) << "% filled), ";26stream << "#bytes/prim = " << std::setw(6) << std::setprecision(2) << double(totalBytes)/double(bvh->numPrimitives) << std::endl;27if (stat.statAABBNodes.numNodes ) stream << " getAABBNodes : " << stat.statAABBNodes.toString(bvh,totalSAH,totalBytes) << std::endl;28if (stat.statOBBNodes.numNodes ) stream << " ungetAABBNodes : " << stat.statOBBNodes.toString(bvh,totalSAH,totalBytes) << std::endl;29if (stat.statAABBNodesMB.numNodes ) stream << " getAABBNodesMB : " << stat.statAABBNodesMB.toString(bvh,totalSAH,totalBytes) << std::endl;30if (stat.statAABBNodesMB4D.numNodes) stream << " getAABBNodesMB4D : " << stat.statAABBNodesMB4D.toString(bvh,totalSAH,totalBytes) << std::endl;31if (stat.statOBBNodesMB.numNodes) stream << " ungetAABBNodesMB : " << stat.statOBBNodesMB.toString(bvh,totalSAH,totalBytes) << std::endl;32if (stat.statQuantizedNodes.numNodes ) stream << " quantizedNodes : " << stat.statQuantizedNodes.toString(bvh,totalSAH,totalBytes) << std::endl;33if (true) stream << " leaves : " << stat.statLeaf.toString(bvh,totalSAH,totalBytes) << std::endl;34if (true) stream << " histogram : " << stat.statLeaf.histToString() << std::endl;35return stream.str();36}3738template<int N>39typename BVHNStatistics<N>::Statistics BVHNStatistics<N>::statistics(NodeRef node, const double A, const BBox1f t0t1)40{41Statistics s;42assert(t0t1.size() > 0.0f);43double dt = max(0.0f,t0t1.size());44if (node.isAABBNode())45{46AABBNode* n = node.getAABBNode();47s = s + parallel_reduce(0,N,Statistics(),[&] ( const int i ) {48if (n->child(i) == BVH::emptyNode) return Statistics();49const double Ai = max(0.0f,halfArea(n->extend(i)));50Statistics s = statistics(n->child(i),Ai,t0t1);51s.statAABBNodes.numChildren++;52return s;53}, Statistics::add);54s.statAABBNodes.numNodes++;55s.statAABBNodes.nodeSAH += dt*A;56s.depth++;57}58else if (node.isOBBNode())59{60OBBNode* n = node.ungetAABBNode();61s = s + parallel_reduce(0,N,Statistics(),[&] ( const int i ) {62if (n->child(i) == BVH::emptyNode) return Statistics();63const double Ai = max(0.0f,halfArea(n->extent(i)));64Statistics s = statistics(n->child(i),Ai,t0t1);65s.statOBBNodes.numChildren++;66return s;67}, Statistics::add);68s.statOBBNodes.numNodes++;69s.statOBBNodes.nodeSAH += dt*A;70s.depth++;71}72else if (node.isAABBNodeMB())73{74AABBNodeMB* n = node.getAABBNodeMB();75s = s + parallel_reduce(0,N,Statistics(),[&] ( const int i ) {76if (n->child(i) == BVH::emptyNode) return Statistics();77const double Ai = max(0.0f,n->expectedHalfArea(i,t0t1));78Statistics s = statistics(n->child(i),Ai,t0t1);79s.statAABBNodesMB.numChildren++;80return s;81}, Statistics::add);82s.statAABBNodesMB.numNodes++;83s.statAABBNodesMB.nodeSAH += dt*A;84s.depth++;85}86else if (node.isAABBNodeMB4D())87{88AABBNodeMB4D* n = node.getAABBNodeMB4D();89s = s + parallel_reduce(0,N,Statistics(),[&] ( const int i ) {90if (n->child(i) == BVH::emptyNode) return Statistics();91const BBox1f t0t1i = intersect(t0t1,n->timeRange(i));92assert(!t0t1i.empty());93const double Ai = n->AABBNodeMB::expectedHalfArea(i,t0t1i);94Statistics s = statistics(n->child(i),Ai,t0t1i);95s.statAABBNodesMB4D.numChildren++;96return s;97}, Statistics::add);98s.statAABBNodesMB4D.numNodes++;99s.statAABBNodesMB4D.nodeSAH += dt*A;100s.depth++;101}102else if (node.isOBBNodeMB())103{104OBBNodeMB* n = node.ungetAABBNodeMB();105s = s + parallel_reduce(0,N,Statistics(),[&] ( const int i ) {106if (n->child(i) == BVH::emptyNode) return Statistics();107const double Ai = max(0.0f,halfArea(n->extent0(i)));108Statistics s = statistics(n->child(i),Ai,t0t1);109s.statOBBNodesMB.numChildren++;110return s;111}, Statistics::add);112s.statOBBNodesMB.numNodes++;113s.statOBBNodesMB.nodeSAH += dt*A;114s.depth++;115}116else if (node.isQuantizedNode())117{118QuantizedNode* n = node.quantizedNode();119s = s + parallel_reduce(0,N,Statistics(),[&] ( const int i ) {120if (n->child(i) == BVH::emptyNode) return Statistics();121const double Ai = max(0.0f,halfArea(n->extent(i)));122Statistics s = statistics(n->child(i),Ai,t0t1);123s.statQuantizedNodes.numChildren++;124return s;125}, Statistics::add);126s.statQuantizedNodes.numNodes++;127s.statQuantizedNodes.nodeSAH += dt*A;128s.depth++;129}130else if (node.isLeaf())131{132size_t num; const char* tri = node.leaf(num);133if (num)134{135for (size_t i=0; i<num; i++)136{137const size_t bytes = bvh->primTy->getBytes(tri);138s.statLeaf.numPrimsActive += bvh->primTy->sizeActive(tri);139s.statLeaf.numPrimsTotal += bvh->primTy->sizeTotal(tri);140s.statLeaf.numBytes += bytes;141tri+=bytes;142}143s.statLeaf.numLeaves++;144s.statLeaf.numPrimBlocks += num;145s.statLeaf.leafSAH += dt*A*num;146if (num-1 < Statistics::LeafStat::NHIST) {147s.statLeaf.numPrimBlocksHistogram[num-1]++;148}149}150}151else {152abort(); //throw std::runtime_error("not supported node type in bvh_statistics");153}154return s;155}156157#if defined(__AVX__)158template class BVHNStatistics<8>;159#endif160161#if !defined(__AVX__) || (!defined(EMBREE_TARGET_SSE2) && !defined(EMBREE_TARGET_SSE42)) || defined(__aarch64__)162template class BVHNStatistics<4>;163#endif164}165166167