5#include <QtWaylandClient/private/qwaylanddisplay_p.h>
7#include <QtOpenGL/QOpenGLTexture>
8#include <QtGui/QOpenGLContext>
22 : m_integration(integration)
24 m_size = QSize(width, height);
26 int32_t format_stride;
28 case QtWayland::qt_drm_egl_server_buffer::format_RGBA32:
29 m_format = QWaylandServerBuffer::RGBA32;
30 egl_format = EGL_DRM_BUFFER_FORMAT_ARGB32_MESA;
31 format_stride = stride / 4;
33#ifdef EGL_DRM_BUFFER_FORMAT_A8_MESA
34 case QtWayland::qt_drm_egl_server_buffer::format_A8:
35 m_format = QWaylandServerBuffer::A8;
36 egl_format = EGL_DRM_BUFFER_FORMAT_A8_MESA;
37 format_stride = stride;
41 qWarning(
"DrmServerBuffer: unknown format");
42 m_format = QWaylandServerBuffer::RGBA32;
43 egl_format = EGL_DRM_BUFFER_FORMAT_ARGB32_MESA;
44 format_stride = stride / 4;
50 EGL_DRM_BUFFER_STRIDE_MESA, format_stride,
51 EGL_DRM_BUFFER_FORMAT_MESA, egl_format,
55 qintptr name_pointer = name;
56 m_image = integration
->eglCreateImageKHR(EGL_NO_CONTEXT
, EGL_DRM_BUFFER_MESA
, (EGLClientBuffer) name_pointer
, attribs
);
67 if (!QOpenGLContext::currentContext())
68 qWarning(
"DrmServerBuffer: creating texture with no current context");
71 m_texture =
new QOpenGLTexture(QOpenGLTexture::Target2D);
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);
82 m_texture->setSize(m_size.width(), m_size.height());
88 if (m_egl_initialized)
90 m_egl_initialized =
true;
92#if QT_CONFIG(egl_extension_platform_wayland)
93 m_egl_display = eglGetPlatformDisplay(EGL_PLATFORM_WAYLAND_EXT, m_display->wl_display(),
nullptr);
95 m_egl_display = eglGetDisplay((EGLNativeDisplayType) m_display->wl_display());
97 if (m_egl_display == EGL_NO_DISPLAY) {
98 qWarning(
"Failed to initialize drm egl server buffer integration. Could not get egl display from wl_display.");
102 const char *extensionString = eglQueryString(m_egl_display, EGL_EXTENSIONS);
103 if (!extensionString || !strstr(extensionString,
"EGL_KHR_image")) {
104 qWarning(
"Failed to initialize drm egl server buffer integration. There is no EGL_KHR_image extension.\n");
107 m_egl_create_image =
reinterpret_cast<PFNEGLCREATEIMAGEKHRPROC>(eglGetProcAddress(
"eglCreateImageKHR"));
108 m_egl_destroy_image =
reinterpret_cast<PFNEGLDESTROYIMAGEKHRPROC>(eglGetProcAddress(
"eglDestroyImageKHR"));
109 if (!m_egl_create_image || !m_egl_destroy_image) {
110 qWarning(
"Failed to initialize drm egl server buffer integration. Could not resolve eglCreateImageKHR or eglDestroyImageKHR");
114 m_gl_egl_image_target_texture =
reinterpret_cast<PFNGLEGLIMAGETARGETTEXTURE2DOESPROC>(eglGetProcAddress(
"glEGLImageTargetTexture2DOES"));
115 if (!m_gl_egl_image_target_texture) {
116 qWarning(
"Failed to initialize drm egl server buffer integration. Could not resolve glEGLImageTargetTexture2DOES");
119 m_egl_initialized =
true;
125 display->addRegistryListener(&wlDisplayHandleGlobal,
this);
130 return static_cast<QWaylandServerBuffer *>(qt_server_buffer_get_user_data(buffer));
133void DrmEglServerBufferIntegration::wlDisplayHandleGlobal(
void *data, ::wl_registry *registry, uint32_t id,
const QString &interface, uint32_t version)
136 if (interface == QStringLiteral(
"qt_drm_egl_server_buffer")) {
138 integration->QtWayland::qt_drm_egl_server_buffer::init(registry, id, 1);
150 qt_server_buffer_set_user_data(id, server_buffer);
void initialize(QWaylandDisplay *display) override
EGLImageKHR eglCreateImageKHR(EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list)
EGLBoolean eglDestroyImageKHR(EGLImageKHR image)
QOpenGLTexture * toOpenGlTexture() override
DrmServerBuffer(DrmEglServerBufferIntegration *integration, int32_t name, int32_t width, int32_t height, int32_t stride, int32_t format)
~DrmServerBuffer() override
Combined button and popup list for selecting options.