VkExtensionProperties *extension_properties;
};
+struct SurfaceNameWHandle {
+ const char *name;
+ VkSurfaceKHR surface;
+ struct SurfaceNameWHandle *pNextSurface;
+ VkBool32 present_support;
+};
+
struct AppInstance {
VkInstance instance;
uint32_t instance_version;
VkSharedPresentSurfaceCapabilitiesKHR shared_surface_capabilities;
VkSurfaceCapabilities2EXT surface_capabilities2_ext;
+ struct SurfaceNameWHandle *surface_chain;
VkSurfaceKHR surface;
int width, height;
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,
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----------------------------
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);
printf("\n");
}
}
+ inst->surface = VK_NULL_HANDLE;
surface_extension->destroy_window(inst);
}
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);
}
"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");
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");
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}");
}
.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,
free(gpus);
free(objs);
- AppDestroySurface(&inst);
+ AppDestroySurfaceChain(&inst);
AppDestroyInstance(&inst);
if (html_output) {