[Mesa-dev] [PATCH mesa 3/6] vulkan/wsi/display: pass the plane's modifiers to the image

andrey simiklit asimiklit.work at gmail.com
Thu Sep 27 08:52:18 UTC 2018


Hi,

Please find my comment below:

Regards,
Andrii.

On Wed, Sep 26, 2018 at 6:39 PM Eric Engestrom <eric.engestrom at intel.com>
wrote:

> Signed-off-by: Eric Engestrom <eric.engestrom at intel.com>
> ---
>  src/vulkan/wsi/wsi_common_display.c | 95 ++++++++++++++++++++++++++++-
>  1 file changed, 94 insertions(+), 1 deletion(-)
>
> diff --git a/src/vulkan/wsi/wsi_common_display.c
> b/src/vulkan/wsi/wsi_common_display.c
> index 6c9160a445c8f25a8ad5..2a30b1139f06cbb56769 100644
> --- a/src/vulkan/wsi/wsi_common_display.c
> +++ b/src/vulkan/wsi/wsi_common_display.c
> @@ -958,6 +958,87 @@ wsi_display_destroy_buffer(struct wsi_display *wsi,
>                     &((struct drm_mode_destroy_dumb) { .handle = buffer
> }));
>  }
>
> +static uint64_t*
> +wsi_get_modifiers_for_format(const struct wsi_display * const wsi,
> +                             const uint32_t plane_id,
> +                             const uint32_t drm_format,
> +                             uint32_t * const modifiers_count)
> +{
> +   /* Get the properties of the plane */
> +   drmModeObjectProperties *props =
> +      drmModeObjectGetProperties(wsi->fd, plane_id,
> +                                 DRM_MODE_OBJECT_PLANE);
> +   if (!props)
> +      return NULL;
> +
> +   /* Find the blob the contains the formats and their modifiers */
> +   uint32_t blob_id = 0;
> +   for (size_t i = 0; i< props->count_props; i++) {
> +      const drmModePropertyPtr prop =
> +         drmModeGetProperty(wsi->fd, props->props[i]);
> +
> +      if (!strcmp(prop->name, "IN_FORMATS")) {
> +         blob_id = props->prop_values[i];
> +         drmModeFreeProperty(prop);
> +         break;
> +      }
> +
> +      drmModeFreeProperty(prop);
> +   }
> +
> +   /* Property not found, which means old kernel, so definitely no
> +    * modifiers support */
> +   if (blob_id == 0)
> +      return NULL;
> +
> +   /* Grab the IN_FORMATS blob */
> +   drmModePropertyBlobRes *blob = drmModeGetPropertyBlob(wsi->fd,
> blob_id);
> +   if (!blob)
> +      return NULL;
> +
> +   /* Get the formats and modifiers out of the blob */
> +   struct drm_format_modifier_blob *fmt_mod_blob = blob->data;
> +   uint32_t *blob_formats = (uint32_t*)((char*)fmt_mod_blob +
> +                                        fmt_mod_blob->formats_offset);
> +   struct drm_format_modifier *blob_modifiers =
> +      (struct drm_format_modifier *)((char*)fmt_mod_blob +
> +                                     fmt_mod_blob->modifiers_offset);
> +
> +   /* Find the format we care about in the list */
> +   size_t format_index = 0;
> +   for (size_t i = 0; i < fmt_mod_blob->count_formats; i++) {
> +      if (blob_formats[i] == drm_format) {
> +         format_index = i;
> +         break;
> +      }
> +   }
> +
> +   /* Get the list of modifiers supported by that format */
> +   uint32_t count_modifiers = 0;
> +   uint64_t *modifiers = NULL;
> +   for (size_t i = 0; i < fmt_mod_blob->count_modifiers; i++) {
> +      struct drm_format_modifier *mod = &blob_modifiers[i];
> +
> +      if ((format_index < mod->offset) || (format_index > mod->offset +
> 63))
> +         continue;
> +      if (!(mod->formats & (1 << (format_index - mod->offset))))
>

Would it be better to use '1ull << ... ' here?
The 'formats' filed is defined as '__u64 formats'.

+         continue;
> +
> +      modifiers = realloc(modifiers,
> +                          (count_modifiers + 1) *
> +                          sizeof(modifiers[0]));
> +      assert(modifiers);
> +      modifiers[count_modifiers++] = mod->modifier;
> +   }
> +
> +   drmModeFreePropertyBlob(blob);
> +
> +   drmModeFreeObjectProperties(props);
> +
> +   *modifiers_count = count_modifiers;
> +   return modifiers;
> +}
> +
>  static VkResult
>  wsi_display_image_init(VkDevice device_h,
>                         struct wsi_swapchain *drv_chain,
> @@ -969,6 +1050,10 @@ wsi_display_image_init(VkDevice device_h,
>        (struct wsi_display_swapchain *) drv_chain;
>     struct wsi_display *wsi = chain->wsi;
>     uint32_t drm_format = 0;
> +   VkIcdSurfaceDisplay *surface = chain->surface;
> +   wsi_display_mode *display_mode =
> +      wsi_display_mode_from_handle(surface->displayMode);
> +   wsi_display_connector *connector = display_mode->connector;
>
>     for (unsigned i = 0; i < ARRAY_SIZE(available_surface_formats); i++) {
>        if (create_info->imageFormat ==
> available_surface_formats[i].format) {
> @@ -981,9 +1066,17 @@ wsi_display_image_init(VkDevice device_h,
>     if (drm_format == 0)
>        return VK_ERROR_DEVICE_LOST;
>
> +   uint32_t modifiers_count = 0;
> +   uint64_t *modifiers = wsi_get_modifiers_for_format(wsi,
> connector->plane_id, drm_format,
> +                                                      &modifiers_count);
> +   assume(!modifiers || modifiers_count > 0);
> +
>     VkResult result = wsi_create_native_image(&chain->base, create_info,
> -                                             0, NULL, NULL,
> +                                             !!modifiers_count,
> +                                             &modifiers_count,
> +                                             (const uint64_t * const
> *)&modifiers,
>                                               &image->base);
> +   free(modifiers);
>     if (result != VK_SUCCESS)
>        return result;
>
> --
> Cheers,
>   Eric
>
> _______________________________________________
> 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/20180927/7550da36/attachment-0001.html>


More information about the mesa-dev mailing list