[PATCH v2 17/18] ui/dbus: do not require opengl & gbm

marcandre.lureau@redhat.com posted 18 patches 2 years, 4 months ago
There is a newer version of this series
[PATCH v2 17/18] ui/dbus: do not require opengl & gbm
Posted by marcandre.lureau@redhat.com 2 years, 4 months ago
From: Marc-André Lureau <marcandre.lureau@redhat.com>

Allow to build & use the DBus display without 3d/GPU acceleration support.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 meson.build             |  2 --
 ui/dbus-listener.c      | 15 +++++++++++++--
 ui/dbus.c               |  8 ++++++++
 tests/qtest/meson.build |  2 +-
 ui/meson.build          |  4 ++--
 5 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/meson.build b/meson.build
index 6bcab8bf0d..a73d050946 100644
--- a/meson.build
+++ b/meson.build
@@ -1746,8 +1746,6 @@ dbus_display = get_option('dbus_display') \
            error_message: '-display dbus requires glib>=2.64') \
   .require(gdbus_codegen.found(),
            error_message: gdbus_codegen_error.format('-display dbus')) \
-  .require(opengl.found() and gbm.found(),
-           error_message: '-display dbus requires epoxy/egl and gbm') \
   .allowed()
 
 have_virtfs = get_option('virtfs') \
diff --git a/ui/dbus-listener.c b/ui/dbus-listener.c
index 2e87ed7e9a..85692f1b27 100644
--- a/ui/dbus-listener.c
+++ b/ui/dbus-listener.c
@@ -27,9 +27,11 @@
 #include "dbus.h"
 #include <gio/gunixfdlist.h>
 
+#ifdef CONFIG_OPENGL
 #include "ui/shader.h"
 #include "ui/egl-helpers.h"
 #include "ui/egl-context.h"
+#endif
 #include "trace.h"
 
 struct _DBusDisplayListener {
@@ -48,6 +50,7 @@ struct _DBusDisplayListener {
 
 G_DEFINE_TYPE(DBusDisplayListener, dbus_display_listener, G_TYPE_OBJECT)
 
+#ifdef CONFIG_OPENGL
 static void dbus_update_gl_cb(GObject *source_object,
                            GAsyncResult *res,
                            gpointer user_data)
@@ -229,12 +232,14 @@ static void dbus_gl_refresh(DisplayChangeListener *dcl)
         ddl->gl_updates = 0;
     }
 }
+#endif
 
 static void dbus_refresh(DisplayChangeListener *dcl)
 {
     graphic_hw_update(dcl->con);
 }
 
+#ifdef CONFIG_OPENGL
 static void dbus_gl_gfx_update(DisplayChangeListener *dcl,
                                int x, int y, int w, int h)
 {
@@ -242,6 +247,7 @@ static void dbus_gl_gfx_update(DisplayChangeListener *dcl,
 
     ddl->gl_updates++;
 }
+#endif
 
 static void dbus_gfx_update(DisplayChangeListener *dcl,
                             int x, int y, int w, int h)
@@ -296,6 +302,7 @@ static void dbus_gfx_update(DisplayChangeListener *dcl,
         DBUS_DEFAULT_TIMEOUT, NULL, NULL, NULL);
 }
 
+#ifdef CONFIG_OPENGL
 static void dbus_gl_gfx_switch(DisplayChangeListener *dcl,
                                struct DisplaySurface *new_surface)
 {
@@ -311,6 +318,7 @@ static void dbus_gl_gfx_switch(DisplayChangeListener *dcl,
                              width, height, 0, 0, width, height);
     }
 }
+#endif
 
 static void dbus_gfx_switch(DisplayChangeListener *dcl,
                             struct DisplaySurface *new_surface)
@@ -361,6 +369,7 @@ static void dbus_cursor_define(DisplayChangeListener *dcl,
         NULL);
 }
 
+#ifdef CONFIG_OPENGL
 const DisplayChangeListenerOps dbus_gl_dcl_ops = {
     .dpy_name                = "dbus-gl",
     .dpy_gfx_update          = dbus_gl_gfx_update,
@@ -378,6 +387,7 @@ const DisplayChangeListenerOps dbus_gl_dcl_ops = {
     .dpy_gl_release_dmabuf   = dbus_release_dmabuf,
     .dpy_gl_update           = dbus_scanout_update,
 };
+#endif
 
 const DisplayChangeListenerOps dbus_dcl_ops = {
     .dpy_name                = "dbus",
@@ -406,11 +416,12 @@ dbus_display_listener_constructed(GObject *object)
 {
     DBusDisplayListener *ddl = DBUS_DISPLAY_LISTENER(object);
 
+    ddl->dcl.ops = &dbus_dcl_ops;
+#ifdef CONFIG_OPENGL
     if (display_opengl) {
         ddl->dcl.ops = &dbus_gl_dcl_ops;
-    } else {
-        ddl->dcl.ops = &dbus_dcl_ops;
     }
+#endif
 
     G_OBJECT_CLASS(dbus_display_listener_parent_class)->constructed(object);
 }
diff --git a/ui/dbus.c b/ui/dbus.c
index ebf03bd84d..904f5a0a6d 100644
--- a/ui/dbus.c
+++ b/ui/dbus.c
@@ -30,8 +30,10 @@
 #include "qom/object_interfaces.h"
 #include "sysemu/sysemu.h"
 #include "ui/dbus-module.h"
+#ifdef CONFIG_OPENGL
 #include "ui/egl-helpers.h"
 #include "ui/egl-context.h"
+#endif
 #include "audio/audio.h"
 #include "audio/audio_int.h"
 #include "qapi/error.h"
@@ -41,6 +43,7 @@
 
 static DBusDisplay *dbus_display;
 
+#ifdef CONFIG_OPENGL
 static QEMUGLContext dbus_create_context(DisplayGLCtx *dgc,
                                          QEMUGLParams *params)
 {
@@ -84,6 +87,7 @@ static const DisplayGLCtxOps dbus_gl_ops = {
     .dpy_gl_ctx_destroy_texture = dbus_destroy_texture,
     .dpy_gl_ctx_update_texture = dbus_update_texture,
 };
+#endif
 
 static NotifierList dbus_display_notifiers =
     NOTIFIER_LIST_INITIALIZER(dbus_display_notifiers);
@@ -112,10 +116,12 @@ dbus_display_init(Object *o)
     DBusDisplay *dd = DBUS_DISPLAY(o);
     g_autoptr(GDBusObjectSkeleton) vm = NULL;
 
+#ifdef CONFIG_OPENGL
     dd->glctx.ops = &dbus_gl_ops;
     if (display_opengl) {
         dd->glctx.gls = qemu_gl_init_shader();
     }
+#endif
     dd->iface = qemu_dbus_display1_vm_skeleton_new();
     dd->consoles = g_ptr_array_new_with_free_func(g_object_unref);
 
@@ -152,7 +158,9 @@ dbus_display_finalize(Object *o)
     g_clear_object(&dd->iface);
     g_free(dd->dbus_addr);
     g_free(dd->audiodev);
+#ifdef CONFIG_OPENGL
     g_clear_pointer(&dd->glctx.gls, qemu_gl_fini_shader);
+#endif
     dbus_display = NULL;
 }
 
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index 29a4efb4c2..f23a4aaa24 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -101,7 +101,7 @@ qtests_i386 = \
    'numa-test'
   ]
 
-if dbus_display
+if dbus_display and targetos != 'windows'
   qtests_i386 += ['dbus-display-test']
 endif
 
diff --git a/ui/meson.build b/ui/meson.build
index 0b2d0d21d1..330369707d 100644
--- a/ui/meson.build
+++ b/ui/meson.build
@@ -85,7 +85,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, opengl, gbm, dbus_display1_dep],
+  dbus_ss.add(when: [gio, pixman, dbus_display1_dep],
               if_true: [files(
                 'dbus-chardev.c',
                 'dbus-clipboard.c',
@@ -93,7 +93,7 @@ if dbus_display
                 'dbus-error.c',
                 'dbus-listener.c',
                 'dbus.c',
-              )])
+              ), opengl, gbm])
   ui_modules += {'dbus' : dbus_ss}
 endif
 
-- 
2.39.2


Re: [PATCH v2 17/18] ui/dbus: do not require opengl & gbm
Posted by Marc-André Lureau 2 years, 4 months ago
Hi

On Tue, Mar 7, 2023 at 3:59 PM <marcandre.lureau@redhat.com> wrote:
>
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
>
> Allow to build & use the DBus display without 3d/GPU acceleration support.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  meson.build             |  2 --
>  ui/dbus-listener.c      | 15 +++++++++++++--
>  ui/dbus.c               |  8 ++++++++
>  tests/qtest/meson.build |  2 +-
>  ui/meson.build          |  4 ++--
>  5 files changed, 24 insertions(+), 7 deletions(-)
>
> diff --git a/meson.build b/meson.build
> index 6bcab8bf0d..a73d050946 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -1746,8 +1746,6 @@ dbus_display = get_option('dbus_display') \
>             error_message: '-display dbus requires glib>=2.64') \
>    .require(gdbus_codegen.found(),
>             error_message: gdbus_codegen_error.format('-display dbus')) \
> -  .require(opengl.found() and gbm.found(),
> -           error_message: '-display dbus requires epoxy/egl and gbm') \
>    .allowed()

This change enables compilation of dbus on win32, although it requires
additional fixes. I'll update it with:
+  .require(targetos != 'windows',
+           error_message: '-display dbus is not available on Windows') \

>
>  have_virtfs = get_option('virtfs') \
> diff --git a/ui/dbus-listener.c b/ui/dbus-listener.c
> index 2e87ed7e9a..85692f1b27 100644
> --- a/ui/dbus-listener.c
> +++ b/ui/dbus-listener.c
> @@ -27,9 +27,11 @@
>  #include "dbus.h"
>  #include <gio/gunixfdlist.h>
>
> +#ifdef CONFIG_OPENGL
>  #include "ui/shader.h"
>  #include "ui/egl-helpers.h"
>  #include "ui/egl-context.h"
> +#endif
>  #include "trace.h"
>
>  struct _DBusDisplayListener {
> @@ -48,6 +50,7 @@ struct _DBusDisplayListener {
>
>  G_DEFINE_TYPE(DBusDisplayListener, dbus_display_listener, G_TYPE_OBJECT)
>
> +#ifdef CONFIG_OPENGL
>  static void dbus_update_gl_cb(GObject *source_object,
>                             GAsyncResult *res,
>                             gpointer user_data)
> @@ -229,12 +232,14 @@ static void dbus_gl_refresh(DisplayChangeListener *dcl)
>          ddl->gl_updates = 0;
>      }
>  }
> +#endif
>
>  static void dbus_refresh(DisplayChangeListener *dcl)
>  {
>      graphic_hw_update(dcl->con);
>  }
>
> +#ifdef CONFIG_OPENGL
>  static void dbus_gl_gfx_update(DisplayChangeListener *dcl,
>                                 int x, int y, int w, int h)
>  {
> @@ -242,6 +247,7 @@ static void dbus_gl_gfx_update(DisplayChangeListener *dcl,
>
>      ddl->gl_updates++;
>  }
> +#endif
>
>  static void dbus_gfx_update(DisplayChangeListener *dcl,
>                              int x, int y, int w, int h)
> @@ -296,6 +302,7 @@ static void dbus_gfx_update(DisplayChangeListener *dcl,
>          DBUS_DEFAULT_TIMEOUT, NULL, NULL, NULL);
>  }
>
> +#ifdef CONFIG_OPENGL
>  static void dbus_gl_gfx_switch(DisplayChangeListener *dcl,
>                                 struct DisplaySurface *new_surface)
>  {
> @@ -311,6 +318,7 @@ static void dbus_gl_gfx_switch(DisplayChangeListener *dcl,
>                               width, height, 0, 0, width, height);
>      }
>  }
> +#endif
>
>  static void dbus_gfx_switch(DisplayChangeListener *dcl,
>                              struct DisplaySurface *new_surface)
> @@ -361,6 +369,7 @@ static void dbus_cursor_define(DisplayChangeListener *dcl,
>          NULL);
>  }
>
> +#ifdef CONFIG_OPENGL
>  const DisplayChangeListenerOps dbus_gl_dcl_ops = {
>      .dpy_name                = "dbus-gl",
>      .dpy_gfx_update          = dbus_gl_gfx_update,
> @@ -378,6 +387,7 @@ const DisplayChangeListenerOps dbus_gl_dcl_ops = {
>      .dpy_gl_release_dmabuf   = dbus_release_dmabuf,
>      .dpy_gl_update           = dbus_scanout_update,
>  };
> +#endif
>
>  const DisplayChangeListenerOps dbus_dcl_ops = {
>      .dpy_name                = "dbus",
> @@ -406,11 +416,12 @@ dbus_display_listener_constructed(GObject *object)
>  {
>      DBusDisplayListener *ddl = DBUS_DISPLAY_LISTENER(object);
>
> +    ddl->dcl.ops = &dbus_dcl_ops;
> +#ifdef CONFIG_OPENGL
>      if (display_opengl) {
>          ddl->dcl.ops = &dbus_gl_dcl_ops;
> -    } else {
> -        ddl->dcl.ops = &dbus_dcl_ops;
>      }
> +#endif
>
>      G_OBJECT_CLASS(dbus_display_listener_parent_class)->constructed(object);
>  }
> diff --git a/ui/dbus.c b/ui/dbus.c
> index ebf03bd84d..904f5a0a6d 100644
> --- a/ui/dbus.c
> +++ b/ui/dbus.c
> @@ -30,8 +30,10 @@
>  #include "qom/object_interfaces.h"
>  #include "sysemu/sysemu.h"
>  #include "ui/dbus-module.h"
> +#ifdef CONFIG_OPENGL
>  #include "ui/egl-helpers.h"
>  #include "ui/egl-context.h"
> +#endif
>  #include "audio/audio.h"
>  #include "audio/audio_int.h"
>  #include "qapi/error.h"
> @@ -41,6 +43,7 @@
>
>  static DBusDisplay *dbus_display;
>
> +#ifdef CONFIG_OPENGL
>  static QEMUGLContext dbus_create_context(DisplayGLCtx *dgc,
>                                           QEMUGLParams *params)
>  {
> @@ -84,6 +87,7 @@ static const DisplayGLCtxOps dbus_gl_ops = {
>      .dpy_gl_ctx_destroy_texture = dbus_destroy_texture,
>      .dpy_gl_ctx_update_texture = dbus_update_texture,
>  };
> +#endif
>
>  static NotifierList dbus_display_notifiers =
>      NOTIFIER_LIST_INITIALIZER(dbus_display_notifiers);
> @@ -112,10 +116,12 @@ dbus_display_init(Object *o)
>      DBusDisplay *dd = DBUS_DISPLAY(o);
>      g_autoptr(GDBusObjectSkeleton) vm = NULL;
>
> +#ifdef CONFIG_OPENGL
>      dd->glctx.ops = &dbus_gl_ops;
>      if (display_opengl) {
>          dd->glctx.gls = qemu_gl_init_shader();
>      }
> +#endif
>      dd->iface = qemu_dbus_display1_vm_skeleton_new();
>      dd->consoles = g_ptr_array_new_with_free_func(g_object_unref);
>
> @@ -152,7 +158,9 @@ dbus_display_finalize(Object *o)
>      g_clear_object(&dd->iface);
>      g_free(dd->dbus_addr);
>      g_free(dd->audiodev);
> +#ifdef CONFIG_OPENGL
>      g_clear_pointer(&dd->glctx.gls, qemu_gl_fini_shader);
> +#endif
>      dbus_display = NULL;
>  }
>
> diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
> index 29a4efb4c2..f23a4aaa24 100644
> --- a/tests/qtest/meson.build
> +++ b/tests/qtest/meson.build
> @@ -101,7 +101,7 @@ qtests_i386 = \
>     'numa-test'
>    ]
>
> -if dbus_display
> +if dbus_display and targetos != 'windows'
>    qtests_i386 += ['dbus-display-test']
>  endif
>
> diff --git a/ui/meson.build b/ui/meson.build
> index 0b2d0d21d1..330369707d 100644
> --- a/ui/meson.build
> +++ b/ui/meson.build
> @@ -85,7 +85,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, opengl, gbm, dbus_display1_dep],
> +  dbus_ss.add(when: [gio, pixman, dbus_display1_dep],
>                if_true: [files(
>                  'dbus-chardev.c',
>                  'dbus-clipboard.c',
> @@ -93,7 +93,7 @@ if dbus_display
>                  'dbus-error.c',
>                  'dbus-listener.c',
>                  'dbus.c',
> -              )])
> +              ), opengl, gbm])
>    ui_modules += {'dbus' : dbus_ss}
>  endif
>
> --
> 2.39.2
>
>


-- 
Marc-André Lureau