aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>2024-01-22 14:01:02 +0100
committerPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>2024-04-04 19:00:55 +0200
commit3e4c40a9da025303ddfaa99c18ee8019cfab1d5e (patch)
tree1eb24320c221078c3b348380f69d7be280971da5
parent4717292c127df7bbb977a61a4c3c899462d0f997 (diff)
downloadvirglrenderer-3e4c40a9da025303ddfaa99c18ee8019cfab1d5e.tar.gz
virgl: create transient dmabuf in resource_map
This allows to map the resource without lifecycle issues nor exceeding the open file descriptors limit. (suggested by Rob Clark) Reviewed-by: Rob Clark <robdclark@gmail.com> Part-of: <https://gitlab.freedesktop.org/virgl/virglrenderer/-/merge_requests/1330>
-rw-r--r--src/virglrenderer.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/virglrenderer.c b/src/virglrenderer.c
index 5307c2a9..5ae375f7 100644
--- a/src/virglrenderer.c
+++ b/src/virglrenderer.c
@@ -1211,10 +1211,17 @@ int virgl_renderer_resource_map(uint32_t res_handle, void **out_map, uint64_t *o
if (!ret)
res->map_size = map_size;
} else {
- switch (res->fd_type) {
+ enum virgl_resource_fd_type fd_type = res->fd_type;
+ int fd = res->fd;
+
+ /* Create a transient dmabuf. */
+ if (fd_type == VIRGL_RESOURCE_OPAQUE_HANDLE)
+ fd_type = virgl_resource_export_fd(res, &fd);
+
+ switch (fd_type) {
case VIRGL_RESOURCE_FD_DMABUF:
case VIRGL_RESOURCE_FD_SHM:
- map = mmap(NULL, res->map_size, PROT_WRITE | PROT_READ, MAP_SHARED, res->fd, 0);
+ map = mmap(NULL, res->map_size, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0);
map_size = res->map_size;
break;
case VIRGL_RESOURCE_FD_OPAQUE:
@@ -1227,6 +1234,9 @@ int virgl_renderer_resource_map(uint32_t res_handle, void **out_map, uint64_t *o
*/
break;
}
+
+ if (fd_type != res->fd_type)
+ close(fd);
}
if (!map || map == MAP_FAILED)
@@ -1252,12 +1262,12 @@ int virgl_renderer_resource_unmap(uint32_t res_handle)
switch (res->fd_type) {
case VIRGL_RESOURCE_FD_DMABUF:
case VIRGL_RESOURCE_FD_SHM:
+ case VIRGL_RESOURCE_OPAQUE_HANDLE:
ret = munmap(res->mapped, res->map_size);
break;
case VIRGL_RESOURCE_FD_OPAQUE:
ret = vkr_allocator_resource_unmap(res);
break;
- case VIRGL_RESOURCE_OPAQUE_HANDLE:
case VIRGL_RESOURCE_FD_INVALID:
/* Avoid a default case so that -Wswitch will tell us at compile time
* if a new virgl resource type is added without being handled here.