Skip to content

Commit

Permalink
Auto merge of #1339 - glennw:revert-snap-rect, r=kvark
Browse files Browse the repository at this point in the history
Revert the snap rect changes.

I tried several fixes to avoid having to revert this - but it's causing all kinds of weird machine-specific failures on the CI machines.

It's also blocking us updating several Servo dependencies at the moment, which are blocked on the WR update for euclid, heapsize etc.

We can revisit this after we unblock and land the next WR update.

<!-- 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/1339)
<!-- Reviewable:end -->
  • Loading branch information
bors-servo committed Jun 5, 2017
2 parents 4f1eadb + 9143f1d commit b2614e4
Show file tree
Hide file tree
Showing 19 changed files with 61 additions and 117 deletions.
91 changes: 36 additions & 55 deletions webrender/res/prim_shared.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -80,16 +80,18 @@ vec2 clamp_rect(vec2 point, RectWithSize rect) {
return clamp(point, rect.p0, rect.p0 + rect.size);
}

RectWithEndpoint intersect_rect(RectWithEndpoint a, RectWithEndpoint b) {
vec2 p0 = clamp(a.p0, b.p0, b.p1);
vec2 p1 = clamp(a.p1, b.p0, b.p1);
return RectWithEndpoint(p0, max(p0, p1));
vec2 clamp_rect(vec2 point, RectWithEndpoint rect) {
return clamp(point, rect.p0, rect.p1);
}

// Clamp 2 points at once.
vec4 clamp_rect(vec4 points, RectWithSize rect) {
return clamp(points, rect.p0.xyxy, rect.p0.xyxy + rect.size.xyxy);
}

RectWithSize intersect_rect(RectWithSize a, RectWithSize b) {
RectWithEndpoint r = intersect_rect(to_rect_with_endpoint(a),
to_rect_with_endpoint(b));
return to_rect_with_size(r);
vec4 p = clamp_rect(vec4(a.p0, a.p0 + a.size), b);
return RectWithSize(p.xy, max(vec2(0.0), p.zw - p.xy));
}

float distance_to_line(vec2 p0, vec2 perp_dir, vec2 p) {
Expand Down Expand Up @@ -576,35 +578,6 @@ vec4 get_layer_pos(vec2 pos, Layer layer) {
return untransform(pos, n, a, layer.inv_transform);
}

// Compute a snapping offset in world space (adjusted to pixel ratio),
// given local position on the layer and a snap rectangle.
vec2 compute_snap_offset(vec2 local_pos,
RectWithSize local_clip_rect,
Layer layer,
RectWithSize snap_rect) {
// Ensure that the snap rect is at *least* one device pixel in size.
// TODO(gw): It's not clear to me that this is "correct". Specifically,
// how should it interact with sub-pixel snap rects when there
// is a layer transform with scale present? But it does fix
// the test cases we have in Servo that are failing without it
// and seem better than not having this at all.
snap_rect.size = max(snap_rect.size, vec2(1.0 / uDevicePixelRatio));

// Transform the snap corners to the world space.
vec4 world_snap_p0 = layer.transform * vec4(snap_rect.p0, 0.0, 1.0);
vec4 world_snap_p1 = layer.transform * vec4(snap_rect.p0 + snap_rect.size, 0.0, 1.0);
// Snap bounds in world coordinates, adjusted for pixel ratio. XY = top left, ZW = bottom right
vec4 world_snap = uDevicePixelRatio * vec4(world_snap_p0.xy, world_snap_p1.xy) /
vec4(world_snap_p0.ww, world_snap_p1.ww);
/// World offsets applied to the corners of the snap rectangle.
vec4 snap_offsets = floor(world_snap + 0.5) - world_snap;

/// Compute the position of this vertex inside the snap rectangle.
vec2 normalized_snap_pos = (local_pos - snap_rect.p0) / snap_rect.size;
/// Compute the actual world offset for this vertex needed to make it snap.
return mix(snap_offsets.xy, snap_offsets.zw, normalized_snap_pos);
}

struct VertexInfo {
vec2 local_pos;
vec2 screen_pos;
Expand All @@ -615,32 +588,38 @@ VertexInfo write_vertex(RectWithSize instance_rect,
float z,
Layer layer,
AlphaBatchTask task,
RectWithSize snap_rect) {

vec2 snap_ref) {
// Select the corner of the local rect that we are processing.
vec2 local_pos = instance_rect.p0 + instance_rect.size * aPosition.xy;

// xy = top left corner of the local rect, zw = position of current vertex.
vec4 local_p0_pos = vec4(snap_ref, local_pos);

// Clamp to the two local clip rects.
vec2 clamped_local_pos = clamp_rect(clamp_rect(local_pos, local_clip_rect),
layer.local_clip_rect);
local_p0_pos = clamp_rect(local_p0_pos, local_clip_rect);
local_p0_pos = clamp_rect(local_p0_pos, layer.local_clip_rect);

/// Compute the snapping offset.
vec2 snap_offset = compute_snap_offset(clamped_local_pos, local_clip_rect, layer, snap_rect);
// Transform the top corner and current vertex to world space.
vec4 world_p0 = layer.transform * vec4(local_p0_pos.xy, 0.0, 1.0);
world_p0.xyz /= world_p0.w;
vec4 world_pos = layer.transform * vec4(local_p0_pos.zw, 0.0, 1.0);
world_pos.xyz /= world_pos.w;

// Transform the current vertex to the world cpace.
vec4 world_pos = layer.transform * vec4(clamped_local_pos, 0.0, 1.0);
// Convert the world positions to device pixel space. xy=top left corner. zw=current vertex.
vec4 device_p0_pos = vec4(world_p0.xy, world_pos.xy) * uDevicePixelRatio;

// Convert the world positions to device pixel space.
vec2 device_pos = world_pos.xy / world_pos.w * uDevicePixelRatio;
// Calculate the distance to snap the vertex by (snap top left corner).
vec2 snap_delta = device_p0_pos.xy - floor(device_p0_pos.xy + 0.5);

// Apply offsets for the render task to get correct screen location.
vec2 final_pos = device_pos + snap_offset -
vec2 final_pos = device_p0_pos.zw -
snap_delta -
task.screen_space_origin +
task.render_target_origin;

gl_Position = uTransform * vec4(final_pos, z, 1.0);

VertexInfo vi = VertexInfo(clamped_local_pos, device_pos);
VertexInfo vi = VertexInfo(local_p0_pos.zw, device_p0_pos.zw);
return vi;
}

Expand Down Expand Up @@ -675,7 +654,7 @@ TransformVertexInfo write_transform_vertex(RectWithSize instance_rect,
float z,
Layer layer,
AlphaBatchTask task,
RectWithSize snap_rect) {
vec2 snap_ref) {
RectWithEndpoint local_rect = to_rect_with_endpoint(instance_rect);

vec2 current_local_pos, prev_local_pos, next_local_pos;
Expand Down Expand Up @@ -734,21 +713,23 @@ TransformVertexInfo write_transform_vertex(RectWithSize instance_rect,
adjusted_next_p0,
adjusted_next_p1);

vec4 layer_pos = get_layer_pos(device_pos / uDevicePixelRatio, layer);

/// Compute the snapping offset.
vec2 snap_offset = compute_snap_offset(layer_pos.xy / layer_pos.w,
local_clip_rect, layer, snap_rect);
// Calculate the snap amount based on the first vertex as a reference point.
vec4 world_p0 = layer.transform * vec4(snap_ref, 0.0, 1.0);
vec2 device_p0 = uDevicePixelRatio * world_p0.xy / world_p0.w;
vec2 snap_delta = device_p0 - floor(device_p0 + 0.5);

// Apply offsets for the render task to get correct screen location.
vec2 final_pos = device_pos + snap_offset -
vec2 final_pos = device_pos -
snap_delta -
task.screen_space_origin +
task.render_target_origin;

gl_Position = uTransform * vec4(final_pos, z, 1.0);

vLocalBounds = vec4(local_rect.p0, local_rect.p1);

vec4 layer_pos = get_layer_pos(device_pos / uDevicePixelRatio, layer);

return TransformVertexInfo(layer_pos.xyw, device_pos);
}

Expand Down
2 changes: 1 addition & 1 deletion webrender/res/ps_angle_gradient.vs.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ void main(void) {
prim.z,
prim.layer,
prim.task,
prim.local_rect);
prim.local_rect.p0);

vPos = vi.local_pos - prim.local_rect.p0;

Expand Down
4 changes: 2 additions & 2 deletions webrender/res/ps_border_corner.vs.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -271,14 +271,14 @@ void main(void) {
prim.z,
prim.layer,
prim.task,
prim.local_rect);
prim.local_rect.p0);
#else
VertexInfo vi = write_vertex(segment_rect,
prim.local_clip_rect,
prim.z,
prim.layer,
prim.task,
prim.local_rect);
prim.local_rect.p0);
#endif

vLocalPos = vi.local_pos;
Expand Down
4 changes: 2 additions & 2 deletions webrender/res/ps_border_edge.vs.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -184,14 +184,14 @@ void main(void) {
prim.z,
prim.layer,
prim.task,
prim.local_rect);
prim.local_rect.p0);
#else
VertexInfo vi = write_vertex(segment_rect,
prim.local_clip_rect,
prim.z,
prim.layer,
prim.task,
prim.local_rect);
prim.local_rect.p0);
#endif

vLocalPos = vi.local_pos;
Expand Down
2 changes: 1 addition & 1 deletion webrender/res/ps_box_shadow.vs.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ void main(void) {
prim.z,
prim.layer,
prim.task,
prim.local_rect);
prim.local_rect.p0);

RenderTaskData child_task = fetch_render_task(prim.user_data1);
vUv.z = child_task.data1.x;
Expand Down
2 changes: 1 addition & 1 deletion webrender/res/ps_cache_image.vs.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ void main(void) {
prim.z,
prim.layer,
prim.task,
prim.local_rect);
prim.local_rect.p0);

RenderTaskData child_task = fetch_render_task(prim.user_data1);
vUv.z = child_task.data1.x;
Expand Down
4 changes: 2 additions & 2 deletions webrender/res/ps_gradient.vs.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ void main(void) {
prim.z,
prim.layer,
prim.task,
prim.local_rect);
prim.local_rect.p0);
vLocalPos = vi.local_pos;
vec2 f = (vi.local_pos.xy - prim.local_rect.p0) / prim.local_rect.size;
#else
Expand All @@ -71,7 +71,7 @@ void main(void) {
prim.z,
prim.layer,
prim.task,
prim.local_rect);
prim.local_rect.p0);

vec2 f = (vi.local_pos - segment_rect.p0) / segment_rect.size;
vPos = vi.local_pos;
Expand Down
4 changes: 2 additions & 2 deletions webrender/res/ps_image.vs.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ void main(void) {
prim.z,
prim.layer,
prim.task,
prim.local_rect);
prim.local_rect.p0);
vLocalPos = vi.local_pos;
#else
VertexInfo vi = write_vertex(prim.local_rect,
prim.local_clip_rect,
prim.z,
prim.layer,
prim.task,
prim.local_rect);
prim.local_rect.p0);
vLocalPos = vi.local_pos - prim.local_rect.p0;
#endif

Expand Down
2 changes: 1 addition & 1 deletion webrender/res/ps_radial_gradient.vs.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ void main(void) {
prim.z,
prim.layer,
prim.task,
prim.local_rect);
prim.local_rect.p0);

vPos = vi.local_pos - prim.local_rect.p0;

Expand Down
4 changes: 2 additions & 2 deletions webrender/res/ps_rectangle.vs.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ void main(void) {
prim.z,
prim.layer,
prim.task,
prim.local_rect);
prim.local_rect.p0);
vLocalPos = vi.local_pos;
#else
VertexInfo vi = write_vertex(prim.local_rect,
prim.local_clip_rect,
prim.z,
prim.layer,
prim.task,
prim.local_rect);
prim.local_rect.p0);
#endif

#ifdef WR_FEATURE_CLIP
Expand Down
4 changes: 2 additions & 2 deletions webrender/res/ps_text_run.vs.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ void main(void) {
prim.z,
prim.layer,
prim.task,
local_rect);
local_rect.p0);
vLocalPos = vi.local_pos;
vec2 f = (vi.local_pos.xy / vi.local_pos.z - local_rect.p0) / local_rect.size;
#else
Expand All @@ -27,7 +27,7 @@ void main(void) {
prim.z,
prim.layer,
prim.task,
local_rect);
local_rect.p0);
vec2 f = (vi.local_pos - local_rect.p0) / local_rect.size;
#endif

Expand Down
4 changes: 2 additions & 2 deletions webrender/res/ps_yuv_image.vs.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ void main(void) {
prim.z,
prim.layer,
prim.task,
prim.local_rect);
prim.local_rect.p0);
vLocalPos = vi.local_pos;
#else
VertexInfo vi = write_vertex(prim.local_rect,
prim.local_clip_rect,
prim.z,
prim.layer,
prim.task,
prim.local_rect);
prim.local_rect.p0);
vLocalPos = vi.local_pos - prim.local_rect.p0;
#endif

Expand Down
Binary file modified wrench/reftests/border/degenerate-curve.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 7 additions & 8 deletions wrench/reftests/reftest.list
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
include aa/reftest.list
include blend/reftest.list
include border/reftest.list
include boxshadow/reftest.list
include filters/reftest.list
include gradient/reftest.list
include image/reftest.list
include mask/reftest.list
include scrolling/reftest.list
include snap/reftest.list
include split/reftest.list
include filters/reftest.list
include boxshadow/reftest.list
include image/reftest.list
include border/reftest.list
include gradient/reftest.list
include text/reftest.list
include split/reftest.list
include aa/reftest.list
2 changes: 0 additions & 2 deletions wrench/reftests/snap/reftest.list

This file was deleted.

Binary file removed wrench/reftests/snap/snap.png
Binary file not shown.
15 changes: 0 additions & 15 deletions wrench/reftests/snap/snap.yaml

This file was deleted.

Binary file removed wrench/reftests/snap/transform.png
Binary file not shown.
19 changes: 0 additions & 19 deletions wrench/reftests/snap/transform.yaml

This file was deleted.

0 comments on commit b2614e4

Please sign in to comment.