summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2023-03-23 22:26:14 -0300
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2023-04-01 14:46:56 -0300
commite0aaf9bc83ecb43ece3c80d1bf34048a87b01045 (patch)
tree4ab6e297a7cc7dd9ec8a7e9f2ca0d82efc7b6e45
parentb1a8c0e686a092012013b31314a49964a0c258bc (diff)
downloadgtk+-e0aaf9bc83ecb43ece3c80d1bf34048a87b01045.tar.gz
gsk/vulkan/renderpass: Refactor scale
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.
-rw-r--r--gsk/vulkan/gskvulkanrender.c1
-rw-r--r--gsk/vulkan/gskvulkanrenderpass.c29
-rw-r--r--gsk/vulkan/gskvulkanrenderpassprivate.h3
3 files changed, 20 insertions, 13 deletions
diff --git a/gsk/vulkan/gskvulkanrender.c b/gsk/vulkan/gskvulkanrender.c
index f2670f697f..3264daa2b8 100644
--- a/gsk/vulkan/gskvulkanrender.c
+++ b/gsk/vulkan/gskvulkanrender.c
@@ -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,
diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c
index 04b9e3d8d9..cd412e7df3 100644
--- a/gsk/vulkan/gskvulkanrenderpass.c
+++ b/gsk/vulkan/gskvulkanrenderpass.c
@@ -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]) {
diff --git a/gsk/vulkan/gskvulkanrenderpassprivate.h b/gsk/vulkan/gskvulkanrenderpassprivate.h
index 379db3bac2..de92fe6475 100644
--- a/gsk/vulkan/gskvulkanrenderpassprivate.h
+++ b/gsk/vulkan/gskvulkanrenderpassprivate.h
@@ -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,