Add OpenGLInfo attached type

[ChangeLog][QtQuick] Introduced OpenGLInfo attached type that
provides information about the currently used OpenGL version.

Change-Id: Ibdf365decf9d6331cf91c0bf541e493ced02a417
Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com>
This commit is contained in:
J-P Nurmi 2014-08-09 23:42:20 +02:00
parent 549f76b521
commit af6ca36c83
9 changed files with 439 additions and 2 deletions

View File

@ -78,7 +78,8 @@ HEADERS += \
$$PWD/qquickframebufferobject.h \
$$PWD/qquickitemgrabresult.h \
$$PWD/qquickrendercontrol.h \
$$PWD/qquickrendercontrol_p.h
$$PWD/qquickrendercontrol_p.h \
$$PWD/qquickopenglinfo_p.h
SOURCES += \
$$PWD/qquickevents.cpp \
@ -133,7 +134,8 @@ SOURCES += \
$$PWD/qquickwindowattached.cpp \
$$PWD/qquickframebufferobject.cpp \
$$PWD/qquickitemgrabresult.cpp \
$$PWD/qquickrendercontrol.cpp
$$PWD/qquickrendercontrol.cpp \
$$PWD/qquickopenglinfo.cpp
SOURCES += \
$$PWD/qquickshadereffect.cpp \

View File

@ -83,6 +83,7 @@
#include "qquickdrag_p.h"
#include "qquickdroparea_p.h"
#include "qquickmultipointtoucharea_p.h"
#include "qquickopenglinfo_p.h"
#include <private/qqmlmetatype_p.h>
#include <QtQuick/private/qquickaccessibleattached_p.h>
@ -273,6 +274,7 @@ static void qt_quickitems_defineModule(const char *uri, int major, int minor)
qmlRegisterType<QQuickListView, 2>(uri, 2, 4, "ListView");
qmlRegisterType<QQuickMouseArea, 1>(uri, 2, 4, "MouseArea");
qmlRegisterType<QQuickShaderEffect, 1>(uri, 2, 4, "ShaderEffect");
qmlRegisterUncreatableType<QQuickOpenGLInfo>(uri, 2, 4,"OpenGLInfo", QQuickOpenGLInfo::tr("OpenGLInfo is only available via attached properties"));
}
static void initResources()

View File

@ -0,0 +1,200 @@
/****************************************************************************
**
** Copyright (C) 2014 BlackBerry Ltd.
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the QtQuick module 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 "qquickopenglinfo_p.h"
#include "qopenglcontext.h"
#include "qquickwindow.h"
#include "qquickitem.h"
QT_BEGIN_NAMESPACE
/*!
\qmltype OpenGLInfo
\instantiates QQuickOpenGLInfo
\inqmlmodule QtQuick
\ingroup qtquick-effects
\since 5.4
\brief Provides information about the used OpenGL version
The OpenGLInfo attached type provides information about the OpenGL
version being used to render the surface of the attachee item.
If the attachee item is not currently associated with any graphical
surface, the properties are set to the values of the default surface
format. When it becomes associated with a surface, all properties
will update.
\sa ShaderEffect
*/
QQuickOpenGLInfo::QQuickOpenGLInfo(QQuickItem *item)
: QObject(item)
, m_window(0)
, m_majorVersion(2)
, m_minorVersion(0)
, m_profile(NoProfile)
, m_renderableType(Unspecified)
{
connect(item, SIGNAL(windowChanged(QQuickWindow*)), this, SLOT(setWindow(QQuickWindow*)));
setWindow(item->window());
}
/*!
\qmlproperty int QtQuick::OpenGLInfo::majorVersion
This property holds the major OpenGL version.
The default version is \c 2.0.
\sa minorVersion, profile
*/
int QQuickOpenGLInfo::majorVersion() const
{
return m_majorVersion;
}
/*!
\qmlproperty int QtQuick::OpenGLInfo::minorVersion
This property holds the minor OpenGL version.
The default version is \c 2.0.
\sa majorVersion, profile
*/
int QQuickOpenGLInfo::minorVersion() const
{
return m_minorVersion;
}
/*!
\qmlproperty enumeration QtQuick::OpenGLInfo::profile
This property holds the configured OpenGL context profile.
The possible values are:
\list
\li OpenGLInfo.NoProfile (default) - OpenGL version is lower than 3.2.
\li OpenGLInfo.CoreProfile - Functionality deprecated in OpenGL version 3.0 is not available.
\li OpenGLInfo.CompatibilityProfile - Functionality from earlier OpenGL versions is available.
\endlist
Reusable QML components will typically use this property in bindings in order to
choose between core and non core profile compatible shader sources.
\sa majorVersion, minorVersion
*/
QQuickOpenGLInfo::ContextProfile QQuickOpenGLInfo::profile() const
{
return m_profile;
}
/*!
\qmlproperty enumeration QtQuick::OpenGLInfo::renderableType
This property holds the renderable type.
The possible values are:
\list
\li OpenGLInfo.Unspecified (default) - Unspecified rendering method
\li OpenGLInfo.OpenGL - Desktop OpenGL rendering
\li OpenGLInfo.OpenGLES - OpenGL ES rendering
\endlist
*/
QQuickOpenGLInfo::RenderableType QQuickOpenGLInfo::renderableType() const
{
return m_renderableType;
}
QQuickOpenGLInfo *QQuickOpenGLInfo::qmlAttachedProperties(QObject *object)
{
if (QQuickItem *item = qobject_cast<QQuickItem *>(object))
return new QQuickOpenGLInfo(item);
return 0;
}
void QQuickOpenGLInfo::updateFormat()
{
QOpenGLContext *context = 0;
if (m_window)
context = m_window->openglContext();
QSurfaceFormat format = context ? context->format() : QSurfaceFormat::defaultFormat();
if (m_majorVersion != format.majorVersion()) {
m_majorVersion = format.majorVersion();
emit majorVersionChanged();
}
if (m_minorVersion != format.minorVersion()) {
m_minorVersion = format.minorVersion();
emit minorVersionChanged();
}
ContextProfile profile = static_cast<ContextProfile>(format.profile());
if (m_profile != profile) {
m_profile = profile;
emit profileChanged();
}
RenderableType renderableType = static_cast<RenderableType>(format.renderableType());
if (m_renderableType != renderableType) {
m_renderableType = renderableType;
emit renderableTypeChanged();
}
}
void QQuickOpenGLInfo::setWindow(QQuickWindow *window)
{
if (m_window != window) {
if (m_window) {
disconnect(m_window, SIGNAL(sceneGraphInitialized()), this, SLOT(updateFormat()));
disconnect(m_window, SIGNAL(sceneGraphInvalidated()), this, SLOT(updateFormat()));
}
if (window) {
connect(window, SIGNAL(sceneGraphInitialized()), this, SLOT(updateFormat()));
connect(window, SIGNAL(sceneGraphInvalidated()), this, SLOT(updateFormat()));
}
m_window = window;
}
updateFormat();
}
QT_END_NAMESPACE

View File

@ -0,0 +1,122 @@
/****************************************************************************
**
** Copyright (C) 2014 BlackBerry Ltd.
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the QtQuick module 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 QQUICKOPENGLINFO_P_H
#define QQUICKOPENGLINFO_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <QtCore/qobject.h>
#include <QtCore/qpointer.h>
#include <QtGui/qsurfaceformat.h>
#include <QtQml/qqml.h>
QT_BEGIN_NAMESPACE
class QQuickItem;
class QQuickWindow;
class QQuickOpenGLInfo : public QObject
{
Q_OBJECT
Q_PROPERTY(int majorVersion READ majorVersion NOTIFY majorVersionChanged FINAL)
Q_PROPERTY(int minorVersion READ minorVersion NOTIFY minorVersionChanged FINAL)
Q_PROPERTY(ContextProfile profile READ profile NOTIFY profileChanged FINAL)
Q_PROPERTY(RenderableType renderableType READ renderableType NOTIFY renderableTypeChanged FINAL)
Q_ENUMS(ContextProfile RenderableType)
public:
QQuickOpenGLInfo(QQuickItem *item = 0);
int majorVersion() const;
int minorVersion() const;
// keep in sync with QSurfaceFormat::OpenGLContextProfile
enum ContextProfile {
NoProfile = QSurfaceFormat::NoProfile,
CoreProfile = QSurfaceFormat::CoreProfile,
CompatibilityProfile = QSurfaceFormat::CompatibilityProfile
};
ContextProfile profile() const;
// keep in sync with QSurfaceFormat::RenderableType
enum RenderableType {
Unspecified = QSurfaceFormat::DefaultRenderableType,
OpenGL = QSurfaceFormat::OpenGL,
OpenGLES = QSurfaceFormat::OpenGLES
};
RenderableType renderableType() const;
static QQuickOpenGLInfo *qmlAttachedProperties(QObject *object);
Q_SIGNALS:
void majorVersionChanged();
void minorVersionChanged();
void profileChanged();
void renderableTypeChanged();
private Q_SLOTS:
void updateFormat();
void setWindow(QQuickWindow *window);
private:
QPointer<QQuickWindow> m_window;
int m_majorVersion;
int m_minorVersion;
ContextProfile m_profile;
RenderableType m_renderableType;
};
QT_END_NAMESPACE
QML_DECLARE_TYPEINFO(QQuickOpenGLInfo, QML_HAS_ATTACHED_PROPERTIES)
#endif // QQUICKOPENGLINFO_P_H

View File

@ -651,6 +651,8 @@ void QQuickShaderEffectCommon::propertyChanged(QQuickItem *item, int mappedId,
\note Scene Graph textures have origin in the top-left corner rather than
bottom-left which is common in OpenGL.
For information about the GLSL version being used, see \l QtQuick::OpenGLInfo.
*/
QQuickShaderEffect::QQuickShaderEffect(QQuickItem *parent)

View File

@ -0,0 +1,8 @@
import QtQuick 2.4
Item {
property int majorVersion: OpenGLInfo.majorVersion
property int minorVersion: OpenGLInfo.minorVersion
property int profile: OpenGLInfo.profile
property int renderableType: OpenGLInfo.renderableType
}

View File

@ -0,0 +1,15 @@
CONFIG += testcase
TARGET = tst_qquickopenglinfo
SOURCES += tst_qquickopenglinfo.cpp
TESTDATA = data/*
include(../../shared/util.pri)
osx:CONFIG -= app_bundle
CONFIG += parallel_test
QT += quick testlib
OTHER_FILES += \
data/basic.qml

View File

@ -0,0 +1,85 @@
/****************************************************************************
**
** Copyright (C) 2014 BlackBerry Ltd.
** 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 <QtTest/qtest.h>
#include <QtTest/qsignalspy.h>
#include <QtQuick/qquickitem.h>
#include <QtQuick/qquickview.h>
#include <QtGui/qopenglcontext.h>
#include <QtGui/qsurfaceformat.h>
#include "../../shared/util.h"
class tst_QQuickOpenGLInfo : public QQmlDataTest
{
Q_OBJECT
private slots:
void testProperties();
};
void tst_QQuickOpenGLInfo::testProperties()
{
QQuickView view;
view.setSource(QUrl::fromLocalFile("data/basic.qml"));
view.show();
QVERIFY(QTest::qWaitForWindowExposed(&view));
QSignalSpy spy(&view, SIGNAL(sceneGraphInitialized()));
spy.wait();
QVERIFY(view.openglContext());
QSurfaceFormat format = view.openglContext()->format();
QObject* obj = view.rootObject();
QVERIFY(obj);
QCOMPARE(obj->property("majorVersion").toInt(), format.majorVersion());
QCOMPARE(obj->property("minorVersion").toInt(), format.minorVersion());
QCOMPARE(obj->property("profile").toInt(), static_cast<int>(format.profile()));
QCOMPARE(obj->property("renderableType").toInt(), static_cast<int>(format.renderableType()));
}
QTEST_MAIN(tst_QQuickOpenGLInfo)
#include "tst_qquickopenglinfo.moc"

View File

@ -56,6 +56,7 @@ QUICKTESTS = \
qquickloader \
qquickmousearea \
qquickmultipointtoucharea \
qquickopenglinfo \
qquickpainteditem \
qquickpathview \
qquickpincharea \