mirror of
https://github.com/lingble/meta-tegra.git
synced 2025-11-02 05:17:52 +00:00
weston: drop weston 10.0.2 recipe and bbappend
Signed-off-by: Matt Madison <matt@madison.systems>
This commit is contained in:
@@ -1,33 +0,0 @@
|
|||||||
From 8eec4e961f1e36bedcb057bf76f9c1febb6524cb Mon Sep 17 00:00:00 2001
|
|
||||||
From: Matt Madison <matt@madison.systems>
|
|
||||||
Date: Mon, 14 Feb 2022 08:38:55 -0800
|
|
||||||
Subject: [PATCH] Drop DRM version check in meson.build
|
|
||||||
|
|
||||||
The NVIDIA libdrm that we drop in at runtime doesn't
|
|
||||||
support the feature that weston is looking for, but
|
|
||||||
the version it checks at build time is real libdrm,
|
|
||||||
not ours, so just drop the check entirely for tegra
|
|
||||||
builds.
|
|
||||||
|
|
||||||
Signed-off-by: Matt Madison <matt@madison.systems>
|
|
||||||
---
|
|
||||||
meson.build | 6 ------
|
|
||||||
1 file changed, 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/meson.build b/meson.build
|
|
||||||
index 7b80214..b1295be 100644
|
|
||||||
--- a/meson.build
|
|
||||||
+++ b/meson.build
|
|
||||||
@@ -156,12 +156,6 @@ dep_libdrm = dependency('libdrm', version: '>= 2.4.95')
|
|
||||||
dep_libdrm_headers = dep_libdrm.partial_dependency(compile_args: true)
|
|
||||||
dep_threads = dependency('threads')
|
|
||||||
|
|
||||||
-dep_libdrm_version = dep_libdrm.version()
|
|
||||||
-if dep_libdrm_version.version_compare('>=2.4.107')
|
|
||||||
- message('Found libdrm with human format modifier support.')
|
|
||||||
- config_h.set('HAVE_HUMAN_FORMAT_MODIFIER', '1')
|
|
||||||
-endif
|
|
||||||
-
|
|
||||||
prog_python = import('python').find_installation('python3')
|
|
||||||
files_xxd_py = files('tools/xxd.py')
|
|
||||||
cmd_xxd = [ prog_python, files_xxd_py, '@INPUT@', '@OUTPUT@' ]
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
From 50a44ee682360fc9793e74aea86f53efe8286094 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Khem Raj <raj.khem@gmail.com>
|
|
||||||
Date: Thu, 14 Dec 2023 09:13:54 -0800
|
|
||||||
Subject: [PATCH] libweston,tools: Include libgen.h for basename signature
|
|
||||||
|
|
||||||
Latest musl has removed the declaration from string.h [1] as it only
|
|
||||||
implements POSIX version alone and string.h in glibc implements GNU
|
|
||||||
version of basename. This now results in compile errors on musl.
|
|
||||||
|
|
||||||
This might be a warning with older compilers but it is error with
|
|
||||||
Clang-17+ as it treats -Wimplicit-function-declaration as error
|
|
||||||
|
|
||||||
Switch the use in backlight_init function to use POSIX version
|
|
||||||
|
|
||||||
[1] https://git.musl-libc.org/cgit/musl/commit/?id=725e17ed6dff4d0cd22487bb64470881e86a92e7
|
|
||||||
|
|
||||||
Upstream-Status: Submitted [https://gitlab.freedesktop.org/wayland/weston/-/merge_requests/1420]
|
|
||||||
Signed-off-by: Khem Raj <raj.khem@gmail.com>
|
|
||||||
---
|
|
||||||
libweston/backend-drm/libbacklight.c | 8 +++++---
|
|
||||||
tools/zunitc/src/zunitc_impl.c | 1 +
|
|
||||||
2 files changed, 6 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/libweston/backend-drm/libbacklight.c b/libweston/backend-drm/libbacklight.c
|
|
||||||
index ca7f2d68..973d15ff 100644
|
|
||||||
--- a/libweston/backend-drm/libbacklight.c
|
|
||||||
+++ b/libweston/backend-drm/libbacklight.c
|
|
||||||
@@ -41,6 +41,7 @@
|
|
||||||
#include <drm.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
+#include <libgen.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
@@ -167,7 +168,7 @@ struct backlight *backlight_init(struct udev_device *drm_device,
|
|
||||||
DIR *backlights = NULL;
|
|
||||||
struct dirent *entry;
|
|
||||||
enum backlight_type type = 0;
|
|
||||||
- char buffer[100];
|
|
||||||
+ char buffer[100], basename_buffer[100];
|
|
||||||
struct backlight *backlight = NULL;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
@@ -186,9 +187,10 @@ struct backlight *backlight_init(struct udev_device *drm_device,
|
|
||||||
free(path);
|
|
||||||
if (ret < 0)
|
|
||||||
return NULL;
|
|
||||||
-
|
|
||||||
+ strncpy(basename_buffer, buffer, ret);
|
|
||||||
buffer[ret] = '\0';
|
|
||||||
- pci_name = basename(buffer);
|
|
||||||
+ basename_buffer[ret] = '\0';
|
|
||||||
+ pci_name = basename(basename_buffer);
|
|
||||||
|
|
||||||
if (connector_type <= 0)
|
|
||||||
return NULL;
|
|
||||||
diff --git a/tools/zunitc/src/zunitc_impl.c b/tools/zunitc/src/zunitc_impl.c
|
|
||||||
index 18f03015..9b460fa0 100644
|
|
||||||
--- a/tools/zunitc/src/zunitc_impl.c
|
|
||||||
+++ b/tools/zunitc/src/zunitc_impl.c
|
|
||||||
@@ -27,6 +27,7 @@
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
+#include <libgen.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
--
|
|
||||||
2.43.0
|
|
||||||
|
|
||||||
@@ -1,334 +0,0 @@
|
|||||||
From 04062356483f6e15c259a969fd8ecffdc1a05535 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Miguel A. Vico" <mvicomoya@nvidia.com>
|
|
||||||
Date: Thu, 29 Mar 2018 00:15:49 -0700
|
|
||||||
Subject: [PATCH] gl-renderer: Add EGL client support for EGLStream frame
|
|
||||||
presentation
|
|
||||||
|
|
||||||
By attaching a GLTexture consumer to a stream, a producer (wayland EGL
|
|
||||||
client) could feed frames to a texture, which in turn can be used by a
|
|
||||||
compositor to prepare the final frame to be presented.
|
|
||||||
|
|
||||||
This change adds required logic to support presentation approach
|
|
||||||
described above.
|
|
||||||
|
|
||||||
Note that some unpublished EGL extensions were needed:
|
|
||||||
|
|
||||||
- EGL_NV_stream_attrib:
|
|
||||||
https://github.com/aritger/eglstreams-kms-example/blob/master/proposed-extensions/EGL_NV_stream_attrib.txt
|
|
||||||
|
|
||||||
- EGL_WL_wayland_eglstream:
|
|
||||||
https://github.com/aritger/eglstreams-kms-example/blob/master/proposed-extensions/EGL_WL_wayland_eglstream.txt
|
|
||||||
|
|
||||||
[ekurzinger: - Try realizing EGLStream before EGLImage buffer since
|
|
||||||
libnvidia-egl-wayland now reports EGL_TEXTURE_FORMAT]
|
|
||||||
|
|
||||||
Signed-off-by: Miguel A Vico Moya <mvicomoya@nvidia.com>
|
|
||||||
Signed-off-by: Erik Kurzinger <ekurzinger@nvidia.com>
|
|
||||||
Reviewed-by: Adam Cheney <acheney@nvidia.com>
|
|
||||||
Reviewed-by: James Jones <jajones@nvidia.com>
|
|
||||||
|
|
||||||
---
|
|
||||||
libweston/renderer-gl/egl-glue.c | 20 +++
|
|
||||||
libweston/renderer-gl/gl-renderer-internal.h | 15 ++
|
|
||||||
libweston/renderer-gl/gl-renderer.c | 157 +++++++++++++++++++
|
|
||||||
shared/weston-egl-ext.h | 21 +++
|
|
||||||
4 files changed, 213 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/libweston/renderer-gl/egl-glue.c b/libweston/renderer-gl/egl-glue.c
|
|
||||||
index 013172a..f6e1038 100644
|
|
||||||
--- a/libweston/renderer-gl/egl-glue.c
|
|
||||||
+++ b/libweston/renderer-gl/egl-glue.c
|
|
||||||
@@ -650,6 +650,17 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
|
|
||||||
(void *) eglGetProcAddress("eglQueryWaylandBufferWL");
|
|
||||||
gr->set_damage_region =
|
|
||||||
(void *) eglGetProcAddress("eglSetDamageRegionKHR");
|
|
||||||
+ gr->create_stream = (void *) eglGetProcAddress("eglCreateStreamKHR");
|
|
||||||
+ gr->destroy_stream = (void *) eglGetProcAddress("eglDestroyStreamKHR");
|
|
||||||
+ gr->query_stream = (void *) eglGetProcAddress("eglQueryStreamKHR");
|
|
||||||
+#ifdef EGL_NV_stream_attrib
|
|
||||||
+ gr->create_stream_attrib =
|
|
||||||
+ (void *) eglGetProcAddress("eglCreateStreamAttribNV");
|
|
||||||
+ gr->stream_consumer_acquire_attrib =
|
|
||||||
+ (void *) eglGetProcAddress("eglStreamConsumerAcquireAttribNV");
|
|
||||||
+#endif
|
|
||||||
+ gr->stream_consumer_gltexture =
|
|
||||||
+ (void *) eglGetProcAddress("eglStreamConsumerGLTextureExternalKHR");
|
|
||||||
|
|
||||||
extensions =
|
|
||||||
(const char *) eglQueryString(gr->egl_display, EGL_EXTENSIONS);
|
|
||||||
@@ -739,5 +750,14 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
|
|
||||||
"to missing EGL_KHR_wait_sync extension\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (weston_check_egl_extension(extensions, "EGL_NV_stream_attrib"))
|
|
||||||
+ gr->has_egl_stream_attrib = true;
|
|
||||||
+
|
|
||||||
+ if (weston_check_egl_extension(extensions, "EGL_KHR_stream_consumer_gltexture"))
|
|
||||||
+ gr->has_egl_stream_consumer_gltexture = true;
|
|
||||||
+
|
|
||||||
+ if (weston_check_egl_extension(extensions, "EGL_WL_wayland_eglstream"))
|
|
||||||
+ gr->has_egl_wayland_eglstream = true;
|
|
||||||
+
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
diff --git a/libweston/renderer-gl/gl-renderer-internal.h b/libweston/renderer-gl/gl-renderer-internal.h
|
|
||||||
index 72101b4..d6f5e74 100644
|
|
||||||
--- a/libweston/renderer-gl/gl-renderer-internal.h
|
|
||||||
+++ b/libweston/renderer-gl/gl-renderer-internal.h
|
|
||||||
@@ -155,6 +155,21 @@ struct gl_renderer {
|
|
||||||
struct wl_list dmabuf_formats;
|
|
||||||
|
|
||||||
bool has_texture_type_2_10_10_10_rev;
|
|
||||||
+
|
|
||||||
+ PFNEGLCREATESTREAMKHRPROC create_stream;
|
|
||||||
+ PFNEGLDESTROYSTREAMKHRPROC destroy_stream;
|
|
||||||
+ PFNEGLQUERYSTREAMKHRPROC query_stream;
|
|
||||||
+
|
|
||||||
+#ifdef EGL_NV_stream_attrib
|
|
||||||
+ PFNEGLCREATESTREAMATTRIBNVPROC create_stream_attrib;
|
|
||||||
+ PFNEGLSTREAMCONSUMERACQUIREATTRIBNVPROC stream_consumer_acquire_attrib;
|
|
||||||
+#endif
|
|
||||||
+ bool has_egl_stream_attrib;
|
|
||||||
+
|
|
||||||
+ PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC stream_consumer_gltexture;
|
|
||||||
+ bool has_egl_stream_consumer_gltexture;
|
|
||||||
+ bool has_egl_wayland_eglstream;
|
|
||||||
+
|
|
||||||
bool has_gl_texture_rg;
|
|
||||||
|
|
||||||
struct gl_shader *current_shader;
|
|
||||||
diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c
|
|
||||||
index a5f5eae..c775077 100644
|
|
||||||
--- a/libweston/renderer-gl/gl-renderer.c
|
|
||||||
+++ b/libweston/renderer-gl/gl-renderer.c
|
|
||||||
@@ -199,6 +199,9 @@ struct gl_surface_state {
|
|
||||||
int hsub[3]; /* horizontal subsampling per plane */
|
|
||||||
int vsub[3]; /* vertical subsampling per plane */
|
|
||||||
|
|
||||||
+ EGLStreamKHR egl_stream;
|
|
||||||
+ bool new_stream;
|
|
||||||
+
|
|
||||||
struct weston_surface *surface;
|
|
||||||
|
|
||||||
/* Whether this surface was used in the current output repaint.
|
|
||||||
@@ -2923,6 +2926,145 @@ out:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
+/*
|
|
||||||
+ * gl_renderer_attach_stream_texture
|
|
||||||
+ *
|
|
||||||
+ * Try to bind given <buffer> to an EGLStream. If the given buffer was already
|
|
||||||
+ * bound, it will acquire next frame on the stream.
|
|
||||||
+ *
|
|
||||||
+ * Return true if the given <buffer> corresponds to an EGLStream; otherwise,
|
|
||||||
+ * return false (if might be another kind of buffer).
|
|
||||||
+ */
|
|
||||||
+static bool
|
|
||||||
+gl_renderer_attach_stream_texture(struct weston_surface *es,
|
|
||||||
+ struct weston_buffer *buffer)
|
|
||||||
+{
|
|
||||||
+#ifdef EGL_NV_stream_attrib
|
|
||||||
+ struct weston_compositor *ec = es->compositor;
|
|
||||||
+ struct gl_renderer *gr = get_renderer(ec);
|
|
||||||
+ struct gl_surface_state *gs = get_surface_state(es);
|
|
||||||
+ EGLStreamKHR stream = EGL_NO_STREAM_KHR;
|
|
||||||
+ EGLAttrib stream_attribs[] = {
|
|
||||||
+#ifdef EGL_WL_wayland_eglstream
|
|
||||||
+ EGL_WAYLAND_EGLSTREAM_WL, (EGLAttrib)buffer->resource,
|
|
||||||
+#endif
|
|
||||||
+ EGL_NONE
|
|
||||||
+ };
|
|
||||||
+ EGLint stream_state = EGL_STREAM_STATE_EMPTY_KHR;
|
|
||||||
+
|
|
||||||
+ /* Check for required extensions. If they arent supported, there's no
|
|
||||||
+ * way the given buffer corresponds to an EGLStream */
|
|
||||||
+ if (!gr->has_egl_stream_attrib ||
|
|
||||||
+ !gr->has_egl_stream_consumer_gltexture ||
|
|
||||||
+ !gr->has_egl_wayland_eglstream)
|
|
||||||
+ return false;
|
|
||||||
+
|
|
||||||
+ stream = gr->create_stream_attrib(gr->egl_display, stream_attribs);
|
|
||||||
+ if (stream == EGL_NO_STREAM_KHR) {
|
|
||||||
+ EGLint err = eglGetError();
|
|
||||||
+
|
|
||||||
+ switch (err) {
|
|
||||||
+ case EGL_BAD_ACCESS:
|
|
||||||
+ /* EGL_BAD_ACCESS is generated whenever buffer->resource
|
|
||||||
+ * does not corresponds to a stream */
|
|
||||||
+ return false;
|
|
||||||
+
|
|
||||||
+ case EGL_BAD_STREAM_KHR:
|
|
||||||
+ /* EGL_BAD_STREAM_KHR is generated whenever
|
|
||||||
+ * buffer->resource corresponds to a previously created
|
|
||||||
+ * stream so we must have a valid stream handle already
|
|
||||||
+ * we can use to acquire next frame */
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ default:
|
|
||||||
+ /* An unknown error was generated */
|
|
||||||
+ assert(0);
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
+ } else {
|
|
||||||
+ /* Clean up current stream resources if needed */
|
|
||||||
+ if (gs->egl_stream != EGL_NO_STREAM_KHR)
|
|
||||||
+ gr->destroy_stream(gr->egl_display, gs->egl_stream);
|
|
||||||
+
|
|
||||||
+ gs->egl_stream = stream;
|
|
||||||
+ gs->shader_variant = SHADER_VARIANT_EXTERNAL;
|
|
||||||
+ target = gl_shader_texture_variant_get_target(gs->shader_variant);
|
|
||||||
+
|
|
||||||
+ glActiveTexture(GL_TEXTURE0);
|
|
||||||
+ ensure_textures(gs, target, 1);
|
|
||||||
+ glBindTexture(target, gs->textures[0]);
|
|
||||||
+
|
|
||||||
+ gs->new_stream = (gr->stream_consumer_gltexture(
|
|
||||||
+ gr->egl_display,
|
|
||||||
+ gs->egl_stream) == EGL_TRUE);
|
|
||||||
+
|
|
||||||
+ if (!gs->new_stream) {
|
|
||||||
+ weston_log("failed to set stream consumer\n");
|
|
||||||
+ gl_renderer_print_egl_error_state();
|
|
||||||
+ gr->destroy_stream(gr->egl_display, gs->egl_stream);
|
|
||||||
+ gs->egl_stream = EGL_NO_STREAM_KHR;
|
|
||||||
+ return true; /* buffer->resource is EGLStream */
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* At this point we should have a valid stream handle */
|
|
||||||
+ assert(gs->egl_stream != EGL_NO_STREAM_KHR);
|
|
||||||
+
|
|
||||||
+ /* Check whether there are new frames available */
|
|
||||||
+ if (gr->query_stream(gr->egl_display,
|
|
||||||
+ gs->egl_stream,
|
|
||||||
+ EGL_STREAM_STATE_KHR,
|
|
||||||
+ &stream_state) != EGL_TRUE) {
|
|
||||||
+ weston_log("failed to query stream state\n");
|
|
||||||
+ gl_renderer_print_egl_error_state();
|
|
||||||
+ return true; /* buffer->resource is EGLStream */
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* If no new frame available, re-use last one */
|
|
||||||
+ if (stream_state != EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR) {
|
|
||||||
+ /* Fake size of last frame */
|
|
||||||
+ buffer->width = gs->pitch;
|
|
||||||
+ buffer->height = gs->height;
|
|
||||||
+ return true; /* buffer->resource is EGLStream */
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (gr->stream_consumer_acquire_attrib(gr->egl_display,
|
|
||||||
+ gs->egl_stream,
|
|
||||||
+ NULL) != EGL_TRUE) {
|
|
||||||
+ weston_log("failed to acquire buffer\n");
|
|
||||||
+ gl_renderer_print_egl_error_state();
|
|
||||||
+ return true; /* buffer->resource is EGLStream */
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Swap textures if new stream was created */
|
|
||||||
+ if (gs->new_stream) {
|
|
||||||
+ GLuint tmp = gs->textures[0];
|
|
||||||
+
|
|
||||||
+ gs->textures[0] = gs->textures[1];
|
|
||||||
+ gs->textures[1] = tmp;
|
|
||||||
+ gs->new_stream = false;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Update buffer and surface data */
|
|
||||||
+ buffer->legacy_buffer = (void *)buffer->resource;
|
|
||||||
+ gr->query_buffer(gr->egl_display, buffer->legacy_buffer,
|
|
||||||
+ EGL_WIDTH, &buffer->width);
|
|
||||||
+ gr->query_buffer(gr->egl_display, buffer->legacy_buffer,
|
|
||||||
+ EGL_HEIGHT, &buffer->height);
|
|
||||||
+ gr->query_buffer(gr->egl_display, buffer->legacy_buffer,
|
|
||||||
+ EGL_WAYLAND_Y_INVERTED_WL, &buffer->y_inverted);
|
|
||||||
+
|
|
||||||
+ gs->pitch = buffer->width;
|
|
||||||
+ gs->height = buffer->height;
|
|
||||||
+ gs->buffer_type = BUFFER_TYPE_EGL;
|
|
||||||
+ gs->y_inverted = buffer->y_inverted;
|
|
||||||
+
|
|
||||||
+ return true; /* buffer->resource is EGLStream */
|
|
||||||
+#else
|
|
||||||
+ return false;
|
|
||||||
+#endif
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static void
|
|
||||||
gl_renderer_attach(struct weston_surface *es, struct weston_buffer *buffer)
|
|
||||||
{
|
|
||||||
@@ -2950,6 +3092,12 @@ gl_renderer_attach(struct weston_surface *es, struct weston_buffer *buffer)
|
|
||||||
gs->y_inverted = true;
|
|
||||||
gs->direct_display = false;
|
|
||||||
es->is_opaque = false;
|
|
||||||
+
|
|
||||||
+ if (gs->egl_stream != EGL_NO_STREAM_KHR) {
|
|
||||||
+ gr->destroy_stream(gr->egl_display, gs->egl_stream);
|
|
||||||
+ gs->egl_stream = EGL_NO_STREAM_KHR;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -2957,6 +3105,9 @@ gl_renderer_attach(struct weston_surface *es, struct weston_buffer *buffer)
|
|
||||||
|
|
||||||
if (shm_buffer)
|
|
||||||
gl_renderer_attach_shm(es, buffer, shm_buffer);
|
|
||||||
+ else if (gl_renderer_attach_stream_texture(es, buffer))
|
|
||||||
+ /* The stream texture is attached. Nothing else to be done here */
|
|
||||||
+ ((void)0);
|
|
||||||
else if (gr->has_bind_display &&
|
|
||||||
gr->query_buffer(gr->egl_display, (void *)buffer->resource,
|
|
||||||
EGL_TEXTURE_FORMAT, &format))
|
|
||||||
@@ -3157,6 +3308,10 @@ surface_state_destroy(struct gl_surface_state *gs, struct gl_renderer *gr)
|
|
||||||
weston_buffer_reference(&gs->buffer_ref, NULL);
|
|
||||||
weston_buffer_release_reference(&gs->buffer_release_ref, NULL);
|
|
||||||
pixman_region32_fini(&gs->texture_damage);
|
|
||||||
+
|
|
||||||
+ if (gs->egl_stream != EGL_NO_STREAM_KHR)
|
|
||||||
+ gr->destroy_stream(gr->egl_display, gs->egl_stream);
|
|
||||||
+
|
|
||||||
free(gs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -3208,6 +3363,8 @@ gl_renderer_create_surface(struct weston_surface *surface)
|
|
||||||
|
|
||||||
gs->surface = surface;
|
|
||||||
|
|
||||||
+ gs->egl_stream = EGL_NO_STREAM_KHR;
|
|
||||||
+
|
|
||||||
pixman_region32_init(&gs->texture_damage);
|
|
||||||
surface->renderer_state = gs;
|
|
||||||
|
|
||||||
diff --git a/shared/weston-egl-ext.h b/shared/weston-egl-ext.h
|
|
||||||
index 822810f..94a8b14 100644
|
|
||||||
--- a/shared/weston-egl-ext.h
|
|
||||||
+++ b/shared/weston-egl-ext.h
|
|
||||||
@@ -240,6 +240,27 @@ typedef EGLint (EGLAPIENTRYP PFNEGLDUPNATIVEFENCEFDANDROIDPROC) (EGLDisplay dpy,
|
|
||||||
#define EGL_NO_NATIVE_FENCE_FD_ANDROID -1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+#ifndef EGL_NV_stream_attrib
|
|
||||||
+#define EGL_NV_stream_attrib 1
|
|
||||||
+#ifdef EGL_EGLEXT_PROTOTYPES
|
|
||||||
+EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamAttribNV(EGLDisplay dpy, const EGLAttrib *attrib_list);
|
|
||||||
+EGLAPI EGLBoolean EGLAPIENTRY eglSetStreamAttribNV(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib value);
|
|
||||||
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamAttribNV(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib *value);
|
|
||||||
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireAttribNV(EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list);
|
|
||||||
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseAttribNV(EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list);
|
|
||||||
+#endif
|
|
||||||
+typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMATTRIBNVPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list);
|
|
||||||
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETSTREAMATTRIBNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib value);
|
|
||||||
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMATTRIBNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib *value);
|
|
||||||
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERACQUIREATTRIBNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list);
|
|
||||||
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERRELEASEATTRIBNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list);
|
|
||||||
+#endif /* EGL_NV_stream_attrib */
|
|
||||||
+
|
|
||||||
+#ifndef EGL_WL_wayland_eglstream
|
|
||||||
+#define EGL_WL_wayland_eglstream 1
|
|
||||||
+#define EGL_WAYLAND_EGLSTREAM_WL 0x334B
|
|
||||||
+#endif /* EGL_WL_wayland_eglstream */
|
|
||||||
+
|
|
||||||
#else /* ENABLE_EGL */
|
|
||||||
|
|
||||||
/* EGL platform definition are kept to allow compositor-xx.c to build */
|
|
||||||
@@ -1,402 +0,0 @@
|
|||||||
From 82ae29c900f5715a4f0b0b028d709735f6aa1839 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Miguel A. Vico" <mvicomoya@nvidia.com>
|
|
||||||
Date: Thu, 18 May 2017 14:35:36 -0700
|
|
||||||
Subject: [PATCH] compositor: Process stream attach requests with
|
|
||||||
wl_eglstream_controller
|
|
||||||
|
|
||||||
So far, the EGLStream implementation of the Wayland client-side driver
|
|
||||||
has been using wl_surface_attach + commit in order to make the server
|
|
||||||
create its stream endpoint and attach a consumer to it.
|
|
||||||
|
|
||||||
However, no actual buffer would be actually shared between client and
|
|
||||||
server, which goes against many of the assumptions behind
|
|
||||||
wl_surface_attach + commit.
|
|
||||||
|
|
||||||
This has caused different interaction issues in the past.
|
|
||||||
|
|
||||||
In order to properly resolve this once and for all, a new
|
|
||||||
wl_eglstream_controller protocol has been added which will let clients
|
|
||||||
request the compositor to create its stream.
|
|
||||||
|
|
||||||
This change adds the required code for weston to create a
|
|
||||||
wl_eglstream_controller global and process attach_eglstream_consumer
|
|
||||||
requests.
|
|
||||||
|
|
||||||
[mvicomoya: - Dynamically load libnvidia-egl-wayland.so.1 instead linking
|
|
||||||
against it
|
|
||||||
- Add wayland-eglstream-protocols package dependency and
|
|
||||||
generate server header for wayland-eglstream-controller at
|
|
||||||
build time]
|
|
||||||
|
|
||||||
Signed-off-by: Ashutosh Agarwal <asagarwal@nvidia.com>
|
|
||||||
Signed-off-by: Miguel A Vico Moya <mvicomoya@nvidia.com>
|
|
||||||
|
|
||||||
---
|
|
||||||
compositor/meson.build | 1 +
|
|
||||||
include/libweston/libweston.h | 13 +++
|
|
||||||
libweston/compositor.c | 79 ++++++++++++++-
|
|
||||||
libweston/renderer-gl/gl-renderer.c | 145 ++++++++++++++++++----------
|
|
||||||
protocol/meson.build | 7 ++
|
|
||||||
5 files changed, 191 insertions(+), 54 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/compositor/meson.build b/compositor/meson.build
|
|
||||||
index 8a54ea9..e1878be 100644
|
|
||||||
--- a/compositor/meson.build
|
|
||||||
+++ b/compositor/meson.build
|
|
||||||
@@ -9,6 +9,7 @@ srcs_weston = [
|
|
||||||
input_method_unstable_v1_protocol_c,
|
|
||||||
weston_screenshooter_server_protocol_h,
|
|
||||||
weston_screenshooter_protocol_c,
|
|
||||||
+ wayland_eglstream_controller_server_protocol_h,
|
|
||||||
]
|
|
||||||
deps_weston = [
|
|
||||||
dep_libshared,
|
|
||||||
diff --git a/include/libweston/libweston.h b/include/libweston/libweston.h
|
|
||||||
index d99dc76..8d87dc4 100644
|
|
||||||
--- a/include/libweston/libweston.h
|
|
||||||
+++ b/include/libweston/libweston.h
|
|
||||||
@@ -968,6 +968,19 @@ struct weston_renderer {
|
|
||||||
|
|
||||||
const struct weston_drm_format_array *
|
|
||||||
(*get_supported_formats)(struct weston_compositor *ec);
|
|
||||||
+
|
|
||||||
+ /** On error sets num_formats to zero */
|
|
||||||
+ void (*query_dmabuf_formats)(struct weston_compositor *ec,
|
|
||||||
+ int **formats, int *num_formats);
|
|
||||||
+
|
|
||||||
+ /** On error sets num_modifiers to zero */
|
|
||||||
+ void (*query_dmabuf_modifiers)(struct weston_compositor *ec,
|
|
||||||
+ int format, uint64_t **modifiers,
|
|
||||||
+ int *num_modifiers);
|
|
||||||
+
|
|
||||||
+ /** Create weston endpoint of an EGLStream & attach a consumer to it */
|
|
||||||
+ bool (*attach_eglstream_consumer)(struct weston_surface *es,
|
|
||||||
+ struct wl_resource *wl_eglstream);
|
|
||||||
};
|
|
||||||
|
|
||||||
enum weston_capability {
|
|
||||||
diff --git a/libweston/compositor.c b/libweston/compositor.c
|
|
||||||
index 1670c50..c5d9828 100644
|
|
||||||
--- a/libweston/compositor.c
|
|
||||||
+++ b/libweston/compositor.c
|
|
||||||
@@ -76,6 +76,7 @@
|
|
||||||
#include "backend.h"
|
|
||||||
#include "libweston-internal.h"
|
|
||||||
#include "color.h"
|
|
||||||
+#include "wayland-eglstream-controller-server-protocol.h"
|
|
||||||
|
|
||||||
#include "weston-log-internal.h"
|
|
||||||
|
|
||||||
@@ -7422,6 +7423,80 @@ bind_presentation(struct wl_client *client,
|
|
||||||
wp_presentation_send_clock_id(resource, compositor->presentation_clock);
|
|
||||||
}
|
|
||||||
|
|
||||||
+static struct wl_interface *eglstream_controller_interface = NULL;
|
|
||||||
+
|
|
||||||
+static void
|
|
||||||
+attach_eglstream_consumer(struct wl_client *client,
|
|
||||||
+ struct wl_resource *resource,
|
|
||||||
+ struct wl_resource *wl_surface,
|
|
||||||
+ struct wl_resource *wl_eglstream)
|
|
||||||
+{
|
|
||||||
+ struct weston_surface *surface =
|
|
||||||
+ wl_resource_get_user_data(wl_surface);
|
|
||||||
+
|
|
||||||
+ surface->compositor->renderer->attach_eglstream_consumer(surface,
|
|
||||||
+ wl_eglstream);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct wl_eglstream_controller_interface
|
|
||||||
+eglstream_controller_implementation = {
|
|
||||||
+ attach_eglstream_consumer
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static void
|
|
||||||
+bind_eglstream_controller(struct wl_client *client,
|
|
||||||
+ void *data, uint32_t version, uint32_t id)
|
|
||||||
+{
|
|
||||||
+ struct wl_resource *resource;
|
|
||||||
+
|
|
||||||
+ resource = wl_resource_create(client, eglstream_controller_interface,
|
|
||||||
+ version, id);
|
|
||||||
+
|
|
||||||
+ if (resource == NULL) {
|
|
||||||
+ wl_client_post_no_memory(client);
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ wl_resource_set_implementation(resource,
|
|
||||||
+ &eglstream_controller_implementation,
|
|
||||||
+ data,
|
|
||||||
+ NULL);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void
|
|
||||||
+init_eglstream_controller(struct wl_display *display)
|
|
||||||
+{
|
|
||||||
+ /*
|
|
||||||
+ * wl_eglstream_controller_interface is provided by
|
|
||||||
+ * libnvidia-egl-wayland.so.1
|
|
||||||
+ *
|
|
||||||
+ * Since it might not be available on the
|
|
||||||
+ * system, dynamically load it at runtime and resolve the needed
|
|
||||||
+ * symbols. If available, it should be found under any of the search
|
|
||||||
+ * directories of dlopen()
|
|
||||||
+ *
|
|
||||||
+ * Failure to initialize wl_eglstream_controller is non-fatal
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+ void *lib = dlopen("libnvidia-egl-wayland.so.1", RTLD_NOW | RTLD_LAZY);
|
|
||||||
+ if (!lib)
|
|
||||||
+ goto fail;
|
|
||||||
+
|
|
||||||
+ eglstream_controller_interface =
|
|
||||||
+ dlsym(lib, "wl_eglstream_controller_interface");
|
|
||||||
+
|
|
||||||
+ if (!eglstream_controller_interface)
|
|
||||||
+ goto fail;
|
|
||||||
+
|
|
||||||
+ if (wl_global_create(display,
|
|
||||||
+ eglstream_controller_interface, 1,
|
|
||||||
+ NULL, bind_eglstream_controller))
|
|
||||||
+ return; /* success */
|
|
||||||
+fail:
|
|
||||||
+ if (lib)
|
|
||||||
+ dlclose(lib);
|
|
||||||
+ weston_log("warning: Unable to initialize wl_eglstream_controller.\n");
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static void
|
|
||||||
compositor_bind(struct wl_client *client,
|
|
||||||
void *data, uint32_t version, uint32_t id)
|
|
||||||
@@ -7799,7 +7874,9 @@ weston_compositor_create(struct wl_display *display,
|
|
||||||
ec, bind_presentation))
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
- if (weston_input_init(ec) != 0)
|
|
||||||
+ init_eglstream_controller(ec->wl_display);
|
|
||||||
+
|
|
||||||
+ if (weston_input_init(ec) != 0)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
wl_list_init(&ec->view_list);
|
|
||||||
diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c
|
|
||||||
index c775077..67c8a57 100644
|
|
||||||
--- a/libweston/renderer-gl/gl-renderer.c
|
|
||||||
+++ b/libweston/renderer-gl/gl-renderer.c
|
|
||||||
@@ -2926,85 +2926,122 @@ out:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
-/*
|
|
||||||
- * gl_renderer_attach_stream_texture
|
|
||||||
- *
|
|
||||||
- * Try to bind given <buffer> to an EGLStream. If the given buffer was already
|
|
||||||
- * bound, it will acquire next frame on the stream.
|
|
||||||
- *
|
|
||||||
- * Return true if the given <buffer> corresponds to an EGLStream; otherwise,
|
|
||||||
- * return false (if might be another kind of buffer).
|
|
||||||
- */
|
|
||||||
-static bool
|
|
||||||
-gl_renderer_attach_stream_texture(struct weston_surface *es,
|
|
||||||
- struct weston_buffer *buffer)
|
|
||||||
+static EGLint
|
|
||||||
+gl_renderer_attach_eglstream_consumer_common(struct weston_surface *es,
|
|
||||||
+ struct wl_resource *wl_eglstream)
|
|
||||||
{
|
|
||||||
#ifdef EGL_NV_stream_attrib
|
|
||||||
struct weston_compositor *ec = es->compositor;
|
|
||||||
struct gl_renderer *gr = get_renderer(ec);
|
|
||||||
struct gl_surface_state *gs = get_surface_state(es);
|
|
||||||
EGLStreamKHR stream = EGL_NO_STREAM_KHR;
|
|
||||||
+ GLenum target;
|
|
||||||
EGLAttrib stream_attribs[] = {
|
|
||||||
#ifdef EGL_WL_wayland_eglstream
|
|
||||||
- EGL_WAYLAND_EGLSTREAM_WL, (EGLAttrib)buffer->resource,
|
|
||||||
+ EGL_WAYLAND_EGLSTREAM_WL, (EGLAttrib)wl_eglstream,
|
|
||||||
#endif
|
|
||||||
EGL_NONE
|
|
||||||
};
|
|
||||||
- EGLint stream_state = EGL_STREAM_STATE_EMPTY_KHR;
|
|
||||||
|
|
||||||
/* Check for required extensions. If they arent supported, there's no
|
|
||||||
- * way the given buffer corresponds to an EGLStream */
|
|
||||||
+ * way the given resource corresponds to an EGLStream */
|
|
||||||
if (!gr->has_egl_stream_attrib ||
|
|
||||||
!gr->has_egl_stream_consumer_gltexture ||
|
|
||||||
!gr->has_egl_wayland_eglstream)
|
|
||||||
- return false;
|
|
||||||
+ return EGL_BAD_ACCESS;
|
|
||||||
|
|
||||||
stream = gr->create_stream_attrib(gr->egl_display, stream_attribs);
|
|
||||||
- if (stream == EGL_NO_STREAM_KHR) {
|
|
||||||
+
|
|
||||||
+ if (stream == EGL_NO_STREAM_KHR)
|
|
||||||
+ return eglGetError();
|
|
||||||
+
|
|
||||||
+ if (gs->egl_stream != EGL_NO_STREAM_KHR)
|
|
||||||
+ gr->destroy_stream(gr->egl_display, gs->egl_stream);
|
|
||||||
+
|
|
||||||
+ gs->egl_stream = stream;
|
|
||||||
+ gs->shader_variant = SHADER_VARIANT_EXTERNAL;
|
|
||||||
+ target = gl_shader_texture_variant_get_target(gs->shader_variant);
|
|
||||||
+
|
|
||||||
+ glActiveTexture(GL_TEXTURE0);
|
|
||||||
+ ensure_textures(gs, target, 1);
|
|
||||||
+ glBindTexture(target, gs->textures[0]);
|
|
||||||
+
|
|
||||||
+ gs->new_stream = (gr->stream_consumer_gltexture(
|
|
||||||
+ gr->egl_display,
|
|
||||||
+ gs->egl_stream) == EGL_TRUE);
|
|
||||||
+
|
|
||||||
+ if (!gs->new_stream) {
|
|
||||||
EGLint err = eglGetError();
|
|
||||||
|
|
||||||
- switch (err) {
|
|
||||||
- case EGL_BAD_ACCESS:
|
|
||||||
- /* EGL_BAD_ACCESS is generated whenever buffer->resource
|
|
||||||
- * does not corresponds to a stream */
|
|
||||||
- return false;
|
|
||||||
+ weston_log("failed to set stream consumer\n");
|
|
||||||
+ weston_log("EGL error: 0x%04lx\n", (long)err);
|
|
||||||
|
|
||||||
- case EGL_BAD_STREAM_KHR:
|
|
||||||
- /* EGL_BAD_STREAM_KHR is generated whenever
|
|
||||||
- * buffer->resource corresponds to a previously created
|
|
||||||
- * stream so we must have a valid stream handle already
|
|
||||||
- * we can use to acquire next frame */
|
|
||||||
- break;
|
|
||||||
+ gr->destroy_stream(gr->egl_display, gs->egl_stream);
|
|
||||||
+ gs->egl_stream = EGL_NO_STREAM_KHR;
|
|
||||||
+ return err;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
- default:
|
|
||||||
- /* An unknown error was generated */
|
|
||||||
- assert(0);
|
|
||||||
- return false;
|
|
||||||
- }
|
|
||||||
- } else {
|
|
||||||
- /* Clean up current stream resources if needed */
|
|
||||||
- if (gs->egl_stream != EGL_NO_STREAM_KHR)
|
|
||||||
- gr->destroy_stream(gr->egl_display, gs->egl_stream);
|
|
||||||
+ return EGL_SUCCESS;
|
|
||||||
+#else
|
|
||||||
+ return EGL_BAD_ACCESS;
|
|
||||||
+#endif
|
|
||||||
+}
|
|
||||||
|
|
||||||
- gs->egl_stream = stream;
|
|
||||||
- gs->shader_variant = SHADER_VARIANT_EXTERNAL;
|
|
||||||
- target = gl_shader_texture_variant_get_target(gs->shader_variant);
|
|
||||||
+static bool
|
|
||||||
+gl_renderer_attach_eglstream_consumer(struct weston_surface *es,
|
|
||||||
+ struct wl_resource *stream)
|
|
||||||
+{
|
|
||||||
+ EGLint err = gl_renderer_attach_eglstream_consumer_common(es, stream);
|
|
||||||
+ return (err == EGL_SUCCESS);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * gl_renderer_attach_stream_texture
|
|
||||||
+ *
|
|
||||||
+ * Try to bind given <buffer> to an EGLStream. If the given buffer was already
|
|
||||||
+ * bound, it will acquire next frame on the stream.
|
|
||||||
+ *
|
|
||||||
+ * Return true if the given <buffer> corresponds to an EGLStream; otherwise,
|
|
||||||
+ * return false (if might be another kind of buffer).
|
|
||||||
+ */
|
|
||||||
+static bool
|
|
||||||
+gl_renderer_attach_stream_texture(struct weston_surface *es,
|
|
||||||
+ struct weston_buffer *buffer)
|
|
||||||
+{
|
|
||||||
+#ifdef EGL_NV_stream_attrib
|
|
||||||
+ struct weston_compositor *ec = es->compositor;
|
|
||||||
+ struct gl_renderer *gr = get_renderer(ec);
|
|
||||||
+ struct gl_surface_state *gs = get_surface_state(es);
|
|
||||||
+ EGLint stream_state = EGL_STREAM_STATE_EMPTY_KHR;
|
|
||||||
|
|
||||||
- glActiveTexture(GL_TEXTURE0);
|
|
||||||
- ensure_textures(gs, target, 1);
|
|
||||||
- glBindTexture(target, gs->textures[0]);
|
|
||||||
+ EGLint err;
|
|
||||||
|
|
||||||
- gs->new_stream = (gr->stream_consumer_gltexture(
|
|
||||||
- gr->egl_display,
|
|
||||||
- gs->egl_stream) == EGL_TRUE);
|
|
||||||
+ err = gl_renderer_attach_eglstream_consumer_common(es, buffer->resource);
|
|
||||||
|
|
||||||
- if (!gs->new_stream) {
|
|
||||||
- weston_log("failed to set stream consumer\n");
|
|
||||||
- gl_renderer_print_egl_error_state();
|
|
||||||
- gr->destroy_stream(gr->egl_display, gs->egl_stream);
|
|
||||||
- gs->egl_stream = EGL_NO_STREAM_KHR;
|
|
||||||
- return true; /* buffer->resource is EGLStream */
|
|
||||||
- }
|
|
||||||
+ switch (err) {
|
|
||||||
+ case EGL_BAD_ACCESS:
|
|
||||||
+ /* EGL_BAD_ACCESS is generated whenever buffer->resource
|
|
||||||
+ * does not corresponds to a stream */
|
|
||||||
+ return false;
|
|
||||||
+
|
|
||||||
+ case EGL_BAD_STREAM_KHR:
|
|
||||||
+ /* EGL_BAD_STREAM_KHR is generated whenever
|
|
||||||
+ * buffer->resource corresponds to a previously created
|
|
||||||
+ * stream so we must have a valid stream handle already
|
|
||||||
+ * we can use to acquire next frame */
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ case EGL_SUCCESS:
|
|
||||||
+ /* EGL_SUCCESS is returned when the server stream endpoint is
|
|
||||||
+ * created and a consumer is attached successfully. This path is
|
|
||||||
+ * hit with old drivers which use wl_surface::attach + commit to
|
|
||||||
+ * request stream creation. */
|
|
||||||
+ return true; /* buffer->resource is EGLStream */
|
|
||||||
+
|
|
||||||
+ default:
|
|
||||||
+ /* An unknown error was generated */
|
|
||||||
+ assert(0);
|
|
||||||
+ return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* At this point we should have a valid stream handle */
|
|
||||||
@@ -3832,6 +3869,8 @@ gl_renderer_display_create(struct weston_compositor *ec,
|
|
||||||
gr->base.surface_get_content_size =
|
|
||||||
gl_renderer_surface_get_content_size;
|
|
||||||
gr->base.surface_copy_content = gl_renderer_surface_copy_content;
|
|
||||||
+ gr->base.attach_eglstream_consumer =
|
|
||||||
+ gl_renderer_attach_eglstream_consumer;
|
|
||||||
|
|
||||||
if (gl_renderer_setup_egl_display(gr, options->egl_native_display) < 0)
|
|
||||||
goto fail;
|
|
||||||
diff --git a/protocol/meson.build b/protocol/meson.build
|
|
||||||
index 7d869da..60a0391 100644
|
|
||||||
--- a/protocol/meson.build
|
|
||||||
+++ b/protocol/meson.build
|
|
||||||
@@ -4,6 +4,9 @@ prog_scanner = find_program(dep_scanner.get_pkgconfig_variable('wayland_scanner'
|
|
||||||
dep_wp = dependency('wayland-protocols', version: '>= 1.24')
|
|
||||||
dir_wp_base = dep_wp.get_pkgconfig_variable('pkgdatadir')
|
|
||||||
|
|
||||||
+dep_wep = dependency('wayland-eglstream-protocols')
|
|
||||||
+dir_wep_base = dep_wep.get_pkgconfig_variable('pkgdatadir')
|
|
||||||
+
|
|
||||||
install_data(
|
|
||||||
[
|
|
||||||
'weston-debug.xml',
|
|
||||||
@@ -37,6 +40,7 @@ generated_protocols = [
|
|
||||||
[ 'xdg-output', 'v1' ],
|
|
||||||
[ 'xdg-shell', 'v6' ],
|
|
||||||
[ 'xdg-shell', 'stable' ],
|
|
||||||
+ [ 'wayland-eglstream-controller', '3rdparty', dir_wep_base ],
|
|
||||||
]
|
|
||||||
|
|
||||||
foreach proto: generated_protocols
|
|
||||||
@@ -44,6 +48,9 @@ foreach proto: generated_protocols
|
|
||||||
if proto[1] == 'internal'
|
|
||||||
base_file = proto_name
|
|
||||||
xml_path = '@0@.xml'.format(proto_name)
|
|
||||||
+ elif proto[1] == '3rdparty'
|
|
||||||
+ base_file = proto_name
|
|
||||||
+ xml_path = '@0@/@1@.xml'.format(proto[2], base_file)
|
|
||||||
elif proto[1] == 'stable'
|
|
||||||
base_file = proto_name
|
|
||||||
xml_path = '@0@/stable/@1@/@1@.xml'.format(dir_wp_base, base_file)
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: Huawei Inc.
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
|
|
||||||
if [[ -x "/usr/lib/weston/systemd-notify.so" ]]; then
|
|
||||||
add_weston_module "systemd-notify.so"
|
|
||||||
fi
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Encoding=UTF-8
|
|
||||||
Type=Application
|
|
||||||
Name=Weston
|
|
||||||
Comment=Wayland Compostitor
|
|
||||||
Exec=weston
|
|
||||||
Icon=weston
|
|
||||||
Terminal=false
|
|
||||||
Categories=Utility;
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.3 KiB |
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
if type Xwayland >/dev/null 2>/dev/null; then
|
|
||||||
mkdir -m 775 -p /tmp/.X11-unix
|
|
||||||
chown root:video /tmp/.X11-unix
|
|
||||||
fi
|
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
SUMMARY = "Weston, a Wayland compositor"
|
|
||||||
DESCRIPTION = "Weston is the reference implementation of a Wayland compositor"
|
|
||||||
HOMEPAGE = "http://wayland.freedesktop.org"
|
|
||||||
LICENSE = "MIT"
|
|
||||||
LIC_FILES_CHKSUM = "file://COPYING;md5=d79ee9e66bb0f95d3386a7acae780b70 \
|
|
||||||
file://libweston/compositor.c;endline=27;md5=eb6d5297798cabe2ddc65e2af519bcf0 \
|
|
||||||
"
|
|
||||||
|
|
||||||
SRC_URI = "https://gitlab.freedesktop.org/wayland/weston/-/releases/${PV}/downloads/${BPN}-${PV}.tar.xz \
|
|
||||||
file://0001-libweston-tools-Include-libgen.h-for-basename-signat.patch \
|
|
||||||
file://weston.png \
|
|
||||||
file://weston.desktop \
|
|
||||||
file://xwayland.weston-start \
|
|
||||||
file://systemd-notify.weston-start \
|
|
||||||
"
|
|
||||||
|
|
||||||
SRC_URI[sha256sum] = "89646ca0d9f8d413c2767e5c3828eaa3fa149c2a105b3729a6894fa7cf1549e7"
|
|
||||||
|
|
||||||
UPSTREAM_CHECK_URI = "https://wayland.freedesktop.org/releases.html"
|
|
||||||
UPSTREAM_CHECK_REGEX = "weston-(?P<pver>\d+\.\d+\.(?!9\d+)\d+)"
|
|
||||||
|
|
||||||
DEFAULT_PREFERENCE = "-1"
|
|
||||||
|
|
||||||
inherit meson pkgconfig useradd features_check
|
|
||||||
|
|
||||||
REQUIRED_DISTRO_FEATURES = "wayland opengl ${@oe.utils.conditional('VIRTUAL-RUNTIME_init_manager', 'systemd', 'pam', '', d)}"
|
|
||||||
|
|
||||||
DEPENDS = "libxkbcommon gdk-pixbuf pixman cairo glib-2.0"
|
|
||||||
DEPENDS += "wayland wayland-protocols libinput virtual/egl pango wayland-native"
|
|
||||||
|
|
||||||
LDFLAGS += "${@bb.utils.contains('DISTRO_FEATURES', 'lto', '-Wl,-z,undefs', '', d)}"
|
|
||||||
|
|
||||||
WESTON_MAJOR_VERSION = "${@'.'.join(d.getVar('PV').split('.')[0:1])}"
|
|
||||||
|
|
||||||
EXTRA_OEMESON += "-Dpipewire=false"
|
|
||||||
|
|
||||||
PACKAGECONFIG ??= "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'kms wayland egl clients', '', d)} \
|
|
||||||
${@bb.utils.contains('DISTRO_FEATURES', 'x11 wayland', 'xwayland', '', d)} \
|
|
||||||
${@bb.utils.filter('DISTRO_FEATURES', 'systemd x11', d)} \
|
|
||||||
${@bb.utils.contains_any('DISTRO_FEATURES', 'wayland x11', '', 'headless', d)} \
|
|
||||||
${@oe.utils.conditional('VIRTUAL-RUNTIME_init_manager', 'sysvinit', 'launcher-libseat', '', d)} \
|
|
||||||
image-jpeg \
|
|
||||||
screenshare \
|
|
||||||
shell-desktop \
|
|
||||||
shell-fullscreen \
|
|
||||||
shell-ivi"
|
|
||||||
|
|
||||||
# Can be 'damage', 'im', 'egl', 'shm', 'touch', 'dmabuf-feedback', 'dmabuf-v4l', 'dmabuf-egl' or 'all'
|
|
||||||
SIMPLECLIENTS ?= "all"
|
|
||||||
|
|
||||||
#
|
|
||||||
# Compositor choices
|
|
||||||
#
|
|
||||||
# Weston on KMS
|
|
||||||
PACKAGECONFIG[kms] = "-Dbackend-drm=true,-Dbackend-drm=false,drm udev virtual/egl virtual/libgles2 virtual/libgbm mtdev"
|
|
||||||
# Weston on Wayland (nested Weston)
|
|
||||||
PACKAGECONFIG[wayland] = "-Dbackend-wayland=true,-Dbackend-wayland=false,virtual/egl virtual/libgles2"
|
|
||||||
# Weston on X11
|
|
||||||
PACKAGECONFIG[x11] = "-Dbackend-x11=true,-Dbackend-x11=false,virtual/libx11 libxcb libxcb libxcursor cairo"
|
|
||||||
# Headless Weston
|
|
||||||
PACKAGECONFIG[headless] = "-Dbackend-headless=true,-Dbackend-headless=false"
|
|
||||||
# Weston on framebuffer
|
|
||||||
PACKAGECONFIG[fbdev] = "-Ddeprecated-backend-fbdev=true,-Ddeprecated-backend-fbdev=false,udev mtdev"
|
|
||||||
# Weston on RDP
|
|
||||||
PACKAGECONFIG[rdp] = "-Dbackend-rdp=true,-Dbackend-rdp=false,freerdp"
|
|
||||||
# weston-launch
|
|
||||||
PACKAGECONFIG[launch] = "-Ddeprecated-weston-launch=true,-Ddeprecated-weston-launch=false,drm"
|
|
||||||
# VA-API desktop recorder
|
|
||||||
PACKAGECONFIG[vaapi] = "-Dbackend-drm-screencast-vaapi=true,-Dbackend-drm-screencast-vaapi=false,libva"
|
|
||||||
# Weston with EGL support
|
|
||||||
PACKAGECONFIG[egl] = "-Drenderer-gl=true,-Drenderer-gl=false,virtual/egl"
|
|
||||||
# Weston with lcms support
|
|
||||||
PACKAGECONFIG[lcms] = "-Dcolor-management-lcms=true,-Dcolor-management-lcms=false,lcms"
|
|
||||||
# Weston with webp support
|
|
||||||
PACKAGECONFIG[webp] = "-Dimage-webp=true,-Dimage-webp=false,libwebp"
|
|
||||||
# Weston with systemd-login support
|
|
||||||
PACKAGECONFIG[systemd] = "-Dsystemd=true -Dlauncher-logind=true,-Dsystemd=false -Dlauncher-logind=false,systemd dbus"
|
|
||||||
# Weston with Xwayland support (requires X11 and Wayland)
|
|
||||||
PACKAGECONFIG[xwayland] = "-Dxwayland=true,-Dxwayland=false"
|
|
||||||
# colord CMS support
|
|
||||||
PACKAGECONFIG[colord] = "-Dcolor-management-colord=true,-Dcolor-management-colord=false,colord"
|
|
||||||
# Clients support
|
|
||||||
PACKAGECONFIG[clients] = "-Dsimple-clients=${SIMPLECLIENTS} -Ddemo-clients=true,-Dsimple-clients= -Ddemo-clients=false"
|
|
||||||
# Virtual remote output with GStreamer on DRM backend
|
|
||||||
PACKAGECONFIG[remoting] = "-Dremoting=true,-Dremoting=false,gstreamer1.0 gstreamer1.0-plugins-base"
|
|
||||||
# Weston with screen-share support
|
|
||||||
PACKAGECONFIG[screenshare] = "-Dscreenshare=true,-Dscreenshare=false"
|
|
||||||
# Traditional desktop shell
|
|
||||||
PACKAGECONFIG[shell-desktop] = "-Dshell-desktop=true,-Dshell-desktop=false"
|
|
||||||
# Fullscreen shell
|
|
||||||
PACKAGECONFIG[shell-fullscreen] = "-Dshell-fullscreen=true,-Dshell-fullscreen=false"
|
|
||||||
# In-Vehicle Infotainment (IVI) shell
|
|
||||||
PACKAGECONFIG[shell-ivi] = "-Dshell-ivi=true,-Dshell-ivi=false"
|
|
||||||
# JPEG image loading support
|
|
||||||
PACKAGECONFIG[image-jpeg] = "-Dimage-jpeg=true,-Dimage-jpeg=false, jpeg"
|
|
||||||
# support libseat based launch
|
|
||||||
PACKAGECONFIG[launcher-libseat] = "-Dlauncher-libseat=true,-Dlauncher-libseat=false,seatd"
|
|
||||||
|
|
||||||
do_install:append() {
|
|
||||||
# Weston doesn't need the .la files to load modules, so wipe them
|
|
||||||
rm -f ${D}/${libdir}/libweston-${WESTON_MAJOR_VERSION}/*.la
|
|
||||||
|
|
||||||
# If X11, ship a desktop file to launch it
|
|
||||||
if [ "${@bb.utils.filter('DISTRO_FEATURES', 'x11', d)}" ]; then
|
|
||||||
install -d ${D}${datadir}/applications
|
|
||||||
install ${UNPACKDIR}/weston.desktop ${D}${datadir}/applications
|
|
||||||
|
|
||||||
install -d ${D}${datadir}/icons/hicolor/48x48/apps
|
|
||||||
install ${UNPACKDIR}/weston.png ${D}${datadir}/icons/hicolor/48x48/apps
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "${@bb.utils.contains('PACKAGECONFIG', 'xwayland', 'yes', 'no', d)}" = "yes" ]; then
|
|
||||||
install -Dm 644 ${UNPACKDIR}/xwayland.weston-start ${D}${datadir}/weston-start/xwayland
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "${@bb.utils.contains('PACKAGECONFIG', 'systemd', 'yes', 'no', d)}" = "yes" ]; then
|
|
||||||
install -Dm 644 ${UNPACKDIR}/systemd-notify.weston-start ${D}${datadir}/weston-start/systemd-notify
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "${@bb.utils.contains('PACKAGECONFIG', 'launch', 'yes', 'no', d)}" = "yes" ]; then
|
|
||||||
chmod u+s ${D}${bindir}/weston-launch
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
PACKAGES += "${@bb.utils.contains('PACKAGECONFIG', 'xwayland', '${PN}-xwayland', '', d)} \
|
|
||||||
libweston-${WESTON_MAJOR_VERSION} ${PN}-examples"
|
|
||||||
|
|
||||||
FILES:${PN}-dev += "${libdir}/${BPN}/libexec_weston.so"
|
|
||||||
FILES:${PN} = "${bindir}/weston ${bindir}/weston-terminal ${bindir}/weston-info ${bindir}/weston-launch ${bindir}/wcap-decode ${libexecdir} ${libdir}/${BPN}/*.so* ${datadir}"
|
|
||||||
|
|
||||||
FILES:libweston-${WESTON_MAJOR_VERSION} = "${libdir}/lib*${SOLIBS} ${libdir}/libweston-${WESTON_MAJOR_VERSION}/*.so"
|
|
||||||
SUMMARY:libweston-${WESTON_MAJOR_VERSION} = "Helper library for implementing 'wayland window managers'."
|
|
||||||
|
|
||||||
FILES:${PN}-examples = "${bindir}/*"
|
|
||||||
|
|
||||||
FILES:${PN}-xwayland = "${libdir}/libweston-${WESTON_MAJOR_VERSION}/xwayland.so"
|
|
||||||
RDEPENDS:${PN}-xwayland += "xwayland"
|
|
||||||
|
|
||||||
RDEPENDS:${PN} += "xkeyboard-config"
|
|
||||||
RRECOMMENDS:${PN} = "weston-init liberation-fonts"
|
|
||||||
RRECOMMENDS:${PN}-dev += "wayland-protocols"
|
|
||||||
|
|
||||||
USERADD_PACKAGES = "${PN}"
|
|
||||||
GROUPADD_PARAM:${PN} = "--system weston-launch"
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
|
|
||||||
|
|
||||||
SRC_URI:append:tegra = " file://0001-Drop-DRM-version-check-in-meson.build.patch \
|
|
||||||
file://0002-gl-renderer-Add-EGL-client-support-for-EGLStream-fra.patch \
|
|
||||||
file://0003-compositor-Process-stream-attach-requests-with-wl_eg.patch \
|
|
||||||
"
|
|
||||||
|
|
||||||
DEPENDS:append:tegra = " egl-wayland"
|
|
||||||
PACKAGE_ARCH:tegra = "${TEGRA_PKGARCH}"
|
|
||||||
|
|
||||||
RDEPENDS:${PN}:append:tegra = " egl-wayland egl-gbm"
|
|
||||||
|
|
||||||
# wlshell is used by nvidia gstreamer plugins
|
|
||||||
EXTRA_OEMESON:append:tegra = " -Ddeprecated-wl-shell=true"
|
|
||||||
|
|
||||||
RRECOMMENDS:${PN}:append:tegra = " kernel-module-tegra-udrm kernel-module-nvidia-drm"
|
|
||||||
RRECOMMENDS:${PN}:append:tegra234 = " nvidia-drm-loadconf"
|
|
||||||
Reference in New Issue
Block a user