15#include <QtCore/QVersionNumber>
16#include <QtGui/QOpenGLContext>
17#include <QtGui/private/qopenglcontext_p.h>
22#include <X11/Xlibint.h>
28 #define QT_XCB_GLX_REQUIRED_MAJOR 1
29 #define QT_XCB_GLX_REQUIRED_MINOR 3
31 #if XCB_GLX_MAJOR_VERSION == 1 && XCB_GLX_MINOR_VERSION < 4
32 #define XCB_GLX_BUFFER_SWAP_COMPLETE 1
33 typedef struct xcb_glx_buffer_swap_complete_event_t {
34 uint8_t response_type;
39 xcb_glx_drawable_t drawable;
45 } xcb_glx_buffer_swap_complete_event_t;
57 } QGLXBufferSwapComplete;
62 , m_glx_first_event(0)
64 qCDebug(lcQpaGl) <<
"Xcb GLX gl-integration created";
76 const xcb_query_extension_reply_t *
reply = xcb_get_extension_data(m_connection->
xcb_connection(), &xcb_glx_id);
80 m_glx_first_event =
reply->first_event;
83 XCB_GLX_MAJOR_VERSION,
84 XCB_GLX_MINOR_VERSION);
86 || (
QVersionNumber(xglx_query->major_version, xglx_query->minor_version)
87 <
QVersionNumber(QT_XCB_GLX_REQUIRED_MAJOR, QT_XCB_GLX_REQUIRED_MINOR))) {
88 qCWarning(lcQpaGl) <<
"QXcbConnection: Failed to initialize GLX";
95 qCDebug(lcQpaGl) <<
"Xcb GLX gl-integration successfully initialized";
101 bool handled =
false;
104 Display *xdisplay =
static_cast<Display *
>(m_connection->xlib_display());
105 XLockDisplay(xdisplay);
107 Bool (*proc)(
Display*, XEvent*, xEvent*) = XESetWireToEvent(xdisplay, responseType,
nullptr);
109 XESetWireToEvent(xdisplay, responseType, proc);
111 event->sequence = LastKnownRequestProcessed(xdisplay);
112 if (proc(xdisplay, &dummy, (xEvent*)
event)) {
113#if QT_CONFIG(xcb_glx)
119 const uint swap_complete = m_glx_first_event + XCB_GLX_BUFFER_SWAP_COMPLETE;
121 if (dispatcher &&
uint(dummy.type) == swap_complete && responseType != swap_complete) {
122 QGLXBufferSwapComplete *xev =
reinterpret_cast<QGLXBufferSwapComplete *
>(&dummy);
123 xcb_glx_buffer_swap_complete_event_t ev;
124 memset(&ev, 0,
sizeof(xcb_glx_buffer_swap_complete_event_t));
125 ev.response_type = xev->type;
126 ev.sequence = xev->serial;
127 ev.event_type = xev->event_type;
128 ev.drawable = xev->drawable;
129 ev.ust_hi = xev->ust >> 32;
130 ev.ust_lo = xev->ust & 0xffffffff;
131 ev.msc_hi = xev->msc >> 32;
132 ev.msc_lo = xev->msc & 0xffffffff;
133 ev.sbc = xev->sbc & 0xffffffff;
135 XUnlockDisplay(xdisplay);
145 XUnlockDisplay(xdisplay);
170 auto *
display =
static_cast<Display *
>(m_connection->xlib_display());
177 static bool vendorChecked =
false;
178 static bool glxPbufferUsable =
true;
179 if (!vendorChecked) {
180 vendorChecked =
true;
185 const char *glxvendor = glXGetClientString(
display, GLX_VENDOR);
187 if (!strcmp(glxvendor,
"ATI") || !strcmp(glxvendor,
"Chromium"))
188 glxPbufferUsable =
false;
191 if (glxPbufferUsable)
205 static bool vendorChecked =
false;
206 static bool isSwitchableWidgetCompositionAvailable =
true;
207 if (!vendorChecked) {
208 vendorChecked =
true;
213 const char *glxvendor = glXGetClientString(
display, GLX_VENDOR);
215 if (!strcmp(glxvendor,
"Parallels Inc"))
216 isSwitchableWidgetCompositionAvailable =
false;
220 return isSwitchableWidgetCompositionAvailable;
static QAbstractEventDispatcher * instance(QThread *thread=nullptr)
Returns a pointer to the event dispatcher object for the specified thread.
bool filterNativeEvent(const QByteArray &eventType, void *message, qintptr *result)
Sends message through the event filters that were set by installNativeEventFilter().
static bool supportsThreading()
static QOpenGLContextPrivate * get(QOpenGLContext *context)
QPlatformOpenGLContext * handle() const
Returns the underlying platform context.
The QPlatformOpenGLContext class provides an abstraction for native GL contexts.
void reset(T *other=nullptr) noexcept(noexcept(Cleanup::cleanup(std::declval< T * >())))
Deletes the existing object it is pointing to (if any), and sets its pointer to other.
xcb_connection_t * xcb_connection() const
QXcbNativeInterface * nativeInterface() const
QXcbWindow * createWindow(QWindow *window) const override
bool supportsThreadedOpenGL() const override
QPlatformOffscreenSurface * createPlatformOffscreenSurface(QOffscreenSurface *surface) const override
bool handleXcbEvent(xcb_generic_event_t *event, uint responseType) override
bool supportsSwitchableWidgetComposition() const override
QOpenGLContext * createOpenGLContext(GLXContext context, void *visualInfo, QOpenGLContext *shareContext) const override
QPlatformOpenGLContext * createPlatformOpenGLContext(QOpenGLContext *context) const override
bool initialize(QXcbConnection *connection) override
const QByteArray & nativeEventType() const
struct wl_display * display
Combined button and popup list for selecting options.
DBusConnection * connection
#define qCWarning(category,...)
#define qCDebug(category,...)
#define Q_XCB_REPLY(call,...)