• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  * Permission is hereby granted, free of charge, to any person obtaining a
9  * copy of this software and associated documentation files (the "Software"),
10  * to deal in the Software without restriction, including without limitation
11  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12  * and/or sell copies of the Software, and to permit persons to whom the
13  * Software is furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice (including the next
16  * paragraph) shall be included in all copies or substantial portions of the
17  * Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25  * IN THE SOFTWARE.
26  */
27 
28 #include "radv_private.h"
29 
30 static void
radv_destroy_event(struct radv_device * device,const VkAllocationCallbacks * pAllocator,struct radv_event * event)31 radv_destroy_event(struct radv_device *device, const VkAllocationCallbacks *pAllocator, struct radv_event *event)
32 {
33    if (event->bo)
34       device->ws->buffer_destroy(device->ws, event->bo);
35 
36    vk_object_base_finish(&event->base);
37    vk_free2(&device->vk.alloc, pAllocator, event);
38 }
39 
40 VkResult
radv_create_event(struct radv_device * device,const VkEventCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkEvent * pEvent,bool is_internal)41 radv_create_event(struct radv_device *device, const VkEventCreateInfo *pCreateInfo,
42                   const VkAllocationCallbacks *pAllocator, VkEvent *pEvent, bool is_internal)
43 {
44    enum radeon_bo_domain bo_domain;
45    enum radeon_bo_flag bo_flags;
46    struct radv_event *event;
47    VkResult result;
48 
49    event = vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*event), 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
50    if (!event)
51       return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
52 
53    vk_object_base_init(&device->vk, &event->base, VK_OBJECT_TYPE_EVENT);
54 
55    if (pCreateInfo->flags & VK_EVENT_CREATE_DEVICE_ONLY_BIT) {
56       bo_domain = RADEON_DOMAIN_VRAM;
57       bo_flags = RADEON_FLAG_NO_CPU_ACCESS;
58    } else {
59       bo_domain = RADEON_DOMAIN_GTT;
60       bo_flags = RADEON_FLAG_CPU_ACCESS;
61    }
62 
63    result = device->ws->buffer_create(device->ws, 8, 8, bo_domain,
64                                       RADEON_FLAG_VA_UNCACHED | RADEON_FLAG_NO_INTERPROCESS_SHARING | bo_flags,
65                                       RADV_BO_PRIORITY_FENCE, 0, &event->bo);
66    if (result != VK_SUCCESS) {
67       radv_destroy_event(device, pAllocator, event);
68       return vk_error(device, result);
69    }
70 
71    if (!(pCreateInfo->flags & VK_EVENT_CREATE_DEVICE_ONLY_BIT)) {
72       event->map = (uint64_t *)device->ws->buffer_map(event->bo);
73       if (!event->map) {
74          radv_destroy_event(device, pAllocator, event);
75          return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
76       }
77    }
78 
79    *pEvent = radv_event_to_handle(event);
80    radv_rmv_log_event_create(device, *pEvent, pCreateInfo->flags, is_internal);
81    return VK_SUCCESS;
82 }
83 
84 VKAPI_ATTR VkResult VKAPI_CALL
radv_CreateEvent(VkDevice _device,const VkEventCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkEvent * pEvent)85 radv_CreateEvent(VkDevice _device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
86                  VkEvent *pEvent)
87 {
88    RADV_FROM_HANDLE(radv_device, device, _device);
89    VkResult result = radv_create_event(device, pCreateInfo, pAllocator, pEvent, false);
90    if (result != VK_SUCCESS)
91       return result;
92 
93    return VK_SUCCESS;
94 }
95 
96 VKAPI_ATTR void VKAPI_CALL
radv_DestroyEvent(VkDevice _device,VkEvent _event,const VkAllocationCallbacks * pAllocator)97 radv_DestroyEvent(VkDevice _device, VkEvent _event, const VkAllocationCallbacks *pAllocator)
98 {
99    RADV_FROM_HANDLE(radv_device, device, _device);
100    RADV_FROM_HANDLE(radv_event, event, _event);
101 
102    if (!event)
103       return;
104 
105    radv_destroy_event(device, pAllocator, event);
106 }
107 
108 VKAPI_ATTR VkResult VKAPI_CALL
radv_GetEventStatus(VkDevice _device,VkEvent _event)109 radv_GetEventStatus(VkDevice _device, VkEvent _event)
110 {
111    RADV_FROM_HANDLE(radv_device, device, _device);
112    RADV_FROM_HANDLE(radv_event, event, _event);
113 
114    if (vk_device_is_lost(&device->vk))
115       return VK_ERROR_DEVICE_LOST;
116 
117    if (*event->map == 1)
118       return VK_EVENT_SET;
119    return VK_EVENT_RESET;
120 }
121 
122 VKAPI_ATTR VkResult VKAPI_CALL
radv_SetEvent(VkDevice _device,VkEvent _event)123 radv_SetEvent(VkDevice _device, VkEvent _event)
124 {
125    RADV_FROM_HANDLE(radv_event, event, _event);
126    *event->map = 1;
127 
128    return VK_SUCCESS;
129 }
130 
131 VKAPI_ATTR VkResult VKAPI_CALL
radv_ResetEvent(VkDevice _device,VkEvent _event)132 radv_ResetEvent(VkDevice _device, VkEvent _event)
133 {
134    RADV_FROM_HANDLE(radv_event, event, _event);
135    *event->map = 0;
136 
137    return VK_SUCCESS;
138 }
139