From db9f2fc90ad1ae302846fa23d4955a8c07c444b7 Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Thu, 22 Sep 2016 10:24:03 +0200 Subject: Expose native buffer handles This is required for making accelerated compositors that do not use OpenGL. Change-Id: I76c735a971dc62344080aececc087c0495925b87 Reviewed-by: Louai Al-Khanji Reviewed-by: Johan Helsing --- src/compositor/compositor_api/qwaylandbufferref.cpp | 20 ++++++++++++++++++++ src/compositor/compositor_api/qwaylandbufferref.h | 3 +++ src/compositor/wayland_wrapper/qwlclientbuffer_p.h | 4 ++-- .../waylandeglclientbufferintegration.cpp | 10 +++++----- .../wayland-egl/waylandeglclientbufferintegration.h | 4 ++-- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/compositor/compositor_api/qwaylandbufferref.cpp b/src/compositor/compositor_api/qwaylandbufferref.cpp index 8f7c63f40..90b3f1c46 100644 --- a/src/compositor/compositor_api/qwaylandbufferref.cpp +++ b/src/compositor/compositor_api/qwaylandbufferref.cpp @@ -277,6 +277,26 @@ QOpenGLTexture *QWaylandBufferRef::toOpenGLTexture(int plane) const return d->buffer->toOpenGlTexture(plane); } +/*! + * Returns the native handle for this buffer, and marks it as locked so it will not be + * released until unlockNativeBuffer() is called. + * + * Returns 0 if there is no native handle for this buffer, or if the lock was unsuccessful. + */ +quintptr QWaylandBufferRef::lockNativeBuffer() +{ + return d->buffer->lockNativeBuffer(); +} + +/*! + * Marks the native buffer as no longer in use. \a handle must correspond to the value returned by + * a previous call to lockNativeBuffer(). + */ +void QWaylandBufferRef::unlockNativeBuffer(quintptr handle) +{ + d->buffer->unlockNativeBuffer(handle); +} + #endif QT_END_NAMESPACE diff --git a/src/compositor/compositor_api/qwaylandbufferref.h b/src/compositor/compositor_api/qwaylandbufferref.h index 549ea0a80..06486ef3a 100644 --- a/src/compositor/compositor_api/qwaylandbufferref.h +++ b/src/compositor/compositor_api/qwaylandbufferref.h @@ -103,6 +103,9 @@ public: QOpenGLTexture *toOpenGLTexture(int plane = 0) const; #endif + quintptr lockNativeBuffer(); + void unlockNativeBuffer(quintptr handle); + private: explicit QWaylandBufferRef(QtWayland::ClientBuffer *buffer); QtWayland::ClientBuffer *buffer() const; diff --git a/src/compositor/wayland_wrapper/qwlclientbuffer_p.h b/src/compositor/wayland_wrapper/qwlclientbuffer_p.h index 72c5a56e3..78e07ee98 100644 --- a/src/compositor/wayland_wrapper/qwlclientbuffer_p.h +++ b/src/compositor/wayland_wrapper/qwlclientbuffer_p.h @@ -84,8 +84,8 @@ public: virtual QSize size() const = 0; virtual QWaylandSurface::Origin origin() const = 0; - virtual void *lockNativeBuffer() { return nullptr; } - virtual void unlockNativeBuffer(void *native_buffer) const { Q_UNUSED(native_buffer); } + virtual quintptr lockNativeBuffer() { return 0; } + virtual void unlockNativeBuffer(quintptr native_buffer) const { Q_UNUSED(native_buffer); } virtual QImage image() const { return QImage(); } diff --git a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp index d71fce6ae..3814442c4 100644 --- a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp +++ b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp @@ -496,27 +496,27 @@ QWaylandSurface::Origin WaylandEglClientBuffer::origin() const return d->isYInverted ? QWaylandSurface::OriginTopLeft : QWaylandSurface::OriginBottomLeft; } -void *WaylandEglClientBuffer::lockNativeBuffer() +quintptr WaylandEglClientBuffer::lockNativeBuffer() { auto *p = WaylandEglClientBufferIntegrationPrivate::get(m_integration); if (d->egl_stream != EGL_NO_STREAM_KHR) - return nullptr; + return 0; EGLImageKHR image = p->egl_create_image(p->egl_display, EGL_NO_CONTEXT, EGL_WAYLAND_BUFFER_WL, m_buffer, NULL); - return image; + return reinterpret_cast(image); } -void WaylandEglClientBuffer::unlockNativeBuffer(void *native_buffer) const +void WaylandEglClientBuffer::unlockNativeBuffer(quintptr native_buffer) const { if (!native_buffer) return; auto *p = WaylandEglClientBufferIntegrationPrivate::get(m_integration); - EGLImageKHR image = static_cast(native_buffer); + EGLImageKHR image = reinterpret_cast(native_buffer); p->egl_destroy_image(p->egl_display, image); } diff --git a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.h b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.h index 5385ac25f..c93ce1dd8 100644 --- a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.h +++ b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.h @@ -68,8 +68,8 @@ public: QWaylandBufferRef::BufferFormatEgl bufferFormatEgl() const Q_DECL_OVERRIDE; QSize size() const Q_DECL_OVERRIDE; QWaylandSurface::Origin origin() const Q_DECL_OVERRIDE; - void *lockNativeBuffer() Q_DECL_OVERRIDE; - void unlockNativeBuffer(void *native_buffer) const Q_DECL_OVERRIDE; + quintptr lockNativeBuffer() Q_DECL_OVERRIDE; + void unlockNativeBuffer(quintptr native_buffer) const Q_DECL_OVERRIDE; QOpenGLTexture *toOpenGlTexture(int plane) Q_DECL_OVERRIDE; void setCommitted(QRegion &damage) Q_DECL_OVERRIDE; -- cgit v1.2.3