From 6ef16905ce32ff9c381eddc4ed2a65b504d382c1 Mon Sep 17 00:00:00 2001 From: Stephen Saunders Date: Wed, 27 Jul 2022 13:43:52 -0400 Subject: [PATCH] Headless examples: update validation layer name & implement macOS VK_KHR_portability_subset / VK_KHR_portability_enumeration --- examples/computeheadless/computeheadless.cpp | 62 ++++++++++++++++++-- examples/renderheadless/renderheadless.cpp | 62 ++++++++++++++++++-- 2 files changed, 114 insertions(+), 10 deletions(-) diff --git a/examples/computeheadless/computeheadless.cpp b/examples/computeheadless/computeheadless.cpp index 5095222d..d11a2235 100644 --- a/examples/computeheadless/computeheadless.cpp +++ b/examples/computeheadless/computeheadless.cpp @@ -26,6 +26,9 @@ #include #include +#if defined(VK_USE_PLATFORM_MACOS_MVK) +#define VK_ENABLE_BETA_EXTENSIONS +#endif #include #include "VulkanTools.h" @@ -145,9 +148,10 @@ public: const char* validationLayers[] = { "VK_LAYER_GOOGLE_threading", "VK_LAYER_LUNARG_parameter_validation", "VK_LAYER_LUNARG_object_tracker","VK_LAYER_LUNARG_core_validation", "VK_LAYER_LUNARG_swapchain", "VK_LAYER_GOOGLE_unique_objects" }; layerCount = 6; #else - const char* validationLayers[] = { "VK_LAYER_LUNARG_standard_validation" }; + const char* validationLayers[] = { "VK_LAYER_KHRONOS_validation" }; layerCount = 1; #endif + std::vector instanceExtensions = {}; #if DEBUG // Check if layers are available uint32_t instanceLayerCount; @@ -170,14 +174,39 @@ public: } } - const char *validationExt = VK_EXT_DEBUG_REPORT_EXTENSION_NAME; if (layersAvailable) { + instanceExtensions.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); instanceCreateInfo.ppEnabledLayerNames = validationLayers; instanceCreateInfo.enabledLayerCount = layerCount; - instanceCreateInfo.enabledExtensionCount = 1; - instanceCreateInfo.ppEnabledExtensionNames = &validationExt; } #endif +#if defined(VK_USE_PLATFORM_MACOS_MVK) + // SRS - When running on macOS with MoltenVK, enable VK_KHR_get_physical_device_properties2 (required by VK_KHR_portability_subset) + instanceExtensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); +#if defined(VK_KHR_portability_enumeration) + // SRS - When running on macOS with MoltenVK and VK_KHR_portability_enumeration is defined and supported by the instance, enable the extension and the flag + uint32_t instanceExtCount = 0; + vkEnumerateInstanceExtensionProperties(nullptr, &instanceExtCount, nullptr); + if (instanceExtCount > 0) + { + std::vector extensions(instanceExtCount); + if (vkEnumerateInstanceExtensionProperties(nullptr, &instanceExtCount, &extensions.front()) == VK_SUCCESS) + { + for (VkExtensionProperties extension : extensions) + { + if (strcmp(extension.extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) == 0) + { + instanceExtensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); + instanceCreateInfo.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; + break; + } + } + } + } +#endif +#endif + instanceCreateInfo.enabledExtensionCount = (uint32_t)instanceExtensions.size(); + instanceCreateInfo.ppEnabledExtensionNames = instanceExtensions.data(); VK_CHECK_RESULT(vkCreateInstance(&instanceCreateInfo, nullptr, &instance)); #if defined(VK_USE_PLATFORM_ANDROID_KHR) @@ -233,6 +262,29 @@ public: deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; deviceCreateInfo.queueCreateInfoCount = 1; deviceCreateInfo.pQueueCreateInfos = &queueCreateInfo; + std::vector deviceExtensions = {}; +#if defined(VK_USE_PLATFORM_MACOS_MVK) && defined(VK_KHR_portability_subset) + // SRS - When running on macOS with MoltenVK and VK_KHR_portability_subset is defined and supported by the device, enable the extension + uint32_t deviceExtCount = 0; + vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &deviceExtCount, nullptr); + if (deviceExtCount > 0) + { + std::vector extensions(deviceExtCount); + if (vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &deviceExtCount, &extensions.front()) == VK_SUCCESS) + { + for (VkExtensionProperties extension : extensions) + { + if (strcmp(extension.extensionName, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME) == 0) + { + deviceExtensions.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME); + break; + } + } + } + } +#endif + deviceCreateInfo.enabledExtensionCount = (uint32_t)deviceExtensions.size(); + deviceCreateInfo.ppEnabledExtensionNames = deviceExtensions.data(); VK_CHECK_RESULT(vkCreateDevice(physicalDevice, &deviceCreateInfo, nullptr, &device)); // Get a compute queue @@ -562,4 +614,4 @@ int main() { delete(vulkanExample); return 0; } -#endif \ No newline at end of file +#endif diff --git a/examples/renderheadless/renderheadless.cpp b/examples/renderheadless/renderheadless.cpp index ba41bf8a..592d1340 100644 --- a/examples/renderheadless/renderheadless.cpp +++ b/examples/renderheadless/renderheadless.cpp @@ -30,6 +30,9 @@ #include #include +#if defined(VK_USE_PLATFORM_MACOS_MVK) +#define VK_ENABLE_BETA_EXTENSIONS +#endif #include #include "VulkanTools.h" @@ -175,9 +178,10 @@ public: const char* validationLayers[] = { "VK_LAYER_GOOGLE_threading", "VK_LAYER_LUNARG_parameter_validation", "VK_LAYER_LUNARG_object_tracker","VK_LAYER_LUNARG_core_validation", "VK_LAYER_LUNARG_swapchain", "VK_LAYER_GOOGLE_unique_objects" }; layerCount = 6; #else - const char* validationLayers[] = { "VK_LAYER_LUNARG_standard_validation" }; + const char* validationLayers[] = { "VK_LAYER_KHRONOS_validation" }; layerCount = 1; #endif + std::vector instanceExtensions = {}; #if DEBUG // Check if layers are available uint32_t instanceLayerCount; @@ -200,14 +204,39 @@ public: } } - const char *validationExt = VK_EXT_DEBUG_REPORT_EXTENSION_NAME; if (layersAvailable) { + instanceExtensions.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); instanceCreateInfo.ppEnabledLayerNames = validationLayers; instanceCreateInfo.enabledLayerCount = layerCount; - instanceCreateInfo.enabledExtensionCount = 1; - instanceCreateInfo.ppEnabledExtensionNames = &validationExt; } #endif +#if defined(VK_USE_PLATFORM_MACOS_MVK) + // SRS - When running on macOS with MoltenVK, enable VK_KHR_get_physical_device_properties2 (required by VK_KHR_portability_subset) + instanceExtensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); +#if defined(VK_KHR_portability_enumeration) + // SRS - When running on macOS with MoltenVK and VK_KHR_portability_enumeration is defined and supported by the instance, enable the extension and the flag + uint32_t instanceExtCount = 0; + vkEnumerateInstanceExtensionProperties(nullptr, &instanceExtCount, nullptr); + if (instanceExtCount > 0) + { + std::vector extensions(instanceExtCount); + if (vkEnumerateInstanceExtensionProperties(nullptr, &instanceExtCount, &extensions.front()) == VK_SUCCESS) + { + for (VkExtensionProperties extension : extensions) + { + if (strcmp(extension.extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) == 0) + { + instanceExtensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); + instanceCreateInfo.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; + break; + } + } + } + } +#endif +#endif + instanceCreateInfo.enabledExtensionCount = (uint32_t)instanceExtensions.size(); + instanceCreateInfo.ppEnabledExtensionNames = instanceExtensions.data(); VK_CHECK_RESULT(vkCreateInstance(&instanceCreateInfo, nullptr, &instance)); #if defined(VK_USE_PLATFORM_ANDROID_KHR) @@ -262,6 +291,29 @@ public: deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; deviceCreateInfo.queueCreateInfoCount = 1; deviceCreateInfo.pQueueCreateInfos = &queueCreateInfo; + std::vector deviceExtensions = {}; +#if defined(VK_USE_PLATFORM_MACOS_MVK) && defined(VK_KHR_portability_subset) + // SRS - When running on macOS with MoltenVK and VK_KHR_portability_subset is defined and supported by the device, enable the extension + uint32_t deviceExtCount = 0; + vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &deviceExtCount, nullptr); + if (deviceExtCount > 0) + { + std::vector extensions(deviceExtCount); + if (vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &deviceExtCount, &extensions.front()) == VK_SUCCESS) + { + for (VkExtensionProperties extension : extensions) + { + if (strcmp(extension.extensionName, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME) == 0) + { + deviceExtensions.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME); + break; + } + } + } + } +#endif + deviceCreateInfo.enabledExtensionCount = (uint32_t)deviceExtensions.size(); + deviceCreateInfo.ppEnabledExtensionNames = deviceExtensions.data(); VK_CHECK_RESULT(vkCreateDevice(physicalDevice, &deviceCreateInfo, nullptr, &device)); // Get a graphics queue @@ -894,4 +946,4 @@ int main() { delete(vulkanExample); return 0; } -#endif \ No newline at end of file +#endif