From c902d6d6a8e5d933f54f8791efa88d545c829188 Mon Sep 17 00:00:00 2001 From: GlassOnTin Date: Tue, 31 Mar 2026 00:11:41 +0100 Subject: [PATCH] server: allow external renderer and allocator on Android On Android, the standard wlr_renderer_autocreate() and wlr_allocator_autocreate() paths fail because there is no DRM subsystem. Android apps create EGL contexts via eglGetDisplay() and provide GPU buffers via AHardwareBuffer. Add hooks guarded by #ifdef __ANDROID__ that check for externally provided renderer/allocator globals before falling back to autocreate. This allows the JNI bridge to: 1. Create an EGL context via Android's native EGL 2. Wrap it in wlr_egl_create_with_context() 3. Create a GLES2 renderer via wlr_gles2_renderer_create() 4. Provide a custom allocator (e.g. AHardwareBuffer-based) The globals (android_renderer, android_allocator) are declared extern and only referenced when __ANDROID__ is defined, so there is no impact on non-Android builds. Ref: https://github.com/GlassOnTin/Haven/issues/47 --- src/server.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/server.c b/src/server.c index 653caf59..fe01e271 100644 --- a/src/server.c +++ b/src/server.c @@ -502,7 +502,17 @@ server_init(void) * The renderer is responsible for defining the various pixel formats it * supports for shared memory, this configures that for clients. */ - server.renderer = wlr_renderer_autocreate(server.backend); +#ifdef __ANDROID__ + /* Android: accept externally created renderer (e.g. GLES2 via + * eglGetDisplay + wlr_egl_create_with_context) */ + extern struct wlr_renderer *android_renderer; + if (android_renderer) { + server.renderer = android_renderer; + } else +#endif + { + server.renderer = wlr_renderer_autocreate(server.backend); + } if (!server.renderer) { wlr_log(WLR_ERROR, "unable to create renderer"); exit(EXIT_FAILURE); @@ -541,8 +551,16 @@ server_init(void) * the renderer and the backend. It handles the buffer creation, * allowing wlroots to render onto the screen */ - server.allocator = wlr_allocator_autocreate( - server.backend, server.renderer); +#ifdef __ANDROID__ + extern struct wlr_allocator *android_allocator; + if (android_allocator) { + server.allocator = android_allocator; + } else +#endif + { + server.allocator = wlr_allocator_autocreate( + server.backend, server.renderer); + } if (!server.allocator) { wlr_log(WLR_ERROR, "unable to create allocator"); exit(EXIT_FAILURE);