diff mbox series

[v1] ui/gtk-egl: Check for a valid context before making EGL calls

Message ID 20220307042108.296428-1-vivek.kasireddy@intel.com (mailing list archive)
State New, archived
Headers show
Series [v1] ui/gtk-egl: Check for a valid context before making EGL calls | expand

Commit Message

Kasireddy, Vivek March 7, 2022, 4:21 a.m. UTC
Since not all listeners (i.e VirtualConsoles) of GL events have
a valid EGL context, make sure that there is a valid context
before making EGL calls.

This fixes the following crash seen while launching the VM with
"-device virtio-gpu-pci,max_outputs=1,blob=true -display gtk,gl=on"

No provider of eglCreateImageKHR found.  Requires one of:
EGL_KHR_image
EGL_KHR_image_base

Fixes: 7cc712e9862ff ("ui: dispatch GL events to all listeners")

Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Dongwon Kim <dongwon.kim@intel.com>
Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com>
---
 ui/gtk-egl.c | 8 ++++++++
 1 file changed, 8 insertions(+)

Comments

Marc-André Lureau March 7, 2022, 7:50 a.m. UTC | #1
Hi Vivek

On Mon, Mar 7, 2022 at 8:39 AM Vivek Kasireddy
<vivek.kasireddy@intel.com> wrote:
>
> Since not all listeners (i.e VirtualConsoles) of GL events have
> a valid EGL context, make sure that there is a valid context
> before making EGL calls.
>
> This fixes the following crash seen while launching the VM with
> "-device virtio-gpu-pci,max_outputs=1,blob=true -display gtk,gl=on"
>
> No provider of eglCreateImageKHR found.  Requires one of:
> EGL_KHR_image
> EGL_KHR_image_base
>
> Fixes: 7cc712e9862ff ("ui: dispatch GL events to all listeners")

I am not able to reproduce on current master.

Isn't it fixed with commit a9fbce5e9 ("ui/console: fix crash when
using gl context with non-gl listeners") ?

Could you also check after "[PATCH v3 00/12] GL & D-Bus display related fixes" ?

thanks

>
> Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
> Cc: Gerd Hoffmann <kraxel@redhat.com>
> Cc: Dongwon Kim <dongwon.kim@intel.com>
> Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com>
> ---
>  ui/gtk-egl.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
>
> diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
> index e3bd4bc274..31175827d0 100644
> --- a/ui/gtk-egl.c
> +++ b/ui/gtk-egl.c
> @@ -244,6 +244,10 @@ void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl,
>  #ifdef CONFIG_GBM
>      VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
>
> +    if (!vc->gfx.ectx || !vc->gfx.esurface) {
> +        return;
> +    }
> +
>      eglMakeCurrent(qemu_egl_display, vc->gfx.esurface,
>                     vc->gfx.esurface, vc->gfx.ectx);
>
> @@ -269,6 +273,10 @@ void gd_egl_cursor_dmabuf(DisplayChangeListener *dcl,
>  #ifdef CONFIG_GBM
>      VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
>
> +    if (!vc->gfx.ectx || !vc->gfx.esurface) {
> +        return;
> +    }
> +
>      if (dmabuf) {
>          egl_dmabuf_import_texture(dmabuf);
>          if (!dmabuf->texture) {
> --
> 2.35.1
>
Kasireddy, Vivek March 7, 2022, 6 p.m. UTC | #2
Hi Marc-Andre,

> 
> Hi Vivek
> 
> On Mon, Mar 7, 2022 at 8:39 AM Vivek Kasireddy
> <vivek.kasireddy@intel.com> wrote:
> >
> > Since not all listeners (i.e VirtualConsoles) of GL events have
> > a valid EGL context, make sure that there is a valid context
> > before making EGL calls.
> >
> > This fixes the following crash seen while launching the VM with
> > "-device virtio-gpu-pci,max_outputs=1,blob=true -display gtk,gl=on"
> >
> > No provider of eglCreateImageKHR found.  Requires one of:
> > EGL_KHR_image
> > EGL_KHR_image_base
> >
> > Fixes: 7cc712e9862ff ("ui: dispatch GL events to all listeners")
> 
> I am not able to reproduce on current master.
[Kasireddy, Vivek] I can still see it with current master. I think this issue
is only seen when running Qemu in an Xorg based Host environment and
cannot be reproduced in a Wayland based environment -- as Qemu UI 
uses the GLArea widget in the Wayland case where the EGL context
is managed by GTK.

> 
> Isn't it fixed with commit a9fbce5e9 ("ui/console: fix crash when
> using gl context with non-gl listeners") ?
[Kasireddy, Vivek] No, it unfortunately does not fix the issue I am seeing. In 
my case, there are three VirtualConsoles created ("parallel0", "compatmonitor0",
"virtio-gpu-pci") and all three of them seem to have a valid dpy_gl_scanout_dmabuf()
but only virtio-gpu-pci has a valid EGL context. 

> 
> Could you also check after "[PATCH v3 00/12] GL & D-Bus display related fixes" ?
[Kasireddy, Vivek] I can check but I don't think this issue can be fixed in ui/console.c
as all three VirtualConsoles pass the console_has_gl() check and one of the only things
that distinguishes them is whether they have a valid EGL context. 

Thanks,
Vivek

> 
> thanks
> 
> >
> > Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
> > Cc: Gerd Hoffmann <kraxel@redhat.com>
> > Cc: Dongwon Kim <dongwon.kim@intel.com>
> > Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com>
> > ---
> >  ui/gtk-egl.c | 8 ++++++++
> >  1 file changed, 8 insertions(+)
> >
> > diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
> > index e3bd4bc274..31175827d0 100644
> > --- a/ui/gtk-egl.c
> > +++ b/ui/gtk-egl.c
> > @@ -244,6 +244,10 @@ void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl,
> >  #ifdef CONFIG_GBM
> >      VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
> >
> > +    if (!vc->gfx.ectx || !vc->gfx.esurface) {
> > +        return;
> > +    }
> > +
> >      eglMakeCurrent(qemu_egl_display, vc->gfx.esurface,
> >                     vc->gfx.esurface, vc->gfx.ectx);
> >
> > @@ -269,6 +273,10 @@ void gd_egl_cursor_dmabuf(DisplayChangeListener *dcl,
> >  #ifdef CONFIG_GBM
> >      VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
> >
> > +    if (!vc->gfx.ectx || !vc->gfx.esurface) {
> > +        return;
> > +    }
> > +
> >      if (dmabuf) {
> >          egl_dmabuf_import_texture(dmabuf);
> >          if (!dmabuf->texture) {
> > --
> > 2.35.1
> >
Marc-André Lureau March 9, 2022, 10:37 a.m. UTC | #3
Hi

On Mon, Mar 7, 2022 at 10:00 PM Kasireddy, Vivek
<vivek.kasireddy@intel.com> wrote:
>
> Hi Marc-Andre,
>
> >
> > Hi Vivek
> >
> > On Mon, Mar 7, 2022 at 8:39 AM Vivek Kasireddy
> > <vivek.kasireddy@intel.com> wrote:
> > >
> > > Since not all listeners (i.e VirtualConsoles) of GL events have
> > > a valid EGL context, make sure that there is a valid context
> > > before making EGL calls.
> > >
> > > This fixes the following crash seen while launching the VM with
> > > "-device virtio-gpu-pci,max_outputs=1,blob=true -display gtk,gl=on"
> > >
> > > No provider of eglCreateImageKHR found.  Requires one of:
> > > EGL_KHR_image
> > > EGL_KHR_image_base
> > >
> > > Fixes: 7cc712e9862ff ("ui: dispatch GL events to all listeners")
> >
> > I am not able to reproduce on current master.
> [Kasireddy, Vivek] I can still see it with current master. I think this issue
> is only seen when running Qemu in an Xorg based Host environment and
> cannot be reproduced in a Wayland based environment -- as Qemu UI
> uses the GLArea widget in the Wayland case where the EGL context
> is managed by GTK.
>
> >
> > Isn't it fixed with commit a9fbce5e9 ("ui/console: fix crash when
> > using gl context with non-gl listeners") ?
> [Kasireddy, Vivek] No, it unfortunately does not fix the issue I am seeing. In
> my case, there are three VirtualConsoles created ("parallel0", "compatmonitor0",
> "virtio-gpu-pci") and all three of them seem to have a valid dpy_gl_scanout_dmabuf()
> but only virtio-gpu-pci has a valid EGL context.
>
> >
> > Could you also check after "[PATCH v3 00/12] GL & D-Bus display related fixes" ?
> [Kasireddy, Vivek] I can check but I don't think this issue can be fixed in ui/console.c
> as all three VirtualConsoles pass the console_has_gl() check and one of the only things
> that distinguishes them is whether they have a valid EGL context.
>

Under X11, I get the same error on v6.2.0 and master:
qemu-system-x86_64  -m 4G -object
memory-backend-memfd,id=mem,size=4G,share=on -machine
q35,accel=kvm,memory-backend=mem -device
virtio-gpu-pci,max_outputs=1,blob=true -display gtk,gl=on -cdrom
rawhide.iso
No provider of eglCreateImageKHR found.  Requires one of:
    EGL_KHR_image
    EGL_KHR_image_base

Note that with virtio-gpu-gl-pci I get:
qemu-system-x86_64: ../src/dispatch_common.c:868:
epoxy_get_proc_address: Assertion `0 && "Couldn't find current GLX or
EGL context.\n"' failed.
Kasireddy, Vivek April 4, 2022, 11:01 p.m. UTC | #4
Hi Marc-Andre,

> 
> Hi
> 
> On Mon, Mar 7, 2022 at 10:00 PM Kasireddy, Vivek
> <vivek.kasireddy@intel.com> wrote:
> >
> > Hi Marc-Andre,
> >
> > >
> > > Hi Vivek
> > >
> > > On Mon, Mar 7, 2022 at 8:39 AM Vivek Kasireddy
> > > <vivek.kasireddy@intel.com> wrote:
> > > >
> > > > Since not all listeners (i.e VirtualConsoles) of GL events have
> > > > a valid EGL context, make sure that there is a valid context
> > > > before making EGL calls.
> > > >
> > > > This fixes the following crash seen while launching the VM with
> > > > "-device virtio-gpu-pci,max_outputs=1,blob=true -display gtk,gl=on"
> > > >
> > > > No provider of eglCreateImageKHR found.  Requires one of:
> > > > EGL_KHR_image
> > > > EGL_KHR_image_base
> > > >
> > > > Fixes: 7cc712e9862ff ("ui: dispatch GL events to all listeners")
> > >
> > > I am not able to reproduce on current master.
> > [Kasireddy, Vivek] I can still see it with current master. I think this issue
> > is only seen when running Qemu in an Xorg based Host environment and
> > cannot be reproduced in a Wayland based environment -- as Qemu UI
> > uses the GLArea widget in the Wayland case where the EGL context
> > is managed by GTK.
> >
> > >
> > > Isn't it fixed with commit a9fbce5e9 ("ui/console: fix crash when
> > > using gl context with non-gl listeners") ?
> > [Kasireddy, Vivek] No, it unfortunately does not fix the issue I am seeing. In
> > my case, there are three VirtualConsoles created ("parallel0", "compatmonitor0",
> > "virtio-gpu-pci") and all three of them seem to have a valid dpy_gl_scanout_dmabuf()
> > but only virtio-gpu-pci has a valid EGL context.
> >
> > >
> > > Could you also check after "[PATCH v3 00/12] GL & D-Bus display related fixes" ?
> > [Kasireddy, Vivek] I can check but I don't think this issue can be fixed in ui/console.c
> > as all three VirtualConsoles pass the console_has_gl() check and one of the only things
> > that distinguishes them is whether they have a valid EGL context.
> >
> 
> Under X11, I get the same error on v6.2.0 and master:
> qemu-system-x86_64  -m 4G -object
> memory-backend-memfd,id=mem,size=4G,share=on -machine
> q35,accel=kvm,memory-backend=mem -device
> virtio-gpu-pci,max_outputs=1,blob=true -display gtk,gl=on -cdrom
> rawhide.iso
> No provider of eglCreateImageKHR found.  Requires one of:
>     EGL_KHR_image
>     EGL_KHR_image_base
> 
> Note that with virtio-gpu-gl-pci I get:
> qemu-system-x86_64: ../src/dispatch_common.c:868:
> epoxy_get_proc_address: Assertion `0 && "Couldn't find current GLX or
> EGL context.\n"' failed.
[Kasireddy, Vivek] It looks like this particular error and the one I saw are
both resolved by this commit:
Author: Akihiko Odaki <akihiko.odaki@gmail.com>
Date:   Sat Mar 26 01:12:16 2022 +0900

    ui/console: Check console before emitting GL event

On a completely different note, I am wondering if you have any plan to
eventually integrate the Rust based Gtk4 client into Qemu source repo?
Or, is it going to stay out-of-tree even after it is no longer WIP?

Thanks,
Vivek
diff mbox series

Patch

diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
index e3bd4bc274..31175827d0 100644
--- a/ui/gtk-egl.c
+++ b/ui/gtk-egl.c
@@ -244,6 +244,10 @@  void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl,
 #ifdef CONFIG_GBM
     VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
 
+    if (!vc->gfx.ectx || !vc->gfx.esurface) {
+        return;
+    }
+
     eglMakeCurrent(qemu_egl_display, vc->gfx.esurface,
                    vc->gfx.esurface, vc->gfx.ectx);
 
@@ -269,6 +273,10 @@  void gd_egl_cursor_dmabuf(DisplayChangeListener *dcl,
 #ifdef CONFIG_GBM
     VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
 
+    if (!vc->gfx.ectx || !vc->gfx.esurface) {
+        return;
+    }
+
     if (dmabuf) {
         egl_dmabuf_import_texture(dmabuf);
         if (!dmabuf->texture) {