From e95b6932eb1af7bdb12df31c229963b0c7112803 Mon Sep 17 00:00:00 2001 From: Jakob Bornecrantz <jakob@collabora.com> Date: Fri, 25 Aug 2023 14:27:51 +0100 Subject: [PATCH] c/main: Use more enumeration helpers --- src/xrt/compositor/main/comp_window_direct.c | 63 ++++++++++--------- .../main/comp_window_direct_nvidia.c | 24 ++++--- .../compositor/main/comp_window_vk_display.c | 24 +++---- 3 files changed, 56 insertions(+), 55 deletions(-) diff --git a/src/xrt/compositor/main/comp_window_direct.c b/src/xrt/compositor/main/comp_window_direct.c index 316b3bd94..5de189c6a 100644 --- a/src/xrt/compositor/main/comp_window_direct.c +++ b/src/xrt/compositor/main/comp_window_direct.c @@ -79,28 +79,35 @@ comp_window_direct_get_primary_display_mode(struct comp_target_swapchain *cts, V { struct vk_bundle *vk = get_vk(cts); struct comp_target *ct = &cts->base; - uint32_t mode_count; + VkDisplayModePropertiesKHR *mode_properties = NULL; + uint32_t mode_count = 0; VkResult ret; - ret = vk->vkGetDisplayModePropertiesKHR(vk->physical_device, display, &mode_count, NULL); + // Get plane properties + ret = vk_enumerate_display_mode_properties( // + vk, // + vk->physical_device, // + display, // + &mode_count, // + &mode_properties); // if (ret != VK_SUCCESS) { - COMP_ERROR(ct->c, "vkGetDisplayModePropertiesKHR: %s", vk_result_string(ret)); + COMP_ERROR(ct->c, "vk_enumerate_display_mode_properties: %s", vk_result_string(ret)); return VK_NULL_HANDLE; } + + /* + * Debug information. + */ + COMP_DEBUG(ct->c, "Found %d modes", mode_count); - - VkDisplayModePropertiesKHR *mode_properties = U_TYPED_ARRAY_CALLOC(VkDisplayModePropertiesKHR, mode_count); - ret = vk->vkGetDisplayModePropertiesKHR(vk->physical_device, display, &mode_count, mode_properties); - if (ret != VK_SUCCESS) { - COMP_ERROR(ct->c, "vkGetDisplayModePropertiesKHR: %s", vk_result_string(ret)); - free(mode_properties); - return VK_NULL_HANDLE; - } - print_modes(ct, mode_properties, mode_count); + /* + * Select the mode. + */ + int chosen_mode = 0; int desired_mode = ct->c->settings.desired_mode; @@ -157,33 +164,29 @@ comp_window_direct_create_surface(struct comp_target_swapchain *cts, uint32_t height) { struct vk_bundle *vk = get_vk(cts); + VkDisplayPlanePropertiesKHR *plane_properties = NULL; + uint32_t plane_property_count = 0; + VkResult ret; // Get plane properties - uint32_t plane_property_count; - VkResult ret = - vk->vkGetPhysicalDeviceDisplayPlanePropertiesKHR(vk->physical_device, &plane_property_count, NULL); + ret = vk_enumerate_physical_display_plane_properties( // + vk, // + vk->physical_device, // + &plane_property_count, // + &plane_properties); // if (ret != VK_SUCCESS) { - COMP_ERROR(cts->base.c, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR: %s", vk_result_string(ret)); - return ret; - } - - COMP_DEBUG(cts->base.c, "Found %d plane properties.", plane_property_count); - - VkDisplayPlanePropertiesKHR *plane_properties = - U_TYPED_ARRAY_CALLOC(VkDisplayPlanePropertiesKHR, plane_property_count); - - ret = vk->vkGetPhysicalDeviceDisplayPlanePropertiesKHR(vk->physical_device, &plane_property_count, - plane_properties); - if (ret != VK_SUCCESS) { - COMP_ERROR(cts->base.c, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR: %s", vk_result_string(ret)); - free(plane_properties); - return ret; + COMP_ERROR(cts->base.c, "vk_enumerate_physical_display_plane_properties: %s", vk_result_string(ret)); + return VK_ERROR_INITIALIZATION_FAILED; } + // Select the plane. + //! @todo actually select the plane. uint32_t plane_index = 0; + // Select the mode. VkDisplayModeKHR display_mode = comp_window_direct_get_primary_display_mode(cts, display); + // We need the capabilities of the selected plane. VkDisplayPlaneCapabilitiesKHR plane_caps; vk->vkGetDisplayPlaneCapabilitiesKHR(vk->physical_device, display_mode, plane_index, &plane_caps); diff --git a/src/xrt/compositor/main/comp_window_direct_nvidia.c b/src/xrt/compositor/main/comp_window_direct_nvidia.c index 624fdea07..5f2e014c4 100644 --- a/src/xrt/compositor/main/comp_window_direct_nvidia.c +++ b/src/xrt/compositor/main/comp_window_direct_nvidia.c @@ -177,22 +177,29 @@ comp_window_direct_nvidia_init(struct comp_target *ct) { struct comp_window_direct_nvidia *w_direct = (struct comp_window_direct_nvidia *)ct; struct vk_bundle *vk = get_vk(ct); + VkDisplayPropertiesKHR *display_props = NULL; + uint32_t display_count = 0; + VkResult ret; if (vk->instance == VK_NULL_HANDLE) { COMP_ERROR(ct->c, "Vulkan not initialized before NVIDIA init!"); return false; } - if (!comp_window_direct_connect(&w_direct->base, &w_direct->dpy)) { return false; } // find our display using nvidia allowlist, enumerate its modes, and // pick the best one get a list of attached displays - uint32_t display_count; - if (vk->vkGetPhysicalDeviceDisplayPropertiesKHR(vk->physical_device, &display_count, NULL) != VK_SUCCESS) { - COMP_ERROR(ct->c, "Failed to get vulkan display count"); + + ret = vk_enumerate_physical_device_display_properties( // + vk, // + vk->physical_device, // + &display_count, // + &display_props); // + if (ret != VK_SUCCESS) { + COMP_ERROR(ct->c, "vk_enumerate_physical_device_display_properties: %s", vk_result_string(ret)); return false; } @@ -201,15 +208,6 @@ comp_window_direct_nvidia_init(struct comp_target *ct) return false; } - struct VkDisplayPropertiesKHR *display_props = U_TYPED_ARRAY_CALLOC(VkDisplayPropertiesKHR, display_count); - - if (display_props && vk->vkGetPhysicalDeviceDisplayPropertiesKHR(vk->physical_device, &display_count, - display_props) != VK_SUCCESS) { - COMP_ERROR(ct->c, "Failed to get display properties"); - free(display_props); - return false; - } - /// @todo what if we have multiple allowlisted HMD displays connected? for (uint32_t i = 0; i < display_count; i++) { struct VkDisplayPropertiesKHR disp = *(display_props + i); diff --git a/src/xrt/compositor/main/comp_window_vk_display.c b/src/xrt/compositor/main/comp_window_vk_display.c index a2d420ca2..5cd44a86d 100644 --- a/src/xrt/compositor/main/comp_window_vk_display.c +++ b/src/xrt/compositor/main/comp_window_vk_display.c @@ -160,15 +160,24 @@ comp_window_vk_display_init(struct comp_target *ct) { struct comp_window_vk_display *w_direct = (struct comp_window_vk_display *)ct; struct vk_bundle *vk = get_vk(ct); + VkDisplayPropertiesKHR *display_props = NULL; + uint32_t display_count = 0; + VkResult ret; if (vk->instance == VK_NULL_HANDLE) { COMP_ERROR(ct->c, "Vulkan not initialized before vk display init!"); return false; } - uint32_t display_count; - if (vk->vkGetPhysicalDeviceDisplayPropertiesKHR(vk->physical_device, &display_count, NULL) != VK_SUCCESS) { - COMP_ERROR(ct->c, "Failed to get vulkan display count"); + // Get a list of attached displays. + ret = vk_enumerate_physical_device_display_properties( // + vk, // + vk->physical_device, // + &display_count, // + &display_props); // + if (ret != VK_SUCCESS) { + CVK_ERROR(ct->c, "vk_enumerate_physical_device_display_properties", "Failed to get display properties", + ret); return false; } @@ -177,15 +186,6 @@ comp_window_vk_display_init(struct comp_target *ct) return false; } - struct VkDisplayPropertiesKHR *display_props = U_TYPED_ARRAY_CALLOC(VkDisplayPropertiesKHR, display_count); - - if (display_props && vk->vkGetPhysicalDeviceDisplayPropertiesKHR(vk->physical_device, &display_count, - display_props) != VK_SUCCESS) { - COMP_ERROR(ct->c, "Failed to get display properties"); - free(display_props); - return false; - } - if (ct->c->settings.vk_display > (int)display_count) { COMP_ERROR(ct->c, "Requested display %d, but only %d found.", ct->c->settings.vk_display, display_count);