<div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Hi,</div><div><br></div><div>Please find my comment below:</div><div><br></div><div>Regards,</div><div>Andrii.<br></div><div><br><div class="gmail_quote"><div dir="ltr">On Wed, Sep 26, 2018 at 6:39 PM Eric Engestrom <<a href="mailto:eric.engestrom@intel.com">eric.engestrom@intel.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Signed-off-by: Eric Engestrom <<a href="mailto:eric.engestrom@intel.com" target="_blank">eric.engestrom@intel.com</a>><br>
---<br>
 src/vulkan/wsi/wsi_common_display.c | 95 ++++++++++++++++++++++++++++-<br>
 1 file changed, 94 insertions(+), 1 deletion(-)<br>
<br>
diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c<br>
index 6c9160a445c8f25a8ad5..2a30b1139f06cbb56769 100644<br>
--- a/src/vulkan/wsi/wsi_common_display.c<br>
+++ b/src/vulkan/wsi/wsi_common_display.c<br>
@@ -958,6 +958,87 @@ wsi_display_destroy_buffer(struct wsi_display *wsi,<br>
                    &((struct drm_mode_destroy_dumb) { .handle = buffer }));<br>
 }<br>
<br>
+static uint64_t*<br>
+wsi_get_modifiers_for_format(const struct wsi_display * const wsi,<br>
+                             const uint32_t plane_id,<br>
+                             const uint32_t drm_format,<br>
+                             uint32_t * const modifiers_count)<br>
+{<br>
+   /* Get the properties of the plane */<br>
+   drmModeObjectProperties *props =<br>
+      drmModeObjectGetProperties(wsi->fd, plane_id,<br>
+                                 DRM_MODE_OBJECT_PLANE);<br>
+   if (!props)<br>
+      return NULL;<br>
+<br>
+   /* Find the blob the contains the formats and their modifiers */<br>
+   uint32_t blob_id = 0;<br>
+   for (size_t i = 0; i< props->count_props; i++) {<br>
+      const drmModePropertyPtr prop =<br>
+         drmModeGetProperty(wsi->fd, props->props[i]);<br>
+<br>
+      if (!strcmp(prop->name, "IN_FORMATS")) {<br>
+         blob_id = props->prop_values[i];<br>
+         drmModeFreeProperty(prop);<br>
+         break;<br>
+      }<br>
+<br>
+      drmModeFreeProperty(prop);<br>
+   }<br>
+<br>
+   /* Property not found, which means old kernel, so definitely no<br>
+    * modifiers support */<br>
+   if (blob_id == 0)<br>
+      return NULL;<br>
+<br>
+   /* Grab the IN_FORMATS blob */<br>
+   drmModePropertyBlobRes *blob = drmModeGetPropertyBlob(wsi->fd, blob_id);<br>
+   if (!blob)<br>
+      return NULL;<br>
+<br>
+   /* Get the formats and modifiers out of the blob */<br>
+   struct drm_format_modifier_blob *fmt_mod_blob = blob->data;<br>
+   uint32_t *blob_formats = (uint32_t*)((char*)fmt_mod_blob +<br>
+                                        fmt_mod_blob->formats_offset);<br>
+   struct drm_format_modifier *blob_modifiers =<br>
+      (struct drm_format_modifier *)((char*)fmt_mod_blob +<br>
+                                     fmt_mod_blob->modifiers_offset);<br>
+<br>
+   /* Find the format we care about in the list */<br>
+   size_t format_index = 0;<br>
+   for (size_t i = 0; i < fmt_mod_blob->count_formats; i++) {<br>
+      if (blob_formats[i] == drm_format) {<br>
+         format_index = i;<br>
+         break;<br>
+      }<br>
+   }<br>
+<br>
+   /* Get the list of modifiers supported by that format */<br>
+   uint32_t count_modifiers = 0;<br>
+   uint64_t *modifiers = NULL;<br>
+   for (size_t i = 0; i < fmt_mod_blob->count_modifiers; i++) {<br>
+      struct drm_format_modifier *mod = &blob_modifiers[i];<br>
+<br>
+      if ((format_index < mod->offset) || (format_index > mod->offset + 63))<br>
+         continue;<br>
+      if (!(mod->formats & (1 << (format_index - mod->offset))))<br></blockquote><div><br></div><div>Would it be better to use '1ull << ... ' here? <br></div><div>The 'formats' filed is defined as '__u64 formats'.<br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+         continue;<br>
+<br>
+      modifiers = realloc(modifiers,<br>
+                          (count_modifiers + 1) *<br>
+                          sizeof(modifiers[0]));<br>
+      assert(modifiers);<br>
+      modifiers[count_modifiers++] = mod->modifier;<br>
+   }<br>
+<br>
+   drmModeFreePropertyBlob(blob);<br>
+<br>
+   drmModeFreeObjectProperties(props);<br>
+<br>
+   *modifiers_count = count_modifiers;<br>
+   return modifiers;<br>
+}<br>
+<br>
 static VkResult<br>
 wsi_display_image_init(VkDevice device_h,<br>
                        struct wsi_swapchain *drv_chain,<br>
@@ -969,6 +1050,10 @@ wsi_display_image_init(VkDevice device_h,<br>
       (struct wsi_display_swapchain *) drv_chain;<br>
    struct wsi_display *wsi = chain->wsi;<br>
    uint32_t drm_format = 0;<br>
+   VkIcdSurfaceDisplay *surface = chain->surface;<br>
+   wsi_display_mode *display_mode =<br>
+      wsi_display_mode_from_handle(surface->displayMode);<br>
+   wsi_display_connector *connector = display_mode->connector;<br>
<br>
    for (unsigned i = 0; i < ARRAY_SIZE(available_surface_formats); i++) {<br>
       if (create_info->imageFormat == available_surface_formats[i].format) {<br>
@@ -981,9 +1066,17 @@ wsi_display_image_init(VkDevice device_h,<br>
    if (drm_format == 0)<br>
       return VK_ERROR_DEVICE_LOST;<br>
<br>
+   uint32_t modifiers_count = 0;<br>
+   uint64_t *modifiers = wsi_get_modifiers_for_format(wsi, connector->plane_id, drm_format,<br>
+                                                      &modifiers_count);<br>
+   assume(!modifiers || modifiers_count > 0);<br>
+<br>
    VkResult result = wsi_create_native_image(&chain->base, create_info,<br>
-                                             0, NULL, NULL,<br>
+                                             !!modifiers_count,<br>
+                                             &modifiers_count,<br>
+                                             (const uint64_t * const *)&modifiers,<br>
                                              &image->base);<br>
+   free(modifiers);<br>
    if (result != VK_SUCCESS)<br>
       return result;<br>
<br>
-- <br>
Cheers,<br>
  Eric<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">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/mailman/listinfo/mesa-dev</a><br>
</blockquote></div></div></div></div></div>