diff options
author | Benjamin Otte <otte@redhat.com> | 2023-05-12 15:23:02 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2023-05-17 02:25:32 +0200 |
commit | c41527dd2417ad45ca591250a5da41921d70511a (patch) | |
tree | ddf2d2c3af0430ef0934a535d24e7ab4de03022f | |
parent | 23af8acbba234edd6fec58e7adff35219ed59849 (diff) | |
download | gtk+-c41527dd2417ad45ca591250a5da41921d70511a.tar.gz |
vulkan: Use scale factor for offscreens and fallbacks
Previously, we just used the defaultscale factor, but now that we're
having it available in push constants, we can read it back for creating
offscreens and rendering fallbacks.
So do that.
-rw-r--r-- | gsk/vulkan/gskvulkanrenderpass.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index 73311203e5..43c3dab56c 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -1118,8 +1118,8 @@ gsk_vulkan_render_pass_render_offscreen (GdkVulkanContext *vulkan, scale_x = graphene_vec2_get_x (scale); scale_y = graphene_vec2_get_y (scale); - view = GRAPHENE_RECT_INIT (viewport->origin.x, - viewport->origin.y, + view = GRAPHENE_RECT_INIT (scale_x * viewport->origin.x, + scale_y * viewport->origin.y, ceil (scale_x * viewport->size.width), ceil (scale_y * viewport->size.height)); @@ -1162,6 +1162,7 @@ gsk_vulkan_render_pass_get_node_as_texture (GskVulkanRenderPass *self, GskVulkanRender *render, GskVulkanUploader *uploader, GskRenderNode *node, + const graphene_vec2_t *scale, const graphene_rect_t *clip_bounds, const graphene_point_t *clip_offset, graphene_rect_t *tex_bounds) @@ -1219,7 +1220,7 @@ gsk_vulkan_render_pass_get_node_as_texture (GskVulkanRenderPass *self, uploader, semaphore, node, - &self->scale, + scale, &clipped); } } @@ -1238,8 +1239,9 @@ gsk_vulkan_render_pass_get_node_as_texture (GskVulkanRenderPass *self, /* XXX: We could intersect bounds with clip bounds here */ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, - ceil (node->bounds.size.width), - ceil (node->bounds.size.height)); + ceil (node->bounds.size.width * graphene_vec2_get_x (scale)), + ceil (node->bounds.size.height * graphene_vec2_get_y (scale))); + cairo_surface_set_device_scale (surface, graphene_vec2_get_x (scale), graphene_vec2_get_y (scale)); cr = cairo_create (surface); cairo_translate (cr, -node->bounds.origin.x, -node->bounds.origin.y); @@ -1380,6 +1382,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self, GskVulkanOp *op; guint i; const graphene_rect_t *clip = NULL; + const graphene_vec2_t *scale = NULL; for (i = 0; i < self->render_ops->len; i++) { @@ -1422,6 +1425,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self, render, uploader, child, + scale, clip, &op->render.offset, &tex_bounds); @@ -1458,7 +1462,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self, uploader, semaphore, child, - &self->scale, + scale, child_bounds); get_tex_rect (&op->render.source_rect, &op->render.node->bounds, child_bounds); } @@ -1468,6 +1472,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self, render, uploader, child, + scale, &child->bounds, &GRAPHENE_POINT_INIT (0, 0), &tex_bounds); @@ -1485,6 +1490,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self, render, uploader, child, + scale, clip, &op->render.offset, &tex_bounds); @@ -1501,6 +1507,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self, render, uploader, child, + scale, clip, &op->render.offset, &tex_bounds); @@ -1518,6 +1525,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self, render, uploader, start, + scale, clip, &op->render.offset, &tex_bounds); @@ -1527,6 +1535,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self, render, uploader, end, + scale, clip, &op->render.offset, &tex_bounds); @@ -1544,6 +1553,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self, render, uploader, top, + scale, clip, &op->render.offset, &tex_bounds); @@ -1553,6 +1563,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self, render, uploader, bottom, + scale, clip, &op->render.offset, &tex_bounds); @@ -1562,6 +1573,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self, case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS: clip = &op->constants.clip.bounds; + scale = &op->constants.scale; break; default: |