diff options
| -rw-r--r-- | vulkaninfo/vulkaninfo.c | 83 |
1 files changed, 72 insertions, 11 deletions
diff --git a/vulkaninfo/vulkaninfo.c b/vulkaninfo/vulkaninfo.c index e5b3bb2d..b6463b20 100644 --- a/vulkaninfo/vulkaninfo.c +++ b/vulkaninfo/vulkaninfo.c @@ -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) { |
