xref: /aosp_15_r20/external/mesa3d/src/asahi/vulkan/hk_event.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright 2024 Valve Corporation
3  * Copyright 2024 Alyssa Rosenzweig
4  * Copyright 2022-2023 Collabora Ltd. and Red Hat Inc.
5  * SPDX-License-Identifier: MIT
6  */
7 #include "hk_event.h"
8 #include "vulkan/vulkan_core.h"
9 
10 #include "agx_bo.h"
11 #include "hk_cmd_buffer.h"
12 #include "hk_device.h"
13 #include "hk_entrypoints.h"
14 
15 #define HK_EVENT_MEM_SIZE sizeof(VkResult)
16 
17 VKAPI_ATTR VkResult VKAPI_CALL
hk_CreateEvent(VkDevice device,const VkEventCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkEvent * pEvent)18 hk_CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
19                const VkAllocationCallbacks *pAllocator, VkEvent *pEvent)
20 {
21    VK_FROM_HANDLE(hk_device, dev, device);
22    struct hk_event *event;
23 
24    event = vk_object_zalloc(&dev->vk, pAllocator, sizeof(*event),
25                             VK_OBJECT_TYPE_EVENT);
26    if (!event)
27       return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY);
28 
29    /* TODO: this is really wasteful, bring back the NVK heap!
30     *
31     * XXX
32     */
33    event->bo =
34       agx_bo_create(&dev->dev, HK_EVENT_MEM_SIZE, 0, AGX_BO_WRITEBACK, "Event");
35    event->status = event->bo->map;
36    event->addr = event->bo->va->addr;
37 
38    *event->status = VK_EVENT_RESET;
39 
40    *pEvent = hk_event_to_handle(event);
41 
42    return VK_SUCCESS;
43 }
44 
45 VKAPI_ATTR void VKAPI_CALL
hk_DestroyEvent(VkDevice device,VkEvent _event,const VkAllocationCallbacks * pAllocator)46 hk_DestroyEvent(VkDevice device, VkEvent _event,
47                 const VkAllocationCallbacks *pAllocator)
48 {
49    VK_FROM_HANDLE(hk_device, dev, device);
50    VK_FROM_HANDLE(hk_event, event, _event);
51 
52    if (!event)
53       return;
54 
55    agx_bo_unreference(&dev->dev, event->bo);
56    vk_object_free(&dev->vk, pAllocator, event);
57 }
58 
59 VKAPI_ATTR VkResult VKAPI_CALL
hk_GetEventStatus(VkDevice device,VkEvent _event)60 hk_GetEventStatus(VkDevice device, VkEvent _event)
61 {
62    VK_FROM_HANDLE(hk_event, event, _event);
63 
64    return *event->status;
65 }
66 
67 VKAPI_ATTR VkResult VKAPI_CALL
hk_SetEvent(VkDevice device,VkEvent _event)68 hk_SetEvent(VkDevice device, VkEvent _event)
69 {
70    VK_FROM_HANDLE(hk_event, event, _event);
71 
72    *event->status = VK_EVENT_SET;
73 
74    return VK_SUCCESS;
75 }
76 
77 VKAPI_ATTR VkResult VKAPI_CALL
hk_ResetEvent(VkDevice device,VkEvent _event)78 hk_ResetEvent(VkDevice device, VkEvent _event)
79 {
80    VK_FROM_HANDLE(hk_event, event, _event);
81 
82    *event->status = VK_EVENT_RESET;
83 
84    return VK_SUCCESS;
85 }
86 
87 VKAPI_ATTR void VKAPI_CALL
hk_CmdSetEvent2(VkCommandBuffer commandBuffer,VkEvent _event,const VkDependencyInfo * pDependencyInfo)88 hk_CmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent _event,
89                 const VkDependencyInfo *pDependencyInfo)
90 {
91    VK_FROM_HANDLE(hk_cmd_buffer, cmd, commandBuffer);
92    VK_FROM_HANDLE(hk_event, event, _event);
93 
94    hk_queue_write(cmd, event->bo->va->addr, VK_EVENT_SET, false);
95 }
96 
97 VKAPI_ATTR void VKAPI_CALL
hk_CmdResetEvent2(VkCommandBuffer commandBuffer,VkEvent _event,VkPipelineStageFlags2 stageMask)98 hk_CmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent _event,
99                   VkPipelineStageFlags2 stageMask)
100 {
101    VK_FROM_HANDLE(hk_cmd_buffer, cmd, commandBuffer);
102    VK_FROM_HANDLE(hk_event, event, _event);
103 
104    hk_queue_write(cmd, event->bo->va->addr, VK_EVENT_RESET, false);
105 }
106 
107 VKAPI_ATTR void VKAPI_CALL
hk_CmdWaitEvents2(VkCommandBuffer commandBuffer,uint32_t eventCount,const VkEvent * pEvents,const VkDependencyInfo * pDependencyInfos)108 hk_CmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount,
109                   const VkEvent *pEvents,
110                   const VkDependencyInfo *pDependencyInfos)
111 {
112    /* Currently we barrier everything, so this is a no-op. */
113 }
114