diff options
author | Jørgen Lind <jorgen.lind@nokia.com> | 2012-02-29 16:15:49 +0100 |
---|---|---|
committer | Andy Nichols <andy.nichols@nokia.com> | 2012-03-01 17:35:21 +0100 |
commit | 6d3f23feb9b1ca1392d018702b62387d773a7be4 (patch) | |
tree | 261bfd20dae3c45e581a9bd48d8425d860a64774 /src/compositor/wayland_wrapper/wlsurface.cpp | |
parent | 36818145a95924712adfcb2d0f72d914e80596f3 (diff) |
Make SurfaceBuffer a QPlatformScreenBuffer
And refactor to make it fit
Done with: Paul
Change-Id: I2bd28abb4ac256a336cd6c2c90e67104d8c27cc5
Reviewed-by: Andy Nichols <andy.nichols@nokia.com>
Diffstat (limited to 'src/compositor/wayland_wrapper/wlsurface.cpp')
-rw-r--r-- | src/compositor/wayland_wrapper/wlsurface.cpp | 51 |
1 files changed, 31 insertions, 20 deletions
diff --git a/src/compositor/wayland_wrapper/wlsurface.cpp b/src/compositor/wayland_wrapper/wlsurface.cpp index 0b17e6010..fd06a5bfc 100644 --- a/src/compositor/wayland_wrapper/wlsurface.cpp +++ b/src/compositor/wayland_wrapper/wlsurface.cpp @@ -86,6 +86,9 @@ Surface::Surface(struct wl_client *client, uint32_t id, Compositor *compositor) wl_list_init(&m_frame_callback_list); addClientResource(client, &base()->resource, id, &wl_surface_interface, &Surface::surface_interface, destroy_surface); + for (int i = 0; i < buffer_pool_size; i++) { + m_bufferPool[i] = new SurfaceBuffer(this); + } } Surface::~Surface() @@ -94,12 +97,17 @@ Surface::~Surface() delete m_extendedSurface; delete m_subSurface; delete m_shellSurface; + + for (int i = 0; i < buffer_pool_size; i++) { + if (!m_bufferPool[i]->pageFlipperHasBuffer()) + delete m_bufferPool[i]; + } } WaylandSurface::Type Surface::type() const { SurfaceBuffer *surfaceBuffer = currentSurfaceBuffer(); - if (surfaceBuffer && surfaceBuffer->handle()) { + if (surfaceBuffer && surfaceBuffer->waylandBufferHandle()) { if (surfaceBuffer->isShmBuffer()) { return WaylandSurface::Shm; } else { @@ -119,8 +127,8 @@ bool Surface::isYInverted() const SurfaceBuffer *surfacebuffer = currentSurfaceBuffer(); if (!surfacebuffer) { ret = false; - } else if (graphicsHWIntegration && surfacebuffer->handle() && type() != WaylandSurface::Shm) { - ret = graphicsHWIntegration->isYInverted(surfacebuffer->handle()); + } else if (graphicsHWIntegration && surfacebuffer->waylandBufferHandle() && type() != WaylandSurface::Shm) { + ret = graphicsHWIntegration->isYInverted(surfacebuffer->waylandBufferHandle()); } else #endif ret = true; @@ -132,7 +140,7 @@ bool Surface::visible() const { SurfaceBuffer *surfacebuffer = currentSurfaceBuffer(); - return surfacebuffer->handle(); + return surfacebuffer->waylandBufferHandle(); } QPointF Surface::pos() const @@ -164,8 +172,8 @@ void Surface::setSize(const QSize &size) QImage Surface::image() const { SurfaceBuffer *surfacebuffer = currentSurfaceBuffer(); - if (surfacebuffer && !surfacebuffer->bufferIsDestroyed() && type() == WaylandSurface::Shm) { - ShmBuffer *shmBuffer = static_cast<ShmBuffer *>(surfacebuffer->handle()->user_data); + if (surfacebuffer && !surfacebuffer->isDestroyed() && type() == WaylandSurface::Shm) { + ShmBuffer *shmBuffer = static_cast<ShmBuffer *>(surfacebuffer->waylandBufferHandle()->user_data); return shmBuffer->image(); } return QImage(); @@ -191,7 +199,7 @@ void Surface::sendFrameCallback() surfacebuffer->setDisplayed(); if (m_backBuffer) { if (m_frontBuffer) - m_frontBuffer->destructBufferState(); + m_frontBuffer->disown(); m_frontBuffer = m_backBuffer; } @@ -274,8 +282,8 @@ void Surface::advanceBufferQueue() } m_backBuffer = m_bufferQueue.takeFirst(); - while (m_backBuffer && m_backBuffer->bufferIsDestroyed()) { - m_backBuffer->destructBufferState(); + while (m_backBuffer && m_backBuffer->isDestroyed()) { + m_backBuffer->disown(); m_bufferQueue.takeFirst(); m_backBuffer = m_bufferQueue.size() ? m_bufferQueue.first():0; } @@ -283,7 +291,7 @@ void Surface::advanceBufferQueue() if (!m_backBuffer) return; //we have no new backbuffer; - if (m_backBuffer->handle()) { + if (m_backBuffer->waylandBufferHandle()) { if (width != m_backBuffer->width() || height != m_backBuffer->height()) { width = m_backBuffer->width(); @@ -296,7 +304,7 @@ void Surface::advanceBufferQueue() if (m_backBuffer && (!m_subSurface || !m_subSurface->parent()) && !m_surfaceMapped) { m_surfaceMapped = true; emit m_waylandSurface->mapped(); - } else if (!m_backBuffer->handle() && m_surfaceMapped) { + } else if (m_backBuffer && !m_backBuffer->waylandBufferHandle() && m_surfaceMapped) { m_surfaceMapped = false; emit m_waylandSurface->unmapped(); } @@ -326,8 +334,8 @@ SurfaceBuffer *Surface::createSurfaceBuffer(struct wl_buffer *buffer) { SurfaceBuffer *newBuffer = 0; for (int i = 0; i < Surface::buffer_pool_size; i++) { - if (!m_bufferPool[i].isRegisteredWithBuffer()) { - newBuffer = &m_bufferPool[i]; + if (!m_bufferPool[i]->isRegisteredWithBuffer()) { + newBuffer = m_bufferPool[i]; newBuffer->initialize(buffer); break; } @@ -339,12 +347,15 @@ SurfaceBuffer *Surface::createSurfaceBuffer(struct wl_buffer *buffer) bool Surface::postBuffer() { #ifdef QT_COMPOSITOR_WAYLAND_GL - if (m_compositor->graphicsHWIntegration() && m_waylandSurface->handle() == m_compositor->directRenderSurface()) { + if (m_waylandSurface->handle() == m_compositor->directRenderSurface()) { SurfaceBuffer *surfaceBuffer = m_backBuffer? m_backBuffer : m_frontBuffer; - if (surfaceBuffer && m_compositor->graphicsHWIntegration()->postBuffer(surfaceBuffer->handle())) { - return true; - } else { - qDebug() << "could not post buffer"; + if (surfaceBuffer && m_compositor->pageFlipper()) { + if (m_compositor->pageFlipper()->displayBuffer(surfaceBuffer)) { + surfaceBuffer->setPageFlipperHasBuffer(true); + return true; + } else { + qDebug() << "could not post buffer"; + } } } #endif @@ -355,10 +366,10 @@ void Surface::attach(struct wl_buffer *buffer) { SurfaceBuffer *last = m_bufferQueue.size()?m_bufferQueue.last():0; if (last) { - if (last->handle() == buffer) + if (last->waylandBufferHandle() == buffer) return; if (!last->damageRect().isValid()) { - last->destructBufferState(); + last->disown(); m_bufferQueue.takeLast(); } } |