[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 14/18] ui/dbus: do not require PIXMAN
From: |
marcandre . lureau |
Subject: |
[PATCH v2 14/18] ui/dbus: do not require PIXMAN |
Date: |
Mon, 18 Sep 2023 17:52:01 +0400 |
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Implement a fallback path for region 2D update.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
ui/dbus-listener.c | 88 ++++++++++++++++++++++++++++++++--------------
ui/meson.build | 2 +-
2 files changed, 62 insertions(+), 28 deletions(-)
diff --git a/ui/dbus-listener.c b/ui/dbus-listener.c
index 36548a7f52..350988c70d 100644
--- a/ui/dbus-listener.c
+++ b/ui/dbus-listener.c
@@ -26,9 +26,6 @@
#include "qapi/error.h"
#include "sysemu/sysemu.h"
#include "dbus.h"
-#ifdef CONFIG_OPENGL
-#include <pixman.h>
-#endif
#ifdef G_OS_UNIX
#include <gio/gunixfdlist.h>
#endif
@@ -41,6 +38,7 @@
#include "ui/shader.h"
#include "ui/egl-helpers.h"
#include "ui/egl-context.h"
+#include "ui/qemu-pixman.h"
#endif
#include "trace.h"
@@ -62,9 +60,11 @@ struct _DBusDisplayListener {
QemuDBusDisplay1Listener *proxy;
-#ifdef CONFIG_OPENGL
+#ifdef CONFIG_PIXMAN
/* Keep track of the damage region */
pixman_region32_t gl_damage;
+#else
+ int gl_damage;
#endif
DisplayChangeListener dcl;
@@ -545,6 +545,7 @@ static void dbus_gl_refresh(DisplayChangeListener *dcl)
return;
}
+#ifdef CONFIG_PIXMAN
int n_rects = pixman_region32_n_rects(&ddl->gl_damage);
for (int i = 0; i < n_rects; i++) {
@@ -555,6 +556,13 @@ static void dbus_gl_refresh(DisplayChangeListener *dcl)
box->x2 - box->x1, box->y2 - box->y1);
}
pixman_region32_clear(&ddl->gl_damage);
+#else
+ if (ddl->gl_damage) {
+ dbus_call_update_gl(dcl, 0, 0,
+ surface_width(ddl->ds), surface_height(ddl->ds));
+ ddl->gl_damage = 0;
+ }
+#endif
}
#endif /* OPENGL */
@@ -569,20 +577,62 @@ static void dbus_gl_gfx_update(DisplayChangeListener *dcl,
{
DBusDisplayListener *ddl = container_of(dcl, DBusDisplayListener, dcl);
+#ifdef CONFIG_PIXMAN
pixman_region32_t rect_region;
pixman_region32_init_rect(&rect_region, x, y, w, h);
pixman_region32_union(&ddl->gl_damage, &ddl->gl_damage, &rect_region);
pixman_region32_fini(&rect_region);
+#else
+ ddl->gl_damage++;
+#endif
}
#endif
+static void dbus_gfx_update_sub(DBusDisplayListener *ddl,
+ int x, int y, int w, int h)
+{
+ pixman_image_t *img;
+ size_t stride;
+ GVariant *v_data;
+
+ /* make a copy, since gvariant only handles linear data */
+ stride = w * DIV_ROUND_UP(PIXMAN_FORMAT_BPP(surface_format(ddl->ds)), 8);
+ img = pixman_image_create_bits(surface_format(ddl->ds),
+ w, h, NULL, stride);
+#ifdef CONFIG_PIXMAN
+ pixman_image_composite(PIXMAN_OP_SRC, ddl->ds->image, NULL, img,
+ x, y, 0, 0, 0, 0, w, h);
+#else
+ {
+ uint8_t *src = pixman_image_get_data(ddl->ds->image);
+ uint8_t *dst = pixman_image_get_data(img);
+ int bp = PIXMAN_FORMAT_BPP(surface_format(ddl->ds)) / 8;
+ int hh;
+
+ for (hh = 0; hh < h; hh++) {
+ memcpy(&dst[stride * hh], &src[surface_stride(ddl->ds) * (hh + y)
+ x * bp], stride);
+ }
+ }
+#endif
+ v_data = g_variant_new_from_data(
+ G_VARIANT_TYPE("ay"),
+ pixman_image_get_data(img),
+ pixman_image_get_stride(img) * h,
+ TRUE,
+ (GDestroyNotify)pixman_image_unref,
+ img);
+ qemu_dbus_display1_listener_call_update(ddl->proxy,
+ x, y, w, h, pixman_image_get_stride(img), pixman_image_get_format(img),
+ v_data,
+ G_DBUS_CALL_FLAGS_NONE,
+ DBUS_DEFAULT_TIMEOUT, NULL, NULL, NULL);
+}
+
static void dbus_gfx_update(DisplayChangeListener *dcl,
int x, int y, int w, int h)
{
DBusDisplayListener *ddl = container_of(dcl, DBusDisplayListener, dcl);
- pixman_image_t *img;
GVariant *v_data;
- size_t stride;
assert(ddl->ds);
@@ -619,25 +669,7 @@ static void dbus_gfx_update(DisplayChangeListener *dcl,
return;
}
- /* make a copy, since gvariant only handles linear data */
- stride = w * DIV_ROUND_UP(PIXMAN_FORMAT_BPP(surface_format(ddl->ds)), 8);
- img = pixman_image_create_bits(surface_format(ddl->ds),
- w, h, NULL, stride);
- pixman_image_composite(PIXMAN_OP_SRC, ddl->ds->image, NULL, img,
- x, y, 0, 0, 0, 0, w, h);
-
- v_data = g_variant_new_from_data(
- G_VARIANT_TYPE("ay"),
- pixman_image_get_data(img),
- pixman_image_get_stride(img) * h,
- TRUE,
- (GDestroyNotify)pixman_image_unref,
- img);
- qemu_dbus_display1_listener_call_update(ddl->proxy,
- x, y, w, h, pixman_image_get_stride(img), pixman_image_get_format(img),
- v_data,
- G_DBUS_CALL_FLAGS_NONE,
- DBUS_DEFAULT_TIMEOUT, NULL, NULL, NULL);
+ dbus_gfx_update_sub(ddl, x, y, w, h);
}
#ifdef CONFIG_OPENGL
@@ -751,8 +783,10 @@ dbus_display_listener_dispose(GObject *object)
g_clear_object(&ddl->map_proxy);
g_clear_object(&ddl->d3d11_proxy);
g_clear_pointer(&ddl->peer_process, CloseHandle);
-#ifdef CONFIG_OPENGL
+#ifdef CONFIG_PIXMAN
pixman_region32_fini(&ddl->gl_damage);
+#endif
+#ifdef CONFIG_OPENGL
egl_fb_destroy(&ddl->fb);
#endif
#endif
@@ -787,7 +821,7 @@ dbus_display_listener_class_init(DBusDisplayListenerClass
*klass)
static void
dbus_display_listener_init(DBusDisplayListener *ddl)
{
-#ifdef CONFIG_OPENGL
+#ifdef CONFIG_PIXMAN
pixman_region32_init(&ddl->gl_damage);
#endif
}
diff --git a/ui/meson.build b/ui/meson.build
index 7f806a6d48..521843c356 100644
--- a/ui/meson.build
+++ b/ui/meson.build
@@ -93,7 +93,7 @@ if dbus_display
'--generate-c-code', '@BASENAME@'])
dbus_display1_lib = static_library('dbus-display1', dbus_display1,
dependencies: gio)
dbus_display1_dep = declare_dependency(link_with: dbus_display1_lib,
include_directories: include_directories('.'))
- dbus_ss.add(when: [gio, pixman, dbus_display1_dep],
+ dbus_ss.add(when: [gio, dbus_display1_dep],
if_true: [files(
'dbus-chardev.c',
'dbus-clipboard.c',
--
2.41.0
- [PATCH v2 05/18] ui/vc: console-vc requires PIXMAN, (continued)
- [PATCH v2 05/18] ui/vc: console-vc requires PIXMAN, marcandre . lureau, 2023/09/18
- [PATCH v2 04/18] ui/console: allow to override the default VC, marcandre . lureau, 2023/09/18
- [PATCH v2 08/18] ui/console: when PIXMAN is unavailable, don't draw placeholder msg, marcandre . lureau, 2023/09/18
- [PATCH v2 06/18] qmp/hmp: disable screendump if PIXMAN is missing, marcandre . lureau, 2023/09/18
- [PATCH v2 07/18] virtio-gpu: replace PIXMAN for region/rect test, marcandre . lureau, 2023/09/18
- [PATCH v2 09/18] vhost-user-gpu: skip VHOST_USER_GPU_UPDATE when !PIXMAN, marcandre . lureau, 2023/09/18
- [PATCH v2 10/18] ui/gl: opengl doesn't require PIXMAN, marcandre . lureau, 2023/09/18
- [PATCH v2 11/18] ui/vnc: VNC requires PIXMAN, marcandre . lureau, 2023/09/18
- [PATCH v2 12/18] ui/spice: SPICE/QXL requires PIXMAN, marcandre . lureau, 2023/09/18
- [PATCH v2 13/18] ui/gtk: -display gtk requires PIXMAN, marcandre . lureau, 2023/09/18
- [PATCH v2 14/18] ui/dbus: do not require PIXMAN,
marcandre . lureau <=
- [PATCH v2 16/18] hw/sm501: allow compiling without PIXMAN, marcandre . lureau, 2023/09/18
- [PATCH v2 17/18] hw/display: make ATI_VGA depend on PIXMAN, marcandre . lureau, 2023/09/18
- [PATCH v2 15/18] arm/kconfig: XLNX_ZYNQMP_ARM depends on PIXMAN, marcandre . lureau, 2023/09/18
- [PATCH v2 18/18] build-sys: make pixman actually optional, marcandre . lureau, 2023/09/18