Properly read back the actual format in xcb and xlib plugins.
authorSamuel Rødal <samuel.rodal@nokia.com>
Fri, 10 Feb 2012 09:23:15 +0000 (10:23 +0100)
committerQt by Nokia <qt-info@nokia.com>
Fri, 10 Feb 2012 15:24:47 +0000 (16:24 +0100)
Change-Id: Iccef2c4a87863b93914b84edf3a6015dad5e512a
Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com>
src/platformsupport/glxconvenience/qglxconvenience.cpp
src/platformsupport/glxconvenience/qglxconvenience_p.h
src/plugins/platforms/xcb/qglxintegration.cpp
src/plugins/platforms/xcb/qxcbwindow.cpp
src/plugins/platforms/xcb/qxcbwindow.h
src/plugins/platforms/xlib/qglxintegration.cpp
src/plugins/platforms/xlib/qxlibwindow.cpp
src/plugins/platforms/xlib/qxlibwindow.h

index 11d8a59..f619bf5 100644 (file)
@@ -153,23 +153,28 @@ GLXFBConfig qglx_findConfig(Display *display, int screen , const QSurfaceFormat
 
             XFree(configs);
         }
-        reducedFormat = qglx_reduceSurfaceFormat(reducedFormat,&reduced);
+        if (!chosenConfig)
+            reducedFormat = qglx_reduceSurfaceFormat(reducedFormat,&reduced);
     }
 
     return chosenConfig;
 }
 
-XVisualInfo *qglx_findVisualInfo(Display *display, int screen, const QSurfaceFormat &format)
+XVisualInfo *qglx_findVisualInfo(Display *display, int screen, QSurfaceFormat *format)
 {
+    Q_ASSERT(format);
+
     XVisualInfo *visualInfo = 0;
 
-    GLXFBConfig config = qglx_findConfig(display,screen,format);
-    if (config)
+    GLXFBConfig config = qglx_findConfig(display,screen,*format);
+    if (config) {
         visualInfo = glXGetVisualFromFBConfig(display, config);
+        *format = qglx_surfaceFormatFromGLXFBConfig(display, config);
+    }
 
     // attempt to fall back to glXChooseVisual
     bool reduced = true;
-    QSurfaceFormat reducedFormat = format;
+    QSurfaceFormat reducedFormat = *format;
     while (!visualInfo && reduced) {
         QVarLengthArray<int, 13> attribs;
         attribs.append(GLX_RGBA);
index 6d4cecf..a60f789 100644 (file)
@@ -48,9 +48,9 @@
 #include <X11/Xlib.h>
 #include <GL/glx.h>
 
-XVisualInfo *qglx_findVisualInfo(Display *display, int screen, const QSurfaceFormat &format);
+XVisualInfo *qglx_findVisualInfo(Display *display, int screen, QSurfaceFormat *format);
 GLXFBConfig qglx_findConfig(Display *display, int screen, const QSurfaceFormat &format, int drawableBit = GLX_WINDOW_BIT);
-QSurfaceFormat qglx_surfaceFormatFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext context);
+QSurfaceFormat qglx_surfaceFormatFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext context = 0);
 QVector<int> qglx_buildSpec(const QSurfaceFormat &format, int drawableBit = GLX_WINDOW_BIT);
 QSurfaceFormat qglx_reduceSurfaceFormat(const QSurfaceFormat &format, bool *reduced);
 
index 6ada127..0144caa 100644 (file)
@@ -64,6 +64,7 @@ QGLXContext::QGLXContext(QXcbScreen *screen, const QSurfaceFormat &format, QPlat
     : QPlatformOpenGLContext()
     , m_screen(screen)
     , m_context(0)
+    , m_format(format)
 {
     m_shareContext = 0;
     if (share)
@@ -82,7 +83,7 @@ QGLXContext::QGLXContext(QXcbScreen *screen, const QSurfaceFormat &format, QPlat
         if (m_context)
             m_format = qglx_surfaceFormatFromGLXFBConfig(DISPLAY_FROM_XCB(screen), config, m_context);
     } else {
-        XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen), screen->screenNumber(), format);
+        XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen), screen->screenNumber(), &m_format);
         if (!visualInfo)
             qFatal("Could not initialize GLX");
         m_context = glXCreateContext(DISPLAY_FROM_XCB(screen), visualInfo, m_shareContext, true);
index 959209d..4f05c4c 100644 (file)
@@ -201,19 +201,21 @@ void QXcbWindow::create()
     if (parent())
         xcb_parent_id = static_cast<QXcbWindow *>(parent())->xcb_window();
 
-    m_requestedFormat = window()->format();
+    m_format = window()->requestedFormat();
 
 #if (defined(XCB_USE_GLX) || defined(XCB_USE_EGL)) && defined(XCB_USE_XLIB)
     if (QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL)
-        || window()->format().hasAlpha())
+        || m_format.hasAlpha())
     {
 #if defined(XCB_USE_GLX)
-        XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen),m_screen->screenNumber(), window()->format());
+        XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen), m_screen->screenNumber(), &m_format);
         if (!visualInfo)
             qFatal("Could not initialize GLX");
 #elif defined(XCB_USE_EGL)
         EGLDisplay eglDisplay = connection()->egl_display();
-        EGLConfig eglConfig = q_configFromGLFormat(eglDisplay, window()->format(), true);
+        EGLConfig eglConfig = q_configFromGLFormat(eglDisplay, m_format, true);
+        m_format = q_glFormatFromConfig(eglDisplay, eglConfig);
+
         VisualID id = QXlibEglIntegration::getCompatibleVisualId(DISPLAY_FROM_XCB(this), eglDisplay, eglConfig);
 
         XVisualInfo visualInfoTemplate;
@@ -1167,7 +1169,7 @@ void QXcbWindow::setOrientation(Qt::ScreenOrientation orientation)
 QSurfaceFormat QXcbWindow::format() const
 {
     // ### return actual format
-    return m_requestedFormat;
+    return m_format;
 }
 
 #if defined(XCB_USE_EGL)
index 3cbf9e7..365c8b0 100644 (file)
@@ -155,7 +155,7 @@ private:
     bool m_transparent;
     xcb_window_t m_netWmUserTimeWindow;
 
-    QSurfaceFormat m_requestedFormat;
+    QSurfaceFormat m_format;
 
     mutable bool m_dirtyFrameMargins;
     mutable QMargins m_frameMargins;
index e786893..5162140 100644 (file)
@@ -65,6 +65,7 @@ QGLXContext::QGLXContext(QXlibScreen *screen, const QSurfaceFormat &format, QPla
     : QPlatformOpenGLContext()
     , m_screen(screen)
     , m_context(0)
+    , m_windowFormat(format)
 {
     GLXContext shareGlxContext = 0;
     if (share)
@@ -77,7 +78,7 @@ QGLXContext::QGLXContext(QXlibScreen *screen, const QSurfaceFormat &format, QPla
         m_context = glXCreateNewContext(xDisplay,config,GLX_RGBA_TYPE,shareGlxContext,TRUE);
         m_windowFormat = qglx_surfaceFormatFromGLXFBConfig(xDisplay,config,m_context);
     } else {
-        XVisualInfo *visualInfo = qglx_findVisualInfo(xDisplay, screen->xScreenNumber(), format);
+        XVisualInfo *visualInfo = qglx_findVisualInfo(xDisplay, screen->xScreenNumber(), &m_windowFormat);
         if (!visualInfo)
             qFatal("Could not initialize GLX");
         m_context = glXCreateContext(xDisplay, visualInfo, shareGlxContext, true);
index 635caf8..94c4332 100644 (file)
@@ -82,11 +82,12 @@ QXlibWindow::QXlibWindow(QWindow *window)
     int w = window->width();
     int h = window->height();
 
+    mSurfaceFormat = window->requestedFormat();
+
 #if !defined(QT_NO_OPENGL)
     if(window->surfaceType() == QWindow::OpenGLSurface) {
 #if !defined(QT_OPENGL_ES_2)
-        XVisualInfo *visualInfo = qglx_findVisualInfo(mScreen->display()->nativeDisplay(), mScreen->xScreenNumber(),
-                                                      window->format());
+        XVisualInfo *visualInfo = qglx_findVisualInfo(mScreen->display()->nativeDisplay(), mScreen->xScreenNumber(), &mSurfaceFormat);
         if (!visualInfo)
             qFatal("Could not initialize GLX");
 #else
@@ -694,7 +695,7 @@ void QXlibWindow::setCursor(const Cursor &cursor)
 
 QSurfaceFormat QXlibWindow::format() const
 {
-    return window()->format();
+    return mSurfaceFormat;
 }
 
 
index 8287f3a..6b9e2d6 100644 (file)
@@ -143,6 +143,8 @@ private:
     QImage::Format mFormat;
     Visual* mVisual;
 
+    QSurfaceFormat mSurfaceFormat;
+
     GC createGC();
 
     QPlatformOpenGLContext *mGLContext;