fix for jitter and not rendering in tablet

This commit is contained in:
David Kelly 2017-07-03 15:19:04 -07:00
parent 373bd0cc8a
commit 99bf100ff8
2 changed files with 29 additions and 55 deletions

View file

@ -18,34 +18,36 @@
#include <DependencyManager.h>
ResourceImageItem::ResourceImageItem(QQuickItem* parent) : QQuickFramebufferObject(parent) {
connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(onUpdateTimer()));
}
void ResourceImageItem::onUpdateTimer() {
update();
}
void ResourceImageItem::setUrl(const QString& url) {
if (url != m_url) {
m_url = url;
update();
}
update();
}
void ResourceImageItem::setReady(bool ready) {
if (ready != m_ready) {
m_ready = ready;
if (m_ready) {
// 10 HZ for now. Also this serves as a small
// delay before getting the network texture, which
// helps a lot. TODO: find better way.
m_updateTimer.start(100);
update();
}
}
void ResourceImageItemRenderer::onUpdateTimer() {
if (_ready && _networkTexture && _networkTexture->isLoaded()) {
if(_fboMutex.tryLock()) {
invalidateFramebufferObject();
qApp->getActiveDisplayPlugin()->copyTextureToQuickFramebuffer(_networkTexture, _copyFbo, &_fenceSync);
_fboMutex.unlock();
} else {
m_updateTimer.stop();
update();
qDebug() << "couldn't get a lock, using last frame";
}
}
update();
}
ResourceImageItemRenderer::ResourceImageItemRenderer() : QQuickFramebufferObject::Renderer() {
connect(&_updateTimer, SIGNAL(timeout()), this, SLOT(onUpdateTimer()));
}
void ResourceImageItemRenderer::synchronize(QQuickFramebufferObject* item) {
@ -68,18 +70,11 @@ void ResourceImageItemRenderer::synchronize(QQuickFramebufferObject* item) {
_networkTexture = DependencyManager::get<TextureCache>()->getTexture(_url);
}
if (_ready && _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";
}
if (_ready && !_updateTimer.isActive()) {
_updateTimer.start(100);
} else if (!_ready && _updateTimer.isActive()) {
_updateTimer.stop();
}
glFlush();
}
QOpenGLFramebufferObject* ResourceImageItemRenderer::createFramebufferObject(const QSize& size) {
@ -90,28 +85,6 @@ QOpenGLFramebufferObject* ResourceImageItemRenderer::createFramebufferObject(con
return new QOpenGLFramebufferObject(size, format);
}
/*
// this is helpful to look for problems without the confusion of the framebufer stuff
void ResourceImageItemRenderer::render() {
qDebug() << "rendering";
static int colorInt = 0;
float red = (float)((colorInt++ % 50)/(float)50);
glClearColor(red, 0.0f, 0.0f, 0.5f + red/2.0f);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
update();
//_window->resetOpenGLState();
// we only want to call Renderer::update once per timer tick, and
// so waiting on the fenceSync and resetting it does that
auto f = QOpenGLContext::currentContext()->extraFunctions();
if (_fenceSync) {
f->glWaitSync(_fenceSync, 0, GL_TIMEOUT_IGNORED);
f->glDeleteSync(_fenceSync);
_fenceSync = 0;
update();
}
}
*/
void ResourceImageItemRenderer::render() {
auto f = QOpenGLContext::currentContext()->extraFunctions();
bool doUpdate = false;
@ -136,4 +109,5 @@ void ResourceImageItemRenderer::render() {
}
}
glFlush();
_window->resetOpenGLState();
}

View file

@ -18,8 +18,10 @@
#include <TextureCache.h>
class ResourceImageItemRenderer : public QQuickFramebufferObject::Renderer {
class ResourceImageItemRenderer : public QObject, public QQuickFramebufferObject::Renderer {
Q_OBJECT
public:
ResourceImageItemRenderer();
QOpenGLFramebufferObject* createFramebufferObject(const QSize& size) override;
void synchronize(QQuickFramebufferObject* item) override;
void render() override;
@ -32,6 +34,9 @@ private:
QMutex _fboMutex;
QOpenGLFramebufferObject* _copyFbo;
GLsync _fenceSync { 0 };
QTimer _updateTimer;
public slots:
void onUpdateTimer();
};
class ResourceImageItem : public QQuickFramebufferObject {
@ -39,20 +44,15 @@ class ResourceImageItem : public QQuickFramebufferObject {
Q_PROPERTY(QString url READ getUrl WRITE setUrl)
Q_PROPERTY(bool ready READ getReady WRITE setReady)
public:
ResourceImageItem(QQuickItem* parent = Q_NULLPTR);
QString getUrl() const { return m_url; }
void setUrl(const QString& url);
bool getReady() const { return m_ready; }
void setReady(bool ready);
QQuickFramebufferObject::Renderer* createRenderer() const override { return new ResourceImageItemRenderer; }
public slots:
void onUpdateTimer();
private:
QString m_url;
bool m_ready { false };
QTimer m_updateTimer; // TODO: something more clever
};