From 13d30ab06afe87a8efa341a810ed457b27ac8510 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 15 Jan 2019 18:59:55 +1100 Subject: [PATCH] threaded improvements --- ui/renderfunctions.cpp | 1 - ui/renderthread.cpp | 9 ++++++--- ui/renderthread.h | 3 ++- ui/viewerwidget.cpp | 36 +++++++++++++++++++++++++----------- ui/viewerwidget.h | 1 + 5 files changed, 34 insertions(+), 16 deletions(-) diff --git a/ui/renderfunctions.cpp b/ui/renderfunctions.cpp index f2db68027..b99200375 100644 --- a/ui/renderfunctions.cpp +++ b/ui/renderfunctions.cpp @@ -122,7 +122,6 @@ GLuint compose_sequence(Viewer* viewer, } bool drawn_gizmos = false; - if (video && nests.isEmpty()) texture_failed = false; Sequence* s = seq; long playhead = s->playhead; diff --git a/ui/renderthread.cpp b/ui/renderthread.cpp index e9dc57711..460f8be99 100644 --- a/ui/renderthread.cpp +++ b/ui/renderthread.cpp @@ -6,6 +6,7 @@ #include #include "ui/renderfunctions.h" +#include "playback/playback.h" RenderThread::RenderThread() : share_ctx(nullptr), @@ -83,11 +84,13 @@ void RenderThread::run() { } void RenderThread::paint() { + glLoadIdentity(); + + texture_failed = false; + glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); - glLoadIdentity(); - glClearColor(0, 0, 0, 0); glMatrixMode(GL_MODELVIEW); glEnable(GL_TEXTURE_2D); @@ -104,7 +107,7 @@ void RenderThread::paint() { glDisable(GL_TEXTURE_2D); } -void RenderThread::start_render(QOpenGLContext *share, Sequence *s) { +void RenderThread::start_render(QOpenGLContext *share, Sequence *s, int idivider) { share_ctx = share; seq = s; waitCond.wakeAll(); diff --git a/ui/renderthread.h b/ui/renderthread.h index 533eaf1d4..98414937c 100644 --- a/ui/renderthread.h +++ b/ui/renderthread.h @@ -19,13 +19,14 @@ public: GLuint frameBuffer; GLuint texColorBuffer; void paint(); - void start_render(QOpenGLContext* share, Sequence* s); + void start_render(QOpenGLContext* share, Sequence* s, int idivider = 0); private: QWaitCondition waitCond; QOffscreenSurface surface; QOpenGLContext* share_ctx; QOpenGLContext* ctx; Sequence* seq; + int divider; }; #endif // RENDERTHREAD_H diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index 7aba22da8..5090ab1a7 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -52,7 +52,8 @@ ViewerWidget::ViewerWidget(QWidget *parent) : waveform_scroll(0), dragging(false), gizmos(nullptr), - selected_gizmo(nullptr) + selected_gizmo(nullptr), + just_repaint(false) { setMouseTracking(true); setFocusPolicy(Qt::ClickFocus); @@ -392,25 +393,27 @@ void ViewerWidget::drawTitleSafeArea() { } void ViewerWidget::paintGL() { + retry_timer.stop(); + if (viewer->seq != nullptr) { gizmos = nullptr; drawn_gizmos = false; force_quit = false; - bool render_audio = (viewer->playing || rendering); + if (!just_repaint) { + bool render_audio = (viewer->playing || rendering); - retry_timer.stop(); + // send context to other thread for drawing + doneCurrent(); + renderer->start_render(context(), viewer->seq); - // send context to other thread for drawing - doneCurrent(); - renderer->start_render(context(), viewer->seq); - - // render the audio - QVector nests; - compose_sequence(viewer, context(), viewer->seq, nests, false, render_audio, &gizmos); + // render the audio + QVector nests; + compose_sequence(viewer, context(), viewer->seq, nests, false, render_audio, &gizmos); + } // try to draw the texture from the other thread if we got it - if (renderer->mutex.tryLock()) { + if (renderer->mutex.tryLock(10)) { makeCurrent(); glClearColor(0.0, 0.0, 0.0, 1.0); @@ -441,9 +444,20 @@ void ViewerWidget::paintGL() { glDisable(GL_TEXTURE_2D); renderer->mutex.unlock(); + + if (texture_failed) { + qDebug() << "texture failed, retry called"; + retry_timer.start(); + } + } else { + qDebug() << "renderer failed, retry called"; + retry_timer.start(); + just_repaint = true; } } + just_repaint = false; + /*drawn_gizmos = false; force_quit = false; diff --git a/ui/viewerwidget.h b/ui/viewerwidget.h index 52c7da1ab..ce6a5f555 100644 --- a/ui/viewerwidget.h +++ b/ui/viewerwidget.h @@ -67,6 +67,7 @@ private: bool drawn_gizmos; void move_gizmos(QMouseEvent *event, bool done); RenderThread* renderer; + bool just_repaint; private slots: void retry(); void show_context_menu();