gsk: Cache scaled texture
authorMatthias Clasen <mclasen@redhat.com>
Thu, 9 Mar 2023 11:35:07 +0000 (11:35 +0000)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 10 Mar 2023 20:09:27 +0000 (21:09 +0100)
Keep the texture we create for texture scale nodes.

Fixes: #5642
gsk/gl/gskglrenderjob.c

index 1fcd13a1e2803bb4e6b2819ab3d9cdf0c8b99793..433e38638cb21df5d2bd4b01ee57687ee5c1d782 100644 (file)
@@ -3640,6 +3640,7 @@ gsk_gl_render_job_visit_texture_scale_node (GskGLRenderJob      *job,
   guint prev_fbo;
   guint texture_id;
   float u0, u1, v0, v1;
+  GskTextureKey key;
 
   gsk_gl_render_job_untransform_bounds (job, &job->current_clip->rect.bounds, &clip_rect);
   if (!graphene_rect_intersection (bounds, &clip_rect, &clip_rect))
@@ -3652,6 +3653,17 @@ gsk_gl_render_job_visit_texture_scale_node (GskGLRenderJob      *job,
       return;
     }
 
+  key.pointer = node;
+  key.pointer_is_child = TRUE;
+  key.parent_rect = clip_rect;
+  key.scale_x = 1.;
+  key.scale_y = 1.;
+  key.filter = min_filter;
+
+  texture_id = gsk_gl_driver_lookup_texture (job->driver, &key);
+  if (texture_id != 0)
+    goto render_texture;
+
   viewport = GRAPHENE_RECT_INIT (0, 0,
                                  clip_rect.size.width,
                                  clip_rect.size.height);
@@ -3707,6 +3719,9 @@ gsk_gl_render_job_visit_texture_scale_node (GskGLRenderJob      *job,
 
   texture_id = gsk_gl_driver_release_render_target (job->driver, render_target, FALSE);
 
+  gsk_gl_driver_cache_texture (job->driver, &key, texture_id);
+
+render_texture:
   gsk_gl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, blit));
   gsk_gl_program_set_uniform_texture (job->current_program,
                                       UNIFORM_SHARED_SOURCE, 0,