Cc: Keith Packard <kei...@keithp.com> --- src/amd/vulkan/radv_extensions.py | 1 + src/amd/vulkan/radv_wsi_display.c | 57 +++++++++ src/intel/vulkan/anv_extensions.py | 1 + src/intel/vulkan/anv_wsi_display.c | 56 ++++++++ src/vulkan/wsi/wsi_common_display.c | 192 ++++++++++++++++++++++++---- src/vulkan/wsi/wsi_common_display.h | 27 ++++ 6 files changed, 311 insertions(+), 23 deletions(-)
diff --git a/src/amd/vulkan/radv_extensions.py b/src/amd/vulkan/radv_extensions.py index 65ce7349016..5eb63a7d5dc 100644 --- a/src/amd/vulkan/radv_extensions.py +++ b/src/amd/vulkan/radv_extensions.py @@ -66,6 +66,7 @@ EXTENSIONS = [ Extension('VK_KHR_external_semaphore', 1, 'device->rad_info.has_syncobj'), Extension('VK_KHR_external_semaphore_capabilities', 1, True), Extension('VK_KHR_external_semaphore_fd', 1, 'device->rad_info.has_syncobj'), + Extension('VK_KHR_get_display_properties2', 1, 'VK_USE_PLATFORM_DISPLAY_KHR'), Extension('VK_KHR_get_memory_requirements2', 1, True), Extension('VK_KHR_get_physical_device_properties2', 1, True), Extension('VK_KHR_get_surface_capabilities2', 1, 'RADV_HAS_SURFACE'), diff --git a/src/amd/vulkan/radv_wsi_display.c b/src/amd/vulkan/radv_wsi_display.c index 0f88ce13942..c9915f0100f 100644 --- a/src/amd/vulkan/radv_wsi_display.c +++ b/src/amd/vulkan/radv_wsi_display.c @@ -56,6 +56,20 @@ radv_GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physical_device, properties); } +VkResult +radv_GetPhysicalDeviceDisplayProperties2KHR(VkPhysicalDevice physical_device, + uint32_t *property_count, + VkDisplayProperties2KHR *properties) +{ + RADV_FROM_HANDLE(radv_physical_device, pdevice, physical_device); + + return wsi_display_get_physical_device_display_properties2( + physical_device, + &pdevice->wsi_device, + property_count, + properties); +} + VkResult radv_GetPhysicalDeviceDisplayPlanePropertiesKHR( VkPhysicalDevice physical_device, @@ -71,6 +85,21 @@ radv_GetPhysicalDeviceDisplayPlanePropertiesKHR( properties); } +VkResult +radv_GetPhysicalDeviceDisplayPlaneProperties2KHR( + VkPhysicalDevice physical_device, + uint32_t *property_count, + VkDisplayPlaneProperties2KHR *properties) +{ + RADV_FROM_HANDLE(radv_physical_device, pdevice, physical_device); + + return wsi_display_get_physical_device_display_plane_properties2( + physical_device, + &pdevice->wsi_device, + property_count, + properties); +} + VkResult radv_GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physical_device, uint32_t plane_index, @@ -103,6 +132,21 @@ radv_GetDisplayModePropertiesKHR(VkPhysicalDevice physical_device, properties); } +VkResult +radv_GetDisplayModeProperties2KHR(VkPhysicalDevice physical_device, + VkDisplayKHR display, + uint32_t *property_count, + VkDisplayModeProperties2KHR *properties) +{ + RADV_FROM_HANDLE(radv_physical_device, pdevice, physical_device); + + return wsi_display_get_display_mode_properties2(physical_device, + &pdevice->wsi_device, + display, + property_count, + properties); +} + VkResult radv_CreateDisplayModeKHR(VkPhysicalDevice physical_device, VkDisplayKHR display, @@ -129,6 +173,19 @@ radv_GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physical_device, capabilities); } +VkResult +radv_GetDisplayPlaneCapabilities2KHR(VkPhysicalDevice physical_device, + const VkDisplayPlaneInfo2KHR *pDisplayPlaneInfo, + VkDisplayPlaneCapabilities2KHR *capabilities) +{ + RADV_FROM_HANDLE(radv_physical_device, pdevice, physical_device); + + return wsi_get_display_plane_capabilities2(physical_device, + &pdevice->wsi_device, + pDisplayPlaneInfo, + capabilities); +} + VkResult radv_CreateDisplayPlaneSurfaceKHR( VkInstance _instance, diff --git a/src/intel/vulkan/anv_extensions.py b/src/intel/vulkan/anv_extensions.py index 4bffbcb5a2a..e8131335c0c 100644 --- a/src/intel/vulkan/anv_extensions.py +++ b/src/intel/vulkan/anv_extensions.py @@ -86,6 +86,7 @@ EXTENSIONS = [ Extension('VK_KHR_external_semaphore', 1, True), Extension('VK_KHR_external_semaphore_capabilities', 1, True), Extension('VK_KHR_external_semaphore_fd', 1, True), + Extension('VK_KHR_get_display_properties2', 1, 'VK_USE_PLATFORM_DISPLAY_KHR'), Extension('VK_KHR_get_memory_requirements2', 1, True), Extension('VK_KHR_get_physical_device_properties2', 1, True), Extension('VK_KHR_get_surface_capabilities2', 1, 'ANV_HAS_SURFACE'), diff --git a/src/intel/vulkan/anv_wsi_display.c b/src/intel/vulkan/anv_wsi_display.c index f749a8d98f7..26e091021dd 100644 --- a/src/intel/vulkan/anv_wsi_display.c +++ b/src/intel/vulkan/anv_wsi_display.c @@ -40,6 +40,19 @@ anv_GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physical_device, properties); } +VkResult +anv_GetPhysicalDeviceDisplayProperties2KHR( + VkPhysicalDevice physicalDevice, + uint32_t* pPropertyCount, + VkDisplayProperties2KHR* pProperties) +{ + ANV_FROM_HANDLE(anv_physical_device, pdevice, physicalDevice); + + return wsi_display_get_physical_device_display_properties2( + physicalDevice, &pdevice->wsi_device, + pPropertyCount, pProperties); +} + VkResult anv_GetPhysicalDeviceDisplayPlanePropertiesKHR( VkPhysicalDevice physical_device, @@ -53,6 +66,19 @@ anv_GetPhysicalDeviceDisplayPlanePropertiesKHR( property_count, properties); } +VkResult +anv_GetPhysicalDeviceDisplayPlaneProperties2KHR( + VkPhysicalDevice physicalDevice, + uint32_t* pPropertyCount, + VkDisplayPlaneProperties2KHR* pProperties) +{ + ANV_FROM_HANDLE(anv_physical_device, pdevice, physicalDevice); + + return wsi_display_get_physical_device_display_plane_properties2( + physicalDevice, &pdevice->wsi_device, + pPropertyCount, pProperties); +} + VkResult anv_GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physical_device, uint32_t plane_index, @@ -84,6 +110,22 @@ anv_GetDisplayModePropertiesKHR(VkPhysicalDevice physical_device, properties); } +VkResult +anv_GetDisplayModeProperties2KHR( + VkPhysicalDevice physicalDevice, + VkDisplayKHR display, + uint32_t* pPropertyCount, + VkDisplayModeProperties2KHR* pProperties) +{ + ANV_FROM_HANDLE(anv_physical_device, pdevice, physicalDevice); + + return wsi_display_get_display_mode_properties2(physicalDevice, + &pdevice->wsi_device, + display, + pPropertyCount, + pProperties); +} + VkResult anv_CreateDisplayModeKHR(VkPhysicalDevice physical_device, VkDisplayKHR display, @@ -110,6 +152,20 @@ anv_GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physical_device, capabilities); } +VkResult +anv_GetDisplayPlaneCapabilities2KHR( + VkPhysicalDevice physicalDevice, + const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo, + VkDisplayPlaneCapabilities2KHR* pCapabilities) +{ + ANV_FROM_HANDLE(anv_physical_device, pdevice, physicalDevice); + + return wsi_get_display_plane_capabilities2(physicalDevice, + &pdevice->wsi_device, + pDisplayPlaneInfo, + pCapabilities); +} + VkResult anv_CreateDisplayPlaneSurfaceKHR( VkInstance _instance, diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c index d1453368dfd..db546929f91 100644 --- a/src/vulkan/wsi/wsi_common_display.c +++ b/src/vulkan/wsi/wsi_common_display.c @@ -341,8 +341,11 @@ mode_size(struct wsi_display_mode *mode) static void wsi_display_fill_in_display_properties(struct wsi_device *wsi_device, struct wsi_display_connector *connector, - VkDisplayPropertiesKHR *properties) + VkDisplayProperties2KHR *properties2) { + assert(properties2->sType == VK_STRUCTURE_TYPE_DISPLAY_PROPERTIES_2_KHR); + VkDisplayPropertiesKHR *properties = &properties2->displayProperties; + properties->display = wsi_display_connector_to_handle(connector); properties->displayName = connector->name; @@ -391,12 +394,13 @@ wsi_display_fill_in_display_properties(struct wsi_device *wsi_device, /* * Implement vkGetPhysicalDeviceDisplayPropertiesKHR (VK_KHR_display) */ -VkResult -wsi_display_get_physical_device_display_properties( +static VkResult +get_physical_device_display_properties( VkPhysicalDevice physical_device, struct wsi_device *wsi_device, uint32_t *property_count, - VkDisplayPropertiesKHR *properties) + VkDisplayPropertiesKHR *properties, + VkDisplayProperties2KHR *properties2) { struct wsi_display *wsi = (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY]; @@ -409,7 +413,12 @@ wsi_display_get_physical_device_display_properties( if (!mode_res) goto bail; - VK_OUTARRAY_MAKE(conn, properties, property_count); + vk_outarray(VkDisplayPropertiesKHR) props_arr; + vk_outarray(VkDisplayProperties2KHR) props2_arr; + if (properties) + vk_outarray_init(&props_arr, properties, property_count); + else + vk_outarray_init(&props2_arr, properties2, property_count); /* Get current information */ @@ -423,26 +432,85 @@ wsi_display_get_physical_device_display_properties( } if (connector->connected) { - vk_outarray_append(&conn, prop) { + if (properties) { + VkDisplayProperties2KHR props2 = { + .sType = VK_STRUCTURE_TYPE_DISPLAY_PROPERTIES_2_KHR, + }; wsi_display_fill_in_display_properties(wsi_device, connector, - prop); + &props2); + vk_outarray_append(&props_arr, props) { + *props = props2.displayProperties; + } + } else { + vk_outarray_append(&props2_arr, props) { + wsi_display_fill_in_display_properties(wsi_device, + connector, + props); + } } } } drmModeFreeResources(mode_res); - return vk_outarray_status(&conn); + if (properties) + return vk_outarray_status(&props_arr); + else + return vk_outarray_status(&props2_arr); bail: *property_count = 0; return VK_SUCCESS; } +VkResult +wsi_display_get_physical_device_display_properties( + VkPhysicalDevice physical_device, + struct wsi_device *wsi_device, + uint32_t *property_count, + VkDisplayPropertiesKHR *properties) +{ + return get_physical_device_display_properties(physical_device, wsi_device, + property_count, + properties, + NULL); +} + +VkResult +wsi_display_get_physical_device_display_properties2( + VkPhysicalDevice physical_device, + struct wsi_device *wsi_device, + uint32_t *property_count, + VkDisplayProperties2KHR *properties) +{ + return get_physical_device_display_properties(physical_device, wsi_device, + property_count, + NULL, + properties); +} + /* * Implement vkGetPhysicalDeviceDisplayPlanePropertiesKHR (VK_KHR_display */ +static void +wsi_display_fill_in_display_plane_properties( + struct wsi_device *wsi_device, + struct wsi_display_connector *connector, + VkDisplayPlaneProperties2KHR *properties) +{ + assert(properties->sType == VK_STRUCTURE_TYPE_DISPLAY_PLANE_PROPERTIES_2_KHR); + VkDisplayPlanePropertiesKHR *prop = &properties->displayPlaneProperties; + + if (connector && connector->active) { + prop->currentDisplay = wsi_display_connector_to_handle(connector); + prop->currentStackIndex = 0; + } else { + prop->currentDisplay = VK_NULL_HANDLE; + prop->currentStackIndex = 0; + } +} + VkResult wsi_display_get_physical_device_display_plane_properties( VkPhysicalDevice physical_device, @@ -457,13 +525,33 @@ wsi_display_get_physical_device_display_plane_properties( wsi_for_each_connector(connector, wsi) { vk_outarray_append(&conn, prop) { - if (connector && connector->active) { - prop->currentDisplay = wsi_display_connector_to_handle(connector); - prop->currentStackIndex = 0; - } else { - prop->currentDisplay = VK_NULL_HANDLE; - prop->currentStackIndex = 0; - } + VkDisplayPlaneProperties2KHR prop2 = { + .sType = VK_STRUCTURE_TYPE_DISPLAY_PLANE_PROPERTIES_2_KHR, + }; + wsi_display_fill_in_display_plane_properties(wsi_device, connector, + &prop2); + *prop = prop2.displayPlaneProperties; + } + } + return vk_outarray_status(&conn); +} + +VkResult +wsi_display_get_physical_device_display_plane_properties2( + VkPhysicalDevice physical_device, + struct wsi_device *wsi_device, + uint32_t *property_count, + VkDisplayPlaneProperties2KHR *properties) +{ + struct wsi_display *wsi = + (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY]; + + VK_OUTARRAY_MAKE(conn, properties, property_count); + + wsi_for_each_connector(connector, wsi) { + vk_outarray_append(&conn, prop) { + wsi_display_fill_in_display_plane_properties(wsi_device, connector, + prop); } } return vk_outarray_status(&conn); @@ -503,6 +591,22 @@ wsi_display_get_display_plane_supported_displays( * Implement vkGetDisplayModePropertiesKHR (VK_KHR_display) */ +static void +wsi_display_fill_in_display_mode_properties( + struct wsi_device *wsi_device, + struct wsi_display_mode *display_mode, + VkDisplayModeProperties2KHR *properties) +{ + assert(properties->sType = VK_STRUCTURE_TYPE_DISPLAY_MODE_PROPERTIES_2_KHR); + VkDisplayModePropertiesKHR *prop = &properties->displayModeProperties; + + prop->displayMode = wsi_display_mode_to_handle(display_mode); + prop->parameters.visibleRegion.width = display_mode->hdisplay; + prop->parameters.visibleRegion.height = display_mode->vdisplay; + prop->parameters.refreshRate = + (uint32_t) (wsi_display_mode_refresh(display_mode) * 1000 + 0.5); +} + VkResult wsi_display_get_display_mode_properties(VkPhysicalDevice physical_device, struct wsi_device *wsi_device, @@ -516,14 +620,40 @@ wsi_display_get_display_mode_properties(VkPhysicalDevice physical_device, VK_OUTARRAY_MAKE(conn, properties, property_count); wsi_for_each_display_mode(display_mode, connector) { - if (display_mode->valid) { - vk_outarray_append(&conn, prop) { - prop->displayMode = wsi_display_mode_to_handle(display_mode); - prop->parameters.visibleRegion.width = display_mode->hdisplay; - prop->parameters.visibleRegion.height = display_mode->vdisplay; - prop->parameters.refreshRate = - (uint32_t) (wsi_display_mode_refresh(display_mode) * 1000 + 0.5); - } + if (!display_mode->valid) + continue; + + vk_outarray_append(&conn, prop) { + VkDisplayModeProperties2KHR prop2 = { + .sType = VK_STRUCTURE_TYPE_DISPLAY_MODE_PROPERTIES_2_KHR, + }; + wsi_display_fill_in_display_mode_properties(wsi_device, + display_mode, &prop2); + *prop = prop2.displayModeProperties; + } + } + return vk_outarray_status(&conn); +} + +VkResult +wsi_display_get_display_mode_properties2(VkPhysicalDevice physical_device, + struct wsi_device *wsi_device, + VkDisplayKHR display, + uint32_t *property_count, + VkDisplayModeProperties2KHR *properties) +{ + struct wsi_display_connector *connector = + wsi_display_connector_from_handle(display); + + VK_OUTARRAY_MAKE(conn, properties, property_count); + + wsi_for_each_display_mode(display_mode, connector) { + if (!display_mode->valid) + continue; + + vk_outarray_append(&conn, prop) { + wsi_display_fill_in_display_mode_properties(wsi_device, + display_mode, prop); } } return vk_outarray_status(&conn); @@ -562,6 +692,22 @@ wsi_get_display_plane_capabilities(VkPhysicalDevice physical_device, return VK_SUCCESS; } +VkResult +wsi_get_display_plane_capabilities2( + VkPhysicalDevice physical_device, + struct wsi_device *wsi_device, + const VkDisplayPlaneInfo2KHR *pDisplayPlaneInfo, + VkDisplayPlaneCapabilities2KHR *capabilities) +{ + assert(capabilities->sType = + VK_STRUCTURE_TYPE_DISPLAY_PLANE_CAPABILITIES_2_KHR); + + return wsi_get_display_plane_capabilities(physical_device, wsi_device, + pDisplayPlaneInfo->mode, + pDisplayPlaneInfo->planeIndex, + &capabilities->capabilities); +} + VkResult wsi_create_display_surface(VkInstance instance, const VkAllocationCallbacks *allocator, diff --git a/src/vulkan/wsi/wsi_common_display.h b/src/vulkan/wsi/wsi_common_display.h index 58447d2c6eb..bbf76402f6a 100644 --- a/src/vulkan/wsi/wsi_common_display.h +++ b/src/vulkan/wsi/wsi_common_display.h @@ -39,6 +39,13 @@ wsi_display_get_physical_device_display_properties( uint32_t *property_count, VkDisplayPropertiesKHR *properties); +VkResult +wsi_display_get_physical_device_display_properties2( + VkPhysicalDevice physical_device, + struct wsi_device *wsi_device, + uint32_t *pPropertyCount, + VkDisplayProperties2KHR *pProperties); + VkResult wsi_display_get_physical_device_display_plane_properties( VkPhysicalDevice physical_device, @@ -46,6 +53,13 @@ wsi_display_get_physical_device_display_plane_properties( uint32_t *property_count, VkDisplayPlanePropertiesKHR *properties); +VkResult +wsi_display_get_physical_device_display_plane_properties2( + VkPhysicalDevice physical_device, + struct wsi_device *wsi_device, + uint32_t *property_count, + VkDisplayPlaneProperties2KHR *properties); + VkResult wsi_display_get_display_plane_supported_displays( VkPhysicalDevice physical_device, @@ -61,6 +75,13 @@ wsi_display_get_display_mode_properties(VkPhysicalDevice physical_device, uint32_t *property_count, VkDisplayModePropertiesKHR *properties); +VkResult +wsi_display_get_display_mode_properties2(VkPhysicalDevice physical_device, + struct wsi_device *wsi_device, + VkDisplayKHR display, + uint32_t *property_count, + VkDisplayModeProperties2KHR *properties); + VkResult wsi_get_display_plane_capabilities(VkPhysicalDevice physical_device, struct wsi_device *wsi_device, @@ -68,6 +89,12 @@ wsi_get_display_plane_capabilities(VkPhysicalDevice physical_device, uint32_t plane_index, VkDisplayPlaneCapabilitiesKHR *capabilities); +VkResult +wsi_get_display_plane_capabilities2(VkPhysicalDevice physical_device, + struct wsi_device *wsi_device, + const VkDisplayPlaneInfo2KHR *pDisplayPlaneInfo, + VkDisplayPlaneCapabilities2KHR *capabilities); + VkResult wsi_create_display_surface(VkInstance instance, const VkAllocationCallbacks *pAllocator, -- 2.17.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev