From 1efe3840b8beb36a2ea1d8b92d74503fe3936e4d Mon Sep 17 00:00:00 2001 From: Daniel Evans Date: Fri, 31 Aug 2018 16:29:31 +0100 Subject: [PATCH] Increase profiler coverage in GameRenderer/OpenGLRenderer --- rwengine/src/render/GameRenderer.cpp | 20 ++++++++++++++------ rwengine/src/render/GameRenderer.hpp | 2 ++ rwengine/src/render/OpenGLRenderer.cpp | 2 ++ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/rwengine/src/render/GameRenderer.cpp b/rwengine/src/render/GameRenderer.cpp index a3748dfe..cd0d8ce9 100644 --- a/rwengine/src/render/GameRenderer.cpp +++ b/rwengine/src/render/GameRenderer.cpp @@ -309,7 +309,18 @@ void GameRenderer::renderObjects(const GameWorld *world) { RW_PROFILE_SCOPE(__func__); renderer->useProgram(worldProg.get()); + RenderList renderList = createObjectRenderList(world); + renderer->pushDebugGroup("Objects"); + renderer->pushDebugGroup("RenderList"); + renderer->drawBatched(renderList); + + renderer->popDebugGroup(); + profObjects = renderer->popDebugGroup(); +} + +RenderList GameRenderer::createObjectRenderList(const GameWorld *world) { + RW_PROFILE_SCOPE(__func__); // This is sequential at the moment, it should be easy to make it // run in parallel with a good threading system. RenderList renderList; @@ -363,10 +374,9 @@ void GameRenderer::renderObjects(const GameWorld *world) { model = scale(model, glm::vec3(1.5f, 1.5f, 1.5f)); objectRenderer.renderClump(arrowModel.get(), model, nullptr, renderList); } - culled += objectRenderer.culled; - renderer->pushDebugGroup("Objects"); - renderer->pushDebugGroup("RenderList"); + + RW_PROFILE_SCOPE("sortRenderList"); // Also parallelizable // Earlier position in the array means earlier object's rendering // Transparent objects should be sorted and rendered after opaque @@ -379,10 +389,8 @@ void GameRenderer::renderObjects(const GameWorld *world) { return false; return (a.sortKey > b.sortKey); }); - renderer->drawBatched(renderList); - renderer->popDebugGroup(); - profObjects = renderer->popDebugGroup(); + return renderList; } void GameRenderer::renderSplash(GameWorld* world, GLuint splashTexName, glm::u16vec3 fc) { diff --git a/rwengine/src/render/GameRenderer.hpp b/rwengine/src/render/GameRenderer.hpp index 65915cbf..e2550bf0 100644 --- a/rwengine/src/render/GameRenderer.hpp +++ b/rwengine/src/render/GameRenderer.hpp @@ -174,6 +174,8 @@ private: void drawRect(const glm::vec4& colour, TextureData* texture, glm::vec4& extents); void renderObjects(const GameWorld *world); + + RenderList createObjectRenderList(const GameWorld *world); }; #endif diff --git a/rwengine/src/render/OpenGLRenderer.cpp b/rwengine/src/render/OpenGLRenderer.cpp index ce91c06d..a3459519 100644 --- a/rwengine/src/render/OpenGLRenderer.cpp +++ b/rwengine/src/render/OpenGLRenderer.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -315,6 +316,7 @@ void OpenGLRenderer::drawArrays(const glm::mat4& model, DrawBuffer* draw, } void OpenGLRenderer::drawBatched(const RenderList& list) { + RW_PROFILE_SCOPE(__func__); #if 0 // Needs shader changes // Determine how many batches we need to process the entire list auto entries = list.size();