[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 02/14] contrib/vhost-user-gpu: add support for sending dmabuf modi
From: |
marcandre . lureau |
Subject: |
[PULL 02/14] contrib/vhost-user-gpu: add support for sending dmabuf modifiers |
Date: |
Tue, 12 Sep 2023 14:46:36 +0400 |
From: Erico Nunes <ernunes@redhat.com>
virglrenderer recently added virgl_renderer_resource_get_info_ext as a
new api, which gets resource information, including dmabuf modifiers.
We have to support dmabuf modifiers since the driver may choose to
allocate buffers with these modifiers for efficiency, and importing
buffers without modifiers information may result in completely broken
rendering.
Signed-off-by: Erico Nunes <ernunes@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Sergio Lopez <slp@redhat.com>
Message-Id: <20230714153900.475857-3-ernunes@redhat.com>
---
contrib/vhost-user-gpu/vugpu.h | 9 +++++
contrib/vhost-user-gpu/vhost-user-gpu.c | 5 ++-
contrib/vhost-user-gpu/virgl.c | 51 +++++++++++++++++++++++--
3 files changed, 61 insertions(+), 4 deletions(-)
diff --git a/contrib/vhost-user-gpu/vugpu.h b/contrib/vhost-user-gpu/vugpu.h
index f0f2069c47..509b679f03 100644
--- a/contrib/vhost-user-gpu/vugpu.h
+++ b/contrib/vhost-user-gpu/vugpu.h
@@ -37,6 +37,7 @@ typedef enum VhostUserGpuRequest {
VHOST_USER_GPU_DMABUF_SCANOUT,
VHOST_USER_GPU_DMABUF_UPDATE,
VHOST_USER_GPU_GET_EDID,
+ VHOST_USER_GPU_DMABUF_SCANOUT2,
} VhostUserGpuRequest;
typedef struct VhostUserGpuDisplayInfoReply {
@@ -84,6 +85,11 @@ typedef struct VhostUserGpuDMABUFScanout {
int fd_drm_fourcc;
} QEMU_PACKED VhostUserGpuDMABUFScanout;
+typedef struct VhostUserGpuDMABUFScanout2 {
+ struct VhostUserGpuDMABUFScanout dmabuf_scanout;
+ uint64_t modifier;
+} QEMU_PACKED VhostUserGpuDMABUFScanout2;
+
typedef struct VhostUserGpuEdidRequest {
uint32_t scanout_id;
} QEMU_PACKED VhostUserGpuEdidRequest;
@@ -98,6 +104,7 @@ typedef struct VhostUserGpuMsg {
VhostUserGpuScanout scanout;
VhostUserGpuUpdate update;
VhostUserGpuDMABUFScanout dmabuf_scanout;
+ VhostUserGpuDMABUFScanout2 dmabuf_scanout2;
VhostUserGpuEdidRequest edid_req;
struct virtio_gpu_resp_edid resp_edid;
struct virtio_gpu_resp_display_info display_info;
@@ -112,6 +119,7 @@ static VhostUserGpuMsg m __attribute__ ((unused));
#define VHOST_USER_GPU_MSG_FLAG_REPLY 0x4
#define VHOST_USER_GPU_PROTOCOL_F_EDID 0
+#define VHOST_USER_GPU_PROTOCOL_F_DMABUF2 1
struct virtio_gpu_scanout {
uint32_t width, height;
@@ -132,6 +140,7 @@ typedef struct VuGpu {
bool virgl;
bool virgl_inited;
bool edid_inited;
+ bool use_modifiers;
uint32_t inflight;
struct virtio_gpu_scanout scanout[VIRTIO_GPU_MAX_SCANOUTS];
diff --git a/contrib/vhost-user-gpu/vhost-user-gpu.c
b/contrib/vhost-user-gpu/vhost-user-gpu.c
index 2e7815a7a3..aa304475a0 100644
--- a/contrib/vhost-user-gpu/vhost-user-gpu.c
+++ b/contrib/vhost-user-gpu/vhost-user-gpu.c
@@ -1071,6 +1071,7 @@ static gboolean
protocol_features_cb(gint fd, GIOCondition condition, gpointer user_data)
{
const uint64_t protocol_edid = (1 << VHOST_USER_GPU_PROTOCOL_F_EDID);
+ const uint64_t protocol_dmabuf2 = (1 << VHOST_USER_GPU_PROTOCOL_F_DMABUF2);
VuGpu *g = user_data;
uint64_t protocol_features;
VhostUserGpuMsg msg = {
@@ -1082,7 +1083,7 @@ protocol_features_cb(gint fd, GIOCondition condition,
gpointer user_data)
return G_SOURCE_CONTINUE;
}
- protocol_features &= protocol_edid;
+ protocol_features &= (protocol_edid | protocol_dmabuf2);
msg = (VhostUserGpuMsg) {
.request = VHOST_USER_GPU_SET_PROTOCOL_FEATURES,
@@ -1100,6 +1101,8 @@ protocol_features_cb(gint fd, GIOCondition condition,
gpointer user_data)
exit(EXIT_FAILURE);
}
+ g->use_modifiers = !!(protocol_features & protocol_dmabuf2);
+
return G_SOURCE_REMOVE;
}
diff --git a/contrib/vhost-user-gpu/virgl.c b/contrib/vhost-user-gpu/virgl.c
index 211aa110a9..1da6cc1588 100644
--- a/contrib/vhost-user-gpu/virgl.c
+++ b/contrib/vhost-user-gpu/virgl.c
@@ -318,6 +318,37 @@ virgl_resource_detach_backing(VuGpu *g,
vg_cleanup_mapping_iov(g, res_iovs, num_iovs);
}
+static int
+virgl_get_resource_info_modifiers(uint32_t resource_id,
+ struct virgl_renderer_resource_info *info,
+ uint64_t *modifiers)
+{
+ int ret;
+#ifdef VIRGL_RENDERER_RESOURCE_INFO_EXT_VERSION
+ struct virgl_renderer_resource_info_ext info_ext;
+ ret = virgl_renderer_resource_get_info_ext(resource_id, &info_ext);
+ if (ret < 0) {
+ return ret;
+ }
+
+ *info = info_ext.base;
+ *modifiers = info_ext.modifiers;
+#else
+ ret = virgl_renderer_resource_get_info(resource_id, info);
+ if (ret < 0) {
+ return ret;
+ }
+
+ /*
+ * Before virgl_renderer_resource_get_info_ext,
+ * getting the modifiers was not possible.
+ */
+ *modifiers = 0;
+#endif
+
+ return 0;
+}
+
static void
virgl_cmd_set_scanout(VuGpu *g,
struct virtio_gpu_ctrl_command *cmd)
@@ -338,7 +369,9 @@ virgl_cmd_set_scanout(VuGpu *g,
memset(&info, 0, sizeof(info));
if (ss.resource_id && ss.r.width && ss.r.height) {
- ret = virgl_renderer_resource_get_info(ss.resource_id, &info);
+ uint64_t modifiers = 0;
+ ret = virgl_get_resource_info_modifiers(ss.resource_id, &info,
+ &modifiers);
if (ret == -1) {
g_critical("%s: illegal resource specified %d\n",
__func__, ss.resource_id);
@@ -354,8 +387,6 @@ virgl_cmd_set_scanout(VuGpu *g,
}
assert(fd >= 0);
VhostUserGpuMsg msg = {
- .request = VHOST_USER_GPU_DMABUF_SCANOUT,
- .size = sizeof(VhostUserGpuDMABUFScanout),
.payload.dmabuf_scanout.scanout_id = ss.scanout_id,
.payload.dmabuf_scanout.x = ss.r.x,
.payload.dmabuf_scanout.y = ss.r.y,
@@ -367,6 +398,20 @@ virgl_cmd_set_scanout(VuGpu *g,
.payload.dmabuf_scanout.fd_flags = info.flags,
.payload.dmabuf_scanout.fd_drm_fourcc = info.drm_fourcc
};
+
+ if (g->use_modifiers) {
+ /*
+ * The mesage uses all the fields set in dmabuf_scanout plus
+ * modifiers which is appended after VhostUserGpuDMABUFScanout.
+ */
+ msg.request = VHOST_USER_GPU_DMABUF_SCANOUT2;
+ msg.size = sizeof(VhostUserGpuDMABUFScanout2);
+ msg.payload.dmabuf_scanout2.modifier = modifiers;
+ } else {
+ msg.request = VHOST_USER_GPU_DMABUF_SCANOUT;
+ msg.size = sizeof(VhostUserGpuDMABUFScanout);
+ }
+
vg_send_msg(g, &msg, fd);
close(fd);
} else {
--
2.41.0
- [PULL 00/14] Ui patches, marcandre . lureau, 2023/09/12
- [PULL 01/14] docs: vhost-user-gpu: add protocol changes for dmabuf modifiers, marcandre . lureau, 2023/09/12
- [PULL 02/14] contrib/vhost-user-gpu: add support for sending dmabuf modifiers,
marcandre . lureau <=
- [PULL 03/14] vhost-user-gpu: support dmabuf modifiers, marcandre . lureau, 2023/09/12
- [PULL 04/14] vmmouse: replace DPRINTF with tracing, marcandre . lureau, 2023/09/12
- [PULL 05/14] vmmouse: use explicit code, marcandre . lureau, 2023/09/12
- [PULL 06/14] ui/vc: remove kbd_put_keysym() and update function calls, marcandre . lureau, 2023/09/12
- [PULL 07/14] ui/vc: rename kbd_put to qemu_text_console functions, marcandre . lureau, 2023/09/12
- [PULL 08/14] ui/console: remove redundant format field, marcandre . lureau, 2023/09/12
- [PULL 09/14] ui/vc: preliminary QemuTextConsole changes before split, marcandre . lureau, 2023/09/12
- [PULL 10/14] ui/vc: split off the VC part from console.c, marcandre . lureau, 2023/09/12
- [PULL 11/14] ui/console: move DisplaySurface to its own header, marcandre . lureau, 2023/09/12
- [PULL 12/14] virtio-gpu/win32: set the destroy function on load, marcandre . lureau, 2023/09/12