/** @file Vulkan WSI; YASL tracks the WSI handle, the application owns rendering. */ #ifndef YASL_VULKAN_H #define YASL_VULKAN_H #include "yasl/yasl.h" #include #ifdef __cplusplus extern "C" { #endif YASL_API int yasl_vulkan_init(PFN_vkGetInstanceProcAddr loader); struct yasl_vulkan_requirements { const char *const *extensions; uint32_t extension_count; VkInstanceCreateFlags flags; }; /** Initialize the loader first. Borrowed extensions live through shutdown; * merge them with application extensions before creating the instance. * Clears out on failure. */ YASL_API int yasl_vulkan_get_requirements(const yasl_surface *surface, struct yasl_vulkan_requirements *out); /** WSI creation retains VkResult semantics. Uses the injected loader. * One live VkSurfaceKHR per window; destroy it with yasl_vulkan_destroy_surface * before destroying the YASL surface. The application owns swapchains/devices. */ YASL_API VkResult yasl_vulkan_create_surface(yasl_surface *surface, VkInstance instance, const VkAllocationCallbacks *allocator, VkSurfaceKHR *out); /** Destroy the WSI surface (including while disconnected), releasing the window * for another renderer. Destroy dependent swapchains first. Uses the instance * and allocation callbacks recorded at creation. No live WSI surface is a no-op. */ YASL_API int yasl_vulkan_destroy_surface(yasl_surface *surface); #ifdef __cplusplus } #endif #endif