Source code
Revision control
Copy as Markdown
// Copyright (C) 2017 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#ifndef WINDOW_MULTITHREADED_H
#define WINDOW_MULTITHREADED_H
#include <QWindow>
#include <QMatrix4x4>
#include <QThread>
#include <QWaitCondition>
#include <QMutex>
QT_FORWARD_DECLARE_CLASS(QOpenGLContext)
QT_FORWARD_DECLARE_CLASS(QOffscreenSurface)
QT_FORWARD_DECLARE_CLASS(QQuickRenderControl)
QT_FORWARD_DECLARE_CLASS(QQuickWindow)
QT_FORWARD_DECLARE_CLASS(QQmlEngine)
QT_FORWARD_DECLARE_CLASS(QQmlComponent)
QT_FORWARD_DECLARE_CLASS(QQuickItem)
QT_FORWARD_DECLARE_CLASS(QRhi)
class CubeRenderer;
class QuickRenderer : public QObject
{
Q_OBJECT
public:
QuickRenderer();
void requestInit();
void requestRender();
void requestResize();
void requestCleanup();
void requestStop();
QWaitCondition *cond() { return &m_cond; }
QMutex *mutex() { return &m_mutex; }
void setContext(QOpenGLContext *ctx) { m_context = ctx; }
void setSurface(QOffscreenSurface *s) { m_surface = s; }
void setWindow(QWindow *w) { m_window = w; }
void setQuickWindow(QQuickWindow *w) { m_quickWindow = w; }
void setRenderControl(QQuickRenderControl *r) { m_renderControl = r; }
void aboutToQuit();
private:
bool event(QEvent *e) override;
void init();
void cleanup();
void cleanupRhi();
void ensureTexture();
void render(QMutexLocker<QMutex> *lock);
QWaitCondition m_cond;
QMutex m_mutex;
QOpenGLContext *m_context;
QOffscreenSurface *m_surface;
QWindow *m_window;
QQuickWindow *m_quickWindow;
QQuickRenderControl *m_renderControl;
QRhi *m_rhi;
uint m_textureId;
QSize m_textureSize;
CubeRenderer *m_cubeRenderer;
QMutex m_quitMutex;
bool m_quit;
};
class WindowMultiThreaded : public QWindow
{
Q_OBJECT
public:
WindowMultiThreaded();
~WindowMultiThreaded();
protected:
void exposeEvent(QExposeEvent *e) override;
void resizeEvent(QResizeEvent *e) override;
void mousePressEvent(QMouseEvent *e) override;
void mouseReleaseEvent(QMouseEvent *e) override;
bool event(QEvent *e) override;
private slots:
void run();
void requestUpdate();
void polishSyncAndRender();
private:
void startQuick(const QString &filename);
void updateSizes();
QuickRenderer *m_quickRenderer;
QThread *m_quickRendererThread;
QOpenGLContext *m_context;
QOffscreenSurface *m_offscreenSurface;
QQuickRenderControl *m_renderControl;
QQuickWindow *m_quickWindow;
QQmlEngine *m_qmlEngine;
QQmlComponent *m_qmlComponent;
QQuickItem *m_rootItem;
bool m_quickInitialized;
bool m_psrRequested;
};
#endif