From d26c75c697d2081e0f4cd4b78c52d50fc2306618 Mon Sep 17 00:00:00 2001 From: Glenn Watson Date: Tue, 6 Mar 2018 16:42:12 +1000 Subject: [PATCH] Optimization: draw solid, single color borders as rect + clip. Due to various recent optimizations and features added for the segment logic, it's now feasible to start drawing borders as a solid rect + clip mask. For now, we start with only the simplest and most common case, borders with style: solid and a single color. This optimization applies in a couple of ways: * Fewer shader switches and better batching. Specifically, we can often batch these simple borders into an existing solid rect batch. Additionally, the edge segments of borders are typically considered opaque segments, which are more efficient to batch, and help with early z-reject of other fragments. * Once we start to cache clip masks between elements, and also across frames / display lists, we'll automatically get some wins here by only rendering a border corner mask once where applicable. Many real world sites use a common border radius on all buttons, for example, so this can be a significant optimization in these cases. --- webrender/src/border.rs | 63 +++++++++++++++++- webrender/src/display_list_flattener.rs | 5 +- .../border/border-clamp-corner-radius-ref.png | Bin 12196 -> 0 bytes .../border/border-clamp-corner-radius.png | Bin 0 -> 12198 bytes wrench/reftests/border/border-radii.png | Bin 1130 -> 1118 bytes wrench/reftests/border/reftest.list | 2 +- .../clip/border-with-rounded-clip-ref.png | Bin 1512 -> 0 bytes .../clip/border-with-rounded-clip.png | Bin 0 -> 1850 bytes wrench/reftests/clip/reftest.list | 2 +- wrench/reftests/mask/rounded-corners.png | Bin 1574 -> 1687 bytes wrench/reftests/transforms/rotated-image.png | Bin 7476 -> 7453 bytes 11 files changed, 68 insertions(+), 4 deletions(-) delete mode 100644 wrench/reftests/border/border-clamp-corner-radius-ref.png create mode 100644 wrench/reftests/border/border-clamp-corner-radius.png delete mode 100644 wrench/reftests/clip/border-with-rounded-clip-ref.png create mode 100644 wrench/reftests/clip/border-with-rounded-clip.png diff --git a/webrender/src/border.rs b/webrender/src/border.rs index a249148f9d..1e01e9d20e 100644 --- a/webrender/src/border.rs +++ b/webrender/src/border.rs @@ -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/. */ -use api::{BorderRadius, BorderSide, BorderStyle, BorderWidths, ColorF, LayerPoint}; +use api::{BorderRadius, BorderSide, BorderStyle, BorderWidths, ClipMode, ColorF, LayerPoint}; use api::{LayerPrimitiveInfo, LayerRect, LayerSize, NormalBorder, RepeatMode, TexelRect}; use clip::ClipSource; use ellipse::Ellipse; @@ -373,6 +373,63 @@ impl<'a> DisplayListFlattener<'a> { let top = &border.top; let bottom = &border.bottom; + let constant_color = left.color; + let is_simple_border = [left, top, right, bottom].iter().all(|edge| { + edge.style == BorderStyle::Solid && + edge.color == constant_color + }); + + if is_simple_border { + let extra_clips = vec![ + ClipSource::new_rounded_rect( + info.rect, + border.radius, + ClipMode::Clip, + ), + ClipSource::new_rounded_rect( + LayerRect::new( + LayerPoint::new( + info.rect.origin.x + widths.left, + info.rect.origin.y + widths.top, + ), + LayerSize::new( + info.rect.size.width - widths.left - widths.right, + info.rect.size.height - widths.top - widths.bottom, + ), + ), + BorderRadius { + top_left: LayerSize::new( + (border.radius.top_left.width - widths.left).max(0.0), + (border.radius.top_left.height - widths.top).max(0.0), + ), + top_right: LayerSize::new( + (border.radius.top_right.width - widths.right).max(0.0), + (border.radius.top_right.height - widths.top).max(0.0), + ), + bottom_left: LayerSize::new( + (border.radius.bottom_left.width - widths.left).max(0.0), + (border.radius.bottom_left.height - widths.bottom).max(0.0), + ), + bottom_right: LayerSize::new( + (border.radius.bottom_right.width - widths.right).max(0.0), + (border.radius.bottom_right.height - widths.bottom).max(0.0), + ), + }, + ClipMode::ClipOut, + ), + ]; + + self.add_solid_rectangle( + clip_and_scroll, + info, + border.top.color, + None, + extra_clips, + ); + + return; + } + let corners = [ border.get_corner( left, @@ -465,6 +522,7 @@ impl<'a> DisplayListFlattener<'a> { info, border.top.color, Some(descriptor), + Vec::new(), ); } @@ -481,6 +539,7 @@ impl<'a> DisplayListFlattener<'a> { info, border.left.color, Some(descriptor), + Vec::new(), ); } @@ -497,6 +556,7 @@ impl<'a> DisplayListFlattener<'a> { info, border.right.color, Some(descriptor), + Vec::new(), ); } @@ -515,6 +575,7 @@ impl<'a> DisplayListFlattener<'a> { info, border.bottom.color, Some(descriptor), + Vec::new(), ); } } else { diff --git a/webrender/src/display_list_flattener.rs b/webrender/src/display_list_flattener.rs index ed4d110c3f..9f8630b1f8 100644 --- a/webrender/src/display_list_flattener.rs +++ b/webrender/src/display_list_flattener.rs @@ -349,6 +349,7 @@ impl<'a> DisplayListFlattener<'a> { &info, bg_color, None, + Vec::new(), ); } } @@ -700,6 +701,7 @@ impl<'a> DisplayListFlattener<'a> { &prim_info, info.color, None, + Vec::new(), ); } SpecificDisplayItem::ClearRectangle => { @@ -1512,6 +1514,7 @@ impl<'a> DisplayListFlattener<'a> { info: &LayerPrimitiveInfo, color: ColorF, segments: Option, + extra_clips: Vec, ) { if color.a == 0.0 { // Don't add transparent rectangles to the draw list, but do consider them for hit @@ -1530,7 +1533,7 @@ impl<'a> DisplayListFlattener<'a> { self.add_primitive( clip_and_scroll, info, - Vec::new(), + extra_clips, PrimitiveContainer::Brush(prim), ); } diff --git a/wrench/reftests/border/border-clamp-corner-radius-ref.png b/wrench/reftests/border/border-clamp-corner-radius-ref.png deleted file mode 100644 index 69c73c92b24d0ac59f6e19137e01597f6b0efdf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12196 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 YXEf322v$H%-#=4QP?xWMV;=l}07wO*Y5)KL diff --git a/wrench/reftests/border/border-clamp-corner-radius.png b/wrench/reftests/border/border-clamp-corner-radius.png new file mode 100644 index 0000000000000000000000000000000000000000..bdeda438645d6bbd1f77b8192e08d925d9c82a5b GIT binary patch literal 12198 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�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 literal 1130 zcmeAS@N?(olHy`uVBq!ia0vp^g+N@+!3HEv)YqS7U|=!yba4!+nDh3owN7fF$gz+9 z=KWblTo)HAW$e-FbWw6zxI{%!sFmsB3ezShML{7iFIK@$mqnkl1hh&PDQNZQrLEs7 z*k5^P?|Iwor{})??J7Lill1BD+~V_B?=;Etz1V-OLone8hd~mHgdtOp1fyFIgR)zL zpz?tZK@ZzUcV##11t!m ztftoRG?k6};%)9TXHp)iO)YleG&5uK@!u`%wPYn{M7+P8(ejR>ucc*7$B(~jDN+i5 z@@J2=heF|zyRi%Q%I?@(sy?Ob@86X56FZeoiQc$zq9N0}%9PE0%Jl=ks_r?NPMN|W zF8)p-py0^EM7tvy6WM3CvzH5KXe_$prmb~{aplMLAC)wc{P{O*X-W7b{O!jJJ`L^v zQu=$8Pvs|dbsMkmv{SirfZ@Vj-YHX4&)IKkV*1|BzF#W8(mf`Uao4UpjqR6$5=uo^ ztSM3d;vMJmW$)BeqT9D0Z+QRI^~kHN{o6%9eX+89$@ijnPe(+=i|^0koIY#)iH&oa zayw;PyVOrPPTlyIYxi`l_&NUvhspP37v)*M4HpTX{VQ>?<5^u#hD))%o5`Y`^2$;d z@AM1yX1qJz;Wh%5G5%z@@czDW{Qswym%q9HS-mIY!4sAhtBTkoJzmU~E*Iz!;eo zYrp$r^ZDZ5&6{Ty%YO z`(*pY^m~H*d=0y-${kitXvofXaBj9fIkDX3;A%tJBJSA8lYhBt#6$w+a&Fyfc$*vG z^hvQ#Ny%u*Tf2H=XQF}Oo-pl zbo8i$FYkq0TwAuN{Pyixe?(BT9$T)&ky+uw_Kdwxx=wb!j_3rIAq<|belF{r5}E*i C@&u~@ diff --git a/wrench/reftests/border/reftest.list b/wrench/reftests/border/reftest.list index 485ea50ebd..c6de4090f9 100644 --- a/wrench/reftests/border/reftest.list +++ b/wrench/reftests/border/reftest.list @@ -1,4 +1,4 @@ -== border-clamp-corner-radius.yaml border-clamp-corner-radius-ref.png +== border-clamp-corner-radius.yaml border-clamp-corner-radius.png == border-gradient-simple.yaml border-gradient-simple-ref.yaml == border-radial-gradient-simple.yaml border-radial-gradient-simple-ref.yaml == border-radii.yaml border-radii.png diff --git a/wrench/reftests/clip/border-with-rounded-clip-ref.png b/wrench/reftests/clip/border-with-rounded-clip-ref.png deleted file mode 100644 index dc775d6e4419280e7a6847cbed3e037dce8fe462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1512 zcmYk6c{J2(7{>?0Afp9cAt7|fat||dvqrYDD@@49%w#5OWZ!Bm*^u|d6xH6#{H*@~>htvCx;fK$a(*B;yp{8^g7McoF7^K^F2k&bc$IdIj^|0;o@*QunTGk8T_6yCT z#fG;mN9^$n=u%^GyLzhykgzaJVy^pbXL0+=f^NZ$HLf^2$zh*x3@EE8iR__!x-<^ldbc3UcA%zyWntoh@JW>@&Bpe=u$Ptn zQ-3vQf2@#0K9@#9tJG`)chQoP|En0Ww58;TltJ>E|2{O?WPs)zBV_=S@i*!MXIHh| zn`16pbbU8E-vkW?1JKxZjHSrDO0*@rXb4sCs_-`ANg=?zFcfmE+n-S1curz2scKbe z2vtpQ`GVk$6sz+V697jp#OT5}aCmUlFtj79KdhWH>K0XXPbO+!kBu=MptmFYg?_R_ zw+8E-G8JS~JAxN;J*f~S?hD5%R#7vc19chhXpo}lJ1S2~lEgKaC8`7VVQ7$tx@6~x zAIpK~`5raaB$oI*U?2?5dZ3RM{W>#&<9M;3;9ku!L_kaeqt7Bu&+-a5oB%AI-*kQw zyKWH?B<m^Cy_v-1wK_j( zkYvsdL0AlPg85$F`M%`jH|)y@gBii}GuE2R7SV?v!xVmlNWkab1y+CEY2~6 zUbpBTjDZ%hV6p-bZ{?@zmd?3M9eM|LZRa?5G#?>zllqi(=?B>M;U1u<`E0I&ut&=> zm$h3x^`6n&QNs41z#Y1^;CLfUYaa9x)y_mNMR_^aOyGo5dZ=z_HfE#hx0wlyGI2cU zM*p$e@;Mi>qxJ;uao(#$2r{A%|8<5#Za2qn^_fuelUBAWN6nQ&w~pNHpabwkGqRG4|8pQsD@Qi>pA z5K#k8F1B$}GGKRFQIpP2dkHRSQlE>;Ej4fLW4ltOHqPQ`v;s@OaM>xPbcwqho|`vO z#2_+Ujg{rtFAW|$z3G`6f93FP?(9*X&&5pPW8BMQ#|kDipCbn)l(}K)oX^*8A{P=` zxigw7Hm)bUK{HO*I-O6W={0z~R-P?bqHjBRTW0s%PP7kayE;BSH$67DoX<1AGfyYo z7*L+sTw*=d3eD9D_;M2)ca2`PyPJ}UQ|oDa|NaB^eua-51P!9YzhOwzWcz%dpklc3 t1}~m+!c;K4#SLrC_x;}*^tQSxk|g1xqeebbC)~*pM>{v$d#3`^{{d-wyqo|4 diff --git a/wrench/reftests/clip/border-with-rounded-clip.png b/wrench/reftests/clip/border-with-rounded-clip.png new file mode 100644 index 0000000000000000000000000000000000000000..676f20699106c365a996d38aec97dcfabc19022d GIT binary patch literal 1850 zcmZvddr;EZ9>B4DkSHbL3!fmyxteSxBqURT>RO`%*;TaBB!TI=J&&d!~=Gxv}4Ip6urobQ?QJ#)^N z7fKB<)JN$lb*+Put>Ppp%}9o&^#y`LFbbs*?QT zsofA-XY7*~?>ojaMzcmUcDm=&x!yaQKfb>_mNmDA&)E})a0r!=a7lJZ7bAW-R6=3X zG5)~8Dv3=Op+-Nk+QIIL4z^Box}=bqO6O2d!abx z-&J*MsVu}vB7l|q5cZfiDlf{LaY{Q{Ay*D~>{j6I`0bGHo^2KK*L{*(d+k>XzfKU~ zF!C2m)@J{%PC{|64Z;4=rE-$>GyvTNTdp7S09e1I6Z*72$jPE#yzp3(CXKoJ$iPTg z=XR%8>b_-tPtbnQnr(mGO?ff>=$7#{|6y>xFGQYvuViTcB)(X1>LzG8wh3jrGR~e6 zcS79#RyPHd4M5QE7@BFl2AS27T*i&T34Y-6nK1>VbRqCz#J!9IIIR1llM z+}{|7WjoRn!8awdS}wlgi2@ApDe@HxmwO(OVJzFsO-y|_xNvaf4p9;E93&7EJY^pj zv(OI*W_6n^b&X0>fGom@K5jV7QJFOLyQlYfEkcNm@6sbjJrvJEa*p>s!tw_vYyN31 zVWhFUZo{XKk{QeTt#~pcMO1^A(3vf7gQbu0VO%<}p6qv-FUf_aylKai=_!`?4Aoq! zH(UkUyVg<2^=|~VLm$6u8>H#o?X*aBr7=DLo$i&%g{iWO@|w`*-eXF=hF^ZS4;XaB z%rAaEf?P>28FKH)gOa^x=_%ZM$J2lolNsw9AmI>uCbrrU4|H=0zs5C74vX@>V8{_` zRxD$FE65n_iKt8#c#4$tHwo8j*QY!{#`0?{TnT!$IjQ-iKPR+#5E;Ja)956b)Z%E^ z8u1qj@T~zw&GpgJNRYn#il*_9KYT%k+8;ZDfQ3`2Pcrzi;vS^1&X=Zx0GuQXB3Jhs zvH=B%=Xm|i4lV*mDvJyM=L!A!vcf5jC~+S$d?ZVg*gr>|vPH*4o$>;8P^}sE8ht{u z-?0>PwKnwAXaQEUWWDu9h&Ft*PjG$F%iR@FhG|5JTyjdaO1)-OiVknTCv=2>bpB zu)g$&SO$`Ua(}5c36E%1Q~1|HZWWIB9HbdX!`p)~TeT?RVp}=$tRV2K-k{LUpU_Hj zo34KRO)=VAeh9afY$A+d9IbL|*j7i$o#GoJV2H{(pzr;Rfw+xZAr^yPq2t^G01u;B zVeubz45{tQUksM@W0 z2a=AGLza9nis)60$LH6%e30GYNcebVVWr6x_}cu_Y4=!)^D^}GFvup-X$fZMm%q3m zi#mC8B-lon&aCLZKW$TFW`|KUId+^=a?3b8PnZpM7VhF><3*E2ZE9~=gG;4b=NO2J z#s?y~ zpCxVEI$i(Cq7E!lc)$XpM*ViW^ncSZ$IOxzK~ s&+nHLH=#b9wfC2eT|EC!&#~Lli97(z%8|Gvbx(u@lBuM6|Ad170C7K7kN^Mx literal 0 HcmV?d00001 diff --git a/wrench/reftests/clip/reftest.list b/wrench/reftests/clip/reftest.list index 942fc7c256..4250f1ca17 100644 --- a/wrench/reftests/clip/reftest.list +++ b/wrench/reftests/clip/reftest.list @@ -1,4 +1,4 @@ -== border-with-rounded-clip.yaml border-with-rounded-clip-ref.png +== border-with-rounded-clip.yaml border-with-rounded-clip.png == clip-mode.yaml clip-mode.png == clip-ellipse.yaml clip-ellipse.png == clip-45-degree-rotation.yaml clip-45-degree-rotation-ref.png diff --git a/wrench/reftests/mask/rounded-corners.png b/wrench/reftests/mask/rounded-corners.png index b55f7baba70916611ad3d9d1226fa193d7296ab5..3acf447cd112f3edfbd88946a109a0bcb69c7645 100644 GIT binary patch literal 1687 zcmc&#do&XY7$5U$VO_R{Toe;^vxFX6GK_}2Vl!$UONDzpR*P9(8!;2PDTXVwG`Awv zO-;5Q+{_r0oILWFYcsEGk@Ohu?*I3X``+A`@Zv?^ZS@V0X_yGGY|j( zFu)w~3Q@;owUP96)c! z0D~^Gy|UPLSAS1`%gw4`XlYFv@tGU*+1#3GG(5vGuiXF|nsSiqc|_A;AAFg=Z~_~4EhAcH0`;JB7TPEjU?7>?Kb<{4to`$dp1!F^A+q=yvh)ejN1=!tYUQUY##ERBn<9oFS10=W z`2;(+**SVeg_QBOcX5mloDvBgW=sy5l^rlHa|D*{|G{Lhz6sLA#5wP|Jq-G466%(ToEI@oL+&MPy!n3p&}J4B^1z;~|FkN!r>)}1*O z*`IecNk%>g=wbm`4#Cy{3((iC{8(+5Z@c9^L&7cKhp14jrd$kM{T6I(`|P@4d}0D| zjeBdog7T4m=-XaoWE;xAT?{ojhk3biw?fPJL7$3V^&s z;#laK%Hn(jxU3V;^+h-Q4B*yJlYxG$Vg4Jx;~4)MWKRvZN}lt2l()gZI>6v|wFvaf^8tjO3R*tVuI3$3q8Inrr$kcNhLSRxP4F)SAvJDJUa9q6!e2+U=mOO4py1BTR zjU%L{DjnU+ANcweQr0TB!FC`Hr^`x8hvlNvm&1Z%L?t^R%|Vo}uXZ-FTiwPSBI}1E zh`eMo+&?MA{Fdd0c5mX8xUM6ovkOe16c)Y`G{ve<~5xnu=bywr%E!zQd2soRq%-&cTj%t zNDE8U?8TV$v|8z#>hQ;U+|+E%*5_=SLhIxS56L$&$fM7`2)smo6!1O2*!c?Y0iNSo zhiu0jUn2w;Uy`9Qq2_(k1AK)73de*K`U!$sA@NJ->Tb9h+_iZuu^QQfY&&(x*O|m0 zaHHg#|Ldi;2`7bdM-3#S+}c5*eV?;&~FQiZ%0GjW~*N5?K+mj+X^{tLc>dHuzM UEoSaM>W2fspaZ<_dqijb4ZTe&y#N3J literal 1574 zcmcIk={MU60E{D|aimq%P{)f~wUno=BhCtmxHf23*AYj%o;r#mY0#18c^u_2Ym<~NTRS{2r;?1*ee@-Qd(7U zvqBhb`PVhUgd$n$uSVLC?jMN(*s{+6S?AoXq6AF3{&J=sUt zDG1foZLST;{{*;|KbMBj#BYQVh;ZVDAn~UhTvouwHa_LV%zzSK2pSM1EGPG%OueWS z9B^A`xEeA(5f2vQ!nl_jIQsw?4j1*-_0FTZa~mTq@c5k@jY9@pP(u%S=j4}l2ygmo zj#1ACwuKX{Ciw9)X|y^?d2MrLOzGy9^53H)`1}r6poE<5G`==bX61V~ifT$<=MA}g zHHgcb-k2`&+YKiSsuSjI2>o(|4PU}x3}Fh%cK{z8N*wHgWA;UwW5vWJ1O^HO3e8xd zjuiVS9Z$i=rdbIMl5IK&U&U;bPOhOq;$!z8!!B1_~S`41@XnK(y=dl+dWxE8{H%Avg6(Rz{4bCnF2lGH-4PBFQ zNM60}g1AiD)XdjF8;tiPd6^x!W3ur&LP?ScYBD2^+%DpR7z7SThTdo?;#Q#HH-Ch> zlgv!5I`&34#wPL9GS!-Z>p~63*G6$`Gc$S_&Q6?sG!t8YI@*7S?$cwVuct3uT54Bd zJ-oeEMnKG7^l|*C((c^w5Kf`=(%oThfPXc|QNPca_qpj#v&srREOhJZj4 ziXpu%=Iur5wDPTF0Ei?r0X6>RarPg#@iFF(IIk$xtRQsB*fWDMSabA%wEV8N(=BFS zE-SB-Z4#l2Upd#C$Q$#6$`qP64Iqy=O?Lzg!`gDcABZp@d> zw0e^;r*o#J?mWt0$oN)QXygYyRbmp!uFvl3N+8TyxzrMm;&uaRg^ke$v2zM4*Y+2!#6(Pnaitn}*eT`}~%Akv3!yqbc%Evb{x7hz_o zv(jV3(H8lwfKN}uB$eX4^hSYv7}mkKj0w=*=Pt+ChkX>7&Blw@A(w^P80kyp&Av5@ zMoRrk@NZZ>&1!ftfb*pJOmjQP5>Lgd- zJX*(9kxBQza)QB)ja`Yzsq)XlTdHz2Dr=PtM>2mJuB6bit|QKp&Xkxa93R_jQ#mzG zV`JN+b>1tP22QHJnWQ)@iR=bQfA0~!WDK>p2W_w09C*{G6#@c4d3g_VWr`{nbZk!apAG@g)EN diff --git a/wrench/reftests/transforms/rotated-image.png b/wrench/reftests/transforms/rotated-image.png index f19eaa04c9f9a8416100cb9977c6a8a1f8bddb14..8e58ae42ad9f319f80071bbadcf2c51a1c131af7 100644 GIT binary patch literal 7453 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 Xuu*SZj5+W%6m;C-wEe3;(6{~%++fhd