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