From 16209535db51476549d0aaf942d7af9033088cbb Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Sat, 22 Jul 2023 02:28:56 -0400 Subject: [PATCH] Optimized cache locality and rendering state change --- Nuake/src/Rendering/RenderList.h | 10 +++++++--- Nuake/src/Rendering/SceneRenderer.cpp | 10 +++------- Nuake/src/Rendering/Shaders/Shader.cpp | 20 ++++++++++++++++---- Nuake/src/Rendering/Shaders/Shader.h | 8 ++++++-- Nuake/src/Scene/Scene.cpp | 13 ++++++++++++- Nuake/src/Scene/Scene.h | 2 ++ 6 files changed, 46 insertions(+), 17 deletions(-) diff --git a/Nuake/src/Rendering/RenderList.h b/Nuake/src/Rendering/RenderList.h index e2f7e7e3..18ab53c1 100644 --- a/Nuake/src/Rendering/RenderList.h +++ b/Nuake/src/Rendering/RenderList.h @@ -36,15 +36,19 @@ namespace Nuake void Flush(Shader* shader, bool depthOnly = false) { shader->Bind(); + const uint32_t entityIdUniformLocation = shader->FindUniformLocation("u_EntityID"); + const uint32_t modelMatrixUniformLocation = shader->FindUniformLocation("u_Model"); for (auto& i : m_RenderList) { - if(!depthOnly) + if (!depthOnly) + { i.first->Bind(shader); + } for (auto& m : i.second) { - shader->SetUniformMat4f("u_Model", m.transform); - shader->SetUniform1i("u_EntityID", m.entityId + 1); + shader->SetUniformMat4f(modelMatrixUniformLocation, m.transform); + shader->SetUniform1i(entityIdUniformLocation, m.entityId + 1); m.Mesh->Draw(shader, false); } } diff --git a/Nuake/src/Rendering/SceneRenderer.cpp b/Nuake/src/Rendering/SceneRenderer.cpp index 7d4b2512..486beb1f 100644 --- a/Nuake/src/Rendering/SceneRenderer.cpp +++ b/Nuake/src/Rendering/SceneRenderer.cpp @@ -49,6 +49,9 @@ namespace Nuake mGBuffer->QueueResize(framebuffer.GetSize()); GBufferPass(scene); + mShadingBuffer->QueueResize(framebuffer.GetSize()); + ShadingPass(scene); + const auto& sceneEnv = scene.GetEnvironment(); Ref finalOutput = mShadingBuffer->GetTexture(); if (scene.GetEnvironment()->BloomEnabled) @@ -141,9 +144,6 @@ namespace Nuake - mShadingBuffer->QueueResize(framebuffer.GetSize()); - ShadingPass(scene); - RenderCommand::Enable(RendererEnum::DEPTH_TEST); Renderer::EndDraw(); } @@ -199,8 +199,6 @@ namespace Nuake } Renderer::Flush(shader, true); } - - light.m_Framebuffers[i]->Unbind(); } } } @@ -249,7 +247,6 @@ namespace Nuake } Renderer::Flush(gBufferShader, false); } - mGBuffer->Unbind(); } void SceneRenderer::ShadingPass(Scene& scene) @@ -308,7 +305,6 @@ namespace Nuake Renderer::DrawQuad(Matrix4()); } - mShadingBuffer->Unbind(); } void SceneRenderer::PostProcessPass(const Scene& scene) diff --git a/Nuake/src/Rendering/Shaders/Shader.cpp b/Nuake/src/Rendering/Shaders/Shader.cpp index f4b99993..895eb8c5 100644 --- a/Nuake/src/Rendering/Shaders/Shader.cpp +++ b/Nuake/src/Rendering/Shaders/Shader.cpp @@ -190,7 +190,7 @@ namespace Nuake int addr = glGetUniformLocation(ProgramId, uniform.c_str()); if (addr == -1) - return addr;//std::cout << "Warning: uniform '" << uniform << "' doesn't exists!" << std::endl; + return addr; else UniformCache[uniform] = addr; @@ -250,7 +250,12 @@ namespace Nuake //ASSERT(addr != -1); if (addr != -1) - glUniform1i(addr, v0); + SetUniform1i(addr, v0); + } + + void Shader::SetUniform1i(uint32_t location, int v0) + { + glUniform1i(location, v0); } void Shader::SetUniform1iv(const std::string& name, int size, int* value) @@ -277,12 +282,19 @@ namespace Nuake glUniformMatrix3fv(addr, 1, GL_FALSE, &mat[0][0]); } - void Shader::SetUniformMat4f(const std::string& name, Matrix4 mat) + void Shader::SetUniformMat4f(uint32_t location, const Matrix4& mat) + { + glUniformMatrix4fv(location, 1, GL_FALSE, &mat[0][0]); + } + + void Shader::SetUniformMat4f(const std::string& name, const Matrix4& mat) { int addr = FindUniformLocation(name); if (addr != -1) - glUniformMatrix4fv(addr, 1, GL_FALSE, &mat[0][0]); + { + SetUniformMat4f(addr, std::move(mat)); + } } void Shader::SetUniform1f(const std::string& name, float v0) diff --git a/Nuake/src/Rendering/Shaders/Shader.h b/Nuake/src/Rendering/Shaders/Shader.h index f022f451..6fa41787 100644 --- a/Nuake/src/Rendering/Shaders/Shader.h +++ b/Nuake/src/Rendering/Shaders/Shader.h @@ -42,16 +42,20 @@ namespace Nuake void SetUniform1b(const std::string& name, bool v0); void SetUniformTex(const std::string& name, Texture* texture, unsigned int slot = 0); void SetUniform1i(const std::string& name, int v0); + void SetUniform1i(uint32_t location, int v0); void SetUniform1iv(const std::string& name, int size, int* value); void SetUniform1fv(const std::string& name, int size, float* value); void SetUniformMat3f(const std::string& name, Matrix3 mat); - void SetUniformMat4f(const std::string& name, Matrix4 mat); + + void SetUniformMat4f(uint32_t name, const Matrix4& mat); + void SetUniformMat4f(const std::string& name, const Matrix4& mat); + + int FindUniformLocation(std::string uniform); private: ShaderSource ParseShader(const std::string& filePath); unsigned int CreateProgram(ShaderSource source); unsigned int Compile(unsigned int type, ShaderSource source); - int FindUniformLocation(std::string uniform); }; } diff --git a/Nuake/src/Scene/Scene.cpp b/Nuake/src/Scene/Scene.cpp index fa164531..7dd2f876 100644 --- a/Nuake/src/Scene/Scene.cpp +++ b/Nuake/src/Scene/Scene.cpp @@ -75,16 +75,25 @@ namespace Nuake { Entity Scene::GetEntityByID(int id) { + if (_EntitiesIDMap.find(id) != _EntitiesIDMap.end()) + { + return _EntitiesIDMap[id]; + } + auto idView = m_Registry.view(); for (auto e : idView) { NameComponent& nameC = idView.get(e); if (nameC.ID == id) { - return Entity{ e, this }; + auto newEntity = Entity{ e, this }; + _EntitiesIDMap[id] = newEntity; + return newEntity; } } + Logger::Log("Entity not found with id: " + std::to_string(id), "scene", CRITICAL); + assert("Entity not found"); } @@ -242,6 +251,8 @@ namespace Nuake { nameComponent.Name = entityName; nameComponent.ID = id; + _EntitiesIDMap[id] = entity; + Logger::Log("Entity created with name: " + nameComponent.Name, "scene", LOG_TYPE::VERBOSE); return entity; } diff --git a/Nuake/src/Scene/Scene.h b/Nuake/src/Scene/Scene.h index 63468d9f..34fe17db 100644 --- a/Nuake/src/Scene/Scene.h +++ b/Nuake/src/Scene/Scene.h @@ -37,9 +37,11 @@ namespace Nuake public: Ref m_EditorCamera; entt::registry m_Registry; + std::map _EntitiesIDMap; std::string Path = ""; SceneRenderer* mSceneRenderer; + static Ref New(); Scene(); ~Scene();