diff --git a/webrender/res/brush_blend.glsl b/webrender/res/brush_blend.glsl index 9f925a067b..7cb6e2b629 100644 --- a/webrender/res/brush_blend.glsl +++ b/webrender/res/brush_blend.glsl @@ -8,11 +8,11 @@ varying vec3 vUv; -flat varying float vAmount; -flat varying int vOp; -flat varying mat3 vColorMat; -flat varying vec3 vColorOffset; -flat varying vec4 vUvClipBounds; +varying float vAmount; +varying float vOp; +varying mat3 vColorMat; +varying vec3 vColorOffset; +varying vec4 vUvClipBounds; #ifdef WR_VERTEX_SHADER @@ -51,10 +51,10 @@ void brush_vs( float amount = float(user_data.z) / 65536.0; float invAmount = 1.0 - amount; - vOp = user_data.y; + vOp = float(user_data.y); vAmount = amount; - switch (vOp) { + switch (user_data.y) { case 2: { // Grayscale vColorMat = mat3( @@ -138,7 +138,8 @@ Fragment brush_fs() { float alpha = Cs.a; vec3 color = Cs.rgb / Cs.a; - switch (vOp) { + int op = int(vOp); + switch (op) { case 0: break; case 1: diff --git a/webrender/res/brush_image.glsl b/webrender/res/brush_image.glsl index 1ebc5a1da8..f15e567108 100644 --- a/webrender/res/brush_image.glsl +++ b/webrender/res/brush_image.glsl @@ -14,15 +14,15 @@ varying vec2 vLocalPos; // W is 1 when perspective interpolation is enabled. varying vec4 vUv; // Normalized bounds of the source image in the texture. -flat varying vec4 vUvBounds; +varying vec4 vUvBounds; // Normalized bounds of the source image in the texture, adjusted to avoid // sampling artifacts. -flat varying vec4 vUvSampleBounds; +varying vec4 vUvSampleBounds; #ifdef WR_FEATURE_ALPHA_PASS -flat varying vec4 vColor; -flat varying vec2 vMaskSwizzle; -flat varying vec2 vTileRepeat; +varying vec4 vColor; +varying vec2 vMaskSwizzle; +varying vec2 vTileRepeat; #endif #ifdef WR_VERTEX_SHADER diff --git a/webrender/res/brush_linear_gradient.glsl b/webrender/res/brush_linear_gradient.glsl index 7499c71715..8906f3efdf 100644 --- a/webrender/res/brush_linear_gradient.glsl +++ b/webrender/res/brush_linear_gradient.glsl @@ -6,21 +6,21 @@ #include shared,prim_shared,brush -flat varying int vGradientAddress; -flat varying float vGradientRepeat; +varying vec2 vGradientAddress; +varying float vGradientRepeat; -flat varying vec2 vScaledDir; -flat varying vec2 vStartPoint; +varying vec2 vScaledDir; +varying vec2 vStartPoint; // Size of the gradient pattern's rectangle, used to compute horizontal and vertical // repetitions. Not to be confused with another kind of repetition of the pattern // which happens along the gradient stops. -flat varying vec2 vRepeatedSize; +varying vec2 vRepeatedSize; varying vec2 vPos; #ifdef WR_FEATURE_ALPHA_PASS varying vec2 vLocalPos; -flat varying vec2 vTileRepeat; +varying vec2 vTileRepeat; #endif #ifdef WR_VERTEX_SHADER @@ -70,7 +70,7 @@ void brush_vs( vec2 tile_repeat = local_rect.size / gradient.stretch_size; vRepeatedSize = gradient.stretch_size; - vGradientAddress = user_data.x; + vGradientAddress = pack_address(user_data.x); // Whether to repeat the gradient along the line instead of clamping. vGradientRepeat = float(gradient.extend_mode != EXTEND_MODE_CLAMP); @@ -107,9 +107,8 @@ Fragment brush_fs() { float offset = dot(pos - vStartPoint, vScaledDir); - vec4 color = sample_gradient(vGradientAddress, - offset, - vGradientRepeat); + int address = unpack_address(vGradientAddress); + vec4 color = sample_gradient(address, offset, vGradientRepeat); #ifdef WR_FEATURE_ALPHA_PASS color *= init_transform_fs(vLocalPos); diff --git a/webrender/res/brush_mix_blend.glsl b/webrender/res/brush_mix_blend.glsl index aec357a54b..8dc69de07f 100644 --- a/webrender/res/brush_mix_blend.glsl +++ b/webrender/res/brush_mix_blend.glsl @@ -8,7 +8,7 @@ varying vec3 vSrcUv; varying vec3 vBackdropUv; -flat varying int vOp; +varying float vOp; #ifdef WR_VERTEX_SHADER @@ -25,7 +25,7 @@ void brush_vs( ) { vec2 snapped_device_pos = snap_device_pos(vi); vec2 texture_size = vec2(textureSize(sCacheRGBA8, 0)); - vOp = user_data.x; + vOp = float(user_data.x); PictureTask src_task = fetch_picture_task(user_data.z); vec2 src_uv = snapped_device_pos + @@ -217,7 +217,8 @@ Fragment brush_fs() { // Return yellow if none of the branches match (shouldn't happen). vec4 result = vec4(1.0, 1.0, 0.0, 1.0); - switch (vOp) { + int op = int(vOp); + switch (op) { case MixBlendMode_Multiply: result.rgb = Multiply(Cb.rgb, Cs.rgb); break; diff --git a/webrender/res/brush_radial_gradient.glsl b/webrender/res/brush_radial_gradient.glsl index 6169213bc1..02d9fa42e5 100644 --- a/webrender/res/brush_radial_gradient.glsl +++ b/webrender/res/brush_radial_gradient.glsl @@ -6,19 +6,19 @@ #include shared,prim_shared,brush -flat varying int vGradientAddress; -flat varying float vGradientRepeat; +varying vec2 vGradientAddress; +varying float vGradientRepeat; -flat varying vec2 vCenter; -flat varying float vStartRadius; -flat varying float vEndRadius; +varying vec2 vCenter; +varying float vStartRadius; +varying float vEndRadius; varying vec2 vPos; -flat varying vec2 vRepeatedSize; +varying vec2 vRepeatedSize; #ifdef WR_FEATURE_ALPHA_PASS varying vec2 vLocalPos; -flat varying vec2 vTileRepeat; +varying vec2 vTileRepeat; #endif #ifdef WR_VERTEX_SHADER @@ -72,7 +72,7 @@ void brush_vs( vRepeatedSize = gradient.stretch_size; vRepeatedSize.y *= gradient.ratio_xy; - vGradientAddress = user_data.x; + vGradientAddress = pack_address(user_data.x); // Whether to repeat the gradient instead of clamping. vGradientRepeat = float(gradient.extend_mode != EXTEND_MODE_CLAMP); @@ -145,9 +145,8 @@ Fragment brush_fs() { } } - vec4 color = sample_gradient(vGradientAddress, - offset, - vGradientRepeat); + int address = unpack_address(vGradientAddress); + vec4 color = sample_gradient(address, offset, vGradientRepeat); #ifdef WR_FEATURE_ALPHA_PASS color *= init_transform_fs(vLocalPos); diff --git a/webrender/res/brush_solid.glsl b/webrender/res/brush_solid.glsl index 6b66282a4c..e48a4b954b 100644 --- a/webrender/res/brush_solid.glsl +++ b/webrender/res/brush_solid.glsl @@ -6,7 +6,7 @@ #include shared,prim_shared,brush -flat varying vec4 vColor; +varying vec4 vColor; #ifdef WR_FEATURE_ALPHA_PASS varying vec2 vLocalPos; diff --git a/webrender/res/brush_yuv_image.glsl b/webrender/res/brush_yuv_image.glsl index 88093c3a84..a4cd9494fb 100644 --- a/webrender/res/brush_yuv_image.glsl +++ b/webrender/res/brush_yuv_image.glsl @@ -23,22 +23,22 @@ varying vec2 vLocalPos; #if defined (WR_FEATURE_YUV_PLANAR) varying vec3 vUv_Y; - flat varying vec4 vUvBounds_Y; + varying vec4 vUvBounds_Y; varying vec3 vUv_U; - flat varying vec4 vUvBounds_U; + varying vec4 vUvBounds_U; varying vec3 vUv_V; - flat varying vec4 vUvBounds_V; + varying vec4 vUvBounds_V; #elif defined (WR_FEATURE_YUV_NV12) varying vec3 vUv_Y; - flat varying vec4 vUvBounds_Y; + varying vec4 vUvBounds_Y; varying vec3 vUv_UV; - flat varying vec4 vUvBounds_UV; + varying vec4 vUvBounds_UV; #elif defined (WR_FEATURE_YUV_INTERLEAVED) varying vec3 vUv_YUV; - flat varying vec4 vUvBounds_YUV; + varying vec4 vUvBounds_YUV; #endif #ifdef WR_FEATURE_TEXTURE_RECT diff --git a/webrender/res/cs_blur.glsl b/webrender/res/cs_blur.glsl index f089f913d8..f37f2605ab 100644 --- a/webrender/res/cs_blur.glsl +++ b/webrender/res/cs_blur.glsl @@ -8,6 +8,7 @@ varying vec3 vUv; flat varying vec4 vUvRect; flat varying vec2 vOffsetScale; flat varying float vSigma; +// `vBlurRadius` needs to be flat for FS loop to compile flat varying int vBlurRadius; #ifdef WR_VERTEX_SHADER @@ -131,5 +132,4 @@ void main(void) { } oFragColor = vec4(avg_color) / gauss_coefficient_sum; -} -#endif +} \ No newline at end of file diff --git a/webrender/res/cs_border_segment.glsl b/webrender/res/cs_border_segment.glsl index 7a6de880ba..ad1ce2f187 100644 --- a/webrender/res/cs_border_segment.glsl +++ b/webrender/res/cs_border_segment.glsl @@ -6,36 +6,36 @@ // For edges, the colors are the same. For corners, these // are the colors of each edge making up the corner. -flat varying vec4 vColor00; -flat varying vec4 vColor01; -flat varying vec4 vColor10; -flat varying vec4 vColor11; +varying vec4 vColor00; +varying vec4 vColor01; +varying vec4 vColor10; +varying vec4 vColor11; // A point + tangent defining the line where the edge // transition occurs. Used for corners only. -flat varying vec4 vColorLine; +varying vec4 vColorLine; // x = segment, y = styles, z = edge axes, w = clip mode -flat varying ivec4 vConfig; +varying vec4 vConfig; // xy = Local space position of the clip center. // zw = Scale the rect origin by this to get the outer // corner from the segment rectangle. -flat varying vec4 vClipCenter_Sign; +varying vec4 vClipCenter_Sign; // An outer and inner elliptical radii for border // corner clipping. -flat varying vec4 vClipRadii; +varying vec4 vClipRadii; // Reference point for determine edge clip lines. -flat varying vec4 vEdgeReference; +varying vec4 vEdgeReference; // Stores widths/2 and widths/3 to save doing this in FS. -flat varying vec4 vPartialWidths; +varying vec4 vPartialWidths; // Clipping parameters for dot or dash. -flat varying vec4 vClipParams1; -flat varying vec4 vClipParams2; +varying vec4 vClipParams1; +varying vec4 vClipParams2; // Local space position varying vec2 vPos; @@ -140,44 +140,44 @@ void main(void) { // Set some flags used by the FS to determine the // orientation of the two edges in this corner. - ivec2 edge_axis; + float edge_axis; // Derive the positions for the edge clips, which must be handled // differently between corners and edges. vec2 edge_reference; switch (segment) { case SEGMENT_TOP_LEFT: - edge_axis = ivec2(0, 1); + edge_axis = 2.0; edge_reference = outer; break; case SEGMENT_TOP_RIGHT: - edge_axis = ivec2(1, 0); + edge_axis = 1.0; edge_reference = vec2(outer.x - aWidths.x, outer.y); break; case SEGMENT_BOTTOM_RIGHT: - edge_axis = ivec2(0, 1); + edge_axis = 2.0; edge_reference = outer - aWidths; break; case SEGMENT_BOTTOM_LEFT: - edge_axis = ivec2(1, 0); + edge_axis = 1.0; edge_reference = vec2(outer.x, outer.y - aWidths.y); break; case SEGMENT_TOP: case SEGMENT_BOTTOM: - edge_axis = ivec2(1, 1); + edge_axis = 3.0; edge_reference = vec2(0.0); break; case SEGMENT_LEFT: case SEGMENT_RIGHT: default: - edge_axis = ivec2(0, 0); + edge_axis = 0.0; edge_reference = vec2(0.0); break; } - vConfig = ivec4( + vConfig = vec4( segment, - style0 | (style1 << 16), - edge_axis.x | (edge_axis.y << 16), + style0 + (style1 * 16), + edge_axis, clip_mode ); vPartialWidths = vec4(aWidths / 3.0, aWidths / 2.0); @@ -308,14 +308,18 @@ vec4 evaluate_color_for_style_in_edge( return color0; } +ivec2 unpack_edge_axis(float x) { + return ivec2(mod(x, 2.0), x / 2.0); +} + void main(void) { float aa_range = compute_aa_range(vPos); vec4 color0, color1; - int segment = vConfig.x; - ivec2 style = ivec2(vConfig.y & 0xffff, vConfig.y >> 16); - ivec2 edge_axis = ivec2(vConfig.z & 0xffff, vConfig.z >> 16); - int clip_mode = vConfig.w; + int segment = int(vConfig.x); + ivec2 style = ivec2(mod(vConfig.y, 16.0), vConfig.y / 16.0); + ivec2 edge_axis = unpack_edge_axis(vConfig.z); + int clip_mode = int(vConfig.w); float mix_factor = 0.0; if (edge_axis.x != edge_axis.y) { diff --git a/webrender/res/cs_clip_box_shadow.glsl b/webrender/res/cs_clip_box_shadow.glsl index b431e4262c..f4bb663798 100644 --- a/webrender/res/cs_clip_box_shadow.glsl +++ b/webrender/res/cs_clip_box_shadow.glsl @@ -6,11 +6,11 @@ varying vec3 vPos; varying vec2 vUv; -flat varying vec4 vUvBounds; -flat varying float vLayer; -flat varying vec4 vEdge; -flat varying vec4 vUvBounds_NoClamp; -flat varying float vClipMode; +varying vec4 vUvBounds; +varying float vLayer; +varying vec4 vEdge; +varying vec4 vUvBounds_NoClamp; +varying float vClipMode; #define MODE_STRETCH 0 #define MODE_SIMPLE 1 diff --git a/webrender/res/cs_clip_image.glsl b/webrender/res/cs_clip_image.glsl index 5c9221c12c..f3a2cf909b 100644 --- a/webrender/res/cs_clip_image.glsl +++ b/webrender/res/cs_clip_image.glsl @@ -7,9 +7,9 @@ varying vec3 vPos; varying vec3 vClipMaskImageUv; -flat varying vec4 vClipMaskUvRect; -flat varying vec4 vClipMaskUvInnerRect; -flat varying float vLayer; +varying vec4 vClipMaskUvRect; +varying vec4 vClipMaskUvInnerRect; +varying float vLayer; #ifdef WR_VERTEX_SHADER struct ImageMaskData { diff --git a/webrender/res/cs_clip_line.glsl b/webrender/res/cs_clip_line.glsl index 16091767d9..8a2a48aea6 100644 --- a/webrender/res/cs_clip_line.glsl +++ b/webrender/res/cs_clip_line.glsl @@ -11,10 +11,10 @@ varying vec3 vLocalPos; -flat varying int vStyle; -flat varying float vAxisSelect; -flat varying vec4 vParams; -flat varying vec2 vLocalOrigin; +varying float vStyle; +varying float vAxisSelect; +varying vec4 vParams; +varying vec2 vLocalOrigin; #ifdef WR_VERTEX_SHADER @@ -72,9 +72,10 @@ void main(void) { } vLocalOrigin = pos; - vStyle = int(data.style); + vStyle = data.style; - switch (vStyle) { + int style = int(vStyle); + switch (style) { case LINE_STYLE_SOLID: { break; } @@ -131,7 +132,8 @@ void main(void) { // Select the x/y coord, depending on which axis this edge is. vec2 pos = mix(local_pos.xy, local_pos.yx, vAxisSelect); - switch (vStyle) { + int style = int(vStyle); + switch (style) { case LINE_STYLE_SOLID: { break; } diff --git a/webrender/res/cs_clip_rectangle.glsl b/webrender/res/cs_clip_rectangle.glsl index 410ded9bbf..1dd7bf2db0 100644 --- a/webrender/res/cs_clip_rectangle.glsl +++ b/webrender/res/cs_clip_rectangle.glsl @@ -5,11 +5,11 @@ #include shared,clip_shared,ellipse varying vec3 vPos; -flat varying float vClipMode; -flat varying vec4 vClipCenter_Radius_TL; -flat varying vec4 vClipCenter_Radius_TR; -flat varying vec4 vClipCenter_Radius_BL; -flat varying vec4 vClipCenter_Radius_BR; +varying float vClipMode; +varying vec4 vClipCenter_Radius_TL; +varying vec4 vClipCenter_Radius_TR; +varying vec4 vClipCenter_Radius_BL; +varying vec4 vClipCenter_Radius_BR; #ifdef WR_VERTEX_SHADER struct ClipRect { diff --git a/webrender/res/pf_vector_cover.glsl b/webrender/res/pf_vector_cover.glsl index a4eece1a1f..2b3b06c1f8 100644 --- a/webrender/res/pf_vector_cover.glsl +++ b/webrender/res/pf_vector_cover.glsl @@ -12,7 +12,7 @@ in int aSubpixel; in int aPad; out vec2 vStencilUV; -flat out int vSubpixel; +out float vSubpixel; void main(void) { vec4 targetRect = vec4(aTargetRect); @@ -25,7 +25,7 @@ void main(void) { gl_Position = uTransform * vec4(targetPosition, aPosition.z, 1.0); vStencilUV = stencilPosition; - vSubpixel = aSubpixel; + vSubpixel = float(aSubpixel); } #endif @@ -37,7 +37,7 @@ void main(void) { #define LCD_FILTER_FACTOR_2 (8.0 / 255.0) in vec2 vStencilUV; -flat in int vSubpixel; +in float vSubpixel; /// Applies a slight horizontal blur to reduce color fringing on LCD screens /// when performing subpixel AA. @@ -56,7 +56,7 @@ void main(void) { ivec2 stencilUV = ivec2(vStencilUV); float shade0 = abs(TEXEL_FETCH(sColor0, stencilUV, 0, ivec2(0, 0)).r); - if (vSubpixel == 0) { + if (vSubpixel == 0.0) { oFragColor = vec4(shade0); return; } diff --git a/webrender/res/prim_shared.glsl b/webrender/res/prim_shared.glsl index 616ec34f0c..cf07f8cab4 100644 --- a/webrender/res/prim_shared.glsl +++ b/webrender/res/prim_shared.glsl @@ -26,7 +26,7 @@ vec2 clamp_rect(vec2 pt, RectWithSize rect) { } // TODO: convert back to RectWithEndPoint if driver issues are resolved, if ever. -flat varying vec4 vClipMaskUvBounds; +varying vec4 vClipMaskUvBounds; // XY and W are homogeneous coordinates, Z is the layer index varying vec4 vClipMaskUv; @@ -232,6 +232,11 @@ void write_clip(vec4 world_pos, ClipArea area) { ); vClipMaskUv = vec4(uv, area.common_data.texture_layer_index, world_pos.w); } + +vec2 pack_address(int address) { + return vec2(address % 65536, address / 65536); +} + #endif //WR_VERTEX_SHADER #ifdef WR_FRAGMENT_SHADER @@ -272,6 +277,10 @@ vec4 dither(vec4 color) { } #endif //WR_FEATURE_DITHERING +int unpack_address(vec2 packed_address) { + return int(65536.0 * packed_address.y + packed_address.x); +} + vec4 sample_gradient(int address, float offset, float gradient_repeat) { // Modulo the offset if the gradient repeats. float x = mix(offset, fract(offset), gradient_repeat); diff --git a/webrender/res/ps_split_composite.glsl b/webrender/res/ps_split_composite.glsl index 2a90e9f28c..ea1e2e03c5 100644 --- a/webrender/res/ps_split_composite.glsl +++ b/webrender/res/ps_split_composite.glsl @@ -5,8 +5,8 @@ #include shared,prim_shared varying vec3 vUv; -flat varying vec4 vUvTaskBounds; -flat varying vec4 vUvSampleBounds; +varying vec4 vUvTaskBounds; +varying vec4 vUvSampleBounds; #ifdef WR_VERTEX_SHADER struct SplitGeometry { diff --git a/webrender/res/ps_text_run.glsl b/webrender/res/ps_text_run.glsl index fe53d711cc..6bcb423c90 100644 --- a/webrender/res/ps_text_run.glsl +++ b/webrender/res/ps_text_run.glsl @@ -4,10 +4,10 @@ #include shared,prim_shared -flat varying vec4 vColor; +varying vec4 vColor; varying vec3 vUv; -flat varying vec4 vUvBorder; -flat varying vec2 vMaskSwizzle; +varying vec4 vUvBorder; +varying vec2 vMaskSwizzle; #ifdef WR_FEATURE_GLYPH_TRANSFORM varying vec4 vUvClip; diff --git a/webrender/res/transform.glsl b/webrender/res/transform.glsl index 0cb940999d..8609952207 100644 --- a/webrender/res/transform.glsl +++ b/webrender/res/transform.glsl @@ -2,7 +2,7 @@ * 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/. */ -flat varying vec4 vTransformBounds; +varying vec4 vTransformBounds; #ifdef WR_VERTEX_SHADER diff --git a/wrench/reftests/transforms/coord-system.png b/wrench/reftests/transforms/coord-system.png index e18a5b8746..0380d9507d 100644 Binary files a/wrench/reftests/transforms/coord-system.png and b/wrench/reftests/transforms/coord-system.png differ diff --git a/wrench/reftests/transforms/near-plane-clip.png b/wrench/reftests/transforms/near-plane-clip.png index f7ae87e3cf..b41f424cef 100644 Binary files a/wrench/reftests/transforms/near-plane-clip.png and b/wrench/reftests/transforms/near-plane-clip.png differ diff --git a/wrench/reftests/transforms/reftest.list b/wrench/reftests/transforms/reftest.list index a5dcb0e502..8c63dc61c5 100644 --- a/wrench/reftests/transforms/reftest.list +++ b/wrench/reftests/transforms/reftest.list @@ -14,7 +14,7 @@ platform(linux,mac) == coord-system.yaml coord-system.png platform(linux,mac) zoom(4) == border-zoom.yaml border-zoom.png platform(linux) fuzzy(1,520) == perspective-origin.yaml perspective-origin.png platform(linux,mac) color_targets(2) alpha_targets(0) fuzzy(1,180) == screen-space-blit.yaml screen-space-blit.png -platform(linux,mac) color_targets(1) alpha_targets(0) fuzzy(128,800) == screen-space-blit-trivial.yaml screen-space-blit.png +platform(linux,mac) color_targets(1) alpha_targets(0) fuzzy(1,180) == screen-space-blit-trivial.yaml screen-space-blit-trivial.png platform(linux) fuzzy(11,4592) == screen-space-blur.yaml screen-space-blur.png platform(linux,mac) == nested-rotate-x.yaml nested-rotate-x.png platform(linux,mac) == nested-preserve-3d.yaml nested-preserve-3d.png diff --git a/wrench/reftests/transforms/screen-space-blit-trivial.png b/wrench/reftests/transforms/screen-space-blit-trivial.png new file mode 100644 index 0000000000..6033b4748b Binary files /dev/null and b/wrench/reftests/transforms/screen-space-blit-trivial.png differ diff --git a/wrench/reftests/transforms/screen-space-blit.png b/wrench/reftests/transforms/screen-space-blit.png index f49bb3fd43..4fabf90dad 100644 Binary files a/wrench/reftests/transforms/screen-space-blit.png and b/wrench/reftests/transforms/screen-space-blit.png differ