diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2020-02-12 16:20:20 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2020-02-13 06:39:16 +0100 |
commit | fed75194371573cb1af24710deb2936f5f8024d1 (patch) | |
tree | 5cfcf470b987f4e89008ed6ea060701d771cca71 /src/plugins/renderers/opengl/graphicshelpers | |
parent | 26df8a284b745002f067cbde6da40fcdb921c19c (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.cpp | 21 |
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) { |