summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2023-05-14 04:15:06 +0200
committerBenjamin Otte <otte@redhat.com>2023-05-17 02:25:32 +0200
commit3b9e038dbc7ffc2261aac4b707b98b451164226c (patch)
tree1bbbf486547f98f173b4029c6195840812ddd4d7
parent63ed0a8929d0a6f0f187bf674588de8044d32f02 (diff)
downloadgtk+-3b9e038dbc7ffc2261aac4b707b98b451164226c.tar.gz
vulkan: Set the initial clip rect
Instead of rendering unclipped, set the clip region to the extents of the current clip region.
-rw-r--r--gsk/vulkan/gskvulkanclip.c8
-rw-r--r--gsk/vulkan/gskvulkanclipprivate.h2
-rw-r--r--gsk/vulkan/gskvulkanrenderpass.c18
3 files changed, 27 insertions, 1 deletions
diff --git a/gsk/vulkan/gskvulkanclip.c b/gsk/vulkan/gskvulkanclip.c
index 5362bded74..61e02bbf6f 100644
--- a/gsk/vulkan/gskvulkanclip.c
+++ b/gsk/vulkan/gskvulkanclip.c
@@ -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)
diff --git a/gsk/vulkan/gskvulkanclipprivate.h b/gsk/vulkan/gskvulkanclipprivate.h
index 0481dcc385..697671ace9 100644
--- a/gsk/vulkan/gskvulkanclipprivate.h
+++ b/gsk/vulkan/gskvulkanclipprivate.h
@@ -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,
diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c
index d6f1f19bd2..63e9beeea9 100644
--- a/gsk/vulkan/gskvulkanrenderpass.c
+++ b/gsk/vulkan/gskvulkanrenderpass.c
@@ -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 ();