From nobody Mon Feb 9 08:28:13 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass header.i=@intel.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1713222761; cv=none; d=zohomail.com; s=zohoarc; b=EjTPex5vS8G+TezJirveJG6mh+JeZg048R8B+sJkelzoYlbI1o12lDBR+9uhwnquHRN59TkyDpN4gdSCb42KMVsvGX70mM7XzaWLwreA7oy9cwwRx/FMYQG7wSIiR3eM21zh7e6HP+u046a148Muy+CSboYpaSmcPuBJq4psds8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1713222761; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=MfiwmOAR5jfQqfC2/P6silrFLgcW4NQJR/D9TTwIeXI=; b=PAAdeUO+ZJDls5cX7knteDon2uKOFuOhFPd8IMAWKkaaQa6zwRH0PjP4bfOsT/XgT+l+4tkwVjz8KqwBuN/fSNTREy7IY1P+XH7JOVaRezLZakKMpRbHT7s2XSHjHu/8/iwtZ0li7GZVKDdY7XUJtbiKhSnHpjO5DwWxxws2v4g= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=@intel.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1713222761510864.0289967885797; Mon, 15 Apr 2024 16:12:41 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rwVUL-0004jy-Q2; Mon, 15 Apr 2024 19:11:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rwVUI-0004jB-Ul for qemu-devel@nongnu.org; Mon, 15 Apr 2024 19:11:46 -0400 Received: from mgamail.intel.com ([192.198.163.11]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rwVUF-0004RA-Ff for qemu-devel@nongnu.org; Mon, 15 Apr 2024 19:11:46 -0400 Received: from fmviesa004.fm.intel.com ([10.60.135.144]) by fmvoesa105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Apr 2024 16:11:34 -0700 Received: from dongwonk-z390-aorus-ultra.fm.intel.com ([10.105.129.124]) by fmviesa004.fm.intel.com with ESMTP; 15 Apr 2024 16:11:35 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1713222703; x=1744758703; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=RT/BH3qg8Jmw7tZPJXCSDX0TBSe2uO95fK+KjIqEghc=; b=G03nzcQZ/YWW/6vEAgvNzP0WVpm7PgnzdDsHTuJL2FTjihwTr8fKhIUg Jf8i8hSd3FGGXSg/9AzW99zjNLmOHrEIP1RduS6kUPSjuLQDk1gkf9iIT BJxHdx8xvLBPMLiE2CRuUYObXUjd2LVxO6jbuua4sGpGPzOIifvpH1OGs 3d14Z74NNSPEHzdKlozBlUaGqBW+xLi0vcJbaDp4DBUDtBvsg/IPPRfvL F2F7uRGAUTPZK4Ac8Pcvv7jy3xJX17EdmLpxvbdBURuSPzy9nTdb5LWrX SQ1JNEPNRD2NOsXiakQPcu7GuIC1tw0gTM4ymzkfjShNAFIn9IM5ToXei w==; X-CSE-ConnectionGUID: /knTYCmiQFegA0vHsjLR2w== X-CSE-MsgGUID: zSzrmf/7Scmb7ohlFP3Q2w== X-IronPort-AV: E=McAfee;i="6600,9927,11045"; a="19242742" X-IronPort-AV: E=Sophos;i="6.07,204,1708416000"; d="scan'208";a="19242742" X-CSE-ConnectionGUID: y4TSK2uzToCFm38DCrNvWg== X-CSE-MsgGUID: 52iVSm59SZezrDQ5lv2G0g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,204,1708416000"; d="scan'208";a="26726947" From: dongwon.kim@intel.com To: qemu-devel@nongnu.org Cc: marcandre.lureau@redhat.com Subject: [PATCH v5 3/3] ui/console: Introduce dpy_gl_qemu_dmabuf_new() and free() helpers Date: Mon, 15 Apr 2024 16:07:24 -0700 Message-Id: <20240415230724.9573-4-dongwon.kim@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240415230724.9573-1-dongwon.kim@intel.com> References: <20240415230724.9573-1-dongwon.kim@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=192.198.163.11; envelope-from=dongwon.kim@intel.com; helo=mgamail.intel.com X-Spam_score_int: -49 X-Spam_score: -5.0 X-Spam_bar: ----- X-Spam_report: (-5.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-2.185, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @intel.com) X-ZM-MESSAGEID: 1713222762760100008 From: Dongwon Kim This commit introduces utility functions for the creation and deallocation of QemuDmaBuf instances. Additionally, it updates all relevant sections of the codebase to utilize these new utility functions. Suggested-by: Marc-Andr=C3=A9 Lureau Cc: Philippe Mathieu-Daud=C3=A9 Cc: Vivek Kasireddy Signed-off-by: Dongwon Kim --- include/hw/vfio/vfio-common.h | 2 +- include/hw/virtio/virtio-gpu.h | 4 ++-- include/ui/console.h | 8 +++++++- hw/display/vhost-user-gpu.c | 32 +++++++++++++++++-------------- hw/display/virtio-gpu-udmabuf.c | 24 +++++++++-------------- hw/vfio/display.c | 26 ++++++++++++------------- ui/console.c | 34 +++++++++++++++++++++++++++++++++ ui/dbus-listener.c | 28 ++++++++++++--------------- 8 files changed, 95 insertions(+), 63 deletions(-) diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h index b9da6c08ef..d66e27db02 100644 --- a/include/hw/vfio/vfio-common.h +++ b/include/hw/vfio/vfio-common.h @@ -148,7 +148,7 @@ typedef struct VFIOGroup { } VFIOGroup; =20 typedef struct VFIODMABuf { - QemuDmaBuf buf; + QemuDmaBuf *buf; uint32_t pos_x, pos_y, pos_updates; uint32_t hot_x, hot_y, hot_updates; int dmabuf_id; diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h index ed44cdad6b..56d6e821bf 100644 --- a/include/hw/virtio/virtio-gpu.h +++ b/include/hw/virtio/virtio-gpu.h @@ -169,7 +169,7 @@ struct VirtIOGPUBaseClass { DEFINE_PROP_UINT32("yres", _state, _conf.yres, 800) =20 typedef struct VGPUDMABuf { - QemuDmaBuf buf; + QemuDmaBuf *buf; uint32_t scanout_id; QTAILQ_ENTRY(VGPUDMABuf) next; } VGPUDMABuf; @@ -238,7 +238,7 @@ struct VhostUserGPU { VhostUserBackend *vhost; int vhost_gpu_fd; /* closed by the chardev */ CharBackend vhost_chr; - QemuDmaBuf dmabuf[VIRTIO_GPU_MAX_SCANOUTS]; + QemuDmaBuf *dmabuf[VIRTIO_GPU_MAX_SCANOUTS]; bool backend_blocked; }; =20 diff --git a/include/ui/console.h b/include/ui/console.h index 3d9d8b9fce..6d7c03b7c5 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -358,7 +358,13 @@ 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); - +QemuDmaBuf *dpy_gl_qemu_dmabuf_new(uint32_t width, uint32_t height, + uint32_t stride, uint32_t x, + uint32_t y, uint32_t backing_width, + uint32_t backing_height, uint32_t fourc= c, + uint64_t modifier, uint32_t dmabuf_fd, + bool allow_fences, bool y0_top); +void dpy_gl_qemu_dmabuf_free(QemuDmaBuf *dmabuf); 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); diff --git a/hw/display/vhost-user-gpu.c b/hw/display/vhost-user-gpu.c index 87dcfbca10..4d8461e94a 100644 --- a/hw/display/vhost-user-gpu.c +++ b/hw/display/vhost-user-gpu.c @@ -250,6 +250,7 @@ vhost_user_gpu_handle_display(VhostUserGPU *g, VhostUse= rGpuMsg *msg) VhostUserGpuDMABUFScanout *m =3D &msg->payload.dmabuf_scanout; int fd =3D qemu_chr_fe_get_msgfd(&g->vhost_chr); int old_fd; + uint64_t modifier =3D 0; QemuDmaBuf *dmabuf; =20 if (m->scanout_id >=3D g->parent_obj.conf.max_outputs) { @@ -262,31 +263,34 @@ vhost_user_gpu_handle_display(VhostUserGPU *g, VhostU= serGpuMsg *msg) =20 g->parent_obj.enable =3D 1; con =3D g->parent_obj.scanout[m->scanout_id].con; - dmabuf =3D &g->dmabuf[m->scanout_id]; - old_fd =3D dpy_gl_qemu_dmabuf_get_fd(dmabuf); - if (old_fd >=3D 0) { - close(old_fd); - dmabuf->fd =3D -1; + dmabuf =3D g->dmabuf[m->scanout_id]; + if (dmabuf) { + old_fd =3D dpy_gl_qemu_dmabuf_get_fd(dmabuf); + if (old_fd >=3D 0) { + close(old_fd); + dpy_gl_qemu_dmabuf_set_fd(dmabuf, -1); + } } dpy_gl_release_dmabuf(con, dmabuf); + g_clear_pointer(&dmabuf, dpy_gl_qemu_dmabuf_free); if (fd =3D=3D -1) { dpy_gl_scanout_disable(con); break; } - *dmabuf =3D (QemuDmaBuf) { - .fd =3D fd, - .width =3D m->fd_width, - .height =3D m->fd_height, - .stride =3D m->fd_stride, - .fourcc =3D m->fd_drm_fourcc, - .y0_top =3D m->fd_flags & VIRTIO_GPU_RESOURCE_FLAG_Y_0_TOP, - }; + if (msg->request =3D=3D VHOST_USER_GPU_DMABUF_SCANOUT2) { VhostUserGpuDMABUFScanout2 *m2 =3D &msg->payload.dmabuf_scanou= t2; - dmabuf->modifier =3D m2->modifier; + modifier =3D m2->modifier; } =20 + dmabuf =3D dpy_gl_qemu_dmabuf_new(m->fd_width, m->fd_height, + m->fd_stride, 0, 0, 0, 0, + m->fd_drm_fourcc, modifier, + fd, false, m->fd_flags & + VIRTIO_GPU_RESOURCE_FLAG_Y_0_TOP); + dpy_gl_scanout_dmabuf(con, dmabuf); + g->dmabuf[m->scanout_id] =3D dmabuf; break; } case VHOST_USER_GPU_DMABUF_UPDATE: { diff --git a/hw/display/virtio-gpu-udmabuf.c b/hw/display/virtio-gpu-udmabu= f.c index e3f358b575..79eafc7289 100644 --- a/hw/display/virtio-gpu-udmabuf.c +++ b/hw/display/virtio-gpu-udmabuf.c @@ -162,7 +162,8 @@ static void virtio_gpu_free_dmabuf(VirtIOGPU *g, VGPUDM= ABuf *dmabuf) struct virtio_gpu_scanout *scanout; =20 scanout =3D &g->parent_obj.scanout[dmabuf->scanout_id]; - dpy_gl_release_dmabuf(scanout->con, &dmabuf->buf); + dpy_gl_release_dmabuf(scanout->con, dmabuf->buf); + g_clear_pointer(&dmabuf->buf, dpy_gl_qemu_dmabuf_free); QTAILQ_REMOVE(&g->dmabuf.bufs, dmabuf, next); g_free(dmabuf); } @@ -181,17 +182,10 @@ static VGPUDMABuf } =20 dmabuf =3D g_new0(VGPUDMABuf, 1); - dmabuf->buf.width =3D r->width; - dmabuf->buf.height =3D r->height; - dmabuf->buf.stride =3D fb->stride; - dmabuf->buf.x =3D r->x; - dmabuf->buf.y =3D r->y; - dmabuf->buf.backing_width =3D fb->width; - dmabuf->buf.backing_height =3D fb->height; - dmabuf->buf.fourcc =3D qemu_pixman_to_drm_format(fb->format); - dmabuf->buf.fd =3D res->dmabuf_fd; - dmabuf->buf.allow_fences =3D true; - dmabuf->buf.draw_submitted =3D false; + dmabuf->buf =3D dpy_gl_qemu_dmabuf_new(r->width, r->height, fb->stride, + r->x, r->y, fb->width, fb->height, + qemu_pixman_to_drm_format(fb->for= mat), + 0, res->dmabuf_fd, false, 0); dmabuf->scanout_id =3D scanout_id; QTAILQ_INSERT_HEAD(&g->dmabuf.bufs, dmabuf, next); =20 @@ -217,11 +211,11 @@ int virtio_gpu_update_dmabuf(VirtIOGPU *g, old_primary =3D g->dmabuf.primary[scanout_id]; } =20 - width =3D dpy_gl_qemu_dmabuf_get_width(&new_primary->buf); - height =3D dpy_gl_qemu_dmabuf_get_height(&new_primary->buf); + width =3D dpy_gl_qemu_dmabuf_get_width(new_primary->buf); + height =3D dpy_gl_qemu_dmabuf_get_height(new_primary->buf); g->dmabuf.primary[scanout_id] =3D new_primary; qemu_console_resize(scanout->con, width, height); - dpy_gl_scanout_dmabuf(scanout->con, &new_primary->buf); + dpy_gl_scanout_dmabuf(scanout->con, new_primary->buf); =20 if (old_primary) { virtio_gpu_free_dmabuf(g, old_primary); diff --git a/hw/vfio/display.c b/hw/vfio/display.c index f9c39cbd51..7e26d9667f 100644 --- a/hw/vfio/display.c +++ b/hw/vfio/display.c @@ -241,14 +241,11 @@ static VFIODMABuf *vfio_display_get_dmabuf(VFIOPCIDev= ice *vdev, =20 dmabuf =3D g_new0(VFIODMABuf, 1); dmabuf->dmabuf_id =3D plane.dmabuf_id; - dmabuf->buf.width =3D plane.width; - dmabuf->buf.height =3D plane.height; - dmabuf->buf.backing_width =3D plane.width; - dmabuf->buf.backing_height =3D plane.height; - dmabuf->buf.stride =3D plane.stride; - dmabuf->buf.fourcc =3D plane.drm_format; - dmabuf->buf.modifier =3D plane.drm_format_mod; - dmabuf->buf.fd =3D fd; + dmabuf->buf =3D dpy_gl_qemu_dmabuf_new(plane.width, plane.height, + plane.stride, 0, 0, plane.width, + plane.height, plane.drm_format, + plane.drm_format_mod, fd, false, = 0); + if (plane_type =3D=3D DRM_PLANE_TYPE_CURSOR) { vfio_display_update_cursor(dmabuf, &plane); } @@ -263,8 +260,9 @@ static void vfio_display_free_one_dmabuf(VFIODisplay *d= py, VFIODMABuf *dmabuf) =20 QTAILQ_REMOVE(&dpy->dmabuf.bufs, dmabuf, next); =20 - fd =3D dpy_gl_qemu_dmabuf_get_fd(&dmabuf->buf); - dpy_gl_release_dmabuf(dpy->con, &dmabuf->buf); + fd =3D dpy_gl_qemu_dmabuf_get_fd(dmabuf->buf); + dpy_gl_release_dmabuf(dpy->con, dmabuf->buf); + g_clear_pointer(&dmabuf->buf, dpy_gl_qemu_dmabuf_free); close(fd); g_free(dmabuf); } @@ -301,13 +299,13 @@ static void vfio_display_dmabuf_update(void *opaque) return; } =20 - width =3D dpy_gl_qemu_dmabuf_get_width(&primary->buf); - height =3D dpy_gl_qemu_dmabuf_get_height(&primary->buf); + width =3D dpy_gl_qemu_dmabuf_get_width(primary->buf); + height =3D dpy_gl_qemu_dmabuf_get_height(primary->buf); =20 if (dpy->dmabuf.primary !=3D primary) { dpy->dmabuf.primary =3D primary; qemu_console_resize(dpy->con, width, height); - dpy_gl_scanout_dmabuf(dpy->con, &primary->buf); + dpy_gl_scanout_dmabuf(dpy->con, primary->buf); free_bufs =3D true; } =20 @@ -321,7 +319,7 @@ static void vfio_display_dmabuf_update(void *opaque) if (cursor && (new_cursor || cursor->hot_updates)) { bool have_hot =3D (cursor->hot_x !=3D 0xffffffff && cursor->hot_y !=3D 0xffffffff); - dpy_gl_cursor_dmabuf(dpy->con, &cursor->buf, have_hot, + dpy_gl_cursor_dmabuf(dpy->con, cursor->buf, have_hot, cursor->hot_x, cursor->hot_y); cursor->hot_updates =3D 0; } else if (!cursor && new_cursor) { diff --git a/ui/console.c b/ui/console.c index d4ca9e6e0f..ea23fd8af6 100644 --- a/ui/console.c +++ b/ui/console.c @@ -1132,6 +1132,40 @@ void dpy_gl_cursor_position(QemuConsole *con, } } =20 +QemuDmaBuf *dpy_gl_qemu_dmabuf_new(uint32_t width, uint32_t height, + uint32_t stride, uint32_t x, + uint32_t y, uint32_t backing_width, + uint32_t backing_height, uint32_t fourc= c, + uint64_t modifier, uint32_t dmabuf_fd, + bool allow_fences, bool y0_top) { + QemuDmaBuf *dmabuf; + + dmabuf =3D g_new0(QemuDmaBuf, 1); + + dmabuf->width =3D width; + dmabuf->height =3D height; + dmabuf->stride =3D stride; + dmabuf->x =3D x; + dmabuf->y =3D y; + dmabuf->backing_width =3D backing_width; + dmabuf->backing_height =3D backing_height; + dmabuf->fourcc =3D fourcc; + dmabuf->modifier =3D modifier; + dmabuf->fd =3D dmabuf_fd; + dmabuf->allow_fences =3D allow_fences; + dmabuf->y0_top =3D y0_top; + dmabuf->fence_fd =3D -1; + + return dmabuf; +} + +void dpy_gl_qemu_dmabuf_free(QemuDmaBuf *dmabuf) +{ + assert(dmabuf !=3D NULL); + + g_free(dmabuf); +} + int32_t dpy_gl_qemu_dmabuf_get_fd(QemuDmaBuf *dmabuf) { assert(dmabuf !=3D NULL); diff --git a/ui/dbus-listener.c b/ui/dbus-listener.c index c6c7d93753..85d779a45c 100644 --- a/ui/dbus-listener.c +++ b/ui/dbus-listener.c @@ -442,28 +442,24 @@ static void dbus_scanout_texture(DisplayChangeListene= r *dcl, trace_dbus_scanout_texture(tex_id, backing_y_0_top, backing_width, backing_height, x, y, w, h); #ifdef CONFIG_GBM - QemuDmaBuf dmabuf =3D { - .width =3D w, - .height =3D h, - .y0_top =3D backing_y_0_top, - .x =3D x, - .y =3D y, - .backing_width =3D backing_width, - .backing_height =3D backing_height, - }; + int32_t fd; + uint32_t stride, fourcc; + uint64_t modifier; + QemuDmaBuf *dmabuf; =20 assert(tex_id); - dmabuf.fd =3D egl_get_fd_for_texture( - tex_id, (EGLint *)&dmabuf.stride, - (EGLint *)&dmabuf.fourcc, - &dmabuf.modifier); - if (dmabuf.fd < 0) { + fd =3D egl_get_fd_for_texture(tex_id, (EGLint *)&stride, (EGLint *)&fo= urcc, + &modifier); + if (fd < 0) { error_report("%s: failed to get fd for texture", __func__); return; } + dmabuf =3D dpy_gl_qemu_dmabuf_new(w, h, stride, x, y, backing_width, + backing_height, fourcc, modifier, fd, + false, backing_y_0_top); =20 - dbus_scanout_dmabuf(dcl, &dmabuf); - close(dmabuf.fd); + dbus_scanout_dmabuf(dcl, dmabuf); + close(fd); #endif =20 #ifdef WIN32 --=20 2.34.1