<div dir="ltr">Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jun 11, 2018 at 10:39 PM, Keith Packard <span dir="ltr"><<a href="mailto:keithp@keithp.com" target="_blank">keithp@keithp.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This adds support for the KHR_display extension to the radv Vulkan<br>
driver. The driver now attempts to open the master DRM node when the<br>
KHR_display extension is requested so that the common winsys code can<br>
perform the necessary operations.<br>
<br>
v2:<br>
        * Simplify addition of VK_USE_PLATFORM_DISPLAY_KHR to<br>
          vulkan_wsi_args<br>
<br>
        Suggested-by: Eric Engestrom <<a href="mailto:eric.engestrom@imgtec.com">eric.engestrom@imgtec.com</a>><br>
<br>
v3:<br>
        Adapt to new wsi_device_init API (added display_fd)<br>
<br>
v4:<br>
        Adopt Jason Ekstrand's coding conventions<br>
<br>
        Declare variables at first use, eliminate extra whitespace<br>
        between types and names. Wrap lines to 80 columns.<br>
<br>
        Suggested-by: Jason Ekstrand <<a href="mailto:jason.ekstrand@intel.com">jason.ekstrand@intel.com</a>><br>
<br>
Signed-off-by: Keith Packard <<a href="mailto:keithp@keithp.com">keithp@keithp.com</a>><br>
---<br>
 src/amd/vulkan/Makefile.am        |   8 ++<br>
 src/amd/vulkan/Makefile.<wbr>sources   |   3 +<br>
 src/amd/vulkan/meson.build        |   5 +<br>
 src/amd/vulkan/radv_device.c      |  17 ++++<br>
 src/amd/vulkan/radv_<wbr>extensions.py |   7 +-<br>
 src/amd/vulkan/radv_private.h     |   1 +<br>
 src/amd/vulkan/radv_wsi_<wbr>display.c | 149 ++++++++++++++++++++++++++++++<br>
 7 files changed, 188 insertions(+), 2 deletions(-)<br>
 create mode 100644 src/amd/vulkan/radv_wsi_<wbr>display.c<br>
<br>
diff --git a/src/amd/vulkan/Makefile.am b/src/amd/vulkan/Makefile.am<br>
index 18f263ab447..f4f99400275 100644<br>
--- a/src/amd/vulkan/Makefile.am<br>
+++ b/src/amd/vulkan/Makefile.am<br>
@@ -80,6 +80,14 @@ VULKAN_LIB_DEPS = \<br>
        $(DLOPEN_LIBS) \<br>
        -lm<br>
<br>
+if HAVE_PLATFORM_DRM<br>
+AM_CPPFLAGS += \<br>
+       -DVK_USE_PLATFORM_DISPLAY_KHR<br>
+<br>
+VULKAN_SOURCES += $(VULKAN_WSI_DISPLAY_FILES)<br>
+<br>
+endif<br>
+<br>
 if HAVE_PLATFORM_X11<br>
 AM_CPPFLAGS += \<br>
        $(XCB_DRI3_CFLAGS) \<br>
diff --git a/src/amd/vulkan/Makefile.<wbr>sources b/src/amd/vulkan/Makefile.<wbr>sources<br>
index ccb956a2396..70d56e88cb3 100644<br>
--- a/src/amd/vulkan/Makefile.<wbr>sources<br>
+++ b/src/amd/vulkan/Makefile.<wbr>sources<br>
@@ -80,6 +80,9 @@ VULKAN_WSI_WAYLAND_FILES := \<br>
 VULKAN_WSI_X11_FILES := \<br>
        radv_wsi_x11.c<br>
<br>
+VULKAN_WSI_DISPLAY_FILES := \<br>
+       radv_wsi_display.c<br>
+<br>
 VULKAN_GENERATED_FILES := \<br>
        radv_entrypoints.c \<br>
        radv_entrypoints.h \<br>
diff --git a/src/amd/vulkan/meson.build b/src/amd/vulkan/meson.build<br>
index b5a99fe91e1..15e69d582dd 100644<br>
--- a/src/amd/vulkan/meson.build<br>
+++ b/src/amd/vulkan/meson.build<br>
@@ -115,6 +115,11 @@ if with_platform_wayland<br>
   libradv_files += files('radv_wsi_wayland.c')<br>
 endif<br>
<br>
+if with_platform_drm<br>
+  radv_flags += '-DVK_USE_PLATFORM_DISPLAY_<wbr>KHR'<br>
+  libradv_files += files('radv_wsi_display.c')<br>
+endif<br>
+<br>
 libvulkan_radeon = shared_library(<br>
   'vulkan_radeon',<br>
   [libradv_files, radv_entrypoints, radv_extensions_c, vk_format_table_c],<br>
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c<br>
index ca091ee12ba..59ee503c8c2 100644<br>
--- a/src/amd/vulkan/radv_device.c<br>
+++ b/src/amd/vulkan/radv_device.c<br>
@@ -274,6 +274,23 @@ radv_physical_device_init(<wbr>struct radv_physical_device *device,<br>
                goto fail;<br>
        }<br>
<br>
+       if (instance->enabled_extensions.<wbr>KHR_display) {<br>
+               master_fd = open(drm_device->nodes[DRM_<wbr>NODE_PRIMARY], O_RDWR | O_CLOEXEC);<br>
+               if (master_fd >= 0) {<br>
+                       uint32_t accel_working = 0;<br>
+                       struct drm_amdgpu_info request = {<br>
+                               .return_pointer = (uintptr_t)&accel_working,<br>
+                               .return_size = sizeof(accel_working),<br>
+                               .query = AMDGPU_INFO_ACCEL_WORKING<br>
+                       };<br>
+<br>
+                       if (drmCommandWrite(master_fd, DRM_AMDGPU_INFO, &request, sizeof (struct drm_amdgpu_info)) < 0 || !accel_working) {<br>
+                               close(master_fd);<br>
+                               master_fd = -1;<br>
+                       }<br>
+               }<br>
+       }<br>
+<br>
        device->master_fd = master_fd;<br>
        device->local_fd = fd;<br>
        device->ws->query_info(device-<wbr>>ws, &device->rad_info);<br>
diff --git a/src/amd/vulkan/radv_<wbr>extensions.py b/src/amd/vulkan/radv_<wbr>extensions.py<br>
index a5b5a8dc34e..6f4fc71bfd8 100644<br>
--- a/src/amd/vulkan/radv_<wbr>extensions.py<br>
+++ b/src/amd/vulkan/radv_<wbr>extensions.py<br>
@@ -86,6 +86,7 @@ EXTENSIONS = [<br>
     Extension('VK_KHR_xcb_surface'<wbr>,                       6, 'VK_USE_PLATFORM_XCB_KHR'),<br>
     Extension('VK_KHR_xlib_<wbr>surface',                      6, 'VK_USE_PLATFORM_XLIB_KHR'),<br>
     Extension('VK_KHR_multiview',                         1, True),<br>
+    Extension('VK_KHR_display',                          23, 'VK_USE_PLATFORM_DISPLAY_KHR')<wbr>,<br>
     Extension('VK_EXT_debug_<wbr>report',                      9, True),<br>
     Extension('VK_EXT_depth_range_<wbr>unrestricted',          1, True),<br>
     Extension('VK_EXT_descriptor_<wbr>indexing',               2, True),<br>
@@ -214,7 +215,7 @@ _TEMPLATE_C = Template(COPYRIGHT + """<br>
 #include "vk_util.h"<br>
<br>
 /* Convert the VK_USE_PLATFORM_* defines to booleans */<br>
-%for platform in ['ANDROID', 'WAYLAND', 'XCB', 'XLIB']:<br>
+%for platform in ['ANDROID', 'WAYLAND', 'XCB', 'XLIB', 'DISPLAY']:<br>
 #ifdef VK_USE_PLATFORM_${platform}_<wbr>KHR<br>
 #   undef VK_USE_PLATFORM_${platform}_<wbr>KHR<br>
 #   define VK_USE_PLATFORM_${platform}_<wbr>KHR true<br>
@@ -233,7 +234,9 @@ _TEMPLATE_C = Template(COPYRIGHT + """<br>
<br>
 #define RADV_HAS_SURFACE (VK_USE_PLATFORM_WAYLAND_KHR || \\<br>
                          VK_USE_PLATFORM_XCB_KHR || \\<br>
-                         VK_USE_PLATFORM_XLIB_KHR)<br>
+                         VK_USE_PLATFORM_XLIB_KHR || \\<br>
+                         VK_USE_PLATFORM_DISPLAY_KHR)<br>
+<br>
<br>
 const VkExtensionProperties radv_instance_extensions[RADV_<wbr>INSTANCE_EXTENSION_COUNT] = {<br>
 %for ext in instance_extensions:<br>
diff --git a/src/amd/vulkan/radv_private.<wbr>h b/src/amd/vulkan/radv_private.<wbr>h<br>
index 6e636ffdc20..727206db198 100644<br>
--- a/src/amd/vulkan/radv_private.<wbr>h<br>
+++ b/src/amd/vulkan/radv_private.<wbr>h<br>
@@ -79,6 +79,7 @@ typedef uint32_t xcb_window_t;<br>
 #include "radv_entrypoints.h"<br>
<br>
 #include "wsi_common.h"<br>
+#include "wsi_common_display.h"<br>
<br>
 #define ATI_VENDOR_ID 0x1002<br>
<br>
diff --git a/src/amd/vulkan/radv_wsi_<wbr>display.c b/src/amd/vulkan/radv_wsi_<wbr>display.c<br>
new file mode 100644<br>
index 00000000000..c58a6717c66<br>
--- /dev/null<br>
+++ b/src/amd/vulkan/radv_wsi_<wbr>display.c<br>
@@ -0,0 +1,149 @@<br>
+/*<br>
+ * Copyright © 2017 Keith Packard<br>
+ *<br>
+ * Permission to use, copy, modify, distribute, and sell this software and its<br>
+ * documentation for any purpose is hereby granted without fee, provided that<br>
+ * the above copyright notice appear in all copies and that both that copyright<br>
+ * notice and this permission notice appear in supporting documentation, and<br>
+ * that the name of the copyright holders not be used in advertising or<br>
+ * publicity pertaining to distribution of the software without specific,<br>
+ * written prior permission.  The copyright holders make no representations<br>
+ * about the suitability of this software for any purpose.  It is provided "as<br>
+ * is" without express or implied warranty.<br>
+ *<br>
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,<br>
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO<br>
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR<br>
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,<br>
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER<br>
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE<br>
+ * OF THIS SOFTWARE.<br>
+ */<br>
+<br>
+#include <stdbool.h><br>
+#include <string.h><br>
+#include <unistd.h><br>
+#include <fcntl.h><br>
+#include "radv_private.h"<br>
+#include "radv_cs.h"<br>
+#include "util/disk_cache.h"<br>
+#include "util/strtod.h"<br>
+#include "vk_util.h"<br>
+#include <xf86drm.h><br>
+#include <xf86drmMode.h><br>
+#include <amdgpu.h><br>
+#include <amdgpu_drm.h><br>
+#include "winsys/amdgpu/radv_amdgpu_<wbr>winsys_public.h"<br>
+#include "ac_llvm_util.h"<br>
+#include "vk_format.h"<br>
+#include "sid.h"<br>
+#include "util/debug.h"<br>
+#include "wsi_common_display.h"<br>
+<br>
+#define MM_PER_PIXEL     (1.0/96.0 * 25.4)<br>
+<br>
+VkResult<br>
+radv_<wbr>GetPhysicalDeviceDisplayProper<wbr>tiesKHR(VkPhysicalDevice physical_device,<br>
+                                           uint32_t *property_count,<br>
+                                           VkDisplayPropertiesKHR *properties)<br>
+{<br>
+       RADV_FROM_HANDLE(radv_<wbr>physical_device, pdevice, physical_device);<br>
+<br>
+       return wsi_display_get_physical_<wbr>device_display_properties(<br>
+               physical_device,<br>
+               &pdevice->wsi_device,<br>
+               property_count,<br>
+               properties);<br>
+}<br>
+<br>
+VkResult<br>
+radv_<wbr>GetPhysicalDeviceDisplayPlaneP<wbr>ropertiesKHR(<br>
+       VkPhysicalDevice physical_device,<br>
+       uint32_t *property_count,<br>
+       VkDisplayPlanePropertiesKHR *properties)<br>
+{<br>
+       RADV_FROM_HANDLE(radv_<wbr>physical_device, pdevice, physical_device);<br>
+<br>
+       return wsi_display_get_physical_<wbr>device_display_plane_<wbr>properties(<br>
+               physical_device,<br>
+               &pdevice->wsi_device,<br>
+               property_count,<br>
+               properties);<br>
+}<br>
+<br>
+VkResult<br>
+radv_<wbr>GetDisplayPlaneSupportedDispla<wbr>ysKHR(VkPhysicalDevice physical_device,<br>
+                                         uint32_t plane_index,<br>
+                                         uint32_t *display_count,<br>
+                                         VkDisplayKHR *displays)<br>
+{<br>
+       RADV_FROM_HANDLE(radv_<wbr>physical_device, pdevice, physical_device);<br>
+<br>
+       return wsi_display_get_display_plane_<wbr>supported_displays(<br>
+               physical_device,<br>
+               &pdevice->wsi_device,<br>
+               plane_index,<br>
+               display_count,<br>
+               displays);<br>
+}<br>
+<br>
+<br>
+VkResult<br>
+radv_<wbr>GetDisplayModePropertiesKHR(<wbr>VkPhysicalDevice physical_device,<br>
+                                 VkDisplayKHR display,<br>
+                                 uint32_t *property_count,<br>
+                                 VkDisplayModePropertiesKHR *properties)<br>
+{<br>
+       RADV_FROM_HANDLE(radv_<wbr>physical_device, pdevice, physical_device);<br>
+<br>
+       return wsi_display_get_display_mode_<wbr>properties(physical_device,<br>
+                                                      &pdevice->wsi_device,<br>
+                                                      display,<br>
+                                                      property_count,<br>
+                                                      properties);<br>
+}<br>
+<br>
+VkResult<br>
+radv_CreateDisplayModeKHR(<wbr>VkPhysicalDevice physical_device,<br>
+                          VkDisplayKHR display,<br>
+                          const VkDisplayModeCreateInfoKHR *create_info,<br>
+                          const VkAllocationCallbacks *allocator,<br>
+                          VkDisplayModeKHR *mode)<br>
+{<br>
+       return VK_ERROR_INITIALIZATION_<wbr>FAILED;<br>
+}<br>
+<br>
+<br>
+VkResult<br>
+radv_<wbr>GetDisplayPlaneCapabilitiesKHR<wbr>(VkPhysicalDevice physical_device,<br>
+                                    VkDisplayModeKHR mode_khr,<br>
+                                    uint32_t plane_index,<br>
+                                    VkDisplayPlaneCapabilitiesKHR *capabilities)<br>
+{<br>
+       RADV_FROM_HANDLE(radv_<wbr>physical_device, pdevice, physical_device);<br>
+<br>
+       return wsi_get_display_plane_<wbr>capabilities(physical_device,<br>
+                                                 &pdevice->wsi_device,<br>
+                                                 mode_khr,<br>
+                                                 plane_index,<br>
+                                                 capabilities);<br>
+}<br>
+<br>
+VkResult<br>
+radv_<wbr>CreateDisplayPlaneSurfaceKHR(<br>
+       VkInstance _instance,<br>
+       const VkDisplaySurfaceCreateInfoKHR *create_info,<br>
+       const VkAllocationCallbacks *allocator,<br>
+       VkSurfaceKHR *surface)<br>
+{<br>
+       RADV_FROM_HANDLE(radv_<wbr>instance, instance, _instance);<br>
+       const VkAllocationCallbacks *alloc;<br>
+<br>
+       if (allocator)<br>
+               alloc = allocator;<br>
+       else<br>
+               alloc = &instance->alloc;<br>
+<br>
+       return wsi_create_display_surface(_<wbr>instance, alloc,<br>
+                                         create_info, surface);<br>
+}<br>
<span class="HOEnZb"><font color="#888888">-- <br>
2.17.1<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div>