| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 BlackBerry Ltd. |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** 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 The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/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 3 as published by the Free Software |
| ** Foundation and appearing in the file LICENSE.LGPL3 included in the |
| ** packaging of this file. Please review the following information to |
| ** ensure the GNU Lesser General Public License version 3 requirements |
| ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. |
| ** |
| ** GNU General Public License Usage |
| ** Alternatively, this file may be used under the terms of the GNU |
| ** General Public License version 2.0 or (at your option) the GNU General |
| ** Public license version 3 or any later version approved by the KDE Free |
| ** Qt Foundation. The licenses are as published by the Free Software |
| ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 |
| ** included in the packaging of this file. Please review the following |
| ** information to ensure the GNU General Public License requirements will |
| ** be met: https://www.gnu.org/licenses/gpl-2.0.html and |
| ** https://www.gnu.org/licenses/gpl-3.0.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. |
| |
| \deprecated |
| |
| \warning This type is deprecated. Use GraphicsInfo instead. |
| |
| \sa ShaderEffect |
| */ |
| QQuickOpenGLInfo::QQuickOpenGLInfo(QQuickItem *item) |
| : QObject(item) |
| , m_window(nullptr) |
| , 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 nullptr; |
| } |
| |
| void QQuickOpenGLInfo::updateFormat() |
| { |
| QOpenGLContext *context = nullptr; |
| 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 |
| |
| #include "moc_qquickopenglinfo_p.cpp" |