1 /*
2 * Copyright © 2024 Collabora Ltd.
3 * SPDX-License-Identifier: MIT
4 */
5
6 #include "panvk_cmd_buffer.h"
7 #include "panvk_device.h"
8 #include "panvk_entrypoints.h"
9 #include "panvk_event.h"
10 #include "panvk_mempool.h"
11
12 #include "vk_log.h"
13
14 VKAPI_ATTR VkResult VKAPI_CALL
panvk_per_arch(CreateEvent)15 panvk_per_arch(CreateEvent)(VkDevice _device,
16 const VkEventCreateInfo *pCreateInfo,
17 const VkAllocationCallbacks *pAllocator,
18 VkEvent *pEvent)
19 {
20 VK_FROM_HANDLE(panvk_device, device, _device);
21 struct panvk_event *event = vk_object_zalloc(
22 &device->vk, pAllocator, sizeof(*event), VK_OBJECT_TYPE_EVENT);
23 if (!event)
24 return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
25
26 struct panvk_pool_alloc_info info = {
27 .size = sizeof(struct panvk_cs_sync32) * PANVK_SUBQUEUE_COUNT,
28 .alignment = 64,
29 };
30
31 event->syncobjs = panvk_pool_alloc_mem(&device->mempools.rw_nc, info);
32 if (!panvk_priv_mem_host_addr(event->syncobjs)) {
33 vk_object_free(&device->vk, pAllocator, event);
34 return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
35 }
36
37 memset(panvk_priv_mem_host_addr(event->syncobjs), 0,
38 sizeof(struct panvk_cs_sync32) * PANVK_SUBQUEUE_COUNT);
39
40 *pEvent = panvk_event_to_handle(event);
41 return VK_SUCCESS;
42 }
43
44 VKAPI_ATTR void VKAPI_CALL
panvk_per_arch(DestroyEvent)45 panvk_per_arch(DestroyEvent)(VkDevice _device, VkEvent _event,
46 const VkAllocationCallbacks *pAllocator)
47 {
48 VK_FROM_HANDLE(panvk_device, device, _device);
49 VK_FROM_HANDLE(panvk_event, event, _event);
50
51 if (!event)
52 return;
53
54 panvk_pool_free_mem(&device->mempools.rw_nc, event->syncobjs);
55
56 vk_object_free(&device->vk, pAllocator, event);
57 }
58
59 VKAPI_ATTR VkResult VKAPI_CALL
panvk_per_arch(GetEventStatus)60 panvk_per_arch(GetEventStatus)(VkDevice _device, VkEvent _event)
61 {
62 VK_FROM_HANDLE(panvk_event, event, _event);
63
64 struct panvk_cs_sync32 *syncobjs = panvk_priv_mem_host_addr(event->syncobjs);
65
66 for (uint32_t i = 0; i < PANVK_SUBQUEUE_COUNT; i++) {
67 if (!syncobjs[i].seqno)
68 return VK_EVENT_RESET;
69 }
70
71 return VK_EVENT_SET;
72 }
73
74 VKAPI_ATTR VkResult VKAPI_CALL
panvk_per_arch(SetEvent)75 panvk_per_arch(SetEvent)(VkDevice _device, VkEvent _event)
76 {
77 VK_FROM_HANDLE(panvk_event, event, _event);
78
79 struct panvk_cs_sync32 *syncobjs = panvk_priv_mem_host_addr(event->syncobjs);
80
81 for (uint32_t i = 0; i < PANVK_SUBQUEUE_COUNT; i++)
82 syncobjs[i].seqno = 1;
83
84 return VK_SUCCESS;
85 }
86
87 VKAPI_ATTR VkResult VKAPI_CALL
panvk_per_arch(ResetEvent)88 panvk_per_arch(ResetEvent)(VkDevice _device, VkEvent _event)
89 {
90 VK_FROM_HANDLE(panvk_event, event, _event);
91
92 struct panvk_cs_sync32 *syncobjs = panvk_priv_mem_host_addr(event->syncobjs);
93
94 memset(syncobjs, 0, sizeof(*syncobjs) * PANVK_SUBQUEUE_COUNT);
95 return VK_SUCCESS;
96 }
97