diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index c058631e6a5..3921e3a9b8f 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -848,6 +848,14 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t return obj; } else if (templ->target == PIPE_BUFFER) { VkBufferCreateInfo bci = create_bci(screen, templ, templ->bind); + VkExternalMemoryBufferCreateInfo embci; + + if (user_mem) { + embci.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO; + embci.pNext = bci.pNext; + embci.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT; + bci.pNext = &embci; + } if (VKSCR(CreateBuffer)(screen->dev, &bci, NULL, &obj->buffer) != VK_SUCCESS) { mesa_loge("ZINK: vkCreateBuffer failed"); @@ -984,6 +992,11 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t } else if (ici.tiling == VK_IMAGE_TILING_OPTIMAL) { shared = false; } + } else if (user_mem) { + emici.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO; + emici.pNext = ici.pNext; + emici.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT; + ici.pNext = &emici; } if (linear)