summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2018-05-02 18:00:52 +0200
committerAntti Kokko <antti.kokko@qt.io>2018-05-04 12:00:29 +0000
commit43cebede39c9340c29bad6c6a78b76446d54c0db (patch)
treec6b9107da502d3c73d0aa1137532bd040e4bca71
parent7f0bdc21a8f1a5fbe2afdba61f037a71f00c1d61 (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>
-rw-r--r--src/render/backend/abstractrenderer_p.h3
-rw-r--r--src/render/renderers/opengl/renderer/renderer.cpp26
-rw-r--r--src/render/renderers/opengl/renderer/renderer_p.h3
-rw-r--r--tests/auto/render/commons/testrenderer.h2
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 <QtCore/qflags.h>
#include <QtCore/qmutex.h>
#include <Qt3DRender/private/qt3drender_global_p.h>
+#include <Qt3DRender/private/handle_types_p.h>
#include <Qt3DCore/qaspectjob.h>
#include <Qt3DCore/qnodeid.h>
#include <QtGui/qsurfaceformat.h>
@@ -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<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;
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;