From 6d3af686559738b3efeb406b81a3372ac1f61a61 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Tue, 27 Feb 2018 23:01:58 -0500 Subject: [PATCH] Call init_transform_fs automatically in Brush framework --- webrender/res/brush.glsl | 17 +++++++---------- webrender/res/brush_image.glsl | 8 +------- webrender/res/brush_linear_gradient.glsl | 12 ------------ webrender/res/brush_radial_gradient.glsl | 12 ------------ webrender/res/brush_solid.glsl | 11 ----------- webrender/res/brush_yuv_image.glsl | 12 ------------ webrender/res/prim_shared.glsl | 3 +++ 7 files changed, 11 insertions(+), 64 deletions(-) diff --git a/webrender/res/brush.glsl b/webrender/res/brush.glsl index 6e856d8356..41500f8303 100644 --- a/webrender/res/brush.glsl +++ b/webrender/res/brush.glsl @@ -2,6 +2,10 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#ifdef WR_FEATURE_ALPHA_PASS +varying vec3 vBrushLocalPos; +#endif + #ifdef WR_VERTEX_SHADER void brush_vs( @@ -102,16 +106,6 @@ void main(void) { pic_task, brush_prim.local_rect ); - - // TODO(gw): transform bounds may be referenced by - // the fragment shader when running in - // the alpha pass, even on non-transformed - // items. For now, just ensure it has no - // effect. We can tidy this up as we move - // more items to be brush shaders. -#ifdef WR_FEATURE_ALPHA_PASS - init_transform_vs(vec4(vec2(-1000000.0), vec2(1000000.0))); -#endif } else { bvec4 edge_mask = notEqual(brush.edge_mask & ivec4(1, 2, 4, 8), ivec4(0)); bool do_perspective_interpolation = (brush.flags & BRUSH_FLAG_PERSPECTIVE_INTERPOLATION) != 0; @@ -139,6 +133,7 @@ void main(void) { vi.screen_pos, clip_area ); + vBrushLocalPos = vec3(vi.local_pos, scroll_node.is_axis_aligned ? 0.0 : 1.0); #endif // Run the specific brush VS code to write interpolators. @@ -164,6 +159,8 @@ void main(void) { #ifdef WR_FEATURE_ALPHA_PASS // Apply the clip mask color *= do_clip(); + //if (vBrushLocalPos.z != 0.0) + color *= init_transform_fs(vBrushLocalPos.xy); #endif // TODO(gw): Handle pre-multiply common code here as required. diff --git a/webrender/res/brush_image.glsl b/webrender/res/brush_image.glsl index a172bce201..153ed6b5bf 100644 --- a/webrender/res/brush_image.glsl +++ b/webrender/res/brush_image.glsl @@ -6,10 +6,6 @@ #include shared,prim_shared,brush -#ifdef WR_FEATURE_ALPHA_PASS -varying vec2 vLocalPos; -#endif - varying vec3 vUv; flat varying vec4 vUvBounds; @@ -166,8 +162,6 @@ void brush_vs( vSelect = vec2(0.0, 0.0); break; } - - vLocalPos = vi.local_pos; #endif } #endif @@ -180,7 +174,7 @@ vec4 brush_fs() { #ifdef WR_FEATURE_ALPHA_PASS vec4 mask = mix(texel.rrrr, texel.aaaa, vSelect.x); - vec4 color = mix(texel, vColor * mask, vSelect.y) * init_transform_fs(vLocalPos); + vec4 color = mix(texel, vColor * mask, vSelect.y); // Fail-safe to ensure that we don't sample outside the rendered // portion of a picture source. diff --git a/webrender/res/brush_linear_gradient.glsl b/webrender/res/brush_linear_gradient.glsl index c179cd3414..fbd480b69e 100644 --- a/webrender/res/brush_linear_gradient.glsl +++ b/webrender/res/brush_linear_gradient.glsl @@ -14,10 +14,6 @@ flat varying vec2 vStartPoint; varying vec2 vPos; -#ifdef WR_FEATURE_ALPHA_PASS -varying vec2 vLocalPos; -#endif - #ifdef WR_VERTEX_SHADER struct Gradient { @@ -53,10 +49,6 @@ void brush_vs( // Whether to repeat the gradient instead of clamping. vGradientRepeat = float(int(gradient.extend_mode.x) != EXTEND_MODE_CLAMP); - -#ifdef WR_FEATURE_ALPHA_PASS - vLocalPos = vi.local_pos; -#endif } #endif @@ -68,10 +60,6 @@ vec4 brush_fs() { offset, vGradientRepeat); -#ifdef WR_FEATURE_ALPHA_PASS - color *= init_transform_fs(vLocalPos); -#endif - return color; } #endif diff --git a/webrender/res/brush_radial_gradient.glsl b/webrender/res/brush_radial_gradient.glsl index 33a7eb73d8..f41d741b06 100644 --- a/webrender/res/brush_radial_gradient.glsl +++ b/webrender/res/brush_radial_gradient.glsl @@ -15,10 +15,6 @@ flat varying float vEndRadius; varying vec2 vPos; -#ifdef WR_FEATURE_ALPHA_PASS -varying vec2 vLocalPos; -#endif - #ifdef WR_VERTEX_SHADER struct RadialGradient { @@ -57,10 +53,6 @@ void brush_vs( // Whether to repeat the gradient instead of clamping. vGradientRepeat = float(int(gradient.ratio_xy_extend_mode.y) != EXTEND_MODE_CLAMP); - -#ifdef WR_FEATURE_ALPHA_PASS - vLocalPos = vi.local_pos; -#endif } #endif @@ -108,10 +100,6 @@ vec4 brush_fs() { offset, vGradientRepeat); -#ifdef WR_FEATURE_ALPHA_PASS - color *= init_transform_fs(vLocalPos); -#endif - return color; } #endif diff --git a/webrender/res/brush_solid.glsl b/webrender/res/brush_solid.glsl index d7a11cd4f0..0e350796e2 100644 --- a/webrender/res/brush_solid.glsl +++ b/webrender/res/brush_solid.glsl @@ -8,10 +8,6 @@ flat varying vec4 vColor; -#ifdef WR_FEATURE_ALPHA_PASS -varying vec2 vLocalPos; -#endif - #ifdef WR_VERTEX_SHADER struct SolidBrush { @@ -33,19 +29,12 @@ void brush_vs( ) { SolidBrush prim = fetch_solid_primitive(prim_address); vColor = prim.color; - -#ifdef WR_FEATURE_ALPHA_PASS - vLocalPos = vi.local_pos; -#endif } #endif #ifdef WR_FRAGMENT_SHADER vec4 brush_fs() { vec4 color = vColor; -#ifdef WR_FEATURE_ALPHA_PASS - color *= init_transform_fs(vLocalPos); -#endif return color; } #endif diff --git a/webrender/res/brush_yuv_image.glsl b/webrender/res/brush_yuv_image.glsl index 14ec239ab1..ff5338ce86 100644 --- a/webrender/res/brush_yuv_image.glsl +++ b/webrender/res/brush_yuv_image.glsl @@ -17,10 +17,6 @@ // that needing to compile to / select a different shader when // there is a different color space. -#ifdef WR_FEATURE_ALPHA_PASS -varying vec2 vLocalPos; -#endif - #if defined (WR_FEATURE_YUV_PLANAR) varying vec3 vUv_Y; flat varying vec4 vUvBounds_Y; @@ -80,10 +76,6 @@ void brush_vs( ) { vec2 f = (vi.local_pos - local_rect.p0) / local_rect.size; -#ifdef WR_FEATURE_ALPHA_PASS - vLocalPos = vi.local_pos; -#endif - #if defined (WR_FEATURE_YUV_PLANAR) write_uv_rect(user_data.x, f, TEX_SIZE(sColor0), vUv_Y, vUvBounds_Y); write_uv_rect(user_data.y, f, TEX_SIZE(sColor1), vUv_U, vUvBounds_U); @@ -164,10 +156,6 @@ vec4 brush_fs() { vec3 rgb = YuvColorMatrix * (yuv_value - vec3(0.06275, 0.50196, 0.50196)); vec4 color = vec4(rgb, 1.0); -#ifdef WR_FEATURE_ALPHA_PASS - color *= init_transform_fs(vLocalPos); -#endif - return color; } #endif diff --git a/webrender/res/prim_shared.glsl b/webrender/res/prim_shared.glsl index 24ffcfd6cc..b4be642498 100644 --- a/webrender/res/prim_shared.glsl +++ b/webrender/res/prim_shared.glsl @@ -240,6 +240,9 @@ VertexInfo write_vertex(RectWithSize instance_rect, gl_Position = uTransform * vec4(final_pos, z, 1.0); + // It may be referenced by the fragment shader calling `init_transform_fs` later + init_transform_vs(vec4(vec2(-1000000.0), vec2(1000000.0))); + VertexInfo vi = VertexInfo( clamped_local_pos, device_pos,