asahi,hk: generalize bo_bind hook

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30633>
This commit is contained in:
Alyssa Rosenzweig 2024-08-01 13:35:18 -04:00
parent 01ac52f05c
commit 765e6ad2fc
4 changed files with 18 additions and 13 deletions

View file

@ -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);

View file

@ -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,

View file

@ -9,6 +9,7 @@
#include <sys/mman.h>
#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),

View file

@ -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;
}