diff --git a/src/panfrost/vulkan/panvk_device.c b/src/panfrost/vulkan/panvk_device.c
index 18fa11444e74308c78fd7495cbf321ae88d516d3..ee4c78bbc87cc338a7cf4a158a38f2040ac28916 100644
--- a/src/panfrost/vulkan/panvk_device.c
+++ b/src/panfrost/vulkan/panvk_device.c
@@ -418,11 +418,98 @@ panvk_physical_device_try_create(struct vk_instance *vk_instance,
    return VK_SUCCESS;
 }
 
+void
+vk_helper_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
+                                     VkPhysicalDeviceFeatures2 *pFeatures,
+                                     struct vk_features *features)
+{
+   struct VkPhysicalDeviceVulkan11Features core_1_1 = features->core11;
+   struct VkPhysicalDeviceVulkan11Features core_1_2 = features->core12;
+   struct VkPhysicalDeviceVulkan11Features core_1_3 = features->core13;
+
+   core_1_1.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES,
+   core_1_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES,
+   core_1_3.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES,
+
+   pFeatures->features = features.core;
+
+   vk_foreach_struct(ext, pFeatures->pNext)
+   {
+      if (vk_get_physical_device_core_1_1_feature_ext(ext, &core_1_1))
+         continue;
+      if (vk_get_physical_device_core_1_2_feature_ext(ext, &core_1_2))
+         continue;
+      if (vk_get_physical_device_core_1_3_feature_ext(ext, &core_1_3))
+         continue;
+
+      switch (ext->sType) {
+      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: {
+         VkPhysicalDeviceConditionalRenderingFeaturesEXT *feat =
+            (VkPhysicalDeviceConditionalRenderingFeaturesEXT *) ext;
+         feat->conditionalRendering = features->conditionalRendering;
+         feat->inheritedConditionalRendering =
+            features->inheritedConditionalRendering;
+         break;
+      }
+
+      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: {
+         VkPhysicalDeviceTransformFeedbackFeaturesEXT *feat =
+            (VkPhysicalDeviceTransformFeedbackFeaturesEXT *) ext;
+         feat->transformFeedback = features->transformFeedbackk;
+         feat->geometryStreams = features->geometryStreams;
+         break;
+      }
+
+     case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: {
+         VkPhysicalDeviceIndexTypeUint8FeaturesEXT *features =
+            (VkPhysicalDeviceIndexTypeUint8FeaturesEXT *)ext;
+         feat->indexTypeUint8 = features->indexTypeUint8;
+         break;
+      }
+ 
+     case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
+         VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *feat =
+            (VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *)ext;
+         feat->vertexAttributeInstanceRateDivisor = features->vertexAttributeInstanceRateDivisor;
+         feat->vertexAttributeInstanceRateZeroDivisor =
+            features->vertexAttributeInstanceRateZeroDivisor;
+         break;
+      }
+
+      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: {
+         VkPhysicalDeviceDepthClipEnableFeaturesEXT *feat =
+            (VkPhysicalDeviceDepthClipEnableFeaturesEXT *)ext;
+         feat->depthClipEnable = features->depthClipEnable;
+         break;
+      }
+
+      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: {
+         VkPhysicalDevice4444FormatsFeaturesEXT *feat = (void *)ext;
+         features->formatA4R4G4B4 = features->formatA4R4G4B4;
+         features->formatA4B4G4R4 = features->formatA4B4G4R4;
+         break;
+      }
+
+      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: {
+         VkPhysicalDeviceCustomBorderColorFeaturesEXT *feat = (void *) ext;
+         feat->customBorderColors = features->customBorderColors;
+         feat->customBorderColorWithoutFormat =
+            features->customBorderColorsWithoutFormat;
+         break;
+      }
+
+      default:
+         break;
+      }
+   }
+ 
+ 
+
 void
 panvk_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
                                  VkPhysicalDeviceFeatures2 *pFeatures)
 {
-   pFeatures->features = (VkPhysicalDeviceFeatures) {
+   const VkPhysicalDeviceFeatures core = (VkPhysicalDeviceFeatures) {
       .robustBufferAccess = true,
       .fullDrawIndexUint32 = true,
       .independentBlend = true,
@@ -438,7 +525,6 @@ panvk_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
    };
 
    const VkPhysicalDeviceVulkan11Features core_1_1 = {
-      .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES,
       .storageBuffer16BitAccess           = false,
       .uniformAndStorageBuffer16BitAccess = false,
       .storagePushConstant16              = false,
@@ -454,7 +540,6 @@ panvk_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
    };
 
    const VkPhysicalDeviceVulkan12Features core_1_2 = {
-      .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES,
       .samplerMirrorClampToEdge           = false,
       .drawIndirectCount                  = false,
       .storageBuffer8BitAccess            = false,
@@ -507,7 +592,6 @@ panvk_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
    };
 
    const VkPhysicalDeviceVulkan13Features core_1_3 = {
-      .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES,
       .robustImageAccess                  = false,
       .inlineUniformBlock                 = false,
       .descriptorBindingInlineUniformBlockUpdateAfterBind = false,
@@ -525,64 +609,22 @@ panvk_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
       .maintenance4                       = false,
    };
 
-   vk_foreach_struct(ext, pFeatures->pNext)
-   {
-      if (vk_get_physical_device_core_1_1_feature_ext(ext, &core_1_1))
-         continue;
-      if (vk_get_physical_device_core_1_2_feature_ext(ext, &core_1_2))
-         continue;
-      if (vk_get_physical_device_core_1_3_feature_ext(ext, &core_1_3))
-         continue;
-      switch (ext->sType) {
-      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: {
-         VkPhysicalDeviceConditionalRenderingFeaturesEXT *features =
-            (VkPhysicalDeviceConditionalRenderingFeaturesEXT *) ext;
-         features->conditionalRendering = false;
-         features->inheritedConditionalRendering = false;
-         break;
-      }
-      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: {
-         VkPhysicalDeviceTransformFeedbackFeaturesEXT *features =
-            (VkPhysicalDeviceTransformFeedbackFeaturesEXT *) ext;
-         features->transformFeedback = false;
-         features->geometryStreams = false;
-         break;
-      }
-      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: {
-         VkPhysicalDeviceIndexTypeUint8FeaturesEXT *features =
-            (VkPhysicalDeviceIndexTypeUint8FeaturesEXT *)ext;
-         features->indexTypeUint8 = true;
-         break;
-      }
-      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
-         VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *features =
-            (VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *)ext;
-         features->vertexAttributeInstanceRateDivisor = true;
-         features->vertexAttributeInstanceRateZeroDivisor = true;
-         break;
-      }
-      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: {
-         VkPhysicalDeviceDepthClipEnableFeaturesEXT *features =
-            (VkPhysicalDeviceDepthClipEnableFeaturesEXT *)ext;
-         features->depthClipEnable = true;
-         break;
-      }
-      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: {
-         VkPhysicalDevice4444FormatsFeaturesEXT *features = (void *)ext;
-         features->formatA4R4G4B4 = true;
-         features->formatA4B4G4R4 = true;
-         break;
-      }
-      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: {
-         VkPhysicalDeviceCustomBorderColorFeaturesEXT *features = (void *) ext;
-         features->customBorderColors = true;
-         features->customBorderColorWithoutFormat = true;
-         break;
-      }
-      default:
-         break;
-      }
-   }
+   struct vk_features features = {
+      .core = core,
+      .core11 = core_1_1,
+      .core12 = core_1_2,
+      .core13 = core_1_3,
+      .indexTypeUint8 = true,
+      .vertexAttributeInstanceRateDivisor = true,
+      .vertexAttributeInstanceRateZeroDivisor = true,
+      .depthClipEnable = true,
+      .formatA4R4G4B4 = true,
+      .formatA4B4G4R4 = true,
+      .customBorderColors = true,
+      .customBorderColorWithoutFormat = true,
+   };
+
+   vk_helper_GetPhysicalDeviceFeatures2(physicalDevice, pFeatures, &features);
 }
 
 void
diff --git a/src/vulkan/runtime/vk_device.h b/src/vulkan/runtime/vk_device.h
index afbb4af891705959a0e115e36fdb2c8f53cbabc3..6e52388bd193da2188a45c4c4b58ffa5f5567885 100644
--- a/src/vulkan/runtime/vk_device.h
+++ b/src/vulkan/runtime/vk_device.h
@@ -421,6 +421,26 @@ bool vk_get_physical_device_core_1_2_property_ext(struct VkBaseOutStructure *ext
 bool vk_get_physical_device_core_1_3_property_ext(struct VkBaseOutStructure *ext,
                                                      const VkPhysicalDeviceVulkan13Properties *core);
 
+struct vk_features {
+   struct VkPhysicalDeviceFeatures core;
+   struct VkPhysicalDeviceVulkan11Features core11;
+   struct VkPhysicalDeviceVulkan12Features core12;
+   struct VkPhysicalDeviceVulkan13Features core13;
+
+   VkBool32           conditionalRendering;
+   VkBool32           inheritedConditionalRendering;
+   VkBool32           transformFeedback;
+   VkBool32           geometryStreams;
+   VkBool32           indexTypeUint8;
+   VkBool32           vertexAttributeInstanceRateDivisor;
+   VkBool32           vertexAttributeInstanceRateZeroDivisor;
+   VkBool32           depthClipEnable;
+   VkBool32           formatA4R4G4B4;
+   VkBool32           formatA4B4G4R4;
+   VkBool32           customBorderColors;
+   VkBool32           customBorderColorWithoutFormat;
+};
+
 #ifdef __cplusplus
 }
 #endif