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
libhybriseglserverbufferintegration.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 Jolla Ltd, author: <giulio.camuffo@jollamobile.com>
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 <QtGui/QOpenGLContext>
8#include <QtGui/QOpenGLTexture>
9#include <hybris/eglplatformcommon/hybris_nativebufferext.h>
10
11#include <EGL/egl.h>
12
14
15namespace QtWaylandClient {
16
18 , int32_t numFds
19 , wl_array *ints
20 , int32_t name
21 , int32_t width
22 , int32_t height
23 , int32_t stride
24 , int32_t format)
26 , m_integration(integration)
27 , m_stride(stride)
28 , m_hybrisFormat(format)
29{
30 m_numFds = numFds;
31 m_fds.reserve(numFds);
32 m_ints.resize(ints->size / sizeof(int32_t));
33 memcpy(m_ints.data(), ints->data, ints->size);
34 m_image = 0;
35
37}
38
43
45{
47 qWarning("LibHybrisServerBuffer: creating texture with no current context");
48 }
49
50 if (!m_texture) {
52 m_texture->create();
53 }
54
55 m_texture->bind();
56 m_integration->glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, m_image);
57
58 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
59 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
60 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
61 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
62 m_texture->release();
63 m_texture->setSize(m_size.width(), m_size.height());
64
65 return m_texture;
66}
67
69{
70 m_fds << fd;
71
72 if (m_fds.size() == m_numFds) {
73 EGLint egl_format;
74 switch (m_hybrisFormat) {
75 case QtWayland::qt_libhybris_egl_server_buffer::format_RGBA32:
77 egl_format = HYBRIS_PIXEL_FORMAT_RGBA_8888;
78 break;
79 default:
80 qWarning("LibHybrisServerBuffer: unknown format");
82 egl_format = HYBRIS_PIXEL_FORMAT_RGBA_8888;
83 break;
84 }
85
86 EGLClientBuffer buf;
87 m_integration->eglHybrisCreateRemoteBuffer(m_size.width(), m_size.height(), HYBRIS_USAGE_HW_TEXTURE, egl_format, m_stride, m_ints.size(), m_ints.data(), m_fds.size(), m_fds.data(), &buf);
88 m_image = m_integration->eglCreateImageKHR(EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, buf, 0);
89 }
90}
91
92void LibHybrisEglServerBufferIntegration::initializeEgl()
93{
94 if (m_egl_initialized)
95 return;
96 m_egl_initialized = true;
97
98 m_egl_display = eglGetDisplay((EGLNativeDisplayType) m_display->wl_display());
99 if (m_egl_display == EGL_NO_DISPLAY) {
100 qWarning("Failed to initialize libhybris egl server buffer integration. Could not get egl display from wl_display.");
101 return;
102 }
103
104 const char *extensionString = eglQueryString(m_egl_display, EGL_EXTENSIONS);
105 if (!extensionString || !strstr(extensionString, "EGL_KHR_image")) {
106 qWarning("Failed to initialize libhybris egl server buffer integration. There is no EGL_KHR_image extension.\n");
107 return;
108 }
109 m_egl_create_image = reinterpret_cast<PFNEGLCREATEIMAGEKHRPROC>(eglGetProcAddress("eglCreateImageKHR"));
110 m_egl_destroy_image = reinterpret_cast<PFNEGLDESTROYIMAGEKHRPROC>(eglGetProcAddress("eglDestroyImageKHR"));
111 if (!m_egl_create_image || !m_egl_destroy_image) {
112 qWarning("Failed to initialize libhybris egl server buffer integration. Could not resolve eglCreateImageKHR or eglDestroyImageKHR");
113 return;
114 }
115
116 m_gl_egl_image_target_texture = reinterpret_cast<PFNGLEGLIMAGETARGETTEXTURE2DOESPROC>(eglGetProcAddress("glEGLImageTargetTexture2DOES"));
117 if (!m_gl_egl_image_target_texture) {
118 qWarning("Failed to initialize libhybris egl server buffer integration. Could not resolve glEGLImageTargetTexture2DOES");
119 return;
120 }
121
122 m_egl_create_buffer = reinterpret_cast<PFNEGLHYBRISCREATEREMOTEBUFFERPROC>(eglGetProcAddress("eglHybrisCreateRemoteBuffer"));
123 if (!m_egl_create_buffer) {
124 qWarning("Failed to initialize libhybris egl server buffer integration. Could not resolve eglHybrisCreateRemoteBuffer");
125 return;
126 }
127 m_egl_initialized = true;
128}
129
131{
132 m_display = display;
133 display->addRegistryListener(&wlDisplayHandleGlobal, this);
134}
135
137{
138 return static_cast<QWaylandServerBuffer *>(qt_server_buffer_get_user_data(buffer));
139}
140
141void LibHybrisEglServerBufferIntegration::wlDisplayHandleGlobal(void *data, ::wl_registry *registry, uint32_t id, const QString &interface, uint32_t version)
142{
143 Q_UNUSED(version);
144 if (interface == QStringLiteral("qt_libhybris_egl_server_buffer")) {
145 auto *integration = static_cast<LibHybrisEglServerBufferIntegration *>(data);
146 integration->QtWayland::qt_libhybris_egl_server_buffer::init(registry, id, 1);
147 }
148}
149
151 , struct ::qt_server_buffer *qid
152 , int32_t numFds
153 , wl_array *ints
154 , int32_t name
155 , int32_t width
156 , int32_t height
157 , int32_t stride
158 , int32_t format)
159{
160 LibHybrisServerBuffer *server_buffer = new LibHybrisServerBuffer(this, numFds, ints, name, width, height, stride, format);
161 server_buffer->QtWayland::qt_libhybris_buffer::init(id);
162 qt_server_buffer_set_user_data(qid, server_buffer);
163}
164
165}
166
qsizetype size() const noexcept
Definition qlist.h:397
void reserve(qsizetype size)
Definition qlist.h:753
pointer data()
Definition qlist.h:431
void resize(qsizetype size)
Definition qlist.h:403
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
EGLBoolean eglHybrisCreateRemoteBuffer(EGLint width, EGLint height, EGLint usage, EGLint format, EGLint stride, int num_ints, int *ints, int num_fds, int *fds, EGLClientBuffer *buffer)
virtual QWaylandServerBuffer * serverBuffer(struct qt_server_buffer *buffer) override
void libhybris_egl_server_buffer_server_buffer_created(struct ::qt_libhybris_buffer *id, struct ::qt_server_buffer *qid, int32_t numFds, wl_array *ints, int32_t name, int32_t width, int32_t height, int32_t stride, int32_t format) override
EGLImageKHR eglCreateImageKHR(EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list)
LibHybrisServerBuffer(LibHybrisEglServerBufferIntegration *integration, int32_t numFds, wl_array *ints, int32_t name, int32_t width, int32_t height, int32_t stride, int32_t format)
struct wl_display * wl_display() const
EGLint EGLint EGLint EGLint int int * ints
struct wl_display * display
Definition linuxdmabuf.h:41
Combined button and popup list for selecting options.
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 qWarning
Definition qlogging.h:166
GLint GLsizei GLsizei height
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
const void GLsizei GLsizei stride
GLenum GLuint buffer
GLint GLsizei width
GLenum GLuint GLenum GLsizei const GLchar * buf
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)