From nobody Mon Nov 25 14:54:13 2024 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=1715107503; cv=none; d=zohomail.com; s=zohoarc; b=Ra7qFpatHk0IKnZ+VCtyhKHLHmo8O90hXD0LFayZanHfXBJNsF79rxIlBF76bsCUVT4MFEmNorKW8jolWgbTUvvuSoim+NCkpRTQAPLrsUOo72Qby0WDtp0agHcGyo+ZyM4mNR1V3mFbxGBZatXIvBp2xEEUJVN6cOjOKBnxeTQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1715107503; 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=aj10DEQ+Xeo43jGt+swGFk4gCl80j6r+PtvQP8OKUNc=; b=Vk0UftiTm3kOqS1ksfaSZvKmbDKHZTgTNHUAf0qlwMA6YioMlRifv0G41HTDhx/0jcSNsBnCxDeXzqyg+lMxkaEzPfP/F8Smy6HTFDoBjRJFr2HIvbrCbZyll3+5/HIxEYunorpUSudU+fD/yrfvCN+jjS8b4YGDm/fMCuonAjs= 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 1715107503844347.3542602445639; Tue, 7 May 2024 11:45:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1s4PmT-0005IV-Nv; Tue, 07 May 2024 14:43:13 -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 1s4PmN-0005HW-Jw for qemu-devel@nongnu.org; Tue, 07 May 2024 14:43:07 -0400 Received: from mgamail.intel.com ([192.198.163.10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1s4PmK-0005KM-7m for qemu-devel@nongnu.org; Tue, 07 May 2024 14:43:07 -0400 Received: from orviesa006.jf.intel.com ([10.64.159.146]) by fmvoesa104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 May 2024 11:42:55 -0700 Received: from dongwonk-z390-aorus-ultra.fm.intel.com ([10.105.129.124]) by orviesa006.jf.intel.com with ESMTP; 07 May 2024 11:42:55 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1715107384; x=1746643384; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=11pN+4SeL3X5Jx2qJlXWtWn1YTK9gf8IMCiG9pd+k2A=; b=BZfhdzpbfG0ZBMUyaY+oEYxxp9gJDKXfphn7XM0EMTHhmNra+XpWkOCb XaZ4wckAm1N4VQms1IRGsG9GPUTq3P2+vdAVNO/vEVkEuGM8Ucl9HrW4/ Ulex1f8sJGGtNKDFQKie6lYaDzZAcUc1ca+KX2ihBSHuXXUfrelzCchWe 0KTzT73MF9f3I1j0AG2RrEo5RTkBqKfBDwzlWuEPeRrkyPKXB/LIH2o9L 0jYzuZsnjJW1jyryWFfVyQDZF6ktQam8/fWn2pT4oHfDVS6aS429de1pI zC5YG9yCwUt+OdPUgERRPR1NSyNLGDTZ5LMorC4lqSizlS/JmG0DvxGBu Q==; X-CSE-ConnectionGUID: aScLi7+ISOuIehhfbtTrWA== X-CSE-MsgGUID: iBMGtAkGSu2fzbmuBTQveA== X-IronPort-AV: E=McAfee;i="6600,9927,11066"; a="22321495" X-IronPort-AV: E=Sophos;i="6.08,143,1712646000"; d="scan'208";a="22321495" X-CSE-ConnectionGUID: JWtg76m0Qh2Wu58Sb+PIxg== X-CSE-MsgGUID: 2V0K+mdoTvGdTZtw9LavDA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.08,143,1712646000"; d="scan'208";a="29031360" From: dongwon.kim@intel.com To: qemu-devel@nongnu.org Cc: marcandre.lureau@redhat.com, philmd@linaro.org, berrange@redhat.com Subject: [PATCH v13 3/6] ui/console: Use qemu_dmabuf_get_..() helpers instead Date: Tue, 7 May 2024 11:37:54 -0700 Message-Id: <20240507183757.3383641-4-dongwon.kim@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240507183757.3383641-1-dongwon.kim@intel.com> References: <20240507183757.3383641-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.10; 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=-0.581, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, 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: 1715107505207100001 From: Dongwon Kim This commit updates all instances where fields within the QemuDmaBuf struct are directly accessed, replacing them with calls to these new helper functions. v6: fix typos in helper names in ui/spice-display.c v7: removed prefix, "dpy_gl_" from all helpers v8: Introduction of helpers was removed as those were already added by the previous commit v11: -- Use new qemu_dmabuf_close() instead of close(qemu_dmabuf_get_fd()). (Daniel P. Berrang=C3=A9 ) -- Use new qemu_dmabuf_dup_fd() instead of dup(qemu_dmabuf_get_fd()). (Daniel P. Berrang=C3=A9 ) Suggested-by: Marc-Andr=C3=A9 Lureau Reviewed-by: Marc-Andr=C3=A9 Lureau Cc: Philippe Mathieu-Daud=C3=A9 Cc: Daniel P. Berrang=C3=A9 Cc: Vivek Kasireddy Signed-off-by: Dongwon Kim --- hw/display/vhost-user-gpu.c | 5 +--- hw/display/virtio-gpu-udmabuf.c | 7 +++-- hw/vfio/display.c | 12 +++++--- ui/console.c | 4 +-- 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 +++++++++++++++++++-------------- 12 files changed, 181 insertions(+), 110 deletions(-) diff --git a/hw/display/vhost-user-gpu.c b/hw/display/vhost-user-gpu.c index 709c8a02a1..454e5afcff 100644 --- a/hw/display/vhost-user-gpu.c +++ b/hw/display/vhost-user-gpu.c @@ -262,10 +262,7 @@ vhost_user_gpu_handle_display(VhostUserGPU *g, VhostUs= erGpuMsg *msg) g->parent_obj.enable =3D 1; con =3D g->parent_obj.scanout[m->scanout_id].con; dmabuf =3D &g->dmabuf[m->scanout_id]; - if (dmabuf->fd >=3D 0) { - close(dmabuf->fd); - dmabuf->fd =3D -1; - } + qemu_dmabuf_close(dmabuf); dpy_gl_release_dmabuf(con, dmabuf); if (fd =3D=3D -1) { dpy_gl_scanout_disable(con); diff --git a/hw/display/virtio-gpu-udmabuf.c b/hw/display/virtio-gpu-udmabu= f.c index d51184d658..c90eba281e 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 =3D &g->parent_obj.scanout[scanout_= id]; VGPUDMABuf *new_primary, *old_primary =3D NULL; + uint32_t width, height; =20 new_primary =3D 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 =3D g->dmabuf.primary[scanout_id]; } =20 + width =3D qemu_dmabuf_get_width(&new_primary->buf); + height =3D qemu_dmabuf_get_height(&new_primary->buf); g->dmabuf.primary[scanout_id] =3D 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); =20 if (old_primary) { diff --git a/hw/vfio/display.c b/hw/vfio/display.c index 1aa440c663..7784502b53 100644 --- a/hw/vfio/display.c +++ b/hw/vfio/display.c @@ -260,8 +260,9 @@ static VFIODMABuf *vfio_display_get_dmabuf(VFIOPCIDevic= e *vdev, static void vfio_display_free_one_dmabuf(VFIODisplay *dpy, VFIODMABuf *dma= buf) { QTAILQ_REMOVE(&dpy->dmabuf.bufs, dmabuf, next); + + qemu_dmabuf_close(&dmabuf->buf); dpy_gl_release_dmabuf(dpy->con, &dmabuf->buf); - close(dmabuf->buf.fd); g_free(dmabuf); } =20 @@ -286,6 +287,7 @@ static void vfio_display_dmabuf_update(void *opaque) VFIOPCIDevice *vdev =3D opaque; VFIODisplay *dpy =3D vdev->dpy; VFIODMABuf *primary, *cursor; + uint32_t width, height; bool free_bufs =3D false, new_cursor =3D false; =20 primary =3D vfio_display_get_dmabuf(vdev, DRM_PLANE_TYPE_PRIMARY); @@ -296,10 +298,12 @@ static void vfio_display_dmabuf_update(void *opaque) return; } =20 + width =3D qemu_dmabuf_get_width(&primary->buf); + height =3D qemu_dmabuf_get_height(&primary->buf); + if (dpy->dmabuf.primary !=3D primary) { dpy->dmabuf.primary =3D 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 =3D true; } @@ -328,7 +332,7 @@ static void vfio_display_dmabuf_update(void *opaque) cursor->pos_updates =3D 0; } =20 - dpy_gl_update(dpy->con, 0, 0, primary->buf.width, primary->buf.height); + dpy_gl_update(dpy->con, 0, 0, width, height); =20 if (free_bufs) { vfio_display_free_dmabufs(vdev); diff --git a/ui/console.c b/ui/console.c index 43226c5c14..1b2cd0c736 100644 --- a/ui/console.c +++ b/ui/console.c @@ -1459,7 +1459,7 @@ int qemu_console_get_width(QemuConsole *con, int fall= back) } switch (con->scanout.kind) { case SCANOUT_DMABUF: - return con->scanout.dmabuf->width; + return qemu_dmabuf_get_width(con->scanout.dmabuf); case SCANOUT_TEXTURE: return con->scanout.texture.width; case SCANOUT_SURFACE: @@ -1476,7 +1476,7 @@ int qemu_console_get_height(QemuConsole *con, int fal= lback) } switch (con->scanout.kind) { case SCANOUT_DMABUF: - return con->scanout.dmabuf->height; + return 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..578b67f62b 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 =3D container_of(dcl, DBusDisplayConsole, dcl); =20 - dbus_display_console_set_size(ddc, - dmabuf->width, - dmabuf->height); + width =3D qemu_dmabuf_get_width(dmabuf); + height =3D qemu_dmabuf_get_height(dmabuf); + + dbus_display_console_set_size(ddc, width, height); } =20 static void diff --git a/ui/dbus-listener.c b/ui/dbus-listener.c index 4a0a5d78f9..62d1e2d3f9 100644 --- a/ui/dbus-listener.c +++ b/ui/dbus-listener.c @@ -278,29 +278,33 @@ static void dbus_scanout_dmabuf(DisplayChangeListener= *dcl, DBusDisplayListener *ddl =3D container_of(dcl, DBusDisplayListener, dc= l); g_autoptr(GError) err =3D NULL; g_autoptr(GUnixFDList) fd_list =3D NULL; + int fd; + uint32_t width, height, stride, fourcc; + uint64_t modifier; + bool y0_top; =20 + fd =3D qemu_dmabuf_get_fd(dmabuf); fd_list =3D g_unix_fd_list_new(); - if (g_unix_fd_list_append(fd_list, dmabuf->fd, &err) !=3D 0) { + if (g_unix_fd_list_append(fd_list, fd, &err) !=3D 0) { error_report("Failed to setup dmabuf fdlist: %s", err->message); return; } =20 ddl_discard_pending_messages(ddl); =20 + width =3D qemu_dmabuf_get_width(dmabuf); + height =3D qemu_dmabuf_get_height(dmabuf); + stride =3D qemu_dmabuf_get_stride(dmabuf); + fourcc =3D qemu_dmabuf_get_fourcc(dmabuf); + modifier =3D qemu_dmabuf_get_modifier(dmabuf); + y0_top =3D 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 *d= cl, DisplaySurface *ds; GVariant *v_data =3D NULL; egl_fb cursor_fb =3D EGL_FB_INIT; + uint32_t width, height, texture; =20 if (!dmabuf) { qemu_dbus_display1_listener_call_mouse_set( @@ -497,12 +502,16 @@ static void dbus_cursor_dmabuf(DisplayChangeListener = *dcl, } =20 egl_dmabuf_import_texture(dmabuf); - if (!dmabuf->texture) { + texture =3D qemu_dmabuf_get_texture(dmabuf); + if (!texture) { return; } - egl_fb_setup_for_tex(&cursor_fb, dmabuf->width, dmabuf->height, - dmabuf->texture, false); - ds =3D qemu_create_displaysurface(dmabuf->width, dmabuf->height); + + width =3D qemu_dmabuf_get_width(dmabuf); + height =3D qemu_dmabuf_get_height(dmabuf); + + egl_fb_setup_for_tex(&cursor_fb, width, height, texture, false); + ds =3D qemu_create_displaysurface(width, height); egl_fb_read(ds, &cursor_fb); =20 v_data =3D g_variant_new_from_data( diff --git a/ui/egl-headless.c b/ui/egl-headless.c index d5637dadb2..6187249c73 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 =3D qemu_dmabuf_get_texture(dmabuf); + if (!texture) { return; } =20 - egl_scanout_texture(dcl, dmabuf->texture, - false, dmabuf->width, dmabuf->height, - 0, 0, dmabuf->width, dmabuf->height, NULL); + width =3D qemu_dmabuf_get_width(dmabuf); + height =3D qemu_dmabuf_get_height(dmabuf); + + egl_scanout_texture(dcl, texture, false, width, height, 0, 0, + width, height, NULL); } =20 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 =3D container_of(dcl, egl_dpy, dcl); =20 if (dmabuf) { egl_dmabuf_import_texture(dmabuf); - if (!dmabuf->texture) { + texture =3D qemu_dmabuf_get_texture(dmabuf); + if (!texture) { return; } - egl_fb_setup_for_tex(&edpy->cursor_fb, dmabuf->width, dmabuf->heig= ht, - dmabuf->texture, false); + + width =3D qemu_dmabuf_get_width(dmabuf); + height =3D qemu_dmabuf_get_height(dmabuf); + egl_fb_setup_for_tex(&edpy->cursor_fb, width, height, texture, fal= se); } else { egl_fb_destroy(&edpy->cursor_fb); } diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c index 3d19dbe382..3f96e63d25 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); =20 if (src->dmabuf) { - x1 =3D src->dmabuf->x; - y1 =3D src->dmabuf->y; - w =3D src->dmabuf->width; - h =3D src->dmabuf->height; + x1 =3D qemu_dmabuf_get_x(src->dmabuf); + y1 =3D qemu_dmabuf_get_y(src->dmabuf); + w =3D qemu_dmabuf_get_width(src->dmabuf); + h =3D qemu_dmabuf_get_height(src->dmabuf); } =20 w =3D (x1 + w) > src->width ? src->width - x1 : w; @@ -308,30 +308,33 @@ void egl_dmabuf_import_texture(QemuDmaBuf *dmabuf) EGLImageKHR image =3D EGL_NO_IMAGE_KHR; EGLint attrs[64]; int i =3D 0; + uint64_t modifier; + uint32_t texture =3D qemu_dmabuf_get_texture(dmabuf); =20 - if (dmabuf->texture !=3D 0) { + if (texture !=3D 0) { return; } =20 attrs[i++] =3D EGL_WIDTH; - attrs[i++] =3D dmabuf->backing_width; + attrs[i++] =3D qemu_dmabuf_get_backing_width(dmabuf); attrs[i++] =3D EGL_HEIGHT; - attrs[i++] =3D dmabuf->backing_height; + attrs[i++] =3D qemu_dmabuf_get_backing_height(dmabuf); attrs[i++] =3D EGL_LINUX_DRM_FOURCC_EXT; - attrs[i++] =3D dmabuf->fourcc; + attrs[i++] =3D qemu_dmabuf_get_fourcc(dmabuf); =20 attrs[i++] =3D EGL_DMA_BUF_PLANE0_FD_EXT; - attrs[i++] =3D dmabuf->fd; + attrs[i++] =3D qemu_dmabuf_get_fd(dmabuf); attrs[i++] =3D EGL_DMA_BUF_PLANE0_PITCH_EXT; - attrs[i++] =3D dmabuf->stride; + attrs[i++] =3D qemu_dmabuf_get_stride(dmabuf); attrs[i++] =3D EGL_DMA_BUF_PLANE0_OFFSET_EXT; attrs[i++] =3D 0; #ifdef EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT - if (dmabuf->modifier) { + modifier =3D qemu_dmabuf_get_modifier(dmabuf); + if (modifier) { attrs[i++] =3D EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT; - attrs[i++] =3D (dmabuf->modifier >> 0) & 0xffffffff; + attrs[i++] =3D (modifier >> 0) & 0xffffffff; attrs[i++] =3D EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT; - attrs[i++] =3D (dmabuf->modifier >> 32) & 0xffffffff; + attrs[i++] =3D (modifier >> 32) & 0xffffffff; } #endif attrs[i++] =3D EGL_NONE; @@ -346,7 +349,8 @@ void egl_dmabuf_import_texture(QemuDmaBuf *dmabuf) } =20 glGenTextures(1, &dmabuf->texture); - glBindTexture(GL_TEXTURE_2D, dmabuf->texture); + texture =3D 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); =20 @@ -356,11 +360,14 @@ void egl_dmabuf_import_texture(QemuDmaBuf *dmabuf) =20 void egl_dmabuf_release_texture(QemuDmaBuf *dmabuf) { - if (dmabuf->texture =3D=3D 0) { + uint32_t texture; + + texture =3D qemu_dmabuf_get_texture(dmabuf); + if (texture =3D=3D 0) { return; } =20 - glDeleteTextures(1, &dmabuf->texture); + glDeleteTextures(1, &texture); dmabuf->texture =3D 0; } =20 @@ -382,10 +389,12 @@ void egl_dmabuf_create_sync(QemuDmaBuf *dmabuf) =20 void egl_dmabuf_create_fence(QemuDmaBuf *dmabuf) { - if (dmabuf->sync) { + void *sync =3D qemu_dmabuf_get_sync(dmabuf); + + if (sync) { dmabuf->fence_fd =3D eglDupNativeFenceFDANDROID(qemu_egl_display, - dmabuf->sync); - eglDestroySyncKHR(qemu_egl_display, dmabuf->sync); + sync); + eglDestroySyncKHR(qemu_egl_display, sync); dmabuf->sync =3D NULL; } } diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c index 955234429d..7a45daefa1 100644 --- a/ui/gtk-egl.c +++ b/ui/gtk-egl.c @@ -70,6 +70,7 @@ void gd_egl_draw(VirtualConsole *vc) QemuDmaBuf *dmabuf =3D vc->gfx.guest_fb.dmabuf; #endif int ww, wh, ws; + int fence_fd; =20 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 (!qemu_dmabuf_get_draw_submitted(dmabuf)) { return; } else { dmabuf->draw_submitted =3D 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 >=3D 0) { - qemu_set_fd_handler(dmabuf->fence_fd, gd_hw_gl_flushed, NU= LL, vc); + fence_fd =3D qemu_dmabuf_get_fence_fd(dmabuf); + if (fence_fd >=3D 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); =20 - if (vc->gfx.guest_fb.dmabuf && vc->gfx.guest_fb.dmabuf->draw_submitted= ) { + if (vc->gfx.guest_fb.dmabuf && + qemu_dmabuf_get_draw_submitted(vc->gfx.guest_fb.dmabuf)) { return; } =20 @@ -264,22 +267,30 @@ void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl, { #ifdef CONFIG_GBM VirtualConsole *vc =3D container_of(dcl, VirtualConsole, gfx.dcl); + uint32_t x, y, width, height, backing_width, backing_height, texture; + bool y0_top; =20 eglMakeCurrent(qemu_egl_display, vc->gfx.esurface, vc->gfx.esurface, vc->gfx.ectx); =20 egl_dmabuf_import_texture(dmabuf); - if (!dmabuf->texture) { + texture =3D qemu_dmabuf_get_texture(dmabuf); + if (!texture) { return; } =20 - 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 =3D qemu_dmabuf_get_x(dmabuf); + y =3D qemu_dmabuf_get_y(dmabuf); + width =3D qemu_dmabuf_get_width(dmabuf); + height =3D qemu_dmabuf_get_height(dmabuf); + backing_width =3D qemu_dmabuf_get_backing_width(dmabuf); + backing_height =3D qemu_dmabuf_get_backing_height(dmabuf); + y0_top =3D qemu_dmabuf_get_y0_top(dmabuf); =20 - if (dmabuf->allow_fences) { + gd_egl_scanout_texture(dcl, texture, y0_top, backing_width, backing_he= ight, + x, y, width, height, NULL); + + if (qemu_dmabuf_get_allow_fences(dmabuf)) { vc->gfx.guest_fb.dmabuf =3D dmabuf; } #endif @@ -291,15 +302,19 @@ void gd_egl_cursor_dmabuf(DisplayChangeListener *dcl, { #ifdef CONFIG_GBM VirtualConsole *vc =3D container_of(dcl, VirtualConsole, gfx.dcl); + uint32_t backing_width, backing_height, texture; =20 if (dmabuf) { egl_dmabuf_import_texture(dmabuf); - if (!dmabuf->texture) { + texture =3D 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 =3D qemu_dmabuf_get_backing_width(dmabuf); + backing_height =3D qemu_dmabuf_get_backing_height(dmabuf); + egl_fb_setup_for_tex(&vc->gfx.cursor_fb, backing_width, backing_he= ight, + texture, false); } else { egl_fb_destroy(&vc->gfx.cursor_fb); } @@ -363,7 +378,8 @@ void gd_egl_flush(DisplayChangeListener *dcl, VirtualConsole *vc =3D container_of(dcl, VirtualConsole, gfx.dcl); GtkWidget *area =3D vc->gfx.drawing_area; =20 - if (vc->gfx.guest_fb.dmabuf && !vc->gfx.guest_fb.dmabuf->draw_submitte= d) { + if (vc->gfx.guest_fb.dmabuf && + !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 =3D true; gtk_egl_set_scanout_mode(vc, true); diff --git a/ui/gtk-gl-area.c b/ui/gtk-gl-area.c index 7fffd0544e..2d70280803 100644 --- a/ui/gtk-gl-area.c +++ b/ui/gtk-gl-area.c @@ -60,7 +60,7 @@ void gd_gl_area_draw(VirtualConsole *vc) =20 #ifdef CONFIG_GBM if (dmabuf) { - if (!dmabuf->draw_submitted) { + if (!qemu_dmabuf_get_draw_submitted(dmabuf)) { return; } else { dmabuf->draw_submitted =3D 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 >=3D 0) { - qemu_set_fd_handler(dmabuf->fence_fd, gd_hw_gl_flushed, NU= LL, vc); + fence_fd =3D qemu_dmabuf_get_fence_fd(dmabuf); + if (fence_fd >=3D 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) =20 gd_update_monitor_refresh_rate(vc, vc->window ? vc->window : vc->gfx.d= rawing_area); =20 - if (vc->gfx.guest_fb.dmabuf && vc->gfx.guest_fb.dmabuf->draw_submitted= ) { + if (vc->gfx.guest_fb.dmabuf && + qemu_dmabuf_get_draw_submitted(vc->gfx.guest_fb.dmabuf)) { return; } =20 @@ -285,7 +288,8 @@ void gd_gl_area_scanout_flush(DisplayChangeListener *dc= l, { VirtualConsole *vc =3D container_of(dcl, VirtualConsole, gfx.dcl); =20 - if (vc->gfx.guest_fb.dmabuf && !vc->gfx.guest_fb.dmabuf->draw_submitte= d) { + if (vc->gfx.guest_fb.dmabuf && + !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 =3D 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 =3D container_of(dcl, VirtualConsole, gfx.dcl); + uint32_t x, y, width, height, backing_width, backing_height, texture; + bool y0_top; =20 gtk_gl_area_make_current(GTK_GL_AREA(vc->gfx.drawing_area)); egl_dmabuf_import_texture(dmabuf); - if (!dmabuf->texture) { + texture =3D qemu_dmabuf_get_texture(dmabuf); + if (!texture) { return; } =20 - gd_gl_area_scanout_texture(dcl, dmabuf->texture, - dmabuf->y0_top, - dmabuf->backing_width, dmabuf->backing_heig= ht, - dmabuf->x, dmabuf->y, dmabuf->width, - dmabuf->height, NULL); + x =3D qemu_dmabuf_get_x(dmabuf); + y =3D qemu_dmabuf_get_y(dmabuf); + width =3D qemu_dmabuf_get_width(dmabuf); + height =3D qemu_dmabuf_get_height(dmabuf); + backing_width =3D qemu_dmabuf_get_backing_width(dmabuf); + backing_height =3D qemu_dmabuf_get_backing_height(dmabuf); + y0_top =3D qemu_dmabuf_get_y0_top(dmabuf); =20 - if (dmabuf->allow_fences) { + gd_gl_area_scanout_texture(dcl, texture, y0_top, + backing_width, backing_height, + x, y, width, height, NULL); + + if (qemu_dmabuf_get_allow_fences(dmabuf)) { vc->gfx.guest_fb.dmabuf =3D dmabuf; } #endif diff --git a/ui/gtk.c b/ui/gtk.c index 7819a86321..237c913b26 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -596,10 +596,12 @@ void gd_hw_gl_flushed(void *vcon) { VirtualConsole *vc =3D vcon; QemuDmaBuf *dmabuf =3D vc->gfx.guest_fb.dmabuf; + int fence_fd; =20 if (dmabuf->fence_fd >=3D 0) { - qemu_set_fd_handler(dmabuf->fence_fd, NULL, NULL, NULL); - close(dmabuf->fence_fd); + fence_fd =3D qemu_dmabuf_get_fence_fd(dmabuf); + qemu_set_fd_handler(fence_fd, NULL, NULL, NULL); + close(fence_fd); dmabuf->fence_fd =3D -1; graphic_hw_gl_block(vc->gfx.dcl.con, false); } diff --git a/ui/spice-display.c b/ui/spice-display.c index 6eb98a5a5c..8a8472d029 100644 --- a/ui/spice-display.c +++ b/ui/spice-display.c @@ -976,6 +976,7 @@ static void qemu_spice_gl_cursor_dmabuf(DisplayChangeLi= stener *dcl, uint32_t hot_x, uint32_t hot_y) { SimpleSpiceDisplay *ssd =3D container_of(dcl, SimpleSpiceDisplay, dcl); + uint32_t width, height, texture; =20 ssd->have_hot =3D have_hot; ssd->hot_x =3D hot_x; @@ -984,11 +985,13 @@ static void qemu_spice_gl_cursor_dmabuf(DisplayChange= Listener *dcl, trace_qemu_spice_gl_cursor(ssd->qxl.id, dmabuf !=3D NULL, have_hot); if (dmabuf) { egl_dmabuf_import_texture(dmabuf); - if (!dmabuf->texture) { + texture =3D qemu_dmabuf_get_texture(dmabuf); + if (!texture) { return; } - egl_fb_setup_for_tex(&ssd->cursor_fb, dmabuf->width, dmabuf->heigh= t, - dmabuf->texture, false); + width =3D qemu_dmabuf_get_width(dmabuf); + height =3D qemu_dmabuf_get_height(dmabuf); + egl_fb_setup_for_tex(&ssd->cursor_fb, width, height, texture, fals= e); } else { egl_fb_destroy(&ssd->cursor_fb); } @@ -1026,6 +1029,7 @@ static void qemu_spice_gl_update(DisplayChangeListene= r *dcl, bool y_0_top =3D false; /* FIXME */ uint64_t cookie; int fd; + uint32_t width, height, texture; =20 if (!ssd->have_scanout) { return; @@ -1042,41 +1046,45 @@ static void qemu_spice_gl_update(DisplayChangeListe= ner *dcl, =20 if (ssd->guest_dmabuf_refresh) { QemuDmaBuf *dmabuf =3D ssd->guest_dmabuf; + width =3D qemu_dmabuf_get_width(dmabuf); + height =3D qemu_dmabuf_get_height(dmabuf); + if (render_cursor) { egl_dmabuf_import_texture(dmabuf); - if (!dmabuf->texture) { + texture =3D qemu_dmabuf_get_texture(dmabuf); + if (!texture) { return; } =20 /* 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); =20 /* dest framebuffer */ - if (ssd->blit_fb.width !=3D dmabuf->width || - ssd->blit_fb.height !=3D dmabuf->height) { - trace_qemu_spice_gl_render_dmabuf(ssd->qxl.id, dmabuf->wid= th, - dmabuf->height); + if (ssd->blit_fb.width !=3D width || + ssd->blit_fb.height !=3D 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 =3D 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->heig= ht); + stride =3D qemu_dmabuf_get_stride(dmabuf); + fourcc =3D qemu_dmabuf_get_fourcc(dmabuf); + y_0_top =3D qemu_dmabuf_get_y0_top(dmabuf); + fd =3D qemu_dmabuf_dup_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, fd, width, height, + stride, fourcc, y_0_top); } - qemu_spice_gl_monitor_config(ssd, 0, 0, dmabuf->width, dmabuf->hei= ght); + qemu_spice_gl_monitor_config(ssd, 0, 0, width, height); ssd->guest_dmabuf_refresh =3D false; } =20 --=20 2.34.1