Merge pull request #15519 from hyperlogic/bug-fix/master-shared-object-deadlock

SharedObject::onRender deadlock fix
This commit is contained in:
Shannon Romano 2019-05-07 11:54:17 -07:00 committed by GitHub
commit 3877a359fd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 24 additions and 8 deletions

View file

@ -31,6 +31,10 @@ bool RenderEventHandler::event(QEvent* e) {
onRender(); onRender();
return true; return true;
case OffscreenEvent::RenderSync:
onRenderSync();
return true;
case OffscreenEvent::Initialize: case OffscreenEvent::Initialize:
onInitalize(); onInitalize();
return true; return true;
@ -106,6 +110,14 @@ void RenderEventHandler::resize() {
} }
void RenderEventHandler::onRender() { void RenderEventHandler::onRender() {
qmlRender(false);
}
void RenderEventHandler::onRenderSync() {
qmlRender(true);
}
void RenderEventHandler::qmlRender(bool sceneGraphSync) {
if (_shared->isQuit()) { if (_shared->isQuit()) {
return; return;
} }
@ -117,7 +129,8 @@ void RenderEventHandler::onRender() {
PROFILE_RANGE(render_qml_gl, __FUNCTION__); PROFILE_RANGE(render_qml_gl, __FUNCTION__);
gl::globalLock(); gl::globalLock();
if (!_shared->preRender()) { if (!_shared->preRender(sceneGraphSync)) {
gl::globalRelease();
return; return;
} }

View file

@ -25,6 +25,7 @@ public:
enum Type { enum Type {
Initialize = QEvent::User + 1, Initialize = QEvent::User + 1,
Render, Render,
RenderSync,
Quit Quit
}; };
@ -45,6 +46,8 @@ private:
void onInitalize(); void onInitalize();
void resize(); void resize();
void onRender(); void onRender();
void onRenderSync();
void qmlRender(bool sceneGraphSync);
void onQuit(); void onQuit();
SharedObject* const _shared; SharedObject* const _shared;
@ -59,4 +62,4 @@ private:
}}} // namespace hifi::qml::impl }}} // namespace hifi::qml::impl
#endif #endif

View file

@ -344,17 +344,17 @@ void SharedObject::setSize(const QSize& size) {
#endif #endif
} }
bool SharedObject::preRender() { bool SharedObject::preRender(bool sceneGraphSync) {
#ifndef DISABLE_QML #ifndef DISABLE_QML
QMutexLocker lock(&_mutex); QMutexLocker lock(&_mutex);
if (_paused) { if (_paused) {
if (_syncRequested) { if (sceneGraphSync) {
wake(); wake();
} }
return false; return false;
} }
if (_syncRequested) { if (sceneGraphSync) {
bool syncResult = true; bool syncResult = true;
if (!nsightActive()) { if (!nsightActive()) {
PROFILE_RANGE(render_qml_gl, "sync") PROFILE_RANGE(render_qml_gl, "sync")
@ -364,7 +364,6 @@ bool SharedObject::preRender() {
if (!syncResult) { if (!syncResult) {
return false; return false;
} }
_syncRequested = false;
} }
#endif #endif
@ -475,9 +474,10 @@ void SharedObject::onRender() {
lock.unlock(); lock.unlock();
_renderControl->polishItems(); _renderControl->polishItems();
lock.relock(); lock.relock();
QCoreApplication::postEvent(_renderObject, new OffscreenEvent(OffscreenEvent::Render)); QCoreApplication::postEvent(_renderObject, new OffscreenEvent(OffscreenEvent::RenderSync));
// sync and render request, main and render threads must be synchronized // sync and render request, main and render threads must be synchronized
wait(); wait();
_syncRequested = false;
} else { } else {
QCoreApplication::postEvent(_renderObject, new OffscreenEvent(OffscreenEvent::Render)); QCoreApplication::postEvent(_renderObject, new OffscreenEvent(OffscreenEvent::Render));
} }

View file

@ -71,7 +71,7 @@ public:
private: private:
bool event(QEvent* e) override; bool event(QEvent* e) override;
bool preRender(); bool preRender(bool sceneGraphSync);
void shutdownRendering(OffscreenGLCanvas& canvas, const QSize& size); void shutdownRendering(OffscreenGLCanvas& canvas, const QSize& size);
// Called by the render event handler, from the render thread // Called by the render event handler, from the render thread
void initializeRenderControl(QOpenGLContext* context); void initializeRenderControl(QOpenGLContext* context);