Update WR - texture layers, image mask, profiler, optimizations.

This commit is contained in:
Glenn Watson 2016-10-26 12:04:21 +10:00
parent 4b28750b9a
commit 86eaef237b
19 changed files with 182 additions and 58 deletions

View file

@ -160,6 +160,7 @@ impl ToClipRegion for ClippingRegion {
complex_clipping_region.radii.to_border_radius(), complex_clipping_region.radii.to_border_radius(),
) )
}).collect(), }).collect(),
None,
&mut frame_builder.auxiliary_lists_builder) &mut frame_builder.auxiliary_lists_builder)
} }
} }

View file

@ -2661,7 +2661,7 @@ dependencies = [
[[package]] [[package]]
name = "webrender" name = "webrender"
version = "0.7.0" version = "0.7.0"
source = "git+https://github.com/servo/webrender#860da4ff8b7dcb079ae85d4369d2412300e61599" source = "git+https://github.com/servo/webrender#4440d1daa3d6e9630d4b164f7bae644b9dc4cb8a"
dependencies = [ dependencies = [
"app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "bincode 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2686,7 +2686,7 @@ dependencies = [
[[package]] [[package]]
name = "webrender_traits" name = "webrender_traits"
version = "0.7.0" version = "0.7.0"
source = "git+https://github.com/servo/webrender#860da4ff8b7dcb079ae85d4369d2412300e61599" source = "git+https://github.com/servo/webrender#4440d1daa3d6e9630d4b164f7bae644b9dc4cb8a"
dependencies = [ dependencies = [
"app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",

4
ports/cef/Cargo.lock generated
View file

@ -2519,7 +2519,7 @@ dependencies = [
[[package]] [[package]]
name = "webrender" name = "webrender"
version = "0.7.0" version = "0.7.0"
source = "git+https://github.com/servo/webrender#860da4ff8b7dcb079ae85d4369d2412300e61599" source = "git+https://github.com/servo/webrender#4440d1daa3d6e9630d4b164f7bae644b9dc4cb8a"
dependencies = [ dependencies = [
"app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "bincode 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2544,7 +2544,7 @@ dependencies = [
[[package]] [[package]]
name = "webrender_traits" name = "webrender_traits"
version = "0.7.0" version = "0.7.0"
source = "git+https://github.com/servo/webrender#860da4ff8b7dcb079ae85d4369d2412300e61599" source = "git+https://github.com/servo/webrender#4440d1daa3d6e9630d4b164f7bae644b9dc4cb8a"
dependencies = [ dependencies = [
"app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",

View file

@ -5,14 +5,19 @@
flat varying vec4 vClipRect; flat varying vec4 vClipRect;
flat varying vec4 vClipRadius; flat varying vec4 vClipRadius;
flat varying vec4 vClipMaskUvRect;
flat varying vec4 vClipMaskLocalRect;
#ifdef WR_VERTEX_SHADER #ifdef WR_VERTEX_SHADER
void write_clip(Clip clip) { void write_clip(ClipInfo clip) {
vClipRect = vec4(clip.rect.rect.xy, clip.rect.rect.xy + clip.rect.rect.zw); vClipRect = vec4(clip.rect.rect.xy, clip.rect.rect.xy + clip.rect.rect.zw);
vClipRadius = vec4(clip.top_left.outer_inner_radius.x, vClipRadius = vec4(clip.top_left.outer_inner_radius.x,
clip.top_right.outer_inner_radius.x, clip.top_right.outer_inner_radius.x,
clip.bottom_right.outer_inner_radius.x, clip.bottom_right.outer_inner_radius.x,
clip.bottom_left.outer_inner_radius.x); clip.bottom_left.outer_inner_radius.x);
//TODO: interpolate the final mask UV
vClipMaskUvRect = clip.mask_info.uv_rect;
vClipMaskLocalRect = clip.mask_info.local_rect; //TODO: transform
} }
#endif #endif
@ -29,23 +34,31 @@ float do_clip(vec2 pos) {
float d_bl = distance(pos, ref_bl); float d_bl = distance(pos, ref_bl);
float pixels_per_fragment = length(fwidth(pos.xy)); float pixels_per_fragment = length(fwidth(pos.xy));
// TODO: compute the `nudge` separately for X and Y
float nudge = 0.5 * pixels_per_fragment; float nudge = 0.5 * pixels_per_fragment;
bool out0 = pos.x < ref_tl.x && pos.y < ref_tl.y && d_tl > vClipRadius.x - nudge;
bool out1 = pos.x > ref_tr.x && pos.y < ref_tr.y && d_tr > vClipRadius.y - nudge;
bool out2 = pos.x > ref_br.x && pos.y > ref_br.y && d_br > vClipRadius.z - nudge;
bool out3 = pos.x < ref_bl.x && pos.y > ref_bl.y && d_bl > vClipRadius.w - nudge;
vec4 distances = vec4(d_tl, d_tr, d_br, d_bl) - vClipRadius + nudge; vec4 distances = vec4(d_tl, d_tr, d_br, d_bl) - vClipRadius + nudge;
float distance_from_border = dot(vec4(out0, out1, out2, out3), distances);
bvec4 is_out = bvec4(pos.x < ref_tl.x && pos.y < ref_tl.y,
pos.x > ref_tr.x && pos.y < ref_tr.y,
pos.x > ref_br.x && pos.y > ref_br.y,
pos.x < ref_bl.x && pos.y > ref_bl.y);
float distance_from_border = dot(vec4(is_out),
max(vec4(0.0, 0.0, 0.0, 0.0), distances));
// Move the distance back into pixels. // Move the distance back into pixels.
distance_from_border /= pixels_per_fragment; distance_from_border /= pixels_per_fragment;
// Apply a more gradual fade out to transparent. // Apply a more gradual fade out to transparent.
//distance_from_border -= 0.5; //distance_from_border -= 0.5;
return 1.0 - smoothstep(0.0, 1.0, distance_from_border); float border_alpha = 1.0 - smoothstep(0.0, 1.0, distance_from_border);
bool repeat_mask = false; //TODO
vec2 vMaskUv = (pos - vClipMaskLocalRect.xy) / vClipMaskLocalRect.zw;
vec2 clamped_mask_uv = repeat_mask ? fract(vMaskUv) :
clamp(vMaskUv, vec2(0.0, 0.0), vec2(1.0, 1.0));
vec2 source_uv = clamped_mask_uv * vClipMaskUvRect.zw + vClipMaskUvRect.xy;
float mask_alpha = texture(sMask, source_uv).r; //careful: texture has type A8
return border_alpha * mask_alpha;
} }
#endif #endif

View file

@ -34,6 +34,8 @@
#define MAX_STOPS_PER_ANGLE_GRADIENT 8 #define MAX_STOPS_PER_ANGLE_GRADIENT 8
uniform sampler2DArray sCache;
#ifdef WR_VERTEX_SHADER #ifdef WR_VERTEX_SHADER
#define VECS_PER_LAYER 13 #define VECS_PER_LAYER 13
@ -121,7 +123,7 @@ Layer fetch_layer(int index) {
struct Tile { struct Tile {
vec4 screen_origin_task_origin; vec4 screen_origin_task_origin;
vec4 size; vec4 size_target_index;
}; };
Tile fetch_tile(int index) { Tile fetch_tile(int index) {
@ -130,7 +132,7 @@ Tile fetch_tile(int index) {
ivec2 uv = get_fetch_uv(index, VECS_PER_TILE); ivec2 uv = get_fetch_uv(index, VECS_PER_TILE);
tile.screen_origin_task_origin = texelFetchOffset(sRenderTasks, uv, 0, ivec2(0, 0)); tile.screen_origin_task_origin = texelFetchOffset(sRenderTasks, uv, 0, ivec2(0, 0));
tile.size = texelFetchOffset(sRenderTasks, uv, 0, ivec2(1, 0)); tile.size_target_index = texelFetchOffset(sRenderTasks, uv, 0, ivec2(1, 0));
return tile; return tile;
} }
@ -257,7 +259,6 @@ PrimitiveInstance fetch_instance(int index) {
return pi; return pi;
} }
struct Primitive { struct Primitive {
Layer layer; Layer layer;
Tile tile; Tile tile;
@ -298,11 +299,28 @@ ClipRect fetch_clip_rect(int index) {
ivec2 uv = get_fetch_uv_2(index); ivec2 uv = get_fetch_uv_2(index);
rect.rect = texelFetchOffset(sData32, uv, 0, ivec2(0, 0)); rect.rect = texelFetchOffset(sData32, uv, 0, ivec2(0, 0));
rect.dummy = texelFetchOffset(sData32, uv, 0, ivec2(1, 0)); //rect.dummy = texelFetchOffset(sData32, uv, 0, ivec2(1, 0));
rect.dummy = vec4(0.0, 0.0, 0.0, 0.0);
return rect; return rect;
} }
struct ImageMaskInfo {
vec4 uv_rect;
vec4 local_rect;
};
ImageMaskInfo fetch_mask_info(int index) {
ImageMaskInfo info;
ivec2 uv = get_fetch_uv_2(index);
info.uv_rect = texelFetchOffset(sData32, uv, 0, ivec2(0, 0));
info.local_rect = texelFetchOffset(sData32, uv, 0, ivec2(1, 0));
return info;
}
struct ClipCorner { struct ClipCorner {
vec4 rect; vec4 rect;
vec4 outer_inner_radius; vec4 outer_inner_radius;
@ -319,22 +337,24 @@ ClipCorner fetch_clip_corner(int index) {
return corner; return corner;
} }
struct Clip { struct ClipInfo {
ClipRect rect; ClipRect rect;
ClipCorner top_left; ClipCorner top_left;
ClipCorner top_right; ClipCorner top_right;
ClipCorner bottom_left; ClipCorner bottom_left;
ClipCorner bottom_right; ClipCorner bottom_right;
ImageMaskInfo mask_info;
}; };
Clip fetch_clip(int index) { ClipInfo fetch_clip(int index) {
Clip clip; ClipInfo clip;
clip.rect = fetch_clip_rect(index + 0); clip.rect = fetch_clip_rect(index + 0);
clip.top_left = fetch_clip_corner(index + 1); clip.top_left = fetch_clip_corner(index + 1);
clip.top_right = fetch_clip_corner(index + 2); clip.top_right = fetch_clip_corner(index + 2);
clip.bottom_left = fetch_clip_corner(index + 3); clip.bottom_left = fetch_clip_corner(index + 3);
clip.bottom_right = fetch_clip_corner(index + 4); clip.bottom_right = fetch_clip_corner(index + 4);
clip.mask_info = fetch_mask_info(index+5);
return clip; return clip;
} }
@ -407,7 +427,7 @@ VertexInfo write_vertex(vec4 instance_rect,
vec2 clamped_pos = clamp(device_pos, vec2 clamped_pos = clamp(device_pos,
vec2(tile.screen_origin_task_origin.xy), vec2(tile.screen_origin_task_origin.xy),
vec2(tile.screen_origin_task_origin.xy + tile.size.xy)); vec2(tile.screen_origin_task_origin.xy + tile.size_target_index.xy));
vec4 local_clamped_pos = layer.inv_transform * vec4(clamped_pos / uDevicePixelRatio, world_pos.z, 1); vec4 local_clamped_pos = layer.inv_transform * vec4(clamped_pos / uDevicePixelRatio, world_pos.z, 1);
local_clamped_pos.xyz /= local_clamped_pos.w; local_clamped_pos.xyz /= local_clamped_pos.w;
@ -461,11 +481,11 @@ TransformVertexInfo write_transform_vertex(vec4 instance_rect,
vec2 min_pos_clamped = clamp(min_pos * uDevicePixelRatio, vec2 min_pos_clamped = clamp(min_pos * uDevicePixelRatio,
vec2(tile.screen_origin_task_origin.xy), vec2(tile.screen_origin_task_origin.xy),
vec2(tile.screen_origin_task_origin.xy + tile.size.xy)); vec2(tile.screen_origin_task_origin.xy + tile.size_target_index.xy));
vec2 max_pos_clamped = clamp(max_pos * uDevicePixelRatio, vec2 max_pos_clamped = clamp(max_pos * uDevicePixelRatio,
vec2(tile.screen_origin_task_origin.xy), vec2(tile.screen_origin_task_origin.xy),
vec2(tile.screen_origin_task_origin.xy + tile.size.xy)); vec2(tile.screen_origin_task_origin.xy + tile.size_target_index.xy));
vec2 clamped_pos = mix(min_pos_clamped, vec2 clamped_pos = mix(min_pos_clamped,
max_pos_clamped, max_pos_clamped,
@ -578,7 +598,7 @@ Composite fetch_composite(int index) {
#endif #endif
#ifdef WR_FRAGMENT_SHADER #ifdef WR_FRAGMENT_SHADER
float squared_distance_from_rect(vec2 p, vec2 origin, vec2 size) { float distance_from_rect(vec2 p, vec2 origin, vec2 size) {
vec2 clamped = clamp(p, origin, origin + size); vec2 clamped = clamp(p, origin, origin + size);
return distance(clamped, p); return distance(clamped, p);
} }
@ -587,10 +607,10 @@ vec2 init_transform_fs(vec3 local_pos, vec4 local_rect, out float fragment_alpha
fragment_alpha = 1.0; fragment_alpha = 1.0;
vec2 pos = local_pos.xy / local_pos.z; vec2 pos = local_pos.xy / local_pos.z;
float squared_distance = squared_distance_from_rect(pos, local_rect.xy, local_rect.zw); float border_distance = distance_from_rect(pos, local_rect.xy, local_rect.zw);
if (squared_distance != 0.0) { if (border_distance != 0.0) {
float delta = length(fwidth(local_pos.xy)); float delta = length(fwidth(local_pos.xy));
fragment_alpha = smoothstep(1.0, 0.0, squared_distance / delta * 2.0); fragment_alpha = 1.0 - smoothstep(0.0, 1.0, border_distance / delta * 2.0);
} }
return pos; return pos;

View file

@ -2,8 +2,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
uniform sampler2D sCache;
vec3 rgbToHsv(vec3 c) { vec3 rgbToHsv(vec3 c) {
float value = max(max(c.r, c.g), c.b); float value = max(max(c.r, c.g), c.b);

View file

@ -2,6 +2,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
varying vec2 vUv; varying vec3 vUv;
flat varying float vAmount; flat varying float vAmount;
flat varying int vOp; flat varying int vOp;

View file

@ -13,12 +13,13 @@ void main(void) {
src.screen_origin_task_origin.xy; src.screen_origin_task_origin.xy;
vec2 local_pos = mix(dest_origin, vec2 local_pos = mix(dest_origin,
dest_origin + src.size.xy, dest_origin + src.size_target_index.xy,
aPosition.xy); aPosition.xy);
vec2 st0 = vec2(src.screen_origin_task_origin.zw) / 2048.0; vec2 texture_size = vec2(textureSize(sCache, 0));
vec2 st1 = vec2(src.screen_origin_task_origin.zw + src.size.xy) / 2048.0; vec2 st0 = src.screen_origin_task_origin.zw / texture_size;
vUv = mix(st0, st1, aPosition.xy); vec2 st1 = (src.screen_origin_task_origin.zw + src.size_target_index.xy) / texture_size;
vUv = vec3(mix(st0, st1, aPosition.xy), src.size_target_index.z);
vOp = blend.src_id_target_id_op_amount.z; vOp = blend.src_id_target_id_op_amount.z;
vAmount = blend.src_id_target_id_op_amount.w / 65535.0; vAmount = blend.src_id_target_id_op_amount.w / 65535.0;

View file

@ -41,7 +41,7 @@ float alpha_for_solid_border(float distance_from_ref,
// Apply a more gradual fade out to transparent. // Apply a more gradual fade out to transparent.
// distance_from_border -= 0.5; // distance_from_border -= 0.5;
return smoothstep(1.0, 0.0, distance_from_border); return 1.0 - smoothstep(0.0, 1.0, distance_from_border);
} }
float alpha_for_solid_border_corner(vec2 local_pos, float alpha_for_solid_border_corner(vec2 local_pos,
@ -97,7 +97,7 @@ vec4 draw_dotted_edge(vec2 local_pos, vec4 piece_rect, float pixels_per_fragment
// Move the distance back into pixels. // Move the distance back into pixels.
distance_from_circle_edge /= pixels_per_fragment; distance_from_circle_edge /= pixels_per_fragment;
float alpha = smoothstep(1.0, 0.0, min(1.0, max(0.0, distance_from_circle_edge))); float alpha = 1.0 - smoothstep(0.0, 1.0, min(1.0, max(0.0, distance_from_circle_edge)));
return vHorizontalColor * vec4(1.0, 1.0, 1.0, alpha); return vHorizontalColor * vec4(1.0, 1.0, 1.0, alpha);
} }

View file

@ -4,8 +4,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
uniform sampler2D sCache;
float gauss(float x, float sigma) { float gauss(float x, float sigma) {
if (sigma == 0.0) if (sigma == 0.0)
return 1.0; return 1.0;

View file

@ -2,7 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
varying vec2 vUv0; varying vec3 vUv0;
varying vec2 vUv1; varying vec3 vUv1;
flat varying vec4 vUv1Rect; flat varying vec4 vUv1Rect;
flat varying int vOp; flat varying int vOp;

View file

@ -10,20 +10,21 @@ void main(void) {
Tile dest = fetch_tile(composite.src0_src1_target_id_op.z); Tile dest = fetch_tile(composite.src0_src1_target_id_op.z);
vec2 local_pos = mix(dest.screen_origin_task_origin.zw, vec2 local_pos = mix(dest.screen_origin_task_origin.zw,
dest.screen_origin_task_origin.zw + dest.size.xy, dest.screen_origin_task_origin.zw + dest.size_target_index.xy,
aPosition.xy); aPosition.xy);
vec2 st0 = vec2(src0.screen_origin_task_origin.zw) / 2048.0; vec2 texture_size = vec2(textureSize(sCache, 0));
vec2 st1 = vec2(src0.screen_origin_task_origin.zw + src0.size.xy) / 2048.0; vec2 st0 = src0.screen_origin_task_origin.zw / texture_size;
vUv0 = mix(st0, st1, aPosition.xy); vec2 st1 = (src0.screen_origin_task_origin.zw + src0.size_target_index.xy) / texture_size;
vUv0 = vec3(mix(st0, st1, aPosition.xy), src0.size_target_index.z);
st0 = vec2(src1.screen_origin_task_origin.zw) / 2048.0; st0 = vec2(src1.screen_origin_task_origin.zw) / texture_size;
st1 = vec2(src1.screen_origin_task_origin.zw + src1.size.xy) / 2048.0; st1 = vec2(src1.screen_origin_task_origin.zw + src1.size_target_index.xy) / texture_size;
vec2 local_virtual_pos = mix(dest.screen_origin_task_origin.xy, vec2 local_virtual_pos = mix(dest.screen_origin_task_origin.xy,
dest.screen_origin_task_origin.xy + dest.size.xy, dest.screen_origin_task_origin.xy + dest.size_target_index.xy,
aPosition.xy); aPosition.xy);
vec2 f = (local_virtual_pos - src1.screen_origin_task_origin.xy) / src1.size.xy; vec2 f = (local_virtual_pos - src1.screen_origin_task_origin.xy) / src1.size_target_index.xy;
vUv1 = mix(st0, st1, f); vUv1 = vec3(mix(st0, st1, f), src1.size_target_index.z);
vUv1Rect = vec4(st0, st1); vUv1Rect = vec4(st0, st1);
vOp = composite.src0_src1_target_id_op.w; vOp = composite.src0_src1_target_id_op.w;

View file

@ -0,0 +1,15 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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/. */
void main(void) {
#ifdef WR_FEATURE_TRANSFORM
float alpha = 0.0;
vec2 local_pos = init_transform_fs(vLocalPos, vLocalRect, alpha);
#else
float alpha = 1.0;
vec2 local_pos = vPos;
#endif
oFragColor = vColor * vec4(1, 1, 1, alpha);
}

View file

@ -0,0 +1,12 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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/. */
varying vec4 vColor;
#ifdef WR_FEATURE_TRANSFORM
varying vec3 vLocalPos;
flat varying vec4 vLocalRect;
#else
varying vec2 vPos;
#endif

View file

@ -0,0 +1,69 @@
#line 1
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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/. */
void main(void) {
Primitive prim = load_primitive(gl_InstanceID);
Gradient gradient = fetch_gradient(prim.prim_index);
int stop_index = prim.user_data.x + prim.user_data.y;
GradientStop g0 = fetch_gradient_stop(stop_index + 0);
GradientStop g1 = fetch_gradient_stop(stop_index + 1);
vec4 segment_rect;
switch (int(gradient.kind.x)) {
case GRADIENT_HORIZONTAL:
float x0 = mix(gradient.start_end_point.x,
gradient.start_end_point.z,
g0.offset.x);
float x1 = mix(gradient.start_end_point.x,
gradient.start_end_point.z,
g1.offset.x);
segment_rect.yw = prim.local_rect.yw;
segment_rect.x = x0;
segment_rect.z = x1 - x0;
break;
case GRADIENT_VERTICAL:
float y0 = mix(gradient.start_end_point.y,
gradient.start_end_point.w,
g0.offset.x);
float y1 = mix(gradient.start_end_point.y,
gradient.start_end_point.w,
g1.offset.x);
segment_rect.xz = prim.local_rect.xz;
segment_rect.y = y0;
segment_rect.w = y1 - y0;
break;
}
#ifdef WR_FEATURE_TRANSFORM
TransformVertexInfo vi = write_transform_vertex(segment_rect,
prim.local_clip_rect,
prim.layer,
prim.tile);
vLocalRect = vi.clipped_local_rect;
vLocalPos = vi.local_pos;
vec2 f = (vi.local_pos.xy - prim.local_rect.xy) / prim.local_rect.zw;
#else
VertexInfo vi = write_vertex(segment_rect,
prim.local_clip_rect,
prim.layer,
prim.tile);
vec2 f = (vi.local_clamped_pos - segment_rect.xy) / segment_rect.zw;
vPos = vi.local_clamped_pos;
#endif
switch (int(gradient.kind.x)) {
case GRADIENT_HORIZONTAL:
vColor = mix(g0.color, g1.color, f.x);
break;
case GRADIENT_VERTICAL:
vColor = mix(g0.color, g1.color, f.y);
break;
case GRADIENT_ROTATED:
vColor = vec4(1.0, 0.0, 1.0, 1.0);
break;
}
}

View file

@ -13,8 +13,4 @@ void main(void) {
alpha = min(alpha, do_clip(local_pos)); alpha = min(alpha, do_clip(local_pos));
oFragColor = vColor * vec4(1, 1, 1, alpha); oFragColor = vColor * vec4(1, 1, 1, alpha);
#ifdef WR_FEATURE_TRANSFORM
oFragColor.a *= alpha;
#endif
} }

View file

@ -67,6 +67,6 @@ void main(void) {
break; break;
} }
Clip clip = fetch_clip(prim.clip_index); ClipInfo clip = fetch_clip(prim.clip_index);
write_clip(clip); write_clip(clip);
} }

View file

@ -23,7 +23,7 @@ void main(void) {
vLocalPos = vi.local_clamped_pos; vLocalPos = vi.local_clamped_pos;
#endif #endif
Clip clip = fetch_clip(prim.clip_index); ClipInfo clip = fetch_clip(prim.clip_index);
write_clip(clip); write_clip(clip);
// vUv will contain how many times this image has wrapped around the image size. // vUv will contain how many times this image has wrapped around the image size.

View file

@ -22,6 +22,6 @@ void main(void) {
vPos = vi.local_clamped_pos; vPos = vi.local_clamped_pos;
#endif #endif
Clip clip = fetch_clip(prim.clip_index); ClipInfo clip = fetch_clip(prim.clip_index);
write_clip(clip); write_clip(clip);
} }