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 <louai.al-khanji@digia.com> Reviewed-by: Andy Nichols <andy.nichols@digia.com>
This commit is contained in:
parent
5701583891
commit
0ff3e7d155
@ -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> &renderer)
|
||||
HelloWindow::HelloWindow(const QSharedPointer<Renderer> &renderer, QScreen *screen)
|
||||
: m_colorIndex(0), m_renderer(renderer)
|
||||
{
|
||||
setSurfaceType(QWindow::OpenGLSurface);
|
||||
@ -67,6 +72,8 @@ HelloWindow::HelloWindow(const QSharedPointer<Renderer> &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;"
|
||||
|
@ -90,12 +90,14 @@ private:
|
||||
int m_currentWindow;
|
||||
|
||||
QMutex m_windowLock;
|
||||
|
||||
QColor m_backgroundColor;
|
||||
};
|
||||
|
||||
class HelloWindow : public QWindow
|
||||
{
|
||||
public:
|
||||
explicit HelloWindow(const QSharedPointer<Renderer> &renderer);
|
||||
explicit HelloWindow(const QSharedPointer<Renderer> &renderer, QScreen *screen = 0);
|
||||
|
||||
QColor color() const;
|
||||
void updateColor();
|
||||
|
@ -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> 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);
|
||||
|
Loading…
Reference in New Issue
Block a user