vkinfo: improve formatting

Change-Id: I30f43d730f3181c27e8f6fb5aeb8a9bae7500f22
(cherry picked from commit 43123c167e5f089196da6aaaf8230b075d95748f)
diff --git a/vulkan/tools/vkinfo.cpp b/vulkan/tools/vkinfo.cpp
index 7b8d72d..5f4253e 100644
--- a/vulkan/tools/vkinfo.cpp
+++ b/vulkan/tools/vkinfo.cpp
@@ -227,14 +227,14 @@
 void PrintExtensions(const std::vector<VkExtensionProperties>& extensions,
                      const char* prefix) {
     for (const auto& e : extensions)
-        printf("%s- %s (v%u)\n", prefix, e.extensionName, e.specVersion);
+        printf("%s%s (v%u)\n", prefix, e.extensionName, e.specVersion);
 }
 
 void PrintGpuInfo(const GpuInfo& info) {
     VkResult result;
     std::ostringstream strbuf;
 
-    printf("  - \"%s\" (%s) %u.%u.%u/%#x [%04x:%04x]\n",
+    printf("  \"%s\" (%s) %u.%u.%u/%#x [%04x:%04x]\n",
            info.properties.deviceName,
            VkPhysicalDeviceTypeStr(info.properties.deviceType),
            ExtractMajorVersion(info.properties.apiVersion),
@@ -247,7 +247,8 @@
         if ((info.memory.memoryHeaps[heap].flags &
              VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) != 0)
             strbuf << "DEVICE_LOCAL";
-        printf("    Heap %u: 0x%" PRIx64 " %s\n", heap,
+        printf("    Heap %u: %" PRIu64 " MiB (0x%" PRIx64 " B) %s\n", heap,
+               info.memory.memoryHeaps[heap].size / 0x1000000,
                info.memory.memoryHeaps[heap].size, strbuf.str().c_str());
         strbuf.str(std::string());
 
@@ -273,18 +274,21 @@
 
     for (uint32_t family = 0; family < info.queue_families.size(); family++) {
         const VkQueueFamilyProperties& qprops = info.queue_families[family];
-        const char* sep = "";
-        int bit, queue_flags = static_cast<int>(qprops.queueFlags);
-        while ((bit = __builtin_ffs(queue_flags)) != 0) {
-            VkQueueFlagBits flag = VkQueueFlagBits(1 << (bit - 1));
-            strbuf << sep << VkQueueFlagBitStr(flag);
-            queue_flags &= ~flag;
-            sep = "+";
-        }
-        printf("    Queue Family %u: %2ux %s timestamps:%ub\n", family,
-               qprops.queueCount, strbuf.str().c_str(),
-               qprops.timestampValidBits);
-        strbuf.str(std::string());
+        VkQueueFlags flags = qprops.queueFlags;
+        char flags_str[5];
+        flags_str[0] = (flags & VK_QUEUE_GRAPHICS_BIT) ? 'G' : '_';
+        flags_str[1] = (flags & VK_QUEUE_COMPUTE_BIT) ? 'C' : '_';
+        flags_str[2] = (flags & VK_QUEUE_TRANSFER_BIT) ? 'T' : '_';
+        flags_str[3] = (flags & VK_QUEUE_SPARSE_BINDING_BIT) ? 'S' : '_';
+        flags_str[4] = '\0';
+        printf(
+            "    Queue Family %u: %ux %s\n"
+            "      timestampValidBits: %ub\n"
+            "      minImageTransferGranularity: (%u,%u,%u)\n",
+            family, qprops.queueCount, flags_str, qprops.timestampValidBits,
+            qprops.minImageTransferGranularity.width,
+            qprops.minImageTransferGranularity.height,
+            qprops.minImageTransferGranularity.depth);
 
         if (!info.extensions.empty()) {
             printf("    Extensions [%zu]:\n", info.extensions.size());
@@ -318,15 +322,13 @@
         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,
+            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], "       ");
+                PrintExtensions(info.layer_extensions[i], "    ");
             }
         }
     }