vulkan: Set the initial clip rect
authorBenjamin Otte <otte@redhat.com>
Sun, 14 May 2023 02:15:06 +0000 (04:15 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 4 Jun 2023 17:42:01 +0000 (19:42 +0200)
Instead of rendering unclipped, set the clip region to the extents of
the current clip region.

gsk/vulkan/gskvulkanclip.c
gsk/vulkan/gskvulkanclipprivate.h
gsk/vulkan/gskvulkanrenderpass.c

index 55271a0f8b355ccdd3f46ffab520816fdd69ac19..88d42a99924cd178894754fde8be04b9599fa28a 100644 (file)
@@ -13,6 +13,14 @@ gsk_vulkan_clip_init_empty (GskVulkanClip         *clip,
   gsk_rounded_rect_init_from_rect (&clip->rect, rect, 0);
 }
 
+void
+gsk_vulkan_clip_init_rect (GskVulkanClip         *clip,
+                           const graphene_rect_t *rect)
+{
+  clip->type = GSK_VULKAN_CLIP_RECT;
+  gsk_rounded_rect_init_from_rect (&clip->rect, rect, 0);
+}
+
 static void
 gsk_vulkan_clip_init_copy (GskVulkanClip *self,
                            const GskVulkanClip *src)
index 7220b732bab7618ddea21f46265f95a577ab6ba3..b311c076234842793a8c7e97c668b9f9cb5661a5 100644 (file)
@@ -36,6 +36,8 @@ struct _GskVulkanClip
 
 void                    gsk_vulkan_clip_init_empty                      (GskVulkanClip          *clip,
                                                                          const graphene_rect_t  *rect);
+void                    gsk_vulkan_clip_init_rect                       (GskVulkanClip          *clip,
+                                                                         const graphene_rect_t  *rect);
 
 gboolean                gsk_vulkan_clip_intersect_rect                  (GskVulkanClip          *dest,
                                                                          const GskVulkanClip    *src,
index 223ee00e78ce36d8e824a2461b3d549410444526..dcf36ae28a3055efd03672eb9cf3a5ad44fb8327 100644 (file)
@@ -1087,6 +1087,23 @@ gsk_vulkan_render_pass_add (GskVulkanRenderPass     *self,
                             GskRenderNode           *node)
 {
   GskVulkanParseState state;
+  cairo_rectangle_int_t rect;
+  graphene_rect_t clip;
+
+  cairo_region_get_extents (self->clip, &rect);
+  clip = GRAPHENE_RECT_INIT(rect.x + self->viewport.origin.x,
+                            rect.y + self->viewport.origin.y,
+                            rect.width, rect.height);
+  if (graphene_rect_equal (&clip, &self->viewport))
+    {
+      graphene_rect_scale (&clip, 1 / graphene_vec2_get_x (&self->scale), 1 / graphene_vec2_get_y (&self->scale), &clip);
+      gsk_vulkan_clip_init_empty (&state.clip, &self->viewport);
+    }
+  else
+    {
+      graphene_rect_scale (&clip, 1 / graphene_vec2_get_x (&self->scale), 1 / graphene_vec2_get_y (&self->scale), &clip);
+      gsk_vulkan_clip_init_rect (&state.clip, &clip);
+    }
 
   state.modelview = NULL;
   graphene_matrix_init_ortho (&state.projection,
@@ -1094,7 +1111,6 @@ gsk_vulkan_render_pass_add (GskVulkanRenderPass     *self,
                               self->viewport.origin.y, self->viewport.origin.y + self->viewport.size.height,
                               2 * ORTHO_NEAR_PLANE - ORTHO_FAR_PLANE,
                               ORTHO_FAR_PLANE);
-  gsk_vulkan_clip_init_empty (&state.clip, &self->viewport);
   graphene_vec2_init_from_vec2 (&state.scale, &self->scale);
   state.offset = *graphene_point_zero ();