/**************************************************************************** ** ** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB). ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt3D module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:COMM$ ** ** 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. ** ** $QT_END_LICENSE$ ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ****************************************************************************/ #include "qgraphicsapifilter.h" #include "qgraphicsapifilter_p.h" #include "private/qobject_p.h" #include QT_BEGIN_NAMESPACE namespace Qt3DRender { GraphicsApiFilterData::GraphicsApiFilterData() : m_api(QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL ? QGraphicsApiFilter::OpenGL : QGraphicsApiFilter::OpenGLES) , m_profile(QGraphicsApiFilter::NoProfile) // matches all (no profile, core, compat) , m_minor(0) , m_major(0) {} QString GraphicsApiFilterData::toString() const { QLatin1String api; switch (m_api) { case QGraphicsApiFilter::OpenGL: api = QLatin1String("OpenGL"); break; case QGraphicsApiFilter::OpenGLES: api = QLatin1String("OpenGL"); break; case QGraphicsApiFilter::Vulkan: api = QLatin1String("Vulkan"); break; case QGraphicsApiFilter::DirectX: api = QLatin1String("DirectX"); break; case QGraphicsApiFilter::RHI: api = QLatin1String("RHI"); break; default: Q_UNREACHABLE(); } QLatin1String profile; switch (m_profile) { case QGraphicsApiFilter::CoreProfile: profile = QLatin1String(" (Core Profile)"); break; case QGraphicsApiFilter::CompatibilityProfile: profile = QLatin1String(" (Compatibility Profile)"); break; default: break; } return QString(QLatin1String("%1 %2.%3%4 (%5)").arg(api, QString::number(m_major), QString::number(m_minor), profile, m_vendor)); } bool GraphicsApiFilterData::operator ==(const GraphicsApiFilterData &other) const { // Check API if (other.m_api != m_api) return false; // Check versions const bool versionsCompatible = other.m_major < m_major || (other.m_major == m_major && other.m_minor <= m_minor); if (!versionsCompatible) return false; // Check profiles if requiring OpenGL (profiles not relevant for OpenGL ES) if (other.m_api == QGraphicsApiFilter::OpenGL) { const bool profilesCompatible = m_profile != QGraphicsApiFilter::CoreProfile || other.m_profile == m_profile; if (!profilesCompatible) return false; } // Check extensions for (const QString &neededExt : other.m_extensions) { if (!m_extensions.contains(neededExt)) return false; } // Check vendor if (!other.m_vendor.isEmpty()) return (other.m_vendor == m_vendor); // If we get here everything looks good :) return true; } bool GraphicsApiFilterData::operator <(const GraphicsApiFilterData &other) const { if (this->m_major > other.m_major) return false; if (this->m_major == other.m_major && this->m_minor > other.m_minor) return false; return true; } bool GraphicsApiFilterData::operator !=(const GraphicsApiFilterData &other) const { return !(*this == other); } QGraphicsApiFilterPrivate *QGraphicsApiFilterPrivate::get(QGraphicsApiFilter *q) { return q->d_func(); } const QGraphicsApiFilterPrivate *QGraphicsApiFilterPrivate::get(const QGraphicsApiFilter *q) { return q->d_func(); } /*! \class Qt3DRender::QGraphicsApiFilter \inmodule Qt3DRender \since 5.5 \brief The QGraphicsApiFilter class identifies the API required for the attached QTechnique. */ /*! \qmltype GraphicsApiFilter \instantiates Qt3DRender::QGraphicsApiFilter \inherits QtObject \inqmlmodule Qt3D.Render \since 5.5 \brief For OpenGL identifies the API required for the attached technique. */ /*! \fn Qt3DRender::QGraphicsApiFilter::QGraphicsApiFilter(QObject *parent) Constructs a new QGraphicsApiFilter with the specified \a parent. */ QGraphicsApiFilter::QGraphicsApiFilter(QObject *parent) : QObject(*new QGraphicsApiFilterPrivate, parent) { } /*! \internal */ QGraphicsApiFilter::~QGraphicsApiFilter() { } /*! \enum Qt3DRender::QGraphicsApiFilter::Api \value OpenGLES QSurfaceFormat::OpenGLES \value OpenGL QSurfaceFormat::OpenGL \value Vulkan Vulkan \value DirectX DirectX */ /*! \enum Qt3DRender::QGraphicsApiFilter::OpenGLProfile This enum identifies the type of profile required. \value NoProfile QSurfaceFormat::NoProfile \value CoreProfile QSurfaceFormat::CoreProfile \value CompatibilityProfile QSurfaceFormat::CompatibilityProfile */ /*! \property Qt3DRender::QGraphicsApiFilter::api */ /*! \qmlproperty enumeration Qt3D.Render::GraphicsApiFilter::api \value OpenGLES QSurfaceFormat::OpenGLES \value OpenGL QSurfaceFormat::OpenGL */ QGraphicsApiFilter::Api QGraphicsApiFilter::api() const { Q_D(const QGraphicsApiFilter); return d->m_data.m_api; } /*! \property Qt3DRender::QGraphicsApiFilter::profile */ /*! \qmlproperty enumeration Qt3D.Render::GraphicsApiFilter::profile \value NoProfile QSurfaceFormat::NoProfile \value CoreProfile QSurfaceFormat::CoreProfile \value CompatibilityProfile QSurfaceFormat::CompatibilityProfile */ QGraphicsApiFilter::OpenGLProfile QGraphicsApiFilter::profile() const { Q_D(const QGraphicsApiFilter); return d->m_data.m_profile; } /*! \property Qt3DRender::QGraphicsApiFilter::minorVersion */ /*! \qmlproperty int Qt3D.Render::GraphicsApiFilter::minorVersion */ int QGraphicsApiFilter::minorVersion() const { Q_D(const QGraphicsApiFilter); return d->m_data.m_minor; } /*! \property Qt3DRender::QGraphicsApiFilter::majorVersion */ /*! \qmlproperty int Qt3D.Render::GraphicsApiFilter::majorVersion */ int QGraphicsApiFilter::majorVersion() const { Q_D(const QGraphicsApiFilter); return d->m_data.m_major; } /*! \property Qt3DRender::QGraphicsApiFilter::extensions */ /*! \qmlproperty stringlist Qt3D.Render::GraphicsApiFilter::extensions */ QStringList QGraphicsApiFilter::extensions() const { Q_D(const QGraphicsApiFilter); return d->m_data.m_extensions; } /*! \property Qt3DRender::QGraphicsApiFilter::vendor */ /*! \qmlproperty string Qt3D.Render::GraphicsApiFilter::vendor */ QString QGraphicsApiFilter::vendor() const { Q_D(const QGraphicsApiFilter); return d->m_data.m_vendor; } void QGraphicsApiFilter::setApi(QGraphicsApiFilter::Api api) { Q_D(QGraphicsApiFilter); if (d->m_data.m_api != api) { d->m_data.m_api = api; emit apiChanged(api); emit graphicsApiFilterChanged(); } } void QGraphicsApiFilter::setProfile(QGraphicsApiFilter::OpenGLProfile profile) { Q_D(QGraphicsApiFilter); if (d->m_data.m_profile != profile) { d->m_data.m_profile = profile; emit profileChanged(profile); emit graphicsApiFilterChanged(); } } void QGraphicsApiFilter::setMinorVersion(int minorVersion) { Q_D(QGraphicsApiFilter); if (minorVersion != d->m_data.m_minor) { d->m_data.m_minor = minorVersion; emit minorVersionChanged(minorVersion); emit graphicsApiFilterChanged(); } } void QGraphicsApiFilter::setMajorVersion(int majorVersion) { Q_D(QGraphicsApiFilter); if (d->m_data.m_major != majorVersion) { d->m_data.m_major = majorVersion; emit majorVersionChanged(majorVersion); emit graphicsApiFilterChanged(); } } void QGraphicsApiFilter::setExtensions(const QStringList &extensions) { Q_D(QGraphicsApiFilter); if (d->m_data.m_extensions != extensions) { d->m_data.m_extensions = extensions; emit extensionsChanged(extensions); emit graphicsApiFilterChanged(); } } void QGraphicsApiFilter::setVendor(const QString &vendor) { Q_D(QGraphicsApiFilter); if (d->m_data.m_vendor != vendor) { d->m_data.m_vendor = vendor; emit vendorChanged(vendor); emit graphicsApiFilterChanged(); } } /*! \fn bool Qt3DRender::operator ==(const QGraphicsApiFilter &reference, const QGraphicsApiFilter &sample) \relates Qt3DRender::QGraphicsApiFilter Returns \c true if \a reference and \a sample are equivalent. */ bool operator ==(const QGraphicsApiFilter &reference, const QGraphicsApiFilter &sample) { return QGraphicsApiFilterPrivate::get(const_cast(&reference))->m_data == QGraphicsApiFilterPrivate::get(const_cast(&sample))->m_data; } /*! \fn bool Qt3DRender::operator !=(const QGraphicsApiFilter &reference, const QGraphicsApiFilter &sample) \relates Qt3DRender::QGraphicsApiFilter Returns \c true if \a reference and \a sample are different. */ bool operator !=(const QGraphicsApiFilter &reference, const QGraphicsApiFilter &sample) { return !(reference == sample); } /*! \fn void Qt3DRender::QGraphicsApiFilter::graphicsApiFilterChanged() This signal is emitted when the value of any property is changed. */ } // namespace Qt3DRender QT_END_NAMESPACE