repaint();
}
+void DisplayWidget::paintEvent(QPaintEvent *event)
+{
+}
+
void DisplayWidget::resizeEvent(QResizeEvent *event)
{
qDebug("resize display");
- QGLWidget::resizeEvent(event); /* initializeGL */
+ //QGLWidget::resizeEvent(event); /* initializeGL */
MainWindow *win = ((MainWindow *)this->parent()->parent());
SkinLayout *layout = win->uiInfo->getLayout();
QOpenGLContext *qt5GLContext = NULL;
QSurfaceFormat qt5GLFormat;
+DisplaySwapper::DisplaySwapper(QGLContext* context, QObject* parent)
+: QObject(parent),
+ context(context),
+ swapping(false)
+{
+}
+
+void DisplaySwapper::lock()
+{
+ m.lock();
+
+ while (swapping) {
+ c.wait(&m);
+ }
+
+ m.unlock();
+}
+
+void DisplaySwapper::unlock()
+{
+ swapping = true;
+}
+
+void DisplaySwapper::swapBuffers()
+{
+ context->makeCurrent();
+ context->swapBuffers();
+ context->doneCurrent();
+
+ context->moveToThread(qApp->thread());
+
+ m.lock();
+ swapping = false;
+ m.unlock();
+
+ c.wakeAll();
+}
+
MainWindow::MainWindow(UIInformation *uiInfo, QWidget *parent) :
QWidget(parent)
{
setContextMenuPolicy(Qt::CustomContextMenu);
connect(this, SIGNAL(customContextMenuRequested(const QPoint&)),
SLOT(showContextMenu(const QPoint&)));
+
+ swapperThread = new QThread(this);
+
+ swapper = new DisplaySwapper(context);
+ swapper->moveToThread(swapperThread);
+ connect(swapperThread, &QThread::finished, swapper, &QObject::deleteLater);
+
+ swapperThread->start();
}
QLabel *MainWindow::getLabel()
void MainWindow::makeCurrent(bool value)
{
if (value) {
+ swapper->lock();
display->makeCurrent();
} else {
- display->swapBuffers();
display->doneCurrent();
+ swapper->unlock();
+ display->context()->moveToThread(swapperThread);
+ QMetaObject::invokeMethod(swapper, "swapBuffers", Qt::QueuedConnection);
}
}
MainWindow::~MainWindow()
{
qDebug("destory main window");
+
+ swapperThread->quit();
+ swapperThread->wait();
}
void MainWindow::closeEvent(QCloseEvent *event)
class QLabel;
QT_END_NAMESPACE
+class DisplaySwapper : public QObject
+{
+ Q_OBJECT
+
+public:
+ DisplaySwapper(QGLContext* context, QObject* parent = 0);
+
+ void lock();
+ void unlock();
+
+public slots:
+ void swapBuffers();
+
+private:
+ QGLContext *context;
+ QMutex m;
+ QWaitCondition c;
+ bool swapping;
+};
+
class MainWindow : public QWidget
{
Q_OBJECT
SkinView* skinView;
DisplayWidget *display;
SkinControllerView *conView;
+ QThread *swapperThread;
+ DisplaySwapper *swapper;
};
#endif // MAINWINDOW_H