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;
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;
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;
}