summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/platformsupport/glxconvenience/qglxconvenience.cpp15
-rw-r--r--src/platformsupport/glxconvenience/qglxconvenience_p.h4
-rw-r--r--src/plugins/platforms/xcb/qglxintegration.cpp3
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp12
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.h2
-rw-r--r--src/plugins/platforms/xlib/qglxintegration.cpp3
-rw-r--r--src/plugins/platforms/xlib/qxlibwindow.cpp7
-rw-r--r--src/plugins/platforms/xlib/qxlibwindow.h2
8 files changed, 30 insertions, 18 deletions
diff --git a/src/platformsupport/glxconvenience/qglxconvenience.cpp b/src/platformsupport/glxconvenience/qglxconvenience.cpp
index 11d8a5901f..f619bf53b8 100644
--- a/src/platformsupport/glxconvenience/qglxconvenience.cpp
+++ b/src/platformsupport/glxconvenience/qglxconvenience.cpp
@@ -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);
diff --git a/src/platformsupport/glxconvenience/qglxconvenience_p.h b/src/platformsupport/glxconvenience/qglxconvenience_p.h
index 6d4cecfbe6..a60f789a85 100644
--- a/src/platformsupport/glxconvenience/qglxconvenience_p.h
+++ b/src/platformsupport/glxconvenience/qglxconvenience_p.h
@@ -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);
diff --git a/src/plugins/platforms/xcb/qglxintegration.cpp b/src/plugins/platforms/xcb/qglxintegration.cpp
index 6ada127beb..0144caae3d 100644
--- a/src/plugins/platforms/xcb/qglxintegration.cpp
+++ b/src/plugins/platforms/xcb/qglxintegration.cpp
@@ -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);
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 959209dd33..4f05c4cf5a 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -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)
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
index 3cbf9e7e0d..365c8b0549 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.h
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
@@ -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;
diff --git a/src/plugins/platforms/xlib/qglxintegration.cpp b/src/plugins/platforms/xlib/qglxintegration.cpp
index e78689374a..51621408b9 100644
--- a/src/plugins/platforms/xlib/qglxintegration.cpp
+++ b/src/plugins/platforms/xlib/qglxintegration.cpp
@@ -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);
diff --git a/src/plugins/platforms/xlib/qxlibwindow.cpp b/src/plugins/platforms/xlib/qxlibwindow.cpp
index 635caf81f8..94c4332e65 100644
--- a/src/plugins/platforms/xlib/qxlibwindow.cpp
+++ b/src/plugins/platforms/xlib/qxlibwindow.cpp
@@ -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;
}
diff --git a/src/plugins/platforms/xlib/qxlibwindow.h b/src/plugins/platforms/xlib/qxlibwindow.h
index 8287f3a8a2..6b9e2d63bd 100644
--- a/src/plugins/platforms/xlib/qxlibwindow.h
+++ b/src/plugins/platforms/xlib/qxlibwindow.h
@@ -143,6 +143,8 @@ private:
QImage::Format mFormat;
Visual* mVisual;
+ QSurfaceFormat mSurfaceFormat;
+
GC createGC();
QPlatformOpenGLContext *mGLContext;