Fixed non-GL applications crashing when GLX/EGL initialization fails on xcb.
Change-Id: I5a08d6067272575aa56074aaebe308c3d49299bb Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
This commit is contained in:
parent
1ed8251667
commit
015a5e0dca
@ -238,7 +238,7 @@ void QXcbWindow::create()
|
|||||||
{
|
{
|
||||||
#if defined(XCB_USE_GLX)
|
#if defined(XCB_USE_GLX)
|
||||||
XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen), m_screen->screenNumber(), &m_format);
|
XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen), m_screen->screenNumber(), &m_format);
|
||||||
if (!visualInfo)
|
if (!visualInfo && window()->surfaceType() == QSurface::OpenGLSurface)
|
||||||
qFatal("Could not initialize GLX");
|
qFatal("Could not initialize GLX");
|
||||||
#elif defined(XCB_USE_EGL)
|
#elif defined(XCB_USE_EGL)
|
||||||
EGLDisplay eglDisplay = connection()->egl_display();
|
EGLDisplay eglDisplay = connection()->egl_display();
|
||||||
@ -254,26 +254,30 @@ void QXcbWindow::create()
|
|||||||
XVisualInfo *visualInfo;
|
XVisualInfo *visualInfo;
|
||||||
int matchingCount = 0;
|
int matchingCount = 0;
|
||||||
visualInfo = XGetVisualInfo(DISPLAY_FROM_XCB(this), VisualIDMask, &visualInfoTemplate, &matchingCount);
|
visualInfo = XGetVisualInfo(DISPLAY_FROM_XCB(this), VisualIDMask, &visualInfoTemplate, &matchingCount);
|
||||||
if (!visualInfo)
|
if (!visualInfo && window()->surfaceType() == QSurface::OpenGLSurface)
|
||||||
qFatal("Could not initialize EGL");
|
qFatal("Could not initialize EGL");
|
||||||
#endif //XCB_USE_GLX
|
#endif //XCB_USE_GLX
|
||||||
m_depth = visualInfo->depth;
|
if (visualInfo) {
|
||||||
m_imageFormat = imageFormatForDepth(m_depth);
|
m_depth = visualInfo->depth;
|
||||||
Colormap cmap = XCreateColormap(DISPLAY_FROM_XCB(this), xcb_parent_id, visualInfo->visual, AllocNone);
|
m_imageFormat = imageFormatForDepth(m_depth);
|
||||||
|
Colormap cmap = XCreateColormap(DISPLAY_FROM_XCB(this), xcb_parent_id, visualInfo->visual, AllocNone);
|
||||||
|
|
||||||
XSetWindowAttributes a;
|
XSetWindowAttributes a;
|
||||||
a.background_pixel = WhitePixel(DISPLAY_FROM_XCB(this), m_screen->screenNumber());
|
a.background_pixel = WhitePixel(DISPLAY_FROM_XCB(this), m_screen->screenNumber());
|
||||||
a.border_pixel = BlackPixel(DISPLAY_FROM_XCB(this), m_screen->screenNumber());
|
a.border_pixel = BlackPixel(DISPLAY_FROM_XCB(this), m_screen->screenNumber());
|
||||||
a.colormap = cmap;
|
a.colormap = cmap;
|
||||||
|
|
||||||
m_visualId = visualInfo->visualid;
|
m_visualId = visualInfo->visualid;
|
||||||
|
|
||||||
m_window = XCreateWindow(DISPLAY_FROM_XCB(this), xcb_parent_id, rect.x(), rect.y(), rect.width(), rect.height(),
|
m_window = XCreateWindow(DISPLAY_FROM_XCB(this), xcb_parent_id, rect.x(), rect.y(), rect.width(), rect.height(),
|
||||||
0, visualInfo->depth, InputOutput, visualInfo->visual,
|
0, visualInfo->depth, InputOutput, visualInfo->visual,
|
||||||
CWBackPixel|CWBorderPixel|CWColormap, &a);
|
CWBackPixel|CWBorderPixel|CWColormap, &a);
|
||||||
|
|
||||||
XFree(visualInfo);
|
XFree(visualInfo);
|
||||||
} else
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_window)
|
||||||
#endif //defined(XCB_USE_GLX) || defined(XCB_USE_EGL)
|
#endif //defined(XCB_USE_GLX) || defined(XCB_USE_EGL)
|
||||||
{
|
{
|
||||||
m_window = xcb_generate_id(xcb_connection());
|
m_window = xcb_generate_id(xcb_connection());
|
||||||
@ -409,6 +413,7 @@ void QXcbWindow::destroy()
|
|||||||
}
|
}
|
||||||
connection()->removeWindow(m_window);
|
connection()->removeWindow(m_window);
|
||||||
Q_XCB_CALL(xcb_destroy_window(xcb_connection(), m_window));
|
Q_XCB_CALL(xcb_destroy_window(xcb_connection(), m_window));
|
||||||
|
m_window = 0;
|
||||||
}
|
}
|
||||||
m_mapped = false;
|
m_mapped = false;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user