Commit 3f1245aa authored by Gunnar Sletta's avatar Gunnar Sletta Committed by The Qt Project
Browse files

Enforce window rendering in sequence on llvmpipe.


When rendering multiple windows in parallel on llvmpipe we end up with
crashes deep inside llvmpipe as multiple threads seem to access
unprotected resources. Work around this bug by enforcing that scene
graph rendering happens on one window at a time.

Task-number: QTCREATORBUG-10666
Change-Id: I2f734e8f653b2a9b4108eb189280ab922581e2c0
Reviewed-by: default avatarKai Koehne <kai.koehne@digia.com>
parent 8ae390e7
Branches
Tags
No related merge requests found
Showing with 13 additions and 0 deletions
......@@ -340,6 +340,7 @@ QSGRenderContext::QSGRenderContext(QSGContext *context)
, m_depthStencilManager(0)
, m_distanceFieldCacheManager(0)
, m_brokenIBOs(false)
, m_serializedRender(false)
{
}
......@@ -348,8 +349,13 @@ QSGRenderContext::~QSGRenderContext()
invalidate();
}
static QBasicMutex qsg_framerender_mutex;
void QSGRenderContext::renderNextFrame(QSGRenderer *renderer, GLuint fboId)
{
if (m_serializedRender)
qsg_framerender_mutex.lock();
if (fboId) {
QSGBindableFboId bindable(fboId);
renderer->renderScene(bindable);
......@@ -357,6 +363,9 @@ void QSGRenderContext::renderNextFrame(QSGRenderer *renderer, GLuint fboId)
renderer->renderScene();
}
if (m_serializedRender)
qsg_framerender_mutex.unlock();
}
/*!
......@@ -442,6 +451,9 @@ void QSGRenderContext::initialize(QOpenGLContext *context)
const char *vendor = (const char *) glGetString(GL_VENDOR);
if (strstr(vendor, "nouveau"))
m_brokenIBOs = true;
const char *renderer = (const char *) glGetString(GL_RENDERER);
if (strstr(renderer, "llvmpipe"))
m_serializedRender = true;
#endif
emit initialized();
......
......@@ -132,6 +132,7 @@ protected:
QSet<QFontEngine *> m_fontEnginesToClean;
bool m_brokenIBOs;
bool m_serializedRender;
};
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment