| /* |
| * Copyright © 2022 Collabora Ltd. and Red Hat Inc. |
| * SPDX-License-Identifier: MIT |
| */ |
| #include "nvk_wsi.h" |
| #include "nvk_instance.h" |
| #include "nvkmd/nvkmd.h" |
| #include "wsi_common.h" |
| |
| static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL |
| nvk_wsi_proc_addr(VkPhysicalDevice physicalDevice, const char *pName) |
| { |
| VK_FROM_HANDLE(nvk_physical_device, pdev, physicalDevice); |
| return vk_instance_get_proc_addr_unchecked(pdev->vk.instance, pName); |
| } |
| |
| VkResult |
| nvk_init_wsi(struct nvk_physical_device *pdev) |
| { |
| VkResult result; |
| |
| struct wsi_device_options wsi_options = { |
| .sw_device = false |
| }; |
| result = wsi_device_init(&pdev->wsi_device, |
| nvk_physical_device_to_handle(pdev), |
| nvk_wsi_proc_addr, &pdev->vk.instance->alloc, |
| nvkmd_pdev_get_drm_primary_fd(pdev->nvkmd), |
| &nvk_physical_device_instance(pdev)->dri_options, |
| &wsi_options); |
| if (result != VK_SUCCESS) |
| return result; |
| |
| pdev->wsi_device.supports_scanout = false; |
| pdev->wsi_device.supports_modifiers = |
| pdev->vk.supported_extensions.table.EXT_image_drm_format_modifier; |
| |
| pdev->vk.wsi_device = &pdev->wsi_device; |
| |
| return result; |
| } |
| |
| void |
| nvk_finish_wsi(struct nvk_physical_device *pdev) |
| { |
| pdev->vk.wsi_device = NULL; |
| wsi_device_finish(&pdev->wsi_device, &pdev->vk.instance->alloc); |
| } |