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