From 171be5b5fc3b49822f5e44f19c7e6ffd242db30c Mon Sep 17 00:00:00 2001 From: Glenn Watson Date: Tue, 18 Sep 2018 11:45:06 +1000 Subject: [PATCH] Fix an issue on some nvidia cards with texelFetch. In the do_clip() function, texelFetch is sometimes returning invalid results on some nVidia GPUs. To work around that, use UVs as normalized float coordinates and fetch via texture(). This fixes the problems on nVidia cards. This exposed a bug in how we handle vertex snapping with clips. Previously, we just cast the float UVs to an int before passing to texelFetch. Now, pass in the snap offset and apply that to the UVs for the clip mask. --- webrender/res/brush.glsl | 1 + webrender/res/prim_shared.glsl | 21 ++++++++++++++---- webrender/res/ps_split_composite.glsl | 1 + webrender/res/ps_text_run.glsl | 2 +- .../clip/clip-45-degree-rotation-ref.png | Bin 13254 -> 13280 bytes .../gradient/linear-aligned-border-radius.png | Bin 7939 -> 7938 bytes .../gradient/repeat-border-radius.png | Bin 19740 -> 19740 bytes .../transforms/rotated-clip-large.png | Bin 7413 -> 7414 bytes wrench/reftests/transforms/rotated-clip.png | Bin 3752 -> 3754 bytes 9 files changed, 20 insertions(+), 5 deletions(-) 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 d554807aff205e2d38096996aa26a2c43f79a19f..d6fdfa99a4a514bcd69349841a858decca4c55e0 100644 GIT binary patch literal 13280 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 literal 13254 zcmeHO`%_c*w*O|kg`l8GI0{?_*_RdMP(6XvFvt2%(@w3)5dl$X`H+O_2NHPkz4n&oqSM4=zeyuuONX z`_83*#C%AbdRqvBbmLNok-^y^Vo7L?@8ed_J?po(A z4KqyA;3ml|_mfrn;&fh;QD!u1_AgWzSK&?;1sq!s-`M(YUNH?>(msl|B$A2Z&SJDu+OnjFDLyLor&*|>FuHSxXG52_I2;1ah^g+cC@*8UOVf@QOKoj<&oNtUnxa^x4Zk(oh z2!DmSCY~@w6ds8W*FY@%M+QaE!pN>Yf2r8-wB- z4?hDcp5^y_@!Ak5-63SFUx7hEJ*pMLxDT99{ekUW0b*d5Yv8Wd>h8|*0Cv8QY%ew4 zdt#z^%hOR&XnRjHG{GJ$%iDVfK)$O%rE_|pyageOmBPhC&ZkKbqBuZYo$1>BG4!FC z<)=ouf6bz8XwO8QTibiw;BFSfomT0qp$8*T>G<9!I_g~fk>zuv+_hkwZ$`GZrh9z@ zznyPUI=c!}Jms$+E3>4TtgXE&PgC*947XpYKO09IyDkHDD%yJzXiU;A-MOv_)f8gA zpUhHVvUaFwSNF60c8$9#k0Ra_EZnYe&K*q?Jduq$H?;SZgR@wf#cZ_pf$>h3uZ?xz z@ER+HviF>Kq9~HBaxp2#^$^~l@hl&%c5esj`+|jwN1b;7w(UjKIkmkf5h9fZh~*1i z1pu3ilUX8E`qmig+m?ko3);0n-D;M<8|{7@h_$7m&bjT{dw{bu67`MgH9vtDvm;pe zBc#_{4e~lH`}dl60k#g6pwyRHC}mu%O!rp1wgtR>sX^Kt*Zt)XJfF2^n5^9yl)}*c zs4=qFd>NdrQwSj%_uGG>l-hSPj?|{Ys#u!I>TI;;UFY?ckoYfhail^&=O_(c5+qB= zb={u?!Twn`_)x?*OOO0pc*Fz71Y;AtG4tk8)q#4bPw8=L&t> zG(dNUwI4899bpiD7vrdCD%1fpj+rtiPNqAJqId2^<+9$8$IzUvTr{u7IkH(n;j#9m zCTqzQ>Mj3cRIcg`xdF6K4i@qv-B&MCF#K}H@z18h3;QT@bqmqF_njkKX&Hp?<)Xh* zzc!F!tyjsMs9jqL-M1nN_2jrJrco-y5v+ZJ$;!>5!9NWacBtJ~!)UM*Iq0szIkJ?# zqrxPaGoxK=TSOCkkF|#wt=w!dRtm?X-Kl#ivO{t)Poe({M4rUj{Y}`K-iq0p~=6V#uRIVZGh>j7tt zTr5`T4O&p2!rF_CR&f<@=*KuhnhNb%Aa7+HDJH9!4Dx!$v9Vq2kkiCMzyD2^?;2hU zCDFW^hz?lA$)G;tx*y*gatji#T>mwi;%0V1NtR3r5&l(Zmjl>$PBHb)kzv5%nJ;qC zSiK>hHn({ABe~eFEs3SUFD#x%f{mfU>?0l!=dXbCh7H58v jBsUHPVq;E4jT5q` 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 Tu-tM8{M=I0xlwrCBIJJno(&Gr delta 5038 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 delta 41 wcmbO;i*e2@#tny**tUe%w|(r}d_u`lOW3^eN{7+b$qYc?>FVdQ&MBb@0C2SsGXMYp diff --git a/wrench/reftests/transforms/rotated-clip-large.png b/wrench/reftests/transforms/rotated-clip-large.png index 476febd29dc37bb1685ab8a493ddce59a3f40662..40a094ba733ccccb63f9299003f27c1fe68260e8 100644 GIT binary patch delta 5910 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 anFvcV{GzTO@=I5l(}P;fYJUnU0P6T)SEoB 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 AX#fBK diff --git a/wrench/reftests/transforms/rotated-clip.png b/wrench/reftests/transforms/rotated-clip.png index 4fcfcc73291718e0016899afdd896001393fa669..2e9c6f0c49ea4fbd132705ef1a4c053af1cf08ea 100644 GIT binary patch literal 3754 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 literal 3752 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