vulkaninfo: Fix Issue 136
authorJeremy Kniager <jeremyk@lunarg.com>
Mon, 25 Feb 2019 20:29:36 +0000 (13:29 -0700)
committerjeremyk-lunarg <jeremyk@lunarg.com>
Tue, 5 Mar 2019 16:19:20 +0000 (09:19 -0700)
Added listing for all present extensions and
listing for present support for each extension on
GPU queue families.

Change-Id: I3ad18bb346ff50b6dfa141cebb58155f59fd754c

vulkaninfo/vulkaninfo.c

index e5b3bb2..b6463b2 100644 (file)
@@ -112,6 +112,13 @@ struct LayerExtensionList {
     VkExtensionProperties *extension_properties;
 };
 
+struct SurfaceNameWHandle {
+    const char *name;
+    VkSurfaceKHR surface;
+    struct SurfaceNameWHandle *pNextSurface;
+    VkBool32 present_support;
+};
+
 struct AppInstance {
     VkInstance instance;
     uint32_t instance_version;
@@ -146,6 +153,7 @@ struct AppInstance {
     VkSharedPresentSurfaceCapabilitiesKHR shared_surface_capabilities;
     VkSurfaceCapabilities2EXT surface_capabilities2_ext;
 
+    struct SurfaceNameWHandle *surface_chain;
     VkSurfaceKHR surface;
     int width, height;
 
@@ -860,6 +868,8 @@ static void AppCreateInstance(struct AppInstance *inst) {
     inst->vulkan_minor = VK_VERSION_MINOR(inst->instance_version);
     inst->vulkan_patch = VK_VERSION_PATCH(VK_HEADER_VERSION);
 
+    inst->surface_chain = NULL;
+
     AppGetInstanceExtensions(inst);
 
     const VkDebugReportCallbackCreateInfoEXT dbg_info = {.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT,
@@ -1153,6 +1163,13 @@ static void AppDestroyWin32Window(struct AppInstance *inst) { DestroyWindow(inst
 static void AppDestroySurface(struct AppInstance *inst) {  // same for all platforms
     vkDestroySurfaceKHR(inst->instance, inst->surface, NULL);
 }
+
+static void AppDestroySurfaceChain(struct AppInstance *inst) {  // same for all platforms
+    for (struct SurfaceNameWHandle *surface_stuff = inst->surface_chain; surface_stuff != NULL;
+         surface_stuff = surface_stuff->pNextSurface) {
+        vkDestroySurfaceKHR(inst->instance, surface_stuff->surface, NULL);
+    }
+}
 #endif
 
 //----------------------------XCB----------------------------
@@ -1912,9 +1929,29 @@ static void AppDumpSurfaceExtension(struct AppInstance *inst, struct AppGpu *gpu
         return;
     }
 
+    if (inst->surface) {
+        AppDestroySurface(inst);
+    }
+
     surface_extension->create_window(inst);
+    surface_extension->create_surface(inst);
+
+    struct SurfaceNameWHandle *cur = inst->surface_chain;
+    if (cur == NULL) {
+        cur = (struct SurfaceNameWHandle *)malloc(sizeof(struct SurfaceNameWHandle));
+        inst->surface_chain = cur;
+    } else {
+        for (; cur->pNextSurface != NULL; cur = cur->pNextSurface) {
+        }
+        cur->pNextSurface = (struct SurfaceNameWHandle *)malloc(sizeof(struct SurfaceNameWHandle));
+        cur = cur->pNextSurface;
+    }
+    cur->name = surface_extension->name;
+    cur->surface = inst->surface;
+    cur->pNextSurface = NULL;
+    cur->present_support = VK_FALSE;
+
     for (uint32_t i = 0; i < gpu_count; ++i) {
-        surface_extension->create_surface(inst);
         if (html_output) {
             fprintf(out, "\t\t\t\t<details><summary>GPU id : <div class='val'>%u</div> (%s)</summary>\n", i,
                     gpus[i].props.deviceName);
@@ -1934,6 +1971,7 @@ static void AppDumpSurfaceExtension(struct AppInstance *inst, struct AppGpu *gpu
             printf("\n");
         }
     }
+    inst->surface = VK_NULL_HANDLE;
     surface_extension->destroy_window(inst);
 }
 
@@ -4460,9 +4498,9 @@ static void AppGpuDumpQueueProps(const struct AppGpu *gpu, uint32_t id, FILE *ou
         props = *props_const;
     }
 
-    VkBool32 supports_present = VK_FALSE;
-    if (gpu->inst->surface) {
-        VkResult err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu->obj, id, gpu->inst->surface, &supports_present);
+    for (struct SurfaceNameWHandle *surface_stuff = gpu->inst->surface_chain; surface_stuff != NULL;
+         surface_stuff = surface_stuff->pNextSurface) {
+        VkResult err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu->obj, id, surface_stuff->surface, &surface_stuff->present_support);
         if (err) ERR_EXIT(err);
     }
 
@@ -4504,8 +4542,13 @@ static void AppGpuDumpQueueProps(const struct AppGpu *gpu, uint32_t id, FILE *ou
                 "class='val'>%d</div>, <div class='val'>%d</div>)</summary></details>\n",
                 props.minImageTransferGranularity.width, props.minImageTransferGranularity.height,
                 props.minImageTransferGranularity.depth);
-        fprintf(out, "\t\t\t\t\t\t<details><summary>present support    = <div class='val'>%s</div></summary></details>\n",
-                supports_present ? "true" : "false");
+        fprintf(out, "\t\t\t\t\t\t<details><summary>present support</summary>\n");
+        for (struct SurfaceNameWHandle *surface_stuff = gpu->inst->surface_chain; surface_stuff != NULL;
+             surface_stuff = surface_stuff->pNextSurface) {
+            fprintf(out, "\t\t\t\t\t\t\t<details><summary>%s = <div class='val'>%s</div></summary></details>\n",
+                    surface_stuff->name, surface_stuff->present_support ? "true" : "false");
+        }
+        fprintf(out, "\t\t\t\t\t\t</details>\n");
         fprintf(out, "\t\t\t\t\t</details>\n");
     } else if (human_readable_output) {
         printf("\n");
@@ -4513,7 +4556,11 @@ static void AppGpuDumpQueueProps(const struct AppGpu *gpu, uint32_t id, FILE *ou
         printf("\ttimestampValidBits = %u\n", props.timestampValidBits);
         printf("\tminImageTransferGranularity = (%d, %d, %d)\n", props.minImageTransferGranularity.width,
                props.minImageTransferGranularity.height, props.minImageTransferGranularity.depth);
-        printf("\tpresent support    = %s\n", supports_present ? "true" : "false");
+        printf("\tpresent support:\n");
+        for (struct SurfaceNameWHandle *surface_stuff = gpu->inst->surface_chain; surface_stuff != NULL;
+             surface_stuff = surface_stuff->pNextSurface) {
+            printf("\t\t%s = %s\n", surface_stuff->name, surface_stuff->present_support ? "true" : "false");
+        }
     }
     if (json_output) {
         printf("\t\t{\n");
@@ -4525,7 +4572,16 @@ static void AppGpuDumpQueueProps(const struct AppGpu *gpu, uint32_t id, FILE *ou
         printf("\t\t\t\"queueCount\": %u,\n", props.queueCount);
         printf("\t\t\t\"queueFlags\": %u,\n", props.queueFlags);
         printf("\t\t\t\"timestampValidBits\": %u,\n", props.timestampValidBits);
-        printf("\t\t\t\"present_support\": %s\n", supports_present ? "\"true\"" : "\"false\"");
+        printf("\t\t\t\"present_support\": {\n");
+        for (struct SurfaceNameWHandle *surface_stuff = gpu->inst->surface_chain; surface_stuff != NULL;
+             surface_stuff = surface_stuff->pNextSurface) {
+            if (surface_stuff->pNextSurface) {
+                printf("\t\t\t\t\"%s\" : %u,\n", surface_stuff->name, surface_stuff->present_support);
+            } else {
+                printf("\t\t\t\t\"%s\" : %u\n", surface_stuff->name, surface_stuff->present_support);
+            }
+        }
+        printf("\t\t\t}\n");
         printf("\t\t}");
     }
 
@@ -4846,8 +4902,13 @@ static void AppGroupDump(const VkPhysicalDeviceGroupProperties *group, const uin
                                               .physicalDeviceCount = group->physicalDeviceCount,
                                               .pPhysicalDevices = group->physicalDevices};
 
-    VkDeviceQueueCreateInfo q_ci = {
-        .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, .pNext = NULL, .queueFamilyIndex = 0, .queueCount = 1};
+    float queue_priority = 1.0f;
+
+    VkDeviceQueueCreateInfo q_ci = {.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
+                                    .pNext = NULL,
+                                    .queueFamilyIndex = 0,
+                                    .queueCount = 1,
+                                    .pQueuePriorities = &queue_priority};
 
     VkDeviceCreateInfo device_ci = {.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
                                     .pNext = &dg_ci,
@@ -5346,7 +5407,7 @@ int main(int argc, char **argv) {
     free(gpus);
     free(objs);
 
-    AppDestroySurface(&inst);
+    AppDestroySurfaceChain(&inst);
     AppDestroyInstance(&inst);
 
     if (html_output) {