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)
|
if (share)
|
||||||
m_context->setShareContext(share->m_context);
|
m_context->setShareContext(share->m_context);
|
||||||
m_context->create();
|
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)
|
: m_colorIndex(0), m_renderer(renderer)
|
||||||
{
|
{
|
||||||
setSurfaceType(QWindow::OpenGLSurface);
|
setSurfaceType(QWindow::OpenGLSurface);
|
||||||
@ -67,6 +72,8 @@ HelloWindow::HelloWindow(const QSharedPointer<Renderer> &renderer)
|
|||||||
setGeometry(QRect(10, 10, 640, 480));
|
setGeometry(QRect(10, 10, 640, 480));
|
||||||
|
|
||||||
setFormat(renderer->format());
|
setFormat(renderer->format());
|
||||||
|
if (screen)
|
||||||
|
setScreen(screen);
|
||||||
|
|
||||||
create();
|
create();
|
||||||
|
|
||||||
@ -147,7 +154,7 @@ void Renderer::render()
|
|||||||
f->glViewport(0, 0, viewSize.width() * surface->devicePixelRatio(), viewSize.height() * surface->devicePixelRatio());
|
f->glViewport(0, 0, viewSize.width() * surface->devicePixelRatio(), viewSize.height() * surface->devicePixelRatio());
|
||||||
f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
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->glFrontFace(GL_CW);
|
||||||
f->glCullFace(GL_FRONT);
|
f->glCullFace(GL_FRONT);
|
||||||
f->glEnable(GL_CULL_FACE);
|
f->glEnable(GL_CULL_FACE);
|
||||||
@ -180,8 +187,13 @@ void Renderer::render()
|
|||||||
QTimer::singleShot(0, this, SLOT(render()));
|
QTimer::singleShot(0, this, SLOT(render()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Q_GLOBAL_STATIC(QMutex, initMutex)
|
||||||
|
|
||||||
void Renderer::initialize()
|
void Renderer::initialize()
|
||||||
{
|
{
|
||||||
|
// Threaded shader compilation can confuse some drivers. Avoid it.
|
||||||
|
QMutexLocker lock(initMutex());
|
||||||
|
|
||||||
QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex, this);
|
QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex, this);
|
||||||
vshader->compileSourceCode(
|
vshader->compileSourceCode(
|
||||||
"attribute highp vec4 vertex;"
|
"attribute highp vec4 vertex;"
|
||||||
|
@ -90,12 +90,14 @@ private:
|
|||||||
int m_currentWindow;
|
int m_currentWindow;
|
||||||
|
|
||||||
QMutex m_windowLock;
|
QMutex m_windowLock;
|
||||||
|
|
||||||
|
QColor m_backgroundColor;
|
||||||
};
|
};
|
||||||
|
|
||||||
class HelloWindow : public QWindow
|
class HelloWindow : public QWindow
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit HelloWindow(const QSharedPointer<Renderer> &renderer);
|
explicit HelloWindow(const QSharedPointer<Renderer> &renderer, QScreen *screen = 0);
|
||||||
|
|
||||||
QColor color() const;
|
QColor color() const;
|
||||||
void updateColor();
|
void updateColor();
|
||||||
|
@ -50,7 +50,9 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
QGuiApplication app(argc, 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 multipleWindows = QGuiApplication::arguments().contains(QStringLiteral("--multiple"));
|
||||||
|
const bool multipleScreens = QGuiApplication::arguments().contains(QStringLiteral("--multiscreen"));
|
||||||
|
|
||||||
QScreen *screen = QGuiApplication::primaryScreen();
|
QScreen *screen = QGuiApplication::primaryScreen();
|
||||||
|
|
||||||
@ -93,12 +95,13 @@ int main(int argc, char *argv[])
|
|||||||
windowC->setTitle(QStringLiteral("Thread B - Context B"));
|
windowC->setTitle(QStringLiteral("Thread B - Context B"));
|
||||||
windowC->setVisible(true);
|
windowC->setVisible(true);
|
||||||
windows.prepend(windowC);
|
windows.prepend(windowC);
|
||||||
|
}
|
||||||
|
if (multipleScreens) {
|
||||||
for (int i = 1; i < QGuiApplication::screens().size(); ++i) {
|
for (int i = 1; i < QGuiApplication::screens().size(); ++i) {
|
||||||
QScreen *screen = QGuiApplication::screens().at(i);
|
QScreen *screen = QGuiApplication::screens().at(i);
|
||||||
QSharedPointer<Renderer> renderer(new Renderer(format, rendererA.data(), screen));
|
QSharedPointer<Renderer> renderer(new Renderer(format, rendererA.data(), screen));
|
||||||
|
|
||||||
renderThread = new QThread;
|
QThread *renderThread = new QThread;
|
||||||
renderer->moveToThread(renderThread);
|
renderer->moveToThread(renderThread);
|
||||||
renderThreads.prepend(renderThread);
|
renderThreads.prepend(renderThread);
|
||||||
|
|
||||||
@ -107,8 +110,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
QSize windowSize = screenGeometry.size() * 0.8;
|
QSize windowSize = screenGeometry.size() * 0.8;
|
||||||
|
|
||||||
HelloWindow *window = new HelloWindow(renderer);
|
HelloWindow *window = new HelloWindow(renderer, screen);
|
||||||
window->setScreen(screen);
|
|
||||||
window->setGeometry(QRect(center, windowSize).translated(-windowSize.width() / 2, -windowSize.height() / 2));
|
window->setGeometry(QRect(center, windowSize).translated(-windowSize.width() / 2, -windowSize.height() / 2));
|
||||||
|
|
||||||
QChar id = QChar('B' + i);
|
QChar id = QChar('B' + i);
|
||||||
@ -123,10 +125,16 @@ int main(int argc, char *argv[])
|
|||||||
renderThreads.at(i)->start();
|
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();
|
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();
|
renderThreads.at(i)->wait();
|
||||||
|
}
|
||||||
|
|
||||||
qDeleteAll(windows);
|
qDeleteAll(windows);
|
||||||
qDeleteAll(renderThreads);
|
qDeleteAll(renderThreads);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user