From 85813ac9087bc3e5efa7717707449c55be8e70fc Mon Sep 17 00:00:00 2001 From: David Kelly Date: Wed, 5 Jul 2017 11:29:34 -0700 Subject: [PATCH 1/2] render issue fixes --- interface/src/ui/ResourceImageItem.cpp | 26 ++++++++++++++++++++------ interface/src/ui/ResourceImageItem.h | 2 +- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/interface/src/ui/ResourceImageItem.cpp b/interface/src/ui/ResourceImageItem.cpp index 9b5595c6ed..ac2e5384c7 100644 --- a/interface/src/ui/ResourceImageItem.cpp +++ b/interface/src/ui/ResourceImageItem.cpp @@ -32,13 +32,17 @@ void ResourceImageItem::setReady(bool ready) { } void ResourceImageItemRenderer::onUpdateTimer() { - if (_ready && _networkTexture && _networkTexture->isLoaded()) { - if(_fboMutex.tryLock()) { - invalidateFramebufferObject(); - qApp->getActiveDisplayPlugin()->copyTextureToQuickFramebuffer(_networkTexture, _copyFbo, &_fenceSync); - _fboMutex.unlock(); + if (_ready) { + if (_networkTexture && _networkTexture->isLoaded()) { + if(_fboMutex.tryLock()) { + invalidateFramebufferObject(); + qApp->getActiveDisplayPlugin()->copyTextureToQuickFramebuffer(_networkTexture, _copyFbo, &_fenceSync); + _fboMutex.unlock(); + } else { + qDebug() << "couldn't get a lock, using last frame"; + } } else { - qDebug() << "couldn't get a lock, using last frame"; + _networkTexture = DependencyManager::get()->getTexture(_url); } } update(); @@ -76,6 +80,9 @@ void ResourceImageItemRenderer::synchronize(QQuickFramebufferObject* item) { } QOpenGLFramebufferObject* ResourceImageItemRenderer::createFramebufferObject(const QSize& size) { + if (_copyFbo) { + delete _copyFbo; + } QOpenGLFramebufferObjectFormat format; format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); _copyFbo = new QOpenGLFramebufferObject(size, format); @@ -100,7 +107,14 @@ void ResourceImageItemRenderer::render() { _fboMutex.lock(); _copyFbo->bind(); QOpenGLFramebufferObject::blitFramebuffer(framebufferObject(), _copyFbo, GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT, GL_NEAREST); + + // this clears the copyFbo texture + // so next frame starts fresh - helps + // when aspect ratio changes + _copyFbo->takeTexture(); + _copyFbo->bind(); _copyFbo->release(); + _fboMutex.unlock(); if (doUpdate) { update(); diff --git a/interface/src/ui/ResourceImageItem.h b/interface/src/ui/ResourceImageItem.h index 2d6e2cf625..39cae44ed0 100644 --- a/interface/src/ui/ResourceImageItem.h +++ b/interface/src/ui/ResourceImageItem.h @@ -34,7 +34,7 @@ private: NetworkTexturePointer _networkTexture; QQuickWindow* _window; QMutex _fboMutex; - QOpenGLFramebufferObject* _copyFbo; + QOpenGLFramebufferObject* _copyFbo { nullptr }; GLsync _fenceSync { 0 }; QTimer _updateTimer; public slots: From 89c05244bf2e6ad8979be3991e34ff5717ad76ee Mon Sep 17 00:00:00 2001 From: David Kelly Date: Wed, 5 Jul 2017 13:24:31 -0700 Subject: [PATCH 2/2] remove unnecessary extra update() calls --- interface/src/ui/ResourceImageItem.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/interface/src/ui/ResourceImageItem.cpp b/interface/src/ui/ResourceImageItem.cpp index ac2e5384c7..d7ad793bb8 100644 --- a/interface/src/ui/ResourceImageItem.cpp +++ b/interface/src/ui/ResourceImageItem.cpp @@ -92,16 +92,11 @@ QOpenGLFramebufferObject* ResourceImageItemRenderer::createFramebufferObject(con void ResourceImageItemRenderer::render() { auto f = QOpenGLContext::currentContext()->extraFunctions(); - bool doUpdate = false; - // black background - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); if (_fenceSync) { f->glWaitSync(_fenceSync, 0, GL_TIMEOUT_IGNORED); f->glDeleteSync(_fenceSync); _fenceSync = 0; - doUpdate = true; } if (_ready) { _fboMutex.lock(); @@ -116,9 +111,6 @@ void ResourceImageItemRenderer::render() { _copyFbo->release(); _fboMutex.unlock(); - if (doUpdate) { - update(); - } } glFlush(); _window->resetOpenGLState();