vulkan: Track offset in the renderpass
authorBenjamin Otte <otte@redhat.com>
Wed, 10 May 2023 14:40:22 +0000 (16:40 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 4 Jun 2023 17:42:01 +0000 (19:42 +0200)
This avoids emitting lots of push constant updates as most of the
transforms we have are simple translations to adjust drawing for the
next widget.

25 files changed:
gsk/gskroundedrect.c
gsk/gskroundedrectprivate.h
gsk/vulkan/gskvulkanblendmodepipeline.c
gsk/vulkan/gskvulkanblendmodepipelineprivate.h
gsk/vulkan/gskvulkanblurpipeline.c
gsk/vulkan/gskvulkanblurpipelineprivate.h
gsk/vulkan/gskvulkanborderpipeline.c
gsk/vulkan/gskvulkanborderpipelineprivate.h
gsk/vulkan/gskvulkanboxshadowpipeline.c
gsk/vulkan/gskvulkanboxshadowpipelineprivate.h
gsk/vulkan/gskvulkancolorpipeline.c
gsk/vulkan/gskvulkancolorpipelineprivate.h
gsk/vulkan/gskvulkancrossfadepipeline.c
gsk/vulkan/gskvulkancrossfadepipelineprivate.h
gsk/vulkan/gskvulkaneffectpipeline.c
gsk/vulkan/gskvulkaneffectpipelineprivate.h
gsk/vulkan/gskvulkanlineargradientpipeline.c
gsk/vulkan/gskvulkanlineargradientpipelineprivate.h
gsk/vulkan/gskvulkanpushconstants.c
gsk/vulkan/gskvulkanrenderpass.c
gsk/vulkan/gskvulkantextpipelineprivate.h
gsk/vulkan/gskvulkantexturepipeline.c
gsk/vulkan/gskvulkantexturepipelineprivate.h
gtk/inspector/recorder.c
testsuite/gsk/rounded-rect.c

index 7c0733fbe9a8984c84c201119409fd4ca85582e9..ed1131de83f3caeb94942c712863f9c78ad21856 100644 (file)
@@ -766,13 +766,14 @@ gsk_rounded_rect_path (const GskRoundedRect *self,
  * only look at the last vec4 if they have to.
  */
 void
-gsk_rounded_rect_to_float (const GskRoundedRect *self,
-                           float                 rect[12])
+gsk_rounded_rect_to_float (const GskRoundedRect   *self,
+                           const graphene_point_t *offset,
+                           float                   rect[12])
 {
   guint i;
 
-  rect[0] = self->bounds.origin.x;
-  rect[1] = self->bounds.origin.y;
+  rect[0] = self->bounds.origin.x + offset->x;
+  rect[1] = self->bounds.origin.y + offset->y;
   rect[2] = self->bounds.size.width;
   rect[3] = self->bounds.size.height;
 
index b9afb754cc7337cc77d387525d77c41e711cd890..c42906d53ab24f3c370d5774b73663a7019da76f 100644 (file)
@@ -28,6 +28,7 @@ gboolean                 gsk_rounded_rect_is_circular           (const GskRounde
 void                     gsk_rounded_rect_path                  (const GskRoundedRect     *self,
                                                                  cairo_t                  *cr);
 void                     gsk_rounded_rect_to_float              (const GskRoundedRect     *self,
+                                                                 const graphene_point_t   *offset,
                                                                  float                     rect[12]);
 
 gboolean                 gsk_rounded_rect_equal                 (gconstpointer             rect1,
index 117ed414d55d49e9cab8e769f0e386cf614c0b2a..1e6943d9dce4033a0b697e0ba0c8836ff5e6b045 100644 (file)
@@ -106,16 +106,17 @@ gsk_vulkan_blend_mode_pipeline_count_vertex_data (GskVulkanBlendModePipeline *pi
 
 void
 gsk_vulkan_blend_mode_pipeline_collect_vertex_data (GskVulkanBlendModePipeline *pipeline,
-                                                    guchar                *data,
-                                                    const graphene_rect_t *bounds,
-                                                    const graphene_rect_t *start_tex_rect,
-                                                    const graphene_rect_t *end_tex_rect,
-                                                    GskBlendMode blend_mode)
+                                                    guchar                     *data,
+                                                    const graphene_point_t     *offset,
+                                                    const graphene_rect_t      *bounds,
+                                                    const graphene_rect_t      *start_tex_rect,
+                                                    const graphene_rect_t      *end_tex_rect,
+                                                    GskBlendMode                blend_mode)
 {
   GskVulkanBlendModeInstance *instance = (GskVulkanBlendModeInstance *) data;
 
-  instance->rect[0] = bounds->origin.x;
-  instance->rect[1] = bounds->origin.y;
+  instance->rect[0] = bounds->origin.x + offset->x;
+  instance->rect[1] = bounds->origin.y + offset->y;
   instance->rect[2] = bounds->size.width;
   instance->rect[3] = bounds->size.height;
 
index 6382ed73e584981e47818b6f56980fe765f33ed3..3a018b7ef3a48407ceefc3b1f4464e5e67847020 100644 (file)
@@ -21,6 +21,7 @@ GskVulkanPipeline * gsk_vulkan_blend_mode_pipeline_new                 (GdkVulka
 gsize               gsk_vulkan_blend_mode_pipeline_count_vertex_data   (GskVulkanBlendModePipeline *pipeline);
 void                gsk_vulkan_blend_mode_pipeline_collect_vertex_data (GskVulkanBlendModePipeline *pipeline,
                                                                         guchar                     *data,
+                                                                        const graphene_point_t     *offset,
                                                                         const graphene_rect_t      *bounds,
                                                                         const graphene_rect_t      *start_bounds,
                                                                         const graphene_rect_t      *end_bounds,
index 5686e5423a63c465a84e22167b9a6c02e10d8adf..8d596d3227925f274dfdddc2f9e601494579ffde 100644 (file)
@@ -98,16 +98,17 @@ gsk_vulkan_blur_pipeline_count_vertex_data (GskVulkanBlurPipeline *pipeline)
 }
 
 void
-gsk_vulkan_blur_pipeline_collect_vertex_data (GskVulkanBlurPipeline *pipeline,
-                                              guchar                *data,
-                                              const graphene_rect_t *rect,
-                                              const graphene_rect_t *tex_rect,
-                                              double                 blur_radius)
+gsk_vulkan_blur_pipeline_collect_vertex_data (GskVulkanBlurPipeline  *pipeline,
+                                              guchar                 *data,
+                                              const graphene_point_t *offset,
+                                              const graphene_rect_t  *rect,
+                                              const graphene_rect_t  *tex_rect,
+                                              double                  blur_radius)
 {
   GskVulkanBlurInstance *instance = (GskVulkanBlurInstance *) data;
 
-  instance->rect[0] = rect->origin.x;
-  instance->rect[1] = rect->origin.y;
+  instance->rect[0] = rect->origin.x + offset->x;
+  instance->rect[1] = rect->origin.y + offset->y;
   instance->rect[2] = rect->size.width;
   instance->rect[3] = rect->size.height;
   instance->tex_rect[0] = tex_rect->origin.x;
index 74db815b08cc687943924390ab2e5d7463ad57ad..b806ed55018926369bceaf39d347ae390c9366c5 100644 (file)
@@ -20,6 +20,7 @@ GskVulkanPipeline *     gsk_vulkan_blur_pipeline_new                   (GdkVulka
 gsize                   gsk_vulkan_blur_pipeline_count_vertex_data     (GskVulkanBlurPipeline   *pipeline);
 void                    gsk_vulkan_blur_pipeline_collect_vertex_data   (GskVulkanBlurPipeline   *pipeline,
                                                                         guchar                  *data,
+                                                                        const graphene_point_t  *offset,
                                                                         const graphene_rect_t   *rect,
                                                                         const graphene_rect_t   *tex_rect,
                                                                         double                   radius);
index a0da43962b8e1309a383de2b1da6a7d45c606780..dfd0442a62f0197570ceb38c2855d5898f207300 100644 (file)
@@ -132,6 +132,7 @@ gsk_vulkan_border_pipeline_count_vertex_data (GskVulkanBorderPipeline *pipeline)
 void
 gsk_vulkan_border_pipeline_collect_vertex_data (GskVulkanBorderPipeline *pipeline,
                                                 guchar                  *data,
+                                                const graphene_point_t  *offset,
                                                 const GskRoundedRect    *rect,
                                                 const float              widths[4],
                                                 const GdkRGBA            colors[4])
@@ -139,7 +140,7 @@ gsk_vulkan_border_pipeline_collect_vertex_data (GskVulkanBorderPipeline *pipelin
   GskVulkanBorderInstance *instance = (GskVulkanBorderInstance *) data;
   guint i;
 
-  gsk_rounded_rect_to_float (rect, instance->rect);
+  gsk_rounded_rect_to_float (rect, offset, instance->rect);
   for (i = 0; i < 4; i++)
     {
       instance->widths[i] = widths[i];
index 423860bfe2fb486063ab5d8cb2131343eb5a0a62..c10976e7047888ff01d55ba5a6b129a146c369e5 100644 (file)
@@ -21,6 +21,7 @@ GskVulkanPipeline *     gsk_vulkan_border_pipeline_new                  (GdkVulk
 gsize                   gsk_vulkan_border_pipeline_count_vertex_data    (GskVulkanBorderPipeline        *pipeline);
 void                    gsk_vulkan_border_pipeline_collect_vertex_data  (GskVulkanBorderPipeline        *pipeline,
                                                                          guchar                         *data,
+                                                                         const graphene_point_t         *offset,
                                                                          const GskRoundedRect           *rect,
                                                                          const float                     widths[4],
                                                                          const GdkRGBA                   colors[4]);
index fb272176d4f2ee3ebb12955cb12f7749a3b005e6..b4940a97ab998de74525955fbd9574d75e61a891 100644 (file)
@@ -128,6 +128,7 @@ gsk_vulkan_box_shadow_pipeline_count_vertex_data (GskVulkanBoxShadowPipeline *pi
 void
 gsk_vulkan_box_shadow_pipeline_collect_vertex_data (GskVulkanBoxShadowPipeline *pipeline,
                                                     guchar                     *data,
+                                                    const graphene_point_t     *offset,
                                                     const GskRoundedRect       *outline,
                                                     const GdkRGBA              *color,
                                                     float                      dx,
@@ -137,7 +138,7 @@ gsk_vulkan_box_shadow_pipeline_collect_vertex_data (GskVulkanBoxShadowPipeline *
 {
   GskVulkanBoxShadowInstance *instance = (GskVulkanBoxShadowInstance *) data;
 
-  gsk_rounded_rect_to_float (outline, instance->outline);
+  gsk_rounded_rect_to_float (outline, offset, instance->outline);
   instance->color[0] = color->red;
   instance->color[1] = color->green;
   instance->color[2] = color->blue;
index c8a55c120489147fff5cabe346437cdf125b2d9c..7db8d1f9eba05d103228e65683a9179528031733 100644 (file)
@@ -21,6 +21,7 @@ GskVulkanPipeline *     gsk_vulkan_box_shadow_pipeline_new              (GdkVulk
 gsize                   gsk_vulkan_box_shadow_pipeline_count_vertex_data (GskVulkanBoxShadowPipeline    *pipeline);
 void                    gsk_vulkan_box_shadow_pipeline_collect_vertex_data (GskVulkanBoxShadowPipeline  *pipeline,
                                                                          guchar                         *data,
+                                                                         const graphene_point_t         *offset,
                                                                          const GskRoundedRect           *outline,
                                                                          const GdkRGBA                  *color,
                                                                          float                           dx,
index cd6867a1a4f6e41d2b4e59ce1101881e36406a75..b2e548e11049c84348745977897b118448919d88 100644 (file)
@@ -93,13 +93,14 @@ gsk_vulkan_color_pipeline_count_vertex_data (GskVulkanColorPipeline *pipeline)
 void
 gsk_vulkan_color_pipeline_collect_vertex_data (GskVulkanColorPipeline *pipeline,
                                                guchar                 *data,
+                                               const graphene_point_t *offset,
                                                const graphene_rect_t  *rect,
                                                const GdkRGBA          *color)
 {
   GskVulkanColorInstance *instance = (GskVulkanColorInstance *) data;
 
-  instance->rect[0] = rect->origin.x;
-  instance->rect[1] = rect->origin.y;
+  instance->rect[0] = rect->origin.x + offset->x;
+  instance->rect[1] = rect->origin.y + offset->y;
   instance->rect[2] = rect->size.width;
   instance->rect[3] = rect->size.height;
   instance->color[0] = color->red;
index bf9280b26c85e1448f95b4967670e453961a98a7..8c2ec5454dcbe50629283c866c158e122a1152c8 100644 (file)
@@ -20,6 +20,7 @@ GskVulkanPipeline *     gsk_vulkan_color_pipeline_new                   (GdkVulk
 gsize                   gsk_vulkan_color_pipeline_count_vertex_data     (GskVulkanColorPipeline         *pipeline);
 void                    gsk_vulkan_color_pipeline_collect_vertex_data   (GskVulkanColorPipeline         *pipeline,
                                                                          guchar                         *data,
+                                                                         const graphene_point_t         *offset,
                                                                          const graphene_rect_t          *rect,
                                                                          const GdkRGBA                  *color);
 gsize                   gsk_vulkan_color_pipeline_draw                  (GskVulkanColorPipeline         *pipeline,
index 679c583c6e8748f33af780982c97a805875f2b16..7452b8681b88474129b52f3ecc7f021b357f69d3 100644 (file)
@@ -106,16 +106,17 @@ gsk_vulkan_cross_fade_pipeline_count_vertex_data (GskVulkanCrossFadePipeline *pi
 
 void
 gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GskVulkanCrossFadePipeline *pipeline,
-                                                    guchar                *data,
-                                                    const graphene_rect_t *bounds,
-                                                    const graphene_rect_t *start_tex_rect,
-                                                    const graphene_rect_t *end_tex_rect,
-                                                    double                 progress)
+                                                    guchar                     *data,
+                                                    const graphene_point_t     *offset,
+                                                    const graphene_rect_t      *bounds,
+                                                    const graphene_rect_t      *start_tex_rect,
+                                                    const graphene_rect_t      *end_tex_rect,
+                                                    double                      progress)
 {
   GskVulkanCrossFadeInstance *instance = (GskVulkanCrossFadeInstance *) data;
 
-  instance->rect[0] = bounds->origin.x;
-  instance->rect[1] = bounds->origin.y;
+  instance->rect[0] = bounds->origin.x + offset->x;
+  instance->rect[1] = bounds->origin.y + offset->y;
   instance->rect[2] = bounds->size.width;
   instance->rect[3] = bounds->size.height;
 
index 92551c5d46cc6f13d7b58af46af57c1686cd7de9..eee69d6acfc54de2b0b30bb8aa6346d8f80e98be 100644 (file)
@@ -20,6 +20,7 @@ GskVulkanPipeline * gsk_vulkan_cross_fade_pipeline_new                 (GdkVulka
 gsize               gsk_vulkan_cross_fade_pipeline_count_vertex_data   (GskVulkanCrossFadePipeline *pipeline);
 void                gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GskVulkanCrossFadePipeline *pipeline,
                                                                         guchar                     *data,
+                                                                        const graphene_point_t     *offset,
                                                                         const graphene_rect_t      *bounds,
                                                                         const graphene_rect_t      *start_bounds,
                                                                         const graphene_rect_t      *end_bounds,
index aa9973c7115a711c8ebb050d0149eea056ef529a..559eb038e75064da2cf38d10c90a7837ecd9ad08 100644 (file)
@@ -125,6 +125,7 @@ gsk_vulkan_effect_pipeline_count_vertex_data (GskVulkanEffectPipeline *pipeline)
 void
 gsk_vulkan_effect_pipeline_collect_vertex_data (GskVulkanEffectPipeline *pipeline,
                                                 guchar                  *data,
+                                                const graphene_point_t  *offset,
                                                 const graphene_rect_t   *rect,
                                                 const graphene_rect_t   *tex_rect,
                                                 const graphene_matrix_t *color_matrix,
@@ -132,8 +133,8 @@ gsk_vulkan_effect_pipeline_collect_vertex_data (GskVulkanEffectPipeline *pipelin
 {
   GskVulkanEffectInstance *instance = (GskVulkanEffectInstance *) data;
 
-  instance->rect[0] = rect->origin.x;
-  instance->rect[1] = rect->origin.y;
+  instance->rect[0] = rect->origin.x + offset->x;
+  instance->rect[1] = rect->origin.y + offset->y;
   instance->rect[2] = rect->size.width;
   instance->rect[3] = rect->size.height;
   instance->tex_rect[0] = tex_rect->origin.x;
index b08ea07e15fe8dba94331d98cf342fe5248686db..cb4dca445feae48b602eba5184c2210dd11ad7be 100644 (file)
@@ -20,6 +20,7 @@ GskVulkanPipeline *     gsk_vulkan_effect_pipeline_new                  (GdkVulk
 gsize                   gsk_vulkan_effect_pipeline_count_vertex_data    (GskVulkanEffectPipeline        *pipeline);
 void                    gsk_vulkan_effect_pipeline_collect_vertex_data  (GskVulkanEffectPipeline        *pipeline,
                                                                          guchar                         *data,
+                                                                         const graphene_point_t         *offset,
                                                                          const graphene_rect_t          *rect,
                                                                          const graphene_rect_t          *tex_rect,
                                                                          const graphene_matrix_t        *color_matrix,
index 058a2f8416884767376f27944a92e1932a6d8980..bf4b54af7d1eb78e492d82b8c393c046b9572ff5 100644 (file)
@@ -176,6 +176,7 @@ gsk_vulkan_linear_gradient_pipeline_count_vertex_data (GskVulkanLinearGradientPi
 void
 gsk_vulkan_linear_gradient_pipeline_collect_vertex_data (GskVulkanLinearGradientPipeline *pipeline,
                                                          guchar                    *data,
+                                                         const graphene_point_t    *offset,
                                                          const graphene_rect_t     *rect,
                                                          const graphene_point_t    *start,
                                                          const graphene_point_t    *end,
@@ -191,14 +192,14 @@ gsk_vulkan_linear_gradient_pipeline_collect_vertex_data (GskVulkanLinearGradient
       g_warning ("Only %u color stops supported.", GSK_VULKAN_LINEAR_GRADIENT_PIPELINE_MAX_COLOR_STOPS);
       n_stops = GSK_VULKAN_LINEAR_GRADIENT_PIPELINE_MAX_COLOR_STOPS;
     }
-  instance->rect[0] = rect->origin.x;
-  instance->rect[1] = rect->origin.y;
+  instance->rect[0] = rect->origin.x + offset->x;
+  instance->rect[1] = rect->origin.y + offset->y;
   instance->rect[2] = rect->size.width;
   instance->rect[3] = rect->size.height;
-  instance->start[0] = start->x;
-  instance->start[1] = start->y;
-  instance->end[0] = end->x;
-  instance->end[1] = end->y;
+  instance->start[0] = start->x + offset->x;
+  instance->start[1] = start->y + offset->y;
+  instance->end[0] = end->x + offset->x;
+  instance->end[1] = end->y + offset->y;
   instance->repeating = repeating;
   instance->stop_count = n_stops;
   for (i = 0; i < n_stops; i++)
index 176cd92a707a6153d092f039e819a609ece4ae70..fa60c73cd32be6b9e07bd2ac8cbb465ba86ceff6 100644 (file)
@@ -25,6 +25,7 @@ gsize                   gsk_vulkan_linear_gradient_pipeline_count_vertex_data
 void                    gsk_vulkan_linear_gradient_pipeline_collect_vertex_data
                                                                         (GskVulkanLinearGradientPipeline*pipeline,
                                                                          guchar                         *data,
+                                                                         const graphene_point_t         *offset,
                                                                          const graphene_rect_t          *rect,
                                                                          const graphene_point_t         *start,
                                                                          const graphene_point_t         *end,
index e2bf63326b3acbd58c7075f4078b317f9a207453..36ba9852a611945b3aadcb672cbbe9e3c322f4a0 100644 (file)
@@ -78,7 +78,7 @@ gsk_vulkan_push_constants_wire_init (GskVulkanPushConstantsWire   *wire,
                                      const GskVulkanPushConstants *self)
 {
   graphene_matrix_to_float (&self->mvp, wire->common.mvp);
-  gsk_rounded_rect_to_float (&self->clip.rect, wire->common.clip);
+  gsk_rounded_rect_to_float (&self->clip.rect, graphene_point_zero (), wire->common.clip);
 }
 
 void
index d890c36faba2958ce607721384ece1f8b8b97fea..9cbd0b8a7827c61e4a09b37c9b8f1d9ffd28a348 100644 (file)
@@ -63,6 +63,7 @@ struct _GskVulkanOpRender
 {
   GskVulkanOpType      type;
   GskRenderNode       *node; /* node that's the source of this op */
+  graphene_point_t     offset; /* offset of the node */
   GskVulkanPipeline   *pipeline; /* pipeline to use */
   GskRoundedRect       clip; /* clip rect (or random memory if not relevant) */
   GskVulkanImage      *source; /* source image to render */
@@ -79,6 +80,7 @@ struct _GskVulkanOpText
 {
   GskVulkanOpType      type;
   GskRenderNode       *node; /* node that's the source of this op */
+  graphene_point_t     offset; /* offset of the node */
   GskVulkanPipeline   *pipeline; /* pipeline to use */
   GskRoundedRect       clip; /* clip rect (or random memory if not relevant) */
   GskVulkanImage      *source; /* source image to render */
@@ -117,6 +119,7 @@ struct _GskVulkanRenderPass
   cairo_region_t *clip;
 
   graphene_vec2_t scale;
+  graphene_point_t offset;
 
   VkRenderPass render_pass;
   VkSemaphore signal_semaphore;
@@ -247,7 +250,8 @@ gsk_vulkan_render_pass_add_fallback_node (GskVulkanRenderPass          *self,
                                           GskRenderNode                *node)
 {
   GskVulkanOp op = {
-    .render.node = node
+    .render.node = node,
+    .render.offset = self->offset,
   };
 
   switch (constants->clip.type)
@@ -321,7 +325,8 @@ gsk_vulkan_render_pass_add_color_node (GskVulkanRenderPass          *self,
                                        GskRenderNode                *node)
 {
   GskVulkanOp op = {
-    .render.node = node
+    .render.node = node,
+    .render.offset = self->offset,
   };
   GskVulkanPipelineType pipeline_type;
 
@@ -349,7 +354,8 @@ gsk_vulkan_render_pass_add_repeating_linear_gradient_node (GskVulkanRenderPass
 {
   GskVulkanPipelineType pipeline_type;
   GskVulkanOp op = {
-    .render.node = node
+    .render.node = node,
+    .render.offset = self->offset,
   };
 
   if (gsk_linear_gradient_node_get_n_color_stops (node) > GSK_VULKAN_LINEAR_GRADIENT_PIPELINE_MAX_COLOR_STOPS)
@@ -381,7 +387,8 @@ gsk_vulkan_render_pass_add_border_node (GskVulkanRenderPass          *self,
 {
   GskVulkanPipelineType pipeline_type;
   GskVulkanOp op = {
-    .render.node = node
+    .render.node = node,
+    .render.offset = self->offset,
   };
 
   if (gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds))
@@ -408,7 +415,8 @@ gsk_vulkan_render_pass_add_texture_node (GskVulkanRenderPass          *self,
 {
   GskVulkanPipelineType pipeline_type;
   GskVulkanOp op = {
-    .render.node = node
+    .render.node = node,
+    .render.offset = self->offset,
   };
 
   if (gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds))
@@ -435,7 +443,8 @@ gsk_vulkan_render_pass_add_inset_shadow_node (GskVulkanRenderPass          *self
 {
   GskVulkanPipelineType pipeline_type;
   GskVulkanOp op = {
-    .render.node = node
+    .render.node = node,
+    .render.offset = self->offset,
   };
 
   if (gsk_inset_shadow_node_get_blur_radius (node) > 0)
@@ -464,7 +473,8 @@ gsk_vulkan_render_pass_add_outset_shadow_node (GskVulkanRenderPass          *sel
 {
   GskVulkanPipelineType pipeline_type;
   GskVulkanOp op = {
-    .render.node = node
+    .render.node = node,
+    .render.offset = self->offset,
   };
 
   if (gsk_outset_shadow_node_get_blur_radius (node) > 0)
@@ -492,11 +502,13 @@ gsk_vulkan_render_pass_add_transform_node (GskVulkanRenderPass          *self,
                                            GskRenderNode                *node)
 {
   GskVulkanOp op = {
-    .render.node = node
+    .render.node = node,
+    .render.offset = self->offset,
   };
   GskRenderNode *child;
   GskTransform *transform;
   graphene_vec2_t old_scale;
+  graphene_point_t old_offset;
   float scale_x;
   float scale_y;
   graphene_vec2_t scale;
@@ -506,14 +518,23 @@ gsk_vulkan_render_pass_add_transform_node (GskVulkanRenderPass          *self,
     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);
 
   switch (gsk_transform_get_category (transform))
     {
     case GSK_TRANSFORM_CATEGORY_IDENTITY:
     case GSK_TRANSFORM_CATEGORY_2D_TRANSLATE:
-      scale_x = scale_y = 1;
-      break;
+      {
+        float dx, dy;
+        gsk_transform_to_translate (transform, &dx, &dy);
+        self->offset.x += dx;
+        self->offset.y += dy;
+        gsk_vulkan_render_pass_add_node (self, render, constants, child);
+        self->offset.x -= dx;
+        self->offset.y -= dy;
+      }
+      return TRUE;
 
     case GSK_TRANSFORM_CATEGORY_2D_AFFINE:
       {
@@ -562,13 +583,16 @@ gsk_vulkan_render_pass_add_transform_node (GskVulkanRenderPass          *self,
       break;
     }
 
-  child = gsk_transform_node_get_child (node);
+  transform = gsk_transform_transform (gsk_transform_translate (NULL, &self->offset),
+                                       transform);
   if (!gsk_vulkan_push_constants_transform (&op.constants.constants, constants, transform, &child->bounds))
     FALLBACK ("Transform nodes can't deal with clip type %u", constants->clip.type);
 
   op.type = GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS;
   g_array_append_val (self->render_ops, op);
 
+  old_offset = self->offset;
+  self->offset = *graphene_point_zero ();
   graphene_vec2_init_from_vec2 (&old_scale, &self->scale);
   graphene_vec2_init (&scale, fabs (scale_x), fabs (scale_y));
   graphene_vec2_multiply (&self->scale, &scale, &self->scale);
@@ -579,6 +603,9 @@ gsk_vulkan_render_pass_add_transform_node (GskVulkanRenderPass          *self,
   g_array_append_val (self->render_ops, op);
 
   graphene_vec2_init_from_vec2 (&self->scale, &old_scale);
+  self->offset = old_offset;
+
+  gsk_transform_unref (transform);
 
   return TRUE;
 }
@@ -591,7 +618,8 @@ gsk_vulkan_render_pass_add_opacity_node (GskVulkanRenderPass          *self,
 {
   GskVulkanPipelineType pipeline_type;
   GskVulkanOp op = {
-    .render.node = node
+    .render.node = node,
+    .render.offset = self->offset,
   };
 
   if (gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds))
@@ -618,7 +646,8 @@ gsk_vulkan_render_pass_add_color_matrix_node (GskVulkanRenderPass          *self
 {
   GskVulkanPipelineType pipeline_type;
   GskVulkanOp op = {
-    .render.node = node
+    .render.node = node,
+    .render.offset = self->offset,
   };
 
   if (gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds))
@@ -644,10 +673,16 @@ gsk_vulkan_render_pass_add_clip_node (GskVulkanRenderPass          *self,
                                       GskRenderNode                *node)
 {
   GskVulkanOp op = {
-    .render.node = node
+    .render.node = node,
+    .render.offset = self->offset,
   };
+  graphene_rect_t clip;
+
+  graphene_rect_offset_r (gsk_clip_node_get_clip (node),
+                          self->offset.x, self->offset.y,
+                          &clip);
 
-  if (!gsk_vulkan_push_constants_intersect_rect (&op.constants.constants, constants, gsk_clip_node_get_clip (node)))
+  if (!gsk_vulkan_push_constants_intersect_rect (&op.constants.constants, constants, &clip))
     FALLBACK ("Failed to find intersection between clip of type %u and rectangle", constants->clip.type);
 
   if (op.constants.constants.clip.type == GSK_VULKAN_CLIP_ALL_CLIPPED)
@@ -671,12 +706,15 @@ gsk_vulkan_render_pass_add_rounded_clip_node (GskVulkanRenderPass          *self
                                               GskRenderNode                *node)
 {
   GskVulkanOp op = {
-    .render.node = node
+    .render.node = node,
+    .render.offset = self->offset,
   };
+  GskRoundedRect clip;
 
-  if (!gsk_vulkan_push_constants_intersect_rounded (&op.constants.constants,
-                                                    constants,
-                                                    gsk_rounded_clip_node_get_clip (node)))
+  clip = *gsk_rounded_clip_node_get_clip (node);
+  gsk_rounded_rect_offset (&clip, self->offset.x, self->offset.y);
+
+  if (!gsk_vulkan_push_constants_intersect_rounded (&op.constants.constants, constants, &clip))
     FALLBACK ("Failed to find intersection between clip of type %u and rounded rectangle", constants->clip.type);
 
   if (op.constants.constants.clip.type == GSK_VULKAN_CLIP_ALL_CLIPPED)
@@ -701,7 +739,8 @@ gsk_vulkan_render_pass_add_repeat_node (GskVulkanRenderPass          *self,
 {
   GskVulkanPipelineType pipeline_type;
   GskVulkanOp op = {
-    .render.node = node
+    .render.node = node,
+    .render.offset = self->offset,
   };
 
   if (graphene_rect_get_area (gsk_repeat_node_get_child_bounds (node)) == 0)
@@ -731,7 +770,8 @@ gsk_vulkan_render_pass_add_blend_node (GskVulkanRenderPass          *self,
 {
   GskVulkanPipelineType pipeline_type;
   GskVulkanOp op = {
-    .render.node = node
+    .render.node = node,
+    .render.offset = self->offset,
   };
 
   if (gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds))
@@ -757,7 +797,8 @@ gsk_vulkan_render_pass_add_cross_fade_node (GskVulkanRenderPass          *self,
                                             GskRenderNode                *node)
 {
   GskVulkanOp op = {
-    .render.node = node
+    .render.node = node,
+    .render.offset = self->offset,
   };
   GskVulkanPipelineType pipeline_type;
 
@@ -784,7 +825,8 @@ gsk_vulkan_render_pass_add_text_node (GskVulkanRenderPass          *self,
                                       GskRenderNode                *node)
 {
   GskVulkanOp op = {
-    .render.node = node
+    .render.node = node,
+    .render.offset = self->offset,
   };
   GskVulkanPipelineType pipeline_type;
   const PangoGlyphInfo *glyphs;
@@ -877,7 +919,8 @@ gsk_vulkan_render_pass_add_blur_node (GskVulkanRenderPass          *self,
 {
   GskVulkanPipelineType pipeline_type;
   GskVulkanOp op = {
-    .render.node = node
+    .render.node = node,
+    .render.offset = self->offset,
   };
 
   if (gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds))
@@ -1001,6 +1044,8 @@ gsk_vulkan_render_pass_add (GskVulkanRenderPass     *self,
   g_array_append_val (self->render_ops, op);
 
   gsk_vulkan_render_pass_add_node (self, render, &op.constants.constants, node);
+
+  self->offset = GRAPHENE_POINT_INIT (0, 0);
 }
 
 static GskVulkanImage *
@@ -1207,13 +1252,17 @@ gsk_vulkan_render_pass_upload_fallback (GskVulkanRenderPass  *self,
   if (op->type == GSK_VULKAN_OP_FALLBACK_CLIP)
     {
       cairo_rectangle (cr,
-                       op->clip.bounds.origin.x, op->clip.bounds.origin.y,
-                       op->clip.bounds.size.width, op->clip.bounds.size.height);
+                       op->clip.bounds.origin.x - op->offset.x,
+                       op->clip.bounds.origin.y - op->offset.y,
+                       op->clip.bounds.size.width,
+                       op->clip.bounds.size.height);
       cairo_clip (cr);
     }
   else if (op->type == GSK_VULKAN_OP_FALLBACK_ROUNDED_CLIP)
     {
+      cairo_translate (cr, - op->offset.x, - op->offset.y);
       gsk_rounded_rect_path (&op->clip, cr);
+      cairo_translate (cr, op->offset.x, op->offset.y);
       cairo_clip (cr);
     }
   else
@@ -1227,8 +1276,10 @@ gsk_vulkan_render_pass_upload_fallback (GskVulkanRenderPass  *self,
   if (GSK_RENDERER_DEBUG_CHECK (gsk_vulkan_render_get_renderer (render), FALLBACK))
     {
       cairo_rectangle (cr,
-                       op->clip.bounds.origin.x, op->clip.bounds.origin.y,
-                       op->clip.bounds.size.width, op->clip.bounds.size.height);
+                       op->clip.bounds.origin.x - op->offset.x,
+                       op->clip.bounds.origin.y - op->offset.y,
+                       op->clip.bounds.size.width,
+                       op->clip.bounds.size.height);
       if (gsk_render_node_get_node_type (node) == GSK_CAIRO_NODE)
         cairo_set_source_rgba (cr, 0.3, 0, 1, 0.25);
       else
@@ -1579,6 +1630,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
             op->render.vertex_offset = offset + n_bytes;
             gsk_vulkan_texture_pipeline_collect_vertex_data (GSK_VULKAN_TEXTURE_PIPELINE (op->render.pipeline),
                                                              data + n_bytes + offset,
+                                                             &op->render.offset,
                                                              &op->render.node->bounds,
                                                              &op->render.source_rect);
             n_bytes += op->render.vertex_count;
@@ -1590,6 +1642,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
             op->render.vertex_offset = offset + n_bytes;
             gsk_vulkan_texture_pipeline_collect_vertex_data (GSK_VULKAN_TEXTURE_PIPELINE (op->render.pipeline),
                                                              data + n_bytes + offset,
+                                                             &op->render.offset,
                                                              &op->render.node->bounds,
                                                              &op->render.source_rect);
             n_bytes += op->render.vertex_count;
@@ -1607,7 +1660,10 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
                                                           gsk_text_node_get_num_glyphs (op->text.node),
                                                           gsk_text_node_get_glyphs (op->text.node, NULL),
                                                           gsk_text_node_get_color (op->text.node),
-                                                          gsk_text_node_get_offset (op->text.node),
+                                                          &GRAPHENE_POINT_INIT (
+                                                            gsk_text_node_get_offset (op->text.node)->x + op->render.offset.x,
+                                                            gsk_text_node_get_offset (op->text.node)->y + op->render.offset.y
+                                                          ),
                                                           op->text.start_glyph,
                                                           op->text.num_glyphs,
                                                           op->text.scale);
@@ -1625,7 +1681,10 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
                                                                 (PangoFont *)gsk_text_node_get_font (op->text.node),
                                                                 gsk_text_node_get_num_glyphs (op->text.node),
                                                                 gsk_text_node_get_glyphs (op->text.node, NULL),
-                                                                gsk_text_node_get_offset (op->text.node),
+                                                                &GRAPHENE_POINT_INIT (
+                                                                  gsk_text_node_get_offset (op->text.node)->x + op->render.offset.x,
+                                                                  gsk_text_node_get_offset (op->text.node)->y + op->render.offset.y
+                                                                ),
                                                                 op->text.start_glyph,
                                                                 op->text.num_glyphs,
                                                                 op->text.scale);
@@ -1638,6 +1697,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
             op->render.vertex_offset = offset + n_bytes;
             gsk_vulkan_color_pipeline_collect_vertex_data (GSK_VULKAN_COLOR_PIPELINE (op->render.pipeline),
                                                            data + n_bytes + offset,
+                                                           &op->render.offset,
                                                            &op->render.node->bounds,
                                                            gsk_color_node_get_color (op->render.node));
             n_bytes += op->render.vertex_count;
@@ -1649,6 +1709,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
             op->render.vertex_offset = offset + n_bytes;
             gsk_vulkan_linear_gradient_pipeline_collect_vertex_data (GSK_VULKAN_LINEAR_GRADIENT_PIPELINE (op->render.pipeline),
                                                                      data + n_bytes + offset,
+                                                                     &op->render.offset,
                                                                      &op->render.node->bounds,
                                                                      gsk_linear_gradient_node_get_start (op->render.node),
                                                                      gsk_linear_gradient_node_get_end (op->render.node),
@@ -1676,6 +1737,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
 
             gsk_vulkan_effect_pipeline_collect_vertex_data (GSK_VULKAN_EFFECT_PIPELINE (op->render.pipeline),
                                                             data + n_bytes + offset,
+                                                            &op->render.offset,
                                                             &op->render.node->bounds,
                                                             &op->render.source_rect,
                                                             &color_matrix,
@@ -1689,6 +1751,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
             op->render.vertex_offset = offset + n_bytes;
             gsk_vulkan_blur_pipeline_collect_vertex_data (GSK_VULKAN_BLUR_PIPELINE (op->render.pipeline),
                                                           data + n_bytes + offset,
+                                                          &op->render.offset,
                                                           &op->render.node->bounds,
                                                           &op->render.source_rect,
                                                           gsk_blur_node_get_radius (op->render.node));
@@ -1701,6 +1764,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
             op->render.vertex_offset = offset + n_bytes;
             gsk_vulkan_effect_pipeline_collect_vertex_data (GSK_VULKAN_EFFECT_PIPELINE (op->render.pipeline),
                                                             data + n_bytes + offset,
+                                                            &op->render.offset,
                                                             &op->render.node->bounds,
                                                             &op->render.source_rect,
                                                             gsk_color_matrix_node_get_color_matrix (op->render.node),
@@ -1714,6 +1778,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
             op->render.vertex_offset = offset + n_bytes;
             gsk_vulkan_border_pipeline_collect_vertex_data (GSK_VULKAN_BORDER_PIPELINE (op->render.pipeline),
                                                             data + n_bytes + offset,
+                                                            &op->render.offset,
                                                             gsk_border_node_get_outline (op->render.node),
                                                             gsk_border_node_get_widths (op->render.node),
                                                             gsk_border_node_get_colors (op->render.node));
@@ -1726,6 +1791,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
             op->render.vertex_offset = offset + n_bytes;
             gsk_vulkan_box_shadow_pipeline_collect_vertex_data (GSK_VULKAN_BOX_SHADOW_PIPELINE (op->render.pipeline),
                                                                 data + n_bytes + offset,
+                                                                &op->render.offset,
                                                                 gsk_inset_shadow_node_get_outline (op->render.node),
                                                                 gsk_inset_shadow_node_get_color (op->render.node),
                                                                 gsk_inset_shadow_node_get_dx (op->render.node),
@@ -1741,6 +1807,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
             op->render.vertex_offset = offset + n_bytes;
             gsk_vulkan_box_shadow_pipeline_collect_vertex_data (GSK_VULKAN_BOX_SHADOW_PIPELINE (op->render.pipeline),
                                                                 data + n_bytes + offset,
+                                                                &op->render.offset,
                                                                 gsk_outset_shadow_node_get_outline (op->render.node),
                                                                 gsk_outset_shadow_node_get_color (op->render.node),
                                                                 gsk_outset_shadow_node_get_dx (op->render.node),
@@ -1756,6 +1823,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
             op->render.vertex_offset = offset + n_bytes;
             gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GSK_VULKAN_CROSS_FADE_PIPELINE (op->render.pipeline),
                                                                 data + n_bytes + offset,
+                                                                &op->render.offset,
                                                                 &op->render.node->bounds,
                                                                 &op->render.source_rect,
                                                                 &op->render.source2_rect,
@@ -1769,6 +1837,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
             op->render.vertex_offset = offset + n_bytes;
             gsk_vulkan_blend_mode_pipeline_collect_vertex_data (GSK_VULKAN_BLEND_MODE_PIPELINE (op->render.pipeline),
                                                                 data + n_bytes + offset,
+                                                                &op->render.offset,
                                                                 &op->render.node->bounds,
                                                                 &op->render.source_rect,
                                                                 &op->render.source2_rect,
index 59d0a2da4590762fbce37156bf07d8792922cf30..eddd572f68395df19a378cb68d2aab32b5f3f68a 100644 (file)
@@ -21,21 +21,21 @@ GskVulkanPipeline *     gsk_vulkan_text_pipeline_new                   (GdkVulka
 gsize                   gsk_vulkan_text_pipeline_count_vertex_data     (GskVulkanTextPipeline         *pipeline,
                                                                         int                            num_instances);
 void                    gsk_vulkan_text_pipeline_collect_vertex_data   (GskVulkanTextPipeline         *pipeline,
-                                                                        guchar                         *data,
-                                                                        GskVulkanRenderer              *renderer,
-                                                                        const graphene_rect_t          *rect,
-                                                                        PangoFont                      *font,
-                                                                        guint                           total_glyphs,
-                                                                        const PangoGlyphInfo           *glyphs,
-                                                                        const GdkRGBA                  *color,
-                                                                        const graphene_point_t         *offset,
-                                                                        guint                           start_glyph,
-                                                                        guint                           num_glyphs,
-                                                                        float                           scale);
+                                                                        guchar                        *data,
+                                                                        GskVulkanRenderer             *renderer,
+                                                                        const graphene_rect_t         *rect,
+                                                                        PangoFont                     *font,
+                                                                        guint                          total_glyphs,
+                                                                        const PangoGlyphInfo          *glyphs,
+                                                                        const GdkRGBA                 *color,
+                                                                        const graphene_point_t        *offset,
+                                                                        guint                          start_glyph,
+                                                                        guint                          num_glyphs,
+                                                                        float                          scale);
 gsize                   gsk_vulkan_text_pipeline_draw                  (GskVulkanTextPipeline         *pipeline,
-                                                                        VkCommandBuffer                 command_buffer,
-                                                                        gsize                           offset,
-                                                                        gsize                           n_commands);
+                                                                        VkCommandBuffer                command_buffer,
+                                                                        gsize                          offset,
+                                                                        gsize                          n_commands);
 
 G_END_DECLS
 
index 9db719093bccef15e656dca3be25f6b4079b8bf7..bcb238918d051a04eafacbb4993df886a31c06a6 100644 (file)
@@ -93,13 +93,14 @@ gsk_vulkan_texture_pipeline_count_vertex_data (GskVulkanTexturePipeline *pipelin
 void
 gsk_vulkan_texture_pipeline_collect_vertex_data (GskVulkanTexturePipeline *pipeline,
                                                  guchar                   *data,
+                                                 const graphene_point_t   *offset,
                                                  const graphene_rect_t    *rect,
                                                  const graphene_rect_t    *tex_rect)
 {
   GskVulkanTextureInstance *instance = (GskVulkanTextureInstance *) data;
 
-  instance->rect[0] = rect->origin.x;
-  instance->rect[1] = rect->origin.y;
+  instance->rect[0] = rect->origin.x + offset->x;
+  instance->rect[1] = rect->origin.y + offset->y;
   instance->rect[2] = rect->size.width;
   instance->rect[3] = rect->size.height;
   instance->tex_rect[0] = tex_rect->origin.x;
index a4f5f8b1737c3b1d2111ae7522a73458857b05df..71f5382475612664088d4262d8f36a3ca146b92b 100644 (file)
@@ -20,6 +20,7 @@ GskVulkanPipeline *     gsk_vulkan_texture_pipeline_new                 (GdkVulk
 gsize                   gsk_vulkan_texture_pipeline_count_vertex_data   (GskVulkanTexturePipeline *pipeline);
 void                    gsk_vulkan_texture_pipeline_collect_vertex_data (GskVulkanTexturePipeline *pipeline,
                                                                          guchar                   *data,
+                                                                         const graphene_point_t   *offset,
                                                                          const graphene_rect_t    *rect,
                                                                          const graphene_rect_t    *tex_rect);
 gsize                   gsk_vulkan_texture_pipeline_draw                (GskVulkanTexturePipeline *pipeline,
index 78db4669cf2e407594c4ca0ec76ea8a5b682e719..89f1826bd88fcedb337d9656866f980050167ed0 100644 (file)
@@ -1267,7 +1267,7 @@ populate_render_node_properties (GListStore    *store,
         float radius = gsk_outset_shadow_node_get_blur_radius (node);
         float rect[12];
 
-        gsk_rounded_rect_to_float (outline, rect);
+        gsk_rounded_rect_to_float (outline, graphene_point_zero (), rect);
         tmp = g_strdup_printf ("%.2f x %.2f + %.2f + %.2f",
                                rect[2], rect[3], rect[0], rect[1]);
         add_text_row (store, "Outline", tmp);
index 6ea7e7475b3d358ba3ad42c9562890c860caf504..5a72928257d5fc6a53b74f41be50365f0755917a 100644 (file)
@@ -152,12 +152,19 @@ test_to_float (void)
                          &GRAPHENE_SIZE_INIT (8, 9),
                          &GRAPHENE_SIZE_INIT (10, 11));
 
-  gsk_rounded_rect_to_float (&rect, flt);
+  gsk_rounded_rect_to_float (&rect, &GRAPHENE_POINT_INIT(0, 0), flt);
   g_assert_true (flt[0] == 0. && flt[1] == 11. && flt[2] == 22. && flt[3] == 33.);
   g_assert_true (flt[4] == 4. && flt[5] == 6.);
   g_assert_true (flt[6] == 8. && flt[7] == 10.);
   g_assert_true (flt[8] == 5. && flt[9] == 7.);
   g_assert_true (flt[10] == 9. && flt[11] == 11.);
+
+  gsk_rounded_rect_to_float (&rect, &GRAPHENE_POINT_INIT(100, 200), flt);
+  g_assert_true (flt[0] == 100. && flt[1] == 211. && flt[2] == 22. && flt[3] == 33.);
+  g_assert_true (flt[4] == 4. && flt[5] == 6.);
+  g_assert_true (flt[6] == 8. && flt[7] == 10.);
+  g_assert_true (flt[8] == 5. && flt[9] == 7.);
+  g_assert_true (flt[10] == 9. && flt[11] == 11.);
 }
 
 #define ROUNDED_RECT_INIT_FULL(x,y,w,h,w0,h0,w1,h1,w2,h2,w3,h3) \