summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@digia.com>2014-01-15 16:37:02 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-16 12:36:56 +0100
commit3209f61310cb5244704e7cfa4f16044420c96747 (patch)
treef00eface688319537e6f8530fabee2762343a9c5 /examples
parent7d18164d8f8a302bf6a2317ca94ff411dcaf6c5b (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.cpp35
-rw-r--r--examples/qwindow-compositor/qwindowcompositor.h3
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;