From 765e6ad2fcf4be3d1a3ae4c033519dbe9928e1a6 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Thu, 1 Aug 2024 13:35:18 -0400 Subject: [PATCH] asahi,hk: generalize bo_bind hook Signed-off-by: Alyssa Rosenzweig Part-of: --- src/asahi/lib/agx_device.c | 14 +++++++------- src/asahi/lib/agx_device.h | 3 ++- src/asahi/lib/agx_device_virtio.c | 10 +++++++--- src/asahi/vulkan/hk_buffer.c | 4 ++-- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/asahi/lib/agx_device.c b/src/asahi/lib/agx_device.c index c533caecb95..b4b6ecbe66e 100644 --- a/src/asahi/lib/agx_device.c +++ b/src/asahi/lib/agx_device.c @@ -97,15 +97,15 @@ agx_bo_free(struct agx_device *dev, struct agx_bo *bo) static int agx_bo_bind(struct agx_device *dev, struct agx_bo *bo, uint64_t addr, - uint32_t flags) + size_t size_B, uint64_t offset_B, uint32_t flags, bool unbind) { struct drm_asahi_gem_bind gem_bind = { - .op = ASAHI_BIND_OP_BIND, + .op = unbind ? ASAHI_BIND_OP_UNBIND : ASAHI_BIND_OP_BIND, .flags = flags, .handle = bo->handle, .vm_id = dev->vm_id, - .offset = 0, - .range = bo->size, + .offset = offset_B, + .range = size_B, .addr = addr, }; @@ -176,7 +176,7 @@ agx_bo_alloc(struct agx_device *dev, size_t size, size_t align, bind |= ASAHI_BIND_WRITE; } - ret = dev->ops.bo_bind(dev, bo, bo->va->addr, bind); + ret = dev->ops.bo_bind(dev, bo, bo->va->addr, bo->size, 0, bind, false); if (ret) { agx_bo_free(dev, bo); return NULL; @@ -272,8 +272,8 @@ agx_bo_import(struct agx_device *dev, int fd) bo->vbo_res_id = vdrm_handle_to_res_id(dev->vdrm, bo->handle); } - ret = dev->ops.bo_bind(dev, bo, bo->va->addr, - ASAHI_BIND_READ | ASAHI_BIND_WRITE); + ret = dev->ops.bo_bind(dev, bo, bo->va->addr, bo->size, 0, + ASAHI_BIND_READ | ASAHI_BIND_WRITE, false); if (ret) { fprintf(stderr, "import failed: Could not bind BO at 0x%llx\n", (long long)bo->va->addr); diff --git a/src/asahi/lib/agx_device.h b/src/asahi/lib/agx_device.h index c9ab7eb0829..bc489b108cf 100644 --- a/src/asahi/lib/agx_device.h +++ b/src/asahi/lib/agx_device.h @@ -65,7 +65,8 @@ typedef struct { struct agx_bo *(*bo_alloc)(struct agx_device *dev, size_t size, size_t align, enum agx_bo_flags flags); int (*bo_bind)(struct agx_device *dev, struct agx_bo *bo, uint64_t addr, - uint32_t flags); + size_t size_B, uint64_t offset_B, uint32_t flags, + bool unbind); void (*bo_mmap)(struct agx_device *dev, struct agx_bo *bo); ssize_t (*get_params)(struct agx_device *dev, void *buf, size_t size); int (*submit)(struct agx_device *dev, struct drm_asahi_submit *submit, diff --git a/src/asahi/lib/agx_device_virtio.c b/src/asahi/lib/agx_device_virtio.c index 1435aa90a4c..7ab3fb04cd7 100644 --- a/src/asahi/lib/agx_device_virtio.c +++ b/src/asahi/lib/agx_device_virtio.c @@ -9,6 +9,7 @@ #include #include "drm-uapi/virtgpu_drm.h" +#include "unstable_asahi_drm.h" #define VIRGL_RENDERER_UNSTABLE_APIS 1 #include "vdrm.h" @@ -123,14 +124,17 @@ agx_virtio_bo_alloc(struct agx_device *dev, size_t size, size_t align, static int agx_virtio_bo_bind(struct agx_device *dev, struct agx_bo *bo, uint64_t addr, - uint32_t flags) + size_t size_B, uint64_t offset_B, uint32_t flags, + bool unbind) { + assert(offset_B == 0 && "TODO: need to extend virtgpu"); + struct asahi_ccmd_gem_bind_req req = { - .op = ASAHI_BIND_OP_BIND, + .op = unbind ? ASAHI_BIND_OP_UNBIND : ASAHI_BIND_OP_BIND, .flags = flags, .vm_id = dev->vm_id, .res_id = bo->vbo_res_id, - .size = bo->size, + .size = size_B, .addr = addr, .hdr.cmd = ASAHI_CCMD_GEM_BIND, .hdr.len = sizeof(struct asahi_ccmd_gem_bind_req), diff --git a/src/asahi/vulkan/hk_buffer.c b/src/asahi/vulkan/hk_buffer.c index c19548904d2..46f8957f770 100644 --- a/src/asahi/vulkan/hk_buffer.c +++ b/src/asahi/vulkan/hk_buffer.c @@ -237,9 +237,9 @@ hk_BindBufferMemory2(VkDevice device, uint32_t bindInfoCount, if (buffer->va) { VK_FROM_HANDLE(hk_device, dev, device); - /* XXX: offset, range */ dev->dev.ops.bo_bind(&dev->dev, mem->bo, buffer->addr, - ASAHI_BIND_READ | ASAHI_BIND_WRITE); + buffer->va->size_B, pBindInfos[i].memoryOffset, + ASAHI_BIND_READ | ASAHI_BIND_WRITE, false); } else { buffer->addr = mem->bo->va->addr + pBindInfos[i].memoryOffset; }