mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 15:20:10 +01:00
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:
parent
8f3b58ebee
commit
b1a013d035
2 changed files with 60 additions and 0 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue