From 0bb9bc43750fd63d8a456103fa3c26f804b5988c Mon Sep 17 00:00:00 2001 From: Nicolas Silva Date: Wed, 11 Apr 2018 12:34:02 +0200 Subject: [PATCH 1/4] Repeat linear gradients in the brush shader when there is no spacing. --- webrender/src/display_list_flattener.rs | 66 ++++++++++++++----------- webrender/src/prim_store.rs | 28 ++++++++--- 2 files changed, 57 insertions(+), 37 deletions(-) diff --git a/webrender/src/display_list_flattener.rs b/webrender/src/display_list_flattener.rs index 23e54fbd6e..5de56c9b75 100644 --- a/webrender/src/display_list_flattener.rs +++ b/webrender/src/display_list_flattener.rs @@ -1843,6 +1843,7 @@ impl<'a> DisplayListFlattener<'a> { stops_count: usize, extend_mode: ExtendMode, gradient_index: CachedGradientIndex, + stretch_size: LayoutSize, ) { // Try to ensure that if the gradient is specified in reverse, then so long as the stops // are also supplied in reverse that the rendered result will be equivalent. To do this, @@ -1871,6 +1872,7 @@ impl<'a> DisplayListFlattener<'a> { start_point: sp, end_point: ep, gradient_index, + stretch_size, }, None, ); @@ -1889,43 +1891,49 @@ impl<'a> DisplayListFlattener<'a> { stops: ItemRange, stops_count: usize, extend_mode: ExtendMode, - tile_size: LayoutSize, + stretch_size: LayoutSize, tile_spacing: LayoutSize, ) { let gradient_index = CachedGradientIndex(self.cached_gradients.len()); self.cached_gradients.push(CachedGradient::new()); - let prim_infos = info.decompose( - tile_size, - tile_spacing, - 64 * 64, - ); - - if prim_infos.is_empty() { - self.add_gradient_impl( - clip_and_scroll, - info, - start_point, - end_point, - stops, - stops_count, - extend_mode, - gradient_index, + if tile_spacing != LayoutSize::zero() { + let prim_infos = info.decompose( + stretch_size, + tile_spacing, + 64 * 64, ); - } else { - for prim_info in prim_infos { - self.add_gradient_impl( - clip_and_scroll, - &prim_info, - start_point, - end_point, - stops, - stops_count, - extend_mode, - gradient_index, - ); + + if !prim_infos.is_empty() { + for prim_info in prim_infos { + self.add_gradient_impl( + clip_and_scroll, + &prim_info, + start_point, + end_point, + stops, + stops_count, + extend_mode, + gradient_index, + prim_info.rect.size, + ); + } + + return; } } + + self.add_gradient_impl( + clip_and_scroll, + info, + start_point, + end_point, + stops, + stops_count, + extend_mode, + gradient_index, + stretch_size, + ); } fn add_radial_gradient_impl( diff --git a/webrender/src/prim_store.rs b/webrender/src/prim_store.rs index 70950992e1..a6b77e2d0e 100644 --- a/webrender/src/prim_store.rs +++ b/webrender/src/prim_store.rs @@ -285,6 +285,7 @@ pub enum BrushKind { reverse_stops: bool, start_point: LayoutPoint, end_point: LayoutPoint, + stretch_size: LayoutSize, } } @@ -1684,15 +1685,30 @@ impl PrimitiveStore { PrimitiveKind::Brush => { let brush = &self.cpu_brushes[metadata.cpu_prim_index.0]; brush.write_gpu_blocks(&mut request); + + let repeat = match brush.kind { + BrushKind::LinearGradient { stretch_size, .. } => { + [ + metadata.local_rect.size.width / stretch_size.width, + metadata.local_rect.size.height / stretch_size.height, + 0.0, + 0.0, + ] + } + _ => { + [1.0, 1.0, 0.0, 0.0] + } + }; + match brush.segment_desc { Some(ref segment_desc) => { for segment in &segment_desc.segments { // has to match VECS_PER_SEGMENT - request.write_segment(segment.local_rect); + request.write_segment(segment.local_rect, repeat); } } None => { - request.write_segment(metadata.local_rect); + request.write_segment(metadata.local_rect, repeat); } } } @@ -2462,13 +2478,9 @@ impl<'a> GpuDataRequest<'a> { fn write_segment( &mut self, local_rect: LayoutRect, + extra_params: [f32; 4], ) { self.push(local_rect); - self.push([ - 1.0, - 1.0, - 0.0, - 0.0 - ]); + self.push(extra_params); } } From ab991d898188f5bbbe8f7dac6d2d43421a3936be Mon Sep 17 00:00:00 2001 From: Nicolas Silva Date: Wed, 11 Apr 2018 15:37:01 +0200 Subject: [PATCH 2/4] Repeat radial gradients in the brush shader when there is no spacing. --- webrender/res/brush_radial_gradient.glsl | 2 - webrender/src/display_list_flattener.rs | 70 +++++++++++++----------- webrender/src/prim_store.rs | 4 +- 3 files changed, 42 insertions(+), 34 deletions(-) diff --git a/webrender/res/brush_radial_gradient.glsl b/webrender/res/brush_radial_gradient.glsl index 62c7a99633..fdc58b8786 100644 --- a/webrender/res/brush_radial_gradient.glsl +++ b/webrender/res/brush_radial_gradient.glsl @@ -58,8 +58,6 @@ void brush_vs( vRepeatedSize = local_rect.size / tile_repeat.xy; vRepeatedSize.y *= ratio_xy; - vPos; - vGradientAddress = user_data.x; // Whether to repeat the gradient instead of clamping. diff --git a/webrender/src/display_list_flattener.rs b/webrender/src/display_list_flattener.rs index 5de56c9b75..97b1370ebd 100644 --- a/webrender/src/display_list_flattener.rs +++ b/webrender/src/display_list_flattener.rs @@ -1947,6 +1947,7 @@ impl<'a> DisplayListFlattener<'a> { stops: ItemRange, extend_mode: ExtendMode, gradient_index: CachedGradientIndex, + stretch_size: LayoutSize, ) { let prim = BrushPrimitive::new( BrushKind::RadialGradient { @@ -1957,6 +1958,7 @@ impl<'a> DisplayListFlattener<'a> { end_radius, ratio_xy, gradient_index, + stretch_size, }, None, ); @@ -1979,45 +1981,51 @@ impl<'a> DisplayListFlattener<'a> { ratio_xy: f32, stops: ItemRange, extend_mode: ExtendMode, - tile_size: LayoutSize, + stretch_size: LayoutSize, tile_spacing: LayoutSize, ) { let gradient_index = CachedGradientIndex(self.cached_gradients.len()); self.cached_gradients.push(CachedGradient::new()); - let prim_infos = info.decompose( - tile_size, - tile_spacing, - 64 * 64, - ); - - if prim_infos.is_empty() { - self.add_radial_gradient_impl( - clip_and_scroll, - info, - center, - start_radius, - end_radius, - ratio_xy, - stops, - extend_mode, - gradient_index, + if tile_spacing != LayoutSize::zero() { + let prim_infos = info.decompose( + stretch_size, + tile_spacing, + 64 * 64, ); - } else { - for prim_info in prim_infos { - self.add_radial_gradient_impl( - clip_and_scroll, - &prim_info, - center, - start_radius, - end_radius, - ratio_xy, - stops, - extend_mode, - gradient_index, - ); + + if !prim_infos.is_empty() { + for prim_info in prim_infos { + self.add_radial_gradient_impl( + clip_and_scroll, + &prim_info, + center, + start_radius, + end_radius, + ratio_xy, + stops, + extend_mode, + gradient_index, + stretch_size, + ); + } + + return; } } + + self.add_radial_gradient_impl( + clip_and_scroll, + info, + center, + start_radius, + end_radius, + ratio_xy, + stops, + extend_mode, + gradient_index, + stretch_size, + ); } pub fn add_text( diff --git a/webrender/src/prim_store.rs b/webrender/src/prim_store.rs index a6b77e2d0e..ee36c4e20d 100644 --- a/webrender/src/prim_store.rs +++ b/webrender/src/prim_store.rs @@ -276,6 +276,7 @@ pub enum BrushKind { start_radius: f32, end_radius: f32, ratio_xy: f32, + stretch_size: LayoutSize, }, LinearGradient { gradient_index: CachedGradientIndex, @@ -1687,7 +1688,8 @@ impl PrimitiveStore { brush.write_gpu_blocks(&mut request); let repeat = match brush.kind { - BrushKind::LinearGradient { stretch_size, .. } => { + BrushKind::LinearGradient { stretch_size, .. } | + BrushKind::RadialGradient { stretch_size, .. } => { [ metadata.local_rect.size.width / stretch_size.width, metadata.local_rect.size.height / stretch_size.height, From 445e7a0c7e2ac0c08f09beb4ad46ec32dafb5618 Mon Sep 17 00:00:00 2001 From: Nicolas Silva Date: Wed, 11 Apr 2018 16:35:11 +0200 Subject: [PATCH 3/4] Repeat images in the brush shader when there is no spacing. --- webrender/src/display_list_flattener.rs | 1 - webrender/src/prim_store.rs | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/webrender/src/display_list_flattener.rs b/webrender/src/display_list_flattener.rs index 97b1370ebd..e669cd75e6 100644 --- a/webrender/src/display_list_flattener.rs +++ b/webrender/src/display_list_flattener.rs @@ -2153,7 +2153,6 @@ impl<'a> DisplayListFlattener<'a> { // See if conditions are met to run through the new // image brush shader, which supports segments. if tile_spacing == LayoutSize::zero() && - stretch_size == info.rect.size && tile_offset.is_none() { let prim = BrushPrimitive::new( BrushKind::Image { diff --git a/webrender/src/prim_store.rs b/webrender/src/prim_store.rs index ee36c4e20d..1a5b65d8e7 100644 --- a/webrender/src/prim_store.rs +++ b/webrender/src/prim_store.rs @@ -1688,6 +1688,7 @@ impl PrimitiveStore { brush.write_gpu_blocks(&mut request); let repeat = match brush.kind { + BrushKind::Image { stretch_size, .. } | BrushKind::LinearGradient { stretch_size, .. } | BrushKind::RadialGradient { stretch_size, .. } => { [ From b92439c8d2e340b77db185ef986b73fd980e8bfa Mon Sep 17 00:00:00 2001 From: Nicolas Silva Date: Fri, 13 Apr 2018 13:35:19 +0200 Subject: [PATCH 4/4] Update reftest reference. --- wrench/reftests/filters/blend-clipped.png | Bin 2845 -> 7041 bytes wrench/reftests/image/reftest.list | 2 +- wrench/reftests/transforms/local-clip.png | Bin 2192 -> 2138 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/wrench/reftests/filters/blend-clipped.png b/wrench/reftests/filters/blend-clipped.png index 245adf353b7e80d1986c507460fdd4befbdf732b..ddf9b920b73ed1685e2ba050f6b2343f8089441c 100644 GIT binary patch literal 7041 zcmeHM4{Q_X70<-9bacTQs10ia*2HL7I~qn7f<^2b6;%k(m=UUI)yP5CHYLQE)?J;% z_FdJCW?2CbqSb^1A7vU2bdAYK97y8aSV%n-CoXb=Lk{~0COH!0*va`1=li$2s%cBL zNm~JRlYDyq?&-VlpWgeuKi_lR*24U>`A^JGNl8g7*tlU^O3Jr~1pdM!-x1mys?wz? zDNk-J*sy+kWmE9_HLEr7l8O51wx{=Rd*|@UwiO#IHhuSpn}$pF)YQ$tw4yVud4=uD zNXE#{((M}#me$B)ndZfkiq_teiUoOLXFG+wAHQoSpK#5-n)NH|$-^=LnLO$t4NH|1 zYxU>WxTJ?Ng-ug#ESg!LCNg`&$#+r?NgOO zj15N_4&<~_1pvtHjJ8}FbVqiN`l1TJ9czhG4K}UaZk>l_ zwqRX8qU^sK%6nz@Eit<{r*?8%}uf zwJ^HGjPvjD6TQ^dwcz|R=h*mrV=tFuHkI;}O@+liXK^nWU4(`w)y$Ojxbhe3T1RR- zMGTn!PB{kq`fRFo!su2Nc1VT2RYBJWC6Ftt3B{L^>w~nSN%F1{ZkpSAO7aSPv6#V? z@N71qDO4MUl>&%~yU?nl&)!RqDnj`RwpLA38mKD|<H@QB zXBO(XYS{tP2Hi02xHO>zT~#WZC5 zN(6*}PC&=C8(}uTv*#z=+tr9@O_`#ME{n#tS~Rn-+2zyoCtdtuCC_Oge-pk}kV*j0 z<72XJW+C)*LiI*$y8DGe-|>#i*Sg3xGM(1cyLHD~)!1ZTr>;MzO%6(m;G08% zp*nG6UC(X~=w<~+t>N|D1u;ts zFL~9~m*G1a^wJN9Wm9|La4P!B$6b>YOP#oC>MORXr1ube=#G`21QQW2KAWSd&XuEa zOAG&8a2ZW!g-NiW{pR8E$~UJ>{f{;%>5%^FdVIk=a+;6y&2uWY&9sI zxWOLw(1}&4A!E1CQ!A^4?|15$#tw7F#P^l_42D(}hFXZYkWfSe8&R{jP3!i(pvw&= znfnm}VurjP234W~f;}L!cbRdzh`-%SP=D@bHno5Q{rpo`g+%BJ;``Y}J>h(SeNRn4 zuOav9AXw2X=SaH=AAHiLa*d^7HX{743e!~f+Jds~U05u`cQ)8zfMXK&_p%wm447J} z!lfq0KRh;PEK|f(F?=l@V54|Ajg-}Ws%HI8A;FN&+3K)sSi*hMF^G3pLLntnlgsB0 z4W>J!pHP0osP8!7vjn{lmL*>g;dlQCazgfb&EvHEs3cF(JP;~}WS(?~GfyX)LJoOH zMES7u93f!8INN0wEn?u|eMADRm_o|gT0Fj)*dS=D1rCq-O*!bw&jn?Sbudjmb;_n&dAOVq_&5usK*Xc zEA7nHl4~}@$d@UGwc>mM?{R~46knBT69Qp;q9bxoFoa@8=Gc#s{zgf;7*O|7%R#ot z%!PB|>O%dqE+p}5INnQej#jtCVw0!pggenaZEXj{pO=y-z|v~|eX8P;qY6@s;F+G0 zl7@_s&kpDP>xM7uhGRxcWu3axfB+qii;L`FFx7 z9l2fwl^L`CkVNH!h+-y)my)2xuuxF*GMHG#?|+GJ{G|XfmH5MKnMHyN7g<_$9Uv_5 zq#NYgLH-i#^$QpD#Kh)X%C*x+XiV$$?4n{9l4X zsl@pmD8x-1%9VgeM(ANM ww@i@lzAa+e`fcUkQgcK-pTGD&`W^%3sh3*jKh7eh;yDYRFWk`b+|GCY37!A2ZvX%Q literal 2845 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 RVq_8C3_`H3g`Z^+?OzJ+Q&Io` literal 2192 zcmeH}?@ts*7{?d0#W^d@%$<-0FXncaJ7SgS6;icImCZ05R>T@at)w1Dtk5&wU5)lk z73s3&=In)fR#Ss#QtS_2NXS*AX#CY}7u(RFRbnxzO^G2A0>yh_!8QatOUfV7lo$Kv z`F=mo^UXY)osDkVSeh{}XCB9K8D$>4nd8#VvL^}BS!E=%<~hfKt!22lGMxD1z8<>& z4p&n1)fWqjvrp(b!ln8C=B(}a*7I8+zzaj4++4JQgGk~wEBw0k zl=D~+w^*FxaANLD4K$vBX~(Ry;_M;(C*Oqd?TIISPyZY#Jp3#bY|IB}vd7*w@uYqD z*RJ}%pS>CL$_ig`(BAfupu05CFkY!;`S^1-DLi@wfDjKm#isCG4_w5 zwr=~`Ri1AH7Sx~IZGy`roY;xXwyZW(Me0P7S}H!eM(EE=IYHuu!MRurWdh|#VXgpFS#W3uEP6mayU~|^AjT3M;|-%TN=3Z zUbE0Ewl?t#twv$|!4EC>xB5L!I_8&uZq`f@CBy%lV?(Tm@@@bd|C;$Doe(WHZHug9~;r zMree3yn|JIP~l525a#(1Ap6}SHX&Wc!OAYv#IX2v7mVg1 zCR0X_I1St$46z1HP+ED~Ndmtgg%QW>&G7%a9;eb@sT!^yKey`}_NT#>m2AYFidX#y DK6PqH