diff options
| -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 | ||||
| -rw-r--r-- | tests/auto/gui/rhi/qshader/tst_qshader.cpp | 11 |
4 files changed, 56 insertions, 4 deletions
diff --git a/src/gui/rhi/qshader.cpp b/src/gui/rhi/qshader.cpp index 1992708ba42..cd4a9f38549 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 690a7f44cdd..c6ef338bfad 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 c87f882bc51..e9d1e31aaf1 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 diff --git a/tests/auto/gui/rhi/qshader/tst_qshader.cpp b/tests/auto/gui/rhi/qshader/tst_qshader.cpp index cd883b34d92..40aa9d9a87a 100644 --- a/tests/auto/gui/rhi/qshader/tst_qshader.cpp +++ b/tests/auto/gui/rhi/qshader/tst_qshader.cpp @@ -18,6 +18,7 @@ private slots: void genVariants(); void shaderDescImplicitSharing(); void bakedShaderImplicitSharing(); + void sortedKeys(); void mslResourceMapping(); void serializeShaderDesc(); void comparison(); @@ -238,6 +239,16 @@ void tst_QShader::bakedShaderImplicitSharing() } } +void tst_QShader::sortedKeys() +{ + QShader s = getShader(QLatin1String(":/data/texture_all_v4.frag.qsb")); + QVERIFY(s.isValid()); + QList<QShaderKey> availableShaders = s.availableShaders(); + QCOMPARE(availableShaders.count(), 7); + std::sort(availableShaders.begin(), availableShaders.end()); + QCOMPARE(availableShaders, s.availableShaders()); +} + void tst_QShader::mslResourceMapping() { QShader s = getShader(QLatin1String(":/data/texture_all_v4.frag.qsb")); |
