summaryrefslogtreecommitdiffstats
path: root/tests/auto/gui/rhi/qshader/tst_qshader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/gui/rhi/qshader/tst_qshader.cpp')
-rw-r--r--tests/auto/gui/rhi/qshader/tst_qshader.cpp142
1 files changed, 129 insertions, 13 deletions
diff --git a/tests/auto/gui/rhi/qshader/tst_qshader.cpp b/tests/auto/gui/rhi/qshader/tst_qshader.cpp
index a0082f1e3b..ab7115b74a 100644
--- a/tests/auto/gui/rhi/qshader/tst_qshader.cpp
+++ b/tests/auto/gui/rhi/qshader/tst_qshader.cpp
@@ -43,6 +43,8 @@ private slots:
void mslResourceMapping();
void loadV3();
void serializeShaderDesc();
+ void comparison();
+ void loadV4();
};
static QShader getShader(const QString &name)
@@ -353,36 +355,63 @@ void tst_QShader::serializeShaderDesc()
QShaderDescription desc;
QVERIFY(!desc.isValid());
- const QByteArray data = desc.toCbor();
+ QByteArray data;
+ {
+ QBuffer buf(&data);
+ QDataStream ds(&buf);
+ QVERIFY(buf.open(QIODevice::WriteOnly));
+ desc.serialize(&ds);
+ }
QVERIFY(!data.isEmpty());
- QShaderDescription desc2 = QShaderDescription::fromCbor(data);
- QVERIFY(!desc2.isValid());
+ {
+ QBuffer buf(&data);
+ QDataStream ds(&buf);
+ QVERIFY(buf.open(QIODevice::ReadOnly));
+ QShaderDescription desc2 = QShaderDescription::deserialize(&ds);
+ QVERIFY(!desc2.isValid());
+ }
}
// a QShaderDescription with inputs, outputs, uniform block and combined image sampler
{
- QShader s = getShader(QLatin1String(":/data/texture_all_v3.frag.qsb"));
+ QShader s = getShader(QLatin1String(":/data/texture_all_v4.frag.qsb"));
QVERIFY(s.isValid());
const QShaderDescription desc = s.description();
QVERIFY(desc.isValid());
- const QByteArray data = desc.toCbor();
+ QByteArray data;
+ {
+ QBuffer buf(&data);
+ QDataStream ds(&buf);
+ QVERIFY(buf.open(QIODevice::WriteOnly));
+ desc.serialize(&ds);
+ }
QVERIFY(!data.isEmpty());
- QShaderDescription desc2;
- QVERIFY(!desc2.isValid());
- QVERIFY(!(desc == desc2));
- QVERIFY(desc != desc2);
+ {
+ QShaderDescription desc2;
+ QVERIFY(!desc2.isValid());
+ QVERIFY(!(desc == desc2));
+ QVERIFY(desc != desc2);
+ }
- desc2 = QShaderDescription::fromCbor(data);
- QVERIFY(desc2.isValid());
- QCOMPARE(desc, desc2);
+ {
+ QBuffer buf(&data);
+ QDataStream ds(&buf);
+ QVERIFY(buf.open(QIODevice::ReadOnly));
+ QShaderDescription desc2 = QShaderDescription::deserialize(&ds);
+ QVERIFY(desc2.isValid());
+ QCOMPARE(desc, desc2);
+ }
}
+}
+void tst_QShader::comparison()
+{
// exercise QShader and QShaderDescription comparisons
{
- QShader s1 = getShader(QLatin1String(":/data/texture_all_v3.frag.qsb"));
+ QShader s1 = getShader(QLatin1String(":/data/texture_all_v4.frag.qsb"));
QVERIFY(s1.isValid());
QShader s2 = getShader(QLatin1String(":/data/color_all_v1.vert.qsb"));
QVERIFY(s2.isValid());
@@ -393,6 +422,93 @@ void tst_QShader::serializeShaderDesc()
QVERIFY(s1 != s2);
QVERIFY(s1.description() != s2.description());
}
+
+ {
+ QShader s1 = getShader(QLatin1String(":/data/texture_all_v4.frag.qsb"));
+ QVERIFY(s1.isValid());
+ QShader s2 = getShader(QLatin1String(":/data/texture_all_v4.frag.qsb"));
+ QVERIFY(s2.isValid());
+
+ QVERIFY(s1.description().isValid());
+ QVERIFY(s2.description().isValid());
+
+ QVERIFY(s1 == s2);
+ QVERIFY(s1.description() == s2.description());
+ }
+}
+
+void tst_QShader::loadV4()
+{
+ // qsb version 4: QShaderDescription is serialized via QDataStream. Ensure the deserialized data is as expected.
+ QShader s = getShader(QLatin1String(":/data/texture_all_v4.frag.qsb"));
+ QVERIFY(s.isValid());
+ QCOMPARE(QShaderPrivate::get(&s)->qsbVersion, 4);
+
+ const QVector<QShaderKey> availableShaders = s.availableShaders();
+ QCOMPARE(availableShaders.count(), 7);
+ QVERIFY(availableShaders.contains(QShaderKey(QShader::SpirvShader, QShaderVersion(100))));
+ QVERIFY(availableShaders.contains(QShaderKey(QShader::MslShader, QShaderVersion(12))));
+ QVERIFY(availableShaders.contains(QShaderKey(QShader::HlslShader, QShaderVersion(50))));
+ QVERIFY(availableShaders.contains(QShaderKey(QShader::GlslShader, QShaderVersion(100, QShaderVersion::GlslEs))));
+ QVERIFY(availableShaders.contains(QShaderKey(QShader::GlslShader, QShaderVersion(120))));
+ QVERIFY(availableShaders.contains(QShaderKey(QShader::GlslShader, QShaderVersion(150))));
+ QVERIFY(availableShaders.contains(QShaderKey(QShader::GlslShader, QShaderVersion(330))));
+
+ const QShaderDescription desc = s.description();
+ QVERIFY(desc.isValid());
+ QCOMPARE(desc.inputVariables().count(), 1);
+ for (const QShaderDescription::InOutVariable &v : desc.inputVariables()) {
+ switch (v.location) {
+ case 0:
+ QCOMPARE(v.name, QLatin1String("qt_TexCoord"));
+ QCOMPARE(v.type, QShaderDescription::Vec2);
+ break;
+ default:
+ QVERIFY(false);
+ break;
+ }
+ }
+ QCOMPARE(desc.outputVariables().count(), 1);
+ for (const QShaderDescription::InOutVariable &v : desc.outputVariables()) {
+ switch (v.location) {
+ case 0:
+ QCOMPARE(v.name, QLatin1String("fragColor"));
+ QCOMPARE(v.type, QShaderDescription::Vec4);
+ break;
+ default:
+ QVERIFY(false);
+ break;
+ }
+ }
+ QCOMPARE(desc.uniformBlocks().count(), 1);
+ const QShaderDescription::UniformBlock blk = desc.uniformBlocks().first();
+ QCOMPARE(blk.blockName, QLatin1String("buf"));
+ QCOMPARE(blk.structName, QLatin1String("ubuf"));
+ QCOMPARE(blk.size, 68);
+ QCOMPARE(blk.binding, 0);
+ QCOMPARE(blk.descriptorSet, 0);
+ QCOMPARE(blk.members.count(), 2);
+ for (int i = 0; i < blk.members.count(); ++i) {
+ const QShaderDescription::BlockVariable v = blk.members[i];
+ switch (i) {
+ case 0:
+ QCOMPARE(v.offset, 0);
+ QCOMPARE(v.size, 64);
+ QCOMPARE(v.name, QLatin1String("qt_Matrix"));
+ QCOMPARE(v.type, QShaderDescription::Mat4);
+ QCOMPARE(v.matrixStride, 16);
+ break;
+ case 1:
+ QCOMPARE(v.offset, 64);
+ QCOMPARE(v.size, 4);
+ QCOMPARE(v.name, QLatin1String("opacity"));
+ QCOMPARE(v.type, QShaderDescription::Float);
+ break;
+ default:
+ QVERIFY(false);
+ break;
+ }
+ }
}
#include <tst_qshader.moc>