diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2018-02-27 10:00:25 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2018-02-28 10:46:29 +0000 |
commit | d3b6a6054ce0b322611c465643aa55f7c60a276e (patch) | |
tree | 4f9260712d7f26d2a5ab331992a4e8c8e7cab821 /tests | |
parent | 6ea64e9ba9c17302c50648e4c3836a7563679f6a (diff) |
Fix RenderView uniform minification
In the case where we had two or more groups of RenderCommands where each group
shares a common shader, uniform minification wouldn't be applied to the second
command of each groups after the first one.
Change-Id: Ie73f559e3f44f0f22ddd79017fd413262cae6ab4
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/render/renderviews/tst_renderviews.cpp | 91 |
1 files changed, 86 insertions, 5 deletions
diff --git a/tests/auto/render/renderviews/tst_renderviews.cpp b/tests/auto/render/renderviews/tst_renderviews.cpp index 8ff1a584a..3039eaa02 100644 --- a/tests/auto/render/renderviews/tst_renderviews.cpp +++ b/tests/auto/render/renderviews/tst_renderviews.cpp @@ -42,6 +42,29 @@ namespace Qt3DRender { namespace Render { +namespace { + +void compareShaderParameterPacks(const ShaderParameterPack &t1, + const ShaderParameterPack &t2) +{ + const PackUniformHash hash1 = t1.uniforms(); + const PackUniformHash hash2 = t2.uniforms(); + + QCOMPARE(hash1.size(), hash2.size()); + + auto it = hash1.constBegin(); + const auto end = hash1.constEnd(); + + while (it != end) { + const auto h2It = hash2.find(it.key()); + QVERIFY(h2It != hash2.cend()); + QCOMPARE(it.value(), h2It.value()); + ++it; + } +} + +} // anonymous + class tst_RenderViews : public Qt3DCore::QBackendNodeTester { Q_OBJECT @@ -54,11 +77,6 @@ private Q_SLOTS: QVERIFY(sizeof(RenderView::InnerData) <= 192); } - void testSort() - { - - } - void checkRenderViewInitialState() { // GIVEN @@ -188,6 +206,69 @@ private Q_SLOTS: // RenderCommands are deleted by RenderView dtor } + void checkRenderViewUniformMinification_data() + { + QTest::addColumn<QVector<ProgramDNA>>("programDNAs"); + QTest::addColumn<QVector<ShaderParameterPack>>("rawParameters"); + QTest::addColumn<QVector<ShaderParameterPack>>("expectedMinimizedParameters"); + + Qt3DCore::QNodeId fakeTextureNodeId = Qt3DCore::QNodeId::createId(); + + ShaderParameterPack pack1; + pack1.setUniform(1, UniformValue(883)); + pack1.setUniform(2, UniformValue(1584.0f)); + pack1.setTexture(3, 0, fakeTextureNodeId); + + ShaderParameterPack minifiedPack1; + + QTest::newRow("NoMinification") + << (QVector<ProgramDNA>() << ProgramDNA(883) << ProgramDNA(1584)) + << (QVector<ShaderParameterPack>() << pack1 << pack1) + << (QVector<ShaderParameterPack>() << pack1 << pack1); + + QTest::newRow("SingleShaderMinified") + << (QVector<ProgramDNA>() << ProgramDNA(883) << ProgramDNA(883) << ProgramDNA(883)) + << (QVector<ShaderParameterPack>() << pack1 << pack1 << pack1) + << (QVector<ShaderParameterPack>() << pack1 << minifiedPack1 << minifiedPack1); + + QTest::newRow("MultipleShadersMinified") + << (QVector<ProgramDNA>() << ProgramDNA(883) << ProgramDNA(883) << ProgramDNA(883) << ProgramDNA(1584) << ProgramDNA(1584) << ProgramDNA(1584)) + << (QVector<ShaderParameterPack>() << pack1 << pack1 << pack1 << pack1 << pack1 << pack1) + << (QVector<ShaderParameterPack>() << pack1 << minifiedPack1 << minifiedPack1 << pack1 << minifiedPack1 << minifiedPack1); + } + + void checkRenderViewUniformMinification() + { + QFETCH(QVector<ProgramDNA>, programDNAs); + QFETCH(QVector<ShaderParameterPack>, rawParameters); + QFETCH(QVector<ShaderParameterPack>, expectedMinimizedParameters); + + RenderView renderView; + QVector<RenderCommand *> rawCommands; + + for (int i = 0, m = programDNAs.size(); i < m; ++i) { + RenderCommand *c = new RenderCommand(); + c->m_shaderDna = programDNAs.at(i); + c->m_parameterPack = rawParameters.at(i); + rawCommands.push_back(c); + } + + // WHEN + renderView.setCommands(rawCommands); + renderView.sort(); + + // THEN + const QVector<RenderCommand *> sortedCommands = renderView.commands(); + QCOMPARE(rawCommands, sortedCommands); + + for (int i = 0, m = programDNAs.size(); i < m; ++i) { + const RenderCommand *c = sortedCommands.at(i); + QCOMPARE(c->m_shaderDna, programDNAs.at(i)); + compareShaderParameterPacks(c->m_parameterPack, expectedMinimizedParameters.at(i)); + } + } + + void checkRenderCommandFrontToBackSorting() { // GIVEN |