[Mesa-dev] [PATCH] vulkan/wsi: Only use LINEAR modifier for prime if supported.

Jason Ekstrand jason at jlekstrand.net
Sat May 5 18:07:04 UTC 2018


On Sat, May 5, 2018 at 6:34 AM, Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
wrote:

> This was setting the LINEAR modifier if neither the
> X server nor the driver supported modifiers.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106180
> Fixes: c80c08e226 "vulkan/wsi/x11: Add support for DRI3 v1.2"
> CC: 18.1 <mesa-stable at lists.freedesktop.org>
> CC: Abel Garcia Dorta <mercuriete at gmail.com>
> CC: Daniel Stone <daniels at collabora.com>
> ---
>  src/vulkan/wsi/wsi_common.c         | 3 ++-
>  src/vulkan/wsi/wsi_common_private.h | 1 +
>  src/vulkan/wsi/wsi_common_x11.c     | 3 ++-
>  3 files changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c
> index fe262b4968d..87e508ddf85 100644
> --- a/src/vulkan/wsi/wsi_common.c
> +++ b/src/vulkan/wsi/wsi_common.c
> @@ -442,6 +442,7 @@ fail:
>  VkResult
>  wsi_create_prime_image(const struct wsi_swapchain *chain,
>                         const VkSwapchainCreateInfoKHR *pCreateInfo,
> +                       bool use_modifier,
>                         struct wsi_image *image)
>  {
>     const struct wsi_device *wsi = chain->wsi;
> @@ -626,7 +627,7 @@ wsi_create_prime_image(const struct wsi_swapchain
> *chain,
>     if (result != VK_SUCCESS)
>        goto fail;
>
> -   image->drm_modifier = DRM_FORMAT_MOD_LINEAR;
> +   image->drm_modifier = use_modifier ? DRM_FORMAT_MOD_LINEAR :
> DRM_FORMAT_MOD_INVALID;
>     image->num_planes = 1;
>     image->sizes[0] = linear_size;
>     image->row_pitches[0] = linear_stride;
> diff --git a/src/vulkan/wsi/wsi_common_private.h
> b/src/vulkan/wsi/wsi_common_private.h
> index b608119b969..90941c8201b 100644
> --- a/src/vulkan/wsi/wsi_common_private.h
> +++ b/src/vulkan/wsi/wsi_common_private.h
> @@ -89,6 +89,7 @@ wsi_create_native_image(const struct wsi_swapchain
> *chain,
>  VkResult
>  wsi_create_prime_image(const struct wsi_swapchain *chain,
>                         const VkSwapchainCreateInfoKHR *pCreateInfo,
> +                       bool use_modifier,
>                         struct wsi_image *image);
>
>  void
> diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_
> x11.c
> index 3a00caddfb9..62739b99125 100644
> --- a/src/vulkan/wsi/wsi_common_x11.c
> +++ b/src/vulkan/wsi/wsi_common_x11.c
> @@ -1043,7 +1043,8 @@ x11_image_init(VkDevice device_h, struct
> x11_swapchain *chain,
>     uint32_t bpp = 32;
>
>     if (chain->base.use_prime_blit) {
> -      result = wsi_create_prime_image(&chain->base, pCreateInfo,
> &image->base);
> +      bool use_modifier = num_tranches > 0;
> +      result = wsi_create_prime_image(&chain->base, pCreateInfo,
> use_modifier, &image->base);
>

This confused me for a bit but I think I see what's going on.  You have an
X server which doesn't know about modifiers but mesa is built with modifier
support and prime is in use.  This results in the WSI code calling
dri3_pixmap_from_buffers (plural) on an X server which doesn't support it.

I'm not sure what I think about this way of solving the problem.  In my
twisted mind, DRM_FORMAT_MOD_LINEAR should always be valid even if the
modifier is ultimately ignored.  I'm going to send a counter-patch which
solves it another way but I'm not sure if my solution is better.  Daniel,
do you have any thoughts?


>     } else {
>        result = wsi_create_native_image(&chain->base, pCreateInfo,
>                                         num_tranches, num_modifiers,
> modifiers,
> --
> 2.17.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180505/cca7f845/attachment.html>


More information about the mesa-dev mailing list