From 2b0e52757c9dedd95ca676e72c7d00adcdffc3dd Mon Sep 17 00:00:00 2001 From: Andy Nichols Date: Tue, 16 Aug 2016 16:54:16 +0200 Subject: Disable switchable widget compositing when using XCB in Parallels VM The Parallels 3D hardware acceleration does not seem to play nice with Qt Creator when switching between tabs that have OpenGL Qt Quick Content and those that have just raster widget content. QWidgetBackingstore has the ability to switch how content is flushed depending on if the SwitchableWidgetComposition capability is available. Previously for XCB it was always enabled, but should be disabled when using the GLX integration for the Parallels VM. Change-Id: I42e41456e0873f6780f5d0333dbfaaf8fcce4a5e Task-number: QTCREATORBUG-16742 Reviewed-by: Laszlo Agocs --- .../xcb/gl_integrations/qxcbglintegration.h | 1 + .../gl_integrations/xcb_glx/qxcbglxintegration.cpp | 21 +++++++++++++++++++++ .../gl_integrations/xcb_glx/qxcbglxintegration.h | 1 + 3 files changed, 23 insertions(+) (limited to 'src/plugins/platforms/xcb/gl_integrations') diff --git a/src/plugins/platforms/xcb/gl_integrations/qxcbglintegration.h b/src/plugins/platforms/xcb/gl_integrations/qxcbglintegration.h index 74c117582a..e023833826 100644 --- a/src/plugins/platforms/xcb/gl_integrations/qxcbglintegration.h +++ b/src/plugins/platforms/xcb/gl_integrations/qxcbglintegration.h @@ -54,6 +54,7 @@ public: virtual bool initialize(QXcbConnection *connection) = 0; virtual bool supportsThreadedOpenGL() const { return false; } + virtual bool supportsSwitchableWidgetComposition() const { return true; } virtual bool handleXcbEvent(xcb_generic_event_t *event, uint responseType); virtual QXcbWindow *createWindow(QWindow *window) const = 0; diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.cpp index 55d0ff38b7..d49739159a 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.cpp +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.cpp @@ -218,5 +218,26 @@ bool QXcbGlxIntegration::supportsThreadedOpenGL() const return QGLXContext::supportsThreading(); } +bool QXcbGlxIntegration::supportsSwitchableWidgetComposition() const +{ + static bool vendorChecked = false; + static bool isSwitchableWidgetCompositionAvailable = true; + if (!vendorChecked) { + vendorChecked = true; + Display *display = glXGetCurrentDisplay(); +#ifdef XCB_USE_XLIB + if (!display) + display = static_cast(m_connection->xlib_display()); +#endif + const char *glxvendor = glXGetClientString(display, GLX_VENDOR); + if (glxvendor) { + if (!strcmp(glxvendor, "Parallels Inc")) + isSwitchableWidgetCompositionAvailable = false; + } + } + + return isSwitchableWidgetCompositionAvailable; +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.h b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.h index 4366d07b42..7212fcf3ed 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.h +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.h @@ -54,6 +54,7 @@ public: QPlatformOffscreenSurface *createPlatformOffscreenSurface(QOffscreenSurface *surface) const Q_DECL_OVERRIDE; virtual bool supportsThreadedOpenGL() const Q_DECL_OVERRIDE; + virtual bool supportsSwitchableWidgetComposition() const Q_DECL_OVERRIDE; private: QXcbConnection *m_connection; -- cgit v1.2.3