From 5ae42736f8162afab49be35b0fbe5f0587d3f9ca Mon Sep 17 00:00:00 2001 From: Tom Date: Sun, 18 Jul 2021 10:11:27 -0600 Subject: [PATCH] Kernel: VirtIO framebuffer should clamp pending dirty rects if needed If we change to a resolution smaller than what any pending dirty rectangles contain, we need to clamp them to the new resolution. --- Kernel/Graphics/VirtIOGPU/FrameBufferDevice.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Kernel/Graphics/VirtIOGPU/FrameBufferDevice.cpp b/Kernel/Graphics/VirtIOGPU/FrameBufferDevice.cpp index 005feae366..4ea92dcb99 100644 --- a/Kernel/Graphics/VirtIOGPU/FrameBufferDevice.cpp +++ b/Kernel/Graphics/VirtIOGPU/FrameBufferDevice.cpp @@ -73,6 +73,14 @@ void FrameBufferDevice::create_buffer(Buffer& buffer, size_t framebuffer_offset, if (&buffer == m_current_buffer) flush_displayed_image(info.rect, buffer); + // Make sure we constrain the existing dirty rect (if any) + if (buffer.dirty_rect.width != 0 || buffer.dirty_rect.height != 0) { + auto dirty_right = buffer.dirty_rect.x + buffer.dirty_rect.width; + auto dirty_bottom = buffer.dirty_rect.y + buffer.dirty_rect.height; + buffer.dirty_rect.width = min(dirty_right, info.rect.x + info.rect.width) - buffer.dirty_rect.x; + buffer.dirty_rect.height = min(dirty_bottom, info.rect.y + info.rect.height) - buffer.dirty_rect.y; + } + info.enabled = 1; }