mirror of
https://github.com/overte-org/overte.git
synced 2025-04-12 18:42:12 +02:00
Merge pull request #15519 from hyperlogic/bug-fix/master-shared-object-deadlock
SharedObject::onRender deadlock fix
This commit is contained in:
commit
3877a359fd
4 changed files with 24 additions and 8 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue