From: Jason Ekstrand Date: Sat, 16 Jun 2018 17:44:11 +0000 (-0700) Subject: Vulkan/wsi: Implement VK_EXT_display_surface_counter X-Git-Url: https://git.libre-soc.org/?p=mesa.git;a=commitdiff_plain;h=b1a013d035230957bdd619a1049424b35e69d6eb Vulkan/wsi: Implement VK_EXT_display_surface_counter This extension is required to support EXT_display_control as it offers a way to query whether the vblank counter is supported. Internally, it is implemented using a fake MESA extension which provides a chain-in to GetSurfaceCapabilities2KHR which contains the one added field. This has the advantage of reducing number of callbacks needed in the back-ends. It also means that anything chained into GetSurfaceCapabilities2EXT through VkSurfaceCapabilities2KHR::pNext so we only need to handle crawling the pNext chain once per back-end. Reviewed-by: Keith Packard --- diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index ab5b2dba0da..f2d90a6bba2 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -719,6 +719,51 @@ wsi_common_get_surface_capabilities2(struct wsi_device *wsi_device, pSurfaceCapabilities); } +VkResult +wsi_common_get_surface_capabilities2ext( + struct wsi_device *wsi_device, + VkSurfaceKHR _surface, + VkSurfaceCapabilities2EXT *pSurfaceCapabilities) +{ + ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface); + struct wsi_interface *iface = wsi_device->wsi[surface->platform]; + + assert(pSurfaceCapabilities->sType == + VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT); + + struct wsi_surface_supported_counters counters = { + .sType = VK_STRUCTURE_TYPE_WSI_SURFACE_SUPPORTED_COUNTERS_MESA, + .pNext = pSurfaceCapabilities->pNext, + .supported_surface_counters = 0, + }; + + VkSurfaceCapabilities2KHR caps2 = { + .sType = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR, + .pNext = &counters, + }; + + VkResult result = iface->get_capabilities2(surface, NULL, &caps2); + + if (result == VK_SUCCESS) { + VkSurfaceCapabilities2EXT *ext_caps = pSurfaceCapabilities; + VkSurfaceCapabilitiesKHR khr_caps = caps2.surfaceCapabilities; + + ext_caps->minImageCount = khr_caps.minImageCount; + ext_caps->maxImageCount = khr_caps.maxImageCount; + ext_caps->currentExtent = khr_caps.currentExtent; + ext_caps->minImageExtent = khr_caps.minImageExtent; + ext_caps->maxImageExtent = khr_caps.maxImageExtent; + ext_caps->maxImageArrayLayers = khr_caps.maxImageArrayLayers; + ext_caps->supportedTransforms = khr_caps.supportedTransforms; + ext_caps->currentTransform = khr_caps.currentTransform; + ext_caps->supportedCompositeAlpha = khr_caps.supportedCompositeAlpha; + ext_caps->supportedUsageFlags = khr_caps.supportedUsageFlags; + ext_caps->supportedSurfaceCounters = counters.supported_surface_counters; + } + + return result; +} + VkResult wsi_common_get_surface_formats(struct wsi_device *wsi_device, VkSurfaceKHR _surface, diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h index 61b1de59d7f..07d5e8353b0 100644 --- a/src/vulkan/wsi/wsi_common.h +++ b/src/vulkan/wsi/wsi_common.h @@ -36,6 +36,7 @@ #define VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA (VkStructureType)1000001002 #define VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO_MESA (VkStructureType)1000001003 #define VK_STRUCTURE_TYPE_WSI_FORMAT_MODIFIER_PROPERTIES_LIST_MESA (VkStructureType)1000001004 +#define VK_STRUCTURE_TYPE_WSI_SURFACE_SUPPORTED_COUNTERS_MESA (VkStructureType)1000001005 struct wsi_image_create_info { VkStructureType sType; @@ -66,6 +67,14 @@ struct wsi_format_modifier_properties_list { struct wsi_format_modifier_properties *modifier_properties; }; +/* To be chained into VkSurfaceCapabilities2KHR */ +struct wsi_surface_supported_counters { + VkStructureType sType; + const void *pNext; + + VkSurfaceCounterFlagsEXT supported_surface_counters; +}; + struct wsi_interface; #define VK_ICD_WSI_PLATFORM_MAX (VK_ICD_WSI_PLATFORM_DISPLAY + 1) @@ -178,6 +187,12 @@ wsi_common_get_surface_present_modes(struct wsi_device *wsi_device, uint32_t *pPresentModeCount, VkPresentModeKHR *pPresentModes); +VkResult +wsi_common_get_surface_capabilities2ext( + struct wsi_device *wsi_device, + VkSurfaceKHR surface, + VkSurfaceCapabilities2EXT *pSurfaceCapabilities); + VkResult wsi_common_get_images(VkSwapchainKHR _swapchain, uint32_t *pSwapchainImageCount,