VTK  9.1.20211115
vtkRenderTimerLog.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkRenderTimerLog.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
15 
49 #ifndef vtkRenderTimerLog_h
50 #define vtkRenderTimerLog_h
51 
52 #include "vtkObject.h"
53 #include "vtkRenderingCoreModule.h" // For export macro
54 #include "vtkType.h" // For vtkTypeUint64, etc
55 #include <sstream> // for std::ostringstream
56 #include <string> // for std::string
57 #include <vector> // for std::vector
58 
63 #define VTK_SCOPED_RENDER_EVENT(eventName, timer) VTK_SCOPED_RENDER_EVENT2(eventName, timer, _event)
64 
70 #define VTK_SCOPED_RENDER_EVENT2(eventName, timer, identifier) \
71  vtkRenderTimerLog::ScopedEventLogger identifier; \
72  do \
73  { \
74  std::ostringstream _eventNameStream; \
75  _eventNameStream << eventName; \
76  identifier = timer->StartScopedEvent(_eventNameStream.str()); \
77  (void)identifier; /* Prevent set-but-not-used var warnings */ \
78  } while (false) /* Do-while loop prevents duplicate semicolon warnings */
79 
80 class VTKRENDERINGCORE_EXPORT vtkRenderTimerLog : public vtkObject
81 {
82 public:
83  struct Frame;
84 
86  struct VTKRENDERINGCORE_EXPORT Event
87  {
90 
92  vtkTypeUInt64 StartTime;
93  vtkTypeUInt64 EndTime;
97  float ElapsedTimeSeconds() const { return this->ElapsedTimeNanoseconds() * 1e-9f; }
98  float ElapsedTimeMilliseconds() const { return this->ElapsedTimeNanoseconds() * 1e-6f; }
99  vtkTypeUInt64 ElapsedTimeNanoseconds() const { return this->EndTime - this->StartTime; }
100 
102  std::vector<Event> Events;
103 
109  void Print(std::ostream& os, float threshMs = 0.f, vtkIndent indent = vtkIndent())
110  {
111  this->Print(os, 0.f, threshMs, indent);
112  }
113 
115 
116  protected:
117  void Print(std::ostream& os, float parentTime, float threshMs, vtkIndent indent);
118  };
119 
121  struct VTKRENDERINGCORE_EXPORT Frame
122  {
123  std::vector<Event> Events;
124 
129  void Print(std::ostream& os, float threshMs = 0.f);
130  };
131 
137  struct VTKRENDERINGCORE_EXPORT ScopedEventLogger
138  {
140  : Log(nullptr)
141  {
142  }
145  ~ScopedEventLogger() { this->Stop(); }
146  void Stop();
147  friend class vtkRenderTimerLog;
148 
149  protected:
151  : Log(log)
152  {
153  }
154 
155  private:
156  void operator=(const ScopedEventLogger&) = delete;
157  ScopedEventLogger(const ScopedEventLogger& other) = delete;
158  vtkRenderTimerLog* Log;
159  };
160 
162  vtkTypeMacro(vtkRenderTimerLog, vtkObject);
163  void PrintSelf(ostream& os, vtkIndent indent) override;
164 
169  virtual bool IsSupported();
170 
175  virtual void MarkFrame();
176 
181 
185  virtual void MarkStartEvent(const std::string& name);
186  virtual void MarkEndEvent();
192  virtual bool FrameReady();
193 
199 
201  vtkSetMacro(LoggingEnabled, bool);
202  vtkGetMacro(LoggingEnabled, bool);
203  vtkBooleanMacro(LoggingEnabled, bool);
211  vtkSetMacro(FrameLimit, unsigned int);
212  vtkGetMacro(FrameLimit, unsigned int);
218  virtual void ReleaseGraphicsResources();
219 
220 protected:
222  ~vtkRenderTimerLog() override;
223 
225  unsigned int FrameLimit;
226 
227 private:
228  vtkRenderTimerLog(const vtkRenderTimerLog&) = delete;
229  void operator=(const vtkRenderTimerLog&) = delete;
230 };
231 
232 #endif // vtkRenderTimerLog_h
a simple class to control print indentation
Definition: vtkIndent.h:113
void Print(ostream &os)
Print an object to an ostream.
abstract base class for most VTK objects
Definition: vtkObject.h:82
Asynchronously measures GPU execution times for a series of events.
virtual void MarkStartEvent(const std::string &name)
Mark the beginning or end of an event.
virtual bool IsSupported()
Returns true if stream timings are implemented for the current graphics backend.
static vtkRenderTimerLog * New()
virtual void MarkEndEvent()
Mark the beginning or end of an event.
virtual void MarkFrame()
Call to mark the start of a new frame, or the end of an old one.
ScopedEventLogger StartScopedEvent(const std::string &name)
Create a RAII scoped event.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
virtual void ReleaseGraphicsResources()
Releases any resources allocated on the graphics device.
~vtkRenderTimerLog() override
unsigned int FrameLimit
virtual Frame PopFirstReadyFrame()
Retrieve the first available frame's timing info.
virtual bool FrameReady()
Returns true if there are any frames ready with complete timing info.
@ name
Definition: vtkX3D.h:225
@ string
Definition: vtkX3D.h:496
Container for a single timed event.
vtkTypeUInt64 EndTime
Times are in nanoseconds.
void Print(std::ostream &os, float parentTime, float threshMs, vtkIndent indent)
std::vector< Event > Events
Child events that occurred while this event was running.
float ElapsedTimeMilliseconds() const
void Print(std::ostream &os, float threshMs=0.f, vtkIndent indent=vtkIndent())
Print details of the event to a stream.
vtkTypeUInt64 StartTime
Times are in nanoseconds.
vtkTypeUInt64 ElapsedTimeNanoseconds() const
std::string Name
Event name.
float ElapsedTimeSeconds() const
Convenience methods to compute times.
Container for a frame's events.
std::vector< Event > Events
void Print(std::ostream &os, float threshMs=0.f)
Print details of all events in this frame to a stream.
RAII struct for logging events.
ScopedEventLogger(vtkRenderTimerLog *log)
ScopedEventLogger(ScopedEventLogger &&other) noexcept
ScopedEventLogger & operator=(ScopedEventLogger &&other) noexcept