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:
parent
dd7e487a55
commit
4cf36b8fd6
@ -193,6 +193,11 @@ public:
|
||||
MapRenderer map;
|
||||
WaterRenderer water;
|
||||
TextRenderer text;
|
||||
|
||||
// Rendering timers
|
||||
GLuint timeObj;
|
||||
GLuint timeSky;
|
||||
GLuint timeWater;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
@ -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, ¤t_time);
|
||||
|
||||
return current_time - debugTimes[currentDebugDepth];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user