diff options
author | Wieland Hagen <wieland.hagen@kdab.com> | 2017-01-09 12:05:29 +0700 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2017-01-09 20:14:56 +0000 |
commit | 5386c767fa5a6be312f02b0cf23869974d5766b2 (patch) | |
tree | ffda178afca99bcb63efaf20f0bfbee33bc3007e | |
parent | f6b03301aa17f0a6b086391a53841b37c6b95481 (diff) |
Ignore RenderCommand for current frame, if shader not loaded yet
Renderer::m_shaderGathererJob might not have finished yet, so the shader
wasn't marked as dirty yet, so it wasn't loaded in
Renderer::updateGLResources(). Next frame everything will be alright.
Task-number: QTBUG-55093
Change-Id: Ia60ed1dff4cb0495efbd7f70f87d227007ef560d
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r-- | src/render/backend/renderer.cpp | 5 | ||||
-rw-r--r-- | src/render/graphicshelpers/graphicscontext.cpp | 9 | ||||
-rw-r--r-- | src/render/graphicshelpers/graphicscontext_p.h | 2 |
3 files changed, 11 insertions, 5 deletions
diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp index cf7e53256..811379336 100644 --- a/src/render/backend/renderer.cpp +++ b/src/render/backend/renderer.cpp @@ -1401,7 +1401,10 @@ bool Renderer::executeCommandsSubmission(const RenderView *rv) { Profiling::GLTimeRecorder recorder(Profiling::ShaderUpdate); //// We activate the shader here - m_graphicsContext->activateShader(command->m_shaderDna); + if (!m_graphicsContext->activateShader(command->m_shaderDna)) { + allCommandsIssued = false; + continue; + } } { diff --git a/src/render/graphicshelpers/graphicscontext.cpp b/src/render/graphicshelpers/graphicscontext.cpp index 21a45dd9b..919ae5bd6 100644 --- a/src/render/graphicshelpers/graphicscontext.cpp +++ b/src/render/graphicshelpers/graphicscontext.cpp @@ -509,9 +509,12 @@ void GraphicsContext::loadShader(Shader *shader) } // Called only from RenderThread -void GraphicsContext::activateShader(ProgramDNA shaderDNA) +bool GraphicsContext::activateShader(ProgramDNA shaderDNA) { if (shaderDNA != m_activeShaderDNA) { + // Ensure material uniforms are re-applied + m_material = nullptr; + m_activeShader = m_shaderCache.getShaderProgramForDNA(shaderDNA); if (Q_LIKELY(m_activeShader != nullptr)) { m_activeShader->bind(); @@ -520,10 +523,10 @@ void GraphicsContext::activateShader(ProgramDNA shaderDNA) m_glHelper->useProgram(0); qWarning() << "No shader program found for DNA"; m_activeShaderDNA = 0; + return false; } - // Ensure material uniforms are re-applied - m_material = nullptr; } + return true; } void GraphicsContext::removeShaderProgramReference(Shader *shaderNode) diff --git a/src/render/graphicshelpers/graphicscontext_p.h b/src/render/graphicshelpers/graphicscontext_p.h index 9f7a0f972..8067bb8b8 100644 --- a/src/render/graphicshelpers/graphicscontext_p.h +++ b/src/render/graphicshelpers/graphicscontext_p.h @@ -130,7 +130,7 @@ public: QOpenGLShaderProgram *createShaderProgram(Shader *shaderNode); void loadShader(Shader* shader); - void activateShader(ProgramDNA shaderDNA); + bool activateShader(ProgramDNA shaderDNA); void removeShaderProgramReference(Shader *shaderNode); GLuint activeFBO() const { return m_activeFBO; } |