summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2023-05-12 15:23:02 +0200
committerBenjamin Otte <otte@redhat.com>2023-05-17 02:25:32 +0200
commitc41527dd2417ad45ca591250a5da41921d70511a (patch)
treeddf2d2c3af0430ef0934a535d24e7ab4de03022f
parent23af8acbba234edd6fec58e7adff35219ed59849 (diff)
downloadgtk+-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.c24
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: