X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fvulkan%2Fwsi%2Fwsi_common.c;h=d44b9fad542458873a546ff7c15b4cff25d517c7;hb=9826e04eca69d04b64258d26983410bd2470f607;hp=1e3c4e0028b2f3b640f3489a4f01efc4b8262c18;hpb=7629c00557c135aae4f0cdfbfa31002b43d8b31e;p=mesa.git diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index 1e3c4e0028b..d44b9fad542 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -22,19 +22,26 @@ */ #include "wsi_common_private.h" -#include "drm_fourcc.h" +#include "drm-uapi/drm_fourcc.h" #include "util/macros.h" +#include "util/xmlconfig.h" #include "vk_util.h" +#include #include +#include +#include +#include VkResult wsi_device_init(struct wsi_device *wsi, VkPhysicalDevice pdevice, WSI_FN_GetPhysicalDeviceProcAddr proc_addr, const VkAllocationCallbacks *alloc, - int display_fd) + int display_fd, + const struct driOptionCache *dri_options) { + const char *present_mode; VkResult result; memset(wsi, 0, sizeof(*wsi)); @@ -44,10 +51,22 @@ wsi_device_init(struct wsi_device *wsi, #define WSI_GET_CB(func) \ PFN_vk##func func = (PFN_vk##func)proc_addr(pdevice, "vk" #func) + WSI_GET_CB(GetPhysicalDeviceProperties2); WSI_GET_CB(GetPhysicalDeviceMemoryProperties); WSI_GET_CB(GetPhysicalDeviceQueueFamilyProperties); #undef WSI_GET_CB + wsi->pci_bus_info.sType = + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT; + VkPhysicalDeviceProperties2 pdp2 = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, + .pNext = &wsi->pci_bus_info, + }; + GetPhysicalDeviceProperties2(pdevice, &pdp2); + + wsi->maxImageDimension2D = pdp2.properties.limits.maxImageDimension2D; + wsi->override_present_mode = VK_PRESENT_MODE_MAX_ENUM_KHR; + GetPhysicalDeviceMemoryProperties(pdevice, &wsi->memory_props); GetPhysicalDeviceQueueFamilyProperties(pdevice, &wsi->queue_family_count, NULL); @@ -99,6 +118,25 @@ wsi_device_init(struct wsi_device *wsi, goto fail; #endif + present_mode = getenv("MESA_VK_WSI_PRESENT_MODE"); + if (present_mode) { + if (!strcmp(present_mode, "fifo")) { + wsi->override_present_mode = VK_PRESENT_MODE_FIFO_KHR; + } else if (!strcmp(present_mode, "mailbox")) { + wsi->override_present_mode = VK_PRESENT_MODE_MAILBOX_KHR; + } else if (!strcmp(present_mode, "immediate")) { + wsi->override_present_mode = VK_PRESENT_MODE_IMMEDIATE_KHR; + } else { + fprintf(stderr, "Invalid MESA_VK_WSI_PRESENT_MODE value!\n"); + } + } + + if (dri_options) { + if (driCheckOption(dri_options, "adaptive_sync", DRI_BOOL)) + wsi->enable_adaptive_sync = driQueryOptionb(dri_options, + "adaptive_sync"); + } + return VK_SUCCESS; fail: @@ -121,6 +159,32 @@ wsi_device_finish(struct wsi_device *wsi, #endif } +bool +wsi_device_matches_drm_fd(const struct wsi_device *wsi, int drm_fd) +{ + drmDevicePtr fd_device; + int ret = drmGetDevice2(drm_fd, 0, &fd_device); + if (ret) + return false; + + bool match = false; + switch (fd_device->bustype) { + case DRM_BUS_PCI: + match = wsi->pci_bus_info.pciDomain == fd_device->businfo.pci->domain && + wsi->pci_bus_info.pciBus == fd_device->businfo.pci->bus && + wsi->pci_bus_info.pciDevice == fd_device->businfo.pci->dev && + wsi->pci_bus_info.pciFunction == fd_device->businfo.pci->func; + break; + + default: + break; + } + + drmFreeDevice(&fd_device); + + return match; +} + VkResult wsi_swapchain_init(const struct wsi_device *wsi, struct wsi_swapchain *chain, @@ -163,6 +227,59 @@ fail: return result; } +static bool +wsi_swapchain_is_present_mode_supported(struct wsi_device *wsi, + const VkSwapchainCreateInfoKHR *pCreateInfo, + VkPresentModeKHR mode) +{ + ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, pCreateInfo->surface); + struct wsi_interface *iface = wsi->wsi[surface->platform]; + VkPresentModeKHR *present_modes; + uint32_t present_mode_count; + bool supported = false; + VkResult result; + + result = iface->get_present_modes(surface, &present_mode_count, NULL); + if (result != VK_SUCCESS) + return supported; + + present_modes = malloc(present_mode_count * sizeof(*present_modes)); + if (!present_modes) + return supported; + + result = iface->get_present_modes(surface, &present_mode_count, + present_modes); + if (result != VK_SUCCESS) + goto fail; + + for (uint32_t i = 0; i < present_mode_count; i++) { + if (present_modes[i] == mode) { + supported = true; + break; + } + } + +fail: + free(present_modes); + return supported; +} + +enum VkPresentModeKHR +wsi_swapchain_get_present_mode(struct wsi_device *wsi, + const VkSwapchainCreateInfoKHR *pCreateInfo) +{ + if (wsi->override_present_mode == VK_PRESENT_MODE_MAX_ENUM_KHR) + return pCreateInfo->presentMode; + + if (!wsi_swapchain_is_present_mode_supported(wsi, pCreateInfo, + wsi->override_present_mode)) { + fprintf(stderr, "Unsupported MESA_VK_WSI_PRESENT_MODE value!\n"); + return pCreateInfo->presentMode; + } + + return wsi->override_present_mode; +} + void wsi_swapchain_finish(struct wsi_swapchain *chain) { @@ -242,8 +359,8 @@ wsi_create_native_image(const struct wsi_swapchain *chain, .sType = VK_STRUCTURE_TYPE_WSI_FORMAT_MODIFIER_PROPERTIES_LIST_MESA, .pNext = NULL, }; - VkFormatProperties2KHR format_props = { - .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR, + VkFormatProperties2 format_props = { + .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2, .pNext = &modifier_props_list, }; wsi->GetPhysicalDeviceFormatProperties2KHR(wsi->pdevice, @@ -343,13 +460,13 @@ wsi_create_native_image(const struct wsi_swapchain *chain, .pNext = NULL, .implicit_sync = true, }; - const VkExportMemoryAllocateInfoKHR memory_export_info = { - .sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR, + const VkExportMemoryAllocateInfo memory_export_info = { + .sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO, .pNext = &memory_wsi_info, .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, }; - const VkMemoryDedicatedAllocateInfoKHR memory_dedicated_info = { - .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR, + const VkMemoryDedicatedAllocateInfo memory_dedicated_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, .pNext = &memory_export_info, .image = image->image, .buffer = VK_NULL_HANDLE, @@ -395,7 +512,7 @@ wsi_create_native_image(const struct wsi_swapchain *chain, for (uint32_t p = 0; p < image->num_planes; p++) { const VkImageSubresource image_subresource = { - .aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT_KHR << p, + .aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT << p, .mipLevel = 0, .arrayLayer = 0, }; @@ -468,8 +585,8 @@ wsi_create_prime_image(const struct wsi_swapchain *chain, uint32_t linear_size = linear_stride * pCreateInfo->imageExtent.height; linear_size = align_u32(linear_size, 4096); - const VkExternalMemoryBufferCreateInfoKHR prime_buffer_external_info = { - .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR, + const VkExternalMemoryBufferCreateInfo prime_buffer_external_info = { + .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO, .pNext = NULL, .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, }; @@ -494,13 +611,13 @@ wsi_create_prime_image(const struct wsi_swapchain *chain, .pNext = NULL, .implicit_sync = true, }; - const VkExportMemoryAllocateInfoKHR prime_memory_export_info = { - .sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR, + const VkExportMemoryAllocateInfo prime_memory_export_info = { + .sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO, .pNext = &memory_wsi_info, .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, }; - const VkMemoryDedicatedAllocateInfoKHR prime_memory_dedicated_info = { - .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR, + const VkMemoryDedicatedAllocateInfo prime_memory_dedicated_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, .pNext = &prime_memory_export_info, .image = VK_NULL_HANDLE, .buffer = image->prime.buffer, @@ -549,8 +666,8 @@ wsi_create_prime_image(const struct wsi_swapchain *chain, wsi->GetImageMemoryRequirements(chain->device, image->image, &reqs); - const VkMemoryDedicatedAllocateInfoKHR memory_dedicated_info = { - .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR, + const VkMemoryDedicatedAllocateInfo memory_dedicated_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, .pNext = NULL, .image = image->image, .buffer = VK_NULL_HANDLE, @@ -675,7 +792,6 @@ wsi_destroy_image(const struct wsi_swapchain *chain, VkResult wsi_common_get_surface_support(struct wsi_device *wsi_device, - int local_fd, uint32_t queueFamilyIndex, VkSurfaceKHR _surface, VkBool32* pSupported) @@ -684,7 +800,7 @@ wsi_common_get_surface_support(struct wsi_device *wsi_device, struct wsi_interface *iface = wsi_device->wsi[surface->platform]; return iface->get_support(surface, wsi_device, - queueFamilyIndex, local_fd, pSupported); + queueFamilyIndex, pSupported); } VkResult @@ -699,7 +815,7 @@ wsi_common_get_surface_capabilities(struct wsi_device *wsi_device, .sType = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR, }; - VkResult result = iface->get_capabilities2(surface, NULL, &caps2); + VkResult result = iface->get_capabilities2(surface, wsi_device, NULL, &caps2); if (result == VK_SUCCESS) *pSurfaceCapabilities = caps2.surfaceCapabilities; @@ -715,7 +831,7 @@ wsi_common_get_surface_capabilities2(struct wsi_device *wsi_device, ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, pSurfaceInfo->surface); struct wsi_interface *iface = wsi_device->wsi[surface->platform]; - return iface->get_capabilities2(surface, pSurfaceInfo->pNext, + return iface->get_capabilities2(surface, wsi_device, pSurfaceInfo->pNext, pSurfaceCapabilities); } @@ -742,7 +858,7 @@ wsi_common_get_surface_capabilities2ext( .pNext = &counters, }; - VkResult result = iface->get_capabilities2(surface, NULL, &caps2); + VkResult result = iface->get_capabilities2(surface, wsi_device, NULL, &caps2); if (result == VK_SUCCESS) { VkSurfaceCapabilities2EXT *ext_caps = pSurfaceCapabilities; @@ -803,10 +919,22 @@ wsi_common_get_surface_present_modes(struct wsi_device *wsi_device, pPresentModes); } +VkResult +wsi_common_get_present_rectangles(struct wsi_device *wsi_device, + VkSurfaceKHR _surface, + uint32_t* pRectCount, + VkRect2D* pRects) +{ + ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface); + struct wsi_interface *iface = wsi_device->wsi[surface->platform]; + + return iface->get_present_rectangles(surface, wsi_device, + pRectCount, pRects); +} + VkResult wsi_common_create_swapchain(struct wsi_device *wsi, VkDevice device, - int fd, const VkSwapchainCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) @@ -815,7 +943,7 @@ wsi_common_create_swapchain(struct wsi_device *wsi, struct wsi_interface *iface = wsi->wsi[surface->platform]; struct wsi_swapchain *swapchain; - VkResult result = iface->create_swapchain(surface, device, wsi, fd, + VkResult result = iface->create_swapchain(surface, device, wsi, pCreateInfo, pAllocator, &swapchain); if (result != VK_SUCCESS) @@ -907,8 +1035,8 @@ wsi_common_queue_present(const struct wsi_device *wsi, /* We only need/want to wait on semaphores once. After that, we're * guaranteed ordering since it all happens on the same queue. */ - submit_info.waitSemaphoreCount = pPresentInfo->waitSemaphoreCount, - submit_info.pWaitSemaphores = pPresentInfo->pWaitSemaphores, + submit_info.waitSemaphoreCount = pPresentInfo->waitSemaphoreCount; + submit_info.pWaitSemaphores = pPresentInfo->pWaitSemaphores; /* Set up the pWaitDstStageMasks */ stage_flags = vk_alloc(&swapchain->alloc, @@ -972,3 +1100,11 @@ wsi_common_queue_present(const struct wsi_device *wsi, return final_result; } + +uint64_t +wsi_common_get_current_time(void) +{ + struct timespec current; + clock_gettime(CLOCK_MONOTONIC, ¤t); + return current.tv_nsec + current.tv_sec * 1000000000ull; +}