From 43cebede39c9340c29bad6c6a78b76446d54c0db Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Wed, 2 May 2018 18:00:52 +0200 Subject: Avoid locking up on Radeon 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 --- src/render/backend/abstractrenderer_p.h | 3 ++- src/render/renderers/opengl/renderer/renderer.cpp | 26 +++++++++++++++++++++-- src/render/renderers/opengl/renderer/renderer_p.h | 3 ++- tests/auto/render/commons/testrenderer.h | 2 +- 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/render/backend/abstractrenderer_p.h b/src/render/backend/abstractrenderer_p.h index 5fe7031ca..f1bdca7be 100644 --- a/src/render/backend/abstractrenderer_p.h +++ b/src/render/backend/abstractrenderer_p.h @@ -53,6 +53,7 @@ #include #include #include +#include #include #include #include @@ -181,7 +182,7 @@ public: // These commands are executed in a dedicated command thread // More will be added later - virtual void loadShader(Shader *shader) const = 0; + virtual void loadShader(Shader *shader, Qt3DRender::Render::HShader shaderHandle) = 0; }; Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractRenderer::BackendNodeDirtySet) 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 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 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 m_dirtyBuffers; QVector m_downloadableBuffers; + QVector m_dirtyShaders; QVector m_dirtyTextures; bool m_ownedContext; diff --git a/tests/auto/render/commons/testrenderer.h b/tests/auto/render/commons/testrenderer.h index 5e3780afe..466cebe14 100644 --- a/tests/auto/render/commons/testrenderer.h +++ b/tests/auto/render/commons/testrenderer.h @@ -85,7 +85,7 @@ public: void setOpenGLContext(QOpenGLContext *) override {} - void loadShader(Qt3DRender::Render::Shader *) const override {} + void loadShader(Qt3DRender::Render::Shader *, Qt3DRender::Render::HShader) override {} protected: Qt3DRender::Render::AbstractRenderer::BackendNodeDirtySet m_changes; -- cgit v1.2.3