Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
dmabufserverbufferintegration.cpp
Go to the documentation of this file.
1// Copyright (C) 2018 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5#include <QtWaylandClient/private/qwaylanddisplay_p.h>
6#include <QDebug>
7#include <QtOpenGL/QOpenGLTexture>
8#include <QtGui/QOpenGLContext>
9
10#include <EGL/egl.h>
11#include <EGL/eglext.h>
12
14
15namespace QtWaylandClient {
16
18 , struct ::qt_server_buffer *id
19 , int32_t fd
20 , int32_t width
21 , int32_t height
22 , int32_t stride
23 , int32_t offset
24 , int32_t fourcc_format)
25 : m_integration(integration)
26 , m_server_buffer(id)
27{
29
30
31 EGLint import_attribs[] = {
32 EGL_WIDTH, width,
33 EGL_HEIGHT, height,
34 EGL_LINUX_DRM_FOURCC_EXT, fourcc_format,
35 EGL_DMA_BUF_PLANE0_FD_EXT, fd,
36 EGL_DMA_BUF_PLANE0_OFFSET_EXT, offset,
37 EGL_DMA_BUF_PLANE0_PITCH_EXT, stride,
38 EGL_NONE
39 };
40
41 m_image = integration->eglCreateImageKHR(
42 EGL_NO_CONTEXT,
43 EGL_LINUX_DMA_BUF_EXT,
44 (EGLClientBuffer)nullptr,
45 import_attribs);
46
47 int err = eglGetError();
48 qCDebug(lcQpaWayland) << "imported egl image" << m_image;
49 if (m_image == EGL_NO_IMAGE_KHR || err != EGL_SUCCESS)
50 qCWarning(lcQpaWayland) << "DmaBufServerBuffer error importing image. EGL error code" << Qt::hex << err;
51
52 qt_server_buffer_set_user_data(id, this);
53
54}
55
57{
58 int err = m_integration->eglDestroyImageKHR(m_image);
59 if (err != EGL_SUCCESS)
60 qCWarning(lcQpaWayland) << "~DmaBufServerBuffer error destroying image" << m_image << "error code " << Qt::hex << err;
61 qt_server_buffer_release(m_server_buffer);
62 qt_server_buffer_destroy(m_server_buffer);
63}
64
66{
68 qCWarning(lcQpaWayland) <<"DmaBufServerBuffer: creating texture with no current context";
69
70 if (!m_texture) {
72 m_texture->create();
73 }
74
75 m_texture->bind();
76 m_integration->glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, m_image);
77 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
78 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
79 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
80 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
81 m_texture->release();
82 m_texture->setSize(m_size.width(), m_size.height());
83 return m_texture;
84}
85
86void DmaBufServerBufferIntegration::initializeEgl()
87{
88 if (m_egl_initialized)
89 return;
90 m_egl_initialized = true;
91
92 m_egl_display = eglGetDisplay((EGLNativeDisplayType) m_display->wl_display());
93 if (m_egl_display == EGL_NO_DISPLAY) {
94 qCWarning(lcQpaWayland) << "Failed to initialize drm egl server buffer integration. Could not get egl display from wl_display.";
95 return;
96 }
97
98 const char *extensionString = eglQueryString(m_egl_display, EGL_EXTENSIONS);
99
100
101 if (!extensionString || !strstr(extensionString, "EGL_KHR_image")) {
102 qCWarning(lcQpaWayland) << "Failed to initialize dmabuf server buffer integration. There is no EGL_KHR_image extension.\n";
103 return;
104 }
105 m_egl_create_image = reinterpret_cast<PFNEGLCREATEIMAGEKHRPROC>(eglGetProcAddress("eglCreateImageKHR"));
106 m_egl_destroy_image = reinterpret_cast<PFNEGLDESTROYIMAGEKHRPROC>(eglGetProcAddress("eglDestroyImageKHR"));
107 if (!m_egl_create_image || !m_egl_destroy_image) {
108 qCWarning(lcQpaWayland) << "Failed to initialize dmabuf server buffer integration. Could not resolve eglCreateImageKHR or eglDestroyImageKHR";
109 return;
110 }
111
112 m_gl_egl_image_target_texture = reinterpret_cast<PFNGLEGLIMAGETARGETTEXTURE2DOESPROC>(eglGetProcAddress("glEGLImageTargetTexture2DOES"));
113 if (!m_gl_egl_image_target_texture) {
114 qCWarning(lcQpaWayland) << "Failed to initialize dmabuf server buffer integration. Could not resolve glEGLImageTargetTexture2DOES";
115 return;
116 }
117}
118
120{
121 m_display = display;
122 display->addRegistryListener(&wlDisplayHandleGlobal, this);
123}
124
126{
127 return static_cast<QWaylandServerBuffer *>(qt_server_buffer_get_user_data(buffer));
128}
129
130void DmaBufServerBufferIntegration::wlDisplayHandleGlobal(void *data, ::wl_registry *registry, uint32_t id, const QString &interface, uint32_t version)
131{
132 Q_UNUSED(version);
133 if (interface == QStringLiteral("qt_dmabuf_server_buffer")) {
134 auto *integration = static_cast<DmaBufServerBufferIntegration *>(data);
135 integration->QtWayland::qt_dmabuf_server_buffer::init(registry, id, 1);
136 }
137}
138
140 , int32_t name
141 , int32_t width
142 , int32_t height
143 , int32_t stride
144 , int32_t offset
145 , int32_t format)
146{
148}
149
150}
151
static QOpenGLContext * currentContext()
Returns the last context which called makeCurrent in the current thread, or \nullptr,...
\inmodule QtGui
void release()
Unbinds this texture from the currently active texture unit.
bool create()
Creates the underlying OpenGL texture object.
void bind()
Binds this texture to the currently active texture unit ready for rendering.
void setSize(int width, int height=1, int depth=1)
Sets the dimensions of this texture object to width, height, and depth.
\inmodule QtCore
Definition qsize.h:25
constexpr int height() const noexcept
Returns the height.
Definition qsize.h:133
constexpr int width() const noexcept
Returns the width.
Definition qsize.h:130
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
QWaylandServerBuffer * serverBuffer(struct qt_server_buffer *buffer) override
void glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
EGLImageKHR eglCreateImageKHR(EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list)
void dmabuf_server_buffer_server_buffer_created(struct ::qt_server_buffer *id, int32_t fd, int32_t width, int32_t height, int32_t stride, int32_t offset, int32_t fourcc_format) override
DmaBufServerBuffer(DmaBufServerBufferIntegration *integration, struct ::qt_server_buffer *id, int32_t fd, int32_t width, int32_t height, int32_t stride, int32_t offset, int32_t fourcc_format)
struct wl_display * wl_display() const
struct wl_display * display
Definition linuxdmabuf.h:41
Combined button and popup list for selecting options.
QTextStream & hex(QTextStream &stream)
Calls QTextStream::setIntegerBase(16) on stream and returns stream.
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char * interface
#define qCWarning(category,...)
#define qCDebug(category,...)
GLint GLsizei GLsizei height
GLenum GLuint id
[7]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
const void GLsizei GLsizei stride
GLenum GLuint buffer
GLint GLsizei width
GLenum GLuint GLintptr offset
GLuint64 GLenum GLint fd
GLuint name
GLint GLsizei GLsizei GLenum format
#define GL_CLAMP_TO_EDGE
Definition qopenglext.h:100
#define QStringLiteral(str)
#define Q_UNUSED(x)