Bug 1512010 - backing out local raster space text snapping change. r=jrmuizel
authorLee Salzman <lsalzman@mozilla.com>
Tue, 15 Jan 2019 13:32:39 -0500
changeset 453956 2bf2c209f520c75405b70ed5a5a12c2a8938dffe
parent 453955 a51d26029042fb10cca386c3150fc2c912a442a2
child 453995 903466ee22ee9019b7c26f978fc8b676f12339fb
child 454029 62ce57cf81571a894c42c91199aa1379d4a15e5b
push id35381
push userdluca@mozilla.com
push dateTue, 15 Jan 2019 22:15:11 +0000
treeherdermozilla-central@2bf2c209f520 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjrmuizel
bugs1512010
milestone66.0a1
first release with
nightly linux32
2bf2c209f520 / 66.0a1 / 20190115221511 / files
nightly linux64
2bf2c209f520 / 66.0a1 / 20190115221511 / files
nightly mac
2bf2c209f520 / 66.0a1 / 20190115221511 / files
nightly win32
2bf2c209f520 / 66.0a1 / 20190115221511 / files
nightly win64
2bf2c209f520 / 66.0a1 / 20190115221511 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1512010 - backing out local raster space text snapping change. r=jrmuizel
gfx/wr/webrender/res/ps_text_run.glsl
gfx/wr/webrender/src/batch.rs
gfx/wr/webrender/src/prim_store/text_run.rs
gfx/wr/wrench/reftests/text/blurred-shadow-local-clip-rect-ref.png
gfx/wr/wrench/reftests/text/raster-space-snap-ref.yaml
gfx/wr/wrench/reftests/text/raster-space-snap.yaml
gfx/wr/wrench/reftests/text/reftest.list
gfx/wr/wrench/reftests/text/two-shadows.png
--- a/gfx/wr/webrender/res/ps_text_run.glsl
+++ b/gfx/wr/webrender/res/ps_text_run.glsl
@@ -58,29 +58,33 @@ struct TextRun {
 
 TextRun fetch_text_run(int address) {
     vec4 data[3] = fetch_from_gpu_cache_3(address);
     return TextRun(data[0], data[1], data[2].xy);
 }
 
 VertexInfo write_text_vertex(RectWithSize local_clip_rect,
                              float z,
-                             bool should_snap,
                              Transform transform,
                              PictureTask task,
                              vec2 text_offset,
                              vec2 glyph_offset,
                              RectWithSize glyph_rect,
                              vec2 snap_bias) {
     // The offset to snap the glyph rect to a device pixel
     vec2 snap_offset = vec2(0.0);
     mat2 local_transform;
 
+#ifdef WR_FEATURE_GLYPH_TRANSFORM
+    bool remove_subpx_offset = true;
+#else
+    bool remove_subpx_offset = transform.is_axis_aligned;
+#endif
     // Compute the snapping offset only if the scroll node transform is axis-aligned.
-    if (should_snap) {
+    if (remove_subpx_offset) {
         // Transform from local space to device space.
         float device_scale = task.common_data.device_pixel_scale / transform.m[3].w;
         mat2 device_transform = mat2(transform.m) * device_scale;
 
         // Ensure the transformed text offset does not contain a subpixel translation
         // such that glyph snapping is stable for equivalent glyph subpixel positions.
         vec2 device_text_pos = device_transform * text_offset + transform.m[3].xy * device_scale;
         snap_offset = floor(device_text_pos + 0.5) - device_text_pos;
@@ -169,28 +173,23 @@ void main(void) {
 #ifdef WR_FEATURE_GLYPH_TRANSFORM
     // Transform from local space to glyph space.
     mat2 glyph_transform = mat2(transform.m) * task.common_data.device_pixel_scale;
 
     // Compute the glyph rect in glyph space.
     RectWithSize glyph_rect = RectWithSize(res.offset + glyph_transform * (text.offset + glyph.offset),
                                            res.uv_rect.zw - res.uv_rect.xy);
 
-    // Since the glyph is pre-transformed, snapping is both forced and does not depend on the transform.
-    bool should_snap = true;
 #else
     // Scale from glyph space to local space.
     float scale = res.scale / task.common_data.device_pixel_scale;
 
     // Compute the glyph rect in local space.
     RectWithSize glyph_rect = RectWithSize(scale * res.offset + text.offset + glyph.offset,
                                            scale * (res.uv_rect.zw - res.uv_rect.xy));
-
-    // Check if the primitive is actually safe to snap.
-    bool should_snap = ph.user_data.x != 0;
 #endif
 
     vec2 snap_bias;
     // In subpixel mode, the subpixel offset has already been
     // accounted for while rasterizing the glyph. However, we
     // must still round with a subpixel bias rather than rounding
     // to the nearest whole pixel, depending on subpixel direciton.
     switch (subpx_dir) {
@@ -210,17 +209,16 @@ void main(void) {
             break;
         case SUBPX_DIR_MIXED:
             snap_bias = vec2(0.125);
             break;
     }
 
     VertexInfo vi = write_text_vertex(ph.local_clip_rect,
                                       ph.z,
-                                      should_snap,
                                       transform,
                                       task,
                                       text.offset,
                                       glyph.offset,
                                       glyph_rect,
                                       snap_bias);
     glyph_rect.p0 += vi.snap_offset;
 
--- a/gfx/wr/webrender/src/batch.rs
+++ b/gfx/wr/webrender/src/batch.rs
@@ -824,17 +824,17 @@ impl AlphaBatchBuilder {
                             GlyphFormat::ColorBitmap => {
                                 (
                                     BlendMode::PremultipliedAlpha,
                                     ShaderColorMode::ColorBitmap,
                                 )
                             }
                         };
 
-                        let prim_header_index = prim_headers.push(&prim_header, z_id, [run.should_snap as i32, 0, 0]);
+                        let prim_header_index = prim_headers.push(&prim_header, z_id, [0; 3]);
                         let key = BatchKey::new(kind, blend_mode, textures);
                         let base_instance = GlyphInstance::new(
                             prim_header_index,
                         );
                         let batch = alpha_batch_list.set_params_and_get_batch(
                             key,
                             bounding_rect,
                             z_id,
--- a/gfx/wr/webrender/src/prim_store/text_run.rs
+++ b/gfx/wr/webrender/src/prim_store/text_run.rs
@@ -60,17 +60,16 @@ impl AsInstanceKind<TextRunDataHandle> f
         &self,
         data_handle: TextRunDataHandle,
         prim_store: &mut PrimitiveStore,
     ) -> PrimitiveInstanceKind {
         let run_index = prim_store.text_runs.push(TextRunPrimitive {
             used_font: self.font.clone(),
             glyph_keys_range: storage::Range::empty(),
             shadow: self.shadow,
-            should_snap: true,
         });
 
         PrimitiveInstanceKind::TextRun{ data_handle, run_index }
     }
 }
 
 #[cfg_attr(feature = "capture", derive(Serialize))]
 #[cfg_attr(feature = "replay", derive(Deserialize))]
@@ -223,17 +222,16 @@ impl IsVisible for TextRun {
     }
 }
 
 #[derive(Debug)]
 pub struct TextRunPrimitive {
     pub used_font: FontInstance,
     pub glyph_keys_range: storage::Range<GlyphKey>,
     pub shadow: bool,
-    pub should_snap: bool,
 }
 
 impl TextRunPrimitive {
     pub fn update_font_instance(
         &mut self,
         specified_font: &FontInstance,
         device_pixel_scale: DevicePixelScale,
         transform: &LayoutToWorldTransform,
@@ -259,21 +257,16 @@ impl TextRunPrimitive {
         // Get the font transform matrix (skew / scale) from the complete transform.
         let font_transform = if transform_glyphs {
             // Quantize the transform to minimize thrashing of the glyph cache.
             FontTransform::from(transform).quantize()
         } else {
             FontTransform::identity()
         };
 
-        // We can snap only if the transform is axis-aligned and in screen-space.
-        self.should_snap =
-            transform.preserves_2d_axis_alignment() &&
-            raster_space == RasterSpace::Screen;
-
         // If the transform or device size is different, then the caller of
         // this method needs to know to rebuild the glyphs.
         let cache_dirty =
             self.used_font.transform != font_transform ||
             self.used_font.size != device_font_size;
 
         // Construct used font instance from the specified font instance
         self.used_font = FontInstance {
index e9b2cab05f4a13ce21acd745e41c417805d920ec..895d42eaf5ce4f7ff138f2fdd88893553a658ec6
GIT binary patch
literal 19504
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
KSK6Tq*Z&v5@gbK0
deleted file mode 100644
--- a/gfx/wr/wrench/reftests/text/raster-space-snap-ref.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-root:
-  items:
-    - type: stacking-context
-      bounds: [0, 0, 480, 80]
-      raster-space: screen
-      items:
-      - text: "a Bcd Efgh Ijklm Nopqrs Tuvwxyz"
-        origin: 20.5 50
-        size: 20
-        font: "FreeSans.ttf"
deleted file mode 100644
--- a/gfx/wr/wrench/reftests/text/raster-space-snap.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-root:
-  items:
-    - type: stacking-context
-      bounds: [0, 0, 480, 80]
-      raster-space: local(1.0)
-      items:
-      - text: "a Bcd Efgh Ijklm Nopqrs Tuvwxyz"
-        origin: 20.5 50
-        size: 20
-        font: "FreeSans.ttf"
--- a/gfx/wr/wrench/reftests/text/reftest.list
+++ b/gfx/wr/wrench/reftests/text/reftest.list
@@ -63,9 +63,8 @@ fuzzy(1,113) platform(linux) == raster-s
 != allow-subpixel.yaml allow-subpixel-ref.yaml
 == bg-color.yaml bg-color-ref.yaml
 != large-glyphs.yaml blank.yaml
 == snap-text-offset.yaml snap-text-offset-ref.yaml
 == shadow-border.yaml shadow-solid-ref.yaml
 == shadow-image.yaml shadow-solid-ref.yaml
 options(disable-aa) == snap-clip.yaml snap-clip-ref.yaml
 platform(linux) == perspective-clip.yaml perspective-clip.png
-options(disable-subpixel) != raster-space-snap.yaml raster-space-snap-ref.yaml
index a3cb79b38f1d600e9ad6df328c2c601135e5c1af..1dae24cb84d0722edcab962971b69819ab5be985
GIT binary patch
literal 11350
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