diff options
author | Laszlo Agocs <laszlo.agocs@digia.com> | 2014-01-15 16:37:02 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-16 12:36:56 +0100 |
commit | 3209f61310cb5244704e7cfa4f16044420c96747 (patch) | |
tree | f00eface688319537e6f8530fabee2762343a9c5 /examples | |
parent | 7d18164d8f8a302bf6a2317ca94ff411dcaf6c5b (diff) |
Fix qwindow-compositor with raster surfaces
Using the texture cache is wrong for two reasons:
1) it's a private API
2) we will get new QImages all the time so the caching is effectively useless
The main problem here is that the textures were not deleted which embedded
systems do not really like.
Change-Id: Ia9bafb0df58491f5ceb08ddcd9bf11b7c6137c83
Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
Diffstat (limited to 'examples')
-rw-r--r-- | examples/qwindow-compositor/qwindowcompositor.cpp | 35 | ||||
-rw-r--r-- | examples/qwindow-compositor/qwindowcompositor.h | 3 |
2 files changed, 28 insertions, 10 deletions
diff --git a/examples/qwindow-compositor/qwindowcompositor.cpp b/examples/qwindow-compositor/qwindowcompositor.cpp index 8e71ef069..79d5b111b 100644 --- a/examples/qwindow-compositor/qwindowcompositor.cpp +++ b/examples/qwindow-compositor/qwindowcompositor.cpp @@ -56,6 +56,7 @@ QWindowCompositor::QWindowCompositor(QOpenGLWindow *window) : QWaylandCompositor(window, 0, DefaultExtensions | SubSurfaceExtension) , m_window(window) + , m_backgroundTexture(0) , m_textureBlitter(0) , m_renderScheduler(this) , m_draggingWindow(0) @@ -67,7 +68,6 @@ QWindowCompositor::QWindowCompositor(QOpenGLWindow *window) { m_window->makeCurrent(); - m_textureCache = new QOpenGLTextureCache(m_window->context()); m_textureBlitter = new TextureBlitter(); m_backgroundImage = makeBackgroundImage(QLatin1String(":/background.jpg")); m_renderScheduler.setSingleShot(true); @@ -86,8 +86,8 @@ QWindowCompositor::QWindowCompositor(QOpenGLWindow *window) QWindowCompositor::~QWindowCompositor() { + glDeleteTextures(1, &m_backgroundTexture); delete m_textureBlitter; - delete m_textureCache; } @@ -237,7 +237,18 @@ QWaylandSurface *QWindowCompositor::surfaceAt(const QPointF &point, QPointF *loc return 0; } -GLuint QWindowCompositor::composeSurface(QWaylandSurface *surface) +static GLuint textureFromImage(const QImage &image) +{ + GLuint texture = 0; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + QImage tx = image.convertToFormat(QImage::Format_RGBA8888_Premultiplied); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tx.width(), tx.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tx.constBits()); + glBindTexture(GL_TEXTURE_2D, 0); + return texture; +} + +GLuint QWindowCompositor::composeSurface(QWaylandSurface *surface, bool *textureOwned) { GLuint texture = 0; @@ -245,9 +256,11 @@ GLuint QWindowCompositor::composeSurface(QWaylandSurface *surface) functions->glBindFramebuffer(GL_FRAMEBUFFER, m_surface_fbo); if (surface->type() == QWaylandSurface::Shm) { - texture = m_textureCache->bindTexture(QOpenGLContext::currentContext(),surface->image()); + texture = textureFromImage(surface->image()); + *textureOwned = true; } else if (surface->type() == QWaylandSurface::Texture) { texture = surface->texture(); + *textureOwned = false; } functions->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, @@ -273,11 +286,13 @@ void QWindowCompositor::paintChildren(QWaylandSurface *surface, QWaylandSurface GLuint texture = 0; if (subSurface->type() == QWaylandSurface::Texture) { texture = subSurface->texture(); - } else if (surface->type() == QWaylandSurface::Shm ) { - texture = m_textureCache->bindTexture(QOpenGLContext::currentContext(),surface->image()); + } else if (surface->type() == QWaylandSurface::Shm) { + texture = textureFromImage(subSurface->image()); } QRect geo(p.toPoint(),subSurface->size()); m_textureBlitter->drawTexture(texture,geo,window->size(),0,window->isYInverted(),subSurface->isYInverted()); + if (surface->type() == QWaylandSurface::Shm) + glDeleteTextures(1, &texture); } paintChildren(subSurface,window); } @@ -287,7 +302,8 @@ void QWindowCompositor::paintChildren(QWaylandSurface *surface, QWaylandSurface void QWindowCompositor::render() { m_window->makeCurrent(); - m_backgroundTexture = m_textureCache->bindTexture(QOpenGLContext::currentContext(),m_backgroundImage); + if (!m_backgroundTexture) + m_backgroundTexture = textureFromImage(m_backgroundImage); m_textureBlitter->bind(); // Draw the background image texture @@ -299,9 +315,12 @@ void QWindowCompositor::render() foreach (QWaylandSurface *surface, m_surfaces) { if (!surface->visible()) continue; - GLuint texture = composeSurface(surface); + bool ownsTexture; + GLuint texture = composeSurface(surface, &ownsTexture); QRect geo(surface->pos().toPoint(),surface->size()); m_textureBlitter->drawTexture(texture,geo,m_window->size(),0,false,surface->isYInverted()); + if (ownsTexture) + glDeleteTextures(1, &texture); } m_textureBlitter->release(); diff --git a/examples/qwindow-compositor/qwindowcompositor.h b/examples/qwindow-compositor/qwindowcompositor.h index 85da612a0..d09ffa893 100644 --- a/examples/qwindow-compositor/qwindowcompositor.h +++ b/examples/qwindow-compositor/qwindowcompositor.h @@ -71,7 +71,7 @@ protected: QWaylandSurface* surfaceAt(const QPointF &point, QPointF *local = 0); - GLuint composeSurface(QWaylandSurface *surface); + GLuint composeSurface(QWaylandSurface *surface, bool *textureOwned); void paintChildren(QWaylandSurface *surface, QWaylandSurface *window); @@ -93,7 +93,6 @@ private: GLuint m_backgroundTexture; QList<QWaylandSurface *> m_surfaces; TextureBlitter *m_textureBlitter; - QOpenGLTextureCache *m_textureCache; GLuint m_surface_fbo; QTimer m_renderScheduler; |