Browse Source

vulkan: Update feature checks for Vulkan 1.3

rdb 1 month ago
parent
commit
46bc961f74

+ 31 - 5
panda/src/vulkandisplay/vulkanGraphicsPipe.cxx

@@ -327,11 +327,12 @@ VulkanGraphicsPipe() : _max_allocation_size(0) {
       features2.pNext = &cbc_features;
     }
 
-    VkPhysicalDeviceRobustness2FeaturesEXT ro2_features = {
-      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT,
+    VkPhysicalDeviceRobustness2FeaturesKHR ro2_features = {
+      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_KHR,
       features2.pNext,
     };
-    if (has_device_extension(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME)) {
+    if (has_device_extension(VK_KHR_ROBUSTNESS_2_EXTENSION_NAME) ||
+        has_device_extension(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME)) {
       features2.pNext = &ro2_features;
     }
 
@@ -360,6 +361,15 @@ VulkanGraphicsPipe() : _max_allocation_size(0) {
       features2.pNext = &eds2_features;
     }
 
+    VkPhysicalDeviceInlineUniformBlockFeatures iub_features = {
+      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES,
+      features2.pNext,
+    };
+    if (_gpu_properties.apiVersion >= VK_MAKE_VERSION(1, 3, 0) ||
+        has_device_extension(VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME)) {
+      features2.pNext = &iub_features;
+    }
+
     pVkGetPhysicalDeviceFeatures2(_gpu, &features2);
     _gpu_features = features2.features;
     _gpu_supports_dynamic_rendering = dr_features.dynamicRendering;
@@ -368,9 +378,15 @@ VulkanGraphicsPipe() : _max_allocation_size(0) {
     _gpu_supports_null_descriptor = ro2_features.nullDescriptor;
     _gpu_supports_vertex_attrib_divisor = div_features.vertexAttributeInstanceRateDivisor;
     _gpu_supports_vertex_attrib_zero_divisor = div_features.vertexAttributeInstanceRateZeroDivisor;
-    _gpu_supports_extended_dynamic_state = eds_features.extendedDynamicState;
-    _gpu_supports_extended_dynamic_state2 = eds2_features.extendedDynamicState2;
+    if (_gpu_properties.apiVersion >= VK_MAKE_VERSION(1, 3, 0)) {
+      _gpu_supports_extended_dynamic_state = true;
+      _gpu_supports_extended_dynamic_state2 = true;
+    } else {
+      _gpu_supports_extended_dynamic_state = eds_features.extendedDynamicState;
+      _gpu_supports_extended_dynamic_state2 = eds2_features.extendedDynamicState2;
+    }
     _gpu_supports_extended_dynamic_state2_patch_control_points = eds2_features.extendedDynamicState2PatchControlPoints;
+    _gpu_supports_inline_uniform_block = iub_features.inlineUniformBlock;
   }
   else {
     vkGetPhysicalDeviceFeatures(_gpu, &_gpu_features);
@@ -382,6 +398,7 @@ VulkanGraphicsPipe() : _max_allocation_size(0) {
     _gpu_supports_extended_dynamic_state = false;
     _gpu_supports_extended_dynamic_state2 = false;
     _gpu_supports_extended_dynamic_state2_patch_control_points = false;
+    _gpu_supports_inline_uniform_block = false;
   }
 
   // Default the maximum allocation size to the largest of the heaps.
@@ -408,6 +425,14 @@ VulkanGraphicsPipe() : _max_allocation_size(0) {
       driver_props.pNext = &maint3_props;
     }
 
+    VkPhysicalDeviceInlineUniformBlockProperties iub_props = {
+      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES,
+      props2.pNext,
+    };
+    if (_gpu_supports_inline_uniform_block) {
+      props2.pNext = &iub_props;
+    }
+
     if (_gpu_properties.apiVersion >= VK_MAKE_VERSION(1, 1, 0)) {
       PFN_vkGetPhysicalDeviceProperties2 pVkGetPhysicalDeviceProperties2 =
         (PFN_vkGetPhysicalDeviceProperties2)vkGetInstanceProcAddr(_instance, "vkGetPhysicalDeviceProperties2");
@@ -425,6 +450,7 @@ VulkanGraphicsPipe() : _max_allocation_size(0) {
     }
 
     _max_allocation_size = maint3_props.maxMemoryAllocationSize;
+    _max_inline_uniform_block_size = iub_props.maxInlineUniformBlockSize;
   }
 
   // Fill in DisplayInformation.

+ 2 - 0
panda/src/vulkandisplay/vulkanGraphicsPipe.h

@@ -82,9 +82,11 @@ public:
   bool _gpu_supports_extended_dynamic_state = false;
   bool _gpu_supports_extended_dynamic_state2 = false;
   bool _gpu_supports_extended_dynamic_state2_patch_control_points = false;
+  bool _gpu_supports_inline_uniform_block = false;
   VkPhysicalDeviceMemoryProperties _memory_properties;
   pvector<VkQueueFamilyProperties> _queue_families;
   VkDeviceSize _max_allocation_size;
+  uint32_t _max_inline_uniform_block_size = 0;
 
 private:
   PFN_vkSetDebugUtilsObjectNameEXT _vkSetDebugUtilsObjectName;

+ 32 - 13
panda/src/vulkandisplay/vulkanGraphicsStateGuardian.cxx

@@ -183,15 +183,19 @@ reset() {
   }
 
   bool supports_null_descriptor = false;
-  VkPhysicalDeviceRobustness2FeaturesEXT ro2_features = {
-    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT,
+  VkPhysicalDeviceRobustness2FeaturesKHR ro2_features = {
+    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_KHR,
     enabled_features.pNext,
   };
   if (pipe->_gpu_supports_null_descriptor) {
     ro2_features.nullDescriptor = VK_TRUE;
     enabled_features.pNext = &ro2_features;
 
-    extensions.push_back(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
+    if (pipe->has_device_extension(VK_KHR_ROBUSTNESS_2_EXTENSION_NAME)) {
+      extensions.push_back(VK_KHR_ROBUSTNESS_2_EXTENSION_NAME);
+    } else {
+      extensions.push_back(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
+    }
     supports_null_descriptor = true;
   }
 
@@ -222,15 +226,25 @@ reset() {
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
     enabled_features.pNext,
   };
-  bool supports_eds_and_eds2 = pipe->_gpu_supports_extended_dynamic_state && pipe->_gpu_supports_extended_dynamic_state2;
-  if (supports_eds_and_eds2) {
-    eds_features.extendedDynamicState = VK_TRUE;
-    enabled_features.pNext = &eds_features;
 
-    extensions.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+
+  bool supports_eds_and_eds2;
+  if (pipe->_gpu_properties.apiVersion >= VK_MAKE_VERSION(1, 3, 0)) {
+    // Supported in the core without enable.
+    supports_eds_and_eds2 = true;
     _supports_extended_dynamic_state2 = true;
   } else {
-    _supports_extended_dynamic_state2 = false;
+    supports_eds_and_eds2 = pipe->_gpu_supports_extended_dynamic_state && pipe->_gpu_supports_extended_dynamic_state2;
+
+    if (supports_eds_and_eds2) {
+      eds_features.extendedDynamicState = VK_TRUE;
+      enabled_features.pNext = &eds_features;
+
+      extensions.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+      _supports_extended_dynamic_state2 = true;
+    } else {
+      _supports_extended_dynamic_state2 = false;
+    }
   }
 
   // VK_EXT_extended_dynamic_state2
@@ -330,8 +344,13 @@ reset() {
   }
 
   if (_supports_extended_dynamic_state2) {
-    _vkCmdSetPrimitiveTopologyEXT = (PFN_vkCmdSetPrimitiveTopologyEXT)vkGetDeviceProcAddr(_device, "vkCmdSetPrimitiveTopologyEXT");
-    _vkCmdSetPrimitiveRestartEnableEXT = (PFN_vkCmdSetPrimitiveRestartEnableEXT)vkGetDeviceProcAddr(_device, "vkCmdSetPrimitiveRestartEnableEXT");
+    if (pipe->_gpu_properties.apiVersion >= VK_MAKE_VERSION(1, 3, 0)) {
+      _vkCmdSetPrimitiveTopology = (PFN_vkCmdSetPrimitiveTopology)vkGetDeviceProcAddr(_device, "vkCmdSetPrimitiveTopology");
+      _vkCmdSetPrimitiveRestartEnable = (PFN_vkCmdSetPrimitiveRestartEnable)vkGetDeviceProcAddr(_device, "vkCmdSetPrimitiveRestartEnable");
+    } else {
+      _vkCmdSetPrimitiveTopology = (PFN_vkCmdSetPrimitiveTopology)vkGetDeviceProcAddr(_device, "vkCmdSetPrimitiveTopologyEXT");
+      _vkCmdSetPrimitiveRestartEnable = (PFN_vkCmdSetPrimitiveRestartEnable)vkGetDeviceProcAddr(_device, "vkCmdSetPrimitiveRestartEnableEXT");
+    }
   }
   if (_supports_extended_dynamic_state2_patch_control_points) {
     _vkCmdSetPatchControlPointsEXT = (PFN_vkCmdSetPatchControlPointsEXT)vkGetDeviceProcAddr(_device, "vkCmdSetPatchControlPointsEXT");
@@ -4477,8 +4496,8 @@ do_draw_primitive_with_topology(const GeomPrimitivePipelineReader *reader,
   PStatGPUTimer timer(this, _draw_primitive_pcollector);
 
   if (_supports_extended_dynamic_state2) {
-    _vkCmdSetPrimitiveTopologyEXT(_render_cmd, topology);
-    _vkCmdSetPrimitiveRestartEnableEXT(_render_cmd, primitive_restart_enable && reader->is_indexed());
+    _vkCmdSetPrimitiveTopology(_render_cmd, topology);
+    _vkCmdSetPrimitiveRestartEnable(_render_cmd, primitive_restart_enable && reader->is_indexed());
   } else {
     VkPipeline pipeline = _current_sc->get_pipeline(this, _state_rs, _format, topology, 0, _fb_config);
     nassertr(pipeline != VK_NULL_HANDLE, false);

+ 5 - 2
panda/src/vulkandisplay/vulkanGraphicsStateGuardian.h

@@ -362,6 +362,9 @@ private:
   bool _supports_extended_dynamic_state2 = false;
   bool _supports_extended_dynamic_state2_patch_control_points = false;
 
+  // Limits.
+  uint32_t _max_inline_uniform_block_size = 0;
+
   // Function pointers.
   PFN_vkCmdBeginRendering _vkCmdBeginRendering;
   PFN_vkCmdBindIndexBuffer _vkCmdBindIndexBuffer;
@@ -372,8 +375,8 @@ private:
   PFN_vkCmdEndRendering _vkCmdEndRendering;
   PFN_vkCmdPushConstants _vkCmdPushConstants;
   PFN_vkCmdSetPatchControlPointsEXT _vkCmdSetPatchControlPointsEXT;
-  PFN_vkCmdSetPrimitiveRestartEnableEXT _vkCmdSetPrimitiveRestartEnableEXT;
-  PFN_vkCmdSetPrimitiveTopologyEXT _vkCmdSetPrimitiveTopologyEXT;
+  PFN_vkCmdSetPrimitiveRestartEnable _vkCmdSetPrimitiveRestartEnable;
+  PFN_vkCmdSetPrimitiveTopology _vkCmdSetPrimitiveTopology;
   PFN_vkUpdateDescriptorSets _vkUpdateDescriptorSets;
 
   friend class VulkanGraphicsBuffer;