Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
libhybriseglserverbufferintegration.h
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// Qt-Security score:significant reason:default
4
5#ifndef LIBHYBRISEGLSERVERBUFFERINTEGRATION_H
6#define LIBHYBRISEGLSERVERBUFFERINTEGRATION_H
7
8#include <QtWaylandClient/private/qwayland-wayland.h>
9#include "qwayland-libhybris-egl-server-buffer.h"
10#include <QtWaylandClient/private/qwaylandserverbufferintegration_p.h>
11#include <QtWaylandClient/private/qwaylanddisplay_p.h>
12#include <QtCore/QList>
13#include <QtCore/QTextStream>
14
15#include <EGL/egl.h>
16#include <EGL/eglext.h>
17#ifndef EGL_KHR_image
18typedef void *EGLImageKHR;
19typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
20typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image);
21#endif
22
23#ifndef GL_OES_EGL_image
24typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image);
25#endif
26
27#ifndef EGL_HYBRIS_native_buffer
28typedef EGLBoolean (EGLAPIENTRYP PFNEGLHYBRISCREATEREMOTEBUFFERPROC)(EGLint width, EGLint height, EGLint usage, EGLint format, EGLint stride,
29 int num_ints, int *ints, int num_fds, int *fds, EGLClientBuffer *buffer);
30#endif
31
32QT_BEGIN_NAMESPACE
33
34namespace QtWaylandClient {
35
37
39{
40public:
41 LibHybrisServerBuffer(LibHybrisEglServerBufferIntegration *integration, int32_t numFds, wl_array *ints, int32_t name, int32_t width, int32_t height, int32_t stride, int32_t format);
44
45protected:
46 void libhybris_buffer_add_fd(int32_t fd) override;
47
48private:
49 LibHybrisEglServerBufferIntegration *m_integration = nullptr;
50 EGLImageKHR m_image;
51 QOpenGLTexture *m_texture = nullptr;
52 int m_numFds;
53 QList<int32_t> m_ints;
54 QList<int32_t> m_fds;
55 int32_t m_stride;
56 int32_t m_hybrisFormat;
57};
58
62{
63public:
64 void initialize(QWaylandDisplay *display) override;
65
66 virtual QWaylandServerBuffer *serverBuffer(struct qt_server_buffer *buffer) override;
67
68 inline EGLImageKHR eglCreateImageKHR(EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
69 inline EGLBoolean eglDestroyImageKHR (EGLImageKHR image);
70 inline void glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image);
71 inline EGLBoolean eglHybrisCreateRemoteBuffer(EGLint width, EGLint height, EGLint usage, EGLint format, EGLint stride, int num_ints, int *ints, int num_fds, int *fds, EGLClientBuffer *buffer);
72
73protected:
74 void libhybris_egl_server_buffer_server_buffer_created(struct ::qt_libhybris_buffer *id, struct ::qt_server_buffer *qid,
75 int32_t numFds, wl_array *ints, int32_t name, int32_t width, int32_t height, int32_t stride, int32_t format) override;
76private:
77 static void wlDisplayHandleGlobal(void *data, struct ::wl_registry *registry, uint32_t id,
78 const QString &interface, uint32_t version);
79 void initializeEgl();
80
81 PFNEGLCREATEIMAGEKHRPROC m_egl_create_image;
82 PFNEGLDESTROYIMAGEKHRPROC m_egl_destroy_image;
83 PFNGLEGLIMAGETARGETTEXTURE2DOESPROC m_gl_egl_image_target_texture;
84 PFNEGLHYBRISCREATEREMOTEBUFFERPROC m_egl_create_buffer;
85 QWaylandDisplay *m_display = nullptr;
86 EGLDisplay m_egl_display = EGL_NO_DISPLAY;
87 bool m_egl_initialized = false;
88};
89
90EGLImageKHR LibHybrisEglServerBufferIntegration::eglCreateImageKHR(EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list)
91{
92 if (!m_egl_initialized)
93 initializeEgl();
94
95 if (!m_egl_create_image) {
96 qWarning("LibHybrisEglServerBufferIntegration: Trying to used unresolved function eglCreateImageKHR");
97 return EGL_NO_IMAGE_KHR;
98 }
99 return m_egl_create_image(m_egl_display, ctx, target, buffer,attrib_list);
100}
101
103{
104 if (!m_egl_destroy_image) {
105 qWarning("LibHybrisEglServerBufferIntegration: Trying to use unresolved function eglDestroyImageKHR");
106 return false;
107 }
108 return m_egl_destroy_image(m_egl_display, image);
109}
110
112{
113 if (!m_gl_egl_image_target_texture) {
114 qWarning("LibHybrisEglServerBufferIntegration: Trying to use unresolved function glEGLImageTargetRenderbufferStorageOES");
115 return;
116 }
117 m_gl_egl_image_target_texture(target,image);
118}
119
120EGLBoolean LibHybrisEglServerBufferIntegration::eglHybrisCreateRemoteBuffer(EGLint width, EGLint height, EGLint usage, EGLint format, EGLint stride,
121 int num_ints, int *ints, int num_fds, int *fds, EGLClientBuffer *buffer)
122{
123 if (!m_egl_create_buffer) {
124 qWarning("LibHybrisEglServerBufferIntegration: Trying to use unresolved function eglHybrisCreateRemoteBuffer");
125 return false;
126 }
127 return m_egl_create_buffer(width, height, usage, format, stride, num_ints, ints, num_fds, fds, buffer);
128}
129
130}
131
132QT_END_NAMESPACE
133
134#endif
EGLBoolean eglHybrisCreateRemoteBuffer(EGLint width, EGLint height, EGLint usage, EGLint format, EGLint stride, int num_ints, int *ints, int num_fds, int *fds, EGLClientBuffer *buffer)
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)
Combined button and popup list for selecting options.
typedef void(GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)(GLenum target
EGLint EGLint EGLint EGLint int int * ints
EGLint EGLint EGLint EGLint int int int int EGLClientBuffer * buffer
EGLint EGLint EGLint EGLint stride
EGLint EGLint EGLint format
EGLint EGLint usage
EGLint EGLint EGLint EGLint int num_ints
EGLint EGLint EGLint EGLint int int int int * fds
EGLint EGLint EGLint EGLint int int int num_fds