diff options
author | Benjamin Otte <otte@redhat.com> | 2023-05-14 04:15:06 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2023-05-17 02:25:32 +0200 |
commit | 3b9e038dbc7ffc2261aac4b707b98b451164226c (patch) | |
tree | 1bbbf486547f98f173b4029c6195840812ddd4d7 | |
parent | 63ed0a8929d0a6f0f187bf674588de8044d32f02 (diff) | |
download | gtk+-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.c | 8 | ||||
-rw-r--r-- | gsk/vulkan/gskvulkanclipprivate.h | 2 | ||||
-rw-r--r-- | gsk/vulkan/gskvulkanrenderpass.c | 18 |
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 (); |