Mesa (master): zink: Basic framework to check for optional instance layers and instance extensions.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Nov 3 16:39:55 UTC 2020


Module: Mesa
Branch: master
Commit: a0f889bdadb18649742b9ac8553b3d08cd82e083
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a0f889bdadb18649742b9ac8553b3d08cd82e083

Author: Duncan Hopkins <duncan.hopkins at foundry.com>
Date:   Fri Oct 30 09:35:35 2020 +0000

zink: Basic framework to check for optional instance layers and instance extensions.

Needed for later optional instance level features.
Possible layer check are:
* device groups
* MoltenVK
* Debug validation without external hooks.

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Acked-by: Hoe Hao Cheng <haochengho12907 at gmail.com>
Acked-by: Erik Faye-Lund <erik.faye-lund at collabora.com>

WIP

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

---

 src/gallium/drivers/zink/zink_screen.c | 58 +++++++++++++++++++++++++++++-----
 1 file changed, 50 insertions(+), 8 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c
index 144aa33df5a..15e7d5cb328 100644
--- a/src/gallium/drivers/zink/zink_screen.c
+++ b/src/gallium/drivers/zink/zink_screen.c
@@ -637,8 +637,53 @@ zink_destroy_screen(struct pipe_screen *pscreen)
 }
 
 static VkInstance
-create_instance()
+create_instance(struct zink_screen *screen)
 {
+   const char *layers[4] = { 0 };
+   uint32_t num_layers = 0;
+   const char *extensions[4] = { 0 };
+   uint32_t num_extensions = 0;
+
+   {
+      // Build up the extensions from the reported ones but only for the unnamed layer
+      uint32_t extension_count = 0;
+      VkResult err = vkEnumerateInstanceExtensionProperties(NULL, &extension_count, NULL);
+      if (err == VK_SUCCESS) {
+         VkExtensionProperties *extension_props = malloc(extension_count * sizeof(VkExtensionProperties));
+         if (extension_props) {
+            err = vkEnumerateInstanceExtensionProperties(NULL, &extension_count, extension_props);
+            if (err == VK_SUCCESS) {
+               for (uint32_t i = 0; i < extension_count; i++) {
+                  if (!strcmp(extension_props[i].extensionName, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+                     extensions[num_extensions++] = VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME;
+                  }
+                  if (!strcmp(extension_props[i].extensionName, VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME)) {
+                     extensions[num_extensions++] = VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME;
+                  }
+               }
+            }
+            free(extension_props);
+         }
+      }
+   }
+
+   {
+      // Build up the layers from the reported ones
+      uint32_t layer_count = 0;
+      VkResult err = vkEnumerateInstanceLayerProperties(&layer_count, NULL);
+      if (err == VK_SUCCESS) {
+         VkLayerProperties *layer_props = malloc(layer_count * sizeof(VkLayerProperties));
+         if (layer_props) {
+            err = vkEnumerateInstanceLayerProperties(&layer_count, layer_props);
+            if (err == VK_SUCCESS) {
+               for (uint32_t i = 0; i < layer_count; i++) {
+               }
+            }
+            free(layer_props);
+         }
+      }
+   }
+
    VkApplicationInfo ai = {};
    ai.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
 
@@ -651,16 +696,13 @@ create_instance()
    ai.pEngineName = "mesa zink";
    ai.apiVersion = VK_API_VERSION_1_0;
 
-   const char *extensions[] = {
-      VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
-      VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME,
-   };
-
    VkInstanceCreateInfo ici = {};
    ici.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
    ici.pApplicationInfo = &ai;
    ici.ppEnabledExtensionNames = extensions;
-   ici.enabledExtensionCount = ARRAY_SIZE(extensions);
+   ici.enabledExtensionCount = num_extensions;
+   ici.ppEnabledLayerNames = layers;
+   ici.enabledLayerCount = num_layers;
 
    VkInstance instance = VK_NULL_HANDLE;
    VkResult err = vkCreateInstance(&ici, NULL, &instance);
@@ -834,7 +876,7 @@ zink_internal_create_screen(struct sw_winsys *winsys, int fd, const struct pipe_
 
    zink_debug = debug_get_option_zink_debug();
 
-   screen->instance = create_instance();
+   screen->instance = create_instance(screen);
    screen->pdev = choose_pdev(screen->instance);
    update_queue_props(screen);
 



More information about the mesa-commit mailing list