From 4a16aaafb530280cb702dfdf0a689d1e72bf541b Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Tue, 19 Dec 2023 16:02:08 +0100 Subject: [PATCH] panvk: Move the VkEvent logic to panvk_event.{c,h} Signed-off-by: Boris Brezillon Acked-by: Erik Faye-Lund Reviewed-by: Mary Guillemard Reviewed-by: Rebecca Mckeever Part-of: --- src/panfrost/vulkan/meson.build | 1 + src/panfrost/vulkan/panvk_device.c | 106 -------------------- src/panfrost/vulkan/panvk_event.c | 113 ++++++++++++++++++++++ src/panfrost/vulkan/panvk_event.h | 20 ++++ src/panfrost/vulkan/panvk_private.h | 6 -- src/panfrost/vulkan/panvk_vX_cmd_buffer.c | 1 + src/panfrost/vulkan/panvk_vX_device.c | 1 + 7 files changed, 136 insertions(+), 112 deletions(-) create mode 100644 src/panfrost/vulkan/panvk_event.c create mode 100644 src/panfrost/vulkan/panvk_event.h diff --git a/src/panfrost/vulkan/meson.build b/src/panfrost/vulkan/meson.build index 2bfb61e82c1..6525c91334e 100644 --- a/src/panfrost/vulkan/meson.build +++ b/src/panfrost/vulkan/meson.build @@ -41,6 +41,7 @@ libpanvk_files = files( 'panvk_device.c', 'panvk_device_memory.c', 'panvk_descriptor_set.c', + 'panvk_event.c', 'panvk_formats.c', 'panvk_image.c', 'panvk_mempool.c', diff --git a/src/panfrost/vulkan/panvk_device.c b/src/panfrost/vulkan/panvk_device.c index ba01d995d1f..1149b5646a5 100644 --- a/src/panfrost/vulkan/panvk_device.c +++ b/src/panfrost/vulkan/panvk_device.c @@ -1319,112 +1319,6 @@ vk_icdGetInstanceProcAddr(VkInstance instance, const char *pName) return panvk_GetInstanceProcAddr(instance, pName); } -VKAPI_ATTR VkResult VKAPI_CALL -panvk_CreateEvent(VkDevice _device, const VkEventCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) -{ - VK_FROM_HANDLE(panvk_device, device, _device); - struct panvk_event *event = vk_object_zalloc( - &device->vk, pAllocator, sizeof(*event), VK_OBJECT_TYPE_EVENT); - if (!event) - return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); - - struct drm_syncobj_create create = { - .flags = 0, - }; - - int ret = drmIoctl(device->vk.drm_fd, DRM_IOCTL_SYNCOBJ_CREATE, &create); - if (ret) - return VK_ERROR_OUT_OF_HOST_MEMORY; - - event->syncobj = create.handle; - *pEvent = panvk_event_to_handle(event); - - return VK_SUCCESS; -} - -VKAPI_ATTR void VKAPI_CALL -panvk_DestroyEvent(VkDevice _device, VkEvent _event, - const VkAllocationCallbacks *pAllocator) -{ - VK_FROM_HANDLE(panvk_device, device, _device); - VK_FROM_HANDLE(panvk_event, event, _event); - - if (!event) - return; - - struct drm_syncobj_destroy destroy = {.handle = event->syncobj}; - drmIoctl(device->vk.drm_fd, DRM_IOCTL_SYNCOBJ_DESTROY, &destroy); - - vk_object_free(&device->vk, pAllocator, event); -} - -VKAPI_ATTR VkResult VKAPI_CALL -panvk_GetEventStatus(VkDevice _device, VkEvent _event) -{ - VK_FROM_HANDLE(panvk_device, device, _device); - VK_FROM_HANDLE(panvk_event, event, _event); - bool signaled; - - struct drm_syncobj_wait wait = { - .handles = (uintptr_t)&event->syncobj, - .count_handles = 1, - .timeout_nsec = 0, - .flags = DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT, - }; - - int ret = drmIoctl(device->vk.drm_fd, DRM_IOCTL_SYNCOBJ_WAIT, &wait); - if (ret) { - if (errno == ETIME) - signaled = false; - else { - assert(0); - return VK_ERROR_DEVICE_LOST; /* TODO */ - } - } else - signaled = true; - - return signaled ? VK_EVENT_SET : VK_EVENT_RESET; -} - -VKAPI_ATTR VkResult VKAPI_CALL -panvk_SetEvent(VkDevice _device, VkEvent _event) -{ - VK_FROM_HANDLE(panvk_device, device, _device); - VK_FROM_HANDLE(panvk_event, event, _event); - - struct drm_syncobj_array objs = { - .handles = (uint64_t)(uintptr_t)&event->syncobj, - .count_handles = 1}; - - /* This is going to just replace the fence for this syncobj with one that - * is already in signaled state. This won't be a problem because the spec - * mandates that the event will have been set before the vkCmdWaitEvents - * command executes. - * https://www.khronos.org/registry/vulkan/specs/1.2/html/chap6.html#commandbuffers-submission-progress - */ - if (drmIoctl(device->vk.drm_fd, DRM_IOCTL_SYNCOBJ_SIGNAL, &objs)) - return VK_ERROR_DEVICE_LOST; - - return VK_SUCCESS; -} - -VKAPI_ATTR VkResult VKAPI_CALL -panvk_ResetEvent(VkDevice _device, VkEvent _event) -{ - VK_FROM_HANDLE(panvk_device, device, _device); - VK_FROM_HANDLE(panvk_event, event, _event); - - struct drm_syncobj_array objs = { - .handles = (uint64_t)(uintptr_t)&event->syncobj, - .count_handles = 1}; - - if (drmIoctl(device->vk.drm_fd, DRM_IOCTL_SYNCOBJ_RESET, &objs)) - return VK_ERROR_DEVICE_LOST; - - return VK_SUCCESS; -} - VKAPI_ATTR void VKAPI_CALL panvk_GetPhysicalDeviceExternalSemaphoreProperties( VkPhysicalDevice physicalDevice, diff --git a/src/panfrost/vulkan/panvk_event.c b/src/panfrost/vulkan/panvk_event.c new file mode 100644 index 00000000000..c69a6804759 --- /dev/null +++ b/src/panfrost/vulkan/panvk_event.c @@ -0,0 +1,113 @@ +/* + * Copyright © 2021 Collabora Ltd. + * SPDX-License-Identifier: MIT + */ + +#include "panvk_event.h" +#include "panvk_private.h" + +VKAPI_ATTR VkResult VKAPI_CALL +panvk_CreateEvent(VkDevice _device, const VkEventCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) +{ + VK_FROM_HANDLE(panvk_device, device, _device); + struct panvk_event *event = vk_object_zalloc( + &device->vk, pAllocator, sizeof(*event), VK_OBJECT_TYPE_EVENT); + if (!event) + return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + + struct drm_syncobj_create create = { + .flags = 0, + }; + + int ret = drmIoctl(device->vk.drm_fd, DRM_IOCTL_SYNCOBJ_CREATE, &create); + if (ret) + return VK_ERROR_OUT_OF_HOST_MEMORY; + + event->syncobj = create.handle; + *pEvent = panvk_event_to_handle(event); + + return VK_SUCCESS; +} + +VKAPI_ATTR void VKAPI_CALL +panvk_DestroyEvent(VkDevice _device, VkEvent _event, + const VkAllocationCallbacks *pAllocator) +{ + VK_FROM_HANDLE(panvk_device, device, _device); + VK_FROM_HANDLE(panvk_event, event, _event); + + if (!event) + return; + + struct drm_syncobj_destroy destroy = {.handle = event->syncobj}; + drmIoctl(device->vk.drm_fd, DRM_IOCTL_SYNCOBJ_DESTROY, &destroy); + + vk_object_free(&device->vk, pAllocator, event); +} + +VKAPI_ATTR VkResult VKAPI_CALL +panvk_GetEventStatus(VkDevice _device, VkEvent _event) +{ + VK_FROM_HANDLE(panvk_device, device, _device); + VK_FROM_HANDLE(panvk_event, event, _event); + bool signaled; + + struct drm_syncobj_wait wait = { + .handles = (uintptr_t)&event->syncobj, + .count_handles = 1, + .timeout_nsec = 0, + .flags = DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT, + }; + + int ret = drmIoctl(device->vk.drm_fd, DRM_IOCTL_SYNCOBJ_WAIT, &wait); + if (ret) { + if (errno == ETIME) + signaled = false; + else { + assert(0); + return VK_ERROR_DEVICE_LOST; /* TODO */ + } + } else + signaled = true; + + return signaled ? VK_EVENT_SET : VK_EVENT_RESET; +} + +VKAPI_ATTR VkResult VKAPI_CALL +panvk_SetEvent(VkDevice _device, VkEvent _event) +{ + VK_FROM_HANDLE(panvk_device, device, _device); + VK_FROM_HANDLE(panvk_event, event, _event); + + struct drm_syncobj_array objs = { + .handles = (uint64_t)(uintptr_t)&event->syncobj, + .count_handles = 1}; + + /* This is going to just replace the fence for this syncobj with one that + * is already in signaled state. This won't be a problem because the spec + * mandates that the event will have been set before the vkCmdWaitEvents + * command executes. + * https://www.khronos.org/registry/vulkan/specs/1.2/html/chap6.html#commandbuffers-submission-progress + */ + if (drmIoctl(device->vk.drm_fd, DRM_IOCTL_SYNCOBJ_SIGNAL, &objs)) + return VK_ERROR_DEVICE_LOST; + + return VK_SUCCESS; +} + +VKAPI_ATTR VkResult VKAPI_CALL +panvk_ResetEvent(VkDevice _device, VkEvent _event) +{ + VK_FROM_HANDLE(panvk_device, device, _device); + VK_FROM_HANDLE(panvk_event, event, _event); + + struct drm_syncobj_array objs = { + .handles = (uint64_t)(uintptr_t)&event->syncobj, + .count_handles = 1}; + + if (drmIoctl(device->vk.drm_fd, DRM_IOCTL_SYNCOBJ_RESET, &objs)) + return VK_ERROR_DEVICE_LOST; + + return VK_SUCCESS; +} diff --git a/src/panfrost/vulkan/panvk_event.h b/src/panfrost/vulkan/panvk_event.h new file mode 100644 index 00000000000..4bfdfaf80e0 --- /dev/null +++ b/src/panfrost/vulkan/panvk_event.h @@ -0,0 +1,20 @@ +/* + * Copyright © 2021 Collabora Ltd. + * SPDX-License-Identifier: MIT + */ + +#ifndef PANVK_EVENT_H +#define PANVK_EVENT_H + +#include + +#include "vk_object.h" + +struct panvk_event { + struct vk_object_base base; + uint32_t syncobj; +}; + +VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_event, base, VkEvent, VK_OBJECT_TYPE_EVENT) + +#endif diff --git a/src/panfrost/vulkan/panvk_private.h b/src/panfrost/vulkan/panvk_private.h index 8accb663859..30214465c7b 100644 --- a/src/panfrost/vulkan/panvk_private.h +++ b/src/panfrost/vulkan/panvk_private.h @@ -730,11 +730,6 @@ struct panvk_batch *panvk_cmd_open_batch(struct panvk_cmd_buffer *cmdbuf); void panvk_cmd_preload_fb_after_batch_split(struct panvk_cmd_buffer *cmdbuf); -struct panvk_event { - struct vk_object_base base; - uint32_t syncobj; -}; - struct panvk_shader { struct pan_shader_info info; struct util_dynarray binary; @@ -772,7 +767,6 @@ VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_descriptor_set, base, VkDescriptorSet, VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_descriptor_set_layout, vk.base, VkDescriptorSetLayout, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT) -VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_event, base, VkEvent, VK_OBJECT_TYPE_EVENT) VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_pipeline_layout, vk.base, VkPipelineLayout, VK_OBJECT_TYPE_PIPELINE_LAYOUT) diff --git a/src/panfrost/vulkan/panvk_vX_cmd_buffer.c b/src/panfrost/vulkan/panvk_vX_cmd_buffer.c index ad5e0bffd36..e35c23673f7 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_buffer.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_buffer.c @@ -30,6 +30,7 @@ #include "panvk_buffer.h" #include "panvk_cs.h" +#include "panvk_event.h" #include "panvk_image.h" #include "panvk_image_view.h" #include "panvk_pipeline.h" diff --git a/src/panfrost/vulkan/panvk_vX_device.c b/src/panfrost/vulkan/panvk_vX_device.c index 6e295d78299..eb57eb28984 100644 --- a/src/panfrost/vulkan/panvk_vX_device.c +++ b/src/panfrost/vulkan/panvk_vX_device.c @@ -31,6 +31,7 @@ #include "decode.h" #include "panvk_cs.h" +#include "panvk_event.h" #include "panvk_image.h" #include "panvk_image_view.h" #include "panvk_private.h"