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 = agx_bo_map(event->bo);
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 struct hk_device *dev = hk_cmd_buffer_device(cmd);
94
95 perf_debug(dev, "Set event");
96 hk_cmd_buffer_end_compute(cmd);
97 hk_cmd_buffer_end_graphics(cmd);
98 hk_queue_write(cmd, event->bo->va->addr, VK_EVENT_SET, false);
99 }
100
101 VKAPI_ATTR void VKAPI_CALL
hk_CmdResetEvent2(VkCommandBuffer commandBuffer,VkEvent _event,VkPipelineStageFlags2 stageMask)102 hk_CmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent _event,
103 VkPipelineStageFlags2 stageMask)
104 {
105 VK_FROM_HANDLE(hk_cmd_buffer, cmd, commandBuffer);
106 VK_FROM_HANDLE(hk_event, event, _event);
107 struct hk_device *dev = hk_cmd_buffer_device(cmd);
108
109 perf_debug(dev, "Reset event");
110 hk_cmd_buffer_end_compute(cmd);
111 hk_cmd_buffer_end_graphics(cmd);
112 hk_queue_write(cmd, event->bo->va->addr, VK_EVENT_RESET, false);
113 }
114
115 VKAPI_ATTR void VKAPI_CALL
hk_CmdWaitEvents2(VkCommandBuffer commandBuffer,uint32_t eventCount,const VkEvent * pEvents,const VkDependencyInfo * pDependencyInfos)116 hk_CmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount,
117 const VkEvent *pEvents,
118 const VkDependencyInfo *pDependencyInfos)
119 {
120 VK_FROM_HANDLE(hk_cmd_buffer, cmd, commandBuffer);
121 struct hk_device *dev = hk_cmd_buffer_device(cmd);
122
123 perf_debug(dev, "Wait events");
124
125 /* The big hammer. Need to check if this is actually needed.
126 *
127 * XXX: perf.
128 */
129 hk_cmd_buffer_end_compute(cmd);
130 hk_cmd_buffer_end_graphics(cmd);
131 }
132