[Mesa-dev] [PATCH mesa 3/9] radv: Add KHR_display extension to radv [v4]

Jason Ekstrand jason at jlekstrand.net
Wed Jun 13 21:46:51 UTC 2018


On Wed, Jun 13, 2018 at 2:46 PM, Jason Ekstrand <jason at jlekstrand.net>
wrote:

> Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
>

With the caveat that I have no idea how the amdgpu kernel interface works.
:-)


> 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 radv 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:
>>         * Simplify addition of VK_USE_PLATFORM_DISPLAY_KHR to
>>           vulkan_wsi_args
>>
>>         Suggested-by: Eric Engestrom <eric.engestrom at imgtec.com>
>>
>> v3:
>>         Adapt to new wsi_device_init API (added display_fd)
>>
>> v4:
>>         Adopt Jason Ekstrand's coding conventions
>>
>>         Declare variables at first use, eliminate extra whitespace
>>         between types and names. Wrap lines to 80 columns.
>>
>>         Suggested-by: Jason Ekstrand <jason.ekstrand at intel.com>
>>
>> Signed-off-by: Keith Packard <keithp at keithp.com>
>> ---
>>  src/amd/vulkan/Makefile.am        |   8 ++
>>  src/amd/vulkan/Makefile.sources   |   3 +
>>  src/amd/vulkan/meson.build        |   5 +
>>  src/amd/vulkan/radv_device.c      |  17 ++++
>>  src/amd/vulkan/radv_extensions.py |   7 +-
>>  src/amd/vulkan/radv_private.h     |   1 +
>>  src/amd/vulkan/radv_wsi_display.c | 149 ++++++++++++++++++++++++++++++
>>  7 files changed, 188 insertions(+), 2 deletions(-)
>>  create mode 100644 src/amd/vulkan/radv_wsi_display.c
>>
>> diff --git a/src/amd/vulkan/Makefile.am b/src/amd/vulkan/Makefile.am
>> index 18f263ab447..f4f99400275 100644
>> --- a/src/amd/vulkan/Makefile.am
>> +++ b/src/amd/vulkan/Makefile.am
>> @@ -80,6 +80,14 @@ VULKAN_LIB_DEPS = \
>>         $(DLOPEN_LIBS) \
>>         -lm
>>
>> +if HAVE_PLATFORM_DRM
>> +AM_CPPFLAGS += \
>> +       -DVK_USE_PLATFORM_DISPLAY_KHR
>> +
>> +VULKAN_SOURCES += $(VULKAN_WSI_DISPLAY_FILES)
>> +
>> +endif
>> +
>>  if HAVE_PLATFORM_X11
>>  AM_CPPFLAGS += \
>>         $(XCB_DRI3_CFLAGS) \
>> diff --git a/src/amd/vulkan/Makefile.sources
>> b/src/amd/vulkan/Makefile.sources
>> index ccb956a2396..70d56e88cb3 100644
>> --- a/src/amd/vulkan/Makefile.sources
>> +++ b/src/amd/vulkan/Makefile.sources
>> @@ -80,6 +80,9 @@ VULKAN_WSI_WAYLAND_FILES := \
>>  VULKAN_WSI_X11_FILES := \
>>         radv_wsi_x11.c
>>
>> +VULKAN_WSI_DISPLAY_FILES := \
>> +       radv_wsi_display.c
>> +
>>  VULKAN_GENERATED_FILES := \
>>         radv_entrypoints.c \
>>         radv_entrypoints.h \
>> diff --git a/src/amd/vulkan/meson.build b/src/amd/vulkan/meson.build
>> index b5a99fe91e1..15e69d582dd 100644
>> --- a/src/amd/vulkan/meson.build
>> +++ b/src/amd/vulkan/meson.build
>> @@ -115,6 +115,11 @@ if with_platform_wayland
>>    libradv_files += files('radv_wsi_wayland.c')
>>  endif
>>
>> +if with_platform_drm
>> +  radv_flags += '-DVK_USE_PLATFORM_DISPLAY_KHR'
>> +  libradv_files += files('radv_wsi_display.c')
>> +endif
>> +
>>  libvulkan_radeon = shared_library(
>>    'vulkan_radeon',
>>    [libradv_files, radv_entrypoints, radv_extensions_c,
>> vk_format_table_c],
>> diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
>> index ca091ee12ba..59ee503c8c2 100644
>> --- a/src/amd/vulkan/radv_device.c
>> +++ b/src/amd/vulkan/radv_device.c
>> @@ -274,6 +274,23 @@ radv_physical_device_init(struct
>> radv_physical_device *device,
>>                 goto fail;
>>         }
>>
>> +       if (instance->enabled_extensions.KHR_display) {
>> +               master_fd = open(drm_device->nodes[DRM_NODE_PRIMARY],
>> O_RDWR | O_CLOEXEC);
>> +               if (master_fd >= 0) {
>> +                       uint32_t accel_working = 0;
>> +                       struct drm_amdgpu_info request = {
>> +                               .return_pointer =
>> (uintptr_t)&accel_working,
>> +                               .return_size = sizeof(accel_working),
>> +                               .query = AMDGPU_INFO_ACCEL_WORKING
>> +                       };
>> +
>> +                       if (drmCommandWrite(master_fd, DRM_AMDGPU_INFO,
>> &request, sizeof (struct drm_amdgpu_info)) < 0 || !accel_working) {
>> +                               close(master_fd);
>> +                               master_fd = -1;
>> +                       }
>> +               }
>> +       }
>> +
>>         device->master_fd = master_fd;
>>         device->local_fd = fd;
>>         device->ws->query_info(device->ws, &device->rad_info);
>> diff --git a/src/amd/vulkan/radv_extensions.py
>> b/src/amd/vulkan/radv_extensions.py
>> index a5b5a8dc34e..6f4fc71bfd8 100644
>> --- a/src/amd/vulkan/radv_extensions.py
>> +++ b/src/amd/vulkan/radv_extensions.py
>> @@ -86,6 +86,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',                      9, True),
>>      Extension('VK_EXT_depth_range_unrestricted',          1, True),
>>      Extension('VK_EXT_descriptor_indexing',               2, True),
>> @@ -214,7 +215,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
>> @@ -233,7 +234,9 @@ _TEMPLATE_C = Template(COPYRIGHT + """
>>
>>  #define RADV_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)
>> +
>>
>>  const VkExtensionProperties radv_instance_extensions[RADV_INSTANCE_EXTENSION_COUNT]
>> = {
>>  %for ext in instance_extensions:
>> diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.
>> h
>> index 6e636ffdc20..727206db198 100644
>> --- a/src/amd/vulkan/radv_private.h
>> +++ b/src/amd/vulkan/radv_private.h
>> @@ -79,6 +79,7 @@ typedef uint32_t xcb_window_t;
>>  #include "radv_entrypoints.h"
>>
>>  #include "wsi_common.h"
>> +#include "wsi_common_display.h"
>>
>>  #define ATI_VENDOR_ID 0x1002
>>
>> diff --git a/src/amd/vulkan/radv_wsi_display.c
>> b/src/amd/vulkan/radv_wsi_display.c
>> new file mode 100644
>> index 00000000000..c58a6717c66
>> --- /dev/null
>> +++ b/src/amd/vulkan/radv_wsi_display.c
>> @@ -0,0 +1,149 @@
>> +/*
>> + * 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 <stdbool.h>
>> +#include <string.h>
>> +#include <unistd.h>
>> +#include <fcntl.h>
>> +#include "radv_private.h"
>> +#include "radv_cs.h"
>> +#include "util/disk_cache.h"
>> +#include "util/strtod.h"
>> +#include "vk_util.h"
>> +#include <xf86drm.h>
>> +#include <xf86drmMode.h>
>> +#include <amdgpu.h>
>> +#include <amdgpu_drm.h>
>> +#include "winsys/amdgpu/radv_amdgpu_winsys_public.h"
>> +#include "ac_llvm_util.h"
>> +#include "vk_format.h"
>> +#include "sid.h"
>> +#include "util/debug.h"
>> +#include "wsi_common_display.h"
>> +
>> +#define MM_PER_PIXEL     (1.0/96.0 * 25.4)
>> +
>> +VkResult
>> +radv_GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice
>> physical_device,
>> +                                           uint32_t *property_count,
>> +                                           VkDisplayPropertiesKHR
>> *properties)
>> +{
>> +       RADV_FROM_HANDLE(radv_physical_device, pdevice, physical_device);
>> +
>> +       return wsi_display_get_physical_device_display_properties(
>> +               physical_device,
>> +               &pdevice->wsi_device,
>> +               property_count,
>> +               properties);
>> +}
>> +
>> +VkResult
>> +radv_GetPhysicalDeviceDisplayPlanePropertiesKHR(
>> +       VkPhysicalDevice physical_device,
>> +       uint32_t *property_count,
>> +       VkDisplayPlanePropertiesKHR *properties)
>> +{
>> +       RADV_FROM_HANDLE(radv_physical_device, pdevice, physical_device);
>> +
>> +       return wsi_display_get_physical_device_display_plane_properties(
>> +               physical_device,
>> +               &pdevice->wsi_device,
>> +               property_count,
>> +               properties);
>> +}
>> +
>> +VkResult
>> +radv_GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice
>> physical_device,
>> +                                         uint32_t plane_index,
>> +                                         uint32_t *display_count,
>> +                                         VkDisplayKHR *displays)
>> +{
>> +       RADV_FROM_HANDLE(radv_physical_device, pdevice, physical_device);
>> +
>> +       return wsi_display_get_display_plane_supported_displays(
>> +               physical_device,
>> +               &pdevice->wsi_device,
>> +               plane_index,
>> +               display_count,
>> +               displays);
>> +}
>> +
>> +
>> +VkResult
>> +radv_GetDisplayModePropertiesKHR(VkPhysicalDevice physical_device,
>> +                                 VkDisplayKHR display,
>> +                                 uint32_t *property_count,
>> +                                 VkDisplayModePropertiesKHR *properties)
>> +{
>> +       RADV_FROM_HANDLE(radv_physical_device, pdevice, physical_device);
>> +
>> +       return wsi_display_get_display_mode_properties(physical_device,
>> +
>> &pdevice->wsi_device,
>> +                                                      display,
>> +                                                      property_count,
>> +                                                      properties);
>> +}
>> +
>> +VkResult
>> +radv_CreateDisplayModeKHR(VkPhysicalDevice physical_device,
>> +                          VkDisplayKHR display,
>> +                          const VkDisplayModeCreateInfoKHR *create_info,
>> +                          const VkAllocationCallbacks *allocator,
>> +                          VkDisplayModeKHR *mode)
>> +{
>> +       return VK_ERROR_INITIALIZATION_FAILED;
>> +}
>> +
>> +
>> +VkResult
>> +radv_GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physical_device,
>> +                                    VkDisplayModeKHR mode_khr,
>> +                                    uint32_t plane_index,
>> +                                    VkDisplayPlaneCapabilitiesKHR
>> *capabilities)
>> +{
>> +       RADV_FROM_HANDLE(radv_physical_device, pdevice, physical_device);
>> +
>> +       return wsi_get_display_plane_capabilities(physical_device,
>> +                                                 &pdevice->wsi_device,
>> +                                                 mode_khr,
>> +                                                 plane_index,
>> +                                                 capabilities);
>> +}
>> +
>> +VkResult
>> +radv_CreateDisplayPlaneSurfaceKHR(
>> +       VkInstance _instance,
>> +       const VkDisplaySurfaceCreateInfoKHR *create_info,
>> +       const VkAllocationCallbacks *allocator,
>> +       VkSurfaceKHR *surface)
>> +{
>> +       RADV_FROM_HANDLE(radv_instance, instance, _instance);
>> +       const VkAllocationCallbacks *alloc;
>> +
>> +       if (allocator)
>> +               alloc = allocator;
>> +       else
>> +               alloc = &instance->alloc;
>> +
>> +       return wsi_create_display_surface(_instance, alloc,
>> +                                         create_info, surface);
>> +}
>> --
>> 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/ec3e5ce5/attachment-0001.html>


More information about the mesa-dev mailing list