// Copyright 2009-2021 Intel Corporation // SPDX-License-Identifier: Apache-2.0 #pragma once #include "default.h" /* Macros to gather statistics */ #ifdef EMBREE_STAT_COUNTERS # define STAT(x) x # define STAT3(s,x,y,z) \ STAT(Stat::get().code .s+=x); \ STAT(Stat::get().active.s+=y); \ STAT(Stat::get().all .s+=z); # define STAT_USER(i,x) Stat::get().user[i]+=x; #else # define STAT(x) # define STAT3(s,x,y,z) # define STAT_USER(i,x) #endif namespace embree { /*! Gathers ray tracing statistics. We count 1) how often a code * location is reached, 2) how many SIMD lanes are active, 3) how * many SIMD lanes reach the code location */ class Stat { public: static const size_t SIZE_HISTOGRAM = 64+1; /*! constructs stat counter class */ Stat (); /*! destructs stat counter class */ ~Stat (); class Counters { public: Counters () { clear(); } void clear() { all.clear(); active.clear(); code.clear(); for (auto& u : user) u.store(0); } public: /* per packet and per ray stastics */ struct Data { void clear () { normal.clear(); shadow.clear(); point_query.clear(); } /* normal and shadow ray statistics */ struct { void clear() { travs.store(0); trav_nodes.store(0); trav_leaves.store(0); trav_prims.store(0); trav_prim_hits.store(0); for (auto& v : trav_hit_boxes) v.store(0); trav_stack_pop.store(0); trav_stack_nodes.store(0); trav_xfm_nodes.store(0); } public: std::atomic<size_t> travs; std::atomic<size_t> trav_nodes; std::atomic<size_t> trav_leaves; std::atomic<size_t> trav_prims; std::atomic<size_t> trav_prim_hits; std::atomic<size_t> trav_hit_boxes[SIZE_HISTOGRAM+1]; std::atomic<size_t> trav_stack_pop; std::atomic<size_t> trav_stack_nodes; std::atomic<size_t> trav_xfm_nodes; } normal, shadow, point_query; } all, active, code; std::atomic<size_t> user[10]; }; public: static __forceinline Counters& get() { return instance.cntrs; } static void clear() { instance.cntrs.clear(); } static void print(embree_ostream cout); private: Counters cntrs; private: static Stat instance; }; }