From 66d9b4d2f843205e56550e631d82184d20f7038e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Thu, 18 Aug 2011 10:50:18 +0200 Subject: Make the hellowindow example multi-threaded to stress the GL backend. Change-Id: I9e158c0889b050f9ed76ea21176102fc792eef83 Reviewed-on: http://codereview.qt.nokia.com/3150 Reviewed-by: Qt Sanity Bot Reviewed-by: Paul Olav Tvete --- examples/opengl/hellowindow/hellowindow.cpp | 34 ++++++++++++------------ examples/opengl/hellowindow/hellowindow.h | 17 +++++++----- examples/opengl/hellowindow/main.cpp | 40 ++++++++++++++++++++++++++--- 3 files changed, 63 insertions(+), 28 deletions(-) (limited to 'examples') diff --git a/examples/opengl/hellowindow/hellowindow.cpp b/examples/opengl/hellowindow/hellowindow.cpp index 5a232e6a7b..3c4f88bdfe 100644 --- a/examples/opengl/hellowindow/hellowindow.cpp +++ b/examples/opengl/hellowindow/hellowindow.cpp @@ -6,39 +6,37 @@ #include -Renderer::Renderer() +Renderer::Renderer(const QSurfaceFormat &format, Renderer *share) : m_initialized(false) + , m_format(format) { - m_format.setDepthBufferSize(16); - m_format.setSamples(4); - m_context = new QGuiGLContext; - m_context->setFormat(m_format); + m_context->setFormat(format); + if (share) + m_context->setShareContext(share->m_context); m_context->create(); } -QSurfaceFormat Renderer::format() const -{ - return m_format; -} - HelloWindow::HelloWindow(Renderer *renderer) : m_colorIndex(0) , m_renderer(renderer) { setSurfaceType(QWindow::OpenGLSurface); - setWindowTitle(QLatin1String("Hello Window")); - - setFormat(renderer->format()); + setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); setGeometry(QRect(10, 10, 640, 480)); + setFormat(renderer->format()); + create(); QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(render())); timer->start(10); + connect(this, SIGNAL(needRender(QSurface *, const QColor &, const QSize &)), + renderer, SLOT(render(QSurface *, const QColor &, const QSize &))); + updateColor(); } @@ -47,6 +45,11 @@ void HelloWindow::mousePressEvent(QMouseEvent *) updateColor(); } +void HelloWindow::render() +{ + emit needRender(this, m_color, size()); +} + void HelloWindow::updateColor() { QColor colors[] = @@ -62,11 +65,6 @@ void HelloWindow::updateColor() m_colorIndex = 0; } -void HelloWindow::render() -{ - m_renderer->render(this, m_color, geometry().size()); -} - void Renderer::render(QSurface *surface, const QColor &color, const QSize &viewSize) { if (!m_context->makeCurrent(surface)) diff --git a/examples/opengl/hellowindow/hellowindow.h b/examples/opengl/hellowindow/hellowindow.h index 3c5388cb76..c114b09a24 100644 --- a/examples/opengl/hellowindow/hellowindow.h +++ b/examples/opengl/hellowindow/hellowindow.h @@ -2,6 +2,7 @@ #include #include +#include #include @@ -9,11 +10,13 @@ class QGuiGLContext; class Renderer : public QObject { + Q_OBJECT public: - Renderer(); + Renderer(const QSurfaceFormat &format, Renderer *share = 0); - QSurfaceFormat format() const; + QSurfaceFormat format() const { return m_format; } +public slots: void render(QSurface *surface, const QColor &color, const QSize &viewSize); private: @@ -45,14 +48,16 @@ class HelloWindow : public QWindow public: HelloWindow(Renderer *renderer); + void updateColor(); + +signals: + void needRender(QSurface *surface, const QColor &color, const QSize &viewSize); + private slots: void render(); -protected: - void mousePressEvent(QMouseEvent *); - private: - void updateColor(); + void mousePressEvent(QMouseEvent *); int m_colorIndex; QColor m_color; diff --git a/examples/opengl/hellowindow/main.cpp b/examples/opengl/hellowindow/main.cpp index af5943adf4..b247807019 100644 --- a/examples/opengl/hellowindow/main.cpp +++ b/examples/opengl/hellowindow/main.cpp @@ -1,4 +1,6 @@ #include +#include +#include #include "hellowindow.h" @@ -6,13 +8,43 @@ int main(int argc, char **argv) { QGuiApplication app(argc, argv); - Renderer renderer; + QScreen *screen = QGuiApplication::primaryScreen(); - HelloWindow windowA(&renderer); + QRect screenGeometry = screen->availableGeometry(); + + QSurfaceFormat format; + format.setDepthBufferSize(16); + format.setSamples(4); + + QPoint center = QPoint(screenGeometry.center().x(), screenGeometry.top() + 80); + QSize windowSize(400, 320); + int delta = 40; + + Renderer rendererA(format); + Renderer rendererB(format, &rendererA); + + QThread renderThread; + rendererB.moveToThread(&renderThread); + renderThread.start(); + + QObject::connect(qGuiApp, SIGNAL(lastWindowClosed()), &renderThread, SLOT(quit())); + + HelloWindow windowA(&rendererA); + windowA.setGeometry(QRect(center, windowSize).translated(-windowSize.width() - delta / 2, 0)); + windowA.setWindowTitle(QLatin1String("Thread A - Context A")); windowA.setVisible(true); - HelloWindow windowB(&renderer); + HelloWindow windowB(&rendererA); + windowB.setGeometry(QRect(center, windowSize).translated(delta / 2, 0)); + windowB.setWindowTitle(QLatin1String("Thread A - Context A")); windowB.setVisible(true); - return app.exec(); + HelloWindow windowC(&rendererB); + windowC.setGeometry(QRect(center, windowSize).translated(-windowSize.width() / 2, windowSize.height() + delta)); + windowC.setWindowTitle(QLatin1String("Thread B - Context B")); + windowC.setVisible(true); + + app.exec(); + + renderThread.wait(); } -- cgit v1.2.3