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