VkExtensionProperties *extension_properties;
};
-struct SurfaceExtensionInfo {
+struct SurfaceExtensionNode {
+ struct SurfaceExtensionNode *next;
+
const char *name;
void (*create_window)(struct AppInstance *);
VkSurfaceKHR (*create_surface)(struct AppInstance *);
void (*destroy_window)(struct AppInstance *);
VkSurfaceKHR surface;
+ VkBool32 supports_present;
};
struct AppInstance {
PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR vkGetPhysicalDeviceSurfaceCapabilities2KHR;
PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT vkGetPhysicalDeviceSurfaceCapabilities2EXT;
- int surface_ext_infos_reserve, surface_ext_infos_count;
- struct SurfaceExtensionInfo *surface_ext_infos;
+ struct SurfaceExtensionNode *surface_ext_infos_root;
int width, height;
AppLoadInstanceCommands(inst);
- inst->surface_ext_infos_reserve = 10;
- inst->surface_ext_infos = malloc(inst->surface_ext_infos_reserve * sizeof(struct SurfaceExtensionInfo));
- inst->surface_ext_infos_count = 0;
+ inst->surface_ext_infos_root = NULL;
}
static void AppDestroyInstance(struct AppInstance *inst) {
- free(inst->surface_ext_infos);
free(inst->global_extensions);
for (uint32_t i = 0; i < inst->global_layer_count; ++i) {
free(inst->global_layers[i].extension_properties);
}
static void AppDumpSurfaceExtension(struct AppInstance *inst, struct AppGpu *gpus, uint32_t gpu_count,
- struct SurfaceExtensionInfo *surface_extension, int *format_count, int *present_mode_count,
+ struct SurfaceExtensionNode *surface_extension, int *format_count, int *present_mode_count,
FILE *out) {
if (!CheckExtensionEnabled(surface_extension->name, inst->inst_extensions, inst->inst_extensions_count)) {
return;
props = *props_const;
}
- VkBool32 *supports_present = calloc(gpu->inst->surface_ext_infos_count, sizeof(VkBool32));
- ;
- for (int i = 0; i < gpu->inst->surface_ext_infos_count; ++i) {
- VkResult err =
- vkGetPhysicalDeviceSurfaceSupportKHR(gpu->obj, id, gpu->inst->surface_ext_infos[i].surface, &supports_present[i]);
+ for (struct SurfaceExtensionNode *sen = gpu->inst->surface_ext_infos_root; sen != NULL; sen = sen->next) {
+ VkResult err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu->obj, id, sen->surface, &sen->supports_present);
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);
- for (int i = 0; i < gpu->inst->surface_ext_infos_count; ++i) {
+ for (struct SurfaceExtensionNode *sen = gpu->inst->surface_ext_infos_root; sen != NULL; sen = sen->next) {
fprintf(out, "\t\t\t\t\t\t<details><summary>present support(%s) = <div class='val'>%s</div></summary></details>\n",
- gpu->inst->surface_ext_infos[i].name, supports_present[i] ? "true" : "false");
+ sen->name, sen->supports_present ? "true" : "false");
}
fprintf(out, "\t\t\t\t\t</details>\n");
} else if (human_readable_output) {
printf("\ttimestampValidBits = %u\n", props.timestampValidBits);
printf("\tminImageTransferGranularity = (%d, %d, %d)\n", props.minImageTransferGranularity.width,
props.minImageTransferGranularity.height, props.minImageTransferGranularity.depth);
- for (int i = 0; i < gpu->inst->surface_ext_infos_count; ++i) {
- printf("\tpresent support(%s) = %s\n", gpu->inst->surface_ext_infos[i].name, supports_present ? "true" : "false");
+ for (struct SurfaceExtensionNode *sen = gpu->inst->surface_ext_infos_root; sen != NULL; sen = sen->next) {
+ printf("\tpresent support(%s) = %s\n", sen->name, sen->supports_present ? "true" : "false");
}
}
if (json_output) {
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);
- for (int i = 0; i < gpu->inst->surface_ext_infos_count; ++i) {
- printf("\t\t\t\"present_support(%s)\": %s\n", gpu->inst->surface_ext_infos[i].name,
- supports_present ? "\"true\"" : "\"false\"");
+ for (struct SurfaceExtensionNode *sen = gpu->inst->surface_ext_infos_root; sen != NULL; sen = sen->next) {
+ printf("\t\t\t\"present_support(%s)\": %s\n", sen->name, sen->supports_present ? "\"true\"" : "\"false\"");
}
printf("\t\t}");
}
//--WIN32--
#ifdef VK_USE_PLATFORM_WIN32_KHR
- struct SurfaceExtensionInfo surface_ext_win32;
+ struct SurfaceExtensionNode surface_ext_win32;
surface_ext_win32.name = VK_KHR_WIN32_SURFACE_EXTENSION_NAME;
surface_ext_win32.create_window = AppCreateWin32Window;
surface_ext_win32.create_surface = AppCreateWin32Surface;
surface_ext_win32.destroy_window = AppDestroyWin32Window;
- ++inst.surface_ext_infos_count;
- assert(inst.surface_ext_infos_count <= inst.surface_ext_infos_reserve);
- inst.surface_ext_infos[inst.surface_ext_infos_count - 1] = surface_ext_win32;
+ surface_ext_win32.next = inst.surface_ext_infos_root;
+ inst.surface_ext_infos_root = &surface_ext_win32;
#endif
//--XCB--
#ifdef VK_USE_PLATFORM_XCB_KHR
- struct SurfaceExtensionInfo surface_ext_xcb;
+ struct SurfaceExtensionNode surface_ext_xcb;
surface_ext_xcb.name = VK_KHR_XCB_SURFACE_EXTENSION_NAME;
surface_ext_xcb.create_window = AppCreateXcbWindow;
surface_ext_xcb.create_surface = AppCreateXcbSurface;
surface_ext_xcb.destroy_window = AppDestroyXcbWindow;
if (has_display) {
- ++inst.surface_ext_infos_count;
- assert(inst.surface_ext_infos_count <= inst.surface_ext_infos_reserve);
- inst.surface_ext_infos[inst.surface_ext_infos_count - 1] = surface_ext_xcb;
+ surface_ext_xcb.next = inst.surface_ext_infos_root;
+ inst.surface_ext_infos_root = &surface_ext_xcb;
}
#endif
//--XLIB--
#ifdef VK_USE_PLATFORM_XLIB_KHR
- struct SurfaceExtensionInfo surface_ext_xlib;
+ struct SurfaceExtensionNode surface_ext_xlib;
surface_ext_xlib.name = VK_KHR_XLIB_SURFACE_EXTENSION_NAME;
surface_ext_xlib.create_window = AppCreateXlibWindow;
surface_ext_xlib.create_surface = AppCreateXlibSurface;
surface_ext_xlib.destroy_window = AppDestroyXlibWindow;
if (has_display) {
- ++inst.surface_ext_infos_count;
- assert(inst.surface_ext_infos_count <= inst.surface_ext_infos_reserve);
- inst.surface_ext_infos[inst.surface_ext_infos_count - 1] = surface_ext_xlib;
+ surface_ext_xlib.next = inst.surface_ext_infos_root;
+ inst.surface_ext_infos_root = &surface_ext_xlib;
}
#endif
//--MACOS--
#ifdef VK_USE_PLATFORM_MACOS_MVK
- struct SurfaceExtensionInfo surface_ext_macos;
+ struct SurfaceExtensionNode surface_ext_macos;
surface_ext_macos.name = VK_MVK_MACOS_SURFACE_EXTENSION_NAME;
surface_ext_macos.create_window = AppCreateMacOSWindow;
surface_ext_macos.create_surface = AppCreateMacOSSurface;
surface_ext_macos.destroy_window = AppDestroyMacOSWindow;
- ++inst.surface_ext_infos_count;
- assert(inst.surface_ext_infos_count <= inst.surface_ext_infos_reserve);
- inst.surface_ext_infos[inst.surface_ext_infos_count - 1] = surface_ext_macos;
+ surface_ext_macos.next = inst.surface_ext_infos_root;
+ inst.surface_ext_infos_root = &surface_ext_macos;
#endif
//--WAYLAND--
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
- struct SurfaceExtensionInfo surface_ext_wayland;
+ struct SurfaceExtensionNode surface_ext_wayland;
surface_ext_wayland.name = VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME;
surface_ext_wayland.create_window = AppCreateWaylandWindow;
surface_ext_wayland.create_surface = AppCreateWaylandSurface;
surface_ext_wayland.destroy_window = AppDestroyWaylandWindow;
if (has_wayland_display) {
- ++inst.surface_ext_infos_count;
- assert(inst.surface_ext_infos_count <= inst.surface_ext_infos_reserve);
- inst.surface_ext_infos[inst.surface_ext_infos_count - 1] = surface_ext_wayland;
+ surface_ext_wayland.next = inst.surface_ext_infos_root;
+ inst.surface_ext_infos_root = &surface_ext_wayland;
}
#endif
// TODO: Android
- for (int i = 0; i < inst.surface_ext_infos_count; ++i) {
- inst.surface_ext_infos[i].create_window(&inst);
- inst.surface_ext_infos[i].surface = inst.surface_ext_infos[i].create_surface(&inst);
- AppDumpSurfaceExtension(&inst, gpus, gpu_count, &inst.surface_ext_infos[i], &format_count, &present_mode_count, out);
+ for (struct SurfaceExtensionNode *sen = inst.surface_ext_infos_root; sen != NULL; sen = sen->next) {
+ sen->create_window(&inst);
+ sen->surface = sen->create_surface(&inst);
+ AppDumpSurfaceExtension(&inst, gpus, gpu_count, sen, &format_count, &present_mode_count, out);
}
- if (inst.surface_ext_infos_count == 0) {
+ if (!inst.surface_ext_infos_root) {
if (html_output) {
fprintf(out, "\t\t\t\t<details><summary>None found</summary></details>\n");
} else if (human_readable_output) {
free(gpus);
free(objs);
- for (int i = 0; i < inst.surface_ext_infos_count; ++i) {
- AppDestroySurface(&inst, inst.surface_ext_infos[i].surface);
- inst.surface_ext_infos[i].destroy_window(&inst);
+ for (struct SurfaceExtensionNode *sen = inst.surface_ext_infos_root; sen != NULL; sen = sen->next) {
+ AppDestroySurface(&inst, sen->surface);
+ sen->destroy_window(&inst);
}
AppDestroyInstance(&inst);