diff options
-rw-r--r-- | components/servo/Cargo.lock | 4 | ||||
-rw-r--r-- | ports/cef/Cargo.lock | 4 | ||||
-rw-r--r-- | resources/shaders/prim_shared.glsl | 34 | ||||
-rw-r--r-- | resources/shaders/ps_border.fs.glsl | 63 |
4 files changed, 51 insertions, 54 deletions
diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index 535616b76f4..b84d1af3d16 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -2592,7 +2592,7 @@ dependencies = [ [[package]] name = "webrender" version = "0.5.1" -source = "git+https://github.com/servo/webrender#f82fad77b938e339be7ccfc9ba23d2ebd7a72fcb" +source = "git+https://github.com/servo/webrender#b2cca277407b59c4c3b8122f36b64bd81f83a4dc" dependencies = [ "app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "bincode 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2617,7 +2617,7 @@ dependencies = [ [[package]] name = "webrender_traits" version = "0.5.1" -source = "git+https://github.com/servo/webrender#f82fad77b938e339be7ccfc9ba23d2ebd7a72fcb" +source = "git+https://github.com/servo/webrender#b2cca277407b59c4c3b8122f36b64bd81f83a4dc" dependencies = [ "app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/ports/cef/Cargo.lock b/ports/cef/Cargo.lock index 929c41ba891..7418cf12d0d 100644 --- a/ports/cef/Cargo.lock +++ b/ports/cef/Cargo.lock @@ -2452,7 +2452,7 @@ dependencies = [ [[package]] name = "webrender" version = "0.5.1" -source = "git+https://github.com/servo/webrender#f82fad77b938e339be7ccfc9ba23d2ebd7a72fcb" +source = "git+https://github.com/servo/webrender#b2cca277407b59c4c3b8122f36b64bd81f83a4dc" dependencies = [ "app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "bincode 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2477,7 +2477,7 @@ dependencies = [ [[package]] name = "webrender_traits" version = "0.5.1" -source = "git+https://github.com/servo/webrender#f82fad77b938e339be7ccfc9ba23d2ebd7a72fcb" +source = "git+https://github.com/servo/webrender#b2cca277407b59c4c3b8122f36b64bd81f83a4dc" dependencies = [ "app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/resources/shaders/prim_shared.glsl b/resources/shaders/prim_shared.glsl index 820ab47633d..21d6c41e382 100644 --- a/resources/shaders/prim_shared.glsl +++ b/resources/shaders/prim_shared.glsl @@ -30,8 +30,6 @@ #define MAX_STOPS_PER_ANGLE_GRADIENT 8 #ifdef WR_VERTEX_SHADER -uniform sampler2D sLayers; - struct Layer { mat4 transform; mat4 inv_transform; @@ -47,27 +45,31 @@ layout(std140) uniform Tiles { vec4 tiles[WR_MAX_UBO_VECTORS]; }; +layout(std140) uniform Layers { + vec4 layers[WR_MAX_UBO_VECTORS]; +}; + Layer fetch_layer(int index) { Layer layer; - ivec2 uv = ivec2(0, index); + int offset = index * 13; - layer.transform[0] = texelFetchOffset(sLayers, uv, 0, ivec2(0, 0)); - layer.transform[1] = texelFetchOffset(sLayers, uv, 0, ivec2(1, 0)); - layer.transform[2] = texelFetchOffset(sLayers, uv, 0, ivec2(2, 0)); - layer.transform[3] = texelFetchOffset(sLayers, uv, 0, ivec2(3, 0)); + layer.transform[0] = layers[offset + 0]; + layer.transform[1] = layers[offset + 1]; + layer.transform[2] = layers[offset + 2]; + layer.transform[3] = layers[offset + 3]; - layer.inv_transform[0] = texelFetchOffset(sLayers, uv, 0, ivec2(4, 0)); - layer.inv_transform[1] = texelFetchOffset(sLayers, uv, 0, ivec2(5, 0)); - layer.inv_transform[2] = texelFetchOffset(sLayers, uv, 0, ivec2(6, 0)); - layer.inv_transform[3] = texelFetchOffset(sLayers, uv, 0, ivec2(7, 0)); + layer.inv_transform[0] = layers[offset + 4]; + layer.inv_transform[1] = layers[offset + 5]; + layer.inv_transform[2] = layers[offset + 6]; + layer.inv_transform[3] = layers[offset + 7]; - layer.local_clip_rect = texelFetchOffset(sLayers, uv, 0, ivec2(8, 0)); + layer.local_clip_rect = layers[offset + 8]; - layer.screen_vertices[0] = texelFetchOffset(sLayers, uv, 0, ivec2(9, 0)); - layer.screen_vertices[1] = texelFetchOffset(sLayers, uv, 0, ivec2(10, 0)); - layer.screen_vertices[2] = texelFetchOffset(sLayers, uv, 0, ivec2(11, 0)); - layer.screen_vertices[3] = texelFetchOffset(sLayers, uv, 0, ivec2(12, 0)); + layer.screen_vertices[0] = layers[offset + 9]; + layer.screen_vertices[1] = layers[offset + 10]; + layer.screen_vertices[2] = layers[offset + 11]; + layer.screen_vertices[3] = layers[offset + 12]; return layer; } diff --git a/resources/shaders/ps_border.fs.glsl b/resources/shaders/ps_border.fs.glsl index 74881dd34f0..9dfeb2d26c2 100644 --- a/resources/shaders/ps_border.fs.glsl +++ b/resources/shaders/ps_border.fs.glsl @@ -52,43 +52,36 @@ float alpha_for_solid_border_corner(vec2 local_pos, return alpha_for_solid_border(distance_from_ref, inner_radius, outer_radius, pixels_per_fragment); } -vec4 draw_dotted_edge(vec2 local_pos, vec4 piece_rect, float pixels_per_fragment) { - // We don't use pixels_per_fragment here, since it can change along the edge - // of a transformed border edge. We want this calculation to be consistent - // across the entire edge so that the positioning of the dots stays the same. - float two_pixels = 2 * length(fwidth(vLocalPos.xy)); - - // Circle diameter is stroke width, minus a couple pixels to account for anti-aliasing. - float circle_diameter = max(piece_rect.z - two_pixels, min(piece_rect.z, two_pixels)); +#ifdef WR_FEATURE_TRANSFORM - // We want to spread the circles across the edge, but keep one circle diameter at the end - // reserved for two half-circles which connect to the corners. - float edge_available = piece_rect.w - (circle_diameter * 2); - float number_of_circles = floor(edge_available / (circle_diameter * 2)); +#else +vec4 draw_dotted_edge(vec2 position, vec2 edge_size, float pixels_per_fragment) { + float two_pixels = 2 * pixels_per_fragment; - // Here we are initializing the distance from the y coordinate of the center of the circle to - // the closest end half-circle. - vec2 relative_pos = local_pos - piece_rect.xy; - float y_distance = min(relative_pos.y, piece_rect.w - relative_pos.y); + // Circle diameter is stroke width, minus a couple pixels to account for anti-aliasing. + float circle_diameter = max(edge_size.x - two_pixels, min(edge_size.x, two_pixels)); - if (number_of_circles > 0) { - // Spread the circles throughout the edge, to distribute the extra space evenly. We want - // to ensure that we have at last two pixels of space for each circle so that they aren't - // touching. - float space_for_each_circle = ceil(max(edge_available / number_of_circles, two_pixels)); + //// Divide the edge into segments which are the size of the circle diameter. + float segments_in_edge = floor(edge_size.y / circle_diameter); - float first_half_circle_space = circle_diameter; + // Every other segment has a circle. + float number_of_circles = floor(segments_in_edge / 2); + if (number_of_circles <= 0) + return vec4(0, 0, 0, 0); - float circle_index = (relative_pos.y - first_half_circle_space) / space_for_each_circle; - circle_index = floor(clamp(circle_index, 0, number_of_circles - 1)); + // Spread the circles throughout the edge, to distribute the extra space evenly. We want + // to ensure that we have at last two pixels of space for each circle so that they aren't + // touching. + float space_for_each_circle = ceil(max(edge_size.y / number_of_circles, two_pixels)); - float circle_y_pos = - circle_index * space_for_each_circle + (space_for_each_circle / 2) + circle_diameter; - y_distance = min(abs(circle_y_pos - relative_pos.y), y_distance); - } + // Find the circle index. We adjust the y position here because the first circle is a + // half circle at the edge of this border side. + float circle_index = floor((position.y + (space_for_each_circle / 2)) / space_for_each_circle); - float distance_from_circle_center = length(vec2(relative_pos.x - (piece_rect.z / 2), y_distance)); - float distance_from_circle_edge = distance_from_circle_center - (circle_diameter / 2); + // Find the center of the circle that is closest to our position. We will then calculate + // the distance from the edge of the circle. + vec2 circle_center = vec2(edge_size.x / 2, circle_index * space_for_each_circle); + float distance_from_circle_edge = length(circle_center - position) - (circle_diameter / 2); // Don't anti-alias if the circle diameter is small to avoid a blur of color. if (circle_diameter < two_pixels && distance_from_circle_edge > 0) @@ -124,18 +117,22 @@ void draw_dotted_border(vec2 local_pos, float distance_from_mix_line) { } case PST_BOTTOM: case PST_TOP: { - oFragColor = draw_dotted_edge(local_pos.yx, vPieceRect.yxwz, pixels_per_fragment); + vec2 piece_relative_position = vLocalPos - vPieceRect.xy; + oFragColor = draw_dotted_edge(piece_relative_position.yx, vPieceRect.wz, pixels_per_fragment); break; } case PST_LEFT: case PST_RIGHT: { - oFragColor = draw_dotted_edge(local_pos.xy, vPieceRect.xyzw, pixels_per_fragment); + vec2 piece_relative_position = vLocalPos - vPieceRect.xy; + oFragColor = draw_dotted_edge(piece_relative_position.xy, vPieceRect.zw, pixels_per_fragment); break; } } } +#endif + vec4 draw_dashed_edge(float position, float border_width, float pixels_per_fragment) { // TODO: Investigate exactly what FF does. float size = border_width * 3; @@ -337,8 +334,6 @@ void main(void) { draw_dashed_border(local_pos, distance_from_mix_line); break; case BORDER_STYLE_DOTTED: - draw_dotted_border(local_pos, distance_from_mix_line); - break; case BORDER_STYLE_OUTSET: case BORDER_STYLE_INSET: case BORDER_STYLE_SOLID: |