On Wed, Mar 7, 2018 at 11:25 PM, Keith Packard <kei...@keithp.com> wrote:

> This adds support for the KHR_display extension to the anv Vulkan
> driver. The driver now attempts to open the master DRM node when the
> KHR_display extension is requested so that the common winsys code can
> perform the necessary operations.
>
> v2: Make sure primary fd is usable
>
>         When KHR_display is selected, we try to open the primary node
>         instead of the render node in case the user wants to use
>         KHR_display for presentation. However, if we're actually going
>         to end up using RandR leases, then we don't care if the
>         resulting fd can't be used for display, but the kernel also
>         prevents us from using it for drawing when someone else has
>         master.
>
> v3:
>         Simplify addition of VK_USE_PLATFORM_DISPLAY_KHR to vulkan_wsi_args
>
>         Suggested-by: Eric Engestrom <eric.engest...@imgtec.com>
>
> v4:
>         Adapt primary node usage to new wsi_device_init API
>
> Signed-off-by: Keith Packard <kei...@keithp.com>
> ---
>  src/intel/Makefile.sources             |   3 +
>  src/intel/Makefile.vulkan.am           |   7 ++
>  src/intel/vulkan/anv_device.c          |  21 ++++++
>  src/intel/vulkan/anv_extensions.py     |   1 +
>  src/intel/vulkan/anv_extensions_gen.py |   5 +-
>  src/intel/vulkan/anv_wsi_display.c     | 129
> +++++++++++++++++++++++++++++++++
>  src/intel/vulkan/meson.build           |   5 ++
>  7 files changed, 169 insertions(+), 2 deletions(-)
>  create mode 100644 src/intel/vulkan/anv_wsi_display.c
>
> diff --git a/src/intel/Makefile.sources b/src/intel/Makefile.sources
> index 91c71a8dfaf..6c6b57c603d 100644
> --- a/src/intel/Makefile.sources
> +++ b/src/intel/Makefile.sources
> @@ -250,6 +250,9 @@ VULKAN_WSI_WAYLAND_FILES := \
>  VULKAN_WSI_X11_FILES := \
>         vulkan/anv_wsi_x11.c
>
> +VULKAN_WSI_DISPLAY_FILES := \
> +       vulkan/anv_wsi_display.c
> +
>  VULKAN_GEM_FILES := \
>         vulkan/anv_gem.c
>
> diff --git a/src/intel/Makefile.vulkan.am b/src/intel/Makefile.vulkan.am
> index 6b71df6319a..9b6b68abef9 100644
> --- a/src/intel/Makefile.vulkan.am
> +++ b/src/intel/Makefile.vulkan.am
> @@ -193,6 +193,13 @@ VULKAN_SOURCES += $(VULKAN_WSI_WAYLAND_FILES)
>  VULKAN_LIB_DEPS += $(WAYLAND_CLIENT_LIBS)
>  endif
>
> +if HAVE_PLATFORM_DISPLAY
> +VULKAN_CPPFLAGS += \
> +       -DVK_USE_PLATFORM_DISPLAY_KHR
> +
> +VULKAN_SOURCES += $(VULKAN_WSI_DISPLAY_FILES)
> +endif
> +
>  noinst_LTLIBRARIES += vulkan/libvulkan_common.la
>  vulkan_libvulkan_common_la_SOURCES = $(VULKAN_SOURCES)
>  vulkan_libvulkan_common_la_CFLAGS = $(VULKAN_CFLAGS)
> diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
> index ab61e0ce339..de1d5af2137 100644
> --- a/src/intel/vulkan/anv_device.c
> +++ b/src/intel/vulkan/anv_device.c
> @@ -278,6 +278,7 @@ anv_physical_device_init_uuids(struct
> anv_physical_device *device)
>  static VkResult
>  anv_physical_device_init(struct anv_physical_device *device,
>                           struct anv_instance *instance,
> +                         const char *primary_path,
>                           const char *path)
>  {
>     VkResult result;
> @@ -444,6 +445,25 @@ anv_physical_device_init(struct anv_physical_device
> *device,
>     anv_physical_device_get_supported_extensions(device,
>
>  &device->supported_extensions);
>
> +   if (instance->enabled_extensions.KHR_display) {
> +      master_fd = open(path, O_RDWR | O_CLOEXEC);
> +      if (master_fd >= 0) {
> +         /* prod the device with a GETPARAM call which will fail if
> +          * we don't have permission to even render on this device
> +          */
> +         drm_i915_getparam_t gp;
> +         memset(&gp, '\0', sizeof(gp));
> +         int devid = 0;
> +         gp.param = I915_PARAM_CHIPSET_ID;
> +         gp.value = &devid;
> +         int ret = drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
> +         if (ret < 0) {
> +            close(master_fd);
> +            master_fd = -1;
> +         }
> +      }
> +   }
> +
>     device->local_fd = fd;
>     device->master_fd = master_fd;
>     return VK_SUCCESS;
> @@ -641,6 +661,7 @@ anv_enumerate_devices(struct anv_instance *instance)
>
>           result = anv_physical_device_init(&instance->physicalDevice,
>                          instance,
> +                        devices[i]->nodes[DRM_NODE_PRIMARY],
>                          devices[i]->nodes[DRM_NODE_RENDER]);
>           if (result != VK_ERROR_INCOMPATIBLE_DRIVER)
>              break;
> diff --git a/src/intel/vulkan/anv_extensions.py b/src/intel/vulkan/anv_
> extensions.py
> index d0b70a04055..c23c0a87bb9 100644
> --- a/src/intel/vulkan/anv_extensions.py
> +++ b/src/intel/vulkan/anv_extensions.py
> @@ -107,6 +107,7 @@ EXTENSIONS = [
>      Extension('VK_KHR_xcb_surface',                       6,
> 'VK_USE_PLATFORM_XCB_KHR'),
>      Extension('VK_KHR_xlib_surface',                      6,
> 'VK_USE_PLATFORM_XLIB_KHR'),
>      Extension('VK_KHR_multiview',                         1, True),
> +    Extension('VK_KHR_display',                          23,
> 'VK_USE_PLATFORM_DISPLAY_KHR'),
>      Extension('VK_EXT_debug_report',                      8, True),
>      Extension('VK_EXT_external_memory_dma_buf',           1, True),
>      Extension('VK_EXT_global_priority',                   1,
> diff --git a/src/intel/vulkan/anv_extensions_gen.py
> b/src/intel/vulkan/anv_extensions_gen.py
> index 9bcb631b124..180e6842357 100644
> --- a/src/intel/vulkan/anv_extensions_gen.py
> +++ b/src/intel/vulkan/anv_extensions_gen.py
> @@ -113,7 +113,7 @@ _TEMPLATE_C = Template(COPYRIGHT + """
>  #include "vk_util.h"
>
>  /* Convert the VK_USE_PLATFORM_* defines to booleans */
> -%for platform in ['ANDROID', 'WAYLAND', 'XCB', 'XLIB']:
> +%for platform in ['ANDROID', 'WAYLAND', 'XCB', 'XLIB', 'DISPLAY']:
>  #ifdef VK_USE_PLATFORM_${platform}_KHR
>  #   undef VK_USE_PLATFORM_${platform}_KHR
>  #   define VK_USE_PLATFORM_${platform}_KHR true
> @@ -132,7 +132,8 @@ _TEMPLATE_C = Template(COPYRIGHT + """
>
>  #define ANV_HAS_SURFACE (VK_USE_PLATFORM_WAYLAND_KHR || \\
>                           VK_USE_PLATFORM_XCB_KHR || \\
> -                         VK_USE_PLATFORM_XLIB_KHR)
> +                         VK_USE_PLATFORM_XLIB_KHR || \\
> +                         VK_USE_PLATFORM_DISPLAY_KHR)
>
>  static const uint32_t MAX_API_VERSION = ${MAX_API_VERSION.c_vk_
> version()};
>
> diff --git a/src/intel/vulkan/anv_wsi_display.c
> b/src/intel/vulkan/anv_wsi_display.c
> new file mode 100644
> index 00000000000..9b00d7f02e4
> --- /dev/null
> +++ b/src/intel/vulkan/anv_wsi_display.c
> @@ -0,0 +1,129 @@
> +/*
> + * Copyright © 2017 Keith Packard
> + *
> + * Permission to use, copy, modify, distribute, and sell this software
> and its
> + * documentation for any purpose is hereby granted without fee, provided
> that
> + * the above copyright notice appear in all copies and that both that
> copyright
> + * notice and this permission notice appear in supporting documentation,
> and
> + * that the name of the copyright holders not be used in advertising or
> + * publicity pertaining to distribution of the software without specific,
> + * written prior permission.  The copyright holders make no
> representations
> + * about the suitability of this software for any purpose.  It is
> provided "as
> + * is" without express or implied warranty.
> + *
> + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
> SOFTWARE,
> + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
> + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT
> OR
> + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
> USE,
> + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
> + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
> PERFORMANCE
> + * OF THIS SOFTWARE.
> + */
> +
> +#include "anv_private.h"
> +#include "wsi_common.h"
> +#include "vk_format_info.h"
> +#include "vk_util.h"
> +#include "wsi_common_display.h"
> +
> +#define MM_PER_PIXEL     (1.0/96.0 * 25.4)
>

I don't think you need this. :-)

Other than that and the comment on patch 1 about stuff that should probably
go here, this looks good to me.


> +VkResult
> +anv_GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice
>  physical_device,
> +                                           uint32_t
>  *property_count,
> +                                           VkDisplayPropertiesKHR
>  *properties)
> +{
> +   ANV_FROM_HANDLE(anv_physical_device, pdevice, physical_device);
> +
> +   return wsi_display_get_physical_device_display_properties(
> physical_device,
> +
>  &pdevice->wsi_device,
> +
>  property_count,
> +                                                             properties);
> +}
> +
> +VkResult
> +anv_GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice
>       physical_device,
> +                                                uint32_t
>       *property_count,
> +
> VkDisplayPlanePropertiesKHR     *properties)
> +{
> +   ANV_FROM_HANDLE(anv_physical_device, pdevice, physical_device);
> +
> +   return wsi_display_get_physical_device_display_plane_
> properties(physical_device,
> +
>  &pdevice->wsi_device,
> +
>  property_count,
> +
>  properties);
> +}
> +
> +VkResult
> +anv_GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice
>  physical_device,
> +                                         uint32_t
>  plane_index,
> +                                         uint32_t
>  *display_count,
> +                                         VkDisplayKHR
>  *displays)
> +{
> +   ANV_FROM_HANDLE(anv_physical_device, pdevice, physical_device);
> +
> +   return wsi_display_get_display_plane_supported_displays(physical_
> device,
> +
>  &pdevice->wsi_device,
> +                                                           plane_index,
> +                                                           display_count,
> +                                                           displays);
> +}
> +
> +
> +VkResult
> +anv_GetDisplayModePropertiesKHR(VkPhysicalDevice
>  physical_device,
> +                                 VkDisplayKHR                   display,
> +                                 uint32_t
>  *property_count,
> +                                 VkDisplayModePropertiesKHR
>  *properties)
> +{
> +   ANV_FROM_HANDLE(anv_physical_device, pdevice, physical_device);
> +
> +   return wsi_display_get_display_mode_properties(physical_device,
> +                                                  &pdevice->wsi_device,
> +                                                  display,
> +                                                  property_count,
> +                                                  properties);
> +}
> +
> +VkResult
> +anv_CreateDisplayModeKHR(VkPhysicalDevice
> physical_device,
> +                          VkDisplayKHR                          display,
> +                          const VkDisplayModeCreateInfoKHR
> *create_info,
> +                          const VkAllocationCallbacks
>  *allocator,
> +                          VkDisplayModeKHR                      *mode)
> +{
> +   return VK_ERROR_INITIALIZATION_FAILED;
>

This looks valid though it might be nice to allow adding modes at some
point.

--Jason


> +}
> +
> +
> +VkResult
> +anv_GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice
> physical_device,
> +                                    VkDisplayModeKHR
> mode_khr,
> +                                    uint32_t
> plane_index,
> +                                    VkDisplayPlaneCapabilitiesKHR
>  *capabilities)
> +{
> +   ANV_FROM_HANDLE(anv_physical_device, pdevice, physical_device);
> +
> +   return wsi_get_display_plane_capabilities(physical_device,
> +                                             &pdevice->wsi_device,
> +                                             mode_khr,
> +                                             plane_index,
> +                                             capabilities);
> +}
> +
> +VkResult
> +anv_CreateDisplayPlaneSurfaceKHR(VkInstance
> _instance,
> +                                  const VkDisplaySurfaceCreateInfoKHR
>  *create_info,
> +                                  const VkAllocationCallbacks
>  *allocator,
> +                                  VkSurfaceKHR
> *surface)
> +{
> +   ANV_FROM_HANDLE(anv_instance, instance, _instance);
> +   const VkAllocationCallbacks *alloc;
> +
> +   if (allocator)
> +     alloc = allocator;
> +   else
> +     alloc = &instance->alloc;
> +
> +   return wsi_create_display_surface(_instance, alloc, create_info,
> surface);
> +}
> diff --git a/src/intel/vulkan/meson.build b/src/intel/vulkan/meson.build
> index ef50134636e..870d0a5a6c4 100644
> --- a/src/intel/vulkan/meson.build
> +++ b/src/intel/vulkan/meson.build
> @@ -173,6 +173,11 @@ if with_platform_wayland
>    libanv_files += files('anv_wsi_wayland.c')
>  endif
>
> +if with_platform_display
> +  anv_flags += '-DVK_USE_PLATFORM_DISPLAY_KHR'
> +  libanv_files += files('anv_wsi_display.c')
> +endif
> +
>  libanv_common = static_library(
>    'anv_common',
>    [libanv_files, anv_entrypoints, anv_extensions_c, anv_extensions_h],
> --
> 2.16.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to