<div dir="ltr">Pushed<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Feb 28, 2017 at 8:30 PM, Jacob Lifshay <span dir="ltr"><<a href="mailto:programmerjake@gmail.com" target="_blank">programmerjake@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">This commit improves the message by telling them that they could probably<br>
enable DRI3.  More importantly, it includes a little heuristic to check<br>
to see if we're running on AMD or NVIDIA's proprietary X11 drivers and,<br>
if we are, doesn't emit the warning.  This way, users with both a discrete<br>
card and Intel graphics don't get the warning when they're just running<br>
on the discrete card.<br>
<br>
Bugzilla: <a href="https://bugs.freedesktop.org/show_bug.cgi?id=99715" rel="noreferrer" target="_blank">https://bugs.freedesktop.org/<wbr>show_bug.cgi?id=99715</a><br>
Co-authored-by: Jason Ekstrand <<a href="mailto:jason.ekstrand@intel.com">jason.ekstrand@intel.com</a>><br>
Reviewed-by: Kai Wasserbäch <<a href="mailto:kai@dev.carbon-project.org">kai@dev.carbon-project.org</a>><br>
</span>Tested-by: Rene Lindsay <<a href="mailto:rjklindsay@hotmail.com">rjklindsay@hotmail.com</a>><br>
<span class="">---<br>
 src/vulkan/wsi/wsi_common_x11.<wbr>c | 51 ++++++++++++++++++++++++++++++<wbr>+++--------<br>
 1 file changed, 41 insertions(+), 10 deletions(-)<br>
<br>
diff --git a/src/vulkan/wsi/wsi_common_<wbr>x11.c b/src/vulkan/wsi/wsi_common_<wbr>x11.c<br>
</span>index 64ba921..323209c 100644<br>
<div class="HOEnZb"><div class="h5">--- a/src/vulkan/wsi/wsi_common_<wbr>x11.c<br>
+++ b/src/vulkan/wsi/wsi_common_<wbr>x11.c<br>
@@ -49,6 +49,7 @@<br>
 struct wsi_x11_connection {<br>
    bool has_dri3;<br>
    bool has_present;<br>
+   bool is_proprietary_x11;<br>
 };<br>
<br>
 struct wsi_x11 {<br>
@@ -63,8 +64,8 @@ static struct wsi_x11_connection *<br>
 wsi_x11_connection_create(<wbr>const VkAllocationCallbacks *alloc,<br>
                           xcb_connection_t *conn)<br>
 {<br>
-   xcb_query_extension_cookie_t dri3_cookie, pres_cookie;<br>
-   xcb_query_extension_reply_t *dri3_reply, *pres_reply;<br>
+   xcb_query_extension_cookie_t dri3_cookie, pres_cookie, amd_cookie, nv_cookie;<br>
+   xcb_query_extension_reply_t *dri3_reply, *pres_reply, *amd_reply, *nv_reply;<br>
<br>
    struct wsi_x11_connection *wsi_conn =<br>
       vk_alloc(alloc, sizeof(*wsi_conn), 8,<br>
@@ -75,20 +76,43 @@ wsi_x11_connection_create(<wbr>const VkAllocationCallbacks *alloc,<br>
    dri3_cookie = xcb_query_extension(conn, 4, "DRI3");<br>
    pres_cookie = xcb_query_extension(conn, 7, "PRESENT");<br>
<br>
+   /* We try to be nice to users and emit a warning if they try to use a<br>
+    * Vulkan application on a system without DRI3 enabled.  However, this ends<br>
+    * up spewing the warning when a user has, for example, both Intel<br>
+    * integrated graphics and a discrete card with proprietary drivers and are<br>
+    * running on the discrete card with the proprietary DDX.  In this case, we<br>
+    * really don't want to print the warning because it just confuses users.<br>
+    * As a heuristic to detect this case, we check for a couple of proprietary<br>
+    * X11 extensions.<br>
+    */<br>
+   amd_cookie = xcb_query_extension(conn, 11, "ATIFGLRXDRI");<br>
+   nv_cookie = xcb_query_extension(conn, 10, "NV-CONTROL");<br>
+<br>
    dri3_reply = xcb_query_extension_reply(<wbr>conn, dri3_cookie, NULL);<br>
    pres_reply = xcb_query_extension_reply(<wbr>conn, pres_cookie, NULL);<br>
-   if (dri3_reply == NULL || pres_reply == NULL) {<br>
+   amd_reply = xcb_query_extension_reply(<wbr>conn, amd_cookie, NULL);<br>
+   nv_reply = xcb_query_extension_reply(<wbr>conn, nv_cookie, NULL);<br>
+   if (!dri3_reply || !pres_reply) {<br>
       free(dri3_reply);<br>
       free(pres_reply);<br>
+      free(amd_reply);<br>
+      free(nv_reply);<br>
       vk_free(alloc, wsi_conn);<br>
       return NULL;<br>
    }<br>
<br>
    wsi_conn->has_dri3 = dri3_reply->present != 0;<br>
    wsi_conn->has_present = pres_reply->present != 0;<br>
+   wsi_conn->is_proprietary_x11 = false;<br>
+   if (amd_reply && amd_reply->present)<br>
+      wsi_conn->is_proprietary_x11 = true;<br>
+   if (nv_reply && nv_reply->present)<br>
+      wsi_conn->is_proprietary_x11 = true;<br>
<br>
    free(dri3_reply);<br>
    free(pres_reply);<br>
+   free(amd_reply);<br>
+   free(nv_reply);<br>
<br>
    return wsi_conn;<br>
 }<br>
@@ -100,6 +124,18 @@ wsi_x11_connection_destroy(<wbr>const VkAllocationCallbacks *alloc,<br>
    vk_free(alloc, conn);<br>
 }<br>
<br>
+static bool<br>
+wsi_x11_check_for_dri3(struct wsi_x11_connection *wsi_conn)<br>
+{<br>
+  if (wsi_conn->has_dri3)<br>
+    return true;<br>
+  if (!wsi_conn->is_proprietary_<wbr>x11) {<br>
+    fprintf(stderr, "vulkan: No DRI3 support detected - required for presentation\n"<br>
</div></div><div class="HOEnZb"><div class="h5">+                    "Note: you can probably enable DRI3 in your Xorg config\n");<br>
+  }<br>
+  return false;<br>
+}<br>
+<br>
 static struct wsi_x11_connection *<br>
 wsi_x11_get_connection(struct wsi_device *wsi_dev,<br>
                       const VkAllocationCallbacks *alloc,<br>
@@ -264,11 +300,8 @@ VkBool32 wsi_get_physical_device_xcb_<wbr>presentation_support(<br>
    if (!wsi_conn)<br>
       return false;<br>
<br>
-   if (!wsi_conn->has_dri3) {<br>
-      fprintf(stderr, "vulkan: No DRI3 support detected - required for presentation\n");<br>
-      fprintf(stderr, "Note: Buggy applications may crash, if they do please report to vendor\n");<br>
+   if (!wsi_x11_check_for_dri3(wsi_<wbr>conn))<br>
       return false;<br>
-   }<br>
<br>
    unsigned visual_depth;<br>
    if (!connection_get_visualtype(<wbr>connection, visual_id, &visual_depth))<br>
@@ -313,9 +346,7 @@ x11_surface_get_support(<wbr>VkIcdSurfaceBase *icd_surface,<br>
    if (!wsi_conn)<br>
       return VK_ERROR_OUT_OF_HOST_MEMORY;<br>
<br>
-   if (!wsi_conn->has_dri3) {<br>
-      fprintf(stderr, "vulkan: No DRI3 support detected - required for presentation\n");<br>
-      fprintf(stderr, "Note: Buggy applications may crash, if they do please report to vendor\n");<br>
+   if (!wsi_x11_check_for_dri3(wsi_<wbr>conn)) {<br>
       *pSupported = false;<br>
       return VK_SUCCESS;<br>
    }<br>
--<br>
2.7.4<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>
</div></div></blockquote></div><br></div>