Files
FlaxEngine/Source/Engine/GraphicsDevice/OpenGL/GPUTimerQueryOGL.cpp
2020-12-07 23:40:54 +01:00

99 lines
1.7 KiB
C++

// Copyright (c) 2012-2020 Wojciech Figat. All rights reserved.
#if GRAPHICS_API_OPENGL
#include "GPUTimerQueryOGL.h"
#include "RenderToolsOGL.h"
GPUTimerQueryOGL::GPUTimerQueryOGL(GPUDeviceOGL* device)
: GPUResourceOGL<GPUTimerQuery>(device, String::Empty)
{
GLuint queries[2];
glGenQueries(2, queries);
VALIDATE_OPENGL_RESULT();
_startQuery = queries[0];
_endQuery = queries[1];
// Set non-zero mem usage (fake)
_memoryUsage = sizeof(queries);
}
GPUTimerQueryOGL::~GPUTimerQueryOGL()
{
ReleaseGPU();
}
void GPUTimerQueryOGL::ReleaseGPU()
{
if (_memoryUsage == 0)
return;
GLuint queries[2];
queries[0] = _startQuery;
queries[1] = _endQuery;
glDeleteQueries(2, queries);
VALIDATE_OPENGL_RESULT();
_memoryUsage = 0;
}
void GPUTimerQueryOGL::Begin()
{
glQueryCounter(_startQuery, GL_TIMESTAMP);
VALIDATE_OPENGL_RESULT();
_endCalled = false;
}
void GPUTimerQueryOGL::End()
{
if (_endCalled)
return;
glQueryCounter(_endQuery, GL_TIMESTAMP);
VALIDATE_OPENGL_RESULT();
_endCalled = true;
_finalized = false;
}
bool GPUTimerQueryOGL::HasResult()
{
if (!_endCalled)
return false;
GLint done = 0;
glGetQueryObjectiv(_endQuery, GL_QUERY_RESULT_AVAILABLE, &done);
VALIDATE_OPENGL_RESULT();
return done == GL_TRUE;
}
float GPUTimerQueryOGL::GetResult()
{
if (!_finalized)
{
#if BUILD_DEBUG
ASSERT(HasResult());
#endif
GLuint64 timeStart;
GLuint64 timeEnd;
glGetQueryObjectui64v(_startQuery, GL_QUERY_RESULT, &timeStart);
VALIDATE_OPENGL_RESULT();
glGetQueryObjectui64v(_endQuery, GL_QUERY_RESULT, &timeEnd);
VALIDATE_OPENGL_RESULT();
_timeDelta = (timeEnd - timeStart) / 1000000.0f;
_finalized = true;
}
return _timeDelta;
}
#endif