[Windows] Fix Vulkan driver crash on sub-window minimization.

This commit is contained in:
bruvzg 2022-02-17 13:09:17 +02:00
parent b89b1683d4
commit 0c27667124
5 changed files with 25 additions and 6 deletions

View file

@ -6652,6 +6652,10 @@ RenderingDevice::DrawListID RenderingDeviceVulkan::draw_list_begin_for_screen(Di
VkCommandBuffer command_buffer = frames[frame].draw_command_buffer;
if (!context->window_is_valid_swapchain(p_screen)) {
return INVALID_ID;
}
Size2i size = Size2i(context->window_get_width(p_screen), context->window_get_height(p_screen));
_draw_list_allocate(Rect2i(Vector2i(), size), 0, 0);

View file

@ -1348,6 +1348,12 @@ int VulkanContext::window_get_height(DisplayServer::WindowID p_window) {
return windows[p_window].height;
}
bool VulkanContext::window_is_valid_swapchain(DisplayServer::WindowID p_window) {
ERR_FAIL_COND_V(!windows.has(p_window), false);
Window *w = &windows[p_window];
return w->swapchain_image_resources != VK_NULL_HANDLE;
}
VkRenderPass VulkanContext::window_get_render_pass(DisplayServer::WindowID p_window) {
ERR_FAIL_COND_V(!windows.has(p_window), VK_NULL_HANDLE);
Window *w = &windows[p_window];
@ -1360,7 +1366,11 @@ VkFramebuffer VulkanContext::window_get_framebuffer(DisplayServer::WindowID p_wi
ERR_FAIL_COND_V(!buffers_prepared, VK_NULL_HANDLE);
Window *w = &windows[p_window];
//vulkan use of currentbuffer
return w->swapchain_image_resources[w->current_buffer].framebuffer;
if (w->swapchain_image_resources != VK_NULL_HANDLE) {
return w->swapchain_image_resources[w->current_buffer].framebuffer;
} else {
return VK_NULL_HANDLE;
}
}
void VulkanContext::window_destroy(DisplayServer::WindowID p_window_id) {

View file

@ -266,6 +266,7 @@ public:
void window_resize(DisplayServer::WindowID p_window_id, int p_width, int p_height);
int window_get_width(DisplayServer::WindowID p_window = 0);
int window_get_height(DisplayServer::WindowID p_window = 0);
bool window_is_valid_swapchain(DisplayServer::WindowID p_window = 0);
void window_destroy(DisplayServer::WindowID p_window_id);
VkFramebuffer window_get_framebuffer(DisplayServer::WindowID p_window = 0);
VkRenderPass window_get_render_pass(DisplayServer::WindowID p_window = 0);