mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 19:59:28 +02:00
fix for jitter and not rendering in tablet
This commit is contained in:
parent
373bd0cc8a
commit
99bf100ff8
2 changed files with 29 additions and 55 deletions
|
@ -18,34 +18,36 @@
|
||||||
|
|
||||||
#include <DependencyManager.h>
|
#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) {
|
void ResourceImageItem::setUrl(const QString& url) {
|
||||||
if (url != m_url) {
|
if (url != m_url) {
|
||||||
m_url = url;
|
m_url = url;
|
||||||
|
update();
|
||||||
}
|
}
|
||||||
update();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceImageItem::setReady(bool ready) {
|
void ResourceImageItem::setReady(bool ready) {
|
||||||
if (ready != m_ready) {
|
if (ready != m_ready) {
|
||||||
m_ready = ready;
|
m_ready = ready;
|
||||||
if (m_ready) {
|
update();
|
||||||
// 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);
|
void ResourceImageItemRenderer::onUpdateTimer() {
|
||||||
|
if (_ready && _networkTexture && _networkTexture->isLoaded()) {
|
||||||
|
if(_fboMutex.tryLock()) {
|
||||||
|
invalidateFramebufferObject();
|
||||||
|
qApp->getActiveDisplayPlugin()->copyTextureToQuickFramebuffer(_networkTexture, _copyFbo, &_fenceSync);
|
||||||
|
_fboMutex.unlock();
|
||||||
} else {
|
} else {
|
||||||
m_updateTimer.stop();
|
qDebug() << "couldn't get a lock, using last frame";
|
||||||
update();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
ResourceImageItemRenderer::ResourceImageItemRenderer() : QQuickFramebufferObject::Renderer() {
|
||||||
|
connect(&_updateTimer, SIGNAL(timeout()), this, SLOT(onUpdateTimer()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceImageItemRenderer::synchronize(QQuickFramebufferObject* item) {
|
void ResourceImageItemRenderer::synchronize(QQuickFramebufferObject* item) {
|
||||||
|
@ -68,18 +70,11 @@ void ResourceImageItemRenderer::synchronize(QQuickFramebufferObject* item) {
|
||||||
_networkTexture = DependencyManager::get<TextureCache>()->getTexture(_url);
|
_networkTexture = DependencyManager::get<TextureCache>()->getTexture(_url);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_ready && _networkTexture && _networkTexture->isLoaded()) {
|
if (_ready && !_updateTimer.isActive()) {
|
||||||
if(_fboMutex.tryLock()) {
|
_updateTimer.start(100);
|
||||||
invalidateFramebufferObject();
|
} else if (!_ready && _updateTimer.isActive()) {
|
||||||
qApp->getActiveDisplayPlugin()->copyTextureToQuickFramebuffer(_networkTexture, _copyFbo, &_fenceSync);
|
_updateTimer.stop();
|
||||||
_fboMutex.unlock();
|
|
||||||
} else {
|
|
||||||
qDebug() << "couldn't get a lock, using last frame";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
glFlush();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QOpenGLFramebufferObject* ResourceImageItemRenderer::createFramebufferObject(const QSize& size) {
|
QOpenGLFramebufferObject* ResourceImageItemRenderer::createFramebufferObject(const QSize& size) {
|
||||||
|
@ -90,28 +85,6 @@ QOpenGLFramebufferObject* ResourceImageItemRenderer::createFramebufferObject(con
|
||||||
return new QOpenGLFramebufferObject(size, format);
|
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() {
|
void ResourceImageItemRenderer::render() {
|
||||||
auto f = QOpenGLContext::currentContext()->extraFunctions();
|
auto f = QOpenGLContext::currentContext()->extraFunctions();
|
||||||
bool doUpdate = false;
|
bool doUpdate = false;
|
||||||
|
@ -136,4 +109,5 @@ void ResourceImageItemRenderer::render() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
glFlush();
|
glFlush();
|
||||||
|
_window->resetOpenGLState();
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,8 +18,10 @@
|
||||||
|
|
||||||
#include <TextureCache.h>
|
#include <TextureCache.h>
|
||||||
|
|
||||||
class ResourceImageItemRenderer : public QQuickFramebufferObject::Renderer {
|
class ResourceImageItemRenderer : public QObject, public QQuickFramebufferObject::Renderer {
|
||||||
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
ResourceImageItemRenderer();
|
||||||
QOpenGLFramebufferObject* createFramebufferObject(const QSize& size) override;
|
QOpenGLFramebufferObject* createFramebufferObject(const QSize& size) override;
|
||||||
void synchronize(QQuickFramebufferObject* item) override;
|
void synchronize(QQuickFramebufferObject* item) override;
|
||||||
void render() override;
|
void render() override;
|
||||||
|
@ -32,6 +34,9 @@ private:
|
||||||
QMutex _fboMutex;
|
QMutex _fboMutex;
|
||||||
QOpenGLFramebufferObject* _copyFbo;
|
QOpenGLFramebufferObject* _copyFbo;
|
||||||
GLsync _fenceSync { 0 };
|
GLsync _fenceSync { 0 };
|
||||||
|
QTimer _updateTimer;
|
||||||
|
public slots:
|
||||||
|
void onUpdateTimer();
|
||||||
};
|
};
|
||||||
|
|
||||||
class ResourceImageItem : public QQuickFramebufferObject {
|
class ResourceImageItem : public QQuickFramebufferObject {
|
||||||
|
@ -39,20 +44,15 @@ class ResourceImageItem : public QQuickFramebufferObject {
|
||||||
Q_PROPERTY(QString url READ getUrl WRITE setUrl)
|
Q_PROPERTY(QString url READ getUrl WRITE setUrl)
|
||||||
Q_PROPERTY(bool ready READ getReady WRITE setReady)
|
Q_PROPERTY(bool ready READ getReady WRITE setReady)
|
||||||
public:
|
public:
|
||||||
ResourceImageItem(QQuickItem* parent = Q_NULLPTR);
|
|
||||||
QString getUrl() const { return m_url; }
|
QString getUrl() const { return m_url; }
|
||||||
void setUrl(const QString& url);
|
void setUrl(const QString& url);
|
||||||
bool getReady() const { return m_ready; }
|
bool getReady() const { return m_ready; }
|
||||||
void setReady(bool ready);
|
void setReady(bool ready);
|
||||||
QQuickFramebufferObject::Renderer* createRenderer() const override { return new ResourceImageItemRenderer; }
|
QQuickFramebufferObject::Renderer* createRenderer() const override { return new ResourceImageItemRenderer; }
|
||||||
|
|
||||||
public slots:
|
|
||||||
void onUpdateTimer();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString m_url;
|
QString m_url;
|
||||||
bool m_ready { false };
|
bool m_ready { false };
|
||||||
QTimer m_updateTimer; // TODO: something more clever
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue