2525import org .lwjgl .glfw .GLFW ;
2626import org .lwjgl .glfw .GLFWVulkan ;
2727import org .lwjgl .system .MemoryStack ;
28- import org .lwjgl .util .vma .Vma ;
29- import org .lwjgl .util .vma .VmaAllocatorCreateInfo ;
30- import org .lwjgl .util .vma .VmaVulkanFunctions ;
3128import org .lwjgl .vulkan .*;
3229import org .lwjgl .vulkan .VkDeviceQueueCreateInfo .Buffer ;
3330
@@ -85,6 +82,7 @@ public static void enableDeviceExtensions(Set<String> deviceExtensions, Vk11Phys
8582 Vk11PhysicalDevice physicalDevice = null ;
8683 VkDevice device = null ;
8784 IntVMA vma = null ;
85+ Vk11ExtensionProperties extensionProperties = null ;
8886
8987 try {
9088 boolean renderdocAttached = "1" .equals (System .getenv ("ENABLE_VULKAN_RENDERDOC_CAPTURE" ));
@@ -93,15 +91,17 @@ public static void enableDeviceExtensions(Set<String> deviceExtensions, Vk11Phys
9391 instance = new Vk11Instance (debugOptions .logLevel (), useDebugLabels , validation );
9492 physicalDevice = findPhysicalDevice (instance );
9593 enableDeviceExtensions (deviceExtensions , physicalDevice ,
96- "VK_KHR_portability_subset" ,
94+ "VK_KHR_portability_subset" , // MoltenVK
9795 "VK_EXT_multi_draw" ,
9896 "VK_EXT_vertex_attribute_divisor" ,
99- "VK_KHR_shader_draw_parameters"
97+ "VK_KHR_shader_draw_parameters" ,
98+ "VK_KHR_maintenance3"
10099 );
101100 if (useDebugLabels ) {
102101 enableDeviceExtensions (deviceExtensions , physicalDevice , "VK_AMD_buffer_marker" , "VK_NV_device_diagnostic_checkpoints" );
103102 }
104- device = createVkDevice (deviceExtensions , physicalDevice );
103+ extensionProperties = new Vk11ExtensionProperties ();
104+ device = createVkDevice (deviceExtensions , physicalDevice , extensionProperties );
105105 vma = new IntVMA (device );
106106 } catch (BackendCreationException e ) {
107107 if (vma != null ) vma .close ();
@@ -112,7 +112,7 @@ public static void enableDeviceExtensions(Set<String> deviceExtensions, Vk11Phys
112112 }
113113
114114 return new GpuDevice (
115- new Vk11Device (defaultShaderSource , instance , physicalDevice , deviceExtensions , device , vma ), criticalShaderLoader
115+ new Vk11Device (defaultShaderSource , instance , physicalDevice , deviceExtensions , device , extensionProperties , vma ), criticalShaderLoader
116116 );
117117 }
118118
@@ -262,33 +262,48 @@ private static void throwForMissingRequirements(final VkPhysicalDevice vkPhysica
262262 throw new BackendCreationException ("Device missing capabilities" , mostProminentReason , missingCapabilities );
263263 }
264264
265- private static void enableExtensionFeatures (Vk11PhysicalDevice device , MemoryStack stack , VkPhysicalDeviceFeatures2 features , Collection <String > deviceExtensions ){
266- if (deviceExtensions .contains ("VK_EXT_vertex_attribute_divisor" )){
267- VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT vaf = VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT .calloc (stack ).sType$Default ();
268- features .pNext (vaf );
269- }
265+ private static void queryExtensionFeatures (Vk11PhysicalDevice device ,
266+ MemoryStack stack ,
267+ VkPhysicalDeviceFeatures2 features ,
268+ Vk11ExtensionProperties vk11ExtensionProperties ,
269+ Collection <String > deviceExtensions )
270+ {
271+ VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT vaf = VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT .calloc (stack ).sType$Default ();
272+ VkPhysicalDeviceShaderDrawParametersFeatures sdp = VkPhysicalDeviceShaderDrawParametersFeatures .calloc (stack ).sType$Default ();
273+ if (deviceExtensions .contains ("VK_EXT_vertex_attribute_divisor" )) features .pNext (vaf );
270274 // This was promoted to core only in 1.1, but we are planning on targeting 1.0
271275 // Though not all 1.0 devices have this extension, so we need to think about it a bit more...
272- if (deviceExtensions .contains ("VK_KHR_shader_draw_parameters" ) || device .vkPhysicalDeviceProperties ().apiVersion () == VK11 .VK_API_VERSION_1_1 ){
273- VkPhysicalDeviceShaderDrawParametersFeatures sdp = VkPhysicalDeviceShaderDrawParametersFeatures .calloc (stack ).sType$Default ();
274- features .pNext (sdp );
275- }
276- KHRGetPhysicalDeviceProperties2 .vkGetPhysicalDeviceFeatures2KHR (device .vkPhysicalDevice (), features );
276+ if (deviceExtensions .contains ("VK_KHR_shader_draw_parameters" ) || device .vkPhysicalDeviceProperties ().apiVersion () == VK11 .VK_API_VERSION_1_1 ) features .pNext (sdp );
277+ VK11 .vkGetPhysicalDeviceFeatures2 (device .vkPhysicalDevice (), features );
278+ vk11ExtensionProperties .setVertexAttributeDivisor (vaf .vertexAttributeInstanceRateDivisor ());
279+ vk11ExtensionProperties .setShaderDrawParameters (sdp .shaderDrawParameters ());
280+
281+ }
282+ private static void queryExtensionProperties (Vk11PhysicalDevice device ,
283+ MemoryStack stack ,
284+ VkPhysicalDeviceProperties2 properties ,
285+ Vk11ExtensionProperties vk11ExtensionProperties ,
286+ Collection <String > deviceExtensions ) {
287+ VkPhysicalDeviceMaintenance3Properties maint3 = VkPhysicalDeviceMaintenance3Properties .calloc (stack ).sType$Default ();
288+ if (deviceExtensions .contains ("VK_KHR_maintenance3" ) || device .vkPhysicalDeviceProperties ().apiVersion () >= VK11 .VK_API_VERSION_1_1 ) properties .pNext (maint3 );
289+ VK11 .vkGetPhysicalDeviceProperties2 (device .vkPhysicalDevice (), properties );
290+ ArtVK .LOGGER .info ("Max memory allocation size: {}" , maint3 .maxMemoryAllocationSize ());
291+ vk11ExtensionProperties .setMaxMemoryAllocationSize (maint3 .maxMemoryAllocationSize () > 0L ? maint3 .maxMemoryAllocationSize () : Long .MAX_VALUE );
277292 }
278293
279294 private static VkDevice createVkDevice (
280- final Collection <String > deviceExtensions , final Vk11PhysicalDevice physicalDevice
295+ final Collection <String > deviceExtensions , final Vk11PhysicalDevice physicalDevice , final Vk11ExtensionProperties extensionProperties
281296 ) throws BackendCreationException {
282297 try (MemoryStack stack = MemoryStack .stackPush ()) {
283298 VkPhysicalDeviceFeatures2 availableFeatures = physicalDevice .vkPhysicalDeviceFeatures ();
284-
285299 VkPhysicalDeviceFeatures2 deviceFeatures = VkPhysicalDeviceFeatures2 .calloc (stack ).sType$Default ();
286300 // Enable required VK10 features
287301 deviceFeatures .features ().multiDrawIndirect (availableFeatures .features ().multiDrawIndirect ());
288302 deviceFeatures .features ().fillModeNonSolid (availableFeatures .features ().fillModeNonSolid ());
289303 deviceFeatures .features ().samplerAnisotropy (availableFeatures .features ().samplerAnisotropy ());
290304
291- enableExtensionFeatures (physicalDevice , stack , deviceFeatures , deviceExtensions );
305+ queryExtensionProperties (physicalDevice , stack , physicalDevice .vkPhysicalDeviceProperties2 (), extensionProperties , deviceExtensions );
306+ queryExtensionFeatures (physicalDevice , stack , deviceFeatures , extensionProperties , deviceExtensions );
292307
293308 Int2IntMap queuesToCreate = physicalDevice .queueFamilyCreateInfoMap ();
294309 Buffer queueCreationInfo = VkDeviceQueueCreateInfo .calloc (queuesToCreate .size (), stack );
0 commit comments