Skip to content

Commit

Permalink
ui: Create sync objects and fences only for blobs
Browse files Browse the repository at this point in the history
Create sync objects and fences only for dmabufs that are blobs. Once a
fence is created (after glFlush) and is signalled,
graphic_hw_gl_flushed() will be called and virtio-gpu cmd processing
will be resumed.

Cc: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com>
Message-Id: <20210914211837.3229977-4-vivek.kasireddy@intel.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
  • Loading branch information
vivekkreddy authored and kraxel committed Sep 15, 2021
1 parent 121abaf commit 65b847d
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 0 deletions.
1 change: 1 addition & 0 deletions hw/display/virtio-gpu-udmabuf.c
Expand Up @@ -185,6 +185,7 @@ static VGPUDMABuf
dmabuf->buf.stride = fb->stride;
dmabuf->buf.fourcc = qemu_pixman_to_drm_format(fb->format);
dmabuf->buf.fd = res->dmabuf_fd;
dmabuf->buf.allow_fences = true;

dmabuf->scanout_id = scanout_id;
QTAILQ_INSERT_HEAD(&g->dmabuf.bufs, dmabuf, next);
Expand Down
1 change: 1 addition & 0 deletions include/ui/console.h
Expand Up @@ -170,6 +170,7 @@ typedef struct QemuDmaBuf {
bool y0_top;
void *sync;
int fence_fd;
bool allow_fences;
} QemuDmaBuf;

typedef struct DisplayState DisplayState;
Expand Down
1 change: 1 addition & 0 deletions include/ui/egl-helpers.h
Expand Up @@ -19,6 +19,7 @@ typedef struct egl_fb {
GLuint texture;
GLuint framebuffer;
bool delete_texture;
QemuDmaBuf *dmabuf;
} egl_fb;

void egl_fb_destroy(egl_fb *fb);
Expand Down
1 change: 1 addition & 0 deletions include/ui/gtk.h
Expand Up @@ -155,6 +155,7 @@ extern bool gtk_use_gl_area;
/* ui/gtk.c */
void gd_update_windowsize(VirtualConsole *vc);
int gd_monitor_update_interval(GtkWidget *widget);
void gd_hw_gl_flushed(void *vc);

/* ui/gtk-egl.c */
void gd_egl_init(VirtualConsole *vc);
Expand Down
25 changes: 25 additions & 0 deletions ui/gtk-egl.c
Expand Up @@ -12,6 +12,7 @@
*/

#include "qemu/osdep.h"
#include "qemu/main-loop.h"

#include "trace.h"

Expand Down Expand Up @@ -94,6 +95,18 @@ void gd_egl_draw(VirtualConsole *vc)
}

glFlush();
#ifdef CONFIG_GBM
if (vc->gfx.guest_fb.dmabuf) {
QemuDmaBuf *dmabuf = vc->gfx.guest_fb.dmabuf;

egl_dmabuf_create_fence(dmabuf);
if (dmabuf->fence_fd > 0) {
qemu_set_fd_handler(dmabuf->fence_fd, gd_hw_gl_flushed, NULL, vc);
return;
}
graphic_hw_gl_block(vc->gfx.dcl.con, false);
}
#endif
graphic_hw_gl_flushed(vc->gfx.dcl.con);
}

Expand Down Expand Up @@ -209,6 +222,8 @@ void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl,
QemuDmaBuf *dmabuf)
{
#ifdef CONFIG_GBM
VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);

egl_dmabuf_import_texture(dmabuf);
if (!dmabuf->texture) {
return;
Expand All @@ -217,6 +232,10 @@ void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl,
gd_egl_scanout_texture(dcl, dmabuf->texture,
false, dmabuf->width, dmabuf->height,
0, 0, dmabuf->width, dmabuf->height);

if (dmabuf->allow_fences) {
vc->gfx.guest_fb.dmabuf = dmabuf;
}
#endif
}

Expand Down Expand Up @@ -281,6 +300,12 @@ void gd_egl_scanout_flush(DisplayChangeListener *dcl,
egl_fb_blit(&vc->gfx.win_fb, &vc->gfx.guest_fb, !vc->gfx.y0_top);
}

#ifdef CONFIG_GBM
if (vc->gfx.guest_fb.dmabuf) {
egl_dmabuf_create_sync(vc->gfx.guest_fb.dmabuf);
}
#endif

eglSwapBuffers(qemu_egl_display, vc->gfx.esurface);
}

Expand Down
26 changes: 26 additions & 0 deletions ui/gtk-gl-area.c
Expand Up @@ -8,6 +8,7 @@
*/

#include "qemu/osdep.h"
#include "qemu/main-loop.h"

#include "trace.h"

Expand Down Expand Up @@ -71,7 +72,25 @@ void gd_gl_area_draw(VirtualConsole *vc)
surface_gl_render_texture(vc->gfx.gls, vc->gfx.ds);
}

#ifdef CONFIG_GBM
if (vc->gfx.guest_fb.dmabuf) {
egl_dmabuf_create_sync(vc->gfx.guest_fb.dmabuf);
}
#endif

glFlush();
#ifdef CONFIG_GBM
if (vc->gfx.guest_fb.dmabuf) {
QemuDmaBuf *dmabuf = vc->gfx.guest_fb.dmabuf;

egl_dmabuf_create_fence(dmabuf);
if (dmabuf->fence_fd > 0) {
qemu_set_fd_handler(dmabuf->fence_fd, gd_hw_gl_flushed, NULL, vc);
return;
}
graphic_hw_gl_block(vc->gfx.dcl.con, false);
}
#endif
graphic_hw_gl_flushed(vc->gfx.dcl.con);
}

Expand Down Expand Up @@ -213,6 +232,9 @@ void gd_gl_area_scanout_flush(DisplayChangeListener *dcl,
{
VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);

if (vc->gfx.guest_fb.dmabuf) {
graphic_hw_gl_block(vc->gfx.dcl.con, true);
}
gtk_gl_area_queue_render(GTK_GL_AREA(vc->gfx.drawing_area));
}

Expand All @@ -231,6 +253,10 @@ void gd_gl_area_scanout_dmabuf(DisplayChangeListener *dcl,
gd_gl_area_scanout_texture(dcl, dmabuf->texture,
false, dmabuf->width, dmabuf->height,
0, 0, dmabuf->width, dmabuf->height);

if (dmabuf->allow_fences) {
vc->gfx.guest_fb.dmabuf = dmabuf;
}
#endif
}

Expand Down
13 changes: 13 additions & 0 deletions ui/gtk.c
Expand Up @@ -36,6 +36,7 @@
#include "qapi/qapi-commands-machine.h"
#include "qapi/qapi-commands-misc.h"
#include "qemu/cutils.h"
#include "qemu/main-loop.h"

#include "ui/console.h"
#include "ui/gtk.h"
Expand Down Expand Up @@ -583,6 +584,18 @@ static void gd_gl_release_dmabuf(DisplayChangeListener *dcl,
#endif
}

void gd_hw_gl_flushed(void *vcon)
{
VirtualConsole *vc = vcon;
QemuDmaBuf *dmabuf = vc->gfx.guest_fb.dmabuf;

graphic_hw_gl_block(vc->gfx.dcl.con, false);
graphic_hw_gl_flushed(vc->gfx.dcl.con);
qemu_set_fd_handler(dmabuf->fence_fd, NULL, NULL, NULL);
close(dmabuf->fence_fd);
dmabuf->fence_fd = -1;
}

/** DisplayState Callbacks (opengl version) **/

static const DisplayChangeListenerOps dcl_gl_area_ops = {
Expand Down

0 comments on commit 65b847d

Please sign in to comment.