From 1ab3e5a123109704789c2768e11a4f9af515821d Mon Sep 17 00:00:00 2001 From: Berke Güzel Date: Wed, 14 Oct 2026 13:13:52 +0300 Subject: Redefine public and rendering APIs with explicit contracts --- tests/common/test_vulkan.c | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) (limited to 'tests/common/test_vulkan.c') diff --git a/tests/common/test_vulkan.c b/tests/common/test_vulkan.c index 12daa22..b12256a 100644 --- a/tests/common/test_vulkan.c +++ b/tests/common/test_vulkan.c @@ -41,29 +41,32 @@ static int run_test(enum yasl_backend backend) VkSemaphore acquired = VK_NULL_HANDLE, rendered = VK_NULL_HANDLE; VkCommandBuffer command = VK_NULL_HANDLE; - if (!yasl_set_backend(backend)) { + if ((yasl_init(&(struct yasl_options){.backend=backend}) < 0)) { fprintf(stderr, "vulkan integration: cannot select requested backend %d (YASL error %d)\n", - backend, yasl_get_error(NULL)); + backend, errno); goto cleanup; } - if (!yasl_vulkan_init(vkGetInstanceProcAddr)) { + if ((yasl_vulkan_init(vkGetInstanceProcAddr) < 0)) { fprintf(stderr, "vulkan integration: loader initialization failed (YASL error %d)\n", - yasl_get_error(NULL)); + errno); goto cleanup; } - surface = yasl_surface_create("yasl Vulkan WSI integration", 256, 192, 0); + surface = yasl_surface_create(&(struct yasl_surface_options){.title="yasl Vulkan WSI integration", .width=256, .height=192, .type=YASL_SURFACE_NATIVE, .flags=0}); if (!surface) { fprintf(stderr, "vulkan integration: surface creation failed (YASL error %d)\n", - yasl_get_error(NULL)); + errno); goto cleanup; } - if (!(yasl_surface_features(surface) & YASL_CAP_VULKAN)) { + if (!(yasl_surface_get_features(surface) & YASL_CAP_VULKAN)) { fprintf(stderr, "vulkan integration: requested backend does not advertise Vulkan WSI\n"); goto cleanup; } uint32_t extension_count = 0; - const char *const *required = yasl_vulkan_instance_extensions(surface, &extension_count); + struct yasl_vulkan_requirements requirements; + if (yasl_vulkan_get_requirements(surface, &requirements) < 0) goto cleanup; + extension_count = requirements.extension_count; + const char *const *required = requirements.extensions; if (!required || !extension_count) { fprintf(stderr, "vulkan integration: surface returned no required instance extensions\n"); goto cleanup; @@ -99,7 +102,7 @@ static int run_test(enum yasl_backend backend) VkInstanceCreateInfo instance_info = { .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, .pApplicationInfo = &app, - .flags = yasl_vulkan_instance_flags(surface), + .flags = requirements.flags, .enabledExtensionCount = extension_count, .ppEnabledExtensionNames = required, }; @@ -108,6 +111,18 @@ static int run_test(enum yasl_backend backend) vr = yasl_vulkan_create_surface(surface, instance, NULL, &vk_surface); if (vr != VK_SUCCESS) { status = fail_vk("yasl_vulkan_create_surface", vr); goto cleanup; } + VkSurfaceKHR duplicate = VK_NULL_HANDLE; + if (yasl_vulkan_create_surface(surface, instance, NULL, &duplicate) != VK_ERROR_NATIVE_WINDOW_IN_USE_KHR || + duplicate != VK_NULL_HANDLE || yasl_surface_destroy(surface) != -EBUSY || + yasl_shutdown() != -EBUSY || yasl_vulkan_init(vkGetInstanceProcAddr) != -EBUSY) { + fprintf(stderr, "vulkan integration: live WSI ownership was not enforced\n"); + goto cleanup; + } + if (yasl_vulkan_destroy_surface(surface) != 0 || yasl_vulkan_destroy_surface(surface) != 0) goto cleanup; + vk_surface = VK_NULL_HANDLE; + vr = yasl_vulkan_create_surface(surface, instance, NULL, &vk_surface); + if (vr != VK_SUCCESS) { status = fail_vk("recreate Vulkan surface", vr); goto cleanup; } + uint32_t physical_count = 0; vr = vkEnumeratePhysicalDevices(instance, &physical_count, NULL); if (vr != VK_SUCCESS || !physical_count) { @@ -365,7 +380,7 @@ cleanup: if (command_pool) vkDestroyCommandPool(device, command_pool, NULL); if (swapchain) vkDestroySwapchainKHR(device, swapchain, NULL); if (device) vkDestroyDevice(device, NULL); - if (vk_surface) vkDestroySurfaceKHR(instance, vk_surface, NULL); + if (vk_surface) yasl_vulkan_destroy_surface(surface); if (instance) vkDestroyInstance(instance, NULL); if (surface) yasl_surface_destroy(surface); yasl_shutdown(); -- cgit v1.2.3