1/*
2    Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies)
3
4    This library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Library General Public
6    License as published by the Free Software Foundation; either
7    version 2 of the License, or (at your option) any later version.
8
9    This library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Library General Public License for more details.
13
14    You should have received a copy of the GNU Library General Public License
15    along with this library; see the file COPYING.LIB.  If not, write to
16    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17    Boston, MA 02110-1301, USA.
18*/
19
20
21#include "../../util.h"
22#include <QGLWidget>
23#include <QGraphicsView>
24#include <QGraphicsWebView>
25#include <QScopedPointer>
26#include <QWebFrame>
27#include <QtTest/QtTest>
28
29class GraphicsView;
30
31class tst_WebGlPerformance : public QObject {
32    Q_OBJECT
33
34private slots:
35    void init();
36    void cleanup();
37
38    void benchSoftwareFallbackRgb16();
39    void benchSoftwareFallbackRgb32();
40    void benchSoftwareFallbackArgb32();
41    void benchSoftwareFallbackArgb32Premultiplied();
42
43private:
44    void benchmarkFrameRenderingOnImage(QImage::Format);
45
46    QScopedPointer<GraphicsView> m_view;
47};
48
49class GraphicsView : public QGraphicsView {
50public:
51    GraphicsView();
52    QGraphicsWebView* m_webView;
53
54protected:
55    void resizeEvent(QResizeEvent*);
56};
57
58GraphicsView::GraphicsView()
59{
60    QGraphicsScene* const scene = new QGraphicsScene(this);
61    setScene(scene);
62
63    m_webView = new QGraphicsWebView;
64    scene->addItem(m_webView);
65
66    m_webView->page()->settings()->setAttribute(QWebSettings::WebGLEnabled, true);
67
68    resize(800, 600);
69    setFrameShape(QFrame::NoFrame);
70    setViewport(new QGLWidget);
71}
72
73void GraphicsView::resizeEvent(QResizeEvent* event)
74{
75    QGraphicsView::resizeEvent(event);
76    QRectF rect(QPoint(0, 0), event->size());
77    m_webView->setGeometry(rect);
78    scene()->setSceneRect(rect);
79}
80
81void tst_WebGlPerformance::init()
82{
83    m_view.reset(new GraphicsView);
84    m_view->showMaximized();
85    QTest::qWaitForWindowShown(m_view.data());
86}
87
88void tst_WebGlPerformance::cleanup()
89{
90    m_view.reset();
91}
92
93void tst_WebGlPerformance::benchSoftwareFallbackRgb16()
94{
95    benchmarkFrameRenderingOnImage(QImage::Format_RGB16);
96}
97
98void tst_WebGlPerformance::benchSoftwareFallbackRgb32()
99{
100    benchmarkFrameRenderingOnImage(QImage::Format_RGB32);
101}
102
103void tst_WebGlPerformance::benchSoftwareFallbackArgb32()
104{
105    benchmarkFrameRenderingOnImage(QImage::Format_ARGB32);
106}
107
108void tst_WebGlPerformance::benchSoftwareFallbackArgb32Premultiplied()
109{
110    benchmarkFrameRenderingOnImage(QImage::Format_ARGB32_Premultiplied);
111}
112
113void tst_WebGlPerformance::benchmarkFrameRenderingOnImage(QImage::Format format)
114{
115    m_view->m_webView->load(QUrl(QLatin1String("qrc:///testcases/10000_triangles.html")));
116    const bool pageLoaded = waitForSignal(m_view->m_webView, SIGNAL(loadFinished(bool)));
117    Q_ASSERT(pageLoaded);
118    Q_UNUSED(pageLoaded);
119
120    QImage target(m_view->size(), format);
121    QBENCHMARK {
122        QPainter painter(&target);
123        m_view->render(&painter);
124        painter.end();
125    }
126}
127
128QTEST_MAIN(tst_WebGlPerformance)
129
130#include "tst_webgl.moc"
131