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