summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/xcb
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/xcb')
-rw-r--r--src/plugins/platforms/xcb/qglxintegration.cpp51
-rw-r--r--src/plugins/platforms/xcb/qglxintegration.h28
-rw-r--r--src/plugins/platforms/xcb/qxcbintegration.cpp17
-rw-r--r--src/plugins/platforms/xcb/qxcbintegration.h1
-rw-r--r--src/plugins/platforms/xcb/qxcbnativeinterface.cpp6
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp42
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.h7
7 files changed, 85 insertions, 67 deletions
diff --git a/src/plugins/platforms/xcb/qglxintegration.cpp b/src/plugins/platforms/xcb/qglxintegration.cpp
index 24d5d69ac7..67791080d5 100644
--- a/src/plugins/platforms/xcb/qglxintegration.cpp
+++ b/src/plugins/platforms/xcb/qglxintegration.cpp
@@ -50,7 +50,7 @@
#include <X11/Xutil.h>
#include <GL/glx.h>
-#include <QtGui/QWindowContext>
+#include <QtGui/QGuiGLContext>
#include "qglxintegration.h"
#include "qglxconvenience.h"
@@ -59,60 +59,61 @@
#include <dlfcn.h>
#endif
-QGLXContext::QGLXContext(Window window, QXcbScreen *screen, const QWindowFormat &format)
+QGLXSurface::QGLXSurface(GLXDrawable drawable, const QGuiGLFormat &format)
+ : QPlatformGLSurface(format)
+ , glxDrawable(drawable)
+{
+}
+
+QGLXContext::QGLXContext(QXcbScreen *screen, const QGuiGLFormat &format, QPlatformGLContext *share)
: QPlatformGLContext()
, m_screen(screen)
- , m_drawable((Drawable)window)
, m_context(0)
{
Q_XCB_NOOP(m_screen->connection());
- const QWindowContext *shareContext = format.sharedContext();
GLXContext shareGlxContext = 0;
- if (shareContext)
- shareGlxContext = static_cast<const QGLXContext*>(shareContext->handle())->glxContext();
+ if (share)
+ shareGlxContext = static_cast<const QGLXContext*>(share)->glxContext();
GLXFBConfig config = qglx_findConfig(DISPLAY_FROM_XCB(screen),screen->screenNumber(),format);
m_context = glXCreateNewContext(DISPLAY_FROM_XCB(screen), config, GLX_RGBA_TYPE, shareGlxContext, TRUE);
- m_windowFormat = qglx_platformWindowFromGLXFBConfig(DISPLAY_FROM_XCB(screen), config, m_context);
+ m_format = qglx_guiGLFormatFromGLXFBConfig(DISPLAY_FROM_XCB(screen), config, m_context);
Q_XCB_NOOP(m_screen->connection());
}
-QGLXContext::QGLXContext(QXcbScreen *screen, Drawable drawable, GLXContext context)
- : QPlatformGLContext(), m_screen(screen), m_drawable(drawable), m_context(context)
-{
-
-}
-
QGLXContext::~QGLXContext()
{
Q_XCB_NOOP(m_screen->connection());
- if (m_context)
- glXDestroyContext(DISPLAY_FROM_XCB(m_screen), m_context);
+ glXDestroyContext(DISPLAY_FROM_XCB(m_screen), m_context);
Q_XCB_NOOP(m_screen->connection());
}
-void QGLXContext::makeCurrent()
+bool QGLXContext::makeCurrent(const QPlatformGLSurface &surface)
{
Q_XCB_NOOP(m_screen->connection());
- glXMakeCurrent(DISPLAY_FROM_XCB(m_screen), m_drawable, m_context);
+
+ GLXDrawable glxSurface = static_cast<const QGLXSurface &>(surface).glxDrawable;
+
+ bool result = glXMakeCurrent(DISPLAY_FROM_XCB(m_screen), glxSurface, m_context);
+
Q_XCB_NOOP(m_screen->connection());
+ return result;
}
void QGLXContext::doneCurrent()
{
- Q_XCB_NOOP(m_screen->connection());
glXMakeCurrent(DISPLAY_FROM_XCB(m_screen), 0, 0);
- Q_XCB_NOOP(m_screen->connection());
}
-void QGLXContext::swapBuffers()
+void QGLXContext::swapBuffers(const QPlatformGLSurface &drawable)
{
Q_XCB_NOOP(m_screen->connection());
- glXSwapBuffers(DISPLAY_FROM_XCB(m_screen), m_drawable);
+ GLXDrawable glxDrawable = static_cast<const QGLXSurface &>(drawable).glxDrawable;
+ glXSwapBuffers(DISPLAY_FROM_XCB(m_screen), glxDrawable);
Q_XCB_NOOP(m_screen->connection());
}
-void* QGLXContext::getProcAddress(const QString& procName)
+void (*QGLXContext::getProcAddress(const QByteArray &procName)) ()
{
Q_XCB_NOOP(m_screen->connection());
typedef void *(*qt_glXGetProcAddressARB)(const GLubyte *);
@@ -143,10 +144,10 @@ void* QGLXContext::getProcAddress(const QString& procName)
}
if (!glXGetProcAddressARB)
return 0;
- return glXGetProcAddressARB(reinterpret_cast<const GLubyte *>(procName.toLatin1().data()));
+ return (void (*)())glXGetProcAddressARB(reinterpret_cast<const GLubyte *>(procName.constData()));
}
-QWindowFormat QGLXContext::windowFormat() const
+QGuiGLFormat QGLXContext::format() const
{
- return m_windowFormat;
+ return m_format;
}
diff --git a/src/plugins/platforms/xcb/qglxintegration.h b/src/plugins/platforms/xcb/qglxintegration.h
index 1760521d47..ae95e23b81 100644
--- a/src/plugins/platforms/xcb/qglxintegration.h
+++ b/src/plugins/platforms/xcb/qglxintegration.h
@@ -45,34 +45,38 @@
#include "qxcbwindow.h"
#include <QtGui/QPlatformGLContext>
-#include <QtGui/QWindowFormat>
+#include <QtGui/QGuiGLFormat>
#include <QtCore/QMutex>
#include <GL/glx.h>
+class QGLXSurface : public QPlatformGLSurface
+{
+public:
+ QGLXSurface(GLXDrawable drawable, const QGuiGLFormat &format);
+ GLXDrawable glxDrawable;
+};
+
class QGLXContext : public QPlatformGLContext
{
public:
- QGLXContext(Window window, QXcbScreen *xd, const QWindowFormat &format);
+ QGLXContext(QXcbScreen *xd, const QGuiGLFormat &format, QPlatformGLContext *share);
~QGLXContext();
- virtual void makeCurrent();
- virtual void doneCurrent();
- virtual void swapBuffers();
- virtual void* getProcAddress(const QString& procName);
+ bool makeCurrent(const QPlatformGLSurface &surface);
+ void doneCurrent();
+ void swapBuffers(const QPlatformGLSurface &surface);
+ void (*getProcAddress(const QByteArray &procName)) ();
- GLXContext glxContext() const { return m_context; }
+ QGuiGLFormat format() const;
- QWindowFormat windowFormat() const;
+ GLXContext glxContext() const { return m_context; }
private:
QXcbScreen *m_screen;
- Drawable m_drawable;
GLXContext m_context;
- QWindowFormat m_windowFormat;
-
- QGLXContext (QXcbScreen *screen, Drawable drawable, GLXContext context);
+ QGuiGLFormat m_format;
};
#endif
diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp
index aa11ba5cb0..bd1924def9 100644
--- a/src/plugins/platforms/xcb/qxcbintegration.cpp
+++ b/src/plugins/platforms/xcb/qxcbintegration.cpp
@@ -63,6 +63,12 @@
#include <EGL/egl.h>
#endif
+#if defined(XCB_USE_GLX)
+#include "qglxintegration.h"
+#elif defined(XCB_USE_EGL)
+#include "../eglconvenience/qeglplatformcontext.h"
+#endif
+
QXcbIntegration::QXcbIntegration()
: m_connection(new QXcbConnection), m_printerSupport(new QGenericUnixPrinterSupport)
{
@@ -97,6 +103,17 @@ QPlatformWindow *QXcbIntegration::createPlatformWindow(QWindow *window) const
return new QXcbWindow(window);
}
+QPlatformGLContext *QXcbIntegration::createPlatformGLContext(const QGuiGLFormat &glFormat, QPlatformGLContext *share) const
+{
+#if defined(XCB_USE_GLX)
+ return new QGLXContext(static_cast<QXcbScreen *>(m_screens.at(0)), glFormat, share);
+#elif defined(XCB_USE_EGL)
+ return new QEGLPlatformContext(glFormat, share, m_connection->egl_display());
+#elif defined(XCB_USE_DRI2)
+ return new QDri2Context(glFormat, share);
+#endif
+}
+
QWindowSurface *QXcbIntegration::createWindowSurface(QWindow *window, WId winId) const
{
Q_UNUSED(winId);
diff --git a/src/plugins/platforms/xcb/qxcbintegration.h b/src/plugins/platforms/xcb/qxcbintegration.h
index 1c1ca24094..d931e2a787 100644
--- a/src/plugins/platforms/xcb/qxcbintegration.h
+++ b/src/plugins/platforms/xcb/qxcbintegration.h
@@ -58,6 +58,7 @@ public:
bool hasCapability(Capability cap) const;
QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
QPlatformWindow *createPlatformWindow(QWindow *window) const;
+ QPlatformGLContext *createPlatformGLContext(const QGuiGLFormat &glFormat, QPlatformGLContext *share) const;
QWindowSurface *createWindowSurface(QWindow *window, WId winId) const;
QList<QPlatformScreen *> screens() const;
diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
index 43f93d07bc..bf8ca2a584 100644
--- a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
+++ b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
@@ -48,7 +48,7 @@
#include <QtCore/QDebug>
-#include <QtGui/qwindowcontext_qpa.h>
+#include <QtGui/qguiglcontext_qpa.h>
#if defined(XCB_USE_EGL)
#include "../eglconvenience/qeglplatformcontext.h"
@@ -163,6 +163,7 @@ void *QXcbNativeInterface::graphicsDeviceForWindow(QWindow *window)
void * QXcbNativeInterface::eglContextForWindow(QWindow *window)
{
+#if 0
Q_ASSERT(window);
QPlatformGLContext *platformContext = window->glContext()->handle();
if (!platformContext) {
@@ -179,4 +180,7 @@ void * QXcbNativeInterface::eglContextForWindow(QWindow *window)
#else
return 0;
#endif
+#else
+ return 0;
+#endif
}
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index de48c83cd1..22a476b690 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -95,7 +95,6 @@ static inline bool isTransient(const QWindow *w)
QXcbWindow::QXcbWindow(QWindow *window)
: QPlatformWindow(window)
, m_window(0)
- , m_context(0)
, m_syncCounter(0)
, m_mapped(false)
, m_netWmUserTimeWindow(XCB_NONE)
@@ -157,14 +156,14 @@ void QXcbWindow::create()
#if defined(XCB_USE_GLX) || defined(XCB_USE_EGL)
if ((window()->surfaceType() == QWindow::OpenGLSurface
&& QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL))
- || window()->requestedWindowFormat().hasAlpha())
+ || window()->glFormat().hasAlpha())
{
#if defined(XCB_USE_GLX)
- XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen),m_screen->screenNumber(), window()->requestedWindowFormat());
+ XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen),m_screen->screenNumber(), window()->glFormat());
#elif defined(XCB_USE_EGL)
EGLDisplay eglDisplay = connection()->egl_display();
- EGLConfig eglConfig = q_configFromQWindowFormat(eglDisplay,window()->requestedWindowFormat(),true);
+ EGLConfig eglConfig = q_configFromGLFormat(eglDisplay, window()->glFormat(), true);
VisualID id = QXlibEglIntegration::getCompatibleVisualId(DISPLAY_FROM_XCB(this), eglDisplay, eglConfig);
XVisualInfo visualInfoTemplate;
@@ -283,7 +282,6 @@ QXcbWindow::~QXcbWindow()
void QXcbWindow::destroy()
{
- delete m_context;
if (m_syncCounter && m_screen->syncRequestSupported())
Q_XCB_CALL(xcb_sync_destroy_counter(xcb_connection(), m_syncCounter));
if (m_window) {
@@ -936,33 +934,27 @@ void QXcbWindow::requestActivateWindow()
connection()->sync();
}
-QPlatformGLContext *QXcbWindow::glContext() const
+QPlatformGLSurface *QXcbWindow::createGLSurface() const
{
if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL)) {
- printf("no opengl\n");
+ qWarning() << "QXcb::createGLSurface() called without OpenGL support";
return 0;
}
- if (!m_context) {
+
+ QGuiGLFormat format = window()->glFormat();
+
#if defined(XCB_USE_GLX)
- QXcbWindow *that = const_cast<QXcbWindow *>(this);
- that->m_context = new QGLXContext(m_window, m_screen, window()->requestedWindowFormat());
+ return new QGLXSurface(m_window, format);
#elif defined(XCB_USE_EGL)
- EGLDisplay display = connection()->egl_display();
- EGLConfig config = q_configFromQWindowFormat(display,window()->requestedWindowFormat(),true);
- QVector<EGLint> eglContextAttrs;
- eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
- eglContextAttrs.append(2);
- eglContextAttrs.append(EGL_NONE);
-
- EGLSurface eglSurface = eglCreateWindowSurface(display,config,(EGLNativeWindowType)m_window,0);
- QXcbWindow *that = const_cast<QXcbWindow *>(this);
- that->m_context = new QEGLPlatformContext(display, config, eglContextAttrs.data(), eglSurface, EGL_OPENGL_ES_API);
-#elif defined(XCB_USE_DRI2)
- QXcbWindow *that = const_cast<QXcbWindow *>(this);
- that->m_context = new QDri2Context(that);
+ EGLDisplay display = connection()->egl_display();
+ EGLConfig config = q_configFromGLFormat(display, format, true);
+
+ EGLSurface eglSurface = eglCreateWindowSurface(display, config, (EGLNativeWindowType)m_window, 0);
+
+ return new QEGLSurface(eglSurface, window()->glFormat());
+#else
+ return 0;
#endif
- }
- return m_context;
}
void QXcbWindow::handleExposeEvent(const xcb_expose_event_t *event)
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
index f6869c7937..f50a611b4e 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.h
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
@@ -43,7 +43,7 @@
#define QXCBWINDOW_H
#include <QtGui/QPlatformWindow>
-#include <QtGui/QWindowFormat>
+#include <QtGui/QGuiGLFormat>
#include <QtGui/QImage>
#include <xcb/xcb.h>
@@ -72,9 +72,9 @@ public:
void lower();
void propagateSizeHints();
- void requestActivateWindow();
+ QPlatformGLSurface *createGLSurface() const;
- QPlatformGLContext *glContext() const;
+ void requestActivateWindow();
bool setKeyboardGrabEnabled(bool grab);
bool setMouseGrabEnabled(bool grab);
@@ -127,7 +127,6 @@ private:
QXcbScreen *m_screen;
xcb_window_t m_window;
- QPlatformGLContext *m_context;
uint m_depth;
QImage::Format m_format;