gl: regenerate scratch surfaces if existing scratch surfaces are too large

Because we apply filters on the whole scratch surfaces.  If the scratch
surfaces are too large and we only need a small portion of them, we
waste time on filtering the large unused portion.

This can be made more efficient we remove existing large scratch surfaces,
and regenerated smaller ones