Mesa (main): zink: implement support for non-planar DRM modifiers

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jul 13 00:32:41 UTC 2021


Module: Mesa
Branch: main
Commit: 8eb91e372b7bfca7cba8c6f7e362926dd77b2652
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=8eb91e372b7bfca7cba8c6f7e362926dd77b2652

Author: Erik Faye-Lund <erik.faye-lund at collabora.com>
Date:   Mon Oct 19 14:17:27 2020 +0200

zink: implement support for non-planar DRM modifiers

Planar DRM modifiers are a bit more tricky, so let's kick that ball down
the road. For now, this should help a bit.

Acked-by: Dave Airlie <airlied at redhat.com>
Reviewed-by: Emil Velikov <emil.l.velikov at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10782>

---

 src/gallium/drivers/zink/zink_resource.c | 48 +++++++++++++++++++++++++++++---
 1 file changed, 44 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c
index 90920d8b66a..1d65969ee2d 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -439,19 +439,43 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t
    } else {
       VkImageCreateInfo ici = create_ici(screen, templ, templ->bind);
       VkExternalMemoryImageCreateInfo emici = {0};
+      VkImageDrmFormatModifierExplicitCreateInfoEXT idfmeci = {0};
 
       if (templ->bind & PIPE_BIND_SHARED) {
          emici.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO;
          emici.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
          ici.pNext = &emici;
-
+#ifdef ZINK_USE_DMABUF
+         if (whandle && whandle->modifier != DRM_FORMAT_MOD_INVALID) {
+            idfmeci.sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT;
+            idfmeci.pNext = ici.pNext;
+            idfmeci.drmFormatModifier = whandle->modifier;
+
+            /* TODO: store these values from other planes in their
+             * respective zink_resource, and walk the next-pointers to
+             * build up the planar array here instead.
+             */
+            assert(util_format_get_num_planes(templ->format) == 1);
+            idfmeci.drmFormatModifierPlaneCount = 1;
+            VkSubresourceLayout plane_layout = {
+               .offset = whandle->offset,
+               .size = 0,
+               .rowPitch = whandle->stride,
+               .arrayPitch = 0,
+               .depthPitch = 0,
+            };
+            idfmeci.pPlaneLayouts = &plane_layout;
+
+            ici.pNext = &idfmeci;
+            ici.tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT;
+         } else
+#endif
          if (ici.tiling == VK_IMAGE_TILING_OPTIMAL) {
             // TODO: remove for wsi
             ici.pNext = NULL;
             scanout = false;
             shared = false;
          }
-
       }
 
       if (optimal_tiling)
@@ -699,7 +723,17 @@ zink_resource_get_handle(struct pipe_screen *pscreen,
       if (result != VK_SUCCESS)
          return false;
       whandle->handle = fd;
-      whandle->modifier = DRM_FORMAT_MOD_INVALID;
+      if (screen->info.have_EXT_image_drm_format_modifier) {
+         VkImageDrmFormatModifierPropertiesEXT props = {
+            .sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT,
+         };
+         screen->vk.GetImageDrmFormatModifierPropertiesEXT(screen->dev,
+                                                           res->obj->image,
+                                                           &props);
+         whandle->modifier = props.drmFormatModifier;
+      } else
+         whandle->modifier = DRM_FORMAT_MOD_INVALID;
+
 #else
       return false;
 #endif
@@ -714,7 +748,13 @@ zink_resource_from_handle(struct pipe_screen *pscreen,
                  unsigned usage)
 {
 #ifdef ZINK_USE_DMABUF
-   if (whandle->modifier != DRM_FORMAT_MOD_INVALID)
+   if (whandle->modifier != DRM_FORMAT_MOD_INVALID &&
+       !zink_screen(pscreen)->info.have_EXT_image_drm_format_modifier)
+      return NULL;
+
+   /* ignore any AUX planes, as well as planar formats */
+   if (templ->format == PIPE_FORMAT_NONE ||
+       util_format_get_num_planes(templ->format) != 1)
       return NULL;
 
    return resource_create(pscreen, templ, whandle, usage);



More information about the mesa-commit mailing list