Properly read back the actual format in xcb and xlib plugins.
Change-Id: Iccef2c4a87863b93914b84edf3a6015dad5e512a Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com>
This commit is contained in:
parent
7dca7c3c57
commit
38257651b7
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -143,6 +143,8 @@ private:
|
||||
QImage::Format mFormat;
|
||||
Visual* mVisual;
|
||||
|
||||
QSurfaceFormat mSurfaceFormat;
|
||||
|
||||
GC createGC();
|
||||
|
||||
QPlatformOpenGLContext *mGLContext;
|
||||
|
Loading…
Reference in New Issue
Block a user