You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
3.6 KiB
C
137 lines
3.6 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkOpenGLRenderTimerLog.h
|
||
|
|
||
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
||
|
All rights reserved.
|
||
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
||
|
|
||
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
||
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
|
PURPOSE. See the above copyright notice for more information.
|
||
|
|
||
|
=========================================================================*/
|
||
|
|
||
|
#ifndef vtkOpenGLRenderTimerLog_h
|
||
|
#define vtkOpenGLRenderTimerLog_h
|
||
|
|
||
|
#include "vtkRenderTimerLog.h"
|
||
|
#include "vtkRenderingOpenGL2Module.h" // For export macros
|
||
|
|
||
|
#include <deque> // for deque!
|
||
|
#include <queue> // for queue!
|
||
|
|
||
|
class vtkOpenGLRenderTimer;
|
||
|
|
||
|
/**
|
||
|
* @brief OpenGL2 override for vtkRenderTimerLog.
|
||
|
*/
|
||
|
class VTKRENDERINGOPENGL2_EXPORT vtkOpenGLRenderTimerLog : public vtkRenderTimerLog
|
||
|
{
|
||
|
public:
|
||
|
struct OGLEvent
|
||
|
{
|
||
|
OGLEvent()
|
||
|
: Timer(nullptr)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
std::string Name;
|
||
|
vtkOpenGLRenderTimer* Timer;
|
||
|
std::vector<OGLEvent> Events;
|
||
|
};
|
||
|
|
||
|
struct OGLFrame
|
||
|
{
|
||
|
OGLFrame()
|
||
|
: ChildCount(0)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
unsigned int ChildCount;
|
||
|
std::vector<OGLEvent> Events;
|
||
|
};
|
||
|
|
||
|
static vtkOpenGLRenderTimerLog* New();
|
||
|
vtkTypeMacro(vtkOpenGLRenderTimerLog, vtkRenderTimerLog);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
|
||
|
bool IsSupported() override;
|
||
|
|
||
|
/**
|
||
|
* Overridden to do support check before returning.
|
||
|
*/
|
||
|
bool GetLoggingEnabled() override { return this->DoLogging(); }
|
||
|
|
||
|
void MarkFrame() override;
|
||
|
|
||
|
void MarkStartEvent(const std::string& name) override;
|
||
|
void MarkEndEvent() override;
|
||
|
|
||
|
bool FrameReady() override;
|
||
|
|
||
|
Frame PopFirstReadyFrame() override;
|
||
|
|
||
|
/**
|
||
|
* Releases any resources allocated on the graphics device.
|
||
|
*/
|
||
|
void ReleaseGraphicsResources() override;
|
||
|
|
||
|
/**
|
||
|
* This implementations keeps a pool of vtkRenderTimers around, recycling them
|
||
|
* to avoid constantly allocating/freeing them. The pool is sometimes trimmed
|
||
|
* to free up memory if the number of timers in the pool is much greater the
|
||
|
* the number of timers currently used. This setting controls the minimum
|
||
|
* number of timers that will be kept. More may be kept if they are being
|
||
|
* used, but the pool will never be trimmed below this amount.
|
||
|
*
|
||
|
* Default value is 32, but can be adjusted for specific use cases.
|
||
|
*/
|
||
|
vtkSetMacro(MinTimerPoolSize, size_t);
|
||
|
vtkGetMacro(MinTimerPoolSize, size_t);
|
||
|
|
||
|
protected:
|
||
|
OGLFrame CurrentFrame;
|
||
|
// We use a deque since they are iterable. convention is push back, pop front
|
||
|
std::deque<OGLFrame> PendingFrames;
|
||
|
std::queue<Frame> ReadyFrames;
|
||
|
|
||
|
std::queue<vtkOpenGLRenderTimer*> TimerPool;
|
||
|
|
||
|
size_t MinTimerPoolSize;
|
||
|
|
||
|
vtkOpenGLRenderTimerLog();
|
||
|
~vtkOpenGLRenderTimerLog() override;
|
||
|
|
||
|
bool DoLogging();
|
||
|
|
||
|
Frame Convert(const OGLFrame& oglFrame);
|
||
|
Event Convert(const OGLEvent& oglEvent);
|
||
|
|
||
|
OGLEvent& NewEvent();
|
||
|
OGLEvent* DeepestOpenEvent();
|
||
|
OGLEvent& WalkOpenEvents(OGLEvent& event);
|
||
|
|
||
|
vtkOpenGLRenderTimer* NewTimer();
|
||
|
void ReleaseTimer(vtkOpenGLRenderTimer* timer);
|
||
|
|
||
|
void ReleaseOGLFrame(OGLFrame& frame);
|
||
|
void ReleaseOGLEvent(OGLEvent& event);
|
||
|
|
||
|
void TrimTimerPool();
|
||
|
|
||
|
void CheckPendingFrames();
|
||
|
bool IsFrameReady(OGLFrame& frame);
|
||
|
bool IsEventReady(OGLEvent& event);
|
||
|
|
||
|
void ForceCloseFrame(OGLFrame& frame);
|
||
|
void ForceCloseEvent(OGLEvent& event);
|
||
|
|
||
|
private:
|
||
|
vtkOpenGLRenderTimerLog(const vtkOpenGLRenderTimerLog&) = delete;
|
||
|
void operator=(const vtkOpenGLRenderTimerLog&) = delete;
|
||
|
};
|
||
|
|
||
|
#endif // vtkOpenGLRenderTimerLog_h
|