[Mesa-dev] [PATCH mesa 2/9] anv: Add KHR_display extension to anv [v5]
Jason Ekstrand
jason at jlekstrand.net
Wed Jun 13 21:40:33 UTC 2018
On Mon, Jun 11, 2018 at 10:39 PM, Keith Packard <keithp at 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.engestrom at imgtec.com>
>
> v4:
> Adapt primary node usage to new wsi_device_init API
>
> v5:
> Adopt Jason Ekstrand's coding conventions
>
> Declare variables at first use, eliminate extra whitespace between
> types and names. Wrap lines to 80 columns.
>
> Remove spurious MM_PER_PIXEL define
>
> Suggested-by: Jason Ekstrand <jason.ekstrand at intel.com>
>
> Signed-off-by: Keith Packard <keithp at keithp.com>
>
> fixup
> ---
> 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 f22e727553f..5f6cd96825b 100644
> --- a/src/intel/Makefile.sources
> +++ b/src/intel/Makefile.sources
> @@ -254,6 +254,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 4125cb205ad..9b7fbb74007 100644
> --- a/src/intel/Makefile.vulkan.am
> +++ b/src/intel/Makefile.vulkan.am
> @@ -192,6 +192,13 @@ VULKAN_SOURCES += $(VULKAN_WSI_WAYLAND_FILES)
> VULKAN_LIB_DEPS += $(WAYLAND_CLIENT_LIBS)
> endif
>
> +if HAVE_PLATFORM_DRM
> +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 56e91fe5de1..b3c6d1a8722 100644
> --- a/src/intel/vulkan/anv_device.c
> +++ b/src/intel/vulkan/anv_device.c
> @@ -274,6 +274,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;
> @@ -445,6 +446,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);
>
Is this supposed to be opening primary_path instead?
> + 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;
> + }
>
This could just be
if (anv_gem_get_param(master_fd, I915_PARAM_CHIPSET_ID) == 0) {
close(master_fd);
master_fd = -1;
}
No need to type out all that IOCTL stuff.
> + }
> + }
> +
> device->local_fd = fd;
> device->master_fd = master_fd;
> return VK_SUCCESS;
> @@ -635,6 +655,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 8160864685f..83c09a46741 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 5ea82204eea..83cbfed82c7 100644
> --- a/src/intel/vulkan/anv_extensions_gen.py
> +++ b/src/intel/vulkan/anv_extensions_gen.py
> @@ -103,7 +103,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
> @@ -122,7 +122,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..877b506b924
> --- /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"
> +
> +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;
> +}
> +
> +
> +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 f20a8a54c9b..86053ff099c 100644
> --- a/src/intel/vulkan/meson.build
> +++ b/src/intel/vulkan/meson.build
> @@ -164,6 +164,11 @@ if with_platform_wayland
> libanv_files += files('anv_wsi_wayland.c')
> endif
>
> +if with_platform_drm
> + 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.17.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180613/a98a65ff/attachment-0001.html>
More information about the mesa-dev
mailing list