summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2023-05-11 16:59:02 +0200
committerBenjamin Otte <otte@redhat.com>2023-05-17 02:25:32 +0200
commit234a7a02b318af9e27b957262b093bc63cdb1d1d (patch)
tree06beeacfba8f9b107f1d8b3c2735bc157cdf0502
parent3ba4d5f124ed49b3179434f70ab47bafdf28223a (diff)
downloadgtk+-234a7a02b318af9e27b957262b093bc63cdb1d1d.tar.gz
vulkan: Handle clip properly for offscreens
This was broken in the last commit.
-rw-r--r--gsk/vulkan/gskvulkanrenderpass.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c
index 9cbd0b8a78..0969dd5cad 100644
--- a/gsk/vulkan/gskvulkanrenderpass.c
+++ b/gsk/vulkan/gskvulkanrenderpass.c
@@ -1105,12 +1105,13 @@ gsk_vulkan_render_pass_render_offscreen (GdkVulkanContext *vulkan,
}
static GskVulkanImage *
-gsk_vulkan_render_pass_get_node_as_texture (GskVulkanRenderPass *self,
- GskVulkanRender *render,
- GskVulkanUploader *uploader,
- GskRenderNode *node,
- GskVulkanClip *current_clip,
- graphene_rect_t *tex_bounds)
+gsk_vulkan_render_pass_get_node_as_texture (GskVulkanRenderPass *self,
+ GskVulkanRender *render,
+ GskVulkanUploader *uploader,
+ GskRenderNode *node,
+ const graphene_rect_t *clip_bounds,
+ const graphene_point_t *clip_offset,
+ graphene_rect_t *tex_bounds)
{
VkSemaphore semaphore;
GskVulkanImage *result;
@@ -1138,10 +1139,8 @@ gsk_vulkan_render_pass_get_node_as_texture (GskVulkanRenderPass *self,
{
graphene_rect_t clipped;
- if (current_clip)
- graphene_rect_intersection (&current_clip->rect.bounds, &node->bounds, &clipped);
- else
- clipped = node->bounds;
+ graphene_rect_offset_r (clip_bounds, - clip_offset->x, - clip_offset->y, &clipped);
+ graphene_rect_intersection (&clipped, &node->bounds, &clipped);
if (clipped.size.width == 0 || clipped.size.height == 0)
return NULL;
@@ -1327,7 +1326,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self,
{
GskVulkanOp *op;
guint i;
- GskVulkanClip *clip = NULL;
+ const graphene_rect_t *clip = NULL;
for (i = 0; i < self->render_ops->len; i++)
{
@@ -1371,6 +1370,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self,
uploader,
child,
clip,
+ &op->render.offset,
&tex_bounds);
get_tex_rect (&op->render.source_rect, &op->render.node->bounds, &tex_bounds);
}
@@ -1415,7 +1415,8 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self,
render,
uploader,
child,
- NULL,
+ &child->bounds,
+ &GRAPHENE_POINT_INIT (0, 0),
&tex_bounds);
get_tex_rect (&op->render.source_rect, &op->render.node->bounds, &tex_bounds);
}
@@ -1432,6 +1433,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self,
uploader,
child,
clip,
+ &op->render.offset,
&tex_bounds);
get_tex_rect (&op->render.source_rect, &op->render.node->bounds, &tex_bounds);
}
@@ -1447,6 +1449,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self,
uploader,
child,
clip,
+ &op->render.offset,
&tex_bounds);
get_tex_rect (&op->render.source_rect, &op->render.node->bounds, &tex_bounds);
}
@@ -1463,6 +1466,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self,
uploader,
start,
clip,
+ &op->render.offset,
&tex_bounds);
get_tex_rect (&op->render.source_rect, &op->render.node->bounds, &tex_bounds);
@@ -1471,6 +1475,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self,
uploader,
end,
clip,
+ &op->render.offset,
&tex_bounds);
get_tex_rect (&op->render.source2_rect, &op->render.node->bounds, &tex_bounds);
}
@@ -1487,6 +1492,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self,
uploader,
top,
clip,
+ &op->render.offset,
&tex_bounds);
get_tex_rect (&op->render.source_rect, &op->render.node->bounds, &tex_bounds);
@@ -1495,13 +1501,14 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self,
uploader,
bottom,
clip,
+ &op->render.offset,
&tex_bounds);
get_tex_rect (&op->render.source2_rect, &op->render.node->bounds, &tex_bounds);
}
break;
case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
- clip = &op->constants.constants.clip;
+ clip = &op->constants.constants.clip.rect.bounds;
break;
default: