| /* |
| * Copyright © 2016 Red Hat. |
| * Copyright © 2016 Bas Nieuwenhuizen |
| * |
| * based in part on anv driver which is: |
| * Copyright © 2015 Intel Corporation |
| * |
| * SPDX-License-Identifier: MIT |
| */ |
| |
| #include "vk_alloc.h" |
| #include "vk_log.h" |
| |
| #include "radv_buffer.h" |
| #include "radv_device.h" |
| #include "radv_entrypoints.h" |
| #include "radv_event.h" |
| #include "radv_rmv.h" |
| |
| static void |
| radv_destroy_event(struct radv_device *device, const VkAllocationCallbacks *pAllocator, struct radv_event *event) |
| { |
| if (event->bo) |
| radv_bo_destroy(device, &event->base, event->bo); |
| |
| radv_rmv_log_resource_destroy(device, (uint64_t)radv_event_to_handle(event)); |
| vk_object_base_finish(&event->base); |
| vk_free2(&device->vk.alloc, pAllocator, event); |
| } |
| |
| VkResult |
| radv_create_event(struct radv_device *device, const VkEventCreateInfo *pCreateInfo, |
| const VkAllocationCallbacks *pAllocator, VkEvent *pEvent, bool is_internal) |
| { |
| enum radeon_bo_domain bo_domain; |
| enum radeon_bo_flag bo_flags; |
| struct radv_event *event; |
| VkResult result; |
| |
| event = vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*event), 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); |
| if (!event) |
| return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); |
| |
| vk_object_base_init(&device->vk, &event->base, VK_OBJECT_TYPE_EVENT); |
| |
| if (pCreateInfo->flags & VK_EVENT_CREATE_DEVICE_ONLY_BIT) { |
| bo_domain = RADEON_DOMAIN_VRAM; |
| bo_flags = RADEON_FLAG_NO_CPU_ACCESS; |
| } else { |
| bo_domain = RADEON_DOMAIN_GTT; |
| bo_flags = RADEON_FLAG_CPU_ACCESS; |
| } |
| |
| result = radv_bo_create(device, &event->base, 8, 8, bo_domain, |
| RADEON_FLAG_VA_UNCACHED | RADEON_FLAG_NO_INTERPROCESS_SHARING | bo_flags, |
| RADV_BO_PRIORITY_FENCE, 0, is_internal, &event->bo); |
| if (result != VK_SUCCESS) { |
| radv_destroy_event(device, pAllocator, event); |
| return vk_error(device, result); |
| } |
| |
| if (!(pCreateInfo->flags & VK_EVENT_CREATE_DEVICE_ONLY_BIT)) { |
| event->map = (uint64_t *)radv_buffer_map(device->ws, event->bo); |
| if (!event->map) { |
| radv_destroy_event(device, pAllocator, event); |
| return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY); |
| } |
| } |
| |
| *pEvent = radv_event_to_handle(event); |
| radv_rmv_log_event_create(device, *pEvent, pCreateInfo->flags, is_internal); |
| return VK_SUCCESS; |
| } |
| |
| VKAPI_ATTR VkResult VKAPI_CALL |
| radv_CreateEvent(VkDevice _device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, |
| VkEvent *pEvent) |
| { |
| VK_FROM_HANDLE(radv_device, device, _device); |
| VkResult result = radv_create_event(device, pCreateInfo, pAllocator, pEvent, false); |
| if (result != VK_SUCCESS) |
| return result; |
| |
| return VK_SUCCESS; |
| } |
| |
| VKAPI_ATTR void VKAPI_CALL |
| radv_DestroyEvent(VkDevice _device, VkEvent _event, const VkAllocationCallbacks *pAllocator) |
| { |
| VK_FROM_HANDLE(radv_device, device, _device); |
| VK_FROM_HANDLE(radv_event, event, _event); |
| |
| if (!event) |
| return; |
| |
| radv_destroy_event(device, pAllocator, event); |
| } |
| |
| VKAPI_ATTR VkResult VKAPI_CALL |
| radv_GetEventStatus(VkDevice _device, VkEvent _event) |
| { |
| VK_FROM_HANDLE(radv_device, device, _device); |
| VK_FROM_HANDLE(radv_event, event, _event); |
| |
| if (vk_device_is_lost(&device->vk)) |
| return VK_ERROR_DEVICE_LOST; |
| |
| if (*event->map == 1) |
| return VK_EVENT_SET; |
| return VK_EVENT_RESET; |
| } |
| |
| VKAPI_ATTR VkResult VKAPI_CALL |
| radv_SetEvent(VkDevice _device, VkEvent _event) |
| { |
| VK_FROM_HANDLE(radv_event, event, _event); |
| *event->map = 1; |
| |
| return VK_SUCCESS; |
| } |
| |
| VKAPI_ATTR VkResult VKAPI_CALL |
| radv_ResetEvent(VkDevice _device, VkEvent _event) |
| { |
| VK_FROM_HANDLE(radv_event, event, _event); |
| *event->map = 0; |
| |
| return VK_SUCCESS; |
| } |