You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-27 15:57:02 +00:00
Merge pull request #64883 from RandomShaper/vk_swapchain_sizing
Let platforms override the sizing of Vulkan swapchain and window
This commit is contained in:
@@ -1436,6 +1436,24 @@ bool VulkanContext::_use_validation_layers() {
|
|||||||
return Engine::get_singleton()->is_validation_layers_enabled();
|
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) {
|
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);
|
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);
|
ERR_FAIL_V(ERR_CANT_CREATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
VkExtent2D swapchainExtent;
|
VkExtent2D swapchainExtent = _compute_swapchain_extent(surfCapabilities, &window->width, &window->height);
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (window->width == 0 || window->height == 0) {
|
if (window->width == 0 || window->height == 0) {
|
||||||
free(presentModes);
|
free(presentModes);
|
||||||
|
|||||||
@@ -266,6 +266,8 @@ protected:
|
|||||||
|
|
||||||
Error _get_preferred_validation_layers(uint32_t *count, const char *const **names);
|
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:
|
public:
|
||||||
// Extension calls.
|
// Extension calls.
|
||||||
VkResult vkCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass);
|
VkResult vkCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass);
|
||||||
|
|||||||
Reference in New Issue
Block a user