Hi On Tue, Apr 16, 2024 at 3:11 AM <dongwon....@intel.com> wrote: > > From: Dongwon Kim <dongwon....@intel.com> > > This commit introduces dpy_gl_qemu_dmabuf_get_... helpers to extract > specific fields from the QemuDmaBuf struct. It also updates all instances > where fields within the QemuDmaBuf struct are directly accessed, replacing > them with calls to these new helper functions. > > Suggested-by: Marc-André Lureau <marcandre.lur...@redhat.com> > Cc: Philippe Mathieu-Daudé <phi...@linaro.org> > Cc: Vivek Kasireddy <vivek.kasire...@intel.com> > Signed-off-by: Dongwon Kim <dongwon....@intel.com> > --- > include/ui/console.h | 17 +++++ > hw/display/vhost-user-gpu.c | 6 +- > hw/display/virtio-gpu-udmabuf.c | 7 +- > hw/vfio/display.c | 15 +++-- > ui/console.c | 116 +++++++++++++++++++++++++++++++- > ui/dbus-console.c | 9 ++- > ui/dbus-listener.c | 43 +++++++----- > ui/egl-headless.c | 23 +++++-- > ui/egl-helpers.c | 47 +++++++------ > ui/gtk-egl.c | 48 ++++++++----- > ui/gtk-gl-area.c | 37 ++++++---- > ui/gtk.c | 6 +- > ui/spice-display.c | 50 ++++++++------ > 13 files changed, 316 insertions(+), 108 deletions(-) > > diff --git a/include/ui/console.h b/include/ui/console.h > index 0bc7a00ac0..6292943a82 100644 > --- a/include/ui/console.h > +++ b/include/ui/console.h > @@ -358,6 +358,23 @@ void dpy_gl_cursor_dmabuf(QemuConsole *con, QemuDmaBuf > *dmabuf, > bool have_hot, uint32_t hot_x, uint32_t hot_y); > void dpy_gl_cursor_position(QemuConsole *con, > uint32_t pos_x, uint32_t pos_y); > + > +int32_t dpy_gl_qemu_dmabuf_get_fd(QemuDmaBuf *dmabuf); > +uint32_t dpy_gl_qemu_dmabuf_get_width(QemuDmaBuf *dmabuf); > +uint32_t dpy_gl_qemu_dmabuf_get_height(QemuDmaBuf *dmabuf); > +uint32_t dpy_gl_qemu_dmabuf_get_stride(QemuDmaBuf *dmabuf); > +uint32_t dpy_gl_qemu_dmabuf_get_fourcc(QemuDmaBuf *dmabuf); > +uint64_t dpy_gl_qemu_dmabuf_get_modifier(QemuDmaBuf *dmabuf); > +uint32_t dpy_gl_qemu_dmabuf_get_texture(QemuDmaBuf *dmabuf); > +uint32_t dpy_gl_qemu_dmabuf_get_x(QemuDmaBuf *dmabuf); > +uint32_t dpy_gl_qemu_dmabuf_get_y(QemuDmaBuf *dmabuf); > +uint32_t dpy_gl_qemu_dmabuf_get_backing_width(QemuDmaBuf *dmabuf); > +uint32_t dpy_gl_qemu_dmabuf_get_backing_height(QemuDmaBuf *dmabuf); > +bool dpy_gl_qemu_dmabuf_get_y0_top(QemuDmaBuf *dmabuf); > +void *dpy_gl_qemu_dmabuf_get_sync(QemuDmaBuf *dmabuf); > +int32_t dpy_gl_qemu_dmabuf_get_fence_fd(QemuDmaBuf *dmabuf); > +bool dpy_gl_qemu_dmabuf_get_allow_fences(QemuDmaBuf *dmabuf); > +bool dpy_gl_qemu_dmabuf_get_draw_submitted(QemuDmaBuf *dmabuf); > void dpy_gl_release_dmabuf(QemuConsole *con, > QemuDmaBuf *dmabuf); > void dpy_gl_update(QemuConsole *con, > diff --git a/hw/display/vhost-user-gpu.c b/hw/display/vhost-user-gpu.c > index 709c8a02a1..87dcfbca10 100644 > --- a/hw/display/vhost-user-gpu.c > +++ b/hw/display/vhost-user-gpu.c > @@ -249,6 +249,7 @@ vhost_user_gpu_handle_display(VhostUserGPU *g, > VhostUserGpuMsg *msg) > case VHOST_USER_GPU_DMABUF_SCANOUT: { > VhostUserGpuDMABUFScanout *m = &msg->payload.dmabuf_scanout; > int fd = qemu_chr_fe_get_msgfd(&g->vhost_chr); > + int old_fd; > QemuDmaBuf *dmabuf; > > if (m->scanout_id >= g->parent_obj.conf.max_outputs) { > @@ -262,8 +263,9 @@ vhost_user_gpu_handle_display(VhostUserGPU *g, > VhostUserGpuMsg *msg) > g->parent_obj.enable = 1; > con = g->parent_obj.scanout[m->scanout_id].con; > dmabuf = &g->dmabuf[m->scanout_id]; > - if (dmabuf->fd >= 0) { > - close(dmabuf->fd); > + old_fd = dpy_gl_qemu_dmabuf_get_fd(dmabuf); > + if (old_fd >= 0) { > + close(old_fd); > dmabuf->fd = -1; > } > dpy_gl_release_dmabuf(con, dmabuf); > diff --git a/hw/display/virtio-gpu-udmabuf.c b/hw/display/virtio-gpu-udmabuf.c > index d51184d658..e3f358b575 100644 > --- a/hw/display/virtio-gpu-udmabuf.c > +++ b/hw/display/virtio-gpu-udmabuf.c > @@ -206,6 +206,7 @@ int virtio_gpu_update_dmabuf(VirtIOGPU *g, > { > struct virtio_gpu_scanout *scanout = &g->parent_obj.scanout[scanout_id]; > VGPUDMABuf *new_primary, *old_primary = NULL; > + uint32_t width, height; > > new_primary = virtio_gpu_create_dmabuf(g, scanout_id, res, fb, r); > if (!new_primary) { > @@ -216,10 +217,10 @@ int virtio_gpu_update_dmabuf(VirtIOGPU *g, > old_primary = g->dmabuf.primary[scanout_id]; > } > > + width = dpy_gl_qemu_dmabuf_get_width(&new_primary->buf); > + height = dpy_gl_qemu_dmabuf_get_height(&new_primary->buf); > g->dmabuf.primary[scanout_id] = new_primary; > - qemu_console_resize(scanout->con, > - new_primary->buf.width, > - new_primary->buf.height); > + qemu_console_resize(scanout->con, width, height); > dpy_gl_scanout_dmabuf(scanout->con, &new_primary->buf); > > if (old_primary) { > diff --git a/hw/vfio/display.c b/hw/vfio/display.c > index 1aa440c663..f9c39cbd51 100644 > --- a/hw/vfio/display.c > +++ b/hw/vfio/display.c > @@ -259,9 +259,13 @@ static VFIODMABuf *vfio_display_get_dmabuf(VFIOPCIDevice > *vdev, > > static void vfio_display_free_one_dmabuf(VFIODisplay *dpy, VFIODMABuf > *dmabuf) > { > + int fd; > + > QTAILQ_REMOVE(&dpy->dmabuf.bufs, dmabuf, next); > + > + fd = dpy_gl_qemu_dmabuf_get_fd(&dmabuf->buf); > dpy_gl_release_dmabuf(dpy->con, &dmabuf->buf); > - close(dmabuf->buf.fd); > + close(fd); > g_free(dmabuf); > } > > @@ -286,6 +290,7 @@ static void vfio_display_dmabuf_update(void *opaque) > VFIOPCIDevice *vdev = opaque; > VFIODisplay *dpy = vdev->dpy; > VFIODMABuf *primary, *cursor; > + uint32_t width, height; > bool free_bufs = false, new_cursor = false; > > primary = vfio_display_get_dmabuf(vdev, DRM_PLANE_TYPE_PRIMARY); > @@ -296,10 +301,12 @@ static void vfio_display_dmabuf_update(void *opaque) > return; > } > > + width = dpy_gl_qemu_dmabuf_get_width(&primary->buf); > + height = dpy_gl_qemu_dmabuf_get_height(&primary->buf); > + > if (dpy->dmabuf.primary != primary) { > dpy->dmabuf.primary = primary; > - qemu_console_resize(dpy->con, > - primary->buf.width, primary->buf.height); > + qemu_console_resize(dpy->con, width, height); > dpy_gl_scanout_dmabuf(dpy->con, &primary->buf); > free_bufs = true; > } > @@ -328,7 +335,7 @@ static void vfio_display_dmabuf_update(void *opaque) > cursor->pos_updates = 0; > } > > - dpy_gl_update(dpy->con, 0, 0, primary->buf.width, primary->buf.height); > + dpy_gl_update(dpy->con, 0, 0, width, height); > > if (free_bufs) { > vfio_display_free_dmabufs(vdev); > diff --git a/ui/console.c b/ui/console.c > index 43226c5c14..5d5635f783 100644 > --- a/ui/console.c > +++ b/ui/console.c > @@ -1132,6 +1132,118 @@ void dpy_gl_cursor_position(QemuConsole *con, > } > } > > +int32_t dpy_gl_qemu_dmabuf_get_fd(QemuDmaBuf *dmabuf) > +{ > + assert(dmabuf != NULL); > + > + return dmabuf->fd; > +} > + > +uint32_t dpy_gl_qemu_dmabuf_get_width(QemuDmaBuf *dmabuf) > +{ > + assert(dmabuf != NULL); > + > + return dmabuf->width; > +} > + > +uint32_t dpy_gl_qemu_dmabuf_get_height(QemuDmaBuf *dmabuf) > +{ > + assert(dmabuf != NULL); > + > + return dmabuf->height; > +} > + > +uint32_t dpy_gl_qemu_dmabuf_get_stride(QemuDmaBuf *dmabuf) > +{ > + assert(dmabuf != NULL); > + > + return dmabuf->stride; > +} > + > +uint32_t dpy_gl_qemu_dmabuf_get_fourcc(QemuDmaBuf *dmabuf) > +{ > + assert(dmabuf != NULL); > + > + return dmabuf->fourcc; > +} > + > +uint64_t dpy_gl_qemu_dmabuf_get_modifier(QemuDmaBuf *dmabuf) > +{ > + assert(dmabuf != NULL); > + > + return dmabuf->modifier; > +} > + > +uint32_t dpy_gl_qemu_dmabuf_get_texture(QemuDmaBuf *dmabuf) > +{ > + assert(dmabuf != NULL); > + > + return dmabuf->texture; > +} > + > +uint32_t dpy_gl_qemu_dmabuf_get_x(QemuDmaBuf *dmabuf) > +{ > + assert(dmabuf != NULL); > + > + return dmabuf->x; > +} > + > +uint32_t dpy_gl_qemu_dmabuf_get_y(QemuDmaBuf *dmabuf) > +{ > + assert(dmabuf != NULL); > + > + return dmabuf->y; > +} > + > +uint32_t dpy_gl_qemu_dmabuf_get_backing_width(QemuDmaBuf *dmabuf) > +{ > + assert(dmabuf != NULL); > + > + return dmabuf->backing_width; > +} > + > +uint32_t dpy_gl_qemu_dmabuf_get_backing_height(QemuDmaBuf *dmabuf) > +{ > + assert(dmabuf != NULL); > + > + return dmabuf->backing_height; > +} > + > +bool dpy_gl_qemu_dmabuf_get_y0_top(QemuDmaBuf *dmabuf) > +{ > + assert(dmabuf != NULL); > + > + return dmabuf->y0_top; > +} > + > +void *dpy_gl_qemu_dmabuf_get_sync(QemuDmaBuf *dmabuf) > +{ > + assert(dmabuf != NULL); > + > + return dmabuf->sync; > +} > + > +int32_t dpy_gl_qemu_dmabuf_get_fence_fd(QemuDmaBuf *dmabuf) > +{ > + assert(dmabuf != NULL); > + > + return dmabuf->fence_fd; > +} > + > +bool dpy_gl_qemu_dmabuf_get_allow_fences(QemuDmaBuf *dmabuf) > +{ > + assert(dmabuf != NULL); > + > + return dmabuf->allow_fences; > +} > + > +bool dpy_gl_qemu_dmabuf_get_draw_submitted(QemuDmaBuf *dmabuf) > +{ > + assert(dmabuf != NULL); > + > + return dmabuf->draw_submitted; > +} > + > void dpy_gl_release_dmabuf(QemuConsole *con, > QemuDmaBuf *dmabuf) > { > @@ -1459,7 +1571,7 @@ int qemu_console_get_width(QemuConsole *con, int > fallback) > } > switch (con->scanout.kind) { > case SCANOUT_DMABUF: > - return con->scanout.dmabuf->width; > + return dpy_gl_qemu_dmabuf_get_width(con->scanout.dmabuf); > case SCANOUT_TEXTURE: > return con->scanout.texture.width; > case SCANOUT_SURFACE: > @@ -1476,7 +1588,7 @@ int qemu_console_get_height(QemuConsole *con, int > fallback) > } > switch (con->scanout.kind) { > case SCANOUT_DMABUF: > - return con->scanout.dmabuf->height; > + return dpy_gl_qemu_dmabuf_get_height(con->scanout.dmabuf); > case SCANOUT_TEXTURE: > return con->scanout.texture.height; > case SCANOUT_SURFACE: > diff --git a/ui/dbus-console.c b/ui/dbus-console.c > index 49da9ccc83..124fe16253 100644 > --- a/ui/dbus-console.c > +++ b/ui/dbus-console.c > @@ -110,11 +110,14 @@ static void > dbus_gl_scanout_dmabuf(DisplayChangeListener *dcl, > QemuDmaBuf *dmabuf) > { > + uint32_t width, height; > + > DBusDisplayConsole *ddc = container_of(dcl, DBusDisplayConsole, dcl); > > - dbus_display_console_set_size(ddc, > - dmabuf->width, > - dmabuf->height); > + width = dpy_gl_qemu_dmabuf_get_width(dmabuf); > + height = dpy_gl_qemu_dmabuf_get_height(dmabuf); > + > + dbus_display_console_set_size(ddc, width, height); > } > > static void > diff --git a/ui/dbus-listener.c b/ui/dbus-listener.c > index 4a0a5d78f9..c6c7d93753 100644 > --- a/ui/dbus-listener.c > +++ b/ui/dbus-listener.c > @@ -278,29 +278,33 @@ static void dbus_scanout_dmabuf(DisplayChangeListener > *dcl, > DBusDisplayListener *ddl = container_of(dcl, DBusDisplayListener, dcl); > g_autoptr(GError) err = NULL; > g_autoptr(GUnixFDList) fd_list = NULL; > + int fd; > + uint32_t width, height, stride, fourcc; > + uint64_t modifier; > + bool y0_top; > > + fd = dpy_gl_qemu_dmabuf_get_fd(dmabuf); > fd_list = g_unix_fd_list_new(); > - if (g_unix_fd_list_append(fd_list, dmabuf->fd, &err) != 0) { > + if (g_unix_fd_list_append(fd_list, fd, &err) != 0) { > error_report("Failed to setup dmabuf fdlist: %s", err->message); > return; > } > > ddl_discard_pending_messages(ddl); > > + width = dpy_gl_qemu_dmabuf_get_width(dmabuf); > + height = dpy_gl_qemu_dmabuf_get_height(dmabuf); > + stride = dpy_gl_qemu_dmabuf_get_stride(dmabuf); > + fourcc = dpy_gl_qemu_dmabuf_get_fourcc(dmabuf); > + modifier = dpy_gl_qemu_dmabuf_get_modifier(dmabuf); > + y0_top = dpy_gl_qemu_dmabuf_get_y0_top(dmabuf); > + > /* FIXME: add missing x/y/w/h support */ > qemu_dbus_display1_listener_call_scanout_dmabuf( > - ddl->proxy, > - g_variant_new_handle(0), > - dmabuf->width, > - dmabuf->height, > - dmabuf->stride, > - dmabuf->fourcc, > - dmabuf->modifier, > - dmabuf->y0_top, > - G_DBUS_CALL_FLAGS_NONE, > - -1, > - fd_list, > - NULL, NULL, NULL); > + ddl->proxy, g_variant_new_handle(0), > + width, height, stride, fourcc, modifier, > + y0_top, G_DBUS_CALL_FLAGS_NONE, > + -1, fd_list, NULL, NULL, NULL); > } > #endif /* GBM */ > #endif /* OPENGL */ > @@ -488,6 +492,7 @@ static void dbus_cursor_dmabuf(DisplayChangeListener *dcl, > DisplaySurface *ds; > GVariant *v_data = NULL; > egl_fb cursor_fb = EGL_FB_INIT; > + uint32_t width, height, texture; > > if (!dmabuf) { > qemu_dbus_display1_listener_call_mouse_set( > @@ -497,12 +502,16 @@ static void dbus_cursor_dmabuf(DisplayChangeListener > *dcl, > } > > egl_dmabuf_import_texture(dmabuf); > - if (!dmabuf->texture) { > + texture = dpy_gl_qemu_dmabuf_get_texture(dmabuf); > + if (!texture) { > return; > } > - egl_fb_setup_for_tex(&cursor_fb, dmabuf->width, dmabuf->height, > - dmabuf->texture, false); > - ds = qemu_create_displaysurface(dmabuf->width, dmabuf->height); > + > + width = dpy_gl_qemu_dmabuf_get_width(dmabuf); > + height = dpy_gl_qemu_dmabuf_get_height(dmabuf); > + > + egl_fb_setup_for_tex(&cursor_fb, width, height, texture, false); > + ds = qemu_create_displaysurface(width, height); > egl_fb_read(ds, &cursor_fb); > > v_data = g_variant_new_from_data( > diff --git a/ui/egl-headless.c b/ui/egl-headless.c > index d5637dadb2..158924379b 100644 > --- a/ui/egl-headless.c > +++ b/ui/egl-headless.c > @@ -85,29 +85,38 @@ static void egl_scanout_texture(DisplayChangeListener > *dcl, > static void egl_scanout_dmabuf(DisplayChangeListener *dcl, > QemuDmaBuf *dmabuf) > { > + uint32_t width, height, texture; > + > egl_dmabuf_import_texture(dmabuf); > - if (!dmabuf->texture) { > + texture = dpy_gl_qemu_dmabuf_get_texture(dmabuf); > + if (!texture) { > return; > } > > - egl_scanout_texture(dcl, dmabuf->texture, > - false, dmabuf->width, dmabuf->height, > - 0, 0, dmabuf->width, dmabuf->height, NULL); > + width = dpy_gl_qemu_dmabuf_get_width(dmabuf); > + height = dpy_gl_qemu_dmabuf_get_height(dmabuf); > + > + egl_scanout_texture(dcl, texture, false, width, height, 0, 0, > + width, height, NULL); > } > > static void egl_cursor_dmabuf(DisplayChangeListener *dcl, > QemuDmaBuf *dmabuf, bool have_hot, > uint32_t hot_x, uint32_t hot_y) > { > + uint32_t width, height, texture; > egl_dpy *edpy = container_of(dcl, egl_dpy, dcl); > > if (dmabuf) { > egl_dmabuf_import_texture(dmabuf); > - if (!dmabuf->texture) { > + texture = dpy_gl_qemu_dmabuf_get_texture(dmabuf); > + if (!texture) { > return; > } > - egl_fb_setup_for_tex(&edpy->cursor_fb, dmabuf->width, dmabuf->height, > - dmabuf->texture, false); > + > + width = dpy_gl_qemu_dmabuf_get_width(dmabuf); > + height = dpy_gl_qemu_dmabuf_get_height(dmabuf); > + egl_fb_setup_for_tex(&edpy->cursor_fb, width, height, texture, > false); > } else { > egl_fb_destroy(&edpy->cursor_fb); > } > diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c > index 3d19dbe382..86d64c68ce 100644 > --- a/ui/egl-helpers.c > +++ b/ui/egl-helpers.c > @@ -146,10 +146,10 @@ void egl_fb_blit(egl_fb *dst, egl_fb *src, bool flip) > glViewport(0, 0, dst->width, dst->height); > > if (src->dmabuf) { > - x1 = src->dmabuf->x; > - y1 = src->dmabuf->y; > - w = src->dmabuf->width; > - h = src->dmabuf->height; > + x1 = dpy_gl_qemu_dmabuf_get_x(src->dmabuf); > + y1 = dpy_gl_qemu_dmabuf_get_y(src->dmabuf); > + w = dpy_gl_qemu_dmabuf_get_width(src->dmabuf); > + h = dpy_gl_qemu_dmabuf_get_height(src->dmabuf); > } > > w = (x1 + w) > src->width ? src->width - x1 : w; > @@ -308,30 +308,33 @@ void egl_dmabuf_import_texture(QemuDmaBuf *dmabuf) > EGLImageKHR image = EGL_NO_IMAGE_KHR; > EGLint attrs[64]; > int i = 0; > + uint64_t modifier; > + uint32_t texture = dpy_gl_qemu_dmabuf_get_texture(dmabuf); > > - if (dmabuf->texture != 0) { > + if (texture != 0) { > return; > } > > attrs[i++] = EGL_WIDTH; > - attrs[i++] = dmabuf->backing_width; > + attrs[i++] = dpy_gl_qemu_dmabuf_get_backing_width(dmabuf); > attrs[i++] = EGL_HEIGHT; > - attrs[i++] = dmabuf->backing_height; > + attrs[i++] = dpy_gl_qemu_dmabuf_get_backing_height(dmabuf); > attrs[i++] = EGL_LINUX_DRM_FOURCC_EXT; > - attrs[i++] = dmabuf->fourcc; > + attrs[i++] = dpy_gl_qemu_dmabuf_get_fourcc(dmabuf); > > attrs[i++] = EGL_DMA_BUF_PLANE0_FD_EXT; > - attrs[i++] = dmabuf->fd; > + attrs[i++] = dpy_gl_qemu_dmabuf_get_fd(dmabuf); > attrs[i++] = EGL_DMA_BUF_PLANE0_PITCH_EXT; > - attrs[i++] = dmabuf->stride; > + attrs[i++] = dpy_gl_qemu_dmabuf_get_stride(dmabuf); > attrs[i++] = EGL_DMA_BUF_PLANE0_OFFSET_EXT; > attrs[i++] = 0; > #ifdef EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT > - if (dmabuf->modifier) { > + modifier = dpy_gl_qemu_dmabuf_get_modifier(dmabuf); > + if (modifier) { > attrs[i++] = EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT; > - attrs[i++] = (dmabuf->modifier >> 0) & 0xffffffff; > + attrs[i++] = (modifier >> 0) & 0xffffffff; > attrs[i++] = EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT; > - attrs[i++] = (dmabuf->modifier >> 32) & 0xffffffff; > + attrs[i++] = (modifier >> 32) & 0xffffffff; > } > #endif > attrs[i++] = EGL_NONE; > @@ -346,7 +349,8 @@ void egl_dmabuf_import_texture(QemuDmaBuf *dmabuf) > } > > glGenTextures(1, &dmabuf->texture); > - glBindTexture(GL_TEXTURE_2D, dmabuf->texture); > + texture = dpy_gl_qemu_dmabuf_get_texture(dmabuf); > + glBindTexture(GL_TEXTURE_2D, texture); > glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); > glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); > > @@ -356,11 +360,14 @@ void egl_dmabuf_import_texture(QemuDmaBuf *dmabuf) > > void egl_dmabuf_release_texture(QemuDmaBuf *dmabuf) > { > - if (dmabuf->texture == 0) { > + uint32_t texture; > + > + texture = dpy_gl_qemu_dmabuf_get_texture(dmabuf); > + if (texture == 0) { > return; > } > > - glDeleteTextures(1, &dmabuf->texture); > + glDeleteTextures(1, &texture); > dmabuf->texture = 0; > } > > @@ -382,10 +389,12 @@ void egl_dmabuf_create_sync(QemuDmaBuf *dmabuf) > > void egl_dmabuf_create_fence(QemuDmaBuf *dmabuf) > { > - if (dmabuf->sync) { > + void *sync = dpy_gl_qemu_dmabuf_get_sync(dmabuf); > + > + if (sync) { > dmabuf->fence_fd = eglDupNativeFenceFDANDROID(qemu_egl_display, > - dmabuf->sync); > - eglDestroySyncKHR(qemu_egl_display, dmabuf->sync); > + sync); > + eglDestroySyncKHR(qemu_egl_display, sync); > dmabuf->sync = NULL; > } > } > diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c > index 3af5ac5bcf..c9469af9ed 100644 > --- a/ui/gtk-egl.c > +++ b/ui/gtk-egl.c > @@ -70,6 +70,7 @@ void gd_egl_draw(VirtualConsole *vc) > QemuDmaBuf *dmabuf = vc->gfx.guest_fb.dmabuf; > #endif > int ww, wh, ws; > + int fence_fd; > > if (!vc->gfx.gls) { > return; > @@ -83,7 +84,7 @@ void gd_egl_draw(VirtualConsole *vc) > if (vc->gfx.scanout_mode) { > #ifdef CONFIG_GBM > if (dmabuf) { > - if (!dmabuf->draw_submitted) { > + if (!dpy_gl_qemu_dmabuf_get_draw_submitted(dmabuf)) { > return; > } else { > dmabuf->draw_submitted = false; > @@ -99,8 +100,9 @@ void gd_egl_draw(VirtualConsole *vc) > #ifdef CONFIG_GBM > if (dmabuf) { > egl_dmabuf_create_fence(dmabuf); > - if (dmabuf->fence_fd > 0) { > - qemu_set_fd_handler(dmabuf->fence_fd, gd_hw_gl_flushed, > NULL, vc); > + fence_fd = dpy_gl_qemu_dmabuf_get_fence_fd(dmabuf); > + if (fence_fd > 0) { > + qemu_set_fd_handler(fence_fd, gd_hw_gl_flushed, NULL, vc); > return; > } > graphic_hw_gl_block(vc->gfx.dcl.con, false); > @@ -149,7 +151,8 @@ void gd_egl_refresh(DisplayChangeListener *dcl) > gd_update_monitor_refresh_rate( > vc, vc->window ? vc->window : vc->gfx.drawing_area); > > - if (vc->gfx.guest_fb.dmabuf && vc->gfx.guest_fb.dmabuf->draw_submitted) { > + if (vc->gfx.guest_fb.dmabuf && > + dpy_gl_qemu_dmabuf_get_draw_submitted(vc->gfx.guest_fb.dmabuf)) { > return; > } > > @@ -264,22 +267,30 @@ void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl, > { > #ifdef CONFIG_GBM > VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl); > + uint32_t x, y, width, height, backing_width, backing_height, texture; > + bool y0_top; > > eglMakeCurrent(qemu_egl_display, vc->gfx.esurface, > vc->gfx.esurface, vc->gfx.ectx); > > egl_dmabuf_import_texture(dmabuf); > - if (!dmabuf->texture) { > + texture = dpy_gl_qemu_dmabuf_get_texture(dmabuf); > + if (!texture) { > return; > } > > - gd_egl_scanout_texture(dcl, dmabuf->texture, > - dmabuf->y0_top, > - dmabuf->backing_width, dmabuf->backing_height, > - dmabuf->x, dmabuf->y, dmabuf->width, > - dmabuf->height, NULL); > + x = dpy_gl_qemu_dmabuf_get_x(dmabuf); > + y = dpy_gl_qemu_dmabuf_get_y(dmabuf); > + width = dpy_gl_qemu_dmabuf_get_width(dmabuf); > + height = dpy_gl_qemu_dmabuf_get_height(dmabuf); > + backing_width = dpy_gl_qemu_dmabuf_get_backing_width(dmabuf); > + backing_height = dpy_gl_qemu_dmabuf_get_backing_height(dmabuf); > + y0_top = dpy_gl_qemu_dmabuf_get_y0_top(dmabuf); > > - if (dmabuf->allow_fences) { > + gd_egl_scanout_texture(dcl, texture, y0_top, backing_width, > backing_height, > + x, y, width, height, NULL); > + > + if (dpy_gl_qemu_dmabuf_get_allow_fences(dmabuf)) { > vc->gfx.guest_fb.dmabuf = dmabuf; > } > #endif > @@ -291,15 +302,19 @@ void gd_egl_cursor_dmabuf(DisplayChangeListener *dcl, > { > #ifdef CONFIG_GBM > VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl); > + uint32_t backing_width, backing_height, texture; > > if (dmabuf) { > egl_dmabuf_import_texture(dmabuf); > - if (!dmabuf->texture) { > + texture = dpy_gl_qemu_dmabuf_get_texture(dmabuf); > + if (!texture) { > return; > } > - egl_fb_setup_for_tex(&vc->gfx.cursor_fb, > - dmabuf->backing_width, dmabuf->backing_height, > - dmabuf->texture, false); > + > + backing_width = dpy_gl_qemu_dmabuf_get_backing_width(dmabuf); > + backing_height = dpy_gl_qemu_dmabuf_get_backing_height(dmabuf); > + egl_fb_setup_for_tex(&vc->gfx.cursor_fb, backing_width, > backing_height, > + texture, false); > } else { > egl_fb_destroy(&vc->gfx.cursor_fb); > } > @@ -363,7 +378,8 @@ void gd_egl_flush(DisplayChangeListener *dcl, > VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl); > GtkWidget *area = vc->gfx.drawing_area; > > - if (vc->gfx.guest_fb.dmabuf && !vc->gfx.guest_fb.dmabuf->draw_submitted) > { > + if (vc->gfx.guest_fb.dmabuf && > + !dpy_gl_qemu_dmabuf_get_draw_submitted(vc->gfx.guest_fb.dmabuf)) { > graphic_hw_gl_block(vc->gfx.dcl.con, true); > vc->gfx.guest_fb.dmabuf->draw_submitted = true; > gtk_egl_set_scanout_mode(vc, true); > diff --git a/ui/gtk-gl-area.c b/ui/gtk-gl-area.c > index 52dcac161e..193862ecc2 100644 > --- a/ui/gtk-gl-area.c > +++ b/ui/gtk-gl-area.c > @@ -60,7 +60,7 @@ void gd_gl_area_draw(VirtualConsole *vc) > > #ifdef CONFIG_GBM > if (dmabuf) { > - if (!dmabuf->draw_submitted) { > + if (!dpy_gl_qemu_dmabuf_get_draw_submitted(dmabuf)) { > return; > } else { > dmabuf->draw_submitted = false; > @@ -85,9 +85,11 @@ void gd_gl_area_draw(VirtualConsole *vc) > glFlush(); > #ifdef CONFIG_GBM > if (dmabuf) { > + int fence_fd; > egl_dmabuf_create_fence(dmabuf); > - if (dmabuf->fence_fd > 0) { > - qemu_set_fd_handler(dmabuf->fence_fd, gd_hw_gl_flushed, > NULL, vc); > + fence_fd = dpy_gl_qemu_dmabuf_get_fence_fd(dmabuf); > + if (fence_fd > 0) { > + qemu_set_fd_handler(fence_fd, gd_hw_gl_flushed, NULL, vc); > return; > } > graphic_hw_gl_block(vc->gfx.dcl.con, false); > @@ -125,7 +127,8 @@ void gd_gl_area_refresh(DisplayChangeListener *dcl) > > gd_update_monitor_refresh_rate(vc, vc->window ? vc->window : > vc->gfx.drawing_area); > > - if (vc->gfx.guest_fb.dmabuf && vc->gfx.guest_fb.dmabuf->draw_submitted) { > + if (vc->gfx.guest_fb.dmabuf && > + dpy_gl_qemu_dmabuf_get_draw_submitted(vc->gfx.guest_fb.dmabuf)) { > return; > } > > @@ -285,7 +288,8 @@ void gd_gl_area_scanout_flush(DisplayChangeListener *dcl, > { > VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl); > > - if (vc->gfx.guest_fb.dmabuf && !vc->gfx.guest_fb.dmabuf->draw_submitted) > { > + if (vc->gfx.guest_fb.dmabuf && > + !dpy_gl_qemu_dmabuf_get_draw_submitted(vc->gfx.guest_fb.dmabuf)) { > graphic_hw_gl_block(vc->gfx.dcl.con, true); > vc->gfx.guest_fb.dmabuf->draw_submitted = true; > gtk_gl_area_set_scanout_mode(vc, true); > @@ -298,20 +302,29 @@ void gd_gl_area_scanout_dmabuf(DisplayChangeListener > *dcl, > { > #ifdef CONFIG_GBM > VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl); > + uint32_t x, y, width, height, backing_width, backing_height, texture; > + bool y0_top; > > gtk_gl_area_make_current(GTK_GL_AREA(vc->gfx.drawing_area)); > egl_dmabuf_import_texture(dmabuf); > - if (!dmabuf->texture) { > + texture = dpy_gl_qemu_dmabuf_get_texture(dmabuf); > + if (!texture) { > return; > } > > - gd_gl_area_scanout_texture(dcl, dmabuf->texture, > - dmabuf->y0_top, > - dmabuf->backing_width, dmabuf->backing_height, > - dmabuf->x, dmabuf->y, dmabuf->width, > - dmabuf->height, NULL); > + x = dpy_gl_qemu_dmabuf_get_x(dmabuf); > + y = dpy_gl_qemu_dmabuf_get_y(dmabuf); > + width = dpy_gl_qemu_dmabuf_get_width(dmabuf); > + height = dpy_gl_qemu_dmabuf_get_height(dmabuf); > + backing_width = dpy_gl_qemu_dmabuf_get_backing_width(dmabuf); > + backing_height = dpy_gl_qemu_dmabuf_get_backing_height(dmabuf); > + y0_top = dpy_gl_qemu_dmabuf_get_y0_top(dmabuf); > > - if (dmabuf->allow_fences) { > + gd_gl_area_scanout_texture(dcl, texture, y0_top, > + backing_width, backing_height, > + x, y, width, height, NULL); > + > + if (dpy_gl_qemu_dmabuf_get_allow_fences(dmabuf)) { > vc->gfx.guest_fb.dmabuf = dmabuf; > } > #endif > diff --git a/ui/gtk.c b/ui/gtk.c > index 810d7fc796..2c054a42ba 100644 > --- a/ui/gtk.c > +++ b/ui/gtk.c > @@ -596,9 +596,11 @@ void gd_hw_gl_flushed(void *vcon) > { > VirtualConsole *vc = vcon; > QemuDmaBuf *dmabuf = vc->gfx.guest_fb.dmabuf; > + int fence_fd; > > - qemu_set_fd_handler(dmabuf->fence_fd, NULL, NULL, NULL); > - close(dmabuf->fence_fd); > + fence_fd = dpy_gl_qemu_dmabuf_get_fence_fd(dmabuf); > + qemu_set_fd_handler(fence_fd, NULL, NULL, NULL); > + close(fence_fd); > dmabuf->fence_fd = -1; > graphic_hw_gl_block(vc->gfx.dcl.con, false); > } > diff --git a/ui/spice-display.c b/ui/spice-display.c > index 6eb98a5a5c..fe49e910a0 100644 > --- a/ui/spice-display.c > +++ b/ui/spice-display.c > @@ -976,6 +976,7 @@ static void > qemu_spice_gl_cursor_dmabuf(DisplayChangeListener *dcl, > uint32_t hot_x, uint32_t hot_y) > { > SimpleSpiceDisplay *ssd = container_of(dcl, SimpleSpiceDisplay, dcl); > + uint32_t width, height, texture; > > ssd->have_hot = have_hot; > ssd->hot_x = hot_x; > @@ -984,11 +985,13 @@ static void > qemu_spice_gl_cursor_dmabuf(DisplayChangeListener *dcl, > trace_qemu_spice_gl_cursor(ssd->qxl.id, dmabuf != NULL, have_hot); > if (dmabuf) { > egl_dmabuf_import_texture(dmabuf); > - if (!dmabuf->texture) { > + texture = dpy_gl_dmabuf_get_texture(dmabuf);
Same as earlier: ../ui/spice-display.c:988:19: error: implicit declaration of function ‘dpy_gl_dmabuf_get_texture’; did you mean ‘dpy_gl_qemu_dmabuf_get_texture’? [-Werror=implicit-function-declaration] Please fix the build with --enable-spice. > + if (!texture) { > return; > } > - egl_fb_setup_for_tex(&ssd->cursor_fb, dmabuf->width, dmabuf->height, > - dmabuf->texture, false); > + width = dpy_gl_dmabuf_get_width(dmabuf); > + height = dpy_gl_dmabuf_get_height(dmabuf); > + egl_fb_setup_for_tex(&ssd->cursor_fb, width, height, texture, false); > } else { > egl_fb_destroy(&ssd->cursor_fb); > } > @@ -1026,6 +1029,7 @@ static void qemu_spice_gl_update(DisplayChangeListener > *dcl, > bool y_0_top = false; /* FIXME */ > uint64_t cookie; > int fd; > + uint32_t width, height, texture; > > if (!ssd->have_scanout) { > return; > @@ -1042,41 +1046,45 @@ static void > qemu_spice_gl_update(DisplayChangeListener *dcl, > > if (ssd->guest_dmabuf_refresh) { > QemuDmaBuf *dmabuf = ssd->guest_dmabuf; > + width = dpy_gl_dmabuf_get_width(dmabuf); > + height = dpy_gl_dmabuf_get_height(dmabuf); > + > if (render_cursor) { > egl_dmabuf_import_texture(dmabuf); > - if (!dmabuf->texture) { > + texture = dpy_gl_dmabuf_get_texture(dmabuf); > + if (!texture) { > return; > } > > /* source framebuffer */ > - egl_fb_setup_for_tex(&ssd->guest_fb, > - dmabuf->width, dmabuf->height, > - dmabuf->texture, false); > + egl_fb_setup_for_tex(&ssd->guest_fb, width, height, > + texture, false); > > /* dest framebuffer */ > - if (ssd->blit_fb.width != dmabuf->width || > - ssd->blit_fb.height != dmabuf->height) { > - trace_qemu_spice_gl_render_dmabuf(ssd->qxl.id, dmabuf->width, > - dmabuf->height); > + if (ssd->blit_fb.width != width || > + ssd->blit_fb.height != height) { > + trace_qemu_spice_gl_render_dmabuf(ssd->qxl.id, width, > + height); > egl_fb_destroy(&ssd->blit_fb); > egl_fb_setup_new_tex(&ssd->blit_fb, > - dmabuf->width, dmabuf->height); > + width, height); > fd = egl_get_fd_for_texture(ssd->blit_fb.texture, > &stride, &fourcc, NULL); > - spice_qxl_gl_scanout(&ssd->qxl, fd, > - dmabuf->width, dmabuf->height, > + spice_qxl_gl_scanout(&ssd->qxl, fd, width, height, > stride, fourcc, false); > } > } else { > - trace_qemu_spice_gl_forward_dmabuf(ssd->qxl.id, > - dmabuf->width, > dmabuf->height); > + int stride = dpy_gl_dmabuf_get_stride(dmabuf); > + int fourcc = dpy_gl_dmabuf_get_fourcc(dmabuf); > + int y0top = dpy_gl_dmabuf_get_y0top(dmabuf); > + int fd = dpy_gl_dmabuf_get_fd(dmabuf); > + > + trace_qemu_spice_gl_forward_dmabuf(ssd->qxl.id, width, height); > /* note: spice server will close the fd, so hand over a dup */ > - spice_qxl_gl_scanout(&ssd->qxl, dup(dmabuf->fd), > - dmabuf->width, dmabuf->height, > - dmabuf->stride, dmabuf->fourcc, > - dmabuf->y0_top); > + spice_qxl_gl_scanout(&ssd->qxl, dup(fd), width, height, > + stride, fourcc, y0top); > } > - qemu_spice_gl_monitor_config(ssd, 0, 0, dmabuf->width, > dmabuf->height); > + qemu_spice_gl_monitor_config(ssd, 0, 0, width, height); > ssd->guest_dmabuf_refresh = false; > } > > -- > 2.34.1 >