From 0ff3e7d155967e6a0ffe7836d9fc133ca08e2302 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Thu, 16 Oct 2014 13:35:33 +0200 Subject: Make hellowindow multi display capable on embedded Platforms like eglfs allow a single window per screen. Thus the behavior of --multiple is not suitable since it tries to open multiple windows on the primary screen. Instead, introduce --multiscreen. Add also --timeout to quit the app after 10 seconds. This is essential on platforms that do not have windows with decorations that can be used to close windows. With eglfs' kms/drm hooks, starting with --multiscreen will now show a rotating logo on all connected displays, with some random background color. Change-Id: I53f2651f05620e752c289038a9b3ff4508273173 Reviewed-by: Louai Al-Khanji Reviewed-by: Andy Nichols --- examples/opengl/hellowindow/hellowindow.cpp | 16 ++++++++++++++-- examples/opengl/hellowindow/hellowindow.h | 4 +++- examples/opengl/hellowindow/main.cpp | 18 +++++++++++++----- 3 files changed, 30 insertions(+), 8 deletions(-) (limited to 'examples/opengl/hellowindow') diff --git a/examples/opengl/hellowindow/hellowindow.cpp b/examples/opengl/hellowindow/hellowindow.cpp index 57eb111edb..ac5bfea280 100644 --- a/examples/opengl/hellowindow/hellowindow.cpp +++ b/examples/opengl/hellowindow/hellowindow.cpp @@ -56,9 +56,14 @@ Renderer::Renderer(const QSurfaceFormat &format, Renderer *share, QScreen *scree if (share) m_context->setShareContext(share->m_context); m_context->create(); + + m_backgroundColor = QColor::fromRgbF(0.1f, 0.1f, 0.2f, 1.0f); + m_backgroundColor.setRed(qrand() % 64); + m_backgroundColor.setGreen(qrand() % 128); + m_backgroundColor.setBlue(qrand() % 256); } -HelloWindow::HelloWindow(const QSharedPointer &renderer) +HelloWindow::HelloWindow(const QSharedPointer &renderer, QScreen *screen) : m_colorIndex(0), m_renderer(renderer) { setSurfaceType(QWindow::OpenGLSurface); @@ -67,6 +72,8 @@ HelloWindow::HelloWindow(const QSharedPointer &renderer) setGeometry(QRect(10, 10, 640, 480)); setFormat(renderer->format()); + if (screen) + setScreen(screen); create(); @@ -147,7 +154,7 @@ void Renderer::render() f->glViewport(0, 0, viewSize.width() * surface->devicePixelRatio(), viewSize.height() * surface->devicePixelRatio()); f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - f->glClearColor(0.1f, 0.1f, 0.2f, 1.0f); + f->glClearColor(m_backgroundColor.redF(), m_backgroundColor.greenF(), m_backgroundColor.blueF(), m_backgroundColor.alphaF()); f->glFrontFace(GL_CW); f->glCullFace(GL_FRONT); f->glEnable(GL_CULL_FACE); @@ -180,8 +187,13 @@ void Renderer::render() QTimer::singleShot(0, this, SLOT(render())); } +Q_GLOBAL_STATIC(QMutex, initMutex) + void Renderer::initialize() { + // Threaded shader compilation can confuse some drivers. Avoid it. + QMutexLocker lock(initMutex()); + QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex, this); vshader->compileSourceCode( "attribute highp vec4 vertex;" diff --git a/examples/opengl/hellowindow/hellowindow.h b/examples/opengl/hellowindow/hellowindow.h index 6a6fa275e2..cba4b34db6 100644 --- a/examples/opengl/hellowindow/hellowindow.h +++ b/examples/opengl/hellowindow/hellowindow.h @@ -90,12 +90,14 @@ private: int m_currentWindow; QMutex m_windowLock; + + QColor m_backgroundColor; }; class HelloWindow : public QWindow { public: - explicit HelloWindow(const QSharedPointer &renderer); + explicit HelloWindow(const QSharedPointer &renderer, QScreen *screen = 0); QColor color() const; void updateColor(); diff --git a/examples/opengl/hellowindow/main.cpp b/examples/opengl/hellowindow/main.cpp index 62b6bfca3f..e7ad9722c2 100644 --- a/examples/opengl/hellowindow/main.cpp +++ b/examples/opengl/hellowindow/main.cpp @@ -50,7 +50,9 @@ int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); + // Some platforms can only have one window per screen. Therefore we need to differentiate. const bool multipleWindows = QGuiApplication::arguments().contains(QStringLiteral("--multiple")); + const bool multipleScreens = QGuiApplication::arguments().contains(QStringLiteral("--multiscreen")); QScreen *screen = QGuiApplication::primaryScreen(); @@ -93,12 +95,13 @@ int main(int argc, char *argv[]) windowC->setTitle(QStringLiteral("Thread B - Context B")); windowC->setVisible(true); windows.prepend(windowC); - + } + if (multipleScreens) { for (int i = 1; i < QGuiApplication::screens().size(); ++i) { QScreen *screen = QGuiApplication::screens().at(i); QSharedPointer renderer(new Renderer(format, rendererA.data(), screen)); - renderThread = new QThread; + QThread *renderThread = new QThread; renderer->moveToThread(renderThread); renderThreads.prepend(renderThread); @@ -107,8 +110,7 @@ int main(int argc, char *argv[]) QSize windowSize = screenGeometry.size() * 0.8; - HelloWindow *window = new HelloWindow(renderer); - window->setScreen(screen); + HelloWindow *window = new HelloWindow(renderer, screen); window->setGeometry(QRect(center, windowSize).translated(-windowSize.width() / 2, -windowSize.height() / 2)); QChar id = QChar('B' + i); @@ -123,10 +125,16 @@ int main(int argc, char *argv[]) renderThreads.at(i)->start(); } + // Quit after 10 seconds. For platforms that do not have windows that are closeable. + if (QCoreApplication::arguments().contains(QStringLiteral("--timeout"))) + QTimer::singleShot(10000, qGuiApp, SLOT(quit())); + const int exitValue = app.exec(); - for (int i = 0; i < renderThreads.size(); ++i) + for (int i = 0; i < renderThreads.size(); ++i) { + renderThreads.at(i)->quit(); // some platforms may not have windows to close so ensure quit() renderThreads.at(i)->wait(); + } qDeleteAll(windows); qDeleteAll(renderThreads); -- cgit v1.2.3