mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 05:18:08 +02:00
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 <airlied@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16252>
This commit is contained in:
parent
4eeabb59f5
commit
d79c716331
1 changed files with 24 additions and 2 deletions
|
|
@ -552,6 +552,16 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t
|
||||||
obj->transfer_dst = true;
|
obj->transfer_dst = true;
|
||||||
} else {
|
} else {
|
||||||
bool winsys_modifier = (export_types & VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT) && whandle && whandle->modifier != DRM_FORMAT_MOD_INVALID;
|
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;
|
const uint64_t *ici_modifiers = winsys_modifier ? &whandle->modifier : modifiers;
|
||||||
unsigned ici_modifier_count = winsys_modifier ? 1 : modifiers_count;
|
unsigned ici_modifier_count = winsys_modifier ? 1 : modifiers_count;
|
||||||
bool success = false;
|
bool success = false;
|
||||||
|
|
@ -573,8 +583,8 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t
|
||||||
ici.pNext = &emici;
|
ici.pNext = &emici;
|
||||||
|
|
||||||
assert(ici.tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT || mod != DRM_FORMAT_MOD_INVALID);
|
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) {
|
if (whandle && ici.tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
|
||||||
assert(mod == whandle->modifier);
|
assert(mod == whandle->modifier || !winsys_modifier);
|
||||||
idfmeci.sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT;
|
idfmeci.sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT;
|
||||||
idfmeci.pNext = ici.pNext;
|
idfmeci.pNext = ici.pNext;
|
||||||
idfmeci.drmFormatModifier = mod;
|
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);
|
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) {
|
if (result != VK_SUCCESS) {
|
||||||
mesa_loge("ZINK: vkCreateImage failed");
|
mesa_loge("ZINK: vkCreateImage failed");
|
||||||
goto fail1;
|
goto fail1;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue