1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-09-15 15:02:34 +02:00

Add more rendering metrics for GL performance

This commit is contained in:
Daniel Evans 2015-04-09 23:54:56 +01:00
parent dd7e487a55
commit 4cf36b8fd6
6 changed files with 71 additions and 12 deletions

View File

@ -193,6 +193,11 @@ public:
MapRenderer map;
WaterRenderer water;
TextRenderer text;
// Rendering timers
GLuint timeObj;
GLuint timeSky;
GLuint timeWater;
};
#endif

View File

@ -6,6 +6,9 @@
#include <render/DrawBuffer.hpp>
#include <render/GeometryBuffer.hpp>
// Maximum depth of debug group stack
#define MAX_DEBUG_DEPTH 5
typedef std::uint32_t RenderIndex;
struct VertexP3
@ -109,6 +112,8 @@ public:
* Returns the number of draw calls issued for the current frame.
*/
int getDrawCount();
int getTextureCount();
int getBufferCount();
const SceneUniformData& getSceneData() const;
@ -116,13 +121,15 @@ public:
* Signals the start of a debug group
*/
virtual void pushDebugGroup(const std::string& title) = 0;
virtual void popDebugGroup() = 0;
virtual GLuint popDebugGroup() = 0;
private:
glm::ivec2 viewport;
glm::mat4 projection2D;
protected:
int drawCounter;
int textureCounter;
int bufferCounter;
SceneUniformData lastSceneData;
};
@ -178,7 +185,7 @@ public:
void invalidate();
virtual void pushDebugGroup(const std::string& title);
virtual void popDebugGroup();
virtual GLuint popDebugGroup();
private:
DrawBuffer* currentDbuff;
@ -202,6 +209,11 @@ private:
GLuint UBOObject;
GLuint UBOScene;
// Debug group profiling timers
GLuint64 debugTimes[MAX_DEBUG_DEPTH];
GLuint debugQuery;
int currentDebugDepth;
};
/// @todo remove these from here

View File

@ -232,7 +232,9 @@ void GameRenderer::renderWorld(const ViewCamera &camera, float alpha)
// Store the input camera,
_camera = camera;
timeObj = timeSky = timeWater = 0;
// Set the viewport
const glm::ivec2& vp = getRenderer()->getViewport();
glViewport(0, 0, vp.x, vp.y);
@ -366,7 +368,7 @@ void GameRenderer::renderWorld(const ViewCamera &camera, float alpha)
transparentDrawQueue.clear();
renderer->popDebugGroup();
renderer->popDebugGroup();
timeObj = renderer->popDebugGroup();
// Render arrows above anything that isn't radar only (or hidden)
ModelRef& arrowModel = engine->gameData.models["arrow"];
@ -424,7 +426,7 @@ void GameRenderer::renderWorld(const ViewCamera &camera, float alpha)
water.render(this, engine);
renderer->popDebugGroup();
timeWater = renderer->popDebugGroup();
renderer->pushDebugGroup("Sky");
@ -440,7 +442,7 @@ void GameRenderer::renderWorld(const ViewCamera &camera, float alpha)
renderer->draw(glm::mat4(), &skyDbuff, dp);
renderer->popDebugGroup();
timeSky = renderer->popDebugGroup();
renderer->pushDebugGroup("Effects");
renderEffects();

View File

@ -90,6 +90,8 @@ void Renderer::setViewport(const glm::ivec2& vp)
void Renderer::swap()
{
drawCounter = 0;
textureCounter = 0;
bufferCounter = 0;
}
int Renderer::getDrawCount()
@ -97,6 +99,16 @@ int Renderer::getDrawCount()
return drawCounter;
}
int Renderer::getBufferCount()
{
return bufferCounter;
}
int Renderer::getTextureCount()
{
return textureCounter;
}
const Renderer::SceneUniformData& Renderer::getSceneData() const
{
return lastSceneData;
@ -108,6 +120,7 @@ void OpenGLRenderer::useDrawBuffer(DrawBuffer* dbuff)
{
glBindVertexArray(dbuff->getVAOName());
currentDbuff = dbuff;
bufferCounter++;
}
}
@ -118,6 +131,7 @@ void OpenGLRenderer::useTexture(GLuint unit, GLuint tex)
glActiveTexture(GL_TEXTURE0 + unit);
glBindTexture(GL_TEXTURE_2D, tex);
currentTextures[unit] = tex;
textureCounter++;
}
}
@ -131,7 +145,7 @@ void OpenGLRenderer::useProgram(Renderer::ShaderProgram* p)
}
OpenGLRenderer::OpenGLRenderer()
: currentDbuff(nullptr), currentProgram(nullptr)
: currentDbuff(nullptr), currentProgram(nullptr), currentDebugDepth(0)
{
glGenBuffers(1, &UBOScene);
glGenBuffers(1, &UBOObject);
@ -140,6 +154,8 @@ OpenGLRenderer::OpenGLRenderer()
glBindBufferBase(GL_UNIFORM_BUFFER, 2, UBOObject);
swap();
glGenQueries(1, &debugQuery);
}
std::string OpenGLRenderer::getIDString() const
@ -284,13 +300,27 @@ void OpenGLRenderer::pushDebugGroup(const std::string& title)
if( GLEW_KHR_debug )
{
glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, -1, title.c_str());
glQueryCounter(debugQuery, GL_TIMESTAMP);
glGetQueryObjectui64v(debugQuery, GL_QUERY_RESULT, &debugTimes[currentDebugDepth]);
currentDebugDepth++;
assert( currentDebugDepth < MAX_DEBUG_DEPTH );
}
}
void OpenGLRenderer::popDebugGroup()
GLuint OpenGLRenderer::popDebugGroup()
{
if( GLEW_KHR_debug )
{
glPopDebugGroup();
currentDebugDepth--;
assert( currentDebugDepth >= 0 );
glQueryCounter(debugQuery, GL_TIMESTAMP);
GLuint64 current_time;
glGetQueryObjectui64v(debugQuery, GL_QUERY_RESULT, &current_time);
return current_time - debugTimes[currentDebugDepth];
}
return 0;
}

View File

@ -414,8 +414,12 @@ void RWGame::render(float alpha, float time)
glEnable(GL_DEPTH_TEST);
glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT);
renderer->getRenderer()->pushDebugGroup("World");
renderer->renderWorld(viewCam, alpha);
auto rendertime = renderer->getRenderer()->popDebugGroup();
#if 0
debug->setShaderProgram(engine->renderer.worldProg);
if( engine->state.player )
@ -438,13 +442,13 @@ void RWGame::render(float alpha, float time)
if ( showDebugStats )
{
renderDebugStats(time);
renderDebugStats(time, rendertime);
}
drawOnScreenText(engine, renderer);
}
void RWGame::renderDebugStats(float time)
void RWGame::renderDebugStats(float time, GLuint worldRenderTime)
{
constexpr size_t average_every_frame = 15;
static float times[average_every_frame];
@ -464,6 +468,12 @@ void RWGame::renderDebugStats(float time)
ss << "Frametime: " << time << " (FPS " << (1.f/time) << ")\n";
ss << "Average (per " << average_every_frame << " frames); Frametime: " << time_average << " (FPS " << (1.f/time_average) << ")\n";
ss << "Draws: " << lastDraws << " (" << renderer->culled << " Culls)\n";
ss << " Texture binds: " << renderer->getRenderer()->getTextureCount() << "\n";
ss << " Buffer binds: " << renderer->getRenderer()->getBufferCount() << "\n";
ss << " World time: " << (worldRenderTime/1000000) << "ms\n";
ss << " Objects: " << (renderer->timeObj/1000000) << "ms\n";
ss << " Water: " << (renderer->timeWater/1000000) << "ms\n";
ss << " Sky: " << (renderer->timeSky/1000000) << "ms\n";
// Count the number of interesting objects.
int peds = 0, cars = 0;

View File

@ -88,7 +88,7 @@ private:
void tick(float dt);
void render(float alpha, float dt);
void renderDebugStats(float dt);
void renderDebugStats(float time, GLuint worldRenderTime);
void globalKeyEvent(const sf::Event& event);
};