zink: implement resource_from_handle

Acked-by: Jordan Justen <jordan.l.justen@intel.com>
This commit is contained in:
Erik Faye-Lund 2019-07-24 17:58:54 +02:00
parent 65fbb1836a
commit a7fbc8bc7f

View file

@ -84,8 +84,10 @@ aspect_from_format(enum pipe_format fmt)
}
static struct pipe_resource *
zink_resource_create(struct pipe_screen *pscreen,
const struct pipe_resource *templ)
resource_create(struct pipe_screen *pscreen,
const struct pipe_resource *templ,
struct winsys_handle *whandle,
unsigned external_usage)
{
struct zink_screen *screen = zink_screen(pscreen);
struct zink_resource *res = CALLOC_STRUCT(zink_resource);
@ -241,6 +243,20 @@ zink_resource_create(struct pipe_screen *pscreen,
mai.pNext = &emai;
}
VkImportMemoryFdInfoKHR imfi = {
VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR,
NULL,
};
if (whandle && whandle->type == WINSYS_HANDLE_TYPE_FD) {
imfi.sType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
imfi.pNext = NULL;
imfi.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
imfi.fd = whandle->handle;
emai.pNext = &imfi;
}
if (vkAllocateMemory(screen->dev, &mai, NULL, &res->mem) != VK_SUCCESS)
goto fail;
@ -278,6 +294,13 @@ fail:
return NULL;
}
static struct pipe_resource *
zink_resource_create(struct pipe_screen *pscreen,
const struct pipe_resource *templ)
{
return resource_create(pscreen, templ, NULL, 0);
}
static bool
zink_resource_get_handle(struct pipe_screen *pscreen,
struct pipe_context *context,
@ -320,11 +343,11 @@ zink_resource_get_handle(struct pipe_screen *pscreen,
static struct pipe_resource *
zink_resource_from_handle(struct pipe_screen *pscreen,
const struct pipe_resource *templat,
const struct pipe_resource *templ,
struct winsys_handle *whandle,
unsigned usage)
{
return NULL;
return resource_create(pscreen, templ, whandle, usage);
}
void