summaryrefslogtreecommitdiffstats
path: root/src/render/renderers/opengl/renderer/renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/renderers/opengl/renderer/renderer.cpp')
-rw-r--r--src/render/renderers/opengl/renderer/renderer.cpp26
1 files changed, 24 insertions, 2 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);