diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2018-05-02 18:00:52 +0200 |
---|---|---|
committer | Antti Kokko <antti.kokko@qt.io> | 2018-05-04 12:00:29 +0000 |
commit | 43cebede39c9340c29bad6c6a78b76446d54c0db (patch) | |
tree | c6b9107da502d3c73d0aa1137532bd040e4bca71 /src/render/renderers/opengl | |
parent | 7f0bdc21a8f1a5fbe2afdba61f037a71f00c1d61 (diff) |
Avoid locking up on Radeonv5.11.0-rc1
Could not find a decent way to do a renderer/vendor string query due to
the convoluted internals so just used a define for now.
Task-number: QTBUG-67937
Change-Id: I0dcfa41377a5e430d3f7973c5aaa01535100c53c
Reviewed-by: Liang Qi <liang.qi@qt.io>
Diffstat (limited to 'src/render/renderers/opengl')
-rw-r--r-- | src/render/renderers/opengl/renderer/renderer.cpp | 26 | ||||
-rw-r--r-- | src/render/renderers/opengl/renderer/renderer_p.h | 3 |
2 files changed, 26 insertions, 3 deletions
diff --git a/src/render/renderers/opengl/renderer/renderer.cpp b/src/render/renderers/opengl/renderer/renderer.cpp index a95bf230b..b889799a3 100644 --- a/src/render/renderers/opengl/renderer/renderer.cpp +++ b/src/render/renderers/opengl/renderer/renderer.cpp @@ -128,6 +128,9 @@ QT_BEGIN_NAMESPACE +// Crashes on AMD Radeon drivers on Windows. Disable for now. +//#define SHADER_LOADING_IN_COMMAND_THREAD + using namespace Qt3DCore; namespace Qt3DRender { @@ -323,11 +326,17 @@ QOpenGLContext *Renderer::shareContext() const } // Executed in the command thread -void Renderer::loadShader(Shader *shader) const +void Renderer::loadShader(Shader *shader, HShader shaderHandle) { +#ifdef SHADER_LOADING_IN_COMMAND_THREAD + Q_UNUSED(shaderHandle); Profiling::GLTimeRecorder recorder(Profiling::ShaderUpload); LoadShaderCommand cmd(shader); m_commandThread->executeCommand(&cmd); +#else + Q_UNUSED(shader); + m_dirtyShaders.push_back(shaderHandle); +#endif } void Renderer::setOpenGLContext(QOpenGLContext *context) @@ -1123,7 +1132,7 @@ void Renderer::reloadDirtyShaders() shader->submitPendingNotifications(); // If the shader hasn't be loaded, load it if (shader != nullptr && !shader->isLoaded()) - loadShader(shader); + loadShader(shader, shaderHandle); } } } @@ -1147,6 +1156,19 @@ void Renderer::updateGLResources() } } +#ifndef SHADER_LOADING_IN_COMMAND_THREAD + { + Profiling::GLTimeRecorder recorder(Profiling::ShaderUpload); + const QVector<HShader> dirtyShaderHandles = std::move(m_dirtyShaders); + ShaderManager *shaderManager = m_nodesManager->shaderManager(); + for (const HShader &handle: dirtyShaderHandles) { + Shader *shader = shaderManager->data(handle); + // Compile shader + m_submissionContext->loadShader(shader, shaderManager); + } + } +#endif + { Profiling::GLTimeRecorder recorder(Profiling::TextureUpload); const QVector<HTexture> activeTextureHandles = std::move(m_dirtyTextures); diff --git a/src/render/renderers/opengl/renderer/renderer_p.h b/src/render/renderers/opengl/renderer/renderer_p.h index 1d459a15e..bf9554a54 100644 --- a/src/render/renderers/opengl/renderer/renderer_p.h +++ b/src/render/renderers/opengl/renderer/renderer_p.h @@ -226,7 +226,7 @@ public: // Executed in secondary GL thread - void loadShader(Shader *shader) const override; + void loadShader(Shader *shader, Qt3DRender::Render::HShader shaderHandle) override; void updateGLResources(); @@ -382,6 +382,7 @@ private: QVector<HBuffer> m_dirtyBuffers; QVector<HBuffer> m_downloadableBuffers; + QVector<HShader> m_dirtyShaders; QVector<HTexture> m_dirtyTextures; bool m_ownedContext; |