summaryrefslogtreecommitdiffstats
path: root/src/plugins/renderers/opengl/graphicshelpers
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2020-02-12 16:20:20 +0100
committerPaul Lemire <paul.lemire@kdab.com>2020-02-13 06:39:16 +0100
commitfed75194371573cb1af24710deb2936f5f8024d1 (patch)
tree5cfcf470b987f4e89008ed6ea060701d771cca71 /src/plugins/renderers/opengl/graphicshelpers
parent26df8a284b745002f067cbde6da40fcdb921c19c (diff)
Shader fixes
- Make sure that shaders marked for destruction are un marked from destruction if recreated before having been destroyed. - When loading shaders, make sure the shader wasn't already loaded when loading it. This can happen is a shader is abandoned and then re adopted. Change-Id: I04597479d782bc6d31e4c7f78425c02c31217c7e Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src/plugins/renderers/opengl/graphicshelpers')
-rw-r--r--src/plugins/renderers/opengl/graphicshelpers/graphicscontext.cpp21
1 files changed, 12 insertions, 9 deletions
diff --git a/src/plugins/renderers/opengl/graphicshelpers/graphicscontext.cpp b/src/plugins/renderers/opengl/graphicshelpers/graphicscontext.cpp
index a4152449f..f52a358ad 100644
--- a/src/plugins/renderers/opengl/graphicshelpers/graphicscontext.cpp
+++ b/src/plugins/renderers/opengl/graphicshelpers/graphicscontext.cpp
@@ -233,7 +233,7 @@ void GraphicsContext::doneCurrent()
m_glHelper = nullptr;
}
-// Called by GL Command Thread
+// Called by GraphicsContext::loadShader itself called by Renderer::updateGLResources
GraphicsContext::ShaderCreationInfo GraphicsContext::createShaderProgram(GLShader *shader)
{
QOpenGLShaderProgram *shaderProgram = shader->shaderProgram();
@@ -303,14 +303,17 @@ void GraphicsContext::loadShader(Shader *shaderNode,
const QVector<Qt3DCore::QNodeId> sharedShaderIds = glShaderManager->shaderIdsForProgram(glShader);
if (sharedShaderIds.size() == 1) {
- // Shader in the cache hasn't been loaded yet
- glShader->setGraphicsContext(this);
- glShader->setShaderCode(shaderNode->shaderCode());
- const ShaderCreationInfo loadResult = createShaderProgram(glShader);
- shaderNode->setStatus(loadResult.linkSucceeded ? QShaderProgram::Ready : QShaderProgram::Error);
- shaderNode->setLog(loadResult.logs);
- // Loaded in the sense we tried to load it (and maybe it failed)
- glShader->setLoaded(true);
+ // The Shader could already be loaded if we retrieved one
+ // that had been marked for destruction
+ if (!glShader->isLoaded()) {
+ glShader->setGraphicsContext(this);
+ glShader->setShaderCode(shaderNode->shaderCode());
+ const ShaderCreationInfo loadResult = createShaderProgram(glShader);
+ shaderNode->setStatus(loadResult.linkSucceeded ? QShaderProgram::Ready : QShaderProgram::Error);
+ shaderNode->setLog(loadResult.logs);
+ // Loaded in the sense we tried to load it (and maybe it failed)
+ glShader->setLoaded(true);
+ }
} else {
// Find an already loaded shader that shares the same QOpenGLShaderProgram
for (const Qt3DCore::QNodeId sharedShaderId : sharedShaderIds) {