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

Author: Mike Blumenkrantz <[email protected]>
Date:   Fri Apr 29 11:52:52 2022 -0400

zink: create images with modifiers any time there is an import handle

there's no way to pass in a plane offset otherwise, so this is necessary
in order to handle yuv imports

Reviewed-by: Dave Airlie <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16252>

---

 src/gallium/drivers/zink/zink_resource.c | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_resource.c 
b/src/gallium/drivers/zink/zink_resource.c
index 79338cf8a66..92ccfa4c9a0 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -552,6 +552,16 @@ resource_object_create(struct zink_screen *screen, const 
struct pipe_resource *t
       obj->transfer_dst = true;
    } else {
       bool winsys_modifier = (export_types & 
VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT) && whandle && whandle->modifier 
!= DRM_FORMAT_MOD_INVALID;
+      uint64_t mods[10];
+      bool try_modifiers = false;
+      if ((export_types & VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT) && 
whandle && whandle->modifier == DRM_FORMAT_MOD_INVALID) {
+         modifiers = mods;
+         modifiers_count = 
screen->modifier_props[templ->format].drmFormatModifierCount;
+         for (unsigned j = 0; j < modifiers_count; j++)
+            mods[j] = 
screen->modifier_props[templ->format].pDrmFormatModifierProperties[j].drmFormatModifier;
+         if (modifiers_count > 1)
+            try_modifiers = true;
+      }
       const uint64_t *ici_modifiers = winsys_modifier ? &whandle->modifier : 
modifiers;
       unsigned ici_modifier_count = winsys_modifier ? 1 : modifiers_count;
       bool success = false;
@@ -573,8 +583,8 @@ resource_object_create(struct zink_screen *screen, const 
struct pipe_resource *t
          ici.pNext = &emici;
 
          assert(ici.tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT || mod 
!= DRM_FORMAT_MOD_INVALID);
-         if (winsys_modifier && ici.tiling == 
VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
-            assert(mod == whandle->modifier);
+         if (whandle && ici.tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) 
{
+            assert(mod == whandle->modifier || !winsys_modifier);
             idfmeci.sType = 
VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT;
             idfmeci.pNext = ici.pNext;
             idfmeci.drmFormatModifier = mod;
@@ -667,6 +677,18 @@ resource_object_create(struct zink_screen *screen, const 
struct pipe_resource *t
       }
 
       VkResult result = VKSCR(CreateImage)(screen->dev, &ici, NULL, 
&obj->image);
+      if (result != VK_SUCCESS) {
+         if (try_modifiers) {
+            for (unsigned i = 0; i < modifiers_count; i++) {
+               if (modifiers[i] == mod)
+                  continue;
+               idfmeci.drmFormatModifier = modifiers[i];
+               result = VKSCR(CreateImage)(screen->dev, &ici, NULL, 
&obj->image);
+               if (result == VK_SUCCESS)
+                  break;
+            }
+         }
+      }
       if (result != VK_SUCCESS) {
          mesa_loge("ZINK: vkCreateImage failed");
          goto fail1;

Reply via email to