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