From 0f4cf3c9101530c2b9ba737e4589bfe6be7f7cf3 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 7 Jun 2015 18:25:35 +0200 Subject: [PATCH] Graphics/RenderTechnique: Add uniform invalidation Former-commit-id: 8f03073408a03854533d9911eb1a0605ebbb8767 --- include/Nazara/Graphics/DeferredGeometryPass.hpp | 4 ++++ include/Nazara/Graphics/ForwardRenderTechnique.hpp | 5 +++++ include/Nazara/Renderer/Shader.hpp | 5 +++++ src/Nazara/Graphics/DeferredGeometryPass.cpp | 10 +++++++++- src/Nazara/Graphics/ForwardRenderTechnique.cpp | 12 +++++++++--- src/Nazara/Renderer/Shader.cpp | 4 ++++ 6 files changed, 36 insertions(+), 4 deletions(-) diff --git a/include/Nazara/Graphics/DeferredGeometryPass.hpp b/include/Nazara/Graphics/DeferredGeometryPass.hpp index 11c238d53..40890cffb 100644 --- a/include/Nazara/Graphics/DeferredGeometryPass.hpp +++ b/include/Nazara/Graphics/DeferredGeometryPass.hpp @@ -25,9 +25,13 @@ class NAZARA_API NzDeferredGeometryPass : public NzDeferredRenderPass struct ShaderUniforms; const ShaderUniforms* GetShaderUniforms(const NzShader* shader) const; + void OnShaderInvalidated(const NzShader* shader) const; struct ShaderUniforms { + NazaraSlot(NzShader, OnShaderUniformInvalidated, shaderUniformInvalidatedSlot); + NazaraSlot(NzShader, OnShaderRelease, shaderReleaseSlot); + int eyePosition; int sceneAmbient; int textureOverlay; diff --git a/include/Nazara/Graphics/ForwardRenderTechnique.hpp b/include/Nazara/Graphics/ForwardRenderTechnique.hpp index 318e8b707..939d5138d 100644 --- a/include/Nazara/Graphics/ForwardRenderTechnique.hpp +++ b/include/Nazara/Graphics/ForwardRenderTechnique.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -40,6 +41,7 @@ class NAZARA_API NzForwardRenderTechnique : public NzAbstractRenderTechnique void DrawOpaqueModels(const NzScene* scene) const; void DrawTransparentModels(const NzScene* scene) const; const ShaderUniforms* GetShaderUniforms(const NzShader* shader) const; + void OnShaderInvalidated(const NzShader* shader) const; void SendLightUniforms(const NzShader* shader, const NzLightUniforms& uniforms, unsigned int uniformOffset, unsigned int index) const; static float ComputeDirectionalLightScore(const NzSpheref& object, const NzAbstractRenderQueue::DirectionalLight& light); @@ -58,6 +60,9 @@ class NAZARA_API NzForwardRenderTechnique : public NzAbstractRenderTechnique struct ShaderUniforms { + NazaraSlot(NzShader, OnShaderUniformInvalidated, shaderUniformInvalidatedSlot); + NazaraSlot(NzShader, OnShaderRelease, shaderReleaseSlot); + NzLightUniforms lightUniforms; bool hasLightUniforms; diff --git a/include/Nazara/Renderer/Shader.hpp b/include/Nazara/Renderer/Shader.hpp index ecb1ac003..4e393649d 100644 --- a/include/Nazara/Renderer/Shader.hpp +++ b/include/Nazara/Renderer/Shader.hpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -102,6 +103,10 @@ class NAZARA_API NzShader : public NzRefCounted, NzNonCopyable static bool IsStageSupported(nzShaderStage stage); template static NzShaderRef New(Args&&... args); + // Signals + NazaraSignal(OnShaderRelease, const NzShader*); //< Args: me + NazaraSignal(OnShaderUniformInvalidated, const NzShader*); //< Args: me + private: bool PostLinkage(); diff --git a/src/Nazara/Graphics/DeferredGeometryPass.cpp b/src/Nazara/Graphics/DeferredGeometryPass.cpp index 61f0d922a..b5c3f2f81 100644 --- a/src/Nazara/Graphics/DeferredGeometryPass.cpp +++ b/src/Nazara/Graphics/DeferredGeometryPass.cpp @@ -240,12 +240,20 @@ const NzDeferredGeometryPass::ShaderUniforms* NzDeferredGeometryPass::GetShaderU if (it == m_shaderUniforms.end()) { ShaderUniforms uniforms; + uniforms.shaderReleaseSlot.Connect(shader->OnShaderRelease, this, OnShaderInvalidated); + uniforms.shaderUniformInvalidatedSlot.Connect(shader->OnShaderUniformInvalidated, this, OnShaderInvalidated); + uniforms.eyePosition = shader->GetUniformLocation("EyePosition"); uniforms.sceneAmbient = shader->GetUniformLocation("SceneAmbient"); uniforms.textureOverlay = shader->GetUniformLocation("TextureOverlay"); - it = m_shaderUniforms.emplace(shader, uniforms).first; + it = m_shaderUniforms.emplace(shader, std::move(uniforms)).first; } return &it->second; } + +void NzDeferredGeometryPass::OnShaderInvalidated(const NzShader* shader) const +{ + m_shaderUniforms.erase(shader); +} diff --git a/src/Nazara/Graphics/ForwardRenderTechnique.cpp b/src/Nazara/Graphics/ForwardRenderTechnique.cpp index f1541de28..35c379ba3 100644 --- a/src/Nazara/Graphics/ForwardRenderTechnique.cpp +++ b/src/Nazara/Graphics/ForwardRenderTechnique.cpp @@ -21,8 +21,6 @@ #include #include -///TODO: Surveiller les shaders et supprimer les données uniformes en cas de changement (recompilation/destruction) - namespace { struct BillboardPoint @@ -738,6 +736,9 @@ const NzForwardRenderTechnique::ShaderUniforms* NzForwardRenderTechnique::GetSha if (it == m_shaderUniforms.end()) { ShaderUniforms uniforms; + uniforms.shaderReleaseSlot.Connect(shader->OnShaderRelease, this, OnShaderInvalidated); + uniforms.shaderUniformInvalidatedSlot.Connect(shader->OnShaderUniformInvalidated, this, OnShaderInvalidated); + uniforms.eyePosition = shader->GetUniformLocation("EyePosition"); uniforms.sceneAmbient = shader->GetUniformLocation("SceneAmbient"); uniforms.textureOverlay = shader->GetUniformLocation("TextureOverlay"); @@ -760,12 +761,17 @@ const NzForwardRenderTechnique::ShaderUniforms* NzForwardRenderTechnique::GetSha else uniforms.hasLightUniforms = false; - it = m_shaderUniforms.emplace(shader, uniforms).first; + it = m_shaderUniforms.emplace(shader, std::move(uniforms)).first; } return &it->second; } +void NzForwardRenderTechnique::OnShaderInvalidated(const NzShader* shader) const +{ + m_shaderUniforms.erase(shader); +} + NzIndexBuffer NzForwardRenderTechnique::s_quadIndexBuffer; NzVertexBuffer NzForwardRenderTechnique::s_quadVertexBuffer; NzVertexDeclaration NzForwardRenderTechnique::s_billboardInstanceDeclaration; diff --git a/src/Nazara/Renderer/Shader.cpp b/src/Nazara/Renderer/Shader.cpp index 47e6b9ada..a865e690e 100644 --- a/src/Nazara/Renderer/Shader.cpp +++ b/src/Nazara/Renderer/Shader.cpp @@ -18,6 +18,8 @@ m_program(0) NzShader::~NzShader() { + OnShaderRelease(this); + Destroy(); } @@ -779,6 +781,8 @@ bool NzShader::PostLinkage() #undef CacheUniform + OnShaderUniformInvalidated(this); + return true; } else