From 823d889b21cd8a8d74cc09c681aec5308f5171c3 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Tue, 8 Jun 2021 11:43:28 -0700 Subject: [PATCH] venus: simplify vn_renderer_sync creation Remove the ability to init/release repeatedly. Signed-off-by: Chia-I Wu Reviewed-by: Yiwei Zhang Part-of: --- src/virtio/vulkan/vn_renderer.h | 135 ++++-------------------- src/virtio/vulkan/vn_renderer_virtgpu.c | 77 ++++++-------- src/virtio/vulkan/vn_renderer_vtest.c | 44 +++----- 3 files changed, 66 insertions(+), 190 deletions(-) diff --git a/src/virtio/vulkan/vn_renderer.h b/src/virtio/vulkan/vn_renderer.h index 223e8796dfb..18ec9388d01 100644 --- a/src/virtio/vulkan/vn_renderer.h +++ b/src/virtio/vulkan/vn_renderer.h @@ -177,20 +177,16 @@ enum vn_renderer_sync_flags { }; struct vn_renderer_sync_ops { - struct vn_renderer_sync *(*create)(struct vn_renderer *renderer); - void (*destroy)(struct vn_renderer *renderer, - struct vn_renderer_sync *sync); + VkResult (*create)(struct vn_renderer *renderer, + uint64_t initial_val, + uint32_t flags, + struct vn_renderer_sync **out_sync); - /* a sync can be initialized/released multiple times */ - VkResult (*init)(struct vn_renderer *renderer, - struct vn_renderer_sync *sync, - uint64_t initial_val, - uint32_t flags); - VkResult (*init_syncobj)(struct vn_renderer *renderer, - struct vn_renderer_sync *sync, - int fd, - bool sync_file); - void (*release)(struct vn_renderer *renderer, + VkResult (*create_from_syncobj)(struct vn_renderer *renderer, + int fd, + bool sync_file, + struct vn_renderer_sync **out_sync); + void (*destroy)(struct vn_renderer *renderer, struct vn_renderer_sync *sync); int (*export_syncobj)(struct vn_renderer *renderer, @@ -429,88 +425,22 @@ vn_renderer_bo_invalidate(struct vn_renderer *renderer, } static inline VkResult -vn_renderer_sync_create_cpu(struct vn_renderer *renderer, - struct vn_renderer_sync **_sync) +vn_renderer_sync_create(struct vn_renderer *renderer, + uint64_t initial_val, + uint32_t flags, + struct vn_renderer_sync **out_sync) { - struct vn_renderer_sync *sync = renderer->sync_ops.create(renderer); - if (!sync) - return VK_ERROR_OUT_OF_HOST_MEMORY; - - const uint64_t initial_val = 0; - const uint32_t flags = 0; - VkResult result = - renderer->sync_ops.init(renderer, sync, initial_val, flags); - if (result != VK_SUCCESS) { - renderer->sync_ops.destroy(renderer, sync); - return result; - } - - *_sync = sync; - return VK_SUCCESS; + return renderer->sync_ops.create(renderer, initial_val, flags, out_sync); } static inline VkResult -vn_renderer_sync_create_fence(struct vn_renderer *renderer, - bool signaled, - VkExternalFenceHandleTypeFlags external_handles, - struct vn_renderer_sync **_sync) +vn_renderer_sync_create_from_syncobj(struct vn_renderer *renderer, + int fd, + bool sync_file, + struct vn_renderer_sync **out_sync) { - struct vn_renderer_sync *sync = renderer->sync_ops.create(renderer); - if (!sync) - return VK_ERROR_OUT_OF_HOST_MEMORY; - - const uint64_t initial_val = signaled; - const uint32_t flags = VN_RENDERER_SYNC_BINARY | - (external_handles ? VN_RENDERER_SYNC_SHAREABLE : 0); - VkResult result = - renderer->sync_ops.init(renderer, sync, initial_val, flags); - if (result != VK_SUCCESS) { - renderer->sync_ops.destroy(renderer, sync); - return result; - } - - *_sync = sync; - return VK_SUCCESS; -} - -static inline VkResult -vn_renderer_sync_create_semaphore( - struct vn_renderer *renderer, - VkSemaphoreType type, - uint64_t initial_val, - VkExternalSemaphoreHandleTypeFlags external_handles, - struct vn_renderer_sync **_sync) -{ - struct vn_renderer_sync *sync = renderer->sync_ops.create(renderer); - if (!sync) - return VK_ERROR_OUT_OF_HOST_MEMORY; - - const uint32_t flags = - (external_handles ? VN_RENDERER_SYNC_SHAREABLE : 0) | - (type == VK_SEMAPHORE_TYPE_BINARY ? VN_RENDERER_SYNC_BINARY : 0); - VkResult result = - renderer->sync_ops.init(renderer, sync, initial_val, flags); - if (result != VK_SUCCESS) { - renderer->sync_ops.destroy(renderer, sync); - return result; - } - - *_sync = sync; - return VK_SUCCESS; -} - -static inline VkResult -vn_renderer_sync_create_empty(struct vn_renderer *renderer, - struct vn_renderer_sync **_sync) -{ - struct vn_renderer_sync *sync = renderer->sync_ops.create(renderer); - if (!sync) - return VK_ERROR_OUT_OF_HOST_MEMORY; - - /* no init */ - - *_sync = sync; - return VK_SUCCESS; + return renderer->sync_ops.create_from_syncobj(renderer, fd, sync_file, + out_sync); } static inline void @@ -520,31 +450,6 @@ vn_renderer_sync_destroy(struct vn_renderer *renderer, renderer->sync_ops.destroy(renderer, sync); } -static inline VkResult -vn_renderer_sync_init_signaled(struct vn_renderer *renderer, - struct vn_renderer_sync *sync) -{ - const uint64_t initial_val = 1; - const uint32_t flags = VN_RENDERER_SYNC_BINARY; - return renderer->sync_ops.init(renderer, sync, initial_val, flags); -} - -static inline VkResult -vn_renderer_sync_init_syncobj(struct vn_renderer *renderer, - struct vn_renderer_sync *sync, - int fd, - bool sync_file) -{ - return renderer->sync_ops.init_syncobj(renderer, sync, fd, sync_file); -} - -static inline void -vn_renderer_sync_release(struct vn_renderer *renderer, - struct vn_renderer_sync *sync) -{ - renderer->sync_ops.release(renderer, sync); -} - static inline int vn_renderer_sync_export_syncobj(struct vn_renderer *renderer, struct vn_renderer_sync *sync, diff --git a/src/virtio/vulkan/vn_renderer_virtgpu.c b/src/virtio/vulkan/vn_renderer_virtgpu.c index 023d3a10f65..80f2fff166f 100644 --- a/src/virtio/vulkan/vn_renderer_virtgpu.c +++ b/src/virtio/vulkan/vn_renderer_virtgpu.c @@ -951,7 +951,7 @@ virtgpu_sync_export_syncobj(struct vn_renderer *renderer, } static void -virtgpu_sync_release(struct vn_renderer *renderer, +virtgpu_sync_destroy(struct vn_renderer *renderer, struct vn_renderer_sync *_sync) { struct virtgpu *gpu = (struct virtgpu *)renderer; @@ -959,18 +959,16 @@ virtgpu_sync_release(struct vn_renderer *renderer, virtgpu_ioctl_syncobj_destroy(gpu, sync->syncobj_handle); - sync->syncobj_handle = 0; - sync->base.sync_id = 0; + free(sync); } static VkResult -virtgpu_sync_init_syncobj(struct vn_renderer *renderer, - struct vn_renderer_sync *_sync, - int fd, - bool sync_file) +virtgpu_sync_create_from_syncobj(struct vn_renderer *renderer, + int fd, + bool sync_file, + struct vn_renderer_sync **out_sync) { struct virtgpu *gpu = (struct virtgpu *)renderer; - struct virtgpu_sync *sync = (struct virtgpu_sync *)_sync; uint32_t syncobj_handle; if (sync_file) { @@ -987,20 +985,27 @@ virtgpu_sync_init_syncobj(struct vn_renderer *renderer, return VK_ERROR_INVALID_EXTERNAL_HANDLE; } + struct virtgpu_sync *sync = calloc(1, sizeof(*sync)); + if (!sync) { + virtgpu_ioctl_syncobj_destroy(gpu, syncobj_handle); + return VK_ERROR_OUT_OF_HOST_MEMORY; + } + sync->syncobj_handle = syncobj_handle; sync->base.sync_id = 0; /* TODO */ + *out_sync = &sync->base; + return VK_SUCCESS; } static VkResult -virtgpu_sync_init(struct vn_renderer *renderer, - struct vn_renderer_sync *_sync, - uint64_t initial_val, - uint32_t flags) +virtgpu_sync_create(struct vn_renderer *renderer, + uint64_t initial_val, + uint32_t flags, + struct vn_renderer_sync **out_sync) { struct virtgpu *gpu = (struct virtgpu *)renderer; - struct virtgpu_sync *sync = (struct virtgpu_sync *)_sync; /* TODO */ if (flags & VN_RENDERER_SYNC_SHAREABLE) @@ -1008,48 +1013,36 @@ virtgpu_sync_init(struct vn_renderer *renderer, /* always false because we don't use binary drm_syncobjs */ const bool signaled = false; - sync->syncobj_handle = virtgpu_ioctl_syncobj_create(gpu, signaled); - if (!sync->syncobj_handle) + const uint32_t syncobj_handle = + virtgpu_ioctl_syncobj_create(gpu, signaled); + if (!syncobj_handle) return VK_ERROR_OUT_OF_DEVICE_MEMORY; /* add a signaled fence chain with seqno initial_val */ - const int ret = virtgpu_ioctl_syncobj_timeline_signal( - gpu, sync->syncobj_handle, initial_val); + const int ret = + virtgpu_ioctl_syncobj_timeline_signal(gpu, syncobj_handle, initial_val); if (ret) { - virtgpu_sync_release(&gpu->base, &sync->base); + virtgpu_ioctl_syncobj_destroy(gpu, syncobj_handle); return VK_ERROR_OUT_OF_DEVICE_MEMORY; } + struct virtgpu_sync *sync = calloc(1, sizeof(*sync)); + if (!sync) { + virtgpu_ioctl_syncobj_destroy(gpu, syncobj_handle); + return VK_ERROR_OUT_OF_HOST_MEMORY; + } + + sync->syncobj_handle = syncobj_handle; /* we will have a sync_id when shareable is true and virtio-gpu associates * a host sync object with guest drm_syncobj */ sync->base.sync_id = 0; + *out_sync = &sync->base; + return VK_SUCCESS; } -static void -virtgpu_sync_destroy(struct vn_renderer *renderer, - struct vn_renderer_sync *_sync) -{ - struct virtgpu_sync *sync = (struct virtgpu_sync *)_sync; - - if (sync->syncobj_handle) - virtgpu_sync_release(renderer, &sync->base); - - free(sync); -} - -static struct vn_renderer_sync * -virtgpu_sync_create(struct vn_renderer *renderer) -{ - struct virtgpu_sync *sync = calloc(1, sizeof(*sync)); - if (!sync) - return NULL; - - return &sync->base; -} - static void virtgpu_bo_invalidate(struct vn_renderer *renderer, struct vn_renderer_bo *bo, @@ -1567,10 +1560,8 @@ virtgpu_init(struct virtgpu *gpu) gpu->base.bo_ops.invalidate = virtgpu_bo_invalidate; gpu->base.sync_ops.create = virtgpu_sync_create; + gpu->base.sync_ops.create_from_syncobj = virtgpu_sync_create_from_syncobj; gpu->base.sync_ops.destroy = virtgpu_sync_destroy; - gpu->base.sync_ops.init = virtgpu_sync_init; - gpu->base.sync_ops.init_syncobj = virtgpu_sync_init_syncobj; - gpu->base.sync_ops.release = virtgpu_sync_release; gpu->base.sync_ops.export_syncobj = virtgpu_sync_export_syncobj; gpu->base.sync_ops.reset = virtgpu_sync_reset; gpu->base.sync_ops.read = virtgpu_sync_read; diff --git a/src/virtio/vulkan/vn_renderer_vtest.c b/src/virtio/vulkan/vn_renderer_vtest.c index 7fd9285719a..1b1a4f24ad5 100644 --- a/src/virtio/vulkan/vn_renderer_vtest.c +++ b/src/virtio/vulkan/vn_renderer_vtest.c @@ -613,7 +613,7 @@ vtest_sync_reset(struct vn_renderer *renderer, } static void -vtest_sync_release(struct vn_renderer *renderer, +vtest_sync_destroy(struct vn_renderer *renderer, struct vn_renderer_sync *_sync) { struct vtest *vtest = (struct vtest *)renderer; @@ -623,47 +623,29 @@ vtest_sync_release(struct vn_renderer *renderer, vtest_vcmd_sync_unref(vtest, sync->base.sync_id); mtx_unlock(&vtest->sock_mutex); - sync->base.sync_id = 0; + free(sync); } static VkResult -vtest_sync_init(struct vn_renderer *renderer, - struct vn_renderer_sync *_sync, - uint64_t initial_val, - uint32_t flags) +vtest_sync_create(struct vn_renderer *renderer, + uint64_t initial_val, + uint32_t flags, + struct vn_renderer_sync **out_sync) { struct vtest *vtest = (struct vtest *)renderer; - struct vtest_sync *sync = (struct vtest_sync *)_sync; + + struct vtest_sync *sync = calloc(1, sizeof(*sync)); + if (!sync) + return VK_ERROR_OUT_OF_HOST_MEMORY; mtx_lock(&vtest->sock_mutex); sync->base.sync_id = vtest_vcmd_sync_create(vtest, initial_val); mtx_unlock(&vtest->sock_mutex); + *out_sync = &sync->base; return VK_SUCCESS; } -static void -vtest_sync_destroy(struct vn_renderer *renderer, - struct vn_renderer_sync *_sync) -{ - struct vtest_sync *sync = (struct vtest_sync *)_sync; - - if (sync->base.sync_id) - vtest_sync_release(renderer, &sync->base); - - free(sync); -} - -static struct vn_renderer_sync * -vtest_sync_create(struct vn_renderer *renderer) -{ - struct vtest_sync *sync = calloc(1, sizeof(*sync)); - if (!sync) - return NULL; - - return &sync->base; -} - static void vtest_bo_invalidate(struct vn_renderer *renderer, struct vn_renderer_bo *bo, @@ -1054,10 +1036,8 @@ vtest_init(struct vtest *vtest) vtest->base.bo_ops.invalidate = vtest_bo_invalidate; vtest->base.sync_ops.create = vtest_sync_create; + vtest->base.sync_ops.create_from_syncobj = NULL; vtest->base.sync_ops.destroy = vtest_sync_destroy; - vtest->base.sync_ops.init = vtest_sync_init; - vtest->base.sync_ops.init_syncobj = NULL; - vtest->base.sync_ops.release = vtest_sync_release; vtest->base.sync_ops.export_syncobj = NULL; vtest->base.sync_ops.reset = vtest_sync_reset; vtest->base.sync_ops.read = vtest_sync_read;