• Keith Packard's avatar
    vulkan: Add KHR_display extension using DRM [v10] · da997ebe
    Keith Packard authored
    This adds support for the KHR_display extension support to the vulkan
    WSI layer. Driver support will be added separately.
    
    v2:
    	* fix double ;; in wsi_common_display.c
    
    	* Move mode list from wsi_display to wsi_display_connector
    
    	* Fix scope for wsi_display_mode andwsi_display_connector
              allocs
    
    	* Switch all allocations to vk_zalloc instead of vk_alloc.
    
    	* Fix DRM failure in
              wsi_display_get_physical_device_display_properties
    
    	  When DRM fails, or when we don't have a master fd
    	  (presumably due to application errors), just return 0
    	  properties from this function, which is at least a valid
    	  response.
    
    	* Use vk_outarray for all property queries
    
    	  This is a bit less error-prone than open-coding the same
    	  stuff.
    
    	* Remove VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR from surface caps
    
    	  Until we have multi-plane support, we shouldn't pretend to
    	  have any multi-plane semantics, even if undefined.
    Suggested-by: Jason Ekstrand's avatarJason Ekstrand <jason@jlekstrand.net>
    
    	* Simplify addition of VK_USE_PLATFORM_DISPLAY_KHR to
              vulkan_wsi_args
    Suggested-by: Eric Engestrom's avatarEric Engestrom <eric.engestrom@imgtec.com>
    
    v3:
    	Add separate 'display_fd' and 'render_fd' arguments to
    	wsi_device_init API. This allows drivers to use different FDs
    	for the different aspects of the device.
    
    	Use largest mode as display size when no preferred mode.
    
    	If the display doesn't provide a preferred mode, we'll assume
    	that the largest supported mode is the "physical size" of the
    	device and report that.
    
    v4:
    	Make wsi_image_state enumeration values uppercase.
    	Follow more common mesa conventions.
    
    	Remove 'render_fd' from wsi_device_init API.  The
    	wsi_common_display code doesn't use this fd at all, so stop
    	passing it in. This avoids any potential confusion over which
    	fd to use when creating display-relative object handles.
    
    	Remove call to wsi_create_prime_image which would never have
    	been reached as the necessary condition (use_prime_blit) is
    	never set.
    
    	whitespace cleanups in wsi_common_display.c
    Suggested-by: Jason Ekstrand's avatarJason Ekstrand <jason@jlekstrand.net>
    
    	Add depth/bpp info to available surface formats.  Instead of
    	hard-coding depth 24 bpp 32 in the drmModeAddFB call, use the
    	requested format to find suitable values.
    
    	Destroy kernel buffers and FBs when swapchain is destroyed. We
    	were leaking both of these kernel objects across swapchain
    	destruction.
    
    	Note that wsi_display_wait_for_event waits for anything to
    	happen.  wsi_display_wait_for_event is simply a yield so that
    	the caller can then check to see if the desired state change
    	has occurred.
    
    	Record swapchain failures in chain for later return. If some
    	asynchronous swapchain activity fails, we need to tell the
    	application eventually. Record the failure in the swapchain
    	and report it at the next acquire_next_image or queue_present
    	call.
    
    	Fix error returns from wsi_display_setup_connector.  If a
    	malloc failed, then the result should be
    	VK_ERROR_OUT_OF_HOST_MEMORY. Otherwise, the associated ioctl
    	failed and we're either VT switched away, or our lease has
    	been revoked, in which case we should return
    	VK_ERROR_OUT_OF_DATE_KHR.
    
    	Make sure both sides of if/else brace use matches
    
    	Note that we assume drmModeSetCrtc is synchronous. Add a
    	comment explaining why we can idle any previous displayed
    	image as soon as the mode set returns.
    
    	Note that EACCES from drmModePageFlip means VT inactive.  When
    	vt switched away drmModePageFlip returns EACCES. Poll once a
    	second waiting until we get some other return value back.
    
    	Clean up after alloc failure in
    	wsi_display_surface_create_swapchain. Destroy any created
    	images, free the swapchain.
    
    	Remove physical_device from wsi_display_init_wsi. We never
    	need this value, so remove it from the API and from the
    	internal wsi_display structure.
    
    	Use drmModeAddFB2 in wsi_display_image_init.  This takes a drm
    	format instead of depth/bpp, which provides more control over
    	the format of the data.
    
    v5:
    	Set the 'currentStackIndex' member of the
    	VkDisplayPlanePropertiesKHR record to zero, instead of
    	indexing across all displays. This value is the stack depth of
    	the plane within an individual display, and as the current
    	code supports only a single plane per display, should be set
    	to zero for all elements
    Discovered-by: default avatarDavid Mao <David.Mao@amd.com>
    
    v6:
    	Remove 'platform_display' bits from the build and use the
    	existing 'platform_drm' instead.
    
    v7:
    	Ensure VK_ICD_WSI_PLATFORM_MAX is large enough by
    	setting to VK_ICD_WSI_PLATFORM_DISPLAY + 1
    
    v8:
    	Simplify wsi_device_init failure from wsi_display_init_wsi
    	by using the same pattern as the other wsi layers.
    
        Adopt Jason Ekstrand's white space and variable declaration
    	suggestions. Declare variables at first use, eliminate extra
    	whitespace between types and names, add list iterator helpers,
    	switch to lower-case list_ macros.
    
        Respond to Jason's April 8 review:
    
    	* Create a function to convert relative to absolute timeouts
              to catch overflow issues in one place
    
    	* use VK_NULL_HANDLE to clear prop->currentDisplay
    
    	* Get rid of available_present_modes array.
    
    	* return OUT_OF_DATE_KHR when display_queue_next called after
    	  display has been released.
    
    	* Make errors from mode setting fatal in display_queue_next
    
    	* Remove duplicate pthread_mutex_init call
    
    	* Add wsi_init_pthread_cond_monotonic helper function to
    	  isolate pthread error handling from wsi_display_init_wsi
    Suggested-by: Jason Ekstrand's avatarJason Ekstrand <jason.ekstrand@intel.com>
    
    v9:
    	Fix vscan handling by using MAX2(vscan, 1) everywhere. Vscan
    	can be zero anywhere, which is treated the same as 1.
    Suggested-by: Jason Ekstrand's avatarJason Ekstrand <jason.ekstrand@intel.com>
    
    v10:
    	Respond to Vulkan CTS failures.
    
    	1. Initialize planeReorderPossible in display_properties code
    
    	2. Only report connected displays in
    	   get_display_plane_supported_displays
    
    	3. Return VK_ERROR_OUT_OF_HOST_MEMORY when pthread cond
    	   initialization fails.
    Signed-off-by: Jason Ekstrand's avatarJason Ekstrand <jason.ekstrand@intel.com>
    
    	4. Add vkCreateDisplayModeKHR. This doesn't actually create
    	   new modes, it only looks to see if the requested parameters
    	   matches an existing mode and returns that.
    Suggested-by: Jason Ekstrand's avatarJason Ekstrand <jason.ekstrand@intel.com>
    Reviewed-by: Jason Ekstrand's avatarJason Ekstrand <jason@jlekstrand.net>
    Signed-off-by: Keith Packard's avatarKeith Packard <keithp@keithp.com>
    da997ebe