vulkan/physical-device: dump some more information to logs
authorMatthew Waters <matthew@centricular.com>
Sat, 13 Jun 2020 07:40:02 +0000 (17:40 +1000)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Sun, 21 Jun 2020 09:30:29 +0000 (09:30 +0000)
Also dump the Vulkan 1.1 and Vulkan 1.2 device properties/features
where supported.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1341>

gst-libs/gst/vulkan/gstvkphysicaldevice.c

index 87de53c..2bd434e 100644 (file)
@@ -53,6 +53,14 @@ static void gst_vulkan_physical_device_finalize (GObject * object);
 struct _GstVulkanPhysicalDevicePrivate
 {
   guint dummy;
+#if defined (VK_API_VERSION_1_2)
+  VkPhysicalDeviceFeatures2 features10;
+  VkPhysicalDeviceProperties2 properties10;
+  VkPhysicalDeviceVulkan11Features features11;
+  VkPhysicalDeviceVulkan11Properties properties11;
+  VkPhysicalDeviceVulkan12Features features12;
+  VkPhysicalDeviceVulkan12Properties properties12;
+#endif
 };
 
 static void
@@ -152,6 +160,25 @@ gst_vulkan_physical_device_get_property (GObject * object, guint prop_id,
 static void
 gst_vulkan_physical_device_init (GstVulkanPhysicalDevice * device)
 {
+  GstVulkanPhysicalDevicePrivate *priv = GET_PRIV (device);
+
+#if defined (VK_API_VERSION_1_2)
+  priv->properties10.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
+  priv->properties11.sType =
+      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES;
+  priv->properties12.sType =
+      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES;
+  priv->properties10.pNext = &priv->properties11;
+  priv->properties11.pNext = &priv->properties12;
+
+  priv->features10.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
+  priv->features11.sType =
+      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
+  priv->features12.sType =
+      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
+  priv->features10.pNext = &priv->features11;
+  priv->features11.pNext = &priv->features12;
+#endif
 }
 
 static void
@@ -221,72 +248,211 @@ gst_vulkan_physical_device_finalize (GObject * object)
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
-#define DEBUG_BOOL(prefix, name, value)                             \
-  GST_DEBUG_OBJECT (device, prefix " " G_STRINGIFY(name) ": %s",    \
+#define DEBUG_BOOL(prefix, name, value)                                     \
+  GST_DEBUG_OBJECT (device, prefix " " G_STRINGIFY(name) ": %s",            \
     value ? "YES" : "NO")
+#define DEBUG_1(prefix, s, name, format, type)                              \
+  GST_DEBUG_OBJECT (device, prefix " " G_STRINGIFY(name) ": %" format,      \
+    (type) (s)->name)
+#define DEBUG_2(prefix, s, name, format, type)                              \
+  GST_DEBUG_OBJECT (device, prefix " " G_STRINGIFY(name)                    \
+    ": %" format ", %" format,                                              \
+    (type) (s)->name[0],                                                    \
+    (type) (s)->name[1])
+#define DEBUG_3(prefix, s, name, format, type)                              \
+  GST_DEBUG_OBJECT (device, prefix " " G_STRINGIFY(limit)                   \
+    ": %" format ", %" format ", %" format,                                 \
+    (type) (s)->name[0],                                                    \
+    (type) (s)->name[1],                                                    \
+    (type) (s)->name[2])
+
+#define DEBUG_UINT32(prefix, s, var) DEBUG_1(prefix, s, var, G_GUINT32_FORMAT, guint32)
+#define DEBUG_UINT32_2(prefix, s, var) DEBUG_2(prefix, s, var, G_GUINT32_FORMAT, guint32)
+#define DEBUG_UINT32_3(prefix, s, var) DEBUG_3(prefix, s, var, G_GUINT32_FORMAT, guint32)
+
+#define DEBUG_UINT64(prefix, s, var) DEBUG_1(prefix, s, var, G_GUINT64_FORMAT, guint64)
+
+#define DEBUG_INT32(prefix, s, var) DEBUG_1(prefix, s, var, G_GINT32_FORMAT, gint32)
+
+#define DEBUG_FLOAT(prefix, s, var) DEBUG_1(prefix, s, var, "f", gfloat)
+#define DEBUG_FLOAT_2(prefix, s, var) DEBUG_2(prefix, s, var, "f", gfloat)
+
+#define DEBUG_SIZE(prefix, s, var) DEBUG_1(prefix, s, var, G_GSIZE_FORMAT, gsize)
+#define DEBUG_FLAGS(prefix, s, limit, under_name_type)                      \
+  G_STMT_START {                                                            \
+    gchar *str = G_PASTE(G_PASTE(gst_vulkan_,under_name_type),_flags_to_string) ((s)->limit); \
+    GST_DEBUG_OBJECT (device, prefix " " G_STRINGIFY(limit) ": (0x%x) %s",  \
+        (s)->limit, str);                                                   \
+    g_free (str);                                                           \
+  } G_STMT_END
+
+#define DEBUG_BOOL_STRUCT(prefix, s, name) DEBUG_BOOL(prefix, name, (s)->name)
+
+#define DEBUG_STRING(prefix, s, str) DEBUG_1(prefix, s, str, "s", gchar *);
+
+static void
+dump_features10 (GstVulkanPhysicalDevice * device,
+    VkPhysicalDeviceFeatures * features)
+{
+  /* *INDENT-OFF* */
+  DEBUG_BOOL_STRUCT ("support for", features, robustBufferAccess);
+  DEBUG_BOOL_STRUCT ("support for", features, fullDrawIndexUint32);
+  DEBUG_BOOL_STRUCT ("support for", features, imageCubeArray);
+  DEBUG_BOOL_STRUCT ("support for", features, independentBlend);
+  DEBUG_BOOL_STRUCT ("support for", features, geometryShader);
+  DEBUG_BOOL_STRUCT ("support for", features, tessellationShader);
+  DEBUG_BOOL_STRUCT ("support for", features, sampleRateShading);
+  DEBUG_BOOL_STRUCT ("support for", features, sampleRateShading);
+  DEBUG_BOOL_STRUCT ("support for", features, dualSrcBlend);
+  DEBUG_BOOL_STRUCT ("support for", features, logicOp);
+  DEBUG_BOOL_STRUCT ("support for", features, multiDrawIndirect);
+  DEBUG_BOOL_STRUCT ("support for", features, drawIndirectFirstInstance);
+  DEBUG_BOOL_STRUCT ("support for", features, depthClamp);
+  DEBUG_BOOL_STRUCT ("support for", features, depthBiasClamp);
+  DEBUG_BOOL_STRUCT ("support for", features, fillModeNonSolid);
+  DEBUG_BOOL_STRUCT ("support for", features, depthBounds);
+  DEBUG_BOOL_STRUCT ("support for", features, wideLines);
+  DEBUG_BOOL_STRUCT ("support for", features, largePoints);
+  DEBUG_BOOL_STRUCT ("support for", features, alphaToOne);
+  DEBUG_BOOL_STRUCT ("support for", features, multiViewport);
+  DEBUG_BOOL_STRUCT ("support for", features, samplerAnisotropy);
+  DEBUG_BOOL_STRUCT ("support for", features, textureCompressionETC2);
+  DEBUG_BOOL_STRUCT ("support for", features, textureCompressionASTC_LDR);
+  DEBUG_BOOL_STRUCT ("support for", features, textureCompressionBC);
+  DEBUG_BOOL_STRUCT ("support for", features, occlusionQueryPrecise);
+  DEBUG_BOOL_STRUCT ("support for", features, pipelineStatisticsQuery);
+  DEBUG_BOOL_STRUCT ("support for", features, vertexPipelineStoresAndAtomics);
+  DEBUG_BOOL_STRUCT ("support for", features, fragmentStoresAndAtomics);
+  DEBUG_BOOL_STRUCT ("support for", features, shaderTessellationAndGeometryPointSize);
+  DEBUG_BOOL_STRUCT ("support for", features, shaderImageGatherExtended);
+  DEBUG_BOOL_STRUCT ("support for", features, shaderStorageImageExtendedFormats);
+  DEBUG_BOOL_STRUCT ("support for", features, shaderStorageImageMultisample);
+  DEBUG_BOOL_STRUCT ("support for", features, shaderStorageImageReadWithoutFormat);
+  DEBUG_BOOL_STRUCT ("support for", features, shaderStorageImageWriteWithoutFormat);
+  DEBUG_BOOL_STRUCT ("support for", features, shaderUniformBufferArrayDynamicIndexing);
+  DEBUG_BOOL_STRUCT ("support for", features, shaderSampledImageArrayDynamicIndexing);
+  DEBUG_BOOL_STRUCT ("support for", features, shaderStorageBufferArrayDynamicIndexing);
+  DEBUG_BOOL_STRUCT ("support for", features, shaderStorageImageArrayDynamicIndexing);
+  DEBUG_BOOL_STRUCT ("support for", features, shaderClipDistance);
+  DEBUG_BOOL_STRUCT ("support for", features, shaderCullDistance);
+  DEBUG_BOOL_STRUCT ("support for", features, shaderFloat64);
+  DEBUG_BOOL_STRUCT ("support for", features, shaderInt64);
+  DEBUG_BOOL_STRUCT ("support for", features, shaderInt16);
+  DEBUG_BOOL_STRUCT ("support for", features, shaderResourceResidency);
+  DEBUG_BOOL_STRUCT ("support for", features, shaderResourceMinLod);
+  DEBUG_BOOL_STRUCT ("support for", features, sparseBinding);
+  DEBUG_BOOL_STRUCT ("support for", features, sparseResidencyBuffer);
+  DEBUG_BOOL_STRUCT ("support for", features, sparseResidencyImage2D);
+  DEBUG_BOOL_STRUCT ("support for", features, sparseResidencyImage3D);
+  DEBUG_BOOL_STRUCT ("support for", features, sparseResidency2Samples);
+  DEBUG_BOOL_STRUCT ("support for", features, sparseResidency4Samples);
+  DEBUG_BOOL_STRUCT ("support for", features, sparseResidency8Samples);
+  DEBUG_BOOL_STRUCT ("support for", features, sparseResidency16Samples);
+  DEBUG_BOOL_STRUCT ("support for", features, sparseResidencyAliased);
+  DEBUG_BOOL_STRUCT ("support for", features, variableMultisampleRate);
+  DEBUG_BOOL_STRUCT ("support for", features, inheritedQueries);
+  /* *INDENT-ON* */
+}
+
+#if defined (VK_API_VERSION_1_2)
+static void
+dump_features11 (GstVulkanPhysicalDevice * device,
+    VkPhysicalDeviceVulkan11Features * features)
+{
+  /* *INDENT-OFF* */
+  DEBUG_BOOL_STRUCT ("support for (1.1)", features, storageBuffer16BitAccess);
+  DEBUG_BOOL_STRUCT ("support for (1.1)", features, uniformAndStorageBuffer16BitAccess);
+  DEBUG_BOOL_STRUCT ("support for (1.1)", features, storagePushConstant16);
+  DEBUG_BOOL_STRUCT ("support for (1.1)", features, storageInputOutput16);
+  DEBUG_BOOL_STRUCT ("support for (1.1)", features, multiview);
+  DEBUG_BOOL_STRUCT ("support for (1.1)", features, multiviewGeometryShader);
+  DEBUG_BOOL_STRUCT ("support for (1.1)", features, multiviewTessellationShader);
+  DEBUG_BOOL_STRUCT ("support for (1.1)", features, variablePointersStorageBuffer);
+  DEBUG_BOOL_STRUCT ("support for (1.1)", features, variablePointers);
+  DEBUG_BOOL_STRUCT ("support for (1.1)", features, protectedMemory);
+  DEBUG_BOOL_STRUCT ("support for (1.1)", features, samplerYcbcrConversion);
+  DEBUG_BOOL_STRUCT ("support for (1.1)", features, shaderDrawParameters);
+  /* *INDENT-ON* */
+}
 
+static void
+dump_features12 (GstVulkanPhysicalDevice * device,
+    VkPhysicalDeviceVulkan12Features * features)
+{
+  /* *INDENT-OFF* */
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, samplerMirrorClampToEdge);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, drawIndirectCount);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, storageBuffer8BitAccess);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, uniformAndStorageBuffer8BitAccess);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderBufferInt64Atomics);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderSharedInt64Atomics);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderFloat16);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderInt8);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorIndexing);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderInputAttachmentArrayDynamicIndexing);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderUniformTexelBufferArrayDynamicIndexing);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderStorageTexelBufferArrayDynamicIndexing);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderUniformBufferArrayNonUniformIndexing);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderSampledImageArrayNonUniformIndexing);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderStorageBufferArrayNonUniformIndexing);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderStorageImageArrayNonUniformIndexing);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderInputAttachmentArrayNonUniformIndexing);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderUniformTexelBufferArrayNonUniformIndexing);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorBindingUniformBufferUpdateAfterBind);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorBindingSampledImageUpdateAfterBind);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorBindingStorageImageUpdateAfterBind);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorBindingStorageBufferUpdateAfterBind);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorBindingUniformTexelBufferUpdateAfterBind);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorBindingStorageTexelBufferUpdateAfterBind);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorBindingUpdateUnusedWhilePending);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorBindingPartiallyBound);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorBindingVariableDescriptorCount);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, runtimeDescriptorArray);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, samplerFilterMinmax);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, scalarBlockLayout);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, imagelessFramebuffer);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, uniformBufferStandardLayout);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderSubgroupExtendedTypes);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, separateDepthStencilLayouts);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, hostQueryReset);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, timelineSemaphore);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, bufferDeviceAddress);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, bufferDeviceAddressCaptureReplay);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, bufferDeviceAddressMultiDevice);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, vulkanMemoryModel);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, vulkanMemoryModelDeviceScope);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, vulkanMemoryModelAvailabilityVisibilityChains);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderOutputViewportIndex);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderOutputLayer);
+  DEBUG_BOOL_STRUCT ("support for (1.2)", features, subgroupBroadcastDynamicId);
+  /* *INDENT-ON* */
+}
+#endif
 static gboolean
 dump_features (GstVulkanPhysicalDevice * device, GError ** error)
 {
-#define DEBUG_BOOL_FEATURE(name) DEBUG_BOOL("support for", name, device->features.name)
-  DEBUG_BOOL_FEATURE (robustBufferAccess);
-  DEBUG_BOOL_FEATURE (fullDrawIndexUint32);
-  DEBUG_BOOL_FEATURE (imageCubeArray);
-  DEBUG_BOOL_FEATURE (independentBlend);
-  DEBUG_BOOL_FEATURE (geometryShader);
-  DEBUG_BOOL_FEATURE (tessellationShader);
-  DEBUG_BOOL_FEATURE (sampleRateShading);
-  DEBUG_BOOL_FEATURE (sampleRateShading);
-  DEBUG_BOOL_FEATURE (dualSrcBlend);
-  DEBUG_BOOL_FEATURE (logicOp);
-  DEBUG_BOOL_FEATURE (multiDrawIndirect);
-  DEBUG_BOOL_FEATURE (drawIndirectFirstInstance);
-  DEBUG_BOOL_FEATURE (depthClamp);
-  DEBUG_BOOL_FEATURE (depthBiasClamp);
-  DEBUG_BOOL_FEATURE (fillModeNonSolid);
-  DEBUG_BOOL_FEATURE (depthBounds);
-  DEBUG_BOOL_FEATURE (wideLines);
-  DEBUG_BOOL_FEATURE (largePoints);
-  DEBUG_BOOL_FEATURE (alphaToOne);
-  DEBUG_BOOL_FEATURE (multiViewport);
-  DEBUG_BOOL_FEATURE (samplerAnisotropy);
-  DEBUG_BOOL_FEATURE (textureCompressionETC2);
-  DEBUG_BOOL_FEATURE (textureCompressionASTC_LDR);
-  DEBUG_BOOL_FEATURE (textureCompressionBC);
-  DEBUG_BOOL_FEATURE (occlusionQueryPrecise);
-  DEBUG_BOOL_FEATURE (pipelineStatisticsQuery);
-  DEBUG_BOOL_FEATURE (vertexPipelineStoresAndAtomics);
-  DEBUG_BOOL_FEATURE (fragmentStoresAndAtomics);
-  DEBUG_BOOL_FEATURE (shaderTessellationAndGeometryPointSize);
-  DEBUG_BOOL_FEATURE (shaderImageGatherExtended);
-  DEBUG_BOOL_FEATURE (shaderStorageImageExtendedFormats);
-  DEBUG_BOOL_FEATURE (shaderStorageImageMultisample);
-  DEBUG_BOOL_FEATURE (shaderStorageImageReadWithoutFormat);
-  DEBUG_BOOL_FEATURE (shaderStorageImageWriteWithoutFormat);
-  DEBUG_BOOL_FEATURE (shaderUniformBufferArrayDynamicIndexing);
-  DEBUG_BOOL_FEATURE (shaderSampledImageArrayDynamicIndexing);
-  DEBUG_BOOL_FEATURE (shaderStorageBufferArrayDynamicIndexing);
-  DEBUG_BOOL_FEATURE (shaderStorageImageArrayDynamicIndexing);
-  DEBUG_BOOL_FEATURE (shaderClipDistance);
-  DEBUG_BOOL_FEATURE (shaderCullDistance);
-  DEBUG_BOOL_FEATURE (shaderFloat64);
-  DEBUG_BOOL_FEATURE (shaderInt64);
-  DEBUG_BOOL_FEATURE (shaderInt16);
-  DEBUG_BOOL_FEATURE (shaderResourceResidency);
-  DEBUG_BOOL_FEATURE (shaderResourceMinLod);
-  DEBUG_BOOL_FEATURE (sparseBinding);
-  DEBUG_BOOL_FEATURE (sparseResidencyBuffer);
-  DEBUG_BOOL_FEATURE (sparseResidencyImage2D);
-  DEBUG_BOOL_FEATURE (sparseResidencyImage3D);
-  DEBUG_BOOL_FEATURE (sparseResidency2Samples);
-  DEBUG_BOOL_FEATURE (sparseResidency4Samples);
-  DEBUG_BOOL_FEATURE (sparseResidency8Samples);
-  DEBUG_BOOL_FEATURE (sparseResidency16Samples);
-  DEBUG_BOOL_FEATURE (sparseResidencyAliased);
-  DEBUG_BOOL_FEATURE (variableMultisampleRate);
-  DEBUG_BOOL_FEATURE (inheritedQueries);
-
-#undef DEBUG_BOOL_FEATURE
+#if defined (VK_API_VERSION_1_2)
+  GstVulkanPhysicalDevicePrivate *priv = GET_PRIV (device);
+  VkBaseOutStructure *iter;
+
+  if (gst_vulkan_instance_check_version (device->instance, 1, 2, 0)) {
+    for (iter = (VkBaseOutStructure *) & priv->features10; iter;
+        iter = iter->pNext) {
+      if (iter->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2)
+        dump_features10 (device,
+            &((VkPhysicalDeviceFeatures2 *) iter)->features);
+      else if (iter->sType ==
+          VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES)
+        dump_features11 (device, (VkPhysicalDeviceVulkan11Features *) iter);
+      else if (iter->sType ==
+          VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES)
+        dump_features12 (device, (VkPhysicalDeviceVulkan12Features *) iter);
+    }
+  } else
+#endif
+  {
+    dump_features10 (device, &device->features);
+  }
 
   return TRUE;
 }
@@ -355,164 +521,117 @@ dump_queue_properties (GstVulkanPhysicalDevice * device, GError ** error)
 static gboolean
 dump_limits (GstVulkanPhysicalDevice * device, GError ** error)
 {
-#define DEBUG_LIMIT(limit, format, type)                                \
-  GST_DEBUG_OBJECT (device, "limit " G_STRINGIFY(limit) ": %" format,   \
-    (type) device->properties.limits.limit)
-#define DEBUG_LIMIT_2(limit, format, type)                                  \
-  GST_DEBUG_OBJECT (device, "limit " G_STRINGIFY(limit)                     \
-    ": %" format ", %" format,                                              \
-    (type) device->properties.limits.limit[0],                                           \
-    (type) device->properties.limits.limit[1])
-#define DEBUG_LIMIT_3(limit, format, type)                                  \
-  GST_DEBUG_OBJECT (device, "limit " G_STRINGIFY(limit)                     \
-    ": %" format ", %" format ", %" format,                                 \
-    (type) device->properties.limits.limit[0],                                           \
-    (type) device->properties.limits.limit[1],                                           \
-    (type) device->properties.limits.limit[2])
-#define DEBUG_BOOL_LIMIT(limit) DEBUG_BOOL("limit", limit, device->properties.limits.limit)
-
-#define DEBUG_UINT32_LIMIT(limit) DEBUG_LIMIT(limit, G_GUINT32_FORMAT, guint32)
-#define DEBUG_UINT32_2_LIMIT(limit) DEBUG_LIMIT_2(limit, G_GUINT32_FORMAT, guint32)
-#define DEBUG_UINT32_3_LIMIT(limit) DEBUG_LIMIT_3(limit, G_GUINT32_FORMAT, guint32)
-
-#define DEBUG_INT32_LIMIT(limit) DEBUG_LIMIT(limit, G_GINT32_FORMAT, gint32)
-
-#define DEBUG_UINT64_LIMIT(limit) DEBUG_LIMIT(limit, G_GUINT64_FORMAT, guint64)
-
-#define DEBUG_SIZE_LIMIT(limit) DEBUG_LIMIT(limit, G_GSIZE_FORMAT, gsize)
-
-#define DEBUG_FLOAT_LIMIT(limit) DEBUG_LIMIT(limit, "f", float)
-#define DEBUG_FLOAT_2_LIMIT(limit) DEBUG_LIMIT_2(limit, "f", float)
-
-#define DEBUG_FLAGS_LIMIT(limit, under_name_type)                           \
-  G_STMT_START {                                                            \
-    gchar *str = G_PASTE(G_PASTE(gst_vulkan_,under_name_type),_flags_to_string) (device->properties.limits.limit); \
-    GST_DEBUG_OBJECT (device, "limit " G_STRINGIFY(limit) ": (0x%x) %s",    \
-        device->properties.limits.limit, str);                              \
-    g_free (str);                                                           \
-  } G_STMT_END
-
-  DEBUG_UINT32_LIMIT (maxImageDimension1D);
-  DEBUG_UINT32_LIMIT (maxImageDimension2D);
-  DEBUG_UINT32_LIMIT (maxImageDimension3D);
-  DEBUG_UINT32_LIMIT (maxImageDimensionCube);
-  DEBUG_UINT32_LIMIT (maxImageArrayLayers);
-  DEBUG_UINT32_LIMIT (maxTexelBufferElements);
-  DEBUG_UINT32_LIMIT (maxUniformBufferRange);
-  DEBUG_UINT32_LIMIT (maxStorageBufferRange);
-  DEBUG_UINT32_LIMIT (maxPushConstantsSize);
-  DEBUG_UINT32_LIMIT (maxMemoryAllocationCount);
-  DEBUG_UINT32_LIMIT (maxSamplerAllocationCount);
-  DEBUG_UINT64_LIMIT (bufferImageGranularity);
-  DEBUG_UINT64_LIMIT (sparseAddressSpaceSize);
-  DEBUG_UINT32_LIMIT (maxBoundDescriptorSets);
-  DEBUG_UINT32_LIMIT (maxPerStageDescriptorSamplers);
-  DEBUG_UINT32_LIMIT (maxPerStageDescriptorUniformBuffers);
-  DEBUG_UINT32_LIMIT (maxPerStageDescriptorStorageBuffers);
-  DEBUG_UINT32_LIMIT (maxPerStageDescriptorSampledImages);
-  DEBUG_UINT32_LIMIT (maxPerStageDescriptorStorageImages);
-  DEBUG_UINT32_LIMIT (maxPerStageDescriptorInputAttachments);
-  DEBUG_UINT32_LIMIT (maxPerStageResources);
-  DEBUG_UINT32_LIMIT (maxDescriptorSetSamplers);
-  DEBUG_UINT32_LIMIT (maxDescriptorSetUniformBuffers);
-  DEBUG_UINT32_LIMIT (maxDescriptorSetUniformBuffersDynamic);
-  DEBUG_UINT32_LIMIT (maxDescriptorSetStorageBuffers);
-  DEBUG_UINT32_LIMIT (maxDescriptorSetStorageBuffersDynamic);
-  DEBUG_UINT32_LIMIT (maxDescriptorSetSampledImages);
-  DEBUG_UINT32_LIMIT (maxDescriptorSetStorageImages);
-  DEBUG_UINT32_LIMIT (maxDescriptorSetInputAttachments);
-  DEBUG_UINT32_LIMIT (maxVertexInputAttributes);
-  DEBUG_UINT32_LIMIT (maxVertexInputBindings);
-  DEBUG_UINT32_LIMIT (maxVertexInputBindings);
-  DEBUG_UINT32_LIMIT (maxVertexInputAttributeOffset);
-  DEBUG_UINT32_LIMIT (maxVertexInputBindingStride);
-  DEBUG_UINT32_LIMIT (maxVertexOutputComponents);
-  DEBUG_UINT32_LIMIT (maxTessellationGenerationLevel);
-  DEBUG_UINT32_LIMIT (maxTessellationPatchSize);
-  DEBUG_UINT32_LIMIT (maxTessellationControlPerVertexInputComponents);
-  DEBUG_UINT32_LIMIT (maxTessellationControlPerVertexOutputComponents);
-  DEBUG_UINT32_LIMIT (maxTessellationControlPerPatchOutputComponents);
-  DEBUG_UINT32_LIMIT (maxTessellationControlTotalOutputComponents);
-  DEBUG_UINT32_LIMIT (maxTessellationControlTotalOutputComponents);
-  DEBUG_UINT32_LIMIT (maxTessellationEvaluationInputComponents);
-  DEBUG_UINT32_LIMIT (maxTessellationEvaluationOutputComponents);
-  DEBUG_UINT32_LIMIT (maxGeometryShaderInvocations);
-  DEBUG_UINT32_LIMIT (maxGeometryInputComponents);
-  DEBUG_UINT32_LIMIT (maxGeometryOutputComponents);
-  DEBUG_UINT32_LIMIT (maxGeometryOutputVertices);
-  DEBUG_UINT32_LIMIT (maxGeometryTotalOutputComponents);
-  DEBUG_UINT32_LIMIT (maxFragmentInputComponents);
-  DEBUG_UINT32_LIMIT (maxFragmentOutputAttachments);
-  DEBUG_UINT32_LIMIT (maxFragmentDualSrcAttachments);
-  DEBUG_UINT32_LIMIT (maxFragmentCombinedOutputResources);
-  DEBUG_UINT32_LIMIT (maxComputeSharedMemorySize);
-  DEBUG_UINT32_3_LIMIT (maxComputeWorkGroupCount);
-  DEBUG_UINT32_LIMIT (maxComputeWorkGroupInvocations);
-  DEBUG_UINT32_3_LIMIT (maxComputeWorkGroupSize);
-  DEBUG_UINT32_LIMIT (subPixelPrecisionBits);
-  DEBUG_UINT32_LIMIT (subTexelPrecisionBits);
-  DEBUG_UINT32_LIMIT (mipmapPrecisionBits);
-  DEBUG_UINT32_LIMIT (maxDrawIndexedIndexValue);
-  DEBUG_UINT32_LIMIT (maxDrawIndirectCount);
-  DEBUG_FLOAT_LIMIT (maxSamplerLodBias);
-  DEBUG_FLOAT_LIMIT (maxSamplerAnisotropy);
-  DEBUG_UINT32_LIMIT (maxViewports);
-  DEBUG_UINT32_2_LIMIT (maxViewportDimensions);
-  DEBUG_FLOAT_2_LIMIT (viewportBoundsRange);
-  DEBUG_UINT32_LIMIT (viewportSubPixelBits);
-  DEBUG_SIZE_LIMIT (minMemoryMapAlignment);
-  DEBUG_UINT64_LIMIT (minTexelBufferOffsetAlignment);
-  DEBUG_UINT64_LIMIT (minUniformBufferOffsetAlignment);
-  DEBUG_UINT64_LIMIT (minStorageBufferOffsetAlignment);
-  DEBUG_INT32_LIMIT (minTexelOffset);
-  DEBUG_UINT32_LIMIT (maxTexelOffset);
-  DEBUG_INT32_LIMIT (minTexelGatherOffset);
-  DEBUG_UINT32_LIMIT (maxTexelGatherOffset);
-  DEBUG_FLOAT_LIMIT (minInterpolationOffset);
-  DEBUG_FLOAT_LIMIT (maxInterpolationOffset);
-  DEBUG_UINT32_LIMIT (subPixelInterpolationOffsetBits);
-  DEBUG_UINT32_LIMIT (maxFramebufferWidth);
-  DEBUG_UINT32_LIMIT (maxFramebufferHeight);
-  DEBUG_UINT32_LIMIT (maxFramebufferLayers);
-  DEBUG_FLAGS_LIMIT (framebufferColorSampleCounts, sample_count);
-  DEBUG_FLAGS_LIMIT (framebufferDepthSampleCounts, sample_count);
-  DEBUG_FLAGS_LIMIT (framebufferStencilSampleCounts, sample_count);
-  DEBUG_FLAGS_LIMIT (framebufferNoAttachmentsSampleCounts, sample_count);
-  DEBUG_UINT32_LIMIT (maxColorAttachments);
-  DEBUG_FLAGS_LIMIT (sampledImageColorSampleCounts, sample_count);
-  DEBUG_FLAGS_LIMIT (sampledImageIntegerSampleCounts, sample_count);
-  DEBUG_FLAGS_LIMIT (sampledImageDepthSampleCounts, sample_count);
-  DEBUG_FLAGS_LIMIT (sampledImageStencilSampleCounts, sample_count);
-  DEBUG_FLAGS_LIMIT (storageImageSampleCounts, sample_count);
-  DEBUG_BOOL_LIMIT (timestampComputeAndGraphics);
-  DEBUG_FLOAT_LIMIT (timestampPeriod);
-  DEBUG_UINT32_LIMIT (maxClipDistances);
-  DEBUG_UINT32_LIMIT (maxCullDistances);
-  DEBUG_UINT32_LIMIT (maxCombinedClipAndCullDistances);
-  DEBUG_UINT32_LIMIT (discreteQueuePriorities);
-  DEBUG_FLOAT_2_LIMIT (pointSizeRange);
-  DEBUG_FLOAT_2_LIMIT (lineWidthRange);
-  DEBUG_FLOAT_LIMIT (pointSizeGranularity);
-  DEBUG_FLOAT_LIMIT (lineWidthGranularity);
-  DEBUG_BOOL_LIMIT (strictLines);
-  DEBUG_BOOL_LIMIT (standardSampleLocations);
-  DEBUG_UINT64_LIMIT (optimalBufferCopyOffsetAlignment);
-  DEBUG_UINT64_LIMIT (optimalBufferCopyRowPitchAlignment);
-  DEBUG_UINT64_LIMIT (nonCoherentAtomSize);
-
-#undef DEBUG_LIMIT
-#undef DEBUG_LIMIT_2
-#undef DEBUG_LIMIT_3
-#undef DEBUG_BOOL_LIMIT
-#undef DEBUG_UINT32_LIMIT
-#undef DEBUG_UINT32_2_LIMIT
-#undef DEBUG_UINT32_3_LIMIT
-#undef DEBUG_INT32_LIMIT
-#undef DEBUG_UINT64_LIMIT
-#undef DEBUG_SIZE_LIMIT
-#undef DEBUG_FLOAT_LIMIT
-#undef DEBUG_FLOAT_2_LIMIT
-#undef DEBUG_FLAGS_LIMIT
+  VkPhysicalDeviceLimits *limits = &device->properties.limits;
+
+  /* *INDENT-OFF* */
+  DEBUG_UINT32 ("limit", limits, maxImageDimension1D);
+  DEBUG_UINT32 ("limit", limits, maxImageDimension2D);
+  DEBUG_UINT32 ("limit", limits, maxImageDimension3D);
+  DEBUG_UINT32 ("limit", limits, maxImageDimensionCube);
+  DEBUG_UINT32 ("limit", limits, maxImageArrayLayers);
+  DEBUG_UINT32 ("limit", limits, maxTexelBufferElements);
+  DEBUG_UINT32 ("limit", limits, maxUniformBufferRange);
+  DEBUG_UINT32 ("limit", limits, maxStorageBufferRange);
+  DEBUG_UINT32 ("limit", limits, maxPushConstantsSize);
+  DEBUG_UINT32 ("limit", limits, maxMemoryAllocationCount);
+  DEBUG_UINT32 ("limit", limits, maxSamplerAllocationCount);
+  DEBUG_UINT64 ("limit", limits, bufferImageGranularity);
+  DEBUG_UINT64 ("limit", limits, sparseAddressSpaceSize);
+  DEBUG_UINT32 ("limit", limits, maxBoundDescriptorSets);
+  DEBUG_UINT32 ("limit", limits, maxPerStageDescriptorSamplers);
+  DEBUG_UINT32 ("limit", limits, maxPerStageDescriptorUniformBuffers);
+  DEBUG_UINT32 ("limit", limits, maxPerStageDescriptorStorageBuffers);
+  DEBUG_UINT32 ("limit", limits, maxPerStageDescriptorSampledImages);
+  DEBUG_UINT32 ("limit", limits, maxPerStageDescriptorStorageImages);
+  DEBUG_UINT32 ("limit", limits, maxPerStageDescriptorInputAttachments);
+  DEBUG_UINT32 ("limit", limits, maxPerStageResources);
+  DEBUG_UINT32 ("limit", limits, maxDescriptorSetSamplers);
+  DEBUG_UINT32 ("limit", limits, maxDescriptorSetUniformBuffers);
+  DEBUG_UINT32 ("limit", limits, maxDescriptorSetUniformBuffersDynamic);
+  DEBUG_UINT32 ("limit", limits, maxDescriptorSetStorageBuffers);
+  DEBUG_UINT32 ("limit", limits, maxDescriptorSetStorageBuffersDynamic);
+  DEBUG_UINT32 ("limit", limits, maxDescriptorSetSampledImages);
+  DEBUG_UINT32 ("limit", limits, maxDescriptorSetStorageImages);
+  DEBUG_UINT32 ("limit", limits, maxDescriptorSetInputAttachments);
+  DEBUG_UINT32 ("limit", limits, maxVertexInputAttributes);
+  DEBUG_UINT32 ("limit", limits, maxVertexInputBindings);
+  DEBUG_UINT32 ("limit", limits, maxVertexInputBindings);
+  DEBUG_UINT32 ("limit", limits, maxVertexInputAttributeOffset);
+  DEBUG_UINT32 ("limit", limits, maxVertexInputBindingStride);
+  DEBUG_UINT32 ("limit", limits, maxVertexOutputComponents);
+  DEBUG_UINT32 ("limit", limits, maxTessellationGenerationLevel);
+  DEBUG_UINT32 ("limit", limits, maxTessellationPatchSize);
+  DEBUG_UINT32 ("limit", limits, maxTessellationControlPerVertexInputComponents);
+  DEBUG_UINT32 ("limit", limits, maxTessellationControlPerVertexOutputComponents);
+  DEBUG_UINT32 ("limit", limits, maxTessellationControlPerPatchOutputComponents);
+  DEBUG_UINT32 ("limit", limits, maxTessellationControlTotalOutputComponents);
+  DEBUG_UINT32 ("limit", limits, maxTessellationControlTotalOutputComponents);
+  DEBUG_UINT32 ("limit", limits, maxTessellationEvaluationInputComponents);
+  DEBUG_UINT32 ("limit", limits, maxTessellationEvaluationOutputComponents);
+  DEBUG_UINT32 ("limit", limits, maxGeometryShaderInvocations);
+  DEBUG_UINT32 ("limit", limits, maxGeometryInputComponents);
+  DEBUG_UINT32 ("limit", limits, maxGeometryOutputComponents);
+  DEBUG_UINT32 ("limit", limits, maxGeometryOutputVertices);
+  DEBUG_UINT32 ("limit", limits, maxGeometryTotalOutputComponents);
+  DEBUG_UINT32 ("limit", limits, maxFragmentInputComponents);
+  DEBUG_UINT32 ("limit", limits, maxFragmentOutputAttachments);
+  DEBUG_UINT32 ("limit", limits, maxFragmentDualSrcAttachments);
+  DEBUG_UINT32 ("limit", limits, maxFragmentCombinedOutputResources);
+  DEBUG_UINT32 ("limit", limits, maxComputeSharedMemorySize);
+  DEBUG_UINT32_3 ("limit", limits, maxComputeWorkGroupCount);
+  DEBUG_UINT32 ("limit", limits, maxComputeWorkGroupInvocations);
+  DEBUG_UINT32_3 ("limit", limits, maxComputeWorkGroupSize);
+  DEBUG_UINT32 ("limit", limits, subPixelPrecisionBits);
+  DEBUG_UINT32 ("limit", limits, subTexelPrecisionBits);
+  DEBUG_UINT32 ("limit", limits, mipmapPrecisionBits);
+  DEBUG_UINT32 ("limit", limits, maxDrawIndexedIndexValue);
+  DEBUG_UINT32 ("limit", limits, maxDrawIndirectCount);
+  DEBUG_FLOAT ("limit", limits, maxSamplerLodBias);
+  DEBUG_FLOAT ("limit", limits, maxSamplerAnisotropy);
+  DEBUG_UINT32 ("limit", limits, maxViewports);
+  DEBUG_UINT32_2 ("limit", limits, maxViewportDimensions);
+  DEBUG_FLOAT_2 ("limit", limits, viewportBoundsRange);
+  DEBUG_UINT32 ("limit", limits, viewportSubPixelBits);
+  DEBUG_SIZE ("limit", limits, minMemoryMapAlignment);
+  DEBUG_UINT64 ("limit", limits, minTexelBufferOffsetAlignment);
+  DEBUG_UINT64 ("limit", limits, minUniformBufferOffsetAlignment);
+  DEBUG_UINT64 ("limit", limits, minStorageBufferOffsetAlignment);
+  DEBUG_INT32 ("limit", limits, minTexelOffset);
+  DEBUG_UINT32 ("limit", limits, maxTexelOffset);
+  DEBUG_INT32 ("limit", limits, minTexelGatherOffset);
+  DEBUG_UINT32 ("limit", limits, maxTexelGatherOffset);
+  DEBUG_FLOAT ("limit", limits, minInterpolationOffset);
+  DEBUG_FLOAT ("limit", limits, maxInterpolationOffset);
+  DEBUG_UINT32 ("limit", limits, subPixelInterpolationOffsetBits);
+  DEBUG_UINT32 ("limit", limits, maxFramebufferWidth);
+  DEBUG_UINT32 ("limit", limits, maxFramebufferHeight);
+  DEBUG_UINT32 ("limit", limits, maxFramebufferLayers);
+  DEBUG_FLAGS ("limit", limits, framebufferColorSampleCounts, sample_count);
+  DEBUG_FLAGS ("limit", limits, framebufferDepthSampleCounts, sample_count);
+  DEBUG_FLAGS ("limit", limits, framebufferStencilSampleCounts, sample_count);
+  DEBUG_FLAGS ("limit", limits, framebufferNoAttachmentsSampleCounts, sample_count);
+  DEBUG_UINT32 ("limit", limits, maxColorAttachments);
+  DEBUG_FLAGS ("limit", limits, sampledImageColorSampleCounts, sample_count);
+  DEBUG_FLAGS ("limit", limits, sampledImageIntegerSampleCounts, sample_count);
+  DEBUG_FLAGS ("limit", limits, sampledImageDepthSampleCounts, sample_count);
+  DEBUG_FLAGS ("limit", limits, sampledImageStencilSampleCounts, sample_count);
+  DEBUG_FLAGS ("limit", limits, storageImageSampleCounts, sample_count);
+  DEBUG_BOOL_STRUCT ("limit", limits, timestampComputeAndGraphics);
+  DEBUG_FLOAT ("limit", limits, timestampPeriod);
+  DEBUG_UINT32 ("limit", limits, maxClipDistances);
+  DEBUG_UINT32 ("limit", limits, maxCullDistances);
+  DEBUG_UINT32 ("limit", limits, maxCombinedClipAndCullDistances);
+  DEBUG_UINT32 ("limit", limits, discreteQueuePriorities);
+  DEBUG_FLOAT_2 ("limit", limits, pointSizeRange);
+  DEBUG_FLOAT_2 ("limit", limits, lineWidthRange);
+  DEBUG_FLOAT ("limit", limits, pointSizeGranularity);
+  DEBUG_FLOAT ("limit", limits, lineWidthGranularity);
+  DEBUG_BOOL_STRUCT ("limit", limits, strictLines);
+  DEBUG_BOOL_STRUCT ("limit", limits, standardSampleLocations);
+  DEBUG_UINT64 ("limit", limits, optimalBufferCopyOffsetAlignment);
+  DEBUG_UINT64 ("limit", limits, optimalBufferCopyRowPitchAlignment);
+  DEBUG_UINT64 ("limit", limits, nonCoherentAtomSize);
+  /* *INDENT-ON* */
 
   return TRUE;
 }
@@ -520,20 +639,114 @@ dump_limits (GstVulkanPhysicalDevice * device, GError ** error)
 static gboolean
 dump_sparse_properties (GstVulkanPhysicalDevice * device, GError ** error)
 {
-#define DEBUG_BOOL_SPARSE_PROPERTY(name) DEBUG_BOOL("sparse property", name, device->properties.sparseProperties.name)
-  DEBUG_BOOL_SPARSE_PROPERTY (residencyStandard2DBlockShape);
-  DEBUG_BOOL_SPARSE_PROPERTY (residencyStandard2DMultisampleBlockShape);
-  DEBUG_BOOL_SPARSE_PROPERTY (residencyStandard3DBlockShape);
-  DEBUG_BOOL_SPARSE_PROPERTY (residencyAlignedMipSize);
-  DEBUG_BOOL_SPARSE_PROPERTY (residencyNonResidentStrict);
-#undef DEBUG_BOOL_SPARSE_PROPERTY
+  VkPhysicalDeviceSparseProperties *props =
+      &device->properties.sparseProperties;
+
+  /* *INDENT-OFF* */
+  DEBUG_BOOL_STRUCT ("sparse property", props, residencyStandard2DBlockShape);
+  DEBUG_BOOL_STRUCT ("sparse property", props, residencyStandard2DMultisampleBlockShape);
+  DEBUG_BOOL_STRUCT ("sparse property", props, residencyStandard3DBlockShape);
+  DEBUG_BOOL_STRUCT ("sparse property", props, residencyAlignedMipSize);
+  DEBUG_BOOL_STRUCT ("sparse property", props, residencyNonResidentStrict);
+  /* *INDENT-ON* */
 
   return TRUE;
 }
 
+#if defined (VK_API_VERSION_1_2)
+static void
+dump_properties11 (GstVulkanPhysicalDevice * device,
+    VkPhysicalDeviceVulkan11Properties * properties)
+{
+  /* *INDENT-OFF* */
+/*    uint8_t                    deviceUUID[VK_UUID_SIZE];
+    uint8_t                    driverUUID[VK_UUID_SIZE];
+    uint8_t                    deviceLUID[VK_LUID_SIZE];*/
+  DEBUG_UINT32 ("properties (1.1)", properties, deviceNodeMask);
+/*    VkBool32                   deviceLUIDValid;*/
+  DEBUG_UINT32 ("properties (1.1)", properties, subgroupSize);
+/*    VkShaderStageFlags         subgroupSupportedStages;
+    VkSubgroupFeatureFlags     subgroupSupportedOperations;*/
+  DEBUG_BOOL_STRUCT ("properties (1.1)", properties, subgroupQuadOperationsInAllStages);
+/*    VkPointClippingBehavior    pointClippingBehavior;*/
+  DEBUG_UINT32 ("properties (1.1)", properties, maxMultiviewViewCount);
+  DEBUG_UINT32 ("properties (1.1)", properties, maxMultiviewInstanceIndex);
+  DEBUG_BOOL_STRUCT ("properties (1.1)", properties, protectedNoFault);
+  DEBUG_UINT32 ("properties (1.1)", properties, maxPerSetDescriptors);
+  DEBUG_SIZE ("properties (1.1)", properties, maxMemoryAllocationSize);
+  /* *INDENT-ON* */
+}
+
+static void
+dump_properties12 (GstVulkanPhysicalDevice * device,
+    VkPhysicalDeviceVulkan12Properties * properties)
+{
+  /* *INDENT-OFF* */
+/*    VkDriverId                           driverID;*/
+  DEBUG_STRING ("properties (1.2)", properties, driverName);
+  DEBUG_STRING ("properties (1.2)", properties, driverInfo);
+/*    VkConformanceVersion                 conformanceVersion;
+    VkShaderFloatControlsIndependence    denormBehaviorIndependence;
+    VkShaderFloatControlsIndependence    roundingModeIndependence;*/
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderSignedZeroInfNanPreserveFloat16);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderSignedZeroInfNanPreserveFloat32);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderSignedZeroInfNanPreserveFloat64);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderDenormPreserveFloat16);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderDenormPreserveFloat32);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderDenormPreserveFloat64);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderDenormFlushToZeroFloat16);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderDenormFlushToZeroFloat16);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderDenormFlushToZeroFloat32);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderRoundingModeRTEFloat16);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderRoundingModeRTEFloat32);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderRoundingModeRTEFloat64);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderRoundingModeRTZFloat16);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderRoundingModeRTZFloat32);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderRoundingModeRTZFloat64);
+  DEBUG_UINT32 ("properties (1.2)", properties, maxUpdateAfterBindDescriptorsInAllPools);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderUniformBufferArrayNonUniformIndexingNative);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderSampledImageArrayNonUniformIndexingNative);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderSampledImageArrayNonUniformIndexingNative);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderStorageBufferArrayNonUniformIndexingNative);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderStorageImageArrayNonUniformIndexingNative);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderInputAttachmentArrayNonUniformIndexingNative);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, robustBufferAccessUpdateAfterBind);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, quadDivergentImplicitLod);
+  DEBUG_UINT32 ("properties (1.2)", properties, maxPerStageDescriptorUpdateAfterBindSamplers);
+  DEBUG_UINT32 ("properties (1.2)", properties, maxPerStageDescriptorUpdateAfterBindUniformBuffers);
+  DEBUG_UINT32 ("properties (1.2)", properties, maxPerStageDescriptorUpdateAfterBindStorageBuffers);
+  DEBUG_UINT32 ("properties (1.2)", properties, maxPerStageDescriptorUpdateAfterBindSampledImages);
+  DEBUG_UINT32 ("properties (1.2)", properties, maxPerStageDescriptorUpdateAfterBindStorageImages);
+  DEBUG_UINT32 ("properties (1.2)", properties, maxPerStageDescriptorUpdateAfterBindInputAttachments);
+  DEBUG_UINT32 ("properties (1.2)", properties, maxPerStageUpdateAfterBindResources);
+  DEBUG_UINT32 ("properties (1.2)", properties, maxDescriptorSetUpdateAfterBindSamplers);
+  DEBUG_UINT32 ("properties (1.2)", properties, maxDescriptorSetUpdateAfterBindUniformBuffers);
+  DEBUG_UINT32 ("properties (1.2)", properties, maxDescriptorSetUpdateAfterBindUniformBuffersDynamic);
+  DEBUG_UINT32 ("properties (1.2)", properties, maxDescriptorSetUpdateAfterBindStorageBuffers);
+  DEBUG_UINT32 ("properties (1.2)", properties, maxDescriptorSetUpdateAfterBindStorageBuffersDynamic);
+  DEBUG_UINT32 ("properties (1.2)", properties, maxDescriptorSetUpdateAfterBindSampledImages);
+  DEBUG_UINT32 ("properties (1.2)", properties, maxDescriptorSetUpdateAfterBindStorageImages);
+  DEBUG_UINT32 ("properties (1.2)", properties, maxDescriptorSetUpdateAfterBindInputAttachments);
+/*    VkResolveModeFlags                   supportedDepthResolveModes;
+    VkResolveModeFlags                   supportedStencilResolveModes;*/
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, independentResolveNone);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, independentResolve);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, filterMinmaxSingleComponentFormats);
+  DEBUG_BOOL_STRUCT ("properties (1.2)", properties, filterMinmaxImageComponentMapping);
+  DEBUG_UINT64 ("properties (1.2)", properties, maxTimelineSemaphoreValueDifference);
+  DEBUG_FLAGS ("properties (1.2)", properties, framebufferIntegerColorSampleCounts, sample_count);
+  /* *INDENT-ON* */
+}
+#endif
+
 static gboolean
 physical_device_info (GstVulkanPhysicalDevice * device, GError ** error)
 {
+#if defined (VK_API_VERSION_1_2)
+  GstVulkanPhysicalDevicePrivate *priv = GET_PRIV (device);
+  VkBaseOutStructure *iter;
+#endif
+
   GST_INFO_OBJECT (device, "physical device %i name \'%s\' type \'%s\' "
       "api version %u.%u.%u, driver version %u.%u.%u vendor ID 0x%x, "
       "device ID 0x%x", device->device_index, device->properties.deviceName,
@@ -557,6 +770,20 @@ physical_device_info (GstVulkanPhysicalDevice * device, GError ** error)
   if (!dump_sparse_properties (device, error))
     return FALSE;
 
+#if defined (VK_API_VERSION_1_2)
+  if (gst_vulkan_instance_check_version (device->instance, 1, 2, 0)) {
+    for (iter = (VkBaseOutStructure *) & priv->properties10; iter;
+        iter = iter->pNext) {
+      if (iter->sType ==
+          VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES)
+        dump_properties11 (device, (VkPhysicalDeviceVulkan11Properties *) iter);
+      else if (iter->sType ==
+          VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES)
+        dump_properties12 (device, (VkPhysicalDeviceVulkan12Properties *) iter);
+    }
+  }
+#endif
+
   return TRUE;
 }
 
@@ -564,6 +791,7 @@ static gboolean
 gst_vulkan_physical_device_fill_info (GstVulkanPhysicalDevice * device,
     GError ** error)
 {
+  GstVulkanPhysicalDevicePrivate *priv = GET_PRIV (device);
   VkResult err;
 
   device->device = gst_vulkan_physical_device_get_handle (device);
@@ -609,16 +837,78 @@ gst_vulkan_physical_device_fill_info (GstVulkanPhysicalDevice * device,
   }
 
   vkGetPhysicalDeviceProperties (device->device, &device->properties);
-  vkGetPhysicalDeviceMemoryProperties (device->device,
-      &device->memory_properties);
-  vkGetPhysicalDeviceFeatures (device->device, &device->features);
-  vkGetPhysicalDeviceQueueFamilyProperties (device->device,
-      &device->n_queue_families, NULL);
-  if (device->n_queue_families > 0) {
-    device->queue_family_props =
-        g_new0 (VkQueueFamilyProperties, device->n_queue_families);
+#if defined (VK_API_VERSION_1_2)
+  if (gst_vulkan_instance_check_version (device->instance, 1, 2, 0)) {
+    PFN_vkGetPhysicalDeviceProperties2 get_props2;
+    PFN_vkGetPhysicalDeviceMemoryProperties2 get_mem_props2;
+    PFN_vkGetPhysicalDeviceFeatures2 get_features2;
+    PFN_vkGetPhysicalDeviceQueueFamilyProperties2 get_queue_props2;
+    VkPhysicalDeviceMemoryProperties2 mem_properties10;
+
+    /* *INDENT-OFF* */
+    mem_properties10 = (VkPhysicalDeviceMemoryProperties2) {
+      .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2,
+      .pNext = NULL,
+    };
+    /* *INDENT-ON* */
+
+    get_props2 = (PFN_vkGetPhysicalDeviceProperties2)
+        gst_vulkan_instance_get_proc_address (device->instance,
+        "vkGetPhysicalDeviceProperties2");
+    get_props2 (device->device, &priv->properties10);
+
+    get_mem_props2 = (PFN_vkGetPhysicalDeviceMemoryProperties2)
+        gst_vulkan_instance_get_proc_address (device->instance,
+        "vkGetPhysicalDeviceMemoryProperties2");
+    get_mem_props2 (device->device, &mem_properties10);
+    memcpy (&device->memory_properties, &mem_properties10.memoryProperties,
+        sizeof (device->memory_properties));
+
+    get_features2 = (PFN_vkGetPhysicalDeviceFeatures2)
+        gst_vulkan_instance_get_proc_address (device->instance,
+        "vkGetPhysicalDeviceFeatures2");
+    get_features2 (device->device, &priv->features10);
+    memcpy (&device->features, &priv->features10.features,
+        sizeof (device->features));
+
+    get_queue_props2 = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2)
+        gst_vulkan_instance_get_proc_address (device->instance,
+        "vkGetPhysicalDeviceQueueFamilyProperties2");
+    get_queue_props2 (device->device, &device->n_queue_families, NULL);
+    if (device->n_queue_families > 0) {
+      VkQueueFamilyProperties2 *props;
+      int i;
+
+      props = g_new0 (VkQueueFamilyProperties2, device->n_queue_families);
+      for (i = 0; i < device->n_queue_families; i++) {
+        props[i].sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2;
+        props[i].pNext = NULL;
+      }
+
+      get_queue_props2 (device->device, &device->n_queue_families, props);
+
+      device->queue_family_props =
+          g_new0 (VkQueueFamilyProperties, device->n_queue_families);
+      for (i = 0; i < device->n_queue_families; i++) {
+        memcpy (&device->queue_family_props[i], &props[i].queueFamilyProperties,
+            sizeof (device->queue_family_props[i]));
+      }
+      g_free (props);
+    }
+  } else
+#endif
+  {
+    vkGetPhysicalDeviceMemoryProperties (device->device,
+        &device->memory_properties);
+    vkGetPhysicalDeviceFeatures (device->device, &device->features);
     vkGetPhysicalDeviceQueueFamilyProperties (device->device,
-        &device->n_queue_families, device->queue_family_props);
+        &device->n_queue_families, NULL);
+    if (device->n_queue_families > 0) {
+      device->queue_family_props =
+          g_new0 (VkQueueFamilyProperties, device->n_queue_families);
+      vkGetPhysicalDeviceQueueFamilyProperties (device->device,
+          &device->n_queue_families, device->queue_family_props);
+    }
   }
 
   if (!physical_device_info (device, error))