summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Olav Tvete <paul.tvete@qt.io>2016-09-22 10:24:03 +0200
committerPaul Olav Tvete <paul.tvete@qt.io>2016-10-03 08:34:01 +0000
commitdb9f2fc90ad1ae302846fa23d4955a8c07c444b7 (patch)
tree59033436a665dad6b8474a7c17ac57d532e99109
parent844204b2b04d0f3477d069db326f0e70129c71e2 (diff)
Expose native buffer handles
This is required for making accelerated compositors that do not use OpenGL. Change-Id: I76c735a971dc62344080aececc087c0495925b87 Reviewed-by: Louai Al-Khanji <louai.al-khanji@qt.io> Reviewed-by: Johan Helsing <johan.helsing@qt.io>
-rw-r--r--src/compositor/compositor_api/qwaylandbufferref.cpp20
-rw-r--r--src/compositor/compositor_api/qwaylandbufferref.h3
-rw-r--r--src/compositor/wayland_wrapper/qwlclientbuffer_p.h4
-rw-r--r--src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp10
-rw-r--r--src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.h4
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<quintptr>(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<EGLImageKHR>(native_buffer);
+ EGLImageKHR image = reinterpret_cast<EGLImageKHR>(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;