Fix issue sharing OpenGL context from render thread on OS X

On OS X when running in QtQuick 2 examples in debug mode we fail an
assert because we try to set a dynamic property using
QObject::setProperty from the render thread, while the object exists in
the main thread.  Now we call setProperty from the correct thread.

Change-Id: I3f26ead0f68fadcded472bf5c9014a4025f0a03e
Reviewed-by: Christian Stromme <christian.stromme@digia.com>
Reviewed-by: Jason Barron <jason.barron@digia.com>
This commit is contained in:
Andy Nichols
2012-10-08 17:37:44 +02:00
committed by The Qt Project
parent 13ce3d921a
commit bc7e9fe7c7
2 changed files with 24 additions and 1 deletions

View File

@@ -171,7 +171,7 @@ QSGNode *QDeclarativeVideoRendererBackend::updatePaintNode(QSGNode *oldNode,
if (!m_glContext) {
m_glContext = QOpenGLContext::currentContext();
m_surface->setProperty("GLContext", QVariant::fromValue<QObject*>(m_glContext));
m_surface->scheduleOpenGLContextUpdate();
}
if (m_frameChanged) {
@@ -223,6 +223,11 @@ QAbstractVideoSurface *QDeclarativeVideoRendererBackend::videoSurface() const
return m_surface;
}
QOpenGLContext *QDeclarativeVideoRendererBackend::glContext() const
{
return m_glContext;
}
void QDeclarativeVideoRendererBackend::present(const QVideoFrame &frame)
{
m_frameMutex.lock();
@@ -287,4 +292,16 @@ bool QSGVideoItemSurface::present(const QVideoFrame &frame)
return true;
}
void QSGVideoItemSurface::scheduleOpenGLContextUpdate()
{
//This method is called from render thread
QMetaObject::invokeMethod(this, "updateOpenGLContext");
}
void QSGVideoItemSurface::updateOpenGLContext()
{
//Set a dynamic property to access the OpenGL context in Qt Quick render thread.
this->setProperty("GLContext", QVariant::fromValue<QObject*>(m_backend->glContext()));
}
QT_END_NAMESPACE