1 /*
2  * This file is part of the Colobot: Gold Edition source code
3  * Copyright (C) 2001-2020, Daniel Roux, EPSITEC SA & TerranovaTeam
4  * http://epsitec.ch; http://colobot.info; http://github.com/colobot
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  * See the GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see http://gnu.org/licenses
18  */
19 
20 #pragma once
21 
22 class CSystemUtils;
23 struct SystemTimeStamp;
24 
25 #include <stack>
26 
27 /**
28  * \enum PerformanceCounter
29  * \brief Type of counter testing performance
30  */
31 enum PerformanceCounter
32 {
33     PCNT_EVENT_PROCESSING,      //! < event processing (except update events)
34 
35     PCNT_UPDATE_ALL,            //! < the whole frame update process
36     PCNT_UPDATE_ENGINE,         //! < frame update in CEngine
37     PCNT_UPDATE_PARTICLE,       //! < frame update in CParticle
38     PCNT_UPDATE_GAME,           //! < frame update in CRobotMain
39     PCNT_UPDATE_CBOT,           //! < running CBot code (part of CRobotMain update)
40 
41     PCNT_RENDER_ALL,            //! < the whole rendering process
42     PCNT_RENDER_PARTICLE_WORLD, //! < rendering the particles in 3D
43     PCNT_RENDER_PARTICLE_IFACE, //! < rendering the particles in 2D interface
44     PCNT_RENDER_WATER,          //! < rendering the water
45     PCNT_RENDER_TERRAIN,        //! < rendering the terrain
46     PCNT_RENDER_OBJECTS,        //! < rendering the 3D objects
47     PCNT_RENDER_INTERFACE,      //! < rendering 2D interface
48     PCNT_RENDER_SHADOW_MAP,     //! < rendering shadow map
49 
50     PCNT_SWAP_BUFFERS,          //! < swapping buffers and vsync
51 
52     PCNT_ALL,                   //! < all counters together
53 
54     PCNT_MAX
55 };
56 
57 class CProfiler
58 {
59 public:
60     static void SetSystemUtils(CSystemUtils* systemUtils);
61 
62     static void StartPerformanceCounter(PerformanceCounter counter);
63     static void StopPerformanceCounter(PerformanceCounter counter);
64     static long long GetPerformanceCounterTime(PerformanceCounter counter);
65     static float GetPerformanceCounterFraction(PerformanceCounter counter);
66 
67 private:
68     static void ResetPerformanceCounters();
69     static void SavePerformanceCounters();
70 
71 private:
72     static CSystemUtils* m_systemUtils;
73 
74     static long long m_performanceCounters[PCNT_MAX];
75     static long long m_prevPerformanceCounters[PCNT_MAX];
76     static std::stack<SystemTimeStamp*> m_runningPerformanceCounters;
77     static std::stack<PerformanceCounter> m_runningPerformanceCountersType;
78 };
79 
80 
81