[Mesa-dev] [PATCH v2] anv, radv: Add support for VK_KHR_get_display_properties2
Jordan Justen
jordan.l.justen at intel.com
Thu Jun 21 00:04:20 UTC 2018
features.txt? It looks like some others have been missed recently.
-Jordan
On 2018-06-20 08:07:20, Jason Ekstrand wrote:
> Cc: Keith Packard <keithp at 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 | 175 +++++++++++++++++++++++++---
> src/vulkan/wsi/wsi_common_display.h | 27 +++++
> 6 files changed, 301 insertions(+), 16 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 84431019dbb..764180ec7b5 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,
> @@ -135,6 +179,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 2bba4ee4d2b..e3e996ad136 100644
> --- a/src/intel/vulkan/anv_extensions.py
> +++ b/src/intel/vulkan/anv_extensions.py
> @@ -88,6 +88,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 ed679e85e13..c8892a88606 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,
> @@ -116,6 +158,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 4f52e8087a6..670bb7fba91 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;
>
> @@ -401,6 +404,50 @@ wsi_display_get_physical_device_display_properties(
> struct wsi_display *wsi =
> (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY];
>
> + if (properties == NULL) {
> + return wsi_display_get_physical_device_display_properties2(
> + physical_device, wsi_device, property_count, NULL);
> + } else {
> + /* If we're actually returning properties, allocate a temporary array of
> + * VkDisplayProperties2KHR structs, call properties2 to fill them out,
> + * and then copy them to the client. This seems a bit expensive but
> + * wsi_display_get_physical_device_display_properties2() calls
> + * drmModeGetResources() which does an ioctl and then a bunch of
> + * allocations so this should get lost in the noise.
> + */
> + VkDisplayProperties2KHR *props2 =
> + vk_zalloc(wsi->alloc, sizeof(*props2) * *property_count, 8,
> + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
> + if (props2 == NULL)
> + return VK_ERROR_OUT_OF_HOST_MEMORY;
> +
> + for (uint32_t i = 0; i < *property_count; i++)
> + props2[i].sType = VK_STRUCTURE_TYPE_DISPLAY_PROPERTIES_2_KHR;
> +
> + VkResult result = wsi_display_get_physical_device_display_properties2(
> + physical_device, wsi_device, property_count, props2);
> +
> + if (result == VK_SUCCESS || result == VK_INCOMPLETE) {
> + for (uint32_t i = 0; i < *property_count; i++)
> + properties[i] = props2[i].displayProperties;
> + }
> +
> + vk_free(wsi->alloc, props2);
> +
> + return result;
> + }
> +}
> +
> +VkResult
> +wsi_display_get_physical_device_display_properties2(
> + VkPhysicalDevice physical_device,
> + struct wsi_device *wsi_device,
> + uint32_t *property_count,
> + VkDisplayProperties2KHR *properties)
> +{
> + struct wsi_display *wsi =
> + (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY];
> +
> if (wsi->fd < 0)
> goto bail;
>
> @@ -443,6 +490,24 @@ bail:
> /*
> * 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 +522,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 +588,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 +617,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);
> @@ -604,6 +731,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 eaa0ba727b0..e4df4b1dc9f 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_display_create_display_mode(VkPhysicalDevice physical_device,
> struct wsi_device *wsi_device,
> @@ -76,6 +97,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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list