From f9457af128012fd3935a69fdcefb722df3ad189c Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 31 Mar 2021 14:36:24 -0400 Subject: [PATCH] ngl: Fix offscreen rendering with transforms There was confusion here about the handling of the modelview transform. The modelview transform we are getting is already set up for rendering the node we are given, so keep it - except for possible adding an extra scale on top when the texture would otherwise be too big. --- gsk/ngl/gsknglrenderjob.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/gsk/ngl/gsknglrenderjob.c b/gsk/ngl/gsknglrenderjob.c index 08e99a7d19..1e62b4ecc7 100644 --- a/gsk/ngl/gsknglrenderjob.c +++ b/gsk/ngl/gsknglrenderjob.c @@ -3566,8 +3566,8 @@ gsk_ngl_render_job_visit_node_with_offscreen (GskNglRenderJob *job, float scaled_width; float scaled_height; - float scale_x = job->scale_x; - float scale_y = job->scale_y; + float downscale_x = 1; + float downscale_y = 1; g_assert (job->command_queue->max_texture_size > 0); @@ -3578,17 +3578,17 @@ gsk_ngl_render_job_visit_node_with_offscreen (GskNglRenderJob *job, { int max_texture_size = job->command_queue->max_texture_size; - scaled_width = ceilf (offscreen->bounds->size.width * scale_x); + scaled_width = ceilf (offscreen->bounds->size.width * job->scale_x); if (scaled_width > max_texture_size) { - scale_x *= (float)max_texture_size / scaled_width; + downscale_x = (float)max_texture_size / scaled_width; scaled_width = max_texture_size; } - scaled_height = ceilf (offscreen->bounds->size.height * scale_y); + scaled_height = ceilf (offscreen->bounds->size.height * job->scale_y); if (scaled_height > max_texture_size) { - scale_y *= (float)max_texture_size / scaled_height; + downscale_y = (float)max_texture_size / scaled_height; scaled_height = max_texture_size; } } @@ -3632,10 +3632,9 @@ gsk_ngl_render_job_visit_node_with_offscreen (GskNglRenderJob *job, gsk_ngl_render_job_set_viewport (job, &viewport, &prev_viewport); gsk_ngl_render_job_set_projection_from_rect (job, &job->viewport, &prev_projection); - gsk_ngl_render_job_set_modelview (job, gsk_transform_scale (NULL, scale_x, scale_y)); + if (downscale_x != 1 || downscale_y != 1) + gsk_ngl_render_job_push_modelview (job, gsk_transform_scale (NULL, downscale_x, downscale_y)); prev_alpha = gsk_ngl_render_job_set_alpha (job, 1.0f); - job->offset_x = offset_x; - job->offset_y = offset_y; prev_fbo = gsk_ngl_command_queue_bind_framebuffer (job->command_queue, render_target->framebuffer_id); gsk_ngl_command_queue_clear (job->command_queue, 0, &job->viewport); @@ -3648,7 +3647,8 @@ gsk_ngl_render_job_visit_node_with_offscreen (GskNglRenderJob *job, if (offscreen->reset_clip) gsk_ngl_render_job_pop_clip (job); - gsk_ngl_render_job_pop_modelview (job); + if (downscale_x != 1 || downscale_y != 1) + gsk_ngl_render_job_pop_modelview (job); gsk_ngl_render_job_set_viewport (job, &prev_viewport, NULL); gsk_ngl_render_job_set_projection (job, &prev_projection); gsk_ngl_render_job_set_alpha (job, prev_alpha);