summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWieland Hagen <wieland.hagen@kdab.com>2017-01-09 12:05:29 +0700
committerSean Harmer <sean.harmer@kdab.com>2017-01-09 20:14:56 +0000
commit5386c767fa5a6be312f02b0cf23869974d5766b2 (patch)
treeffda178afca99bcb63efaf20f0bfbee33bc3007e
parentf6b03301aa17f0a6b086391a53841b37c6b95481 (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.cpp5
-rw-r--r--src/render/graphicshelpers/graphicscontext.cpp9
-rw-r--r--src/render/graphicshelpers/graphicscontext_p.h2
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; }