diff --git a/webrender/res/brush.glsl b/webrender/res/brush.glsl index baeebd45dc..f828e6cae1 100644 --- a/webrender/res/brush.glsl +++ b/webrender/res/brush.glsl @@ -91,6 +91,7 @@ void main(void) { #ifdef WR_FEATURE_ALPHA_PASS write_clip( vi.world_pos, + vi.snap_offset, clip_area ); #endif diff --git a/webrender/res/prim_shared.glsl b/webrender/res/prim_shared.glsl index 42ce495d35..7dce4dde27 100644 --- a/webrender/res/prim_shared.glsl +++ b/webrender/res/prim_shared.glsl @@ -27,6 +27,7 @@ vec2 clamp_rect(vec2 pt, RectWithSize rect) { // TODO: convert back to RectWithEndPoint if driver issues are resolved, if ever. flat varying vec4 vClipMaskUvBounds; +flat varying vec4 vClipMaskUvSampleBounds; // XY and W are homogeneous coordinates, Z is the layer index varying vec4 vClipMaskUv; @@ -222,14 +223,21 @@ VertexInfo write_transform_vertex(RectWithSize local_segment_rect, return vi; } -void write_clip(vec4 world_pos, ClipArea area) { +void write_clip(vec4 world_pos, vec2 snap_offset, ClipArea area) { vec2 uv = world_pos.xy * uDevicePixelRatio + - world_pos.w * (area.common_data.task_rect.p0 - area.screen_origin); + world_pos.w * (snap_offset + area.common_data.task_rect.p0 - area.screen_origin); vClipMaskUvBounds = vec4( area.common_data.task_rect.p0, area.common_data.task_rect.p0 + area.common_data.task_rect.size ); + vClipMaskUvSampleBounds.xy = vClipMaskUvBounds.xy + vec2(0.5); + vClipMaskUvSampleBounds.zw = vClipMaskUvBounds.zw - vec2(0.5); vClipMaskUv = vec4(uv, area.common_data.texture_layer_index, world_pos.w); + + vec2 texture_size = vec2(textureSize(sCacheA8, 0).xy); + vClipMaskUv.xy /= texture_size; + vClipMaskUvBounds /= texture_size.xyxy; + vClipMaskUvSampleBounds /= texture_size.xyxy; } #endif //WR_VERTEX_SHADER @@ -250,9 +258,14 @@ float do_clip() { if (!all(inside)) { return 0.0; } + // finally, the slow path - fetch the mask value from an image - ivec3 tc = ivec3(mask_uv, vClipMaskUv.z); - return texelFetch(sCacheA8, tc, 0).r; + + // TODO(gw): texelFetch here fails on some nVidia hardware in + // some cases. For now, just use texture() + // unconditionally. + mask_uv = clamp(mask_uv, vClipMaskUvSampleBounds.xy, vClipMaskUvSampleBounds.zw); + return texture(sCacheA8, vec3(mask_uv, vClipMaskUv.z)).r; } #ifdef WR_FEATURE_DITHERING diff --git a/webrender/res/ps_split_composite.glsl b/webrender/res/ps_split_composite.glsl index dae9677d8b..7896b66433 100644 --- a/webrender/res/ps_split_composite.glsl +++ b/webrender/res/ps_split_composite.glsl @@ -80,6 +80,7 @@ void main(void) { write_clip( world_pos, + vec2(0.0), clip_area ); diff --git a/webrender/res/ps_text_run.glsl b/webrender/res/ps_text_run.glsl index c523a91021..468663eeed 100644 --- a/webrender/res/ps_text_run.glsl +++ b/webrender/res/ps_text_run.glsl @@ -229,7 +229,7 @@ void main(void) { vec2 f = (vi.local_pos - glyph_rect.p0) / glyph_rect.size; #endif - write_clip(vi.world_pos, clip_area); + write_clip(vi.world_pos, vi.snap_offset, clip_area); switch (color_mode) { case COLOR_MODE_ALPHA: diff --git a/wrench/reftests/clip/clip-45-degree-rotation-ref.png b/wrench/reftests/clip/clip-45-degree-rotation-ref.png index d554807aff..d6fdfa99a4 100644 Binary files a/wrench/reftests/clip/clip-45-degree-rotation-ref.png and b/wrench/reftests/clip/clip-45-degree-rotation-ref.png differ diff --git a/wrench/reftests/gradient/linear-aligned-border-radius.png b/wrench/reftests/gradient/linear-aligned-border-radius.png index 55518031cd..892a9606ad 100644 Binary files a/wrench/reftests/gradient/linear-aligned-border-radius.png and b/wrench/reftests/gradient/linear-aligned-border-radius.png differ diff --git a/wrench/reftests/gradient/repeat-border-radius.png b/wrench/reftests/gradient/repeat-border-radius.png index 10dd14b48a..47bdae159f 100644 Binary files a/wrench/reftests/gradient/repeat-border-radius.png and b/wrench/reftests/gradient/repeat-border-radius.png differ diff --git a/wrench/reftests/transforms/rotated-clip-large.png b/wrench/reftests/transforms/rotated-clip-large.png index 476febd29d..40a094ba73 100644 Binary files a/wrench/reftests/transforms/rotated-clip-large.png and b/wrench/reftests/transforms/rotated-clip-large.png differ diff --git a/wrench/reftests/transforms/rotated-clip.png b/wrench/reftests/transforms/rotated-clip.png index 4fcfcc7329..2e9c6f0c49 100644 Binary files a/wrench/reftests/transforms/rotated-clip.png and b/wrench/reftests/transforms/rotated-clip.png differ