diff --git a/recipes-graphics/l4t-graphics-demos/l4t-graphics-demos/0003-Convert-nvgldemo-wayland-to-use-xdg-shell.patch b/recipes-graphics/l4t-graphics-demos/l4t-graphics-demos/0003-Convert-nvgldemo-wayland-to-use-xdg-shell.patch new file mode 100644 index 00000000..9796685a --- /dev/null +++ b/recipes-graphics/l4t-graphics-demos/l4t-graphics-demos/0003-Convert-nvgldemo-wayland-to-use-xdg-shell.patch @@ -0,0 +1,327 @@ +From a3c37e751932847c633aea23c8da4d1ce3439012 Mon Sep 17 00:00:00 2001 +From: Matt Madison +Date: Sat, 25 May 2024 05:45:20 -0700 +Subject: [PATCH] Convert nvgldemo-wayland to use xdg-shell + +Upstream-Status: Pending + +Signed-off-by: Matt Madison +--- + .../nvidia/graphics_demos/nvgldemo/Makefile | 33 ++++- + .../nvgldemo/nvgldemo_win_wayland.c | 119 +++++++++--------- + .../nvgldemo/nvgldemo_win_wayland.h | 6 +- + 3 files changed, 95 insertions(+), 63 deletions(-) + +diff --git a/usr/src/nvidia/graphics_demos/nvgldemo/Makefile b/usr/src/nvidia/graphics_demos/nvgldemo/Makefile +index 2637b5a..7b26a64 100644 +--- a/usr/src/nvidia/graphics_demos/nvgldemo/Makefile ++++ b/usr/src/nvidia/graphics_demos/nvgldemo/Makefile +@@ -28,6 +28,14 @@ ifeq ($(NV_WINSYS),screen) + endif + ifeq ($(NV_WINSYS),wayland) + NVGLDEMO_OBJS += wayland/nvgldemo_win_wayland.o ++ PROTOCOLS := ++ PROTOCOLS += $(NV_WINSYS)/xdg-shell-client-protocol.h ++ INTERMEDIATES += $(PROTOCOLS) ++ CFLAGS += -I$(NV_WINSYS)/ ++ ++ PROTOCOLSDIR := $(shell pkg-config --variable=pkgdatadir wayland-protocols) ++ ++ NVGLDEMO_OBJS += $(patsubst %.h,%.o,$(PROTOCOLS)) + endif + ifeq ($(NV_WINSYS),x11) + NVGLDEMO_OBJS += x11/nvgldemo_win_x11.o +@@ -53,9 +61,32 @@ FORCE: + + $(NV_WINSYS)/libnvgldemo.a: $(NV_WINSYS)/libnvgldemo.a($(NVGLDEMO_OBJS)) + ++ifeq ($(NV_WINSYS),wayland) ++wayland/nvgldemo_win_wayland.o: $(PROTOCOLS) ++endif ++ ++define protocol-rule ++$(1).h: FORCE ++ @mkdir -p $(dir $(1)) ++ifeq ($(findstring unstable,$(1)),) ++ wayland-scanner client-header $$(PROTOCOLSDIR)/stable/$$(shell echo $$(notdir $(1)) | sed -e's,-client-protocol.*,,')/$(patsubst %-client-protocol,%.xml,$(notdir $(1))) $$@ ++else ++ wayland-scanner client-header $$(PROTOCOLSDIR)/unstable/$$(shell echo $$(notdir $(1)) | sed -e's,-unstable.*,,')/$(patsubst %-client-protocol,%.xml,$(notdir $(1))) $$@ ++endif ++$(1).c: $(1).h ++ifeq ($(findstring unstable,$(1)),) ++ wayland-scanner code $$(PROTOCOLSDIR)/stable/$$(shell echo $$(notdir $(1)) | sed -e's,-client-protocol.*,,')/$(patsubst %-client-protocol,%.xml,$(notdir $(1))) $$@ ++else ++ wayland-scanner code $$(PROTOCOLSDIR)/unstable/$$(shell echo $$(notdir $(1)) | sed -e's,-unstable.*,,')/$(patsubst %-client-protocol,%.xml,$(notdir $(1))) $$@ ++endif ++$(1).o: $(1).c ++ @mkdir -p $(dir $(1)) ++ $$(COMPILE.c) $$(OUTPUT_OPTION) $$< ++endef ++ + define demolib-rule + $(1): FORCE + $(MAKE) -C $$(subst $$(NV_WINSYS)/,,$$(dir $$@)) + endef + $(foreach demolib,$(NVGLDEMO_DEMOLIBS),$(eval $(call demolib-rule,$(demolib)))) +- ++$(foreach protocol,$(PROTOCOLS),$(eval $(call protocol-rule,$(basename $(protocol))))) +diff --git a/usr/src/nvidia/graphics_demos/nvgldemo/nvgldemo_win_wayland.c b/usr/src/nvidia/graphics_demos/nvgldemo/nvgldemo_win_wayland.c +index 1ac060a..711ae50 100644 +--- a/usr/src/nvidia/graphics_demos/nvgldemo/nvgldemo_win_wayland.c ++++ b/usr/src/nvidia/graphics_demos/nvgldemo/nvgldemo_win_wayland.c +@@ -48,18 +48,27 @@ static NvGlDemoPointerCB pointerCB = NULL; + static NvGlDemoButtonCB buttonCB = NULL; + + static void +-handle_ping(void *data, struct wl_shell_surface *wlShellSurface, ++handle_ping(void *data, struct xdg_wm_base *xdgWmBase, + uint32_t serial) + { +- wl_shell_surface_pong(wlShellSurface, serial); ++ xdg_wm_base_pong(xdgWmBase, serial); + } + ++static const struct xdg_wm_base_listener xdg_wm_base_listener = ++{ ++ handle_ping, ++}; ++ + static void +-handle_configure(void *data, struct wl_shell_surface *shell_surface, +- uint32_t edges, int32_t width, int32_t height) ++handle_configure(void *data, struct xdg_toplevel *xdgTopLevel, ++ int32_t width, int32_t height, ++ struct wl_array *states) + { + struct Window *window = data; + ++ if (width == 0 || height == 0) ++ return; ++ + if (window->wlEGLNativeWindow) { + wl_egl_window_resize(window->wlEGLNativeWindow, width, height, 0, 0); + } +@@ -76,10 +85,28 @@ handle_configure(void *data, struct wl_shell_surface *shell_surface, + } + } + +-static const struct wl_shell_surface_listener shell_surface_listener = ++static void ++handle_toplevel_close(void *data, struct xdg_toplevel *xdgTopLevel) + { +- handle_ping, ++ struct Window *window = data; ++ NvGlDemoWindowTerm(); ++} ++ ++static const struct xdg_toplevel_listener xdg_toplevel_listener = { + handle_configure, ++ handle_toplevel_close ++}; ++ ++static void xdg_surface_configure(void *data, struct xdg_surface *xdgSurface, ++ uint32_t serial) ++{ ++ struct Window *window = data; ++ xdg_surface_ack_configure(xdgSurface, serial); ++ window->configured = 1; ++} ++ ++static const struct xdg_surface_listener xdg_surface_listener = { ++ xdg_surface_configure + }; + + #ifdef ENABLE_IVI_SHELL +@@ -108,21 +135,6 @@ static const struct ivi_surface_listener ivi_surface_listener = { + }; + #endif + +-static void +-configure_callback(void *data, struct wl_callback *callback, uint32_t time) +-{ +- struct Window *window = data; +- +- wl_callback_destroy(callback); +- +- window->configured = 1; +-} +- +-static struct wl_callback_listener configure_callback_listener = +-{ +- configure_callback, +-}; +- + static void + toggle_fullscreen(struct Window *window, int fullscreen) + { +@@ -133,20 +145,11 @@ toggle_fullscreen(struct Window *window, int fullscreen) + window->configured = 0; + + if (fullscreen) { +- wl_shell_surface_set_fullscreen( +- window->wlShellSurface, +- WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT,0, NULL); ++ xdg_toplevel_set_fullscreen(window->xdgTopLevel, NULL); + } else { +- wl_shell_surface_set_toplevel(window->wlShellSurface); +- handle_configure(window, window->wlShellSurface, 0, +- window->window_size.width, +- window->window_size.height); ++ xdg_toplevel_unset_fullscreen(window->xdgTopLevel); + } + +- callback = wl_display_sync(window->display->wlDisplay); +- wl_callback_add_listener(callback, &configure_callback_listener, +- window); +- + } + + static void +@@ -419,10 +422,10 @@ registry_handle_global(void *data, struct wl_registry *registry, + { + struct Display *d = data; + +- if (strcmp(interface, "wl_compositor") == 0) { ++ if (strcmp(interface, wl_compositor_interface.name) == 0) { + d->wlCompositor = wl_registry_bind(registry, name, + &wl_compositor_interface, 1); +- } else if (strcmp(interface, "wl_subcompositor") == 0) { ++ } else if (strcmp(interface, wl_subcompositor_interface.name) == 0) { + d->wlSubcompositor = wl_registry_bind(registry, name, + &wl_subcompositor_interface, 1); + #ifdef NVGLDEMO_ENABLE_DMABUF +@@ -436,9 +439,10 @@ registry_handle_global(void *data, struct wl_registry *registry, + d->wlExplicitSync = wl_registry_bind(registry, name, + &zwp_linux_explicit_synchronization_v1_interface, 1); + #endif +- } else if (strcmp(interface, "wl_shell") == 0) { +- d->wlShell = wl_registry_bind(registry, name, +- &wl_shell_interface, 1); ++ } else if (strcmp(interface, xdg_wm_base_interface.name) == 0) { ++ d->xdgWmBase = wl_registry_bind(registry, name, ++ &xdg_wm_base_interface, 1); ++ xdg_wm_base_add_listener(d->xdgWmBase, &xdg_wm_base_listener, d); + } else if (strcmp(interface, "wl_seat") == 0) { + d->wlSeat = wl_registry_bind(registry, name, + &wl_seat_interface, 1); +@@ -595,8 +599,8 @@ NvGlDemoDisplayTerm(void) + wl_seat_destroy(demoState.platform->display.wlSeat); + } + +- if (demoState.platform->display.wlShell) { +- wl_shell_destroy(demoState.platform->display.wlShell); ++ if (demoState.platform->display.xdgWmBase) { ++ xdg_wm_base_destroy(demoState.platform->display.xdgWmBase); + } + + #ifdef ENABLE_IVI_SHELL +@@ -653,16 +657,12 @@ NvGlDemoDisplayTerm(void) + + static int create_shell_surface(struct Window *window, struct Display *display) + { +- window->wlShellSurface = wl_shell_get_shell_surface( +- display->wlShell, window->wlSurface); +- +- if (window->wlShellSurface == NULL) { +- NvGlDemoLog("Failed to create wayland shell surface.\n"); +- return 0; +- } +- +- wl_shell_surface_add_listener(window->wlShellSurface, +- &shell_surface_listener, window); ++ window->xdgSurface = xdg_wm_base_get_xdg_surface( ++ display->xdgWmBase, window->wlSurface); ++ xdg_surface_add_listener(window->xdgSurface, &xdg_surface_listener, window); ++ window->xdgTopLevel = xdg_surface_get_toplevel(window->xdgSurface); ++ xdg_toplevel_add_listener(window->xdgTopLevel, &xdg_toplevel_listener, window); ++ wl_surface_commit(window->wlSurface); + + return 1; + } +@@ -705,7 +705,7 @@ NvGlDemoWindowInit( + } + + if (!demoState.platform->display.wlCompositor || +- !(demoState.platform->display.wlShell ++ !(demoState.platform->display.xdgWmBase + #ifdef ENABLE_IVI_SHELL + || demoState.platform->display.ivi_application + #endif +@@ -751,7 +751,7 @@ NvGlDemoWindowInit( + } else + #endif + { +- if (demoState.platform->display.wlShell) { ++ if (demoState.platform->display.xdgWmBase) { + if (!create_shell_surface(&demoState.platform->window, + &demoState.platform->display)) { + goto fail; +@@ -774,7 +774,7 @@ NvGlDemoWindowInit( + goto fail; + } + +- if (demoState.platform->display.wlShell ++ if (demoState.platform->display.xdgWmBase + #ifdef ENABLE_IVI_SHELL + && !demoState.platform->display.ivi_application + #endif +@@ -811,9 +811,13 @@ void NvGlDemoWindowTerm(void) + demoState.platform->window.wlEGLNativeWindow = 0; + } + +- if (demoState.platform->window.wlShellSurface) { +- wl_shell_surface_destroy(demoState.platform->window.wlShellSurface); +- demoState.platform->window.wlShellSurface = 0; ++ if (demoState.platform->window.xdgTopLevel) { ++ xdg_toplevel_destroy(demoState.platform->window.xdgTopLevel); ++ demoState.platform->window.xdgTopLevel = 0; ++ } ++ if (demoState.platform->window.xdgSurface) { ++ xdg_surface_destroy(demoState.platform->window.xdgSurface); ++ demoState.platform->window.xdgSurface = 0; + } + + #ifdef ENABLE_IVI_SHELL +@@ -823,11 +827,6 @@ void NvGlDemoWindowTerm(void) + } + #endif + +- if (demoState.platform->window.wlSurface) { +- wl_surface_destroy(demoState.platform->window.wlSurface); +- demoState.platform->window.wlSurface = 0; +- } +- + if (demoState.platform->window.callback) { + wl_callback_destroy(demoState.platform->window.callback); + demoState.platform->window.callback = 0; +diff --git a/usr/src/nvidia/graphics_demos/nvgldemo/nvgldemo_win_wayland.h b/usr/src/nvidia/graphics_demos/nvgldemo/nvgldemo_win_wayland.h +index 0e84f41..24eca67 100644 +--- a/usr/src/nvidia/graphics_demos/nvgldemo/nvgldemo_win_wayland.h ++++ b/usr/src/nvidia/graphics_demos/nvgldemo/nvgldemo_win_wayland.h +@@ -39,6 +39,7 @@ + #endif + #include "wayland-client.h" + #include "wayland-egl.h" ++#include "xdg-shell-client-protocol.h" + + #ifdef ENABLE_IVI_SHELL + #include "ivi-application-client-protocol.h" +@@ -70,7 +71,7 @@ struct Display { + uint64_t formatModifiers_XRGB8[NVGLDEMO_MAX_DRM_MODIFIERS]; + uint64_t formatModifiers_ARGB8[NVGLDEMO_MAX_DRM_MODIFIERS]; + #endif +- struct wl_shell *wlShell; ++ struct xdg_wm_base *xdgWmBase; + #ifdef ENABLE_IVI_SHELL + struct ivi_application *ivi_application; + enum ivi_interface_type ivi_type; +@@ -102,7 +103,8 @@ struct Window { + struct Display *display; + struct wl_egl_window *wlEGLNativeWindow; + struct wl_surface *wlSurface; +- struct wl_shell_surface *wlShellSurface; ++ struct xdg_surface *xdgSurface; ++ struct xdg_toplevel *xdgTopLevel; + #ifdef ENABLE_IVI_SHELL + struct ivi_surface *ivi_surface; + unsigned int ivi_surfaceId; diff --git a/recipes-graphics/l4t-graphics-demos/l4t-graphics-demos_36.3.0.bb b/recipes-graphics/l4t-graphics-demos/l4t-graphics-demos_36.3.0.bb index cf310bfe..09aa40a2 100644 --- a/recipes-graphics/l4t-graphics-demos/l4t-graphics-demos_36.3.0.bb +++ b/recipes-graphics/l4t-graphics-demos/l4t-graphics-demos_36.3.0.bb @@ -8,6 +8,7 @@ LIC_FILES_CHKSUM = "file://README;endline=21;md5=17bf753e98379a9888c5bd3f81da8d4 SRC_URI += "\ file://0001-Fix-stdbool.h-inclusion-check.patch;patchdir=../../../.. \ file://0002-weston-dmabuf-formats-cross-build-fixes.patch;patchdir=../../../.. \ + file://0003-Convert-nvgldemo-wayland-to-use-xdg-shell.patch;patchdir=../../../.. \ " REQUIRED_DISTRO_FEATURES = "opengl" @@ -18,7 +19,7 @@ inherit pkgconfig features_check PACKAGECONFIG ??= "${@bb.utils.filter('DISTRO_FEATURES', 'x11 wayland', d)}" PACKAGECONFIG[x11] = ",,libx11 virtual/libgbm" -PACKAGECONFIG[wayland] = ",,libxkbcommon wayland wayland-native weston libffi virtual/libgbm tegra-mmapi tegra-libraries-multimedia-utils" +PACKAGECONFIG[wayland] = ",,libxkbcommon wayland wayland-native weston wayland-protocols libffi virtual/libgbm tegra-mmapi tegra-libraries-multimedia-utils" CONFIGURESTAMPFILE = "${WORKDIR}/configure.sstate"