mirror of
https://github.com/overte-org/overte.git
synced 2025-04-20 03:24:00 +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>
|
||||
|
||||
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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue