mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 00:58:05 +02:00
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:
parent
01ac52f05c
commit
765e6ad2fc
4 changed files with 18 additions and 13 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue