1
0
mirror of https://github.com/thp/pyotherside.git synced 2025-02-05 08:08:23 +08:00

Use proper way of synchronizing PyFbo and PyFboRenderer.

This commit is contained in:
Dennis Tomas 2014-10-19 20:40:11 +02:00
parent 1ec78f422e
commit 092370631a
2 changed files with 26 additions and 41 deletions

View File

@ -26,7 +26,6 @@ class PyFboRenderer : public QQuickFramebufferObject::Renderer
public: public:
PyFboRenderer() PyFboRenderer()
: m_renderer(0) : m_renderer(0)
, m_oldRenderer(0)
{ {
} }
@ -36,45 +35,47 @@ public:
delete m_renderer; delete m_renderer;
m_renderer = 0; m_renderer = 0;
} }
if (m_oldRenderer) {
delete m_oldRenderer;
m_oldRenderer = 0;
}
} }
void render() { void render()
if (m_oldRenderer) { {
m_oldRenderer->cleanup(); if (!m_renderer)
delete m_oldRenderer;
m_oldRenderer = 0;
}
if (!m_renderer) {
return; return;
}
m_renderer->init();
m_renderer->render(); m_renderer->render();
} }
void setRenderer(QVariant rendererRef) { void synchronize(QQuickFramebufferObject *item)
// Defer deleting the old renderer until render() is called, {
// when we have an OpenGL context. PyFbo *pyFbo = static_cast<PyFbo *>(item);
m_oldRenderer = m_renderer;
m_renderer = new PyGLRenderer(rendererRef, false); if (pyFbo->renderer() == m_rendererRef)
update(); return;
if (m_renderer) {
m_renderer->cleanup();
delete m_renderer;
m_renderer = 0;
}
m_rendererRef = pyFbo->renderer();
if (!m_rendererRef.isNull()) {
m_renderer = new PyGLRenderer(m_rendererRef, false);
m_renderer->init();
}
} }
QOpenGLFramebufferObject *createFramebufferObject(const QSize &size) { QOpenGLFramebufferObject *createFramebufferObject(const QSize &size)
{
QOpenGLFramebufferObjectFormat format; QOpenGLFramebufferObjectFormat format;
// TODO: get the FBO format from the PyGLRenderer. // TODO: get the FBO format from the PyGLRenderer.
return new QOpenGLFramebufferObject(size, format); return new QOpenGLFramebufferObject(size, format);
} }
private: private:
QVariant m_rendererRef;
PyGLRenderer *m_renderer; PyGLRenderer *m_renderer;
PyGLRenderer *m_oldRenderer;
}; };
PyFbo::PyFbo() PyFbo::PyFbo()
: m_fboRenderer(0)
{ {
} }
@ -83,21 +84,10 @@ void PyFbo::setRenderer(QVariant rendererRef)
if (rendererRef == m_rendererRef) if (rendererRef == m_rendererRef)
return; return;
m_rendererRef = rendererRef; m_rendererRef = rendererRef;
update();
// If we already have a PyFboRenderer, set its python GL renderer.
// Otherwise it will be set when createRenderer() is called.
if (m_fboRenderer) {
static_cast<PyFboRenderer *>(m_fboRenderer)->setRenderer(m_rendererRef);
}
} }
QQuickFramebufferObject::Renderer *PyFbo::createRenderer() const QQuickFramebufferObject::Renderer *PyFbo::createRenderer() const
{ {
m_fboRenderer = new PyFboRenderer(); return new PyFboRenderer();
// If we already have a python GL renderer, set it now.
if (!m_rendererRef.isNull()) {
static_cast<PyFboRenderer *>(m_fboRenderer)->setRenderer(m_rendererRef);
}
return m_fboRenderer;
} }

View File

@ -37,11 +37,6 @@ public:
void setRenderer(QVariant rendererRef); void setRenderer(QVariant rendererRef);
private: private:
QVariant m_rendererRef; QVariant m_rendererRef;
// We have to keep a pointer to the renderer created by createRenderer()
// around, for being able to swap out its PyGLRenderer
// when setRenderer() is called.
mutable Renderer *m_fboRenderer;
}; };
#endif #endif