12bde8e466a4451c7319e3a072d118917957d6554Steve Block/*
22bde8e466a4451c7319e3a072d118917957d6554Steve Block    Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies)
32bde8e466a4451c7319e3a072d118917957d6554Steve Block
42bde8e466a4451c7319e3a072d118917957d6554Steve Block    This library is free software; you can redistribute it and/or
52bde8e466a4451c7319e3a072d118917957d6554Steve Block    modify it under the terms of the GNU Library General Public
62bde8e466a4451c7319e3a072d118917957d6554Steve Block    License as published by the Free Software Foundation; either
72bde8e466a4451c7319e3a072d118917957d6554Steve Block    version 2 of the License, or (at your option) any later version.
82bde8e466a4451c7319e3a072d118917957d6554Steve Block
92bde8e466a4451c7319e3a072d118917957d6554Steve Block    This library is distributed in the hope that it will be useful,
102bde8e466a4451c7319e3a072d118917957d6554Steve Block    but WITHOUT ANY WARRANTY; without even the implied warranty of
112bde8e466a4451c7319e3a072d118917957d6554Steve Block    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
122bde8e466a4451c7319e3a072d118917957d6554Steve Block    Library General Public License for more details.
132bde8e466a4451c7319e3a072d118917957d6554Steve Block
142bde8e466a4451c7319e3a072d118917957d6554Steve Block    You should have received a copy of the GNU Library General Public License
152bde8e466a4451c7319e3a072d118917957d6554Steve Block    along with this library; see the file COPYING.LIB.  If not, write to
162bde8e466a4451c7319e3a072d118917957d6554Steve Block    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
172bde8e466a4451c7319e3a072d118917957d6554Steve Block    Boston, MA 02110-1301, USA.
182bde8e466a4451c7319e3a072d118917957d6554Steve Block*/
192bde8e466a4451c7319e3a072d118917957d6554Steve Block
202bde8e466a4451c7319e3a072d118917957d6554Steve Block
212bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "../../util.h"
222bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <QGLWidget>
232bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <QGraphicsView>
242bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <QGraphicsWebView>
252bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <QScopedPointer>
262bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <QWebFrame>
272bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <QtTest/QtTest>
282bde8e466a4451c7319e3a072d118917957d6554Steve Block
292bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass GraphicsView;
302bde8e466a4451c7319e3a072d118917957d6554Steve Block
312bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass tst_WebGlPerformance : public QObject {
322bde8e466a4451c7319e3a072d118917957d6554Steve Block    Q_OBJECT
332bde8e466a4451c7319e3a072d118917957d6554Steve Block
342bde8e466a4451c7319e3a072d118917957d6554Steve Blockprivate slots:
352bde8e466a4451c7319e3a072d118917957d6554Steve Block    void init();
362bde8e466a4451c7319e3a072d118917957d6554Steve Block    void cleanup();
372bde8e466a4451c7319e3a072d118917957d6554Steve Block
382bde8e466a4451c7319e3a072d118917957d6554Steve Block    void benchSoftwareFallbackRgb16();
392bde8e466a4451c7319e3a072d118917957d6554Steve Block    void benchSoftwareFallbackRgb32();
402bde8e466a4451c7319e3a072d118917957d6554Steve Block    void benchSoftwareFallbackArgb32();
412bde8e466a4451c7319e3a072d118917957d6554Steve Block    void benchSoftwareFallbackArgb32Premultiplied();
422bde8e466a4451c7319e3a072d118917957d6554Steve Block
432bde8e466a4451c7319e3a072d118917957d6554Steve Blockprivate:
442bde8e466a4451c7319e3a072d118917957d6554Steve Block    void benchmarkFrameRenderingOnImage(QImage::Format);
452bde8e466a4451c7319e3a072d118917957d6554Steve Block
462bde8e466a4451c7319e3a072d118917957d6554Steve Block    QScopedPointer<GraphicsView> m_view;
472bde8e466a4451c7319e3a072d118917957d6554Steve Block};
482bde8e466a4451c7319e3a072d118917957d6554Steve Block
492bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass GraphicsView : public QGraphicsView {
502bde8e466a4451c7319e3a072d118917957d6554Steve Blockpublic:
512bde8e466a4451c7319e3a072d118917957d6554Steve Block    GraphicsView();
522bde8e466a4451c7319e3a072d118917957d6554Steve Block    QGraphicsWebView* m_webView;
532bde8e466a4451c7319e3a072d118917957d6554Steve Block
542bde8e466a4451c7319e3a072d118917957d6554Steve Blockprotected:
552bde8e466a4451c7319e3a072d118917957d6554Steve Block    void resizeEvent(QResizeEvent*);
562bde8e466a4451c7319e3a072d118917957d6554Steve Block};
572bde8e466a4451c7319e3a072d118917957d6554Steve Block
582bde8e466a4451c7319e3a072d118917957d6554Steve BlockGraphicsView::GraphicsView()
592bde8e466a4451c7319e3a072d118917957d6554Steve Block{
602bde8e466a4451c7319e3a072d118917957d6554Steve Block    QGraphicsScene* const scene = new QGraphicsScene(this);
612bde8e466a4451c7319e3a072d118917957d6554Steve Block    setScene(scene);
622bde8e466a4451c7319e3a072d118917957d6554Steve Block
632bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_webView = new QGraphicsWebView;
642bde8e466a4451c7319e3a072d118917957d6554Steve Block    scene->addItem(m_webView);
652bde8e466a4451c7319e3a072d118917957d6554Steve Block
662bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_webView->page()->settings()->setAttribute(QWebSettings::WebGLEnabled, true);
672bde8e466a4451c7319e3a072d118917957d6554Steve Block
682bde8e466a4451c7319e3a072d118917957d6554Steve Block    resize(800, 600);
692bde8e466a4451c7319e3a072d118917957d6554Steve Block    setFrameShape(QFrame::NoFrame);
702bde8e466a4451c7319e3a072d118917957d6554Steve Block    setViewport(new QGLWidget);
712bde8e466a4451c7319e3a072d118917957d6554Steve Block}
722bde8e466a4451c7319e3a072d118917957d6554Steve Block
732bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid GraphicsView::resizeEvent(QResizeEvent* event)
742bde8e466a4451c7319e3a072d118917957d6554Steve Block{
752bde8e466a4451c7319e3a072d118917957d6554Steve Block    QGraphicsView::resizeEvent(event);
762bde8e466a4451c7319e3a072d118917957d6554Steve Block    QRectF rect(QPoint(0, 0), event->size());
772bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_webView->setGeometry(rect);
782bde8e466a4451c7319e3a072d118917957d6554Steve Block    scene()->setSceneRect(rect);
792bde8e466a4451c7319e3a072d118917957d6554Steve Block}
802bde8e466a4451c7319e3a072d118917957d6554Steve Block
812bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid tst_WebGlPerformance::init()
822bde8e466a4451c7319e3a072d118917957d6554Steve Block{
832bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_view.reset(new GraphicsView);
842bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_view->showMaximized();
852bde8e466a4451c7319e3a072d118917957d6554Steve Block    QTest::qWaitForWindowShown(m_view.data());
862bde8e466a4451c7319e3a072d118917957d6554Steve Block}
872bde8e466a4451c7319e3a072d118917957d6554Steve Block
882bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid tst_WebGlPerformance::cleanup()
892bde8e466a4451c7319e3a072d118917957d6554Steve Block{
902bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_view.reset();
912bde8e466a4451c7319e3a072d118917957d6554Steve Block}
922bde8e466a4451c7319e3a072d118917957d6554Steve Block
932bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid tst_WebGlPerformance::benchSoftwareFallbackRgb16()
942bde8e466a4451c7319e3a072d118917957d6554Steve Block{
952bde8e466a4451c7319e3a072d118917957d6554Steve Block    benchmarkFrameRenderingOnImage(QImage::Format_RGB16);
962bde8e466a4451c7319e3a072d118917957d6554Steve Block}
972bde8e466a4451c7319e3a072d118917957d6554Steve Block
982bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid tst_WebGlPerformance::benchSoftwareFallbackRgb32()
992bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1002bde8e466a4451c7319e3a072d118917957d6554Steve Block    benchmarkFrameRenderingOnImage(QImage::Format_RGB32);
1012bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1022bde8e466a4451c7319e3a072d118917957d6554Steve Block
1032bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid tst_WebGlPerformance::benchSoftwareFallbackArgb32()
1042bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1052bde8e466a4451c7319e3a072d118917957d6554Steve Block    benchmarkFrameRenderingOnImage(QImage::Format_ARGB32);
1062bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1072bde8e466a4451c7319e3a072d118917957d6554Steve Block
1082bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid tst_WebGlPerformance::benchSoftwareFallbackArgb32Premultiplied()
1092bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1102bde8e466a4451c7319e3a072d118917957d6554Steve Block    benchmarkFrameRenderingOnImage(QImage::Format_ARGB32_Premultiplied);
1112bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1122bde8e466a4451c7319e3a072d118917957d6554Steve Block
1132bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid tst_WebGlPerformance::benchmarkFrameRenderingOnImage(QImage::Format format)
1142bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1152bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_view->m_webView->load(QUrl(QLatin1String("qrc:///testcases/10000_triangles.html")));
1162bde8e466a4451c7319e3a072d118917957d6554Steve Block    const bool pageLoaded = waitForSignal(m_view->m_webView, SIGNAL(loadFinished(bool)));
1172bde8e466a4451c7319e3a072d118917957d6554Steve Block    Q_ASSERT(pageLoaded);
1182bde8e466a4451c7319e3a072d118917957d6554Steve Block    Q_UNUSED(pageLoaded);
1192bde8e466a4451c7319e3a072d118917957d6554Steve Block
1202bde8e466a4451c7319e3a072d118917957d6554Steve Block    QImage target(m_view->size(), format);
1212bde8e466a4451c7319e3a072d118917957d6554Steve Block    QBENCHMARK {
1222bde8e466a4451c7319e3a072d118917957d6554Steve Block        QPainter painter(&target);
1232bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_view->render(&painter);
1242bde8e466a4451c7319e3a072d118917957d6554Steve Block        painter.end();
1252bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
1262bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1272bde8e466a4451c7319e3a072d118917957d6554Steve Block
1282bde8e466a4451c7319e3a072d118917957d6554Steve BlockQTEST_MAIN(tst_WebGlPerformance)
1292bde8e466a4451c7319e3a072d118917957d6554Steve Block
1302bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "tst_webgl.moc"
131