Hey Jacob,
Jacob Lifshay wrote on 18.02.2017 10:40:
> This commit improves the message by telling them that they could probably
> enable DRI3 and giving a url to a Ask Ubuntu question showing how to do
> that.

wouldn't it be better to add a page to the mesa user topics section (ie. add a
file to docs and then add the link in docs/contents.html)? That way nobody is
dependant on whether AskUbuntu works, nobody gets thrown off, if they don't use
Ubuntu and might think the link won't work for them and lastly it would allow
for easy referencing of the relevant driver man pages with more details on the
DRI option, including information if/when this might be the default for a 
driver.

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

Wouldn't it be better to check for the driver name? Right now, you would have to
check for "amdgpu" and "intel" (maybe modesetting as well?). That way you don't
need to rely on the open drivers never implementing one of the proprietary
extensions (even though it seems unlikely they'd do that). Or am I missing
something here.

Cheers,
Kai


> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99715
> Co-authored-by: Jason Ekstrand <jason.ekstr...@intel.com>
> ---
>  src/vulkan/wsi/wsi_common_x11.c | 55 
> +++++++++++++++++++++++++++++++++--------
>  1 file changed, 45 insertions(+), 10 deletions(-)
> 
> diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c
> index 64ba921..ac7a972 100644
> --- a/src/vulkan/wsi/wsi_common_x11.c
> +++ b/src/vulkan/wsi/wsi_common_x11.c
> @@ -48,7 +48,9 @@
>  
>  struct wsi_x11_connection {
>     bool has_dri3;
> +   bool has_dri2;
>     bool has_present;
> +   bool is_proprietary_x11;
>  };
>  
>  struct wsi_x11 {
> @@ -63,8 +65,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, dri2_cookie, pres_cookie, 
> amd_cookie, nv_cookie;
> +   xcb_query_extension_reply_t *dri3_reply, *dri2_reply, *pres_reply, 
> *amd_reply, *nv_reply;
>  
>     struct wsi_x11_connection *wsi_conn =
>        vk_alloc(alloc, sizeof(*wsi_conn), 8,
> @@ -73,22 +75,46 @@ wsi_x11_connection_create(const VkAllocationCallbacks 
> *alloc,
>        return NULL;
>  
>     dri3_cookie = xcb_query_extension(conn, 4, "DRI3");
> +   dri2_cookie = xcb_query_extension(conn, 4, "DRI2");
>     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 driers 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);
> +   dri2_reply = xcb_query_extension_reply(conn, dri2_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 || !dri2_reply || !pres_reply || !amd_reply || !nv_reply) 
> {
>        free(dri3_reply);
> +      free(dri2_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_dri2 = dri2_reply->present != 0;
>     wsi_conn->has_present = pres_reply->present != 0;
> +   wsi_conn->is_proprietary_x11 = amd_reply->present || nv_reply->present;
>  
>     free(dri3_reply);
> +   free(dri2_reply);
>     free(pres_reply);
> +   free(amd_reply);
> +   free(nv_reply);
>  
>     return wsi_conn;
>  }
> @@ -100,6 +126,20 @@ 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");
> +    if (wsi_conn->has_dri2)
> +      fprintf(stderr, "Note: DRI2 support detected, you can probably enable 
> DRI3 in your Xorg config;\n"
> +                      "      see 
> http://askubuntu.com/questions/817226/how-to-enable-dri3-on-ubuntu-16-04\n";);
> +  }
> +  return false;
> +}
> +
>  static struct wsi_x11_connection *
>  wsi_x11_get_connection(struct wsi_device *wsi_dev,
>                      const VkAllocationCallbacks *alloc,
> @@ -264,11 +304,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;
> -   }
>  
>     unsigned visual_depth;
>     if (!connection_get_visualtype(connection, visual_id, &visual_depth))
> @@ -313,9 +350,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;
>     }
> 

-- 

Kai Wasserbäch (Kai Wasserbaech)

E-Mail: k...@dev.carbon-project.org

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to