summaryrefslogtreecommitdiffstats
path: root/tests/manual
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@digia.com>2014-04-24 16:40:22 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-05-09 13:24:55 +0200
commit0b5c0ad2ef49a262de5bdb18a3cdab30ae6772a2 (patch)
tree19f2d2fc25c22ea628bb7be0874488f69b33593f /tests/manual
parent3b6d8ba49b39b75dda33fb3c3a784330791efed2 (diff)
Support adopting an existing EGLContext in eglfs and xcb
Add also a manual test application. For GLX there is an autotest since that is likely to be run on one of the CIs. For EGL and especially eglfs this is likely not the case so a manual test is better. Task-number: QTBUG-37552 Change-Id: Ib09db5d909befb68d16f69abd401a56abe55f28a Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com> Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
Diffstat (limited to 'tests/manual')
-rw-r--r--tests/manual/manual.pro5
-rw-r--r--tests/manual/qopenglcontext/main.cpp54
-rw-r--r--tests/manual/qopenglcontext/qopenglcontext.pro9
-rw-r--r--tests/manual/qopenglcontext/qopenglcontextwindow.cpp173
-rw-r--r--tests/manual/qopenglcontext/qopenglcontextwindow.h76
-rw-r--r--tests/manual/qopenglcontext/qticon64.pngbin0 -> 6474 bytes
6 files changed, 316 insertions, 1 deletions
diff --git a/tests/manual/manual.pro b/tests/manual/manual.pro
index 9318824e6d..e593756a7d 100644
--- a/tests/manual/manual.pro
+++ b/tests/manual/manual.pro
@@ -47,7 +47,10 @@ unc
!contains(QT_CONFIG, openssl):!contains(QT_CONFIG, openssl-linked):SUBDIRS -= qssloptions
-contains(QT_CONFIG, opengl):SUBDIRS += qopengltextureblitter
+contains(QT_CONFIG, opengl) {
+ SUBDIRS += qopengltextureblitter
+ contains(QT_CONFIG, egl): SUBDIRS += qopenglcontext
+}
win32 {
SUBDIRS -= network_remote_stresstest network_stresstest
diff --git a/tests/manual/qopenglcontext/main.cpp b/tests/manual/qopenglcontext/main.cpp
new file mode 100644
index 0000000000..dd3178f466
--- /dev/null
+++ b/tests/manual/qopenglcontext/main.cpp
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** 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, Digia gives you certain additional
+** rights. These rights are described in the Digia 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.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui/QGuiApplication>
+#include "qopenglcontextwindow.h"
+
+int main(int argc, char **argv)
+{
+ QGuiApplication app(argc, argv);
+
+ QOpenGLContextWindow window;
+ window.resize(300, 300);
+ window.show();
+
+ return app.exec();
+}
diff --git a/tests/manual/qopenglcontext/qopenglcontext.pro b/tests/manual/qopenglcontext/qopenglcontext.pro
new file mode 100644
index 0000000000..c5943809c6
--- /dev/null
+++ b/tests/manual/qopenglcontext/qopenglcontext.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+TARGET = qopenglcontext
+
+QT += gui-private platformsupport-private
+
+HEADERS += $$PWD/qopenglcontextwindow.h
+
+SOURCES += $$PWD/main.cpp \
+ $$PWD/qopenglcontextwindow.cpp
diff --git a/tests/manual/qopenglcontext/qopenglcontextwindow.cpp b/tests/manual/qopenglcontext/qopenglcontextwindow.cpp
new file mode 100644
index 0000000000..bf6fe30c00
--- /dev/null
+++ b/tests/manual/qopenglcontext/qopenglcontextwindow.cpp
@@ -0,0 +1,173 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** 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, Digia gives you certain additional
+** rights. These rights are described in the Digia 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.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopenglcontextwindow.h"
+#include <QtGui/QOpenGLFunctions>
+#include <QtGui/QOffscreenSurface>
+#include <QtGui/QGuiApplication>
+#include <QtGui/QMatrix4x4>
+#include <qpa/qplatformnativeinterface.h>
+
+#include <QtPlatformSupport/private/qeglconvenience_p.h>
+#include <QtPlatformHeaders/QEGLNativeContext>
+
+QOpenGLContextWindow::QOpenGLContextWindow()
+ : m_blitter(0)
+{
+ setSurfaceType(OpenGLSurface);
+
+ m_context = new QOpenGLContext(this);
+ m_context->setFormat(requestedFormat());
+ m_context->create();
+
+ m_image = QImage(QStringLiteral("qticon64.png")).convertToFormat(QImage::Format_RGBA8888);
+ Q_ASSERT(!m_image.isNull());
+
+ create(); // to make sure format() returns something real
+ createForeignContext();
+}
+
+QOpenGLContextWindow::~QOpenGLContextWindow()
+{
+ if (m_blitter) {
+ m_blitter->destroy(); // the dtor does not call this for some reason
+ delete m_blitter;
+ }
+}
+
+void QOpenGLContextWindow::render()
+{
+ if (!m_context->makeCurrent(this))
+ qFatal("makeCurrent() failed");
+
+ QOpenGLFunctions *f = m_context->functions();
+ f->glViewport(0, 0, dWidth(), dHeight());
+ f->glClearColor(0, 0, 0, 1);
+ f->glClear(GL_COLOR_BUFFER_BIT);
+
+ if (!m_blitter) {
+ m_blitter = new QOpenGLTextureBlitter;
+ m_blitter->create();
+ }
+
+ // Draw the image. If nothing gets shown, then something went wrong with the context
+ // adoption or sharing was not successfully enabled.
+ m_blitter->bind();
+ QRectF r(0, 0, dWidth(), dHeight());
+ QMatrix4x4 target = QOpenGLTextureBlitter::targetTransform(QRectF(100, 100, 100, 100), r.toRect());
+ m_blitter->blit(m_textureId, target, QOpenGLTextureBlitter::OriginTopLeft);
+ m_blitter->release();
+
+ m_context->swapBuffers(this);
+}
+
+void QOpenGLContextWindow::exposeEvent(QExposeEvent *)
+{
+ if (isExposed())
+ render();
+}
+
+void QOpenGLContextWindow::createForeignContext()
+{
+ // Here a context will be created manually. This context will share with m_context's
+ // underlying native context. This way the texture, that belongs to the context
+ // created here, will be accessible from m_context too.
+
+ EGLContext shareCtx = m_context->nativeHandle().value<QEGLNativeContext>().context();
+ Q_ASSERT(shareCtx != EGL_NO_CONTEXT);
+
+ EGLDisplay dpy = (EGLDisplay) qGuiApp->platformNativeInterface()->nativeResourceForWindow(
+ QByteArrayLiteral("egldisplay"), this);
+ Q_ASSERT(dpy != EGL_NO_DISPLAY);
+
+ QSurfaceFormat fmt = format();
+ EGLConfig config = q_configFromGLFormat(dpy, fmt);
+
+ QVector<EGLint> contextAttrs;
+ contextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
+ contextAttrs.append(fmt.majorVersion());
+ contextAttrs.append(EGL_NONE);
+ switch (fmt.renderableType()) {
+#ifdef EGL_VERSION_1_4
+ case QSurfaceFormat::OpenGL:
+ eglBindAPI(EGL_OPENGL_API);
+ break;
+#endif // EGL_VERSION_1_4
+ default:
+ eglBindAPI(EGL_OPENGL_ES_API);
+ break;
+ }
+
+ EGLContext ctx = eglCreateContext(dpy, config, shareCtx, contextAttrs.constData());
+ Q_ASSERT(ctx != EGL_NO_CONTEXT);
+
+ // Wrap ctx into a QOpenGLContext.
+ QOpenGLContext *ctxWrap = new QOpenGLContext;
+ ctxWrap->setNativeHandle(QVariant::fromValue<QEGLNativeContext>(QEGLNativeContext(ctx, dpy)));
+ ctxWrap->setShareContext(m_context); // only needed for correct bookkeeping
+ if (!ctxWrap->create())
+ qFatal("Failed to created wrapping context");
+ Q_ASSERT(ctxWrap->nativeHandle().value<QEGLNativeContext>().context() == ctx);
+
+ QOffscreenSurface surface;
+ surface.setFormat(fmt);
+ surface.create();
+
+ if (!ctxWrap->makeCurrent(&surface))
+ qFatal("Failed to make pbuffer surface current");
+
+ // Create the texture.
+ QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
+ GLuint textureId = 0;
+ f->glGenTextures(1, &textureId);
+ f->glBindTexture(GL_TEXTURE_2D, textureId);
+ f->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ f->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_image.width(), m_image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ m_image.constBits());
+ Q_ASSERT(f->glGetError() == GL_NO_ERROR);
+
+ ctxWrap->doneCurrent();
+ delete ctxWrap; // ctx is not destroyed
+ eglDestroyContext(dpy, ctx); // resources like the texture stay alive until any context on the share list is alive
+ Q_ASSERT(eglGetError() == EGL_SUCCESS);
+
+ m_textureId = textureId;
+}
diff --git a/tests/manual/qopenglcontext/qopenglcontextwindow.h b/tests/manual/qopenglcontext/qopenglcontextwindow.h
new file mode 100644
index 0000000000..6fcb3633bf
--- /dev/null
+++ b/tests/manual/qopenglcontext/qopenglcontextwindow.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** 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, Digia gives you certain additional
+** rights. These rights are described in the Digia 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.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLCONTEXTWINDOW_H
+#define QOPENGLCONTEXTWINDOW_H
+
+#include <QtGui/QWindow>
+#include <QtGui/QOpenGLContext>
+#include <QtGui/QImage>
+#include <QtCore/QVariant>
+#include <QtGui/private/qopengltextureblitter_p.h>
+
+class QOpenGLContextWindow : public QWindow
+{
+ Q_OBJECT
+
+public:
+ QOpenGLContextWindow();
+ ~QOpenGLContextWindow();
+
+ void render();
+
+protected:
+ void exposeEvent(QExposeEvent *event);
+
+private:
+ qreal dWidth() const { return width() * devicePixelRatio(); }
+ qreal dHeight() const { return height() * devicePixelRatio(); }
+ void createForeignContext();
+
+ QOpenGLContext *m_context;
+ QImage m_image;
+ QVariant m_nativeHandle;
+ uint m_textureId;
+ QOpenGLTextureBlitter *m_blitter;
+};
+
+#endif
diff --git a/tests/manual/qopenglcontext/qticon64.png b/tests/manual/qopenglcontext/qticon64.png
new file mode 100644
index 0000000000..76f02c6c96
--- /dev/null
+++ b/tests/manual/qopenglcontext/qticon64.png
Binary files differ