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