From: Mike Blumenkrantz Date: Fri, 29 Apr 2022 15:52:52 +0000 (-0400) Subject: zink: create images with modifiers any time there is an import handle X-Git-Tag: upstream/22.3.5~9141 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d79c716331fa92457cf6fae3cab2e0b660d5fcab;p=platform%2Fupstream%2Fmesa.git 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 Part-of: --- diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index 79338cf..92ccfa4 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; @@ -668,6 +678,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; }