xref: /aosp_15_r20/external/mesa3d/src/amd/vulkan/radv_event.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright © 2016 Red Hat.
3  * Copyright © 2016 Bas Nieuwenhuizen
4  *
5  * based in part on anv driver which is:
6  * Copyright © 2015 Intel Corporation
7  *
8  * SPDX-License-Identifier: MIT
9  */
10 
11 #include "vk_alloc.h"
12 #include "vk_log.h"
13 
14 #include "radv_buffer.h"
15 #include "radv_device.h"
16 #include "radv_entrypoints.h"
17 #include "radv_event.h"
18 #include "radv_rmv.h"
19 
20 static void
radv_destroy_event(struct radv_device * device,const VkAllocationCallbacks * pAllocator,struct radv_event * event)21 radv_destroy_event(struct radv_device *device, const VkAllocationCallbacks *pAllocator, struct radv_event *event)
22 {
23    if (event->bo)
24       radv_bo_destroy(device, &event->base, event->bo);
25 
26    radv_rmv_log_resource_destroy(device, (uint64_t)radv_event_to_handle(event));
27    vk_object_base_finish(&event->base);
28    vk_free2(&device->vk.alloc, pAllocator, event);
29 }
30 
31 VkResult
radv_create_event(struct radv_device * device,const VkEventCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkEvent * pEvent,bool is_internal)32 radv_create_event(struct radv_device *device, const VkEventCreateInfo *pCreateInfo,
33                   const VkAllocationCallbacks *pAllocator, VkEvent *pEvent, bool is_internal)
34 {
35    enum radeon_bo_domain bo_domain;
36    enum radeon_bo_flag bo_flags;
37    struct radv_event *event;
38    VkResult result;
39 
40    event = vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*event), 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
41    if (!event)
42       return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
43 
44    vk_object_base_init(&device->vk, &event->base, VK_OBJECT_TYPE_EVENT);
45 
46    if (pCreateInfo->flags & VK_EVENT_CREATE_DEVICE_ONLY_BIT) {
47       bo_domain = RADEON_DOMAIN_VRAM;
48       bo_flags = RADEON_FLAG_NO_CPU_ACCESS;
49    } else {
50       bo_domain = RADEON_DOMAIN_GTT;
51       bo_flags = RADEON_FLAG_CPU_ACCESS;
52    }
53 
54    result = radv_bo_create(device, &event->base, 8, 8, bo_domain,
55                            RADEON_FLAG_VA_UNCACHED | RADEON_FLAG_NO_INTERPROCESS_SHARING | bo_flags,
56                            RADV_BO_PRIORITY_FENCE, 0, is_internal, &event->bo);
57    if (result != VK_SUCCESS) {
58       radv_destroy_event(device, pAllocator, event);
59       return vk_error(device, result);
60    }
61 
62    if (!(pCreateInfo->flags & VK_EVENT_CREATE_DEVICE_ONLY_BIT)) {
63       event->map = (uint64_t *)radv_buffer_map(device->ws, event->bo);
64       if (!event->map) {
65          radv_destroy_event(device, pAllocator, event);
66          return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
67       }
68    }
69 
70    *pEvent = radv_event_to_handle(event);
71    radv_rmv_log_event_create(device, *pEvent, pCreateInfo->flags, is_internal);
72    return VK_SUCCESS;
73 }
74 
75 VKAPI_ATTR VkResult VKAPI_CALL
radv_CreateEvent(VkDevice _device,const VkEventCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkEvent * pEvent)76 radv_CreateEvent(VkDevice _device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
77                  VkEvent *pEvent)
78 {
79    VK_FROM_HANDLE(radv_device, device, _device);
80    VkResult result = radv_create_event(device, pCreateInfo, pAllocator, pEvent, false);
81    if (result != VK_SUCCESS)
82       return result;
83 
84    return VK_SUCCESS;
85 }
86 
87 VKAPI_ATTR void VKAPI_CALL
radv_DestroyEvent(VkDevice _device,VkEvent _event,const VkAllocationCallbacks * pAllocator)88 radv_DestroyEvent(VkDevice _device, VkEvent _event, const VkAllocationCallbacks *pAllocator)
89 {
90    VK_FROM_HANDLE(radv_device, device, _device);
91    VK_FROM_HANDLE(radv_event, event, _event);
92 
93    if (!event)
94       return;
95 
96    radv_destroy_event(device, pAllocator, event);
97 }
98 
99 VKAPI_ATTR VkResult VKAPI_CALL
radv_GetEventStatus(VkDevice _device,VkEvent _event)100 radv_GetEventStatus(VkDevice _device, VkEvent _event)
101 {
102    VK_FROM_HANDLE(radv_device, device, _device);
103    VK_FROM_HANDLE(radv_event, event, _event);
104 
105    if (vk_device_is_lost(&device->vk))
106       return VK_ERROR_DEVICE_LOST;
107 
108    if (*event->map == 1)
109       return VK_EVENT_SET;
110    return VK_EVENT_RESET;
111 }
112 
113 VKAPI_ATTR VkResult VKAPI_CALL
radv_SetEvent(VkDevice _device,VkEvent _event)114 radv_SetEvent(VkDevice _device, VkEvent _event)
115 {
116    VK_FROM_HANDLE(radv_event, event, _event);
117    *event->map = 1;
118 
119    return VK_SUCCESS;
120 }
121 
122 VKAPI_ATTR VkResult VKAPI_CALL
radv_ResetEvent(VkDevice _device,VkEvent _event)123 radv_ResetEvent(VkDevice _device, VkEvent _event)
124 {
125    VK_FROM_HANDLE(radv_event, event, _event);
126    *event->map = 0;
127 
128    return VK_SUCCESS;
129 }
130