background-actor: Mipmap background texture rendering

gnome-shell displays workspace previews at one tenth scale. That's a
few binary orders of magnitude so even using a LINEAR filter was
resulting in visible jaggies. Now we apply mipmapping so they appear
smooth.

As an added bonus, the mipmaps used occupy roughly 1% the memory of
the original image (0.1 x 0.1 = 0.01) so they actually fit into GPU/CPU
caches now and rendering performance is improved. There's no need to
traverse the original texture which at 4K resolution occupies 33MB,
only a 331KB mipmap.

In my case this reduces the render time for the overview by ~10%.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/1416
Origin: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1347

(cherry picked from commit 32dbcd9352)
This commit is contained in:
Daniel van Vugt 2020-08-03 14:29:46 +08:00
parent eae21f01dd
commit 3dab5120ed

View File

@ -354,7 +354,7 @@ setup_pipeline (MetaBackgroundActor *self,
guint8 opacity; guint8 opacity;
float color_component; float color_component;
CoglFramebuffer *fb; CoglFramebuffer *fb;
CoglPipelineFilter filter; CoglPipelineFilter min_filter, mag_filter;
opacity = clutter_actor_get_paint_opacity (CLUTTER_ACTOR (self)); opacity = clutter_actor_get_paint_opacity (CLUTTER_ACTOR (self));
if (opacity < 255) if (opacity < 255)
@ -455,11 +455,17 @@ setup_pipeline (MetaBackgroundActor *self,
actor_pixel_rect->width, actor_pixel_rect->width,
actor_pixel_rect->height, actor_pixel_rect->height,
NULL, NULL)) NULL, NULL))
filter = COGL_PIPELINE_FILTER_NEAREST; {
min_filter = COGL_PIPELINE_FILTER_NEAREST;
mag_filter = COGL_PIPELINE_FILTER_NEAREST;
}
else else
filter = COGL_PIPELINE_FILTER_LINEAR; {
min_filter = COGL_PIPELINE_FILTER_LINEAR_MIPMAP_NEAREST;
mag_filter = COGL_PIPELINE_FILTER_LINEAR;
}
cogl_pipeline_set_layer_filters (self->pipeline, 0, filter, filter); cogl_pipeline_set_layer_filters (self->pipeline, 0, min_filter, mag_filter);
} }
static void static void