Skip to content

Commit 7c4162c

Browse files
author
bors-servo
authored
Auto merge of #3384 - gw3583:local-seg, r=kvark
Switch segments to be defined relative to the local primitive position. <!-- Reviewable:start --> This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/webrender/3384) <!-- Reviewable:end -->
2 parents 6887ae3 + 46700de commit 7c4162c

18 files changed

+440
-274
lines changed

webrender/res/brush.glsl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ void main(void) {
4949

5050
vec4[2] segment_info = fetch_from_gpu_cache_2(segment_address);
5151
segment_rect = RectWithSize(segment_info[0].xy, segment_info[0].zw);
52+
segment_rect.p0 += ph.local_rect.p0;
5253
segment_data = segment_info[1];
5354
}
5455

webrender/res/clip_shared.glsl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ in int aClipTransformId;
1717
in int aPrimTransformId;
1818
in int aClipSegment;
1919
in ivec4 aClipDataResourceAddress;
20+
in vec2 aClipLocalPos;
21+
in vec4 aClipTileRect;
2022

2123
struct ClipMaskInstance {
2224
int render_task_address;
@@ -25,6 +27,8 @@ struct ClipMaskInstance {
2527
int segment;
2628
ivec2 clip_data_address;
2729
ivec2 resource_address;
30+
vec2 local_pos;
31+
RectWithSize tile_rect;
2832
};
2933

3034
ClipMaskInstance fetch_clip_item() {
@@ -36,6 +40,8 @@ ClipMaskInstance fetch_clip_item() {
3640
cmi.segment = aClipSegment;
3741
cmi.clip_data_address = aClipDataResourceAddress.xy;
3842
cmi.resource_address = aClipDataResourceAddress.zw;
43+
cmi.local_pos = aClipLocalPos;
44+
cmi.tile_rect = RectWithSize(aClipTileRect.xy, aClipTileRect.zw);
3945

4046
return cmi;
4147
}

webrender/res/cs_clip_box_shadow.glsl

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,11 @@ void main(void) {
4646
BoxShadowData bs_data = fetch_data(cmi.clip_data_address);
4747
ImageResource res = fetch_image_resource_direct(cmi.resource_address);
4848

49+
RectWithSize dest_rect = bs_data.dest_rect;
50+
dest_rect.p0 += cmi.local_pos;
51+
4952
ClipVertexInfo vi = write_clip_tile_vertex(
50-
bs_data.dest_rect,
53+
dest_rect,
5154
prim_transform,
5255
clip_transform,
5356
area
@@ -65,29 +68,29 @@ void main(void) {
6568
switch (bs_data.stretch_mode_x) {
6669
case MODE_STRETCH: {
6770
vEdge.x = 0.5;
68-
vEdge.z = (bs_data.dest_rect.size.x / bs_data.src_rect_size.x) - 0.5;
69-
vUv.x = (local_pos.x - bs_data.dest_rect.p0.x) / bs_data.src_rect_size.x;
71+
vEdge.z = (dest_rect.size.x / bs_data.src_rect_size.x) - 0.5;
72+
vUv.x = (local_pos.x - dest_rect.p0.x) / bs_data.src_rect_size.x;
7073
break;
7174
}
7275
case MODE_SIMPLE:
7376
default: {
7477
vEdge.xz = vec2(1.0);
75-
vUv.x = (local_pos.x - bs_data.dest_rect.p0.x) / bs_data.dest_rect.size.x;
78+
vUv.x = (local_pos.x - dest_rect.p0.x) / dest_rect.size.x;
7679
break;
7780
}
7881
}
7982

8083
switch (bs_data.stretch_mode_y) {
8184
case MODE_STRETCH: {
8285
vEdge.y = 0.5;
83-
vEdge.w = (bs_data.dest_rect.size.y / bs_data.src_rect_size.y) - 0.5;
84-
vUv.y = (local_pos.y - bs_data.dest_rect.p0.y) / bs_data.src_rect_size.y;
86+
vEdge.w = (dest_rect.size.y / bs_data.src_rect_size.y) - 0.5;
87+
vUv.y = (local_pos.y - dest_rect.p0.y) / bs_data.src_rect_size.y;
8588
break;
8689
}
8790
case MODE_SIMPLE:
8891
default: {
8992
vEdge.yw = vec2(1.0);
90-
vUv.y = (local_pos.y - bs_data.dest_rect.p0.y) / bs_data.dest_rect.size.y;
93+
vUv.y = (local_pos.y - dest_rect.p0.y) / dest_rect.size.y;
9194
break;
9295
}
9396
}

webrender/res/cs_clip_image.glsl

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,12 @@ flat varying float vLayer;
1313

1414
#ifdef WR_VERTEX_SHADER
1515
struct ImageMaskData {
16-
RectWithSize local_mask_rect;
17-
RectWithSize local_tile_rect;
16+
vec2 local_mask_size;
1817
};
1918

2019
ImageMaskData fetch_mask_data(ivec2 address) {
21-
vec4 data[2] = fetch_from_gpu_cache_2_direct(address);
22-
RectWithSize mask_rect = RectWithSize(data[0].xy, data[0].zw);
23-
RectWithSize tile_rect = RectWithSize(data[1].xy, data[1].zw);
24-
ImageMaskData mask_data = ImageMaskData(mask_rect, tile_rect);
20+
vec4 data = fetch_from_gpu_cache_1_direct(address);
21+
ImageMaskData mask_data = ImageMaskData(data.xy);
2522
return mask_data;
2623
}
2724

@@ -31,7 +28,7 @@ void main(void) {
3128
Transform clip_transform = fetch_transform(cmi.clip_transform_id);
3229
Transform prim_transform = fetch_transform(cmi.prim_transform_id);
3330
ImageMaskData mask = fetch_mask_data(cmi.clip_data_address);
34-
RectWithSize local_rect = mask.local_mask_rect;
31+
RectWithSize local_rect = RectWithSize(cmi.local_pos, mask.local_mask_size);
3532
ImageResource res = fetch_image_resource_direct(cmi.resource_address);
3633

3734
ClipVertexInfo vi = write_clip_tile_vertex(
@@ -42,7 +39,7 @@ void main(void) {
4239
);
4340
vLocalPos = vi.local_pos.xy / vi.local_pos.z;
4441
vLayer = res.layer;
45-
vClipMaskImageUv = (vLocalPos - mask.local_tile_rect.p0) / mask.local_tile_rect.size;
42+
vClipMaskImageUv = (vLocalPos - cmi.tile_rect.p0) / cmi.tile_rect.size;
4643
vec2 texture_size = vec2(textureSize(sColor0, 0));
4744
vClipMaskUvRect = vec4(res.uv_rect.p0, res.uv_rect.p1 - res.uv_rect.p0) / texture_size.xyxy;
4845
// applying a half-texel offset to the UV boundaries to prevent linear samples from the outside

webrender/res/cs_clip_rectangle.glsl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@ void main(void) {
6363
Transform clip_transform = fetch_transform(cmi.clip_transform_id);
6464
Transform prim_transform = fetch_transform(cmi.prim_transform_id);
6565
ClipData clip = fetch_clip(cmi.clip_data_address);
66+
6667
RectWithSize local_rect = clip.rect.rect;
68+
local_rect.p0 = cmi.local_pos;
6769

6870
ClipVertexInfo vi = write_clip_tile_vertex(
6971
local_rect,

webrender/src/batch.rs

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1971,7 +1971,7 @@ impl AlphaBatchBuilder {
19711971
let base_instance = BrushInstance {
19721972
prim_header_index,
19731973
clip_task_address,
1974-
segment_index: 0,
1974+
segment_index: INVALID_SEGMENT_INDEX,
19751975
edge_flags,
19761976
brush_flags: BrushFlags::PERSPECTIVE_INTERPOLATION,
19771977
user_data: uv_rect_address.as_int(),
@@ -2188,7 +2188,7 @@ fn add_gradient_tiles(
21882188
BrushInstance {
21892189
prim_header_index,
21902190
clip_task_address,
2191-
segment_index: 0,
2191+
segment_index: INVALID_SEGMENT_INDEX,
21922192
edge_flags: EdgeAaSegmentMask::all(),
21932193
brush_flags: BrushFlags::PERSPECTIVE_INTERPOLATION,
21942194
user_data: 0,
@@ -2442,6 +2442,7 @@ impl ClipBatcher {
24422442
&mut self,
24432443
task_address: RenderTaskAddress,
24442444
clip_data_address: GpuCacheAddress,
2445+
local_pos: LayoutPoint,
24452446
) {
24462447
let instance = ClipMaskInstance {
24472448
render_task_address: task_address,
@@ -2450,6 +2451,8 @@ impl ClipBatcher {
24502451
segment: 0,
24512452
clip_data_address,
24522453
resource_address: GpuCacheAddress::invalid(),
2454+
local_pos,
2455+
tile_rect: LayoutRect::zero(),
24532456
};
24542457

24552458
self.rectangles.push(instance);
@@ -2490,21 +2493,27 @@ impl ClipBatcher {
24902493
segment: 0,
24912494
clip_data_address: GpuCacheAddress::invalid(),
24922495
resource_address: GpuCacheAddress::invalid(),
2496+
local_pos: clip_instance.local_pos,
2497+
tile_rect: LayoutRect::zero(),
24932498
};
24942499

24952500
match clip_node.item {
2496-
ClipItem::Image { ref mask, ref visible_tiles } => {
2501+
ClipItem::Image { image, size, .. } => {
24972502
let request = ImageRequest {
2498-
key: mask.image,
2503+
key: image,
24992504
rendering: ImageRendering::Auto,
25002505
tile: None,
25012506
};
2502-
let mut add_image = |request: ImageRequest, clip_data_address: GpuCacheAddress| {
2507+
2508+
let clip_data_address =
2509+
gpu_cache.get_address(&clip_node.gpu_cache_handle);
2510+
2511+
let mut add_image = |request: ImageRequest, local_tile_rect: LayoutRect| {
25032512
let cache_item = match resource_cache.get_cached_image(request) {
25042513
Ok(item) => item,
25052514
Err(..) => {
25062515
warn!("Warnings: skip a image mask");
2507-
debug!("Mask: {:?}, request: {:?}", mask, request);
2516+
debug!("request: {:?}", request);
25082517
return;
25092518
}
25102519
};
@@ -2514,23 +2523,23 @@ impl ClipBatcher {
25142523
.push(ClipMaskInstance {
25152524
clip_data_address,
25162525
resource_address: gpu_cache.get_address(&cache_item.uv_rect_handle),
2526+
tile_rect: local_tile_rect,
25172527
..instance
25182528
});
25192529
};
25202530

2521-
match *visible_tiles {
2531+
match clip_instance.visible_tiles {
25222532
Some(ref tiles) => {
25232533
for tile in tiles {
25242534
add_image(
25252535
request.with_tile(tile.tile_offset),
2526-
gpu_cache.get_address(&tile.handle),
2536+
tile.tile_rect,
25272537
)
25282538
}
25292539
}
25302540
None => {
2531-
let gpu_address =
2532-
gpu_cache.get_address(&clip_node.gpu_cache_handle);
2533-
add_image(request, gpu_address)
2541+
let mask_rect = LayoutRect::new(clip_instance.local_pos, size);
2542+
add_image(request, mask_rect)
25342543
}
25352544
}
25362545
}

webrender/src/border.rs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ pub struct BorderSegmentCacheKey {
171171

172172
pub fn ensure_no_corner_overlap(
173173
radius: &mut BorderRadius,
174-
rect: &LayoutRect,
174+
size: LayoutSize,
175175
) {
176176
let mut ratio = 1.0;
177177
let top_left_radius = &mut radius.top_left;
@@ -180,23 +180,23 @@ pub fn ensure_no_corner_overlap(
180180
let bottom_left_radius = &mut radius.bottom_left;
181181

182182
let sum = top_left_radius.width + top_right_radius.width;
183-
if rect.size.width < sum {
184-
ratio = f32::min(ratio, rect.size.width / sum);
183+
if size.width < sum {
184+
ratio = f32::min(ratio, size.width / sum);
185185
}
186186

187187
let sum = bottom_left_radius.width + bottom_right_radius.width;
188-
if rect.size.width < sum {
189-
ratio = f32::min(ratio, rect.size.width / sum);
188+
if size.width < sum {
189+
ratio = f32::min(ratio, size.width / sum);
190190
}
191191

192192
let sum = top_left_radius.height + bottom_left_radius.height;
193-
if rect.size.height < sum {
194-
ratio = f32::min(ratio, rect.size.height / sum);
193+
if size.height < sum {
194+
ratio = f32::min(ratio, size.height / sum);
195195
}
196196

197197
let sum = top_right_radius.height + bottom_right_radius.height;
198-
if rect.size.height < sum {
199-
ratio = f32::min(ratio, rect.size.height / sum);
198+
if size.height < sum {
199+
ratio = f32::min(ratio, size.height / sum);
200200
}
201201

202202
if ratio < 1. {
@@ -223,7 +223,7 @@ impl<'a> DisplayListFlattener<'a> {
223223
clip_and_scroll: ScrollNodeAndClipChain,
224224
) {
225225
let mut border = *border;
226-
ensure_no_corner_overlap(&mut border.radius, &info.rect);
226+
ensure_no_corner_overlap(&mut border.radius, info.rect.size);
227227

228228
self.add_primitive(
229229
clip_and_scroll,
@@ -649,12 +649,17 @@ fn get_edge_info(
649649
/// Create the set of border segments and render task
650650
/// cache keys for a given CSS border.
651651
pub fn create_border_segments(
652-
rect: &LayoutRect,
652+
size: LayoutSize,
653653
border: &NormalBorder,
654654
widths: &LayoutSideOffsets,
655655
border_segments: &mut Vec<BorderSegmentInfo>,
656656
brush_segments: &mut Vec<BrushSegment>,
657657
) {
658+
let rect = LayoutRect::new(
659+
LayoutPoint::zero(),
660+
size,
661+
);
662+
658663
let local_size_tl = LayoutSize::new(
659664
border.radius.top_left.width.max(widths.left),
660665
border.radius.top_left.height.max(widths.top),
@@ -1143,8 +1148,13 @@ pub fn build_border_instances(
11431148
impl NinePatchDescriptor {
11441149
pub fn create_segments(
11451150
&self,
1146-
rect: &LayoutRect,
1151+
size: LayoutSize,
11471152
) -> Vec<BrushSegment> {
1153+
let rect = LayoutRect::new(
1154+
LayoutPoint::zero(),
1155+
size,
1156+
);
1157+
11481158
// Calculate the modified rect as specific by border-image-outset
11491159
let origin = LayoutPoint::new(
11501160
rect.origin.x - self.outset.left,

0 commit comments

Comments
 (0)