mirror of
https://github.com/godotengine/godot.git
synced 2024-10-23 05:31:54 +00:00
Let platforms override the sizing of Vulkan swapchain and window
This commit is contained in:
parent
5d78ab4388
commit
994d2faf97
|
@ -1436,6 +1436,24 @@ bool VulkanContext::_use_validation_layers() {
|
|||
return Engine::get_singleton()->is_validation_layers_enabled();
|
||||
}
|
||||
|
||||
VkExtent2D VulkanContext::_compute_swapchain_extent(const VkSurfaceCapabilitiesKHR &p_surf_capabilities, int *p_window_width, int *p_window_height) const {
|
||||
// Width and height are either both 0xFFFFFFFF, or both not 0xFFFFFFFF.
|
||||
if (p_surf_capabilities.currentExtent.width == 0xFFFFFFFF) {
|
||||
// If the surface size is undefined, the size is set to the size
|
||||
// of the images requested, which must fit within the minimum and
|
||||
// maximum values.
|
||||
VkExtent2D extent = {};
|
||||
extent.width = CLAMP((uint32_t)(*p_window_width), p_surf_capabilities.minImageExtent.width, p_surf_capabilities.maxImageExtent.width);
|
||||
extent.height = CLAMP((uint32_t)(*p_window_height), p_surf_capabilities.minImageExtent.height, p_surf_capabilities.maxImageExtent.height);
|
||||
return extent;
|
||||
} else {
|
||||
// If the surface size is defined, the swap chain size must match.
|
||||
*p_window_width = p_surf_capabilities.currentExtent.width;
|
||||
*p_window_height = p_surf_capabilities.currentExtent.height;
|
||||
return p_surf_capabilities.currentExtent;
|
||||
}
|
||||
}
|
||||
|
||||
Error VulkanContext::_window_create(DisplayServer::WindowID p_window_id, DisplayServer::VSyncMode p_vsync_mode, VkSurfaceKHR p_surface, int p_width, int p_height) {
|
||||
ERR_FAIL_COND_V(windows.has(p_window_id), ERR_INVALID_PARAMETER);
|
||||
|
||||
|
@ -1576,32 +1594,7 @@ Error VulkanContext::_update_swap_chain(Window *window) {
|
|||
ERR_FAIL_V(ERR_CANT_CREATE);
|
||||
}
|
||||
|
||||
VkExtent2D swapchainExtent;
|
||||
// Width and height are either both 0xFFFFFFFF, or both not 0xFFFFFFFF.
|
||||
if (surfCapabilities.currentExtent.width == 0xFFFFFFFF) {
|
||||
// If the surface size is undefined, the size is set to the size
|
||||
// of the images requested, which must fit within the minimum and
|
||||
// maximum values.
|
||||
swapchainExtent.width = window->width;
|
||||
swapchainExtent.height = window->height;
|
||||
|
||||
if (swapchainExtent.width < surfCapabilities.minImageExtent.width) {
|
||||
swapchainExtent.width = surfCapabilities.minImageExtent.width;
|
||||
} else if (swapchainExtent.width > surfCapabilities.maxImageExtent.width) {
|
||||
swapchainExtent.width = surfCapabilities.maxImageExtent.width;
|
||||
}
|
||||
|
||||
if (swapchainExtent.height < surfCapabilities.minImageExtent.height) {
|
||||
swapchainExtent.height = surfCapabilities.minImageExtent.height;
|
||||
} else if (swapchainExtent.height > surfCapabilities.maxImageExtent.height) {
|
||||
swapchainExtent.height = surfCapabilities.maxImageExtent.height;
|
||||
}
|
||||
} else {
|
||||
// If the surface size is defined, the swap chain size must match.
|
||||
swapchainExtent = surfCapabilities.currentExtent;
|
||||
window->width = surfCapabilities.currentExtent.width;
|
||||
window->height = surfCapabilities.currentExtent.height;
|
||||
}
|
||||
VkExtent2D swapchainExtent = _compute_swapchain_extent(surfCapabilities, &window->width, &window->height);
|
||||
|
||||
if (window->width == 0 || window->height == 0) {
|
||||
free(presentModes);
|
||||
|
|
|
@ -266,6 +266,8 @@ protected:
|
|||
|
||||
Error _get_preferred_validation_layers(uint32_t *count, const char *const **names);
|
||||
|
||||
virtual VkExtent2D _compute_swapchain_extent(const VkSurfaceCapabilitiesKHR &p_surf_capabilities, int *p_window_width, int *p_window_height) const;
|
||||
|
||||
public:
|
||||
// Extension calls.
|
||||
VkResult vkCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass);
|
||||
|
|
Loading…
Reference in New Issue
Block a user