vulkan: Add optimization for transforms
authorBenjamin Otte <otte@redhat.com>
Wed, 17 May 2023 23:18:38 +0000 (01:18 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 4 Jun 2023 17:42:01 +0000 (19:42 +0200)
When attempting a complex transform, check if the clip can be ignored
and do that if possible.

That way we don't cause fallbacks when transforming the clip is too
complex.

gsk/vulkan/gskvulkanrenderpass.c

index 5f589e5e9843e5a9331331debb3cb02dbd134e52..8bbdc9ed2c673b9ffaede3b2c860b58e7e9a34d0 100644 (file)
@@ -540,11 +540,6 @@ gsk_vulkan_render_pass_add_transform_node (GskVulkanRenderPass       *self,
   GskTransform *transform;
   GskVulkanParseState new_state;
 
-#if 0
- if (!gsk_vulkan_clip_contains_rect (clip, &node->bounds))
-    FALLBACK ("Transform nodes can't deal with clip type %u\n", clip->type);
-#endif
-
   child = gsk_transform_node_get_child (node);
   transform = gsk_transform_node_get_transform (node);
 
@@ -584,7 +579,11 @@ gsk_vulkan_render_pass_add_transform_node (GskVulkanRenderPass       *self,
 
         clip_transform = gsk_transform_transform (gsk_transform_translate (NULL, &state->offset), transform);
 
-        if (!gsk_vulkan_clip_transform (&new_state.clip, &state->clip, clip_transform, &child->bounds))
+        if (gsk_vulkan_clip_contains_rect (&state->clip, &state->offset, &node->bounds))
+          {
+            gsk_vulkan_clip_init_empty (&new_state.clip, &child->bounds);
+          }
+        else if (!gsk_vulkan_clip_transform (&new_state.clip, &state->clip, clip_transform, &child->bounds))
           {
             gsk_transform_unref (clip_transform);
             FALLBACK ("Transform nodes can't deal with clip type %u", state->clip.type);
@@ -625,7 +624,11 @@ gsk_vulkan_render_pass_add_transform_node (GskVulkanRenderPass       *self,
 
         clip_transform = gsk_transform_transform (gsk_transform_translate (NULL, &state->offset), transform);
 
-        if (!gsk_vulkan_clip_transform (&new_state.clip, &state->clip, clip_transform, &child->bounds))
+        if (gsk_vulkan_clip_contains_rect (&state->clip, &state->offset, &node->bounds))
+          {
+            gsk_vulkan_clip_init_empty (&new_state.clip, &child->bounds);
+          }
+        else if (!gsk_vulkan_clip_transform (&new_state.clip, &state->clip, clip_transform, &child->bounds))
           {
             gsk_transform_unref (clip_transform);
             FALLBACK ("Transform nodes can't deal with clip type %u", state->clip.type);