mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2024-12-29 11:06:18 +00:00
c/main: Improve swapchain creation
This commit is contained in:
parent
b3dc8ca17e
commit
dbd6504beb
|
@ -668,21 +668,9 @@ comp_target_swapchain_create_images(struct comp_target *ct,
|
||||||
cts->preferred.color_space = color_space;
|
cts->preferred.color_space = color_space;
|
||||||
|
|
||||||
|
|
||||||
// Preliminary check of the environment
|
/*
|
||||||
ret = vk->vkGetPhysicalDeviceSurfaceSupportKHR( //
|
* Checking for support and selecting some properties.
|
||||||
vk->physical_device, // physicalDevice
|
*/
|
||||||
vk->queue_family_index, // queueFamilyIndex
|
|
||||||
cts->surface.handle, // surface
|
|
||||||
&supported); // pSupported
|
|
||||||
if (ret != VK_SUCCESS) {
|
|
||||||
COMP_ERROR(ct->c, "vkGetPhysicalDeviceSurfaceSupportKHR: %s", vk_result_string(ret));
|
|
||||||
destroy_old(cts, old_swapchain_handle);
|
|
||||||
return;
|
|
||||||
} else if (!supported) {
|
|
||||||
COMP_ERROR(ct->c, "vkGetPhysicalDeviceSurfaceSupportKHR: Surface not supported!");
|
|
||||||
destroy_old(cts, old_swapchain_handle);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get information.
|
// Get information.
|
||||||
struct vk_surface_info info = {0};
|
struct vk_surface_info info = {0};
|
||||||
|
@ -693,6 +681,30 @@ comp_target_swapchain_create_images(struct comp_target *ct,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Can we create swapchains from the surface on this device and queue.
|
||||||
|
ret = vk->vkGetPhysicalDeviceSurfaceSupportKHR( //
|
||||||
|
vk->physical_device, // physicalDevice
|
||||||
|
vk->queue_family_index, // queueFamilyIndex
|
||||||
|
cts->surface.handle, // surface
|
||||||
|
&supported); // pSupported
|
||||||
|
if (ret != VK_SUCCESS) {
|
||||||
|
COMP_ERROR(ct->c, "vkGetPhysicalDeviceSurfaceSupportKHR: %s", vk_result_string(ret));
|
||||||
|
goto error_print_and_free;
|
||||||
|
} else if (!supported) {
|
||||||
|
COMP_ERROR(ct->c, "vkGetPhysicalDeviceSurfaceSupportKHR: Surface not supported!");
|
||||||
|
goto error_print_and_free;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check that the present mode is supported.
|
||||||
|
if (!check_surface_present_mode(cts, &info, cts->present_mode)) {
|
||||||
|
goto error_print_and_free;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the correct format.
|
||||||
|
if (!find_surface_format(cts, &info, &cts->surface.format)) {
|
||||||
|
goto error_print_and_free;
|
||||||
|
}
|
||||||
|
|
||||||
// Always print the first one.
|
// Always print the first one.
|
||||||
enum u_logging_level print_log_level = U_LOGGING_DEBUG;
|
enum u_logging_level print_log_level = U_LOGGING_DEBUG;
|
||||||
if (!cts->has_logged_info) {
|
if (!cts->has_logged_info) {
|
||||||
|
@ -703,27 +715,17 @@ comp_target_swapchain_create_images(struct comp_target *ct,
|
||||||
// Print info about the surface.
|
// Print info about the surface.
|
||||||
vk_print_surface_info(vk, &info, print_log_level);
|
vk_print_surface_info(vk, &info, print_log_level);
|
||||||
|
|
||||||
if (!check_surface_present_mode(cts, &info, cts->present_mode)) {
|
|
||||||
// Free old.
|
|
||||||
destroy_old(cts, old_swapchain_handle);
|
|
||||||
vk_surface_info_destroy(&info);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find the correct format.
|
|
||||||
if (!find_surface_format(cts, &info, &cts->surface.format)) {
|
|
||||||
// Free old.
|
|
||||||
destroy_old(cts, old_swapchain_handle);
|
|
||||||
vk_surface_info_destroy(&info);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the caps first.
|
// Get the caps first.
|
||||||
VkSurfaceCapabilitiesKHR surface_caps = info.caps;
|
VkSurfaceCapabilitiesKHR surface_caps = info.caps;
|
||||||
|
|
||||||
// Now we can free the info.
|
// Now we can free the info.
|
||||||
vk_surface_info_destroy(&info);
|
vk_surface_info_destroy(&info);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Non-failable selections.
|
||||||
|
*/
|
||||||
|
|
||||||
// Get the extents of the swapchain.
|
// Get the extents of the swapchain.
|
||||||
VkExtent2D extent = select_extent(cts, surface_caps, preferred_width, preferred_height);
|
VkExtent2D extent = select_extent(cts, surface_caps, preferred_width, preferred_height);
|
||||||
|
|
||||||
|
@ -799,6 +801,7 @@ comp_target_swapchain_create_images(struct comp_target *ct,
|
||||||
|
|
||||||
VK_NAME_SWAPCHAIN(vk, cts->swapchain.handle, "comp_target_swapchain swapchain");
|
VK_NAME_SWAPCHAIN(vk, cts->swapchain.handle, "comp_target_swapchain swapchain");
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set target info.
|
* Set target info.
|
||||||
*/
|
*/
|
||||||
|
@ -827,6 +830,14 @@ comp_target_swapchain_create_images(struct comp_target *ct,
|
||||||
COMP_INFO(ct->c, "Not using vblank event thread!");
|
COMP_INFO(ct->c, "Not using vblank event thread!");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Done now.
|
||||||
|
return;
|
||||||
|
|
||||||
|
error_print_and_free:
|
||||||
|
vk_print_surface_info(vk, &info, U_LOGGING_ERROR);
|
||||||
|
destroy_old(cts, old_swapchain_handle);
|
||||||
|
vk_surface_info_destroy(&info);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
|
Loading…
Reference in a new issue