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 <keithp@keithp.com>
This commit is contained in:
Jason Ekstrand 2018-06-16 10:44:11 -07:00
parent 8f3b58ebee
commit b1a013d035
2 changed files with 60 additions and 0 deletions

View file

@ -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,

View file

@ -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,