diff options
-rw-r--r-- | src/vulkan/wsi/wsi_common_wayland.c | 57 |
1 files changed, 36 insertions, 21 deletions
diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c index 15dc84c87c4..4c94cd60a54 100644 --- a/src/vulkan/wsi/wsi_common_wayland.c +++ b/src/vulkan/wsi/wsi_common_wayland.c @@ -263,59 +263,72 @@ wsi_wl_display_finish(struct wsi_wl_display *display) wl_event_queue_destroy(display->queue); } -static int +static VkResult wsi_wl_display_init(struct wsi_wayland *wsi_wl, struct wsi_wl_display *display, struct wl_display *wl_display, bool get_format_list) { + VkResult result = VK_SUCCESS; memset(display, 0, sizeof(*display)); display->wsi_wl = wsi_wl; display->wl_display = wl_display; if (get_format_list) { - if (!u_vector_init(&display->formats, sizeof(VkFormat), 8)) + if (!u_vector_init(&display->formats, sizeof(VkFormat), 8)) { + result = VK_ERROR_OUT_OF_HOST_MEMORY; goto fail; + } } display->queue = wl_display_create_queue(wl_display); - if (!display->queue) + if (!display->queue) { + result = VK_ERROR_OUT_OF_HOST_MEMORY; goto fail; + } display->wl_display_wrapper = wl_proxy_create_wrapper(wl_display); - if (!display->wl_display_wrapper) + if (!display->wl_display_wrapper) { + result = VK_ERROR_OUT_OF_HOST_MEMORY; goto fail; + } wl_proxy_set_queue((struct wl_proxy *) display->wl_display_wrapper, display->queue); struct wl_registry *registry = wl_display_get_registry(display->wl_display_wrapper); - if (!registry) + if (!registry) { + result = VK_ERROR_OUT_OF_HOST_MEMORY; goto fail; + } wl_registry_add_listener(registry, ®istry_listener, display); /* Round-trip to get the wl_drm global */ wl_display_roundtrip_queue(display->wl_display, display->queue); - if (!display->drm) + if (!display->drm) { + result = VK_ERROR_SURFACE_LOST_KHR; goto fail_registry; + } /* Round-trip to get wl_drm formats and capabilities */ wl_display_roundtrip_queue(display->wl_display, display->queue); /* We need prime support */ - if (!(display->capabilities & WL_DRM_CAPABILITY_PRIME)) + if (!(display->capabilities & WL_DRM_CAPABILITY_PRIME)) { + result = VK_ERROR_SURFACE_LOST_KHR; goto fail_registry; + } /* We don't need this anymore */ wl_registry_destroy(registry); display->refcount = 0; - return 0; + return VK_SUCCESS; fail_registry: if (registry) @@ -323,26 +336,29 @@ fail_registry: fail: wsi_wl_display_finish(display); - return -1; + return result; } -static struct wsi_wl_display * -wsi_wl_display_create(struct wsi_wayland *wsi, struct wl_display *wl_display) +static VkResult +wsi_wl_display_create(struct wsi_wayland *wsi, struct wl_display *wl_display, + struct wsi_wl_display **display_out) { struct wsi_wl_display *display = vk_alloc(wsi->alloc, sizeof(*display), 8, VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); if (!display) - return NULL; + return VK_ERROR_OUT_OF_HOST_MEMORY; - if (wsi_wl_display_init(wsi, display, wl_display, true)) { + VkResult result = wsi_wl_display_init(wsi, display, wl_display, true); + if (result != VK_SUCCESS) { vk_free(wsi->alloc, display); - return NULL; + return result; } display->refcount++; + *display_out = display; - return display; + return result; } static struct wsi_wl_display * @@ -841,16 +857,15 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, struct wsi_wl_swapchain *old_chain = (void *)pCreateInfo->oldSwapchain; chain->display = wsi_wl_display_ref(old_chain->display); } else { - chain->display = wsi_wl_display_create(wsi, surface->display); - if (!chain->display) { - result = VK_ERROR_INITIALIZATION_FAILED; + chain->display = NULL; + result = wsi_wl_display_create(wsi, surface->display, &chain->display); + if (result != VK_SUCCESS) goto fail; - } } chain->surface = wl_proxy_create_wrapper(surface->surface); if (!chain->surface) { - result = VK_ERROR_INITIALIZATION_FAILED; + result = VK_ERROR_OUT_OF_HOST_MEMORY; goto fail; } wl_proxy_set_queue((struct wl_proxy *) chain->surface, @@ -859,7 +874,7 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, chain->drm_wrapper = wl_proxy_create_wrapper(chain->display->drm); if (!chain->drm_wrapper) { - result = VK_ERROR_INITIALIZATION_FAILED; + result = VK_ERROR_OUT_OF_HOST_MEMORY; goto fail; } wl_proxy_set_queue((struct wl_proxy *) chain->drm_wrapper, |