From 5a23825f017ddebea698f6f81a36bd7ff7edadc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Thu, 25 Aug 2011 20:19:44 +0200 Subject: [PATCH] Introduce new platform capability ThreadedOpenGL. Lets the platform plugin advertise whether it's safe to use OpenGL from a different thread. With XCB we only advertise this if we have a reasonably new XCB libary, as older versions suffer from the xcb_wait_for_reply() blocking bug, which cause GL rendering in a separate to stall when using Mesa drivers. Change-Id: I4829df7e583a1c8aed218ae13a159d21266cc594 Reviewed-on: http://codereview.qt.nokia.com/3613 Reviewed-by: Qt Sanity Bot Reviewed-by: Lars Knoll --- src/gui/kernel/qplatformintegration_qpa.h | 3 ++- src/plugins/platforms/cocoa/qcocoaintegration.mm | 1 + src/plugins/platforms/eglfs/qeglfsintegration.cpp | 2 ++ src/plugins/platforms/kms/qkmsintegration.cpp | 1 + src/plugins/platforms/wayland/qwaylandintegration.cpp | 2 ++ src/plugins/platforms/windows/qwindowsintegration.cpp | 4 ++++ src/plugins/platforms/xcb/qxcbintegration.cpp | 6 ++++++ 7 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/gui/kernel/qplatformintegration_qpa.h b/src/gui/kernel/qplatformintegration_qpa.h index 3c903600f0..97811d45b5 100644 --- a/src/gui/kernel/qplatformintegration_qpa.h +++ b/src/gui/kernel/qplatformintegration_qpa.h @@ -69,7 +69,8 @@ class Q_GUI_EXPORT QPlatformIntegration public: enum Capability { ThreadedPixmaps = 1, - OpenGL = 2 + OpenGL = 2, + ThreadedOpenGL = 3 }; virtual ~QPlatformIntegration() { } diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm index 3e03b1a23d..1ea4561315 100644 --- a/src/plugins/platforms/cocoa/qcocoaintegration.mm +++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm @@ -103,6 +103,7 @@ bool QCocoaIntegration::hasCapability(QPlatformIntegration::Capability cap) cons switch (cap) { case ThreadedPixmaps: return true; case OpenGL : return true; + case ThreadedOpenGL : return true; default: return QPlatformIntegration::hasCapability(cap); } } diff --git a/src/plugins/platforms/eglfs/qeglfsintegration.cpp b/src/plugins/platforms/eglfs/qeglfsintegration.cpp index 442acdf746..8b2346b5fd 100644 --- a/src/plugins/platforms/eglfs/qeglfsintegration.cpp +++ b/src/plugins/platforms/eglfs/qeglfsintegration.cpp @@ -70,6 +70,8 @@ bool QEglFSIntegration::hasCapability(QPlatformIntegration::Capability cap) cons { switch (cap) { case ThreadedPixmaps: return true; + case OpenGL: return true; + case ThreadedOpenGL: return true; default: return QPlatformIntegration::hasCapability(cap); } } diff --git a/src/plugins/platforms/kms/qkmsintegration.cpp b/src/plugins/platforms/kms/qkmsintegration.cpp index 18e305d633..e67f0ec245 100644 --- a/src/plugins/platforms/kms/qkmsintegration.cpp +++ b/src/plugins/platforms/kms/qkmsintegration.cpp @@ -86,6 +86,7 @@ bool QKmsIntegration::hasCapability(QPlatformIntegration::Capability cap) const switch (cap) { case ThreadedPixmaps: return true; case OpenGL: return true; + case ThreadedOpenGL: return true; default: return QPlatformIntegration::hasCapability(cap); } } diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index eefd86dbf1..3ed5f163ff 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -89,6 +89,8 @@ bool QWaylandIntegration::hasCapability(QPlatformIntegration::Capability cap) co #else return false; #endif + case ThreadedOpenGL: + return hasCapability(OpenGL); default: return QPlatformIntegration::hasCapability(cap); } } diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp index 70c6c0b4db..fdcc05abe0 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.cpp +++ b/src/plugins/platforms/windows/qwindowsintegration.cpp @@ -167,6 +167,10 @@ bool QWindowsIntegration::hasCapability(QPlatformIntegration::Capability cap) co switch (cap) { case ThreadedPixmaps: return true; + case OpenGL: + return true; + case ThreadedOpenGL: + return true; default: return QPlatformIntegration::hasCapability(cap); } diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp index 75936b2771..54394c9193 100644 --- a/src/plugins/platforms/xcb/qxcbintegration.cpp +++ b/src/plugins/platforms/xcb/qxcbintegration.cpp @@ -159,6 +159,12 @@ bool QXcbIntegration::hasCapability(QPlatformIntegration::Capability cap) const switch (cap) { case ThreadedPixmaps: return true; case OpenGL: return true; + case ThreadedOpenGL: +#ifdef XCB_POLL_FOR_QUEUED_EVENT + return true; +#else + return false; +#endif default: return QPlatformIntegration::hasCapability(cap); } }