libvulkan: Enumerate device layers

Change-Id: I7623eab3d8bb958470437998ba603ac1171d764c
(cherry picked from commit eab7505b0741dc5c062df889a7ca5db1a9e619e8)
diff --git a/vulkan/tools/vkinfo.cpp b/vulkan/tools/vkinfo.cpp
index b73e987..71f989e 100644
--- a/vulkan/tools/vkinfo.cpp
+++ b/vulkan/tools/vkinfo.cpp
@@ -255,6 +255,27 @@
         printf("%s%s (v%u)\n", prefix, e.extensionName, e.specVersion);
 }
 
+void PrintLayers(
+    const std::vector<VkLayerProperties>& layers,
+    const std::vector<std::vector<VkExtensionProperties>> extensions,
+    const char* prefix) {
+    std::string ext_prefix(prefix);
+    ext_prefix.append("    ");
+    for (size_t i = 0; i < layers.size(); i++) {
+        printf(
+            "%s%s %u.%u.%u/%u\n"
+            "%s  %s\n",
+            prefix, layers[i].layerName,
+            ExtractMajorVersion(layers[i].specVersion),
+            ExtractMinorVersion(layers[i].specVersion),
+            ExtractPatchVersion(layers[i].specVersion),
+            layers[i].implementationVersion, prefix, layers[i].description);
+        if (!extensions[i].empty())
+            printf("%s  Extensions [%zu]:\n", prefix, extensions[i].size());
+        PrintExtensions(extensions[i], ext_prefix.c_str());
+    }
+}
+
 void PrintGpuInfo(const GpuInfo& info) {
     VkResult result;
     std::ostringstream strbuf;
@@ -321,19 +342,7 @@
         }
         if (!info.layers.empty()) {
             printf("    Layers [%zu]:\n", info.layers.size());
-            for (size_t i = 0; i < info.layers.size(); i++) {
-                const auto& layer = info.layers[i];
-                printf("    - %s %u.%u.%u/%u \"%s\"\n", layer.layerName,
-                       ExtractMajorVersion(layer.specVersion),
-                       ExtractMinorVersion(layer.specVersion),
-                       ExtractPatchVersion(layer.specVersion),
-                       layer.implementationVersion, layer.description);
-                if (!info.layer_extensions[i].empty()) {
-                    printf("       Extensions [%zu]:\n",
-                           info.layer_extensions.size());
-                    PrintExtensions(info.layer_extensions[i], "       ");
-                }
-            }
+            PrintLayers(info.layers, info.layer_extensions, "      ");
         }
     }
 }
@@ -345,17 +354,7 @@
     PrintExtensions(info.extensions, "  ");
     if (!info.layers.empty()) {
         printf("Instance Layers [%zu]:\n", info.layers.size());
-        for (size_t i = 0; i < info.layers.size(); i++) {
-            const auto& layer = info.layers[i];
-            printf("  %s %u.%u.%u/%u \"%s\"\n", layer.layerName,
-                   ExtractMajorVersion(layer.specVersion),
-                   ExtractMinorVersion(layer.specVersion),
-                   ExtractPatchVersion(layer.specVersion),
-                   layer.implementationVersion, layer.description);
-            if (!info.layer_extensions[i].empty()) {
-                PrintExtensions(info.layer_extensions[i], "    ");
-            }
-        }
+        PrintLayers(info.layers, info.layer_extensions, "  ");
     }
 
     printf("PhysicalDevices [%zu]:\n", info.gpus.size());