xref: /aosp_15_r20/external/mesa3d/src/panfrost/vulkan/csf/panvk_vX_event.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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