diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/rhi/qshader.cpp | 38 | ||||
-rw-r--r-- | src/gui/rhi/qshader_p.h | 2 | ||||
-rw-r--r-- | src/gui/rhi/qshader_p_p.h | 9 |
3 files changed, 45 insertions, 4 deletions
diff --git a/src/gui/rhi/qshader.cpp b/src/gui/rhi/qshader.cpp index 1992708ba4..cd4a9f3854 100644 --- a/src/gui/rhi/qshader.cpp +++ b/src/gui/rhi/qshader.cpp @@ -564,6 +564,22 @@ size_t qHash(const QShaderVersion &s, size_t seed) noexcept #endif /*! + Establishes a sorting order between the two QShaderVersion \a lhs and \a rhs. + + \relates QShaderVersion + */ +bool operator<(const QShaderVersion &lhs, const QShaderVersion &rhs) noexcept +{ + if (lhs.version() < rhs.version()) + return true; + + if (lhs.version() == rhs.version()) + return int(lhs.flags()) < int(rhs.flags()); + + return false; +} + +/*! \internal \fn bool operator!=(const QShaderVersion &lhs, const QShaderVersion &rhs) @@ -585,6 +601,28 @@ bool operator==(const QShaderKey &lhs, const QShaderKey &rhs) noexcept } /*! + Establishes a sorting order between the two keys \a lhs and \a rhs. + + \relates QShaderKey + */ +bool operator<(const QShaderKey &lhs, const QShaderKey &rhs) noexcept +{ + if (int(lhs.source()) < int(rhs.source())) + return true; + + if (int(lhs.source()) == int(rhs.source())) { + if (lhs.sourceVersion() < rhs.sourceVersion()) + return true; + if (lhs.sourceVersion() == rhs.sourceVersion()) { + if (int(lhs.sourceVariant()) < int(rhs.sourceVariant())) + return true; + } + } + + return false; +} + +/*! \internal \fn bool operator!=(const QShaderKey &lhs, const QShaderKey &rhs) diff --git a/src/gui/rhi/qshader_p.h b/src/gui/rhi/qshader_p.h index 690a7f44cd..c6ef338bfa 100644 --- a/src/gui/rhi/qshader_p.h +++ b/src/gui/rhi/qshader_p.h @@ -187,7 +187,9 @@ inline bool operator!=(const QShader &lhs, const QShader &rhs) noexcept } Q_GUI_EXPORT bool operator==(const QShaderVersion &lhs, const QShaderVersion &rhs) noexcept; +Q_GUI_EXPORT bool operator<(const QShaderVersion &lhs, const QShaderVersion &rhs) noexcept; Q_GUI_EXPORT bool operator==(const QShaderKey &lhs, const QShaderKey &rhs) noexcept; +Q_GUI_EXPORT bool operator<(const QShaderKey &lhs, const QShaderKey &rhs) noexcept; Q_GUI_EXPORT bool operator==(const QShaderCode &lhs, const QShaderCode &rhs) noexcept; inline bool operator!=(const QShaderVersion &lhs, const QShaderVersion &rhs) noexcept diff --git a/src/gui/rhi/qshader_p_p.h b/src/gui/rhi/qshader_p_p.h index c87f882bc5..e9d1e31aaf 100644 --- a/src/gui/rhi/qshader_p_p.h +++ b/src/gui/rhi/qshader_p_p.h @@ -17,7 +17,7 @@ #include "qshader_p.h" #include <QtCore/QAtomicInt> -#include <QtCore/QHash> +#include <QtCore/QMap> #include <QtCore/QDebug> QT_BEGIN_NAMESPACE @@ -54,9 +54,10 @@ struct Q_GUI_EXPORT QShaderPrivate int qsbVersion = QSB_VERSION; QShader::Stage stage = QShader::VertexStage; QShaderDescription desc; - QHash<QShaderKey, QShaderCode> shaders; - QHash<QShaderKey, QShader::NativeResourceBindingMap> bindings; - QHash<QShaderKey, QShader::SeparateToCombinedImageSamplerMappingList> combinedImageMap; + // QMap not QHash because we need to be able to iterate based on sorted keys + QMap<QShaderKey, QShaderCode> shaders; + QMap<QShaderKey, QShader::NativeResourceBindingMap> bindings; + QMap<QShaderKey, QShader::SeparateToCombinedImageSamplerMappingList> combinedImageMap; }; QT_END_NAMESPACE |