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 29 class GraphicsView; 30 31 class tst_WebGlPerformance : public QObject { 32 Q_OBJECT 33 34 private slots: 35 void init(); 36 void cleanup(); 37 38 void benchSoftwareFallbackRgb16(); 39 void benchSoftwareFallbackRgb32(); 40 void benchSoftwareFallbackArgb32(); 41 void benchSoftwareFallbackArgb32Premultiplied(); 42 43 private: 44 void benchmarkFrameRenderingOnImage(QImage::Format); 45 46 QScopedPointer<GraphicsView> m_view; 47 }; 48 49 class GraphicsView : public QGraphicsView { 50 public: 51 GraphicsView(); 52 QGraphicsWebView* m_webView; 53 54 protected: 55 void resizeEvent(QResizeEvent*); 56 }; 57 58 GraphicsView::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 73 void 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 81 void tst_WebGlPerformance::init() 82 { 83 m_view.reset(new GraphicsView); 84 m_view->showMaximized(); 85 QTest::qWaitForWindowShown(m_view.data()); 86 } 87 88 void tst_WebGlPerformance::cleanup() 89 { 90 m_view.reset(); 91 } 92 93 void tst_WebGlPerformance::benchSoftwareFallbackRgb16() 94 { 95 benchmarkFrameRenderingOnImage(QImage::Format_RGB16); 96 } 97 98 void tst_WebGlPerformance::benchSoftwareFallbackRgb32() 99 { 100 benchmarkFrameRenderingOnImage(QImage::Format_RGB32); 101 } 102 103 void tst_WebGlPerformance::benchSoftwareFallbackArgb32() 104 { 105 benchmarkFrameRenderingOnImage(QImage::Format_ARGB32); 106 } 107 108 void tst_WebGlPerformance::benchSoftwareFallbackArgb32Premultiplied() 109 { 110 benchmarkFrameRenderingOnImage(QImage::Format_ARGB32_Premultiplied); 111 } 112 113 void 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 128 QTEST_MAIN(tst_WebGlPerformance) 129 130 #include "tst_webgl.moc" 131