From 4e77667ab82b61bf574f5cf6f1b51b7800e951cd Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 13 Aug 2024 00:33:55 +0200 Subject: [PATCH 1/2] vulkan: Round damage rectangles properly We need to round outwards and a 1x1 rectangle with offset 0.5,0.5 should end up as a 3x3 rectangle with offset 0,0 when rounded, not as a 2x2 rectangle. --- gdk/gdkvulkancontext.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gdk/gdkvulkancontext.c b/gdk/gdkvulkancontext.c index c66621a66f..cf21784bf1 100644 --- a/gdk/gdkvulkancontext.c +++ b/gdk/gdkvulkancontext.c @@ -714,8 +714,8 @@ gdk_vulkan_context_end_frame (GdkDrawContext *draw_context, .layer = 0, .offset.x = (int) floor (r.x * scale), .offset.y = (int) floor (r.y * scale), - .extent.width = (int) ceil (r.width * scale), - .extent.height = (int) ceil (r.height * scale), + .extent.width = (int) ceil ((r.x + r.width) * scale) - floor (r.x * scale), + .extent.height = (int) ceil ((r.y + r.height) * scale) - floor (r.y * scale), }; } } From 5d056eabf6037f1e357c39b7be9e788f452180c5 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 13 Aug 2024 00:35:20 +0200 Subject: [PATCH 2/2] egl: Round damage rectangles properly We need to round outwards and a 1x1 rectangle with offset 0.5,0.5 should end up as a 3x3 rectangle with offset 0,0 when rounded, not as a 2x2 rectangle. --- gdk/gdkglcontext.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gdk/gdkglcontext.c b/gdk/gdkglcontext.c index 45e2a71d6e..ecb114460f 100644 --- a/gdk/gdkglcontext.c +++ b/gdk/gdkglcontext.c @@ -718,8 +718,8 @@ gdk_gl_context_real_end_frame (GdkDrawContext *draw_context, cairo_region_get_rectangle (painted, i, &rect); rects[j++] = (int) floor (rect.x * scale); rects[j++] = (int) floor ((surface_height - rect.height - rect.y) * scale); - rects[j++] = (int) ceil (rect.width * scale); - rects[j++] = (int) ceil (rect.height * scale); + rects[j++] = (int) ceil ((rect.x + rect.width) * scale) - floor (rect.x * scale); + rects[j++] = (int) ceil ((surface_height - rect.y) * scale) - floor ((surface_height - rect.height - rect.y) * scale); } priv->eglSwapBuffersWithDamage (gdk_display_get_egl_display (display), egl_surface, rects, n_rects); g_free (heap_rects);