mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-03-06 20:50:31 +01:00
vdrm: Add fixed VA parameter for mapping memory
This is necessary for implementing VK_EXT_map_memory_placed in Turnip. Signed-off-by: Mark Collins <mark@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28928>
This commit is contained in:
parent
603982ea80
commit
854640ea26
3 changed files with 11 additions and 9 deletions
|
|
@ -44,7 +44,7 @@ virtio_bo_mmap(struct fd_bo *bo)
|
|||
});
|
||||
}
|
||||
|
||||
return vdrm_bo_map(vdrm, bo->handle, bo->size);
|
||||
return vdrm_bo_map(vdrm, bo->handle, bo->size, NULL);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ struct vdrm_device_funcs {
|
|||
uint32_t (*bo_create)(struct vdrm_device *vdev, size_t size, uint32_t blob_flags,
|
||||
uint64_t blob_id, struct vdrm_ccmd_req *req);
|
||||
int (*bo_wait)(struct vdrm_device *vdev, uint32_t handle);
|
||||
void *(*bo_map)(struct vdrm_device *vdev, uint32_t handle, size_t size);
|
||||
void *(*bo_map)(struct vdrm_device *vdev, uint32_t handle, size_t size, void *placed_addr);
|
||||
int (*bo_export_dmabuf)(struct vdrm_device *vdev, uint32_t handle);
|
||||
void (*bo_close)(struct vdrm_device *vdev, uint32_t handle);
|
||||
|
||||
|
|
@ -134,9 +134,9 @@ vdrm_bo_wait(struct vdrm_device *vdev, uint32_t handle)
|
|||
}
|
||||
|
||||
static inline void *
|
||||
vdrm_bo_map(struct vdrm_device *vdev, uint32_t handle, size_t size)
|
||||
vdrm_bo_map(struct vdrm_device *vdev, uint32_t handle, size_t size, void *placed_addr)
|
||||
{
|
||||
return vdev->funcs->bo_map(vdev, handle, size);
|
||||
return vdev->funcs->bo_map(vdev, handle, size, placed_addr);
|
||||
}
|
||||
|
||||
static inline int
|
||||
|
|
|
|||
|
|
@ -178,7 +178,7 @@ virtgpu_bo_create(struct vdrm_device *vdev, size_t size, uint32_t blob_flags,
|
|||
}
|
||||
|
||||
static int
|
||||
map_handle(int fd, uint32_t handle, size_t size, void **map)
|
||||
map_handle(int fd, uint32_t handle, size_t size, void **map, void *placed_addr)
|
||||
{
|
||||
struct drm_virtgpu_map req = {
|
||||
.handle = handle,
|
||||
|
|
@ -191,7 +191,9 @@ map_handle(int fd, uint32_t handle, size_t size, void **map)
|
|||
return ret;
|
||||
}
|
||||
|
||||
*map = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, req.offset);
|
||||
*map = mmap(placed_addr, size, PROT_READ | PROT_WRITE,
|
||||
MAP_SHARED | (placed_addr != NULL ? MAP_FIXED : 0),
|
||||
fd, req.offset);
|
||||
if (*map == MAP_FAILED) {
|
||||
mesa_loge("failed to map handle: %s", strerror(errno));
|
||||
return -1;
|
||||
|
|
@ -218,13 +220,13 @@ virtgpu_bo_wait(struct vdrm_device *vdev, uint32_t handle)
|
|||
}
|
||||
|
||||
static void *
|
||||
virtgpu_bo_map(struct vdrm_device *vdev, uint32_t handle, size_t size)
|
||||
virtgpu_bo_map(struct vdrm_device *vdev, uint32_t handle, size_t size, void *placed_addr)
|
||||
{
|
||||
struct virtgpu_device *vgdev = to_virtgpu_device(vdev);
|
||||
void *map;
|
||||
int ret;
|
||||
|
||||
ret = map_handle(vgdev->fd, handle, size, &map);
|
||||
ret = map_handle(vgdev->fd, handle, size, &map, placed_addr);
|
||||
if (ret)
|
||||
return NULL;
|
||||
|
||||
|
|
@ -334,7 +336,7 @@ init_shmem(struct virtgpu_device *vgdev)
|
|||
|
||||
vgdev->shmem_handle = args.bo_handle;
|
||||
|
||||
ret = map_handle(vgdev->fd, vgdev->shmem_handle, args.size, (void **)&vdev->shmem);
|
||||
ret = map_handle(vgdev->fd, vgdev->shmem_handle, args.size, (void **)&vdev->shmem, NULL);
|
||||
if (ret) {
|
||||
gem_close(vgdev, vgdev->shmem_handle);
|
||||
vgdev->shmem_handle = 0;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue