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/wlsurfacebuffer.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/wlsurfacebuffer.cpp')
-rw-r--r-- | src/compositor/wayland_wrapper/wlsurfacebuffer.cpp | 71 |
1 files changed, 59 insertions, 12 deletions
diff --git a/src/compositor/wayland_wrapper/wlsurfacebuffer.cpp b/src/compositor/wayland_wrapper/wlsurfacebuffer.cpp index 0a3527993..9c83925df 100644 --- a/src/compositor/wayland_wrapper/wlsurfacebuffer.cpp +++ b/src/compositor/wayland_wrapper/wlsurfacebuffer.cpp @@ -40,19 +40,27 @@ #include "wlsurfacebuffer.h" +#include "wlsurface.h" +#include "wlcompositor.h" + #ifdef QT_COMPOSITOR_WAYLAND_GL #include "hardware_integration/graphicshardwareintegration.h" #include <QtGui/QPlatformOpenGLContext> #endif +#include <QtCore/QDebug> + namespace Wayland { -SurfaceBuffer::SurfaceBuffer() - : m_buffer(0) - , m_dont_send_release(false) +SurfaceBuffer::SurfaceBuffer(Surface *surface) + : QPlatformScreenBuffer() + , m_surface(surface) + , m_compositor(surface->compositor()) + , m_buffer(0) , m_is_registered_for_buffer(false) + , m_surface_has_buffer(false) + , m_page_flipper_has_buffer(false) , m_is_displayed(false) - , m_is_destroyed(false) , m_texture(0) { } @@ -67,10 +75,11 @@ void SurfaceBuffer::initialize(wl_buffer *buffer) { m_buffer = buffer; m_texture = 0; - m_dont_send_release = false; m_is_registered_for_buffer = true; + m_surface_has_buffer = true; + m_page_flipper_has_buffer = false; m_is_displayed = false; - m_is_destroyed = false; + m_destroyed = false; m_destroy_listener.surfaceBuffer = this; m_destroy_listener.listener.func = destroy_listener_callback; if (buffer) @@ -80,6 +89,7 @@ void SurfaceBuffer::initialize(wl_buffer *buffer) void SurfaceBuffer::destructBufferState() { + Q_ASSERT(!m_page_flipper_has_buffer); destroyTexture(); if (m_buffer) { wl_list_remove(&m_destroy_listener.listener.link); @@ -93,15 +103,37 @@ void SurfaceBuffer::destructBufferState() void SurfaceBuffer::sendRelease() { Q_ASSERT(m_buffer); - if (m_dont_send_release) - return; wl_resource_post_event(&m_buffer->resource, WL_BUFFER_RELEASE); - m_dont_send_release = true; } -void SurfaceBuffer::dontSendRelease() +void SurfaceBuffer::setPageFlipperHasBuffer(bool owns) { - m_dont_send_release = true; + m_page_flipper_has_buffer = owns; +} + +void SurfaceBuffer::release() +{ + m_compositor->scheduleReleaseBuffer(this); +} + +void SurfaceBuffer::scheduledRelease() +{ + qDebug() << Q_FUNC_INFO; + m_page_flipper_has_buffer = false; + if (!m_surface_has_buffer) + destructBufferState(); + if (!m_surface) { + delete this; + } +} + +void SurfaceBuffer::disown() +{ + m_surface_has_buffer = false; + + if (!m_page_flipper_has_buffer) { + destructBufferState(); + } } void SurfaceBuffer::setDisplayed() @@ -128,6 +160,21 @@ void SurfaceBuffer::destroyTexture() #endif } +void SurfaceBuffer::handleAboutToBeDisplayed() +{ + qDebug() << Q_FUNC_INFO; +} + +void SurfaceBuffer::handleDisplayed() +{ + qDebug() << Q_FUNC_INFO; +} + +void *SurfaceBuffer::handle() const +{ + return m_buffer->user_data; +} + void SurfaceBuffer::destroy_listener_callback(wl_listener *listener, wl_resource *resource, uint32_t time) { Q_UNUSED(resource); @@ -136,7 +183,7 @@ void SurfaceBuffer::destroy_listener_callback(wl_listener *listener, wl_resource reinterpret_cast<struct surface_buffer_destroy_listener *>(listener); SurfaceBuffer *d = destroy_listener->surfaceBuffer; d->destroyTexture(); - d->m_is_destroyed = true; + d->m_destroyed = true; d->m_buffer = 0; } |