xref: /aosp_15_r20/external/mesa3d/src/amd/vulkan/radv_wsi.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright © 2016 Red Hat
3  * based on intel anv code:
4  * Copyright © 2015 Intel Corporation
5  *
6  * SPDX-License-Identifier: MIT
7  */
8 
9 #include "radv_wsi.h"
10 #include "meta/radv_meta.h"
11 #include "util/macros.h"
12 #include "radv_debug.h"
13 #include "vk_fence.h"
14 #include "vk_semaphore.h"
15 #include "vk_util.h"
16 #include "wsi_common.h"
17 
18 static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
radv_wsi_proc_addr(VkPhysicalDevice physicalDevice,const char * pName)19 radv_wsi_proc_addr(VkPhysicalDevice physicalDevice, const char *pName)
20 {
21    VK_FROM_HANDLE(radv_physical_device, pdev, physicalDevice);
22    const struct radv_instance *instance = radv_physical_device_instance(pdev);
23    return vk_instance_get_proc_addr_unchecked(&instance->vk, pName);
24 }
25 
26 static void
radv_wsi_set_memory_ownership(VkDevice _device,VkDeviceMemory _mem,VkBool32 ownership)27 radv_wsi_set_memory_ownership(VkDevice _device, VkDeviceMemory _mem, VkBool32 ownership)
28 {
29    VK_FROM_HANDLE(radv_device, device, _device);
30    VK_FROM_HANDLE(radv_device_memory, mem, _mem);
31 
32    if (device->use_global_bo_list) {
33       device->ws->buffer_make_resident(device->ws, mem->bo, ownership);
34    }
35 }
36 
37 static VkQueue
radv_wsi_get_prime_blit_queue(VkDevice _device)38 radv_wsi_get_prime_blit_queue(VkDevice _device)
39 {
40    VK_FROM_HANDLE(radv_device, device, _device);
41    struct radv_physical_device *pdev = radv_device_physical(device);
42    const struct radv_instance *instance = radv_physical_device_instance(pdev);
43 
44    if (device->private_sdma_queue != VK_NULL_HANDLE)
45       return vk_queue_to_handle(&device->private_sdma_queue->vk);
46 
47    if (pdev->info.gfx_level >= GFX9 && !(instance->debug_flags & RADV_DEBUG_NO_DMA_BLIT)) {
48 
49       pdev->vk_queue_to_radv[pdev->num_queues++] = RADV_QUEUE_TRANSFER;
50       const VkDeviceQueueCreateInfo queue_create = {
51          .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
52          .queueFamilyIndex = pdev->num_queues - 1,
53          .queueCount = 1,
54       };
55 
56       device->private_sdma_queue =
57          vk_zalloc(&device->vk.alloc, sizeof(struct radv_queue), 8, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
58 
59       VkResult result = radv_queue_init(device, device->private_sdma_queue, 0, &queue_create, NULL);
60       if (result == VK_SUCCESS) {
61          return vk_queue_to_handle(&device->private_sdma_queue->vk);
62       } else {
63          vk_free(&device->vk.alloc, device->private_sdma_queue);
64          device->private_sdma_queue = VK_NULL_HANDLE;
65       }
66    }
67    return VK_NULL_HANDLE;
68 }
69 
70 VkResult
radv_init_wsi(struct radv_physical_device * pdev)71 radv_init_wsi(struct radv_physical_device *pdev)
72 {
73    const struct radv_instance *instance = radv_physical_device_instance(pdev);
74 
75    VkResult result =
76       wsi_device_init(&pdev->wsi_device, radv_physical_device_to_handle(pdev), radv_wsi_proc_addr, &instance->vk.alloc,
77                       pdev->master_fd, &instance->drirc.options, &(struct wsi_device_options){.sw_device = false});
78    if (result != VK_SUCCESS)
79       return result;
80 
81    pdev->wsi_device.supports_modifiers = pdev->info.gfx_level >= GFX9;
82    pdev->wsi_device.set_memory_ownership = radv_wsi_set_memory_ownership;
83    pdev->wsi_device.get_blit_queue = radv_wsi_get_prime_blit_queue;
84 
85    wsi_device_setup_syncobj_fd(&pdev->wsi_device, pdev->local_fd);
86 
87    pdev->vk.wsi_device = &pdev->wsi_device;
88 
89    return VK_SUCCESS;
90 }
91 
92 void
radv_finish_wsi(struct radv_physical_device * pdev)93 radv_finish_wsi(struct radv_physical_device *pdev)
94 {
95    const struct radv_instance *instance = radv_physical_device_instance(pdev);
96 
97    pdev->vk.wsi_device = NULL;
98    wsi_device_finish(&pdev->wsi_device, &instance->vk.alloc);
99 }
100