| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  | // Copyright 2009-2021 Intel Corporation
 | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  | // 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; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } |