gsk/vulkan/renderpass: Refactor scale
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>
Fri, 24 Mar 2023 01:26:14 +0000 (22:26 -0300)
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>
Sat, 1 Apr 2023 17:46:56 +0000 (14:46 -0300)
Instead of tracking a single scale, track x and y scales separately.
Factor out gsk_vulkan_render_pass_new() into a private function that
receives both scales, and pass 'scale_factor' for both.

gsk/vulkan/gskvulkanrender.c
gsk/vulkan/gskvulkanrenderpass.c
gsk/vulkan/gskvulkanrenderpassprivate.h

index f2670f697fe4beeb08647e648c12827079268a67..3264daa2b88741e56ad01710af81d43e5f7ac709 100644 (file)
@@ -345,6 +345,7 @@ gsk_vulkan_render_add_node (GskVulkanRender *self,
   pass = gsk_vulkan_render_pass_new (self->vulkan,
                                      self->target,
                                      self->scale_factor,
+                                     self->scale_factor,
                                      &mv,
                                      &self->viewport,
                                      self->clip,
index 04b9e3d8d9c969638903f98e70c271c86d79b7b6..cd412e7df3dbb257afb4edf8a5102b814f797da6 100644 (file)
@@ -113,12 +113,14 @@ struct _GskVulkanRenderPass
   GArray *render_ops;
 
   GskVulkanImage *target;
-  int scale_factor;
   graphene_rect_t viewport;
   cairo_region_t *clip;
   graphene_matrix_t mv;
   graphene_matrix_t p;
 
+  float scale_x;
+  float scale_y;
+
   VkRenderPass render_pass;
   VkSemaphore signal_semaphore;
   GArray *wait_semaphores;
@@ -131,7 +133,8 @@ struct _GskVulkanRenderPass
 GskVulkanRenderPass *
 gsk_vulkan_render_pass_new (GdkVulkanContext  *context,
                             GskVulkanImage    *target,
-                            int                scale_factor,
+                            float              scale_x,
+                            float              scale_y,
                             graphene_matrix_t *mv,
                             graphene_rect_t   *viewport,
                             cairo_region_t    *clip,
@@ -145,9 +148,10 @@ gsk_vulkan_render_pass_new (GdkVulkanContext  *context,
   self->render_ops = g_array_new (FALSE, FALSE, sizeof (GskVulkanOp));
 
   self->target = g_object_ref (target);
-  self->scale_factor = scale_factor;
   self->clip = cairo_region_copy (clip);
   self->viewport = *viewport;
+  self->scale_x = scale_x;
+  self->scale_y = scale_y;
 
   self->mv = *mv;
   graphene_matrix_init_ortho (&self->p,
@@ -767,7 +771,7 @@ gsk_vulkan_render_pass_add_text_node (GskVulkanRenderPass          *self,
 
   op.text.start_glyph = 0;
   op.text.texture_index = G_MAXUINT;
-  op.text.scale = self->scale_factor;
+  op.text.scale = MAX (fabs (self->scale_x), fabs (self->scale_y));
 
   x_position = 0;
   for (i = 0, count = 0; i < num_glyphs; i++)
@@ -1019,7 +1023,8 @@ gsk_vulkan_render_pass_get_node_as_texture (GskVulkanRenderPass   *self,
 
         pass = gsk_vulkan_render_pass_new (self->vulkan,
                                            result,
-                                           self->scale_factor,
+                                           self->scale_x,
+                                           self->scale_y,
                                            &self->mv,
                                            &view,
                                            clip,
@@ -1114,9 +1119,9 @@ gsk_vulkan_render_pass_upload_fallback (GskVulkanRenderPass  *self,
 
   /* XXX: We could intersect bounds with clip bounds here */
   surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
-                                        ceil (node->bounds.size.width * self->scale_factor),
-                                        ceil (node->bounds.size.height * self->scale_factor));
-  cairo_surface_set_device_scale (surface, self->scale_factor, self->scale_factor);
+                                        ceil (node->bounds.size.width * self->scale_x),
+                                        ceil (node->bounds.size.height * self->scale_y));
+  cairo_surface_set_device_scale (surface, self->scale_x, self->scale_y);
   cr = cairo_create (surface);
   cairo_translate (cr, -node->bounds.origin.x, -node->bounds.origin.y);
 
@@ -2181,8 +2186,8 @@ gsk_vulkan_render_pass_draw (GskVulkanRenderPass     *self,
                        0,
                        1,
                        &(VkRect2D) {
-                          { rect.x * self->scale_factor, rect.y * self->scale_factor },
-                          { rect.width * self->scale_factor, rect.height * self->scale_factor }
+                          { rect.x * self->scale_x, rect.y * self->scale_y },
+                          { rect.width * self->scale_x, rect.height * self->scale_y }
                        });
 
       vkCmdBeginRenderPass (command_buffer,
@@ -2191,8 +2196,8 @@ gsk_vulkan_render_pass_draw (GskVulkanRenderPass     *self,
                                 .renderPass = self->render_pass,
                                 .framebuffer = gsk_vulkan_render_get_framebuffer (render, self->target),
                                 .renderArea = { 
-                                    { rect.x * self->scale_factor, rect.y * self->scale_factor },
-                                    { rect.width * self->scale_factor, rect.height * self->scale_factor }
+                                    { rect.x * self->scale_x, rect.y * self->scale_y },
+                                    { rect.width * self->scale_x, rect.height * self->scale_y }
                                 },
                                 .clearValueCount = 1,
                                 .pClearValues = (VkClearValue [1]) {
index 379db3bac2e4dace25bc8fdddc9c225b38f8f46b..de92fe647523f29d9719b0cfc7c68a35904a4c12 100644 (file)
@@ -13,7 +13,8 @@ G_BEGIN_DECLS
 
 GskVulkanRenderPass *   gsk_vulkan_render_pass_new                      (GdkVulkanContext       *context,
                                                                          GskVulkanImage         *target,
-                                                                         int                     scale_factor,
+                                                                         float                   scale_x,
+                                                                         float                   scale_y,
                                                                          graphene_matrix_t      *mv,
                                                                          graphene_rect_t        *viewport,
                                                                          cairo_region_t         *clip,