diff options
author | Jacob Lifshay <programmerjake@gmail.com> | 2017-02-28 20:30:57 -0800 |
---|---|---|
committer | Jason Ekstrand <jason.ekstrand@intel.com> | 2017-03-01 19:11:47 -0800 |
commit | 3d8feb38e8fdbc05b591164cb934b48a495adfbc (patch) | |
tree | a43f9628b8668c1eb3f277df61137f5428b50912 /src/vulkan | |
parent | 424ac809bfac60ed8482abfb7ef8c8aa88877b55 (diff) |
vulkan/wsi: Improve the DRI3 error message
This commit improves the message by telling them that they could probably
enable DRI3. More importantly, it includes a little heuristic to check
to see if we're running on AMD or NVIDIA's proprietary X11 drivers and,
if we are, doesn't emit the warning. This way, users with both a discrete
card and Intel graphics don't get the warning when they're just running
on the discrete card.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99715
Co-authored-by: Jason Ekstrand <jason.ekstrand@intel.com>
Reviewed-by: Kai Wasserbäch <kai@dev.carbon-project.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Tested-by: Rene Lindsay <rjklindsay@hotmail.com>
Acked-by: Dave Airlie <airlied@redhat.com>
Cc: "17.0" <mesa-dev@lists.freedesktop.org>
Diffstat (limited to 'src/vulkan')
-rw-r--r-- | src/vulkan/wsi/wsi_common_x11.c | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c index 5655b5475d..4afd606338 100644 --- a/src/vulkan/wsi/wsi_common_x11.c +++ b/src/vulkan/wsi/wsi_common_x11.c @@ -50,6 +50,7 @@ struct wsi_x11_connection { bool has_dri3; bool has_present; + bool is_proprietary_x11; }; struct wsi_x11 { @@ -124,8 +125,8 @@ static struct wsi_x11_connection * wsi_x11_connection_create(const VkAllocationCallbacks *alloc, xcb_connection_t *conn) { - xcb_query_extension_cookie_t dri3_cookie, pres_cookie; - xcb_query_extension_reply_t *dri3_reply, *pres_reply; + xcb_query_extension_cookie_t dri3_cookie, pres_cookie, amd_cookie, nv_cookie; + xcb_query_extension_reply_t *dri3_reply, *pres_reply, *amd_reply, *nv_reply; struct wsi_x11_connection *wsi_conn = vk_alloc(alloc, sizeof(*wsi_conn), 8, @@ -136,20 +137,43 @@ wsi_x11_connection_create(const VkAllocationCallbacks *alloc, dri3_cookie = xcb_query_extension(conn, 4, "DRI3"); pres_cookie = xcb_query_extension(conn, 7, "PRESENT"); + /* We try to be nice to users and emit a warning if they try to use a + * Vulkan application on a system without DRI3 enabled. However, this ends + * up spewing the warning when a user has, for example, both Intel + * integrated graphics and a discrete card with proprietary drivers and are + * running on the discrete card with the proprietary DDX. In this case, we + * really don't want to print the warning because it just confuses users. + * As a heuristic to detect this case, we check for a couple of proprietary + * X11 extensions. + */ + amd_cookie = xcb_query_extension(conn, 11, "ATIFGLRXDRI"); + nv_cookie = xcb_query_extension(conn, 10, "NV-CONTROL"); + dri3_reply = xcb_query_extension_reply(conn, dri3_cookie, NULL); pres_reply = xcb_query_extension_reply(conn, pres_cookie, NULL); - if (dri3_reply == NULL || pres_reply == NULL) { + amd_reply = xcb_query_extension_reply(conn, amd_cookie, NULL); + nv_reply = xcb_query_extension_reply(conn, nv_cookie, NULL); + if (!dri3_reply || !pres_reply) { free(dri3_reply); free(pres_reply); + free(amd_reply); + free(nv_reply); vk_free(alloc, wsi_conn); return NULL; } wsi_conn->has_dri3 = dri3_reply->present != 0; wsi_conn->has_present = pres_reply->present != 0; + wsi_conn->is_proprietary_x11 = false; + if (amd_reply && amd_reply->present) + wsi_conn->is_proprietary_x11 = true; + if (nv_reply && nv_reply->present) + wsi_conn->is_proprietary_x11 = true; free(dri3_reply); free(pres_reply); + free(amd_reply); + free(nv_reply); return wsi_conn; } @@ -161,6 +185,18 @@ wsi_x11_connection_destroy(const VkAllocationCallbacks *alloc, vk_free(alloc, conn); } +static bool +wsi_x11_check_for_dri3(struct wsi_x11_connection *wsi_conn) +{ + if (wsi_conn->has_dri3) + return true; + if (!wsi_conn->is_proprietary_x11) { + fprintf(stderr, "vulkan: No DRI3 support detected - required for presentation\n" + "Note: you can probably enable DRI3 in your Xorg config\n"); + } + return false; +} + static struct wsi_x11_connection * wsi_x11_get_connection(struct wsi_device *wsi_dev, const VkAllocationCallbacks *alloc, @@ -327,11 +363,8 @@ VkBool32 wsi_get_physical_device_xcb_presentation_support( if (!wsi_conn) return false; - if (!wsi_conn->has_dri3) { - fprintf(stderr, "vulkan: No DRI3 support detected - required for presentation\n"); - fprintf(stderr, "Note: Buggy applications may crash, if they do please report to vendor\n"); + if (!wsi_x11_check_for_dri3(wsi_conn)) return false; - } if (!can_handle_different_gpu) if (!wsi_x11_check_dri3_compatible(connection, fd)) @@ -382,9 +415,7 @@ x11_surface_get_support(VkIcdSurfaceBase *icd_surface, if (!wsi_conn) return VK_ERROR_OUT_OF_HOST_MEMORY; - if (!wsi_conn->has_dri3) { - fprintf(stderr, "vulkan: No DRI3 support detected - required for presentation\n"); - fprintf(stderr, "Note: Buggy applications may crash, if they do please report to vendor\n"); + if (!wsi_x11_check_for_dri3(wsi_conn)) { *pSupported = false; return VK_SUCCESS; } |