From 559964849af0d2dfcb409169dcc9e40d01c6fae2 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Fri, 23 Mar 2018 11:09:18 +0100 Subject: Add lancelot based benchmark Uses the scripts and tests we already have for lancelot as a painting benchmark. Change-Id: Idf8a55e2261162e619f6dbb567dc19f8dc96da4e Reviewed-by: Eirik Aavitsland --- .../gui/painting/lancebench/lancebench.pro | 13 + .../gui/painting/lancebench/tst_lancebench.cpp | 328 +++++++++++++++++++++ tests/benchmarks/gui/painting/painting.pro | 3 +- 3 files changed, 343 insertions(+), 1 deletion(-) create mode 100644 tests/benchmarks/gui/painting/lancebench/lancebench.pro create mode 100644 tests/benchmarks/gui/painting/lancebench/tst_lancebench.cpp (limited to 'tests/benchmarks') diff --git a/tests/benchmarks/gui/painting/lancebench/lancebench.pro b/tests/benchmarks/gui/painting/lancebench/lancebench.pro new file mode 100644 index 0000000000..6458c50861 --- /dev/null +++ b/tests/benchmarks/gui/painting/lancebench/lancebench.pro @@ -0,0 +1,13 @@ +TEMPLATE = app +TARGET = tst_bench_lancebench + +QT += testlib gui-private + + +SOURCES += tst_lancebench.cpp + +SOURCES += ../../../../auto/other/lancelot/paintcommands.cpp +HEADERS += ../../../../auto/other/lancelot/paintcommands.h +RESOURCES += ../../../../auto/other/lancelot/images.qrc + +TESTDATA += ../../../../auto/other/lancelot/scripts/* diff --git a/tests/benchmarks/gui/painting/lancebench/tst_lancebench.cpp b/tests/benchmarks/gui/painting/lancebench/tst_lancebench.cpp new file mode 100644 index 0000000000..bd0889bf4a --- /dev/null +++ b/tests/benchmarks/gui/painting/lancebench/tst_lancebench.cpp @@ -0,0 +1,328 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "../../../../auto/other/lancelot/paintcommands.h" + +#include +#include +#include + +#ifndef QT_NO_OPENGL +#include +#include +#include +#endif + +#include + +class tst_LanceBench : public QObject +{ + Q_OBJECT +public: + tst_LanceBench(); + +private: + enum GraphicsEngine { + Raster = 0, + OpenGL = 1 + }; + + void setupTestSuite(const QStringList& blacklist = QStringList()); + void runTestSuite(GraphicsEngine engine, QImage::Format format, const QSurfaceFormat &contextFormat = QSurfaceFormat()); + void paint(QPaintDevice *device, GraphicsEngine engine, QImage::Format format, const QStringList &script, const QString &filePath); + + QStringList qpsFiles; + QHash scripts; + QString scriptsDir; + +private slots: + void initTestCase(); + void cleanupTestCase() {} + + void testRasterARGB32PM_data(); + void testRasterARGB32PM(); + void testRasterRGB32_data(); + void testRasterRGB32(); + void testRasterARGB32_data(); + void testRasterARGB32(); + void testRasterRGB16_data(); + void testRasterRGB16(); + void testRasterBGR30_data(); + void testRasterBGR30(); + void testRasterARGB8565PM_data(); + void testRasterARGB8565PM(); + void testRasterGrayscale8_data(); + void testRasterGrayscale8(); + +#ifndef QT_NO_OPENGL + void testOpenGL_data(); + void testOpenGL(); + void testCoreOpenGL_data(); + void testCoreOpenGL(); +private: + bool checkSystemGLSupport(); + bool checkSystemCoreGLSupport(); +#endif +}; + +tst_LanceBench::tst_LanceBench() +{ +} + +void tst_LanceBench::initTestCase() +{ + QString baseDir = QFINDTESTDATA("../../../../auto/other/lancelot/scripts/text.qps"); + scriptsDir = baseDir.left(baseDir.lastIndexOf('/')) + '/'; + QDir qpsDir(scriptsDir); + qpsFiles = qpsDir.entryList(QStringList() << QLatin1String("*.qps"), QDir::Files | QDir::Readable); + if (qpsFiles.isEmpty()) { + QWARN("No qps script files found in " + qpsDir.path().toLatin1()); + QSKIP("Aborted due to errors."); + } + + std::sort(qpsFiles.begin(), qpsFiles.end()); + for (const QString& fileName : qAsConst(qpsFiles)) { + QFile file(scriptsDir + fileName); + file.open(QFile::ReadOnly); + QByteArray cont = file.readAll(); + scripts.insert(fileName, QString::fromUtf8(cont).split(QLatin1Char('\n'), QString::SkipEmptyParts)); + } +} + +void tst_LanceBench::testRasterARGB32PM_data() +{ + setupTestSuite(); +} + +void tst_LanceBench::testRasterARGB32PM() +{ + runTestSuite(Raster, QImage::Format_ARGB32_Premultiplied); +} + +void tst_LanceBench::testRasterRGB32_data() +{ + setupTestSuite(); +} + +void tst_LanceBench::testRasterRGB32() +{ + runTestSuite(Raster, QImage::Format_RGB32); +} + +void tst_LanceBench::testRasterARGB32_data() +{ + setupTestSuite(); +} + +void tst_LanceBench::testRasterARGB32() +{ + runTestSuite(Raster, QImage::Format_ARGB32); +} + +void tst_LanceBench::testRasterRGB16_data() +{ + setupTestSuite(); +} + +void tst_LanceBench::testRasterRGB16() +{ + runTestSuite(Raster, QImage::Format_RGB16); +} + +void tst_LanceBench::testRasterBGR30_data() +{ + setupTestSuite(); +} + +void tst_LanceBench::testRasterBGR30() +{ + runTestSuite(Raster, QImage::Format_BGR30); +} + +void tst_LanceBench::testRasterARGB8565PM_data() +{ + setupTestSuite(); +} + +void tst_LanceBench::testRasterARGB8565PM() +{ + runTestSuite(Raster, QImage::Format_ARGB8565_Premultiplied); +} + +void tst_LanceBench::testRasterGrayscale8_data() +{ + setupTestSuite(); +} + +void tst_LanceBench::testRasterGrayscale8() +{ + runTestSuite(Raster, QImage::Format_Grayscale8); +} + +#ifndef QT_NO_OPENGL +bool tst_LanceBench::checkSystemGLSupport() +{ + QWindow win; + win.setSurfaceType(QSurface::OpenGLSurface); + win.create(); + QOpenGLFramebufferObjectFormat fmt; + fmt.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); + fmt.setSamples(4); + QOpenGLContext ctx; + if (!ctx.create() || !ctx.makeCurrent(&win)) + return false; + QOpenGLFramebufferObject fbo(800, 800, fmt); + if (!fbo.isValid() || !fbo.bind()) + return false; + + return true; +} + +bool tst_LanceBench::checkSystemCoreGLSupport() +{ + if (QOpenGLContext::openGLModuleType() != QOpenGLContext::LibGL) + return false; + + QSurfaceFormat coreFormat; + coreFormat.setVersion(3, 2); + coreFormat.setProfile(QSurfaceFormat::CoreProfile); + QWindow win; + win.setSurfaceType(QSurface::OpenGLSurface); + win.setFormat(coreFormat); + win.create(); + QOpenGLFramebufferObjectFormat fmt; + fmt.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); + fmt.setSamples(4); + QOpenGLContext ctx; + ctx.setFormat(coreFormat); + if (!ctx.create() || !ctx.makeCurrent(&win)) + return false; + QOpenGLFramebufferObject fbo(800, 800, fmt); + if (!fbo.isValid() || !fbo.bind()) + return false; + + return true; +} + +void tst_LanceBench::testOpenGL_data() +{ + if (!checkSystemGLSupport()) + QSKIP("System under test does not meet preconditions for GL testing. Skipping."); + QStringList localBlacklist = QStringList() << QLatin1String("rasterops.qps"); + setupTestSuite(localBlacklist); +} + +void tst_LanceBench::testOpenGL() +{ + runTestSuite(OpenGL, QImage::Format_RGB32); +} + +void tst_LanceBench::testCoreOpenGL_data() +{ + if (!checkSystemCoreGLSupport()) + QSKIP("System under test does not meet preconditions for Core Profile GL testing. Skipping."); + QStringList localBlacklist = QStringList() << QLatin1String("rasterops.qps"); + setupTestSuite(localBlacklist); +} + +void tst_LanceBench::testCoreOpenGL() +{ + QSurfaceFormat coreFormat; + coreFormat.setVersion(3, 2); + coreFormat.setProfile(QSurfaceFormat::CoreProfile); + runTestSuite(OpenGL, QImage::Format_RGB32, coreFormat); +} +#endif + +void tst_LanceBench::setupTestSuite(const QStringList& blacklist) +{ + QTest::addColumn("qpsFile"); + for (const QString &fileName : qAsConst(qpsFiles)) { + if (blacklist.contains(fileName)) + continue; + QTest::newRow(fileName.toLatin1()) << fileName; + } +} + +void tst_LanceBench::runTestSuite(GraphicsEngine engine, QImage::Format format, const QSurfaceFormat &contextFormat) +{ + QFETCH(QString, qpsFile); + + QString filePath = scriptsDir + qpsFile; + QStringList script = scripts.value(qpsFile); + QImage rendered; + + if (engine == Raster) { + QImage img(800, 800, format); + paint(&img, engine, format, script, QFileInfo(filePath).absoluteFilePath()); + rendered = img; +#ifndef QT_NO_OPENGL + } else if (engine == OpenGL) { + QWindow win; + win.setSurfaceType(QSurface::OpenGLSurface); + win.setFormat(contextFormat); + win.create(); + QOpenGLFramebufferObjectFormat fmt; + fmt.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); + fmt.setSamples(4); + QOpenGLContext ctx; + ctx.setFormat(contextFormat); + QVERIFY(ctx.create()); + QVERIFY(ctx.makeCurrent(&win)); + QOpenGLFramebufferObject fbo(800, 800, fmt); + fbo.bind(); + QOpenGLPaintDevice pdv(800, 800); + paint(&pdv, engine, format, script, QFileInfo(filePath).absoluteFilePath()); + rendered = fbo.toImage().convertToFormat(format); +#endif + } +} + +void tst_LanceBench::paint(QPaintDevice *device, GraphicsEngine engine, QImage::Format format, const QStringList &script, const QString &filePath) +{ + PaintCommands pcmd(script, 800, 800, format); + switch (engine) { + case OpenGL: + pcmd.setType(OpenGLBufferType); // version/profile is communicated through the context's format() + break; + case Raster: + pcmd.setType(ImageType); + break; + } + pcmd.setFilePath(filePath); + QBENCHMARK { + QPainter p(device); + pcmd.setPainter(&p); + pcmd.runCommands(); + p.end(); + } +} + +QTEST_MAIN(tst_LanceBench) + +#include "tst_lancebench.moc" diff --git a/tests/benchmarks/gui/painting/painting.pro b/tests/benchmarks/gui/painting/painting.pro index bbca36259e..d08dfa707b 100644 --- a/tests/benchmarks/gui/painting/painting.pro +++ b/tests/benchmarks/gui/painting/painting.pro @@ -5,7 +5,8 @@ SUBDIRS = \ qpainter \ qregion \ qtransform \ - qtbench + qtbench \ + lancebench !qtHaveModule(widgets): SUBDIRS -= \ qpainter \ -- cgit v1.2.3