0030144: Visualization, TKOpenGl - extend OpenGl_FrameStats with frame timers
[occt.git] / src / Graphic3d / Graphic3d_FrameStatsData.cxx
1 // Copyright (c) 2018 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #include <Graphic3d_FrameStatsData.hxx>
15
16 // =======================================================================
17 // function : Graphic3d_FrameStatsData
18 // purpose  :
19 // =======================================================================
20 Graphic3d_FrameStatsData::Graphic3d_FrameStatsData()
21 : myFps (-1.0),
22   myFpsCpu (-1.0)
23 {
24   myCounters .resize (Graphic3d_FrameStatsCounter_NB, 0);
25   myTimers   .resize (Graphic3d_FrameStatsTimer_NB, 0.0);
26   myTimersMin.resize (Graphic3d_FrameStatsTimer_NB, RealLast());
27   myTimersMax.resize (Graphic3d_FrameStatsTimer_NB, 0.0);
28   Reset();
29 }
30
31 // =======================================================================
32 // function : operator=
33 // purpose  :
34 // =======================================================================
35 Graphic3d_FrameStatsData& Graphic3d_FrameStatsData::operator= (const Graphic3d_FrameStatsData& theOther)
36 {
37   myFps         = theOther.myFps;
38   myFpsCpu      = theOther.myFpsCpu;
39   myCounters    = theOther.myCounters;
40   myTimers      = theOther.myTimers;
41   myTimersMin   = theOther.myTimersMin;
42   myTimersMax   = theOther.myTimersMax;
43   return *this;
44 }
45
46 // =======================================================================
47 // function : Reset
48 // purpose  :
49 // =======================================================================
50 void Graphic3d_FrameStatsData::Reset()
51 {
52   myFps    = -1.0;
53   myFpsCpu = -1.0;
54   myCounters .assign (myCounters.size(),  0);
55   myTimers   .assign (myTimers.size(),    0.0);
56   myTimersMin.assign (myTimersMin.size(), RealLast());
57   myTimersMax.assign (myTimersMax.size(), 0.0);
58 }
59
60 // =======================================================================
61 // function : FillMax
62 // purpose  :
63 // =======================================================================
64 void Graphic3d_FrameStatsData::FillMax (const Graphic3d_FrameStatsData& theOther)
65 {
66   myFps    = Max (myFps,    theOther.myFps);
67   myFpsCpu = Max (myFpsCpu, theOther.myFpsCpu);
68   for (size_t aCounterIter = 0; aCounterIter < myCounters.size(); ++aCounterIter)
69   {
70     myCounters[aCounterIter] = myCounters[aCounterIter] > theOther.myCounters[aCounterIter] ? myCounters[aCounterIter] : theOther.myCounters[aCounterIter];
71   }
72   for (size_t aTimerIter = 0; aTimerIter < myTimers.size(); ++aTimerIter)
73   {
74     myTimersMax[aTimerIter] = Max (myTimersMax[aTimerIter], theOther.myTimersMax[aTimerIter]);
75     myTimersMin[aTimerIter] = Min (myTimersMin[aTimerIter], theOther.myTimersMin[aTimerIter]);
76     myTimers   [aTimerIter] = myTimersMax[aTimerIter];
77   }
78 }
79
80 // =======================================================================
81 // function : Graphic3d_FrameStatsDataTmp
82 // purpose  :
83 // =======================================================================
84 Graphic3d_FrameStatsDataTmp::Graphic3d_FrameStatsDataTmp()
85 {
86   myOsdTimers .resize (Graphic3d_FrameStatsTimer_NB, OSD_Timer (true));
87   myTimersPrev.resize (Graphic3d_FrameStatsTimer_NB, 0.0);
88 }
89
90 // =======================================================================
91 // function : FlushTimers
92 // purpose  :
93 // =======================================================================
94 void Graphic3d_FrameStatsDataTmp::FlushTimers (Standard_Size theNbFrames, bool theIsFinal)
95 {
96   for (size_t aTimerIter = 0; aTimerIter < myTimers.size(); ++aTimerIter)
97   {
98     const Standard_Real aFrameTime = myTimers[aTimerIter] - myTimersPrev[aTimerIter];
99     myTimersMax [aTimerIter] = Max (myTimersMax[aTimerIter], aFrameTime);
100     myTimersMin [aTimerIter] = Min (myTimersMin[aTimerIter], aFrameTime);
101     myTimersPrev[aTimerIter] = myTimers[aTimerIter];
102   }
103
104   if (theIsFinal)
105   {
106     const Standard_Real aNbFrames = (Standard_Real )theNbFrames;
107     for (size_t aTimerIter = 0; aTimerIter < myTimers.size(); ++aTimerIter)
108     {
109       myTimers[aTimerIter] /= aNbFrames;
110     }
111   }
112 }
113
114 // =======================================================================
115 // function : Reset
116 // purpose  :
117 // =======================================================================
118 void Graphic3d_FrameStatsDataTmp::Reset()
119 {
120   Graphic3d_FrameStatsData::Reset();
121   myTimersPrev.assign (myTimersPrev.size(), 0.0);
122   for (size_t aTimerIter = 0; aTimerIter < myOsdTimers.size(); ++aTimerIter)
123   {
124     myOsdTimers[aTimerIter].Reset();
125   }
126 }