From d6a6313493f658912eb64349d924dc95f6a1aa19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Tue, 3 Dec 2019 16:32:59 +0100 Subject: [PATCH 1/2] wayland/glcontext: Fix damage region on HiDPI The passed regions are in surface coordinates, but eglSwapBuffersWithDamage() is in buffer coordinates. --- gdk/wayland/gdkglcontext-wayland.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/gdk/wayland/gdkglcontext-wayland.c b/gdk/wayland/gdkglcontext-wayland.c index 40df428a38..c6b2116b26 100644 --- a/gdk/wayland/gdkglcontext-wayland.c +++ b/gdk/wayland/gdkglcontext-wayland.c @@ -244,14 +244,15 @@ gdk_wayland_gl_context_end_frame (GdkDrawContext *draw_context, EGLint *rects = g_new (EGLint, n_rects * 4); cairo_rectangle_int_t rect; int surface_height = gdk_surface_get_height (surface); + int scale = gdk_surface_get_scale_factor (surface); for (i = 0, j = 0; i < n_rects; i++) { cairo_region_get_rectangle (painted, i, &rect); - rects[j++] = rect.x; - rects[j++] = surface_height - rect.height - rect.y; - rects[j++] = rect.width; - rects[j++] = rect.height; + rects[j++] = rect.x * scale; + rects[j++] = (surface_height - rect.height - rect.y) * scale; + rects[j++] = rect.width * scale; + rects[j++] = rect.height * scale; } eglSwapBuffersWithDamageEXT (display_wayland->egl_display, egl_surface, rects, n_rects); g_free (rects); From ba74f41a70a71f67d82e72f13f3c0c32071441d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Tue, 3 Dec 2019 16:42:03 +0100 Subject: [PATCH 2/2] wayland/vulkancontext: Fix present region on HiDPI VkPresentRegionsKHR is expected to operate in buffer coordinates, but the region we get passed is in surface coordinates, so it must be scaled. --- gdk/gdkvulkancontext.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/gdk/gdkvulkancontext.c b/gdk/gdkvulkancontext.c index 247e6e094f..5582afeb92 100644 --- a/gdk/gdkvulkancontext.c +++ b/gdk/gdkvulkancontext.c @@ -441,11 +441,14 @@ gdk_vulkan_context_end_frame (GdkDrawContext *draw_context, { GdkVulkanContext *context = GDK_VULKAN_CONTEXT (draw_context); GdkVulkanContextPrivate *priv = gdk_vulkan_context_get_instance_private (context); + GdkSurface *surface = gdk_draw_context_get_surface (draw_context); VkPresentRegionsKHR *regionsptr = VK_NULL_HANDLE; VkPresentRegionsKHR regions; cairo_rectangle_int_t extents; + int scale; cairo_region_get_extents (painted, &extents); + scale = gdk_surface_get_scale_factor (surface); regions = (VkPresentRegionsKHR) { .sType = VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR, @@ -454,10 +457,10 @@ gdk_vulkan_context_end_frame (GdkDrawContext *draw_context, .rectangleCount = 1, .pRectangles = &(VkRectLayerKHR) { .layer = 0, - .offset.x = extents.x, - .offset.y = extents.y, - .extent.width = extents.width, - .extent.height = extents.height, + .offset.x = extents.x * scale, + .offset.y = extents.y * scale, + .extent.width = extents.width * scale, + .extent.height = extents.height * scale, } }, };