* [PATCH 0/2] Implementation of resource_query_layout
@ 2023-11-10 7:40 Julia Zhang
2023-11-10 7:40 ` [PATCH 1/2] virgl: Implement resource_query_layout Julia Zhang
2023-11-10 7:40 ` [PATCH 2/2] virgl: Modify resource_query_layout Julia Zhang
0 siblings, 2 replies; 3+ messages in thread
From: Julia Zhang @ 2023-11-10 7:40 UTC (permalink / raw)
To: Gerd Hoffmann, Michael S . Tsirkin, Stefano Stabellini,
Anthony PERARD, Antonio Caggiano, Dr . David Alan Gilbert,
Robert Beckett, qemu-devel
Cc: xen-devel, Alex Deucher, Christian König, Xenia Ragiadakou,
Honglei Huang, Julia Zhang, Chen Jiqian
This add implementation of resource_query_layout to get the information of
how the host has actually allocated the buffer. This function is now used
to query the stride for guest linear resource for dGPU prime on guest VMs.
Related mesa mr: https:
//gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23896
virglrenderer mr: https:
//gitlab.freedesktop.org/virgl/virglrenderer/-/merge_requests/1268
Daniel Stone (1):
virgl: Implement resource_query_layout
Julia Zhang (1):
virgl: Modify resource_query_layout
hw/display/virtio-gpu-base.c | 4 +++
hw/display/virtio-gpu-virgl.c | 35 +++++++++++++++++++++
include/hw/virtio/virtio-gpu-bswap.h | 7 +++++
include/standard-headers/linux/virtio_gpu.h | 29 +++++++++++++++++
meson.build | 4 +++
5 files changed, 79 insertions(+)
--
2.34.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/2] virgl: Implement resource_query_layout
2023-11-10 7:40 [PATCH 0/2] Implementation of resource_query_layout Julia Zhang
@ 2023-11-10 7:40 ` Julia Zhang
2023-11-10 7:40 ` [PATCH 2/2] virgl: Modify resource_query_layout Julia Zhang
1 sibling, 0 replies; 3+ messages in thread
From: Julia Zhang @ 2023-11-10 7:40 UTC (permalink / raw)
To: Gerd Hoffmann, Michael S . Tsirkin, Stefano Stabellini,
Anthony PERARD, Antonio Caggiano, Dr . David Alan Gilbert,
Robert Beckett, qemu-devel
Cc: xen-devel, Alex Deucher, Christian König, Xenia Ragiadakou,
Honglei Huang, Julia Zhang, Chen Jiqian, Daniel Stone
From: Daniel Stone <daniels@collabora.com>
A new ioctl to shuttle information between host and guest about the
actual buffer allocation, which can be used for interop between GL and
Vulkan when supporting standard window systems.
---
hw/display/virtio-gpu-base.c | 4 ++
hw/display/virtio-gpu-virgl.c | 49 +++++++++++++++++++++
include/hw/virtio/virtio-gpu-bswap.h | 7 +++
include/standard-headers/linux/virtio_gpu.h | 29 ++++++++++++
meson.build | 4 ++
5 files changed, 93 insertions(+)
diff --git a/hw/display/virtio-gpu-base.c b/hw/display/virtio-gpu-base.c
index 8d8aa2c88f..efaa681e54 100644
--- a/hw/display/virtio-gpu-base.c
+++ b/hw/display/virtio-gpu-base.c
@@ -246,6 +246,10 @@ virtio_gpu_base_get_features(VirtIODevice *vdev, uint64_t features,
features |= (1 << VIRTIO_GPU_F_RESOURCE_UUID);
features |= (1 << VIRTIO_GPU_F_CONTEXT_FENCE_WAIT);
+#ifdef HAVE_VIRGL_RESOURCE_QUERY_LAYOUT
+ features |= (1 << VIRTIO_GPU_F_RESOURCE_QUERY_LAYOUT);
+#endif /* HAVE_VIRGL_RESOURCE_QUERY_LAYOUT */
+
return features;
}
diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c
index 2ac9a8b864..9c5a07cef1 100644
--- a/hw/display/virtio-gpu-virgl.c
+++ b/hw/display/virtio-gpu-virgl.c
@@ -715,6 +715,55 @@ static void virgl_cmd_resource_unmap_blob(VirtIOGPU *g,
virtio_gpu_virgl_resource_unmap(g, cmd->cmd_hdr.ctx_id, res);
}
+#ifdef HAVE_VIRGL_RESOURCE_QUERY_LAYOUT
+static void virgl_cmd_resource_query_layout(VirtIOGPU *g,
+ struct virtio_gpu_ctrl_command *cmd)
+{
+ struct virtio_gpu_simple_resource *res;
+ struct virtio_gpu_resource_query_layout qlayout;
+ struct virtio_gpu_resp_resource_layout resp;
+ struct virgl_renderer_resource_layout rlayout;
+ int ret;
+ int i;
+ VIRTIO_GPU_FILL_CMD(qlayout);
+ virtio_gpu_resource_query_layout_bswap(&qlayout);
+
+ if (qlayout.resource_id == 0) {
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: resource id 0 is not allowed\n",
+ __func__);
+ cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID;
+ return;
+ }
+
+ res = virtio_gpu_find_resource(g, qlayout.resource_id);
+ if (!res) {
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: resource does not exist %d\n",
+ __func__, qlayout.resource_id);
+ cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID;
+ return;
+ }
+
+ ret = virgl_renderer_resource_query_layout(qlayout.resource_id, &rlayout);
+ if (ret != 0) {
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: resource %d is not externally-allocated\n",
+ __func__, qlayout.resource_id);
+ cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID;
+ return;
+ }
+
+ memset(&resp, 0, sizeof(resp));
+ resp.hdr.type = VIRTIO_GPU_RESP_OK_RESOURCE_LAYOUT;
+ resp.num_planes = rlayout.num_planes;
+ resp.modifier = rlayout.modifier;
+ for (i = 0; i < resp.num_planes; i++) {
+ resp.planes[i].offset = rlayout.planes[i].offset;
+ resp.planes[i].stride = rlayout.planes[i].stride;
+ resp.planes[i].size = rlayout.planes[i].size;
+ }
+ virtio_gpu_ctrl_response(g, cmd, &resp.hdr, sizeof(resp));
+}
+#endif /* HAVE_VIRGL_RESOURCE_QUERY_LAYOUT */
+
void virtio_gpu_virgl_process_cmd(VirtIOGPU *g,
struct virtio_gpu_ctrl_command *cmd)
{
diff --git a/include/hw/virtio/virtio-gpu-bswap.h b/include/hw/virtio/virtio-gpu-bswap.h
index 8bbca1e751..49316758cc 100644
--- a/include/hw/virtio/virtio-gpu-bswap.h
+++ b/include/hw/virtio/virtio-gpu-bswap.h
@@ -99,4 +99,11 @@ virtio_gpu_host_wait_bswap(struct virtio_gpu_cmd_host_wait *host_wait)
le64_to_cpus(&host_wait->fence_id);
}
+static inline void
+virtio_gpu_resource_query_layout_bswap(struct virtio_gpu_resource_query_layout *rql)
+{
+ virtio_gpu_ctrl_hdr_bswap(&rql->hdr);
+ le32_to_cpus(&rql->resource_id);
+}
+
#endif
diff --git a/include/standard-headers/linux/virtio_gpu.h b/include/standard-headers/linux/virtio_gpu.h
index a04419757f..734fdb6beb 100644
--- a/include/standard-headers/linux/virtio_gpu.h
+++ b/include/standard-headers/linux/virtio_gpu.h
@@ -70,6 +70,11 @@
*/
#define VIRTIO_GPU_F_CONTEXT_FENCE_WAIT 5
+/*
+ * VIRTIO_GPU_CMD_RESOURCE_QUERY_LAYOUT
+ */
+#define VIRTIO_GPU_F_RESOURCE_QUERY_LAYOUT 6
+
enum virtio_gpu_ctrl_type {
VIRTIO_GPU_UNDEFINED = 0,
@@ -102,6 +107,7 @@ enum virtio_gpu_ctrl_type {
VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB,
VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB,
VIRTIO_GPU_CMD_WAIT_FENCE,
+ VIRTIO_GPU_CMD_RESOURCE_QUERY_LAYOUT,
/* cursor commands */
VIRTIO_GPU_CMD_UPDATE_CURSOR = 0x0300,
@@ -115,6 +121,7 @@ enum virtio_gpu_ctrl_type {
VIRTIO_GPU_RESP_OK_EDID,
VIRTIO_GPU_RESP_OK_RESOURCE_UUID,
VIRTIO_GPU_RESP_OK_MAP_INFO,
+ VIRTIO_GPU_RESP_OK_RESOURCE_LAYOUT,
/* error responses */
VIRTIO_GPU_RESP_ERR_UNSPEC = 0x1200,
@@ -495,4 +502,26 @@ struct virtio_gpu_status_freezing {
__u32 freezing;
};
+/* VIRTIO_GPU_CMD_RESOURCE_QUERY_LAYOUT */
+struct virtio_gpu_resource_query_layout {
+ struct virtio_gpu_ctrl_hdr hdr;
+ uint32_t resource_id;
+ uint32_t padding;
+};
+
+/* VIRTIO_GPU_RESP_OK_RESOURCE_LAYOUT */
+#define VIRTIO_GPU_RES_MAX_PLANES 4
+struct virtio_gpu_resp_resource_layout {
+ struct virtio_gpu_ctrl_hdr hdr;
+ uint64_t modifier;
+ uint32_t num_planes;
+ uint32_t padding;
+ struct virtio_gpu_resource_plane {
+ uint64_t offset;
+ uint64_t size;
+ uint32_t stride;
+ uint32_t padding;
+ } planes[VIRTIO_GPU_RES_MAX_PLANES];
+};
+
#endif
diff --git a/meson.build b/meson.build
index 59235aff28..0c20a00daa 100644
--- a/meson.build
+++ b/meson.build
@@ -790,6 +790,10 @@ if not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
'get_egl_display',
prefix: '#include <virglrenderer.h>',
dependencies: virgl))
+ config_host_data.set('HAVE_VIRGL_RESOURCE_QUERY_LAYOUT',
+ cc.has_function('virgl_renderer_resource_query_layout',
+ prefix: '#include <virglrenderer.h>',
+ dependencies: virgl))
endif
blkio = not_found
if not get_option('blkio').auto() or have_block
--
2.34.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/2] virgl: Modify resource_query_layout
2023-11-10 7:40 [PATCH 0/2] Implementation of resource_query_layout Julia Zhang
2023-11-10 7:40 ` [PATCH 1/2] virgl: Implement resource_query_layout Julia Zhang
@ 2023-11-10 7:40 ` Julia Zhang
1 sibling, 0 replies; 3+ messages in thread
From: Julia Zhang @ 2023-11-10 7:40 UTC (permalink / raw)
To: Gerd Hoffmann, Michael S . Tsirkin, Stefano Stabellini,
Anthony PERARD, Antonio Caggiano, Dr . David Alan Gilbert,
Robert Beckett, qemu-devel
Cc: xen-devel, Alex Deucher, Christian König, Xenia Ragiadakou,
Honglei Huang, Julia Zhang, Chen Jiqian
Modify resource_query_layout to handle the use case that need to query
correct stride for guest linear resource before it is created.
Signed-off-by: Julia Zhang <julia.zhang@amd.com>
---
hw/display/virtio-gpu-virgl.c | 20 +++-----------------
include/standard-headers/linux/virtio_gpu.h | 8 ++++----
2 files changed, 7 insertions(+), 21 deletions(-)
diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c
index 9c5a07cef1..ae146a68cb 100644
--- a/hw/display/virtio-gpu-virgl.c
+++ b/hw/display/virtio-gpu-virgl.c
@@ -728,22 +728,9 @@ static void virgl_cmd_resource_query_layout(VirtIOGPU *g,
VIRTIO_GPU_FILL_CMD(qlayout);
virtio_gpu_resource_query_layout_bswap(&qlayout);
- if (qlayout.resource_id == 0) {
- qemu_log_mask(LOG_GUEST_ERROR, "%s: resource id 0 is not allowed\n",
- __func__);
- cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID;
- return;
- }
-
- res = virtio_gpu_find_resource(g, qlayout.resource_id);
- if (!res) {
- qemu_log_mask(LOG_GUEST_ERROR, "%s: resource does not exist %d\n",
- __func__, qlayout.resource_id);
- cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID;
- return;
- }
-
- ret = virgl_renderer_resource_query_layout(qlayout.resource_id, &rlayout);
+ ret = virgl_renderer_resource_query_layout(qlayout.resource_id, &rlayout,
+ qlayout.width, qlayout.height,
+ qlayout.format, qlayout.bind);
if (ret != 0) {
qemu_log_mask(LOG_GUEST_ERROR, "%s: resource %d is not externally-allocated\n",
__func__, qlayout.resource_id);
@@ -758,7 +745,6 @@ static void virgl_cmd_resource_query_layout(VirtIOGPU *g,
for (i = 0; i < resp.num_planes; i++) {
resp.planes[i].offset = rlayout.planes[i].offset;
resp.planes[i].stride = rlayout.planes[i].stride;
- resp.planes[i].size = rlayout.planes[i].size;
}
virtio_gpu_ctrl_response(g, cmd, &resp.hdr, sizeof(resp));
}
diff --git a/include/standard-headers/linux/virtio_gpu.h b/include/standard-headers/linux/virtio_gpu.h
index 734fdb6beb..6fb0f711c8 100644
--- a/include/standard-headers/linux/virtio_gpu.h
+++ b/include/standard-headers/linux/virtio_gpu.h
@@ -506,7 +506,10 @@ struct virtio_gpu_status_freezing {
struct virtio_gpu_resource_query_layout {
struct virtio_gpu_ctrl_hdr hdr;
uint32_t resource_id;
- uint32_t padding;
+ uint32_t width;
+ uint32_t height;
+ uint32_t format;
+ uint32_t bind;
};
/* VIRTIO_GPU_RESP_OK_RESOURCE_LAYOUT */
@@ -515,12 +518,9 @@ struct virtio_gpu_resp_resource_layout {
struct virtio_gpu_ctrl_hdr hdr;
uint64_t modifier;
uint32_t num_planes;
- uint32_t padding;
struct virtio_gpu_resource_plane {
uint64_t offset;
- uint64_t size;
uint32_t stride;
- uint32_t padding;
} planes[VIRTIO_GPU_RES_MAX_PLANES];
};
--
2.34.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2023-11-10 14:15 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-11-10 7:40 [PATCH 0/2] Implementation of resource_query_layout Julia Zhang
2023-11-10 7:40 ` [PATCH 1/2] virgl: Implement resource_query_layout Julia Zhang
2023-11-10 7:40 ` [PATCH 2/2] virgl: Modify resource_query_layout Julia Zhang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).