zink: load vk_GetMemoryFdKHR while creating screen
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Thu, 30 Apr 2020 17:06:51 +0000 (19:06 +0200)
committerMarge Bot <eric+marge@anholt.net>
Mon, 11 May 2020 09:09:34 +0000 (09:09 +0000)
We're about to load some more extension-pointers as well, so let's
create a separate place for doing this.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4835>

src/gallium/drivers/zink/zink_resource.c
src/gallium/drivers/zink/zink_screen.c

index e8073b459880bd0638c90d7dadb960231e40cd60..5467fe487b9d16d2e7df1bf9cd1c20f240a04dbb 100644 (file)
@@ -318,11 +318,6 @@ zink_resource_get_handle(struct pipe_screen *pscreen,
    }
 
    if (whandle->type == WINSYS_HANDLE_TYPE_FD) {
-
-      if (!screen->vk_GetMemoryFdKHR)
-         screen->vk_GetMemoryFdKHR = (PFN_vkGetMemoryFdKHR)vkGetDeviceProcAddr(screen->dev, "vkGetMemoryFdKHR");
-      if (!screen->vk_GetMemoryFdKHR)
-         return false;
       fd_info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR;
       fd_info.memory = res->mem;
       fd_info.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
index 9d751d30eff94fe92e0e86eb836eb1015f8bb945..fae39c6ec1b2be88767d6f2265db21b6037a5c17 100644 (file)
@@ -704,6 +704,18 @@ zink_flush_frontbuffer(struct pipe_screen *pscreen,
       winsys->displaytarget_display(winsys, res->dt, winsys_drawable_handle, sub_box);
 }
 
+static bool
+load_device_extensions(struct zink_screen *screen)
+{
+   if (screen->have_KHR_external_memory_fd) {
+      screen->vk_GetMemoryFdKHR = (PFN_vkGetMemoryFdKHR)vkGetDeviceProcAddr(screen->dev, "vkGetMemoryFdKHR");
+      if (!screen->vk_GetMemoryFdKHR)
+         return false;
+   }
+
+   return true;
+}
+
 static struct pipe_screen *
 zink_internal_create_screen(struct sw_winsys *winsys, int fd)
 {
@@ -785,6 +797,9 @@ zink_internal_create_screen(struct sw_winsys *winsys, int fd)
    if (vkCreateDevice(screen->pdev, &dci, NULL, &screen->dev) != VK_SUCCESS)
       goto fail;
 
+   if (!load_device_extensions(screen))
+      goto fail;
+
    screen->winsys = winsys;
 
    screen->base.get_name = zink_get_name;