<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>