Initial support for Qt using Kernel Mode-setting (KMS)
This platform plugin supports fullscreen OpenGLES2 windows on devices that support Kernel Mode-setting. Change-Id: I7d4077319654c13851f0ff7ec0228b7b13936382 Reviewed-on: http://codereview.qt.nokia.com/2516 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com>
This commit is contained in:
parent
4b126d321e
commit
9a652ed802
42
src/plugins/platforms/kms/kms.pro
Normal file
42
src/plugins/platforms/kms/kms.pro
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
TARGET = qkms
|
||||||
|
|
||||||
|
load(qt_plugin)
|
||||||
|
QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
|
||||||
|
|
||||||
|
QT = core-private gui-private platformsupport-private opengl-private
|
||||||
|
|
||||||
|
CONFIG += link_pkgconfig qpa/genericunixfontdatabase
|
||||||
|
|
||||||
|
PKGCONFIG += libdrm egl gbm glesv2
|
||||||
|
|
||||||
|
SOURCES = main.cpp \
|
||||||
|
qkmsintegration.cpp \
|
||||||
|
qkmsscreen.cpp \
|
||||||
|
qkmscontext.cpp \
|
||||||
|
qkmswindow.cpp \
|
||||||
|
qkmscursor.cpp \
|
||||||
|
qkmsdevice.cpp \
|
||||||
|
qkmsbuffermanager.cpp \
|
||||||
|
qkmsbackingstore.cpp
|
||||||
|
HEADERS = qkmsintegration.h \
|
||||||
|
qkmsscreen.h \
|
||||||
|
qkmscontext.h \
|
||||||
|
qkmswindow.h \
|
||||||
|
qkmscursor.h \
|
||||||
|
qkmsdevice.h \
|
||||||
|
qkmsbuffermanager.h \
|
||||||
|
qkmsbackingstore.h
|
||||||
|
|
||||||
|
target.path += $$[QT_INSTALL_PLUGINS]/platforms
|
||||||
|
INSTALLS += target
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
72
src/plugins/platforms/kms/main.cpp
Normal file
72
src/plugins/platforms/kms/main.cpp
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** 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$
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU General
|
||||||
|
** Public License version 3.0 as published by the Free Software Foundation
|
||||||
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||||
|
** file. Please review the following information to ensure the GNU General
|
||||||
|
** Public License version 3.0 requirements will be met:
|
||||||
|
** http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <QtGui/QPlatformIntegrationPlugin>
|
||||||
|
#include "qkmsintegration.h"
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
class QKmsIntegrationPlugin : public QPlatformIntegrationPlugin
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QStringList keys() const;
|
||||||
|
QPlatformIntegration *create(const QString&, const QStringList&);
|
||||||
|
};
|
||||||
|
|
||||||
|
QStringList QKmsIntegrationPlugin::keys() const
|
||||||
|
{
|
||||||
|
QStringList list;
|
||||||
|
list << "kms";
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPlatformIntegration *QKmsIntegrationPlugin::create(const QString& system, const QStringList& paramList)
|
||||||
|
{
|
||||||
|
Q_UNUSED(paramList);
|
||||||
|
if (system.toLower() == "kms")
|
||||||
|
return new QKmsIntegration;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_EXPORT_PLUGIN2(kms, QKmsIntegrationPlugin)
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
72
src/plugins/platforms/kms/qkmsbackingstore.cpp
Normal file
72
src/plugins/platforms/kms/qkmsbackingstore.cpp
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** 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$
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU General
|
||||||
|
** Public License version 3.0 as published by the Free Software Foundation
|
||||||
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||||
|
** file. Please review the following information to ensure the GNU General
|
||||||
|
** Public License version 3.0 requirements will be met:
|
||||||
|
** http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "qkmsbackingstore.h"
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
QKmsBackingStore::QKmsBackingStore(QWindow *window)
|
||||||
|
: QPlatformBackingStore(window)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QPaintDevice *QKmsBackingStore::paintDevice()
|
||||||
|
{
|
||||||
|
return &m_image;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsBackingStore::flush(QWindow *window, const QRegion ®ion, const QPoint &offset)
|
||||||
|
{
|
||||||
|
//'window' can be a child window, in which case 'region' is in child window coordinates and
|
||||||
|
// offset is the (child) window's offset in relation to the window surface.
|
||||||
|
|
||||||
|
Q_UNUSED(region)
|
||||||
|
Q_UNUSED(offset)
|
||||||
|
Q_UNUSED(window)
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsBackingStore::resize(const QSize &size, const QRegion &staticContents)
|
||||||
|
{
|
||||||
|
Q_UNUSED(staticContents)
|
||||||
|
m_image = QImage(size, QImage::Format_RGB32);
|
||||||
|
}
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
65
src/plugins/platforms/kms/qkmsbackingstore.h
Normal file
65
src/plugins/platforms/kms/qkmsbackingstore.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** 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$
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU General
|
||||||
|
** Public License version 3.0 as published by the Free Software Foundation
|
||||||
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||||
|
** file. Please review the following information to ensure the GNU General
|
||||||
|
** Public License version 3.0 requirements will be met:
|
||||||
|
** http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef QBACKINGSTORE_KMS_H
|
||||||
|
#define QBACKINGSTORE_KMS_H
|
||||||
|
|
||||||
|
#include <QtGui/QPlatformBackingStore>
|
||||||
|
#include <QImage>
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
class QKmsBackingStore : public QPlatformBackingStore
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QKmsBackingStore(QWindow *window);
|
||||||
|
|
||||||
|
QPaintDevice *paintDevice();
|
||||||
|
void flush(QWindow *window, const QRegion ®ion, const QPoint &offset);
|
||||||
|
void resize(const QSize &size, const QRegion &staticContents);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QImage m_image;
|
||||||
|
};
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
#endif
|
198
src/plugins/platforms/kms/qkmsbuffermanager.cpp
Normal file
198
src/plugins/platforms/kms/qkmsbuffermanager.cpp
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** 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$
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU General
|
||||||
|
** Public License version 3.0 as published by the Free Software Foundation
|
||||||
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||||
|
** file. Please review the following information to ensure the GNU General
|
||||||
|
** Public License version 3.0 requirements will be met:
|
||||||
|
** http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "qkmsbuffermanager.h"
|
||||||
|
#include "qkmsscreen.h"
|
||||||
|
#include "qkmscontext.h"
|
||||||
|
#include "qkmsdevice.h"
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
QKmsBufferManager::QKmsBufferManager(QKmsScreen *screen) :
|
||||||
|
m_screen(screen),
|
||||||
|
m_frameBufferObject(0),
|
||||||
|
m_renderTarget(0),
|
||||||
|
m_displayCanidate(0),
|
||||||
|
m_currentDisplay(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QKmsBufferManager::~QKmsBufferManager()
|
||||||
|
{
|
||||||
|
clearBuffers();
|
||||||
|
glDeleteFramebuffers(1, &m_frameBufferObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsBufferManager::setupBuffersForMode(const drmModeModeInfo &mode, int numBuffers)
|
||||||
|
{
|
||||||
|
eglMakeCurrent(m_screen->device()->eglDisplay(), EGL_NO_SURFACE, EGL_NO_SURFACE, m_screen->device()->eglContext());
|
||||||
|
m_screen->bindFramebuffer();
|
||||||
|
|
||||||
|
|
||||||
|
if (m_frameBufferObject) {
|
||||||
|
clearBuffers();
|
||||||
|
} else {
|
||||||
|
//Setup Framebuffer Object
|
||||||
|
glGenFramebuffers(1, &m_frameBufferObject);
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, m_frameBufferObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Setup shared Depth/Stencil buffer
|
||||||
|
glGenRenderbuffers(1, &m_depthAndStencilBufferObject);
|
||||||
|
glBindRenderbuffer(GL_RENDERBUFFER, m_depthAndStencilBufferObject);
|
||||||
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES,
|
||||||
|
mode.hdisplay, mode.vdisplay);
|
||||||
|
|
||||||
|
//Setup "numBuffer" many rendering targets
|
||||||
|
for (int i = 0; i < numBuffers; i++) {
|
||||||
|
QKmsFramebuffer *buffer = new QKmsFramebuffer();
|
||||||
|
|
||||||
|
glGenRenderbuffers(1, &buffer->renderBuffer);
|
||||||
|
glBindRenderbuffer(GL_RENDERBUFFER, buffer->renderBuffer);
|
||||||
|
|
||||||
|
buffer->graphicsBufferObject = gbm_bo_create(m_screen->device()->gbmDevice(),
|
||||||
|
mode.hdisplay, mode.vdisplay,
|
||||||
|
GBM_BO_FORMAT_XRGB8888,
|
||||||
|
GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING);
|
||||||
|
buffer->eglImage = eglCreateImageKHR(m_screen->device()->eglDisplay(), 0, EGL_NATIVE_PIXMAP_KHR,
|
||||||
|
buffer->graphicsBufferObject, 0);
|
||||||
|
glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, buffer->eglImage);
|
||||||
|
|
||||||
|
quint32 stride = gbm_bo_get_pitch(buffer->graphicsBufferObject);
|
||||||
|
quint32 handle = gbm_bo_get_handle(buffer->graphicsBufferObject).u32;
|
||||||
|
|
||||||
|
int status = drmModeAddFB(m_screen->device()->fd(), mode.hdisplay, mode.vdisplay,
|
||||||
|
32, 32, stride, handle, &buffer->framebufferId);
|
||||||
|
//Todo: IF this returns true, then this is one less buffer that we use
|
||||||
|
//Not so fatal, but not handled at the moment.
|
||||||
|
if (status)
|
||||||
|
qFatal("failed to add framebuffer");
|
||||||
|
m_framebuffers.append(buffer);
|
||||||
|
}
|
||||||
|
//Attach the Depth and Stencil buffer
|
||||||
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
|
||||||
|
GL_DEPTH_ATTACHMENT,
|
||||||
|
GL_RENDERBUFFER,
|
||||||
|
m_depthAndStencilBufferObject);
|
||||||
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
|
||||||
|
GL_STENCIL_ATTACHMENT,
|
||||||
|
GL_RENDERBUFFER,
|
||||||
|
m_depthAndStencilBufferObject);
|
||||||
|
//Attach renderbuffer as Color Attachment.
|
||||||
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
|
||||||
|
GL_COLOR_ATTACHMENT0,
|
||||||
|
GL_RENDERBUFFER,
|
||||||
|
this->renderTargetBuffer());
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsBufferManager::clearBuffers()
|
||||||
|
{
|
||||||
|
//Make sure that the FBO is binded
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, m_frameBufferObject);
|
||||||
|
//Detach the Color/Depth/Stencil Attachments.
|
||||||
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
|
||||||
|
GL_COLOR_ATTACHMENT0,
|
||||||
|
GL_RENDERBUFFER,
|
||||||
|
0);
|
||||||
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
|
||||||
|
GL_DEPTH_ATTACHMENT,
|
||||||
|
GL_RENDERBUFFER,
|
||||||
|
0);
|
||||||
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
|
||||||
|
GL_STENCIL_ATTACHMENT,
|
||||||
|
GL_RENDERBUFFER,
|
||||||
|
0);
|
||||||
|
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
||||||
|
//Delete the shared Depth/Stencil buffer
|
||||||
|
glDeleteRenderbuffers(1, &m_depthAndStencilBufferObject);
|
||||||
|
|
||||||
|
//Delete each renderbuffer object
|
||||||
|
//Delete each EGLImage
|
||||||
|
//Remove each drm Framebuffer
|
||||||
|
foreach (QKmsFramebuffer *buffer, m_framebuffers) {
|
||||||
|
glDeleteRenderbuffers(1, &buffer->renderBuffer);
|
||||||
|
eglDestroyImageKHR(m_screen->device()->eglDisplay(), buffer->eglImage);
|
||||||
|
drmModeRmFB(m_screen->device()->fd(), buffer->framebufferId);
|
||||||
|
delete buffer;
|
||||||
|
}
|
||||||
|
m_framebuffers.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint QKmsBufferManager::renderTargetBuffer()
|
||||||
|
{
|
||||||
|
//TODO: Handle more senarios than assuming at least 2 buffers
|
||||||
|
if (!m_renderTarget) {
|
||||||
|
m_renderTarget = m_framebuffers.at(1);
|
||||||
|
}
|
||||||
|
return m_renderTarget->renderBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
quint32 QKmsBufferManager::displayFramebufferId()
|
||||||
|
{
|
||||||
|
if (!m_currentDisplay) {
|
||||||
|
m_currentDisplay = m_framebuffers.at(0);
|
||||||
|
m_currentDisplay->available = false;
|
||||||
|
return m_currentDisplay->framebufferId;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_displayCanidate)
|
||||||
|
return m_currentDisplay->framebufferId;
|
||||||
|
|
||||||
|
m_currentDisplay->available = true;
|
||||||
|
m_displayCanidate->available = false;
|
||||||
|
m_currentDisplay = m_displayCanidate;
|
||||||
|
return m_currentDisplay->framebufferId;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QKmsBufferManager::nextBuffer()
|
||||||
|
{
|
||||||
|
m_displayCanidate = m_renderTarget;
|
||||||
|
foreach (QKmsFramebuffer *buffer, m_framebuffers) {
|
||||||
|
if (buffer->available && buffer != m_displayCanidate) {
|
||||||
|
m_renderTarget = buffer;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
105
src/plugins/platforms/kms/qkmsbuffermanager.h
Normal file
105
src/plugins/platforms/kms/qkmsbuffermanager.h
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** 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$
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU General
|
||||||
|
** Public License version 3.0 as published by the Free Software Foundation
|
||||||
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||||
|
** file. Please review the following information to ensure the GNU General
|
||||||
|
** Public License version 3.0 requirements will be met:
|
||||||
|
** http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef QKMSBUFFERMANAGER_H
|
||||||
|
#define QKMSBUFFERMANAGER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QList>
|
||||||
|
|
||||||
|
#define EGL_EGLEXT_PROTOTYPES 1
|
||||||
|
#define GL_GLEXT_PROTOTYPES 1
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include <gbm.h>
|
||||||
|
#include <xf86drmMode.h>
|
||||||
|
#include <xf86drm.h>
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <EGL/egl.h>
|
||||||
|
#include <EGL/eglext.h>
|
||||||
|
#include <GLES2/gl2.h>
|
||||||
|
#include <GLES2/gl2ext.h>
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
class QKmsScreen;
|
||||||
|
|
||||||
|
class QKmsFramebuffer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QKmsFramebuffer() : available(true) {}
|
||||||
|
gbm_bo *graphicsBufferObject;
|
||||||
|
GLuint renderBuffer;
|
||||||
|
EGLImageKHR eglImage;
|
||||||
|
quint32 framebufferId;
|
||||||
|
bool available;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class QKmsBufferManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit QKmsBufferManager(QKmsScreen *screen);
|
||||||
|
~QKmsBufferManager();
|
||||||
|
void setupBuffersForMode(const drmModeModeInfo &mode, int numBuffers = 3);
|
||||||
|
GLuint framebufferObject() const { return m_frameBufferObject; }
|
||||||
|
quint32 displayFramebufferId();
|
||||||
|
GLuint renderTargetBuffer();
|
||||||
|
bool nextBuffer();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void clearBuffers();
|
||||||
|
|
||||||
|
QKmsScreen *m_screen;
|
||||||
|
QList<QKmsFramebuffer*> m_framebuffers;
|
||||||
|
GLuint m_frameBufferObject;
|
||||||
|
GLuint m_depthAndStencilBufferObject;
|
||||||
|
|
||||||
|
QKmsFramebuffer *m_renderTarget;
|
||||||
|
QKmsFramebuffer *m_displayCanidate;
|
||||||
|
QKmsFramebuffer *m_currentDisplay;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
#endif // QKMSBUFFERMANAGER_H
|
113
src/plugins/platforms/kms/qkmscontext.cpp
Normal file
113
src/plugins/platforms/kms/qkmscontext.cpp
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** 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$
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU General
|
||||||
|
** Public License version 3.0 as published by the Free Software Foundation
|
||||||
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||||
|
** file. Please review the following information to ensure the GNU General
|
||||||
|
** Public License version 3.0 requirements will be met:
|
||||||
|
** http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "qkmsscreen.h"
|
||||||
|
#include "qkmsdevice.h"
|
||||||
|
#include "qkmscontext.h"
|
||||||
|
#include "qkmswindow.h"
|
||||||
|
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
QKmsContext::QKmsContext(QKmsDevice *device)
|
||||||
|
: QPlatformGLContext(),
|
||||||
|
m_device(device)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QKmsContext::makeCurrent(QPlatformSurface *surface)
|
||||||
|
{
|
||||||
|
EGLDisplay display = m_device->eglDisplay();
|
||||||
|
EGLContext context = m_device->eglContext();
|
||||||
|
|
||||||
|
bool ok = eglMakeCurrent(display, EGL_NO_SURFACE,
|
||||||
|
EGL_NO_SURFACE, context);
|
||||||
|
if (!ok)
|
||||||
|
qWarning("QKmsContext::makeCurrent(): eglError: %d, this: %p",
|
||||||
|
eglGetError(), this);
|
||||||
|
|
||||||
|
QPlatformWindow *window = static_cast<QPlatformWindow *>(surface);
|
||||||
|
QKmsScreen *screen = static_cast<QKmsScreen *> (QPlatformScreen::platformScreenForWindow(window->window()));
|
||||||
|
screen->bindFramebuffer();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsContext::doneCurrent()
|
||||||
|
{
|
||||||
|
QPlatformGLContext::doneCurrent();
|
||||||
|
bool ok = eglMakeCurrent(m_device->eglDisplay(), EGL_NO_SURFACE, EGL_NO_SURFACE,
|
||||||
|
EGL_NO_CONTEXT);
|
||||||
|
if (!ok)
|
||||||
|
qWarning("QKmsContext::doneCurrent(): eglError: %d, this: %p",
|
||||||
|
eglGetError(), this);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsContext::swapBuffers(QPlatformSurface *surface)
|
||||||
|
{
|
||||||
|
//After flush, the current render target should be moved to
|
||||||
|
//latest complete
|
||||||
|
glFlush();
|
||||||
|
|
||||||
|
//Cast context to a window surface and get the screen the context
|
||||||
|
//is on and call swapBuffers on that screen.
|
||||||
|
QPlatformWindow *window = static_cast<QPlatformWindow *>(surface);
|
||||||
|
QKmsScreen *screen = static_cast<QKmsScreen *> (QPlatformScreen::platformScreenForWindow(window->window()));
|
||||||
|
screen->swapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
void (*QKmsContext::getProcAddress(const QByteArray &procName)) ()
|
||||||
|
{
|
||||||
|
return eglGetProcAddress(procName.data());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
EGLContext QKmsContext::eglContext() const
|
||||||
|
{
|
||||||
|
return m_device->eglContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
QSurfaceFormat QKmsContext::format() const
|
||||||
|
{
|
||||||
|
return QSurfaceFormat();
|
||||||
|
}
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
75
src/plugins/platforms/kms/qkmscontext.h
Normal file
75
src/plugins/platforms/kms/qkmscontext.h
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** 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$
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU General
|
||||||
|
** Public License version 3.0 as published by the Free Software Foundation
|
||||||
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||||
|
** file. Please review the following information to ensure the GNU General
|
||||||
|
** Public License version 3.0 requirements will be met:
|
||||||
|
** http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef QKMSCONTEXT_H
|
||||||
|
#define QKMSCONTEXT_H
|
||||||
|
|
||||||
|
#include <QtGui/QPlatformGLContext>
|
||||||
|
|
||||||
|
#define EGL_EGLEXT_PROTOTYPES 1
|
||||||
|
#include <EGL/egl.h>
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
class QKmsDevice;
|
||||||
|
|
||||||
|
class QKmsContext : public QPlatformGLContext
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QKmsContext(QKmsDevice *device);
|
||||||
|
|
||||||
|
bool makeCurrent(QPlatformSurface *surface);
|
||||||
|
void doneCurrent();
|
||||||
|
void swapBuffers(QPlatformSurface *surface);
|
||||||
|
void (*getProcAddress(const QByteArray &procName)) ();
|
||||||
|
|
||||||
|
QSurfaceFormat format() const;
|
||||||
|
|
||||||
|
EGLContext eglContext() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
QKmsDevice *m_device;
|
||||||
|
};
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
#endif // QKMSCONTEXT_H
|
131
src/plugins/platforms/kms/qkmscursor.cpp
Normal file
131
src/plugins/platforms/kms/qkmscursor.cpp
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** 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$
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU General
|
||||||
|
** Public License version 3.0 as published by the Free Software Foundation
|
||||||
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||||
|
** file. Please review the following information to ensure the GNU General
|
||||||
|
** Public License version 3.0 requirements will be met:
|
||||||
|
** http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
//#include <QDebug>
|
||||||
|
#include "qkmscursor.h"
|
||||||
|
#include "qkmsscreen.h"
|
||||||
|
#include "qkmsdevice.h"
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
QKmsCursor::QKmsCursor(QKmsScreen *screen)
|
||||||
|
: QPlatformCursor(screen), m_screen(screen),
|
||||||
|
m_graphicsBufferManager(screen->device()->gbmDevice())
|
||||||
|
{
|
||||||
|
gbm_bo *bo = gbm_bo_create(m_graphicsBufferManager, 64, 64,
|
||||||
|
GBM_BO_FORMAT_ARGB8888,
|
||||||
|
GBM_BO_USE_CURSOR_64X64 | GBM_BO_USE_RENDERING);
|
||||||
|
|
||||||
|
m_eglImage = eglCreateImageKHR(m_screen->device()->eglDisplay(), 0, EGL_NATIVE_PIXMAP_KHR,
|
||||||
|
bo, 0);
|
||||||
|
gbm_bo_destroy(bo);
|
||||||
|
m_cursorImage = new QPlatformCursorImage(0, 0, 0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsCursor::pointerEvent(const QMouseEvent &event)
|
||||||
|
{
|
||||||
|
int status = drmModeMoveCursor(m_screen->device()->fd(),
|
||||||
|
m_screen->crtcId(),
|
||||||
|
event.globalX(),
|
||||||
|
event.globalY());
|
||||||
|
if (status) {
|
||||||
|
qWarning("failed to move cursor: %d", status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsCursor::changeCursor(QCursor *widgetCursor, QWindow *window)
|
||||||
|
{
|
||||||
|
Q_UNUSED(window)
|
||||||
|
|
||||||
|
if (widgetCursor->shape() != Qt::BitmapCursor) {
|
||||||
|
m_cursorImage->set(widgetCursor->shape());
|
||||||
|
} else {
|
||||||
|
m_cursorImage->set(widgetCursor->pixmap().toImage(),
|
||||||
|
widgetCursor->hotSpot().x(),
|
||||||
|
widgetCursor->hotSpot().y());
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((m_cursorImage->image()->width() > 64) || (m_cursorImage->image()->width() > 64)) {
|
||||||
|
qWarning("failed to set hardware cursor: larger than 64x64.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QImage cursorImage = m_cursorImage->image()->convertToFormat(QImage::Format_RGB32);
|
||||||
|
|
||||||
|
//Load cursor image into EGLImage
|
||||||
|
GLuint cursorTexture;
|
||||||
|
glGenTextures(1, &cursorTexture);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, cursorTexture);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
|
||||||
|
|
||||||
|
//TODO: Format may be wrong here, need a color icon to test.
|
||||||
|
if (m_eglImage != EGL_NO_IMAGE_KHR) {
|
||||||
|
glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, m_eglImage);
|
||||||
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, cursorImage.width(),
|
||||||
|
cursorImage.height(), GL_RGBA,
|
||||||
|
GL_UNSIGNED_BYTE, cursorImage.constBits());
|
||||||
|
} else {
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, cursorImage.width(),
|
||||||
|
cursorImage.height(), 0, GL_RGBA,
|
||||||
|
GL_UNSIGNED_BYTE, cursorImage.constBits());
|
||||||
|
}
|
||||||
|
|
||||||
|
//EGLImage needs to contain sprite before calling this:
|
||||||
|
gbm_bo *bufferObject = gbm_bo_create_from_egl_image(m_graphicsBufferManager,
|
||||||
|
m_screen->device()->eglDisplay(),
|
||||||
|
m_eglImage, 64, 64,
|
||||||
|
GBM_BO_USE_CURSOR_64X64);
|
||||||
|
quint32 handle = gbm_bo_get_handle(bufferObject).u32;
|
||||||
|
|
||||||
|
gbm_bo_destroy(bufferObject);
|
||||||
|
|
||||||
|
int status = drmModeSetCursor(m_screen->device()->fd(),
|
||||||
|
m_screen->crtcId(), handle, 64, 64);
|
||||||
|
|
||||||
|
if (status) {
|
||||||
|
qWarning("failed to set cursor: %d", status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
74
src/plugins/platforms/kms/qkmscursor.h
Normal file
74
src/plugins/platforms/kms/qkmscursor.h
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** 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$
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU General
|
||||||
|
** Public License version 3.0 as published by the Free Software Foundation
|
||||||
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||||
|
** file. Please review the following information to ensure the GNU General
|
||||||
|
** Public License version 3.0 requirements will be met:
|
||||||
|
** http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef QKMSCURSOR_H
|
||||||
|
#define QKMSCURSOR_H
|
||||||
|
|
||||||
|
#include <QtGui/QPlatformCursor>
|
||||||
|
|
||||||
|
#define EGL_EGLEXT_PROTOTYPES 1
|
||||||
|
|
||||||
|
#include <EGL/egl.h>
|
||||||
|
#include <EGL/eglext.h>
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
class QKmsScreen;
|
||||||
|
class gbm_device;
|
||||||
|
|
||||||
|
class QKmsCursor : public QPlatformCursor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QKmsCursor(QKmsScreen *screen);
|
||||||
|
|
||||||
|
void pointerEvent(const QMouseEvent &event);
|
||||||
|
void changeCursor(QCursor *widgetCursor, QWindow *window);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QKmsScreen *m_screen;
|
||||||
|
gbm_device *m_graphicsBufferManager;
|
||||||
|
EGLImageKHR m_eglImage;
|
||||||
|
QPlatformCursorImage *m_cursorImage;
|
||||||
|
};
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
#endif // QKMSCURSOR_H
|
163
src/plugins/platforms/kms/qkmsdevice.cpp
Normal file
163
src/plugins/platforms/kms/qkmsdevice.cpp
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** 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$
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU General
|
||||||
|
** Public License version 3.0 as published by the Free Software Foundation
|
||||||
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||||
|
** file. Please review the following information to ensure the GNU General
|
||||||
|
** Public License version 3.0 requirements will be met:
|
||||||
|
** http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
//#include <QDebug>
|
||||||
|
#include "qkmsscreen.h"
|
||||||
|
#include "qkmsdevice.h"
|
||||||
|
|
||||||
|
#include "qkmsintegration.h"
|
||||||
|
|
||||||
|
#include <QtCore/QSocketNotifier>
|
||||||
|
#include <QtCore/private/qcore_unix_p.h>
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
QKmsDevice::QKmsDevice(const QString &path, QKmsIntegration *parent) :
|
||||||
|
QObject(0), m_integration(parent)
|
||||||
|
{
|
||||||
|
m_fd = QT_OPEN(path.toAscii().constData(), O_RDWR);
|
||||||
|
if (m_fd < 0) {
|
||||||
|
qWarning("Could not open %s.", path.toAscii().constData());
|
||||||
|
qFatal("No DRM display device");
|
||||||
|
}
|
||||||
|
|
||||||
|
m_graphicsBufferManager = gbm_create_device(m_fd);
|
||||||
|
m_eglDisplay = eglGetDisplay(m_graphicsBufferManager);
|
||||||
|
|
||||||
|
if (m_eglDisplay == EGL_NO_DISPLAY) {
|
||||||
|
qWarning("Could not open EGL display");
|
||||||
|
qFatal("EGL error");
|
||||||
|
}
|
||||||
|
|
||||||
|
EGLint major;
|
||||||
|
EGLint minor;
|
||||||
|
if (!eglInitialize(m_eglDisplay, &major, &minor)) {
|
||||||
|
qWarning("Could not initialize EGL display");
|
||||||
|
qFatal("EGL error");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString extensions = eglQueryString(m_eglDisplay, EGL_EXTENSIONS);
|
||||||
|
if (!extensions.contains(QString::fromLatin1("EGL_KHR_surfaceless_opengl"))) {
|
||||||
|
qFatal("EGL_KHR_surfaceless_opengl extension not available");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Initialize EGLContext
|
||||||
|
static EGLint contextAttribs[] = {
|
||||||
|
EGL_CONTEXT_CLIENT_VERSION, 2,
|
||||||
|
EGL_NONE
|
||||||
|
};
|
||||||
|
|
||||||
|
eglBindAPI(EGL_OPENGL_ES_API);
|
||||||
|
m_eglContext = eglCreateContext(m_eglDisplay, 0, 0, contextAttribs);
|
||||||
|
if (m_eglContext == EGL_NO_CONTEXT) {
|
||||||
|
qWarning("Could not create the EGL context.");
|
||||||
|
eglTerminate(m_eglDisplay);
|
||||||
|
qFatal("EGL error");
|
||||||
|
}
|
||||||
|
|
||||||
|
createScreens();
|
||||||
|
|
||||||
|
QSocketNotifier *notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
|
||||||
|
connect(notifier, SIGNAL(activated(int)), this, SLOT(handlePageFlipCompleted()));
|
||||||
|
}
|
||||||
|
|
||||||
|
QKmsDevice::~QKmsDevice()
|
||||||
|
{
|
||||||
|
if (m_eglContext != EGL_NO_CONTEXT) {
|
||||||
|
eglDestroyContext(m_eglDisplay, m_eglContext);
|
||||||
|
m_eglContext = EGL_NO_CONTEXT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsDevice::createScreens()
|
||||||
|
{
|
||||||
|
drmModeRes *resources = 0;
|
||||||
|
resources = drmModeGetResources(m_fd);
|
||||||
|
if (!resources)
|
||||||
|
qFatal("drmModeGetResources failed");
|
||||||
|
|
||||||
|
//Iterate connectors and create screens on each one active
|
||||||
|
for (int i = 0; i < resources->count_connectors; i++) {
|
||||||
|
drmModeConnector *connector = 0;
|
||||||
|
connector = drmModeGetConnector(m_fd, resources->connectors[i]);
|
||||||
|
if (connector && connector->connection == DRM_MODE_CONNECTED) {
|
||||||
|
m_integration->addScreen(new QKmsScreen(this, connector->connector_id));
|
||||||
|
}
|
||||||
|
drmModeFreeConnector(connector);
|
||||||
|
}
|
||||||
|
drmModeFreeResources(resources);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsDevice::handlePageFlipCompleted()
|
||||||
|
{
|
||||||
|
//qDebug() << "Display signal recieved";
|
||||||
|
drmEventContext eventContext;
|
||||||
|
|
||||||
|
memset(&eventContext, 0, sizeof eventContext);
|
||||||
|
eventContext.version = DRM_EVENT_CONTEXT_VERSION;
|
||||||
|
eventContext.page_flip_handler = QKmsDevice::pageFlipHandler;
|
||||||
|
drmHandleEvent(m_fd, &eventContext);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsDevice::pageFlipHandler(int fd, unsigned int frame, unsigned int sec, unsigned int usec, void *data)
|
||||||
|
{
|
||||||
|
Q_UNUSED(fd)
|
||||||
|
Q_UNUSED(frame)
|
||||||
|
Q_UNUSED(sec)
|
||||||
|
Q_UNUSED(usec)
|
||||||
|
static unsigned int previousTime = 0;
|
||||||
|
|
||||||
|
unsigned int currentTime = sec * 1000000 + usec;
|
||||||
|
unsigned int refreshTime = 0;
|
||||||
|
// qDebug() << "fd: " << fd << " frame: " << frame << " sec: "
|
||||||
|
// << sec << " usec: " << usec << " data: " << data
|
||||||
|
// << "msecs" << sec * 1000 + usec / 1000;
|
||||||
|
QKmsScreen *screen = static_cast<QKmsScreen *>(data);
|
||||||
|
|
||||||
|
if (previousTime == 0)
|
||||||
|
refreshTime = 16000;
|
||||||
|
else
|
||||||
|
refreshTime = currentTime - previousTime;
|
||||||
|
|
||||||
|
screen->setFlipReady(refreshTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
87
src/plugins/platforms/kms/qkmsdevice.h
Normal file
87
src/plugins/platforms/kms/qkmsdevice.h
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** 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$
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU General
|
||||||
|
** Public License version 3.0 as published by the Free Software Foundation
|
||||||
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||||
|
** file. Please review the following information to ensure the GNU General
|
||||||
|
** Public License version 3.0 requirements will be met:
|
||||||
|
** http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef QKMSDEVICE_H
|
||||||
|
#define QKMSDEVICE_H
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include <gbm.h>
|
||||||
|
}
|
||||||
|
#include <EGL/egl.h>
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
class gbm_device;
|
||||||
|
class QKmsIntegration;
|
||||||
|
|
||||||
|
class QKmsDevice : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit QKmsDevice(const QString &path, QKmsIntegration *parent);
|
||||||
|
~QKmsDevice();
|
||||||
|
|
||||||
|
EGLDisplay eglDisplay() { return m_eglDisplay; }
|
||||||
|
gbm_device *gbmDevice() { return m_graphicsBufferManager; }
|
||||||
|
EGLContext eglContext() { return m_eglContext; }
|
||||||
|
int fd() const { return m_fd; }
|
||||||
|
|
||||||
|
static void pageFlipHandler(int fd, unsigned int frame, unsigned int sec,
|
||||||
|
unsigned int usec, void *data);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void handlePageFlipCompleted();
|
||||||
|
private:
|
||||||
|
void createScreens();
|
||||||
|
|
||||||
|
QKmsIntegration *m_integration;
|
||||||
|
|
||||||
|
EGLDisplay m_eglDisplay;
|
||||||
|
EGLContext m_eglContext;
|
||||||
|
gbm_device *m_graphicsBufferManager;
|
||||||
|
int m_fd;
|
||||||
|
};
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
#endif // QKMSDEVICE_H
|
138
src/plugins/platforms/kms/qkmsintegration.cpp
Normal file
138
src/plugins/platforms/kms/qkmsintegration.cpp
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** 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$
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU General
|
||||||
|
** Public License version 3.0 as published by the Free Software Foundation
|
||||||
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||||
|
** file. Please review the following information to ensure the GNU General
|
||||||
|
** Public License version 3.0 requirements will be met:
|
||||||
|
** http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "qkmsintegration.h"
|
||||||
|
#include "qkmsdevice.h"
|
||||||
|
#include "qkmsscreen.h"
|
||||||
|
#include "qkmswindow.h"
|
||||||
|
#include "qkmsbackingstore.h"
|
||||||
|
#include "qkmscontext.h"
|
||||||
|
|
||||||
|
#include <QtPlatformSupport/private/qgenericunixprintersupport_p.h>
|
||||||
|
#include <QtPlatformSupport/private/qgenericunixeventdispatcher_p.h>
|
||||||
|
#include <QtPlatformSupport/private/qgenericunixfontdatabase_p.h>
|
||||||
|
#include <QtGui/private/qguiapplication_p.h>
|
||||||
|
#include <QtGui/QGuiGLContext>
|
||||||
|
#include <QtGui/QScreen>
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
QKmsIntegration::QKmsIntegration()
|
||||||
|
: QPlatformIntegration(),
|
||||||
|
m_fontDatabase(new QGenericUnixFontDatabase()),
|
||||||
|
m_printerSupport(new QGenericUnixPrinterSupport()),
|
||||||
|
m_eventDispatcher(createUnixEventDispatcher())
|
||||||
|
{
|
||||||
|
QGuiApplicationPrivate::instance()->setEventDispatcher(m_eventDispatcher);
|
||||||
|
setenv("EGL_PLATFORM", "drm",1);
|
||||||
|
QStringList drmDevices = findDrmDevices();
|
||||||
|
foreach (QString path, drmDevices) {
|
||||||
|
m_devices.append(new QKmsDevice(path, this));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QKmsIntegration::~QKmsIntegration()
|
||||||
|
{
|
||||||
|
foreach (QKmsDevice *device, m_devices) {
|
||||||
|
delete device;
|
||||||
|
}
|
||||||
|
foreach (QPlatformScreen *screen, m_screens) {
|
||||||
|
delete screen;
|
||||||
|
}
|
||||||
|
delete m_printerSupport;
|
||||||
|
delete m_fontDatabase;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QKmsIntegration::hasCapability(QPlatformIntegration::Capability cap) const
|
||||||
|
{
|
||||||
|
switch (cap) {
|
||||||
|
case ThreadedPixmaps: return true;
|
||||||
|
case OpenGL: return true;
|
||||||
|
default: return QPlatformIntegration::hasCapability(cap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QPlatformGLContext *QKmsIntegration::createPlatformGLContext(QGuiGLContext *context) const
|
||||||
|
{
|
||||||
|
QKmsScreen *screen = static_cast<QKmsScreen *>(context->screen()->handle());
|
||||||
|
return new QKmsContext(screen->device());
|
||||||
|
}
|
||||||
|
|
||||||
|
QPlatformWindow *QKmsIntegration::createPlatformWindow(QWindow *window) const
|
||||||
|
{
|
||||||
|
return new QKmsWindow(window);
|
||||||
|
}
|
||||||
|
|
||||||
|
QPlatformBackingStore *QKmsIntegration::createPlatformBackingStore(QWindow *window) const
|
||||||
|
{
|
||||||
|
return new QKmsBackingStore(window);
|
||||||
|
}
|
||||||
|
|
||||||
|
QPlatformFontDatabase *QKmsIntegration::fontDatabase() const
|
||||||
|
{
|
||||||
|
return m_fontDatabase;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList QKmsIntegration::findDrmDevices()
|
||||||
|
{
|
||||||
|
//Return a list addresses of DRM supported devices
|
||||||
|
//Hardcoded now, but could use udev to return a list
|
||||||
|
//of multiple devices.
|
||||||
|
return QStringList(QString::fromLatin1("/dev/dri/card0"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsIntegration::addScreen(QKmsScreen *screen)
|
||||||
|
{
|
||||||
|
m_screens.append(screen);
|
||||||
|
screenAdded(screen);
|
||||||
|
}
|
||||||
|
|
||||||
|
QAbstractEventDispatcher *QKmsIntegration::guiThreadEventDispatcher() const
|
||||||
|
{
|
||||||
|
return m_eventDispatcher;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPlatformPrinterSupport *QKmsIntegration::printerSupport() const
|
||||||
|
{
|
||||||
|
return m_printerSupport;
|
||||||
|
}
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
82
src/plugins/platforms/kms/qkmsintegration.h
Normal file
82
src/plugins/platforms/kms/qkmsintegration.h
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** 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$
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU General
|
||||||
|
** Public License version 3.0 as published by the Free Software Foundation
|
||||||
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||||
|
** file. Please review the following information to ensure the GNU General
|
||||||
|
** Public License version 3.0 requirements will be met:
|
||||||
|
** http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef QPLATFORMINTEGRATION_KMS_H
|
||||||
|
#define QPLATFORMINTEGRATION_KMS_H
|
||||||
|
|
||||||
|
#include <QtGui/QPlatformIntegration>
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
class QKmsScreen;
|
||||||
|
class QKmsDevice;
|
||||||
|
|
||||||
|
class QKmsIntegration : public QPlatformIntegration
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QKmsIntegration();
|
||||||
|
~QKmsIntegration();
|
||||||
|
|
||||||
|
bool hasCapability(QPlatformIntegration::Capability cap) const;
|
||||||
|
|
||||||
|
QPlatformGLContext *createPlatformGLContext(QGuiGLContext *context) const;
|
||||||
|
QPlatformWindow *createPlatformWindow(QWindow *window) const;
|
||||||
|
QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const;
|
||||||
|
|
||||||
|
QPlatformFontDatabase *fontDatabase() const;
|
||||||
|
QPlatformPrinterSupport *printerSupport() const;
|
||||||
|
QAbstractEventDispatcher *guiThreadEventDispatcher() const;
|
||||||
|
|
||||||
|
void addScreen(QKmsScreen *screen);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QStringList findDrmDevices();
|
||||||
|
|
||||||
|
QList<QPlatformScreen *> m_screens;
|
||||||
|
QList<QKmsDevice *> m_devices;
|
||||||
|
QPlatformFontDatabase *m_fontDatabase;
|
||||||
|
QPlatformPrinterSupport *m_printerSupport;
|
||||||
|
QAbstractEventDispatcher *m_eventDispatcher;
|
||||||
|
};
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
#endif
|
224
src/plugins/platforms/kms/qkmsscreen.cpp
Normal file
224
src/plugins/platforms/kms/qkmsscreen.cpp
Normal file
@ -0,0 +1,224 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** 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$
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU General
|
||||||
|
** Public License version 3.0 as published by the Free Software Foundation
|
||||||
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||||
|
** file. Please review the following information to ensure the GNU General
|
||||||
|
** Public License version 3.0 requirements will be met:
|
||||||
|
** http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
//#include <QDebug>
|
||||||
|
#include "qkmscursor.h"
|
||||||
|
#include "qkmsscreen.h"
|
||||||
|
#include "qkmsdevice.h"
|
||||||
|
#include "qkmscontext.h"
|
||||||
|
#include "qkmsbuffermanager.h"
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
//Fallback mode (taken from Wayland DRM demo compositor)
|
||||||
|
static drmModeModeInfo builtin_1024x768 = {
|
||||||
|
63500, //clock
|
||||||
|
1024, 1072, 1176, 1328, 0,
|
||||||
|
768, 771, 775, 798, 0,
|
||||||
|
59920,
|
||||||
|
DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC,
|
||||||
|
0,
|
||||||
|
"1024x768"
|
||||||
|
};
|
||||||
|
|
||||||
|
QKmsScreen::QKmsScreen(QKmsDevice *device, int connectorId)
|
||||||
|
: m_device(device),
|
||||||
|
m_flipReady(true),
|
||||||
|
m_connectorId(connectorId),
|
||||||
|
m_depth(32),
|
||||||
|
m_format(QImage::Format_Invalid),
|
||||||
|
m_bufferManager(this),
|
||||||
|
m_refreshTime(16000)
|
||||||
|
{
|
||||||
|
m_cursor = new QKmsCursor(this);
|
||||||
|
initializeScreenMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
QKmsScreen::~QKmsScreen()
|
||||||
|
{
|
||||||
|
delete m_cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
QRect QKmsScreen::geometry() const
|
||||||
|
{
|
||||||
|
return m_geometry;
|
||||||
|
}
|
||||||
|
|
||||||
|
int QKmsScreen::depth() const
|
||||||
|
{
|
||||||
|
return m_depth;
|
||||||
|
}
|
||||||
|
|
||||||
|
QImage::Format QKmsScreen::format() const
|
||||||
|
{
|
||||||
|
return m_format;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSize QKmsScreen::physicalSize() const
|
||||||
|
{
|
||||||
|
return m_physicalSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint QKmsScreen::framebufferObject() const
|
||||||
|
{
|
||||||
|
return m_bufferManager.framebufferObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsScreen::initializeScreenMode()
|
||||||
|
{
|
||||||
|
//Determine optimal mode for screen
|
||||||
|
drmModeRes *resources = drmModeGetResources(m_device->fd());
|
||||||
|
if (!resources)
|
||||||
|
qFatal("drmModeGetResources failed");
|
||||||
|
|
||||||
|
drmModeConnector *connector = drmModeGetConnector(m_device->fd(), m_connectorId);
|
||||||
|
drmModeModeInfo *mode = 0;
|
||||||
|
if (connector->count_modes > 0)
|
||||||
|
mode = &connector->modes[0];
|
||||||
|
else
|
||||||
|
mode = &builtin_1024x768;
|
||||||
|
|
||||||
|
drmModeEncoder *encoder = drmModeGetEncoder(m_device->fd(), connector->encoders[0]);
|
||||||
|
if (encoder == 0)
|
||||||
|
qFatal("No encoder for connector.");
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < resources->count_crtcs; i++) {
|
||||||
|
if (encoder->possible_crtcs & (1 << i))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i == resources->count_crtcs)
|
||||||
|
qFatal("No usable crtc for encoder.");
|
||||||
|
|
||||||
|
m_crtcId = resources->crtcs[i];
|
||||||
|
m_mode = *mode;
|
||||||
|
m_geometry = QRect(0, 0, m_mode.hdisplay, m_mode.vdisplay);
|
||||||
|
m_depth = 32;
|
||||||
|
m_format = QImage::Format_RGB32;
|
||||||
|
m_physicalSize = QSize(connector->mmWidth, connector->mmHeight);
|
||||||
|
|
||||||
|
//Setup three buffers for current mode
|
||||||
|
m_bufferManager.setupBuffersForMode(m_mode, 3);
|
||||||
|
|
||||||
|
//Set the Mode of the screen.
|
||||||
|
int ret = drmModeSetCrtc(m_device->fd(), m_crtcId, m_bufferManager.displayFramebufferId(),
|
||||||
|
0, 0, &m_connectorId, 1, &m_mode);
|
||||||
|
if (ret)
|
||||||
|
qFatal("failed to set mode");
|
||||||
|
|
||||||
|
//Cleanup
|
||||||
|
drmModeFreeEncoder(encoder);
|
||||||
|
drmModeFreeConnector(connector);
|
||||||
|
drmModeFreeResources(resources);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsScreen::bindFramebuffer()
|
||||||
|
{
|
||||||
|
if (m_bufferManager.framebufferObject()) {
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, m_bufferManager.framebufferObject());
|
||||||
|
|
||||||
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
|
||||||
|
GL_COLOR_ATTACHMENT0,
|
||||||
|
GL_RENDERBUFFER,
|
||||||
|
m_bufferManager.renderTargetBuffer());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsScreen::swapBuffers()
|
||||||
|
{
|
||||||
|
waitForPageFlipComplete();
|
||||||
|
|
||||||
|
if ( m_flipReady )
|
||||||
|
performPageFlip();
|
||||||
|
//TODO: Do something with return value here
|
||||||
|
m_bufferManager.nextBuffer();
|
||||||
|
//qDebug() << "swapBuffers now rendering to " << m_bufferManager.renderTargetBuffer();
|
||||||
|
bindFramebuffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsScreen::performPageFlip()
|
||||||
|
{
|
||||||
|
quint32 displayFramebufferId = m_bufferManager.displayFramebufferId();
|
||||||
|
//qDebug() << "Flipping to framebuffer: " << displayFramebufferId;
|
||||||
|
|
||||||
|
int pageFlipStatus = drmModePageFlip(m_device->fd(), m_crtcId,
|
||||||
|
displayFramebufferId,
|
||||||
|
DRM_MODE_PAGE_FLIP_EVENT, this);
|
||||||
|
if (pageFlipStatus)
|
||||||
|
qWarning("Pageflip status: %d", pageFlipStatus);
|
||||||
|
|
||||||
|
m_flipReady = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsScreen::setFlipReady(unsigned int time)
|
||||||
|
{
|
||||||
|
m_flipReady = true;
|
||||||
|
m_refreshTime = time;
|
||||||
|
performPageFlip();
|
||||||
|
}
|
||||||
|
|
||||||
|
QKmsDevice * QKmsScreen::device() const
|
||||||
|
{
|
||||||
|
return m_device;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsScreen::waitForPageFlipComplete()
|
||||||
|
{
|
||||||
|
//Check manually if there is something to be read on the device
|
||||||
|
//as there are senarios where the signal is not received (starvation)
|
||||||
|
fd_set fdSet;
|
||||||
|
timeval timeValue;
|
||||||
|
int returnValue;
|
||||||
|
|
||||||
|
FD_ZERO(&fdSet);
|
||||||
|
FD_SET(m_device->fd(), &fdSet);
|
||||||
|
timeValue.tv_sec = 0;
|
||||||
|
timeValue.tv_usec = m_refreshTime;
|
||||||
|
|
||||||
|
returnValue = select(1, &fdSet, 0, 0, &timeValue);
|
||||||
|
|
||||||
|
if (returnValue) {
|
||||||
|
m_device->handlePageFlipCompleted();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
97
src/plugins/platforms/kms/qkmsscreen.h
Normal file
97
src/plugins/platforms/kms/qkmsscreen.h
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** 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$
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU General
|
||||||
|
** Public License version 3.0 as published by the Free Software Foundation
|
||||||
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||||
|
** file. Please review the following information to ensure the GNU General
|
||||||
|
** Public License version 3.0 requirements will be met:
|
||||||
|
** http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef QKMSSCREEN_H
|
||||||
|
#define QKMSSCREEN_H
|
||||||
|
|
||||||
|
#include <QtGui/QPlatformScreen>
|
||||||
|
#include "qkmsbuffermanager.h"
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
class QKmsCursor;
|
||||||
|
class QKmsDevice;
|
||||||
|
class QKmsContext;
|
||||||
|
|
||||||
|
class QKmsScreen : public QPlatformScreen
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QKmsScreen(QKmsDevice *device, int connectorId);
|
||||||
|
~QKmsScreen();
|
||||||
|
|
||||||
|
QRect geometry() const;
|
||||||
|
int depth() const;
|
||||||
|
QImage::Format format() const;
|
||||||
|
QSize physicalSize() const;
|
||||||
|
|
||||||
|
GLuint framebufferObject() const;
|
||||||
|
quint32 crtcId() const { return m_crtcId; }
|
||||||
|
QKmsDevice *device() const;
|
||||||
|
|
||||||
|
//Called by context for each screen
|
||||||
|
void bindFramebuffer();
|
||||||
|
void swapBuffers();
|
||||||
|
void setFlipReady(unsigned int time);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void performPageFlip();
|
||||||
|
void initializeScreenMode();
|
||||||
|
void waitForPageFlipComplete();
|
||||||
|
|
||||||
|
QKmsDevice *m_device;
|
||||||
|
bool m_flipReady;
|
||||||
|
quint32 m_connectorId;
|
||||||
|
|
||||||
|
quint32 m_crtcId;
|
||||||
|
drmModeModeInfo m_mode;
|
||||||
|
QRect m_geometry;
|
||||||
|
QSize m_physicalSize;
|
||||||
|
int m_depth;
|
||||||
|
QImage::Format m_format;
|
||||||
|
|
||||||
|
QKmsCursor *m_cursor;
|
||||||
|
QKmsBufferManager m_bufferManager;
|
||||||
|
unsigned int m_refreshTime;
|
||||||
|
};
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
#endif // QKMSSCREEN_H
|
64
src/plugins/platforms/kms/qkmswindow.cpp
Normal file
64
src/plugins/platforms/kms/qkmswindow.cpp
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** 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$
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU General
|
||||||
|
** Public License version 3.0 as published by the Free Software Foundation
|
||||||
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||||
|
** file. Please review the following information to ensure the GNU General
|
||||||
|
** Public License version 3.0 requirements will be met:
|
||||||
|
** http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "qkmswindow.h"
|
||||||
|
#include "qkmsscreen.h"
|
||||||
|
|
||||||
|
#include <QtGui/QWindowSystemInterface>
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
QKmsWindow::QKmsWindow(QWindow *window)
|
||||||
|
: QPlatformWindow(window)
|
||||||
|
{
|
||||||
|
m_screen = QPlatformScreen::platformScreenForWindow(window);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QKmsWindow::setGeometry(const QRect &rect)
|
||||||
|
{
|
||||||
|
Q_UNUSED(rect)
|
||||||
|
//All Windows must be fullscreen
|
||||||
|
QRect fullscreenRect = m_screen->availableGeometry();
|
||||||
|
QWindowSystemInterface::handleGeometryChange(window(), fullscreenRect);
|
||||||
|
|
||||||
|
QPlatformWindow::setGeometry(fullscreenRect);
|
||||||
|
}
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
62
src/plugins/platforms/kms/qkmswindow.h
Normal file
62
src/plugins/platforms/kms/qkmswindow.h
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** 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$
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU General
|
||||||
|
** Public License version 3.0 as published by the Free Software Foundation
|
||||||
|
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||||
|
** file. Please review the following information to ensure the GNU General
|
||||||
|
** Public License version 3.0 requirements will be met:
|
||||||
|
** http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms and
|
||||||
|
** conditions contained in a signed written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef QKMSWINDOW_H
|
||||||
|
#define QKMSWINDOW_H
|
||||||
|
|
||||||
|
#include <QtGui/QPlatformWindow>
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
class QKmsWindow : public QPlatformWindow
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QKmsWindow(QWindow *window);
|
||||||
|
|
||||||
|
void setGeometry(const QRect &rect);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QPlatformScreen *m_screen;
|
||||||
|
};
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
#endif // QKMSWINDOW_H
|
Loading…
x
Reference in New Issue
Block a user