/**************************************************************************** ** ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage ** This file contains pre-release code and may not be distributed. ** You may use this file in accordance with the terms and conditions ** contained in the Technology Preview License Agreement accompanying ** this package. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** ** ** ** ** ** ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qwaylandxcompositeglxcontext.h" #include "qwaylandxcompositeglxwindow.h" #include "qwaylandxcompositebuffer.h" #include "wayland-xcomposite-client-protocol.h" #include #include #include QWaylandXCompositeGLXContext::QWaylandXCompositeGLXContext(QWaylandXCompositeGLXIntegration *glxIntegration, QWaylandXCompositeGLXWindow *window) : QPlatformGLContext() , mGlxIntegration(glxIntegration) , mWindow(window) , mBuffer(0) , mXWindow(0) , mConfig(qglx_findConfig(glxIntegration->xDisplay(),glxIntegration->screen(),window->window()->format())) , mWaitingForSyncCallback(false) { XVisualInfo *visualInfo = glXGetVisualFromFBConfig(glxIntegration->xDisplay(),mConfig); mContext = glXCreateContext(glxIntegration->xDisplay(),visualInfo,0,TRUE); geometryChanged(); } void QWaylandXCompositeGLXContext::makeCurrent() { glXMakeCurrent(mGlxIntegration->xDisplay(),mXWindow,mContext); } void QWaylandXCompositeGLXContext::doneCurrent() { glXMakeCurrent(mGlxIntegration->xDisplay(),0,0); QPlatformGLContext::doneCurrent(); } void QWaylandXCompositeGLXContext::swapBuffers() { QSize size = mWindow->geometry().size(); glXSwapBuffers(mGlxIntegration->xDisplay(),mXWindow); mWindow->damage(QRegion(QRect(QPoint(0,0),size))); mWindow->waitForFrameSync(); } void * QWaylandXCompositeGLXContext::getProcAddress(const QString &procName) { return (void *) glXGetProcAddress(reinterpret_cast(procName.toLatin1().data())); } QWindowFormat QWaylandXCompositeGLXContext::windowFormat() const { return qglx_platformWindowFromGLXFBConfig(mGlxIntegration->xDisplay(),mConfig,mContext); } void QWaylandXCompositeGLXContext::sync_function(void *data) { QWaylandXCompositeGLXContext *that = static_cast(data); that->mWaitingForSyncCallback = false; } void QWaylandXCompositeGLXContext::waitForSync() { wl_display_sync_callback(mGlxIntegration->waylandDisplay()->wl_display(), QWaylandXCompositeGLXContext::sync_function, this); mWaitingForSyncCallback = true; wl_display_sync(mGlxIntegration->waylandDisplay()->wl_display(),0); mGlxIntegration->waylandDisplay()->flushRequests(); while (mWaitingForSyncCallback) { mGlxIntegration->waylandDisplay()->readEvents(); } } void QWaylandXCompositeGLXContext::geometryChanged() { QSize size(mWindow->geometry().size()); if (size.isEmpty()) { //QGLWidget wants a context for a window without geometry size = QSize(1,1); } delete mBuffer; //XFreePixmap deletes the glxPixmap as well if (mXWindow) { XDestroyWindow(mGlxIntegration->xDisplay(),mXWindow); } XVisualInfo *visualInfo = glXGetVisualFromFBConfig(mGlxIntegration->xDisplay(),mConfig); Colormap cmap = XCreateColormap(mGlxIntegration->xDisplay(),mGlxIntegration->rootWindow(),visualInfo->visual,AllocNone); XSetWindowAttributes a; a.colormap = cmap; mXWindow = XCreateWindow(mGlxIntegration->xDisplay(), mGlxIntegration->rootWindow(),0, 0, size.width(), size.height(), 0, visualInfo->depth, InputOutput, visualInfo->visual, CWColormap, &a); XCompositeRedirectWindow(mGlxIntegration->xDisplay(), mXWindow, CompositeRedirectManual); XMapWindow(mGlxIntegration->xDisplay(), mXWindow); XSync(mGlxIntegration->xDisplay(),False); mBuffer = new QWaylandXCompositeBuffer(mGlxIntegration->waylandXComposite(), (uint32_t)mXWindow, size, mGlxIntegration->waylandDisplay()->argbVisual()); mWindow->attach(mBuffer); waitForSync(); }