| /* |
| * Copyright 2024 Valve Corporation |
| * Copyright 2024 Alyssa Rosenzweig |
| * Copyright 2022-2023 Collabora Ltd. and Red Hat Inc. |
| * SPDX-License-Identifier: MIT |
| */ |
| #include "hk_event.h" |
| #include "vulkan/vulkan_core.h" |
| |
| #include "agx_bo.h" |
| #include "hk_cmd_buffer.h" |
| #include "hk_device.h" |
| #include "hk_entrypoints.h" |
| |
| #define HK_EVENT_MEM_SIZE sizeof(VkResult) |
| |
| VKAPI_ATTR VkResult VKAPI_CALL |
| hk_CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, |
| const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) |
| { |
| VK_FROM_HANDLE(hk_device, dev, device); |
| struct hk_event *event; |
| |
| event = vk_object_zalloc(&dev->vk, pAllocator, sizeof(*event), |
| VK_OBJECT_TYPE_EVENT); |
| if (!event) |
| return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY); |
| |
| /* TODO: this is really wasteful, bring back the NVK heap! |
| * |
| * XXX |
| */ |
| event->bo = |
| agx_bo_create(&dev->dev, HK_EVENT_MEM_SIZE, 0, AGX_BO_WRITEBACK, "Event"); |
| event->status = event->bo->map; |
| event->addr = event->bo->va->addr; |
| |
| *event->status = VK_EVENT_RESET; |
| |
| *pEvent = hk_event_to_handle(event); |
| |
| return VK_SUCCESS; |
| } |
| |
| VKAPI_ATTR void VKAPI_CALL |
| hk_DestroyEvent(VkDevice device, VkEvent _event, |
| const VkAllocationCallbacks *pAllocator) |
| { |
| VK_FROM_HANDLE(hk_device, dev, device); |
| VK_FROM_HANDLE(hk_event, event, _event); |
| |
| if (!event) |
| return; |
| |
| agx_bo_unreference(&dev->dev, event->bo); |
| vk_object_free(&dev->vk, pAllocator, event); |
| } |
| |
| VKAPI_ATTR VkResult VKAPI_CALL |
| hk_GetEventStatus(VkDevice device, VkEvent _event) |
| { |
| VK_FROM_HANDLE(hk_event, event, _event); |
| |
| return *event->status; |
| } |
| |
| VKAPI_ATTR VkResult VKAPI_CALL |
| hk_SetEvent(VkDevice device, VkEvent _event) |
| { |
| VK_FROM_HANDLE(hk_event, event, _event); |
| |
| *event->status = VK_EVENT_SET; |
| |
| return VK_SUCCESS; |
| } |
| |
| VKAPI_ATTR VkResult VKAPI_CALL |
| hk_ResetEvent(VkDevice device, VkEvent _event) |
| { |
| VK_FROM_HANDLE(hk_event, event, _event); |
| |
| *event->status = VK_EVENT_RESET; |
| |
| return VK_SUCCESS; |
| } |
| |
| VKAPI_ATTR void VKAPI_CALL |
| hk_CmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent _event, |
| const VkDependencyInfo *pDependencyInfo) |
| { |
| VK_FROM_HANDLE(hk_cmd_buffer, cmd, commandBuffer); |
| VK_FROM_HANDLE(hk_event, event, _event); |
| |
| hk_queue_write(cmd, event->bo->va->addr, VK_EVENT_SET, false); |
| } |
| |
| VKAPI_ATTR void VKAPI_CALL |
| hk_CmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent _event, |
| VkPipelineStageFlags2 stageMask) |
| { |
| VK_FROM_HANDLE(hk_cmd_buffer, cmd, commandBuffer); |
| VK_FROM_HANDLE(hk_event, event, _event); |
| |
| hk_queue_write(cmd, event->bo->va->addr, VK_EVENT_RESET, false); |
| } |
| |
| VKAPI_ATTR void VKAPI_CALL |
| hk_CmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, |
| const VkEvent *pEvents, |
| const VkDependencyInfo *pDependencyInfos) |
| { |
| /* Currently we barrier everything, so this is a no-op. */ |
| } |