On Mon, Jun 11, 2018 at 10:39 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 > > 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.ekstr...@intel.com> > > Signed-off-by: Keith Packard <kei...@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@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