xwayland: add patch for ashmem usage

This commit is contained in:
Leonid Pliushch 2019-07-27 02:00:13 +03:00 committed by Yaksh Bariya
parent c6e2c50274
commit 29d18d0c4d
No known key found for this signature in database
GPG Key ID: F7486BA7D3D27581
2 changed files with 223 additions and 0 deletions

View File

@ -3,6 +3,7 @@ TERMUX_PKG_DESCRIPTION="Wayland X11 server"
TERMUX_PKG_LICENSE="MIT"
TERMUX_PKG_MAINTAINER="Leonid Plyushch <leonid.plyushch@gmail.com>"
TERMUX_PKG_VERSION=1.20.5
TERMUX_PKG_REVISION=1
TERMUX_PKG_SRCURL=https://xorg.freedesktop.org/releases/individual/xserver/xorg-server-${TERMUX_PKG_VERSION}.tar.bz2
TERMUX_PKG_SHA256=a81d8243f37e75a03d4f8c55f96d0bc25802be6ec45c3bfa5cb614c6d01bac9d
TERMUX_PKG_DEPENDS="libandroid-shmem, libdrm, libpciaccess, libpixman, libx11, libxau, libxfont2, libxinerama, libxkbfile, libxshmfence, mesa, openssl, xkeyboard-config, xorg-xkbcomp, libwayland, libwayland-protocols, libepoxy"

View File

@ -0,0 +1,222 @@
diff -Naur ../xserver-1.20.5-orig/hw/xwayland/ashmem.h ./hw/xwayland/ashmem.h
--- ../xserver-1.20.5-orig/hw/xwayland/ashmem.h 1970-01-01 02:00:00.000000000 +0200
+++ ./hw/xwayland/ashmem.h 2019-07-12 15:00:25.712211695 +0300
@@ -0,0 +1,47 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _LINUX_ASHMEM_H
+#define _LINUX_ASHMEM_H
+
+#include <linux/limits.h>
+#include <linux/ioctl.h>
+#include <stdint.h>
+
+#define ASHMEM_NAME_LEN 256
+
+#define ASHMEM_NAME_DEF "dev/ashmem"
+
+#define ASHMEM_NOT_PURGED 0
+#define ASHMEM_WAS_PURGED 1
+
+#define ASHMEM_IS_UNPINNED 0
+#define ASHMEM_IS_PINNED 1
+
+struct ashmem_pin {
+ uint32_t offset;
+ uint32_t len;
+};
+
+#define __ASHMEMIOC 0x77
+
+#define ASHMEM_SET_NAME _IOW(__ASHMEMIOC, 1, char[ASHMEM_NAME_LEN])
+#define ASHMEM_GET_NAME _IOR(__ASHMEMIOC, 2, char[ASHMEM_NAME_LEN])
+#define ASHMEM_SET_SIZE _IOW(__ASHMEMIOC, 3, size_t)
+#define ASHMEM_GET_SIZE _IO(__ASHMEMIOC, 4)
+#define ASHMEM_SET_PROT_MASK _IOW(__ASHMEMIOC, 5, unsigned long)
+#define ASHMEM_GET_PROT_MASK _IO(__ASHMEMIOC, 6)
+#define ASHMEM_PIN _IOW(__ASHMEMIOC, 7, struct ashmem_pin)
+#define ASHMEM_UNPIN _IOW(__ASHMEMIOC, 8, struct ashmem_pin)
+#define ASHMEM_GET_PIN_STATUS _IO(__ASHMEMIOC, 9)
+#define ASHMEM_PURGE_ALL_CACHES _IO(__ASHMEMIOC, 10)
+
+#endif
diff -Naur ../xserver-1.20.5-orig/hw/xwayland/xwayland-cursor.c ./hw/xwayland/xwayland-cursor.c
--- ../xserver-1.20.5-orig/hw/xwayland/xwayland-cursor.c 2019-07-12 15:14:26.885076932 +0300
+++ ./hw/xwayland/xwayland-cursor.c 2019-07-12 14:57:25.217524468 +0300
@@ -66,7 +66,8 @@
PixmapPtr pixmap;
pixmap = xwl_shm_create_pixmap(screen, cursor->bits->width,
- cursor->bits->height, 32, 0);
+ cursor->bits->height, 32,
+ CREATE_PIXMAP_USAGE_BACKING_PIXMAP);
dixSetPrivate(&cursor->devPrivates, &xwl_cursor_private_key, pixmap);
return TRUE;
diff -Naur ../xserver-1.20.5-orig/hw/xwayland/xwayland-glamor-gbm.c ./hw/xwayland/xwayland-glamor-gbm.c
--- ../xserver-1.20.5-orig/hw/xwayland/xwayland-glamor-gbm.c 2019-07-12 15:14:26.885076932 +0300
+++ ./hw/xwayland/xwayland-glamor-gbm.c 2019-07-12 14:57:38.836704786 +0300
@@ -212,9 +212,9 @@
PixmapPtr pixmap = NULL;
if (width > 0 && height > 0 && depth >= 15 &&
- (hint == 0 ||
- hint == CREATE_PIXMAP_USAGE_BACKING_PIXMAP ||
- hint == CREATE_PIXMAP_USAGE_SHARED)) {
+ (hint == CREATE_PIXMAP_USAGE_BACKING_PIXMAP ||
+ hint == CREATE_PIXMAP_USAGE_SHARED ||
+ (xwl_screen->rootless && hint == 0))) {
uint32_t format = gbm_format_for_depth(depth);
#ifdef GBM_BO_WITH_MODIFIERS
diff -Naur ../xserver-1.20.5-orig/hw/xwayland/xwayland-output.c ./hw/xwayland/xwayland-output.c
--- ../xserver-1.20.5-orig/hw/xwayland/xwayland-output.c 2019-07-12 15:14:26.889075146 +0300
+++ ./hw/xwayland/xwayland-output.c 2019-07-12 14:54:13.242596617 +0300
@@ -171,6 +171,40 @@
return 25.4 / DEFAULT_DPI;
}
+static int
+xwl_set_pixmap_visit_window(WindowPtr window, void *data)
+{
+ ScreenPtr screen = window->drawable.pScreen;
+
+ if (screen->GetWindowPixmap(window) == data) {
+ screen->SetWindowPixmap(window, screen->GetScreenPixmap(screen));
+ return WT_WALKCHILDREN;
+ }
+
+ return WT_DONTWALKCHILDREN;
+}
+
+static void
+update_backing_pixmaps(struct xwl_screen *xwl_screen, int width, int height)
+{
+ ScreenPtr pScreen = xwl_screen->screen;
+ WindowPtr pRoot = pScreen->root;
+ PixmapPtr old_pixmap, new_pixmap;
+
+ old_pixmap = pScreen->GetScreenPixmap(pScreen);
+ new_pixmap = pScreen->CreatePixmap(pScreen, width, height,
+ pScreen->rootDepth,
+ CREATE_PIXMAP_USAGE_BACKING_PIXMAP);
+ pScreen->SetScreenPixmap(new_pixmap);
+
+ if (old_pixmap) {
+ TraverseTree(pRoot, xwl_set_pixmap_visit_window, old_pixmap);
+ pScreen->DestroyPixmap(old_pixmap);
+ }
+
+ pScreen->ResizeWindow(pRoot, 0, 0, width, height, NULL);
+}
+
static void
update_screen_size(struct xwl_output *xwl_output, int width, int height)
{
@@ -180,6 +214,9 @@
if (xwl_screen->root_clip_mode == ROOT_CLIP_FULL)
SetRootClip(xwl_screen->screen, ROOT_CLIP_NONE);
+ if (!xwl_screen->rootless && xwl_screen->screen->root)
+ update_backing_pixmaps (xwl_screen, width, height);
+
xwl_screen->width = width;
xwl_screen->height = height;
xwl_screen->screen->width = width;
diff -Naur ../xserver-1.20.5-orig/hw/xwayland/xwayland-shm.c ./hw/xwayland/xwayland-shm.c
--- ../xserver-1.20.5-orig/hw/xwayland/xwayland-shm.c 2019-07-12 15:14:26.889075146 +0300
+++ ./hw/xwayland/xwayland-shm.c 2019-07-12 15:28:09.124589333 +0300
@@ -40,12 +40,17 @@
#include <string.h>
#include <stdlib.h>
+#ifdef __ANDROID__
+#include "ashmem.h"
+#endif
+
struct xwl_pixmap {
struct wl_buffer *buffer;
void *data;
size_t size;
};
+#ifndef __ANDROID__
#ifndef HAVE_MKOSTEMP
static int
set_cloexec_or_close(int fd)
@@ -172,6 +177,37 @@
return fd;
}
+#else // __ANDROID__
+
+static int
+os_create_anonymous_file(off_t size) {
+ int fd, ret;
+ long flags;
+
+ fd = open("/dev/ashmem", O_RDWR);
+ if (fd < 0)
+ return fd;
+
+ ret = ioctl(fd, ASHMEM_SET_SIZE, size);
+ if (ret < 0)
+ goto err;
+
+ flags = fcntl(fd, F_GETFD);
+ if (flags == -1)
+ goto err;
+
+ if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1)
+ goto err;
+
+ return fd;
+
+err:
+ close(fd);
+ return ret;
+}
+
+#endif // __ANDROID__
+
static uint32_t
shm_format_for_depth(int depth)
{
@@ -202,6 +238,7 @@
int fd;
if (hint == CREATE_PIXMAP_USAGE_GLYPH_PICTURE ||
+ (!xwl_screen->rootless && hint != CREATE_PIXMAP_USAGE_BACKING_PIXMAP) ||
(width == 0 && height == 0) || depth < 15)
return fbCreatePixmap(screen, width, height, depth, hint);
--- ./miext/sync/meson.build.orig 2019-07-21 03:56:18.960672711 +0300
+++ ./miext/sync/meson.build 2019-07-21 04:02:55.926796439 +0300
@@ -1,6 +1,7 @@
srcs_miext_sync = [
'misync.c',
'misyncfd.c',
+ 'misyncshm.c',
]
hdrs_miext_sync = [
@@ -10,10 +11,6 @@
'misyncstr.h',
]
-if build_dri3
- srcs_miext_sync += 'misyncshm.c'
-endif
-
libxserver_miext_sync = static_library('libxserver_miext_sync',
srcs_miext_sync,
include_directories: inc,