diff options
author | Martin Robinson <mrobinson@igalia.com> | 2016-10-23 13:20:36 +0200 |
---|---|---|
committer | Martin Robinson <mrobinson@igalia.com> | 2016-10-23 13:20:36 +0200 |
commit | 0a13c05479cf0366bc301ab7e8fe1234fcea62e3 (patch) | |
tree | 8056e6f1d41c7856bfd3ed32f16e761f3dbd91ec | |
parent | 8a12c155821a97f6276daebf4d1edab569638bbb (diff) | |
download | servo-0a13c05479cf0366bc301ab7e8fe1234fcea62e3.tar.gz servo-0a13c05479cf0366bc301ab7e8fe1234fcea62e3.zip |
Update WebRender to get the latest changes
20 files changed, 641 insertions, 436 deletions
diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index 98b64943bc8..5ac12ff18c1 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -46,8 +46,8 @@ dependencies = [ "util 0.0.1", "util_tests 0.0.1", "webdriver_server 0.0.1", - "webrender 0.6.0 (git+https://github.com/servo/webrender)", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender 0.7.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] @@ -233,7 +233,7 @@ dependencies = [ "offscreen_gl_context 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "plugins 0.0.1", "util 0.0.1", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] @@ -250,7 +250,7 @@ dependencies = [ "plugins 0.0.1", "serde 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 0.8.12 (registry+https://github.com/rust-lang/crates.io-index)", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] @@ -338,8 +338,8 @@ dependencies = [ "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", - "webrender 0.6.0 (git+https://github.com/servo/webrender)", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender 0.7.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] @@ -370,7 +370,7 @@ dependencies = [ "style_traits 0.0.1", "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] @@ -815,7 +815,7 @@ dependencies = [ "unicode-script 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "xi-unicode 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1166,7 +1166,7 @@ dependencies = [ "unicode-script 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] @@ -1205,7 +1205,7 @@ dependencies = [ "style 0.0.1", "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] @@ -1219,7 +1219,7 @@ dependencies = [ "profile_traits 0.0.1", "script_traits 0.0.1", "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] @@ -1388,7 +1388,7 @@ dependencies = [ "plugins 0.0.1", "serde 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 0.8.12 (registry+https://github.com/rust-lang/crates.io-index)", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] @@ -1426,7 +1426,7 @@ dependencies = [ "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", "uuid 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", "websocket 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1484,7 +1484,7 @@ dependencies = [ "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", "uuid 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", "websocket 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1989,7 +1989,7 @@ dependencies = [ "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", "uuid 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", "websocket 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)", "xml5ever 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2660,8 +2660,8 @@ dependencies = [ [[package]] name = "webrender" -version = "0.6.0" -source = "git+https://github.com/servo/webrender#dce9d1ab8607f6b39cbcebad1d3e9272ad8cd75e" +version = "0.7.0" +source = "git+https://github.com/servo/webrender#a3adb113f95b682ae3176c4000bdcaad1e7cb940" 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)", @@ -2680,13 +2680,13 @@ dependencies = [ "offscreen_gl_context 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] name = "webrender_traits" -version = "0.6.0" -source = "git+https://github.com/servo/webrender#dce9d1ab8607f6b39cbcebad1d3e9272ad8cd75e" +version = "0.7.0" +source = "git+https://github.com/servo/webrender#a3adb113f95b682ae3176c4000bdcaad1e7cb940" 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)", @@ -3002,8 +3002,8 @@ dependencies = [ "checksum wayland-sys 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9633f7fe5de56544215f82eaf1b76bf1b584becf7f08b58cbef4c2c7d10e803a" "checksum wayland-window 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "309b69d3a863c9c21422d889fb7d98cf02f8a2ca054960a49243ce5b67ad884c" "checksum webdriver 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee2d66e90672022ced375134329c57be4db228b19b120b97b744a469c381be06" -"checksum webrender 0.6.0 (git+https://github.com/servo/webrender)" = "<none>" -"checksum webrender_traits 0.6.0 (git+https://github.com/servo/webrender)" = "<none>" +"checksum webrender 0.7.0 (git+https://github.com/servo/webrender)" = "<none>" +"checksum webrender_traits 0.7.0 (git+https://github.com/servo/webrender)" = "<none>" "checksum websocket 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4a1a6ea5ed0367f32eb3d94dcc58859ef4294b5f75ba983dbf56ac314af45d" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" diff --git a/ports/cef/Cargo.lock b/ports/cef/Cargo.lock index 1aa9e3d2bbf..c23c544577d 100644 --- a/ports/cef/Cargo.lock +++ b/ports/cef/Cargo.lock @@ -206,7 +206,7 @@ dependencies = [ "offscreen_gl_context 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "plugins 0.0.1", "util 0.0.1", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] @@ -223,7 +223,7 @@ dependencies = [ "plugins 0.0.1", "serde 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 0.8.12 (registry+https://github.com/rust-lang/crates.io-index)", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] @@ -295,8 +295,8 @@ dependencies = [ "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", - "webrender 0.6.0 (git+https://github.com/servo/webrender)", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender 0.7.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] @@ -327,7 +327,7 @@ dependencies = [ "style_traits 0.0.1", "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] @@ -731,7 +731,7 @@ dependencies = [ "unicode-script 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "xi-unicode 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1073,7 +1073,7 @@ dependencies = [ "unicode-script 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] @@ -1105,7 +1105,7 @@ dependencies = [ "style 0.0.1", "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] @@ -1119,7 +1119,7 @@ dependencies = [ "profile_traits 0.0.1", "script_traits 0.0.1", "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] @@ -1288,7 +1288,7 @@ dependencies = [ "plugins 0.0.1", "serde 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 0.8.12 (registry+https://github.com/rust-lang/crates.io-index)", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] @@ -1326,7 +1326,7 @@ dependencies = [ "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", "uuid 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", "websocket 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1362,7 +1362,7 @@ dependencies = [ "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", "uuid 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", "websocket 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1840,7 +1840,7 @@ dependencies = [ "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", "uuid 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", "websocket 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)", "xml5ever 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1998,8 +1998,8 @@ dependencies = [ "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", "webdriver_server 0.0.1", - "webrender 0.6.0 (git+https://github.com/servo/webrender)", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender 0.7.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] @@ -2518,8 +2518,8 @@ dependencies = [ [[package]] name = "webrender" -version = "0.6.0" -source = "git+https://github.com/servo/webrender#dce9d1ab8607f6b39cbcebad1d3e9272ad8cd75e" +version = "0.7.0" +source = "git+https://github.com/servo/webrender#a3adb113f95b682ae3176c4000bdcaad1e7cb940" 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)", @@ -2538,13 +2538,13 @@ dependencies = [ "offscreen_gl_context 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", - "webrender_traits 0.6.0 (git+https://github.com/servo/webrender)", + "webrender_traits 0.7.0 (git+https://github.com/servo/webrender)", ] [[package]] name = "webrender_traits" -version = "0.6.0" -source = "git+https://github.com/servo/webrender#dce9d1ab8607f6b39cbcebad1d3e9272ad8cd75e" +version = "0.7.0" +source = "git+https://github.com/servo/webrender#a3adb113f95b682ae3176c4000bdcaad1e7cb940" 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)", @@ -2854,8 +2854,8 @@ dependencies = [ "checksum wayland-sys 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9633f7fe5de56544215f82eaf1b76bf1b584becf7f08b58cbef4c2c7d10e803a" "checksum wayland-window 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "309b69d3a863c9c21422d889fb7d98cf02f8a2ca054960a49243ce5b67ad884c" "checksum webdriver 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee2d66e90672022ced375134329c57be4db228b19b120b97b744a469c381be06" -"checksum webrender 0.6.0 (git+https://github.com/servo/webrender)" = "<none>" -"checksum webrender_traits 0.6.0 (git+https://github.com/servo/webrender)" = "<none>" +"checksum webrender 0.7.0 (git+https://github.com/servo/webrender)" = "<none>" +"checksum webrender_traits 0.7.0 (git+https://github.com/servo/webrender)" = "<none>" "checksum websocket 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4a1a6ea5ed0367f32eb3d94dcc58859ef4294b5f75ba983dbf56ac314af45d" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" diff --git a/resources/shaders/clip_shared.glsl b/resources/shaders/clip_shared.glsl index 772ff050e06..314f79d604b 100644 --- a/resources/shaders/clip_shared.glsl +++ b/resources/shaders/clip_shared.glsl @@ -1,3 +1,4 @@ +#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/. */ @@ -7,7 +8,7 @@ flat varying vec4 vClipRadius; #ifdef WR_VERTEX_SHADER void write_clip(Clip clip) { - vClipRect = vec4(clip.rect.xy, clip.rect.xy + clip.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, clip.top_right.outer_inner_radius.x, clip.bottom_right.outer_inner_radius.x, diff --git a/resources/shaders/prim_shared.glsl b/resources/shaders/prim_shared.glsl index df62c0fe77a..a91a7cd27fc 100644 --- a/resources/shaders/prim_shared.glsl +++ b/resources/shaders/prim_shared.glsl @@ -3,42 +3,79 @@ * 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/. */ -#define PST_TOP_LEFT uint(0) -#define PST_TOP_RIGHT uint(1) -#define PST_BOTTOM_LEFT uint(2) -#define PST_BOTTOM_RIGHT uint(3) -#define PST_TOP uint(4) -#define PST_LEFT uint(5) -#define PST_BOTTOM uint(6) -#define PST_RIGHT uint(7) +#define PST_TOP_LEFT 0 +#define PST_TOP 1 +#define PST_TOP_RIGHT 2 +#define PST_RIGHT 3 +#define PST_BOTTOM_RIGHT 4 +#define PST_BOTTOM 5 +#define PST_BOTTOM_LEFT 6 +#define PST_LEFT 7 + +#define BORDER_LEFT 0 +#define BORDER_TOP 1 +#define BORDER_RIGHT 2 +#define BORDER_BOTTOM 3 #define UV_NORMALIZED uint(0) #define UV_PIXEL uint(1) // Border styles as defined in webrender_traits/types.rs -#define BORDER_STYLE_NONE uint(0) -#define BORDER_STYLE_SOLID uint(1) -#define BORDER_STYLE_DOUBLE uint(2) -#define BORDER_STYLE_DOTTED uint(3) -#define BORDER_STYLE_DASHED uint(4) -#define BORDER_STYLE_HIDDEN uint(5) -#define BORDER_STYLE_GROOVE uint(6) -#define BORDER_STYLE_RIDGE uint(7) -#define BORDER_STYLE_INSET uint(8) -#define BORDER_STYLE_OUTSET uint(9) +#define BORDER_STYLE_NONE 0 +#define BORDER_STYLE_SOLID 1 +#define BORDER_STYLE_DOUBLE 2 +#define BORDER_STYLE_DOTTED 3 +#define BORDER_STYLE_DASHED 4 +#define BORDER_STYLE_HIDDEN 5 +#define BORDER_STYLE_GROOVE 6 +#define BORDER_STYLE_RIDGE 7 +#define BORDER_STYLE_INSET 8 +#define BORDER_STYLE_OUTSET 9 #define MAX_STOPS_PER_ANGLE_GRADIENT 8 #ifdef WR_VERTEX_SHADER -#define VECS_PER_LAYER 13 -#define LAYERS_PER_ROW (WR_MAX_VERTEX_TEXTURE_WIDTH / VECS_PER_LAYER) +#define VECS_PER_LAYER 13 +#define VECS_PER_TILE 2 +#define VECS_PER_PRIM_GEOM 2 -#define VECS_PER_TILE 2 -#define TILES_PER_ROW (WR_MAX_VERTEX_TEXTURE_WIDTH / VECS_PER_TILE) +#define GRADIENT_HORIZONTAL 0 +#define GRADIENT_VERTICAL 1 +#define GRADIENT_ROTATED 2 uniform sampler2D sLayers; uniform sampler2D sRenderTasks; +uniform sampler2D sPrimGeometry; +uniform sampler2D sClips; + +uniform sampler2D sData16; +uniform sampler2D sData32; +uniform sampler2D sData64; +uniform sampler2D sData128; + +ivec2 get_fetch_uv(int index, int vecs_per_item) { + int items_per_row = WR_MAX_VERTEX_TEXTURE_WIDTH / vecs_per_item; + int y = index / items_per_row; + int x = vecs_per_item * (index % items_per_row); + return ivec2(x, y); +} + +ivec2 get_fetch_uv_1(int index) { + return get_fetch_uv(index, 1); +} + +ivec2 get_fetch_uv_2(int index) { + return get_fetch_uv(index, 2); +} + +ivec2 get_fetch_uv_4(int index) { + return get_fetch_uv(index, 4); +} + +ivec2 get_fetch_uv_8(int index) { + return get_fetch_uv(index, 8); +} struct Layer { mat4 transform; @@ -48,7 +85,7 @@ struct Layer { }; layout(std140) uniform Data { - vec4 data[WR_MAX_UBO_VECTORS]; + ivec4 int_data[WR_MAX_UBO_VECTORS]; }; Layer fetch_layer(int index) { @@ -58,11 +95,9 @@ Layer fetch_layer(int index) { // This is required because trying to use an offset // of more than 8 texels doesn't work on some versions // of OSX. - int y = index / LAYERS_PER_ROW; - int x = VECS_PER_LAYER * (index % LAYERS_PER_ROW); - - ivec2 uv0 = ivec2(x + 0, y); - ivec2 uv1 = ivec2(x + 8, y); + ivec2 uv = get_fetch_uv(index, VECS_PER_LAYER); + ivec2 uv0 = ivec2(uv.x + 0, uv.y); + ivec2 uv1 = ivec2(uv.x + 8, uv.y); layer.transform[0] = texelFetchOffset(sLayers, uv0, 0, ivec2(0, 0)); layer.transform[1] = texelFetchOffset(sLayers, uv0, 0, ivec2(1, 0)); @@ -92,10 +127,7 @@ struct Tile { Tile fetch_tile(int index) { Tile tile; - int y = index / TILES_PER_ROW; - int x = VECS_PER_TILE * (index % TILES_PER_ROW); - - ivec2 uv = ivec2(x + 0, y); + ivec2 uv = get_fetch_uv(index, VECS_PER_TILE); tile.actual_rect = texelFetchOffset(sRenderTasks, uv, 0, ivec2(0, 0)); tile.target_rect = texelFetchOffset(sRenderTasks, uv, 0, ivec2(1, 0)); @@ -103,20 +135,172 @@ Tile fetch_tile(int index) { return tile; } -struct PrimitiveInfo { - vec4 layer_tile; +struct Gradient { + vec4 start_end_point; + vec4 kind; +}; + +Gradient fetch_gradient(int index) { + Gradient gradient; + + ivec2 uv = get_fetch_uv_2(index); + + gradient.start_end_point = texelFetchOffset(sData32, uv, 0, ivec2(0, 0)); + gradient.kind = texelFetchOffset(sData32, uv, 0, ivec2(1, 0)); + + return gradient; +} + +struct GradientStop { + vec4 color; + vec4 offset; +}; + +GradientStop fetch_gradient_stop(int index) { + GradientStop stop; + + ivec2 uv = get_fetch_uv_2(index); + + stop.color = texelFetchOffset(sData32, uv, 0, ivec2(0, 0)); + stop.offset = texelFetchOffset(sData32, uv, 0, ivec2(1, 0)); + + return stop; +} + +struct Glyph { + vec4 offset; + vec4 uv_rect; +}; + +Glyph fetch_glyph(int index) { + Glyph glyph; + + ivec2 uv = get_fetch_uv_2(index); + + glyph.offset = texelFetchOffset(sData32, uv, 0, ivec2(0, 0)); + glyph.uv_rect = texelFetchOffset(sData32, uv, 0, ivec2(1, 0)); + + return glyph; +} + +struct Border { + vec4 style; + vec4 widths; + vec4 colors[4]; + vec4 radii[2]; +}; + +Border fetch_border(int index) { + Border border; + + ivec2 uv = get_fetch_uv_8(index); + + border.style = texelFetchOffset(sData128, uv, 0, ivec2(0, 0)); + border.widths = texelFetchOffset(sData128, uv, 0, ivec2(1, 0)); + border.colors[0] = texelFetchOffset(sData128, uv, 0, ivec2(2, 0)); + border.colors[1] = texelFetchOffset(sData128, uv, 0, ivec2(3, 0)); + border.colors[2] = texelFetchOffset(sData128, uv, 0, ivec2(4, 0)); + border.colors[3] = texelFetchOffset(sData128, uv, 0, ivec2(5, 0)); + border.radii[0] = texelFetchOffset(sData128, uv, 0, ivec2(6, 0)); + border.radii[1] = texelFetchOffset(sData128, uv, 0, ivec2(7, 0)); + + return border; +} + +vec4 fetch_instance_geometry(int index) { + ivec2 uv = get_fetch_uv_1(index); + + vec4 rect = texelFetchOffset(sData16, uv, 0, ivec2(0, 0)); + + return rect; +} + +struct PrimitiveGeometry { + vec4 local_rect; vec4 local_clip_rect; +}; + +PrimitiveGeometry fetch_prim_geometry(int index) { + PrimitiveGeometry pg; + + ivec2 uv = get_fetch_uv(index, VECS_PER_PRIM_GEOM); + + pg.local_rect = texelFetchOffset(sPrimGeometry, uv, 0, ivec2(0, 0)); + pg.local_clip_rect = texelFetchOffset(sPrimGeometry, uv, 0, ivec2(1, 0)); + + return pg; +} + +struct PrimitiveInstance { + int global_prim_index; + int specific_prim_index; + int render_task_index; + int layer_index; + int clip_address; + ivec3 user_data; +}; + +PrimitiveInstance fetch_instance(int index) { + PrimitiveInstance pi; + + int offset = index * 2; + + ivec4 data0 = int_data[offset + 0]; + ivec4 data1 = int_data[offset + 1]; + + pi.global_prim_index = data0.x; + pi.specific_prim_index = data0.y; + pi.render_task_index = data0.z; + pi.layer_index = data0.w; + pi.clip_address = data1.x; + pi.user_data = data1.yzw; + + return pi; +} + +struct Primitive { + Layer layer; + Tile tile; vec4 local_rect; + vec4 local_clip_rect; + int prim_index; + int clip_index; + ivec3 user_data; +}; + +Primitive load_primitive(int index) { + Primitive prim; + + PrimitiveInstance pi = fetch_instance(index); + + prim.layer = fetch_layer(pi.layer_index); + prim.tile = fetch_tile(pi.render_task_index); + + PrimitiveGeometry pg = fetch_prim_geometry(pi.global_prim_index); + prim.local_rect = pg.local_rect; + prim.local_clip_rect = pg.local_clip_rect; + + prim.prim_index = pi.specific_prim_index; + prim.user_data = pi.user_data; + prim.clip_index = pi.clip_address; + + return prim; +} + +struct ClipRect { + vec4 rect; + vec4 dummy; }; -PrimitiveInfo unpack_prim_info(int offset) { - PrimitiveInfo info; +ClipRect fetch_clip_rect(int index) { + ClipRect rect; + + ivec2 uv = get_fetch_uv_2(index); - info.layer_tile = data[offset + 0]; - info.local_clip_rect = data[offset + 1]; - info.local_rect = data[offset + 2]; + rect.rect = texelFetchOffset(sData32, uv, 0, ivec2(0, 0)); + rect.dummy = texelFetchOffset(sData32, uv, 0, ivec2(1, 0)); - return info; + return rect; } struct ClipCorner { @@ -124,31 +308,33 @@ struct ClipCorner { vec4 outer_inner_radius; }; -ClipCorner unpack_clip_corner(int offset) { +ClipCorner fetch_clip_corner(int index) { ClipCorner corner; - corner.rect = data[offset + 0]; - corner.outer_inner_radius = data[offset + 1]; + ivec2 uv = get_fetch_uv_2(index); + + corner.rect = texelFetchOffset(sData32, uv, 0, ivec2(0, 0)); + corner.outer_inner_radius = texelFetchOffset(sData32, uv, 0, ivec2(1, 0)); return corner; } struct Clip { - vec4 rect; + ClipRect rect; ClipCorner top_left; ClipCorner top_right; ClipCorner bottom_left; ClipCorner bottom_right; }; -Clip unpack_clip(int offset) { +Clip fetch_clip(int index) { Clip clip; - clip.rect = data[offset + 0]; - clip.top_left = unpack_clip_corner(offset + 1); - clip.top_right = unpack_clip_corner(offset + 3); - clip.bottom_left = unpack_clip_corner(offset + 5); - clip.bottom_right = unpack_clip_corner(offset + 7); + clip.rect = fetch_clip_rect(index + 0); + clip.top_left = fetch_clip_corner(index + 1); + clip.top_right = fetch_clip_corner(index + 2); + clip.bottom_left = fetch_clip_corner(index + 3); + clip.bottom_right = fetch_clip_corner(index + 4); return clip; } @@ -197,17 +383,17 @@ struct VertexInfo { vec2 global_clamped_pos; }; -VertexInfo write_vertex(PrimitiveInfo info) { - Layer layer = fetch_layer(int(info.layer_tile.x)); - Tile tile = fetch_tile(int(info.layer_tile.y)); - - vec2 p0 = floor(0.5 + info.local_rect.xy * uDevicePixelRatio) / uDevicePixelRatio; - vec2 p1 = floor(0.5 + (info.local_rect.xy + info.local_rect.zw) * uDevicePixelRatio) / uDevicePixelRatio; +VertexInfo write_vertex(vec4 instance_rect, + vec4 local_clip_rect, + Layer layer, + Tile tile) { + vec2 p0 = floor(0.5 + instance_rect.xy * uDevicePixelRatio) / uDevicePixelRatio; + vec2 p1 = floor(0.5 + (instance_rect.xy + instance_rect.zw) * uDevicePixelRatio) / uDevicePixelRatio; vec2 local_pos = mix(p0, p1, aPosition.xy); - vec2 cp0 = floor(0.5 + info.local_clip_rect.xy * uDevicePixelRatio) / uDevicePixelRatio; - vec2 cp1 = floor(0.5 + (info.local_clip_rect.xy + info.local_clip_rect.zw) * uDevicePixelRatio) / uDevicePixelRatio; + vec2 cp0 = floor(0.5 + local_clip_rect.xy * uDevicePixelRatio) / uDevicePixelRatio; + vec2 cp1 = floor(0.5 + (local_clip_rect.xy + local_clip_rect.zw) * uDevicePixelRatio) / uDevicePixelRatio; local_pos = clamp(local_pos, cp0, cp1); local_pos = clamp(local_pos, @@ -239,12 +425,12 @@ struct TransformVertexInfo { vec4 clipped_local_rect; }; -TransformVertexInfo write_transform_vertex(PrimitiveInfo info) { - Layer layer = fetch_layer(int(info.layer_tile.x)); - Tile tile = fetch_tile(int(info.layer_tile.y)); - - vec2 lp0 = info.local_rect.xy; - vec2 lp1 = info.local_rect.xy + info.local_rect.zw; +TransformVertexInfo write_transform_vertex(vec4 instance_rect, + vec4 local_clip_rect, + Layer layer, + Tile tile) { + vec2 lp0 = instance_rect.xy; + vec2 lp1 = instance_rect.xy + instance_rect.zw; lp0 = clamp(lp0, layer.local_clip_rect.xy, @@ -295,241 +481,90 @@ TransformVertexInfo write_transform_vertex(PrimitiveInfo info) { } struct Rectangle { - PrimitiveInfo info; vec4 color; }; Rectangle fetch_rectangle(int index) { Rectangle rect; - int offset = index * 4; + ivec2 uv = get_fetch_uv_1(index); - rect.info = unpack_prim_info(offset); - rect.color = data[offset + 3]; + rect.color = texelFetchOffset(sData16, uv, 0, ivec2(0, 0)); return rect; } -struct RectangleClip { - PrimitiveInfo info; - vec4 color; - Clip clip; -}; - -RectangleClip fetch_rectangle_clip(int index) { - RectangleClip rect; - - int offset = index * 13; - - rect.info = unpack_prim_info(offset); - rect.color = data[offset + 3]; - rect.clip = unpack_clip(offset + 4); - - return rect; -} - -struct Glyph { - PrimitiveInfo info; - vec4 color; - vec4 uv_rect; -}; - -Glyph fetch_glyph(int index) { - Glyph glyph; - - int offset = index * 5; - - glyph.info = unpack_prim_info(offset); - glyph.color = data[offset + 3]; - glyph.uv_rect = data[offset + 4]; - - return glyph; -} - -struct TextRunGlyph { - vec4 local_rect; - vec4 uv_rect; -}; - struct TextRun { - PrimitiveInfo info; vec4 color; - TextRunGlyph glyphs[WR_GLYPHS_PER_TEXT_RUN]; }; -PrimitiveInfo fetch_text_run_glyph(int index, out vec4 color, out vec4 uv_rect) { - int offset = 20 * (index / WR_GLYPHS_PER_TEXT_RUN); - int glyph_index = index % WR_GLYPHS_PER_TEXT_RUN; - int glyph_offset = offset + 4 + 2 * glyph_index; +TextRun fetch_text_run(int index) { + TextRun text; - PrimitiveInfo info; - info.layer_tile = data[offset + 0]; - info.local_clip_rect = data[offset + 1]; - info.local_rect = data[glyph_offset + 0]; + ivec2 uv = get_fetch_uv_1(index); - color = data[offset + 3]; - uv_rect = data[glyph_offset + 1]; + text.color = texelFetchOffset(sData16, uv, 0, ivec2(0, 0)); - return info; + return text; } struct Image { - PrimitiveInfo info; vec4 st_rect; // Location of the image texture in the texture atlas. vec4 stretch_size_and_tile_spacing; // Size of the actual image and amount of space between // tiled instances of this image. - vec4 uvkind; // Type of texture coordinates. + bool has_pixel_coords; }; Image fetch_image(int index) { Image image; - int offset = index * 6; - - image.info = unpack_prim_info(offset); - image.st_rect = data[offset + 3]; - image.stretch_size_and_tile_spacing = data[offset + 4]; - image.uvkind = data[offset + 5]; - - return image; -} - -struct ImageClip { - PrimitiveInfo info; - vec4 st_rect; // Location of the image texture in the texture atlas. - vec4 stretch_size_and_tile_spacing; // Size of the actual image and amount of space between - // tiled instances of this image. - vec4 uvkind; // Type of texture coordinates. - Clip clip; -}; - -ImageClip fetch_image_clip(int index) { - ImageClip image; + ivec2 uv = get_fetch_uv_2(index); - int offset = index * 15; + image.st_rect = texelFetchOffset(sData32, uv, 0, ivec2(0, 0)); + image.stretch_size_and_tile_spacing = texelFetchOffset(sData32, uv, 0, ivec2(1, 0)); - image.info = unpack_prim_info(offset); - image.st_rect = data[offset + 3]; - image.stretch_size_and_tile_spacing = data[offset + 4]; - image.uvkind = data[offset + 5]; - image.clip = unpack_clip(offset + 6); + image.has_pixel_coords = image.st_rect.z < 0.0; + image.st_rect.z = abs(image.st_rect.z); return image; } -struct Border { - PrimitiveInfo info; - vec4 verticalColor; - vec4 horizontalColor; - vec4 radii; - vec4 border_style_trbl; - vec4 part; -}; - -Border fetch_border(int index) { - Border border; - - int offset = index * 8; - - border.info = unpack_prim_info(offset); - border.verticalColor = data[offset + 3]; - border.horizontalColor = data[offset + 4]; - border.radii = data[offset + 5]; - border.border_style_trbl = data[offset + 6]; - border.part = data[offset + 7]; - - return border; -} - struct BoxShadow { - PrimitiveInfo info; + vec4 src_rect; + vec4 bs_rect; vec4 color; vec4 border_radii_blur_radius_inverted; - vec4 bs_rect; - vec4 src_rect; }; BoxShadow fetch_boxshadow(int index) { BoxShadow bs; - int offset = index * 7; + ivec2 uv = get_fetch_uv_4(index); - bs.info = unpack_prim_info(offset); - bs.color = data[offset + 3]; - bs.border_radii_blur_radius_inverted = data[offset + 4]; - bs.bs_rect = data[offset + 5]; - bs.src_rect = data[offset + 6]; + bs.src_rect = texelFetchOffset(sData64, uv, 0, ivec2(0, 0)); + bs.bs_rect = texelFetchOffset(sData64, uv, 0, ivec2(1, 0)); + bs.color = texelFetchOffset(sData64, uv, 0, ivec2(2, 0)); + bs.border_radii_blur_radius_inverted = texelFetchOffset(sData64, uv, 0, ivec2(3, 0)); return bs; } -struct AlignedGradient { - PrimitiveInfo info; - vec4 color0; - vec4 color1; - vec4 dir; - Clip clip; -}; - -AlignedGradient fetch_aligned_gradient(int index) { - AlignedGradient gradient; - - int offset = index * 15; - - gradient.info = unpack_prim_info(offset); - gradient.color0 = data[offset + 3]; - gradient.color1 = data[offset + 4]; - gradient.dir = data[offset + 5]; - gradient.clip = unpack_clip(offset + 6); - - return gradient; -} - -struct AngleGradient { - PrimitiveInfo info; - vec4 start_end_point; - vec4 stop_count; - vec4 colors[MAX_STOPS_PER_ANGLE_GRADIENT]; - vec4 offsets[MAX_STOPS_PER_ANGLE_GRADIENT/4]; -}; - -AngleGradient fetch_angle_gradient(int index) { - AngleGradient gradient; - - int offset = index * 15; - - gradient.info = unpack_prim_info(offset); - gradient.start_end_point = data[offset + 3]; - gradient.stop_count = data[offset + 4]; - - for (int i=0 ; i < MAX_STOPS_PER_ANGLE_GRADIENT ; ++i) { - gradient.colors[i] = data[offset + 5 + i]; - } - - for (int i=0 ; i < MAX_STOPS_PER_ANGLE_GRADIENT/4 ; ++i) { - gradient.offsets[i] = data[offset + 5 + MAX_STOPS_PER_ANGLE_GRADIENT + i]; - } - - return gradient; -} - struct Blend { - vec4 src_id_target_id_opacity; + ivec4 src_id_target_id_opacity; }; Blend fetch_blend(int index) { Blend blend; int offset = index * 1; - - blend.src_id_target_id_opacity = data[offset + 0]; + blend.src_id_target_id_opacity = int_data[offset + 0]; return blend; } struct Composite { - vec4 src0_src1_target_id; - vec4 info_amount; + ivec4 src0_src1_target_id; + ivec4 info_amount; }; Composite fetch_composite(int index) { @@ -537,8 +572,8 @@ Composite fetch_composite(int index) { int offset = index * 2; - composite.src0_src1_target_id = data[offset + 0]; - composite.info_amount = data[offset + 1]; + composite.src0_src1_target_id = int_data[offset + 0]; + composite.info_amount = int_data[offset + 1]; return composite; } diff --git a/resources/shaders/ps_angle_gradient.vs.glsl b/resources/shaders/ps_angle_gradient.vs.glsl index 716997d95ee..eda47f8b219 100644 --- a/resources/shaders/ps_angle_gradient.vs.glsl +++ b/resources/shaders/ps_angle_gradient.vs.glsl @@ -4,10 +4,15 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ void main(void) { - AngleGradient gradient = fetch_angle_gradient(gl_InstanceID); - VertexInfo vi = write_vertex(gradient.info); + Primitive prim = load_primitive(gl_InstanceID); + Gradient gradient = fetch_gradient(prim.prim_index); - vStopCount = int(gradient.stop_count.x); + VertexInfo vi = write_vertex(prim.local_rect, + prim.local_clip_rect, + prim.layer, + prim.tile); + + vStopCount = int(prim.user_data.y); vPos = vi.local_clamped_pos; // Snap the start/end points to device pixel units. @@ -19,8 +24,11 @@ void main(void) { vStartPoint = floor(0.5 + gradient.start_end_point.xy * uDevicePixelRatio) / uDevicePixelRatio; vEndPoint = floor(0.5 + gradient.start_end_point.zw * uDevicePixelRatio) / uDevicePixelRatio; - for (int i=0 ; i < int(gradient.stop_count.x) ; ++i) { - vColors[i] = gradient.colors[i]; - vOffsets[i] = gradient.offsets[i]; + int stop_index = int(prim.user_data.x); + + for (int i=0 ; i < vStopCount ; ++i) { + GradientStop stop = fetch_gradient_stop(stop_index + i); + vColors[i] = stop.color; + vOffsets[i/4][i%4] = stop.offset.x; } } diff --git a/resources/shaders/ps_blend.vs.glsl b/resources/shaders/ps_blend.vs.glsl index 05d46860d99..7dc2b9e3839 100644 --- a/resources/shaders/ps_blend.vs.glsl +++ b/resources/shaders/ps_blend.vs.glsl @@ -5,8 +5,8 @@ void main(void) { Blend blend = fetch_blend(gl_InstanceID); - Tile src = fetch_tile(int(blend.src_id_target_id_opacity.x)); - Tile dest = fetch_tile(int(blend.src_id_target_id_opacity.y)); + Tile src = fetch_tile(blend.src_id_target_id_opacity.x); + Tile dest = fetch_tile(blend.src_id_target_id_opacity.y); vec2 local_pos = mix(vec2(dest.target_rect.xy), vec2(dest.target_rect.xy + dest.target_rect.zw), @@ -15,7 +15,7 @@ void main(void) { vec2 st0 = vec2(src.target_rect.xy) / 2048.0; vec2 st1 = vec2(src.target_rect.xy + src.target_rect.zw) / 2048.0; vUv = mix(st0, st1, aPosition.xy); - vBrightnessOpacity = blend.src_id_target_id_opacity.zw; + vBrightnessOpacity = blend.src_id_target_id_opacity.zw / 65535.0; gl_Position = uTransform * vec4(local_pos, 0, 1); } diff --git a/resources/shaders/ps_border.glsl b/resources/shaders/ps_border.glsl index d46b72eed49..0047041205d 100644 --- a/resources/shaders/ps_border.glsl +++ b/resources/shaders/ps_border.glsl @@ -13,8 +13,8 @@ flat varying vec4 vLocalRect; // The rect of the border (x, y, w, h) in local sp // for corners, this is the beginning of the corner. // For the lines, this is the top left of the line. flat varying vec2 vRefPoint; -flat varying uint vBorderStyle; -flat varying uint vBorderPart; // Which part of the border we're drawing. +flat varying int vBorderStyle; +flat varying int vBorderPart; // Which part of the border we're drawing. flat varying vec4 vPieceRect; @@ -28,6 +28,4 @@ varying vec2 vLocalPos; // The clamped position in local space. // These two are interpolated varying float vDistanceFromMixLine; // This is the distance from the line where two colors // meet in border corners. -varying vec2 vDevicePos; // The clamped position in device space. -flat varying vec4 vBorders; // the rect of the border in (x, y, width, height) form #endif diff --git a/resources/shaders/ps_border.vs.glsl b/resources/shaders/ps_border.vs.glsl index 4d9e035ec74..b20fc11662e 100644 --- a/resources/shaders/ps_border.vs.glsl +++ b/resources/shaders/ps_border.vs.glsl @@ -3,101 +3,205 @@ * 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/. */ -float get_border_style(Border a_border, uint a_edge) { - switch (a_edge) { - case PST_TOP: - case PST_TOP_LEFT: - return a_border.border_style_trbl.x; - case PST_BOTTOM_LEFT: - case PST_LEFT: - return a_border.border_style_trbl.z; - case PST_BOTTOM_RIGHT: - case PST_BOTTOM: - return a_border.border_style_trbl.w; - case PST_TOP_RIGHT: - case PST_RIGHT: - return a_border.border_style_trbl.y; - } -} - void main(void) { - Border border = fetch_border(gl_InstanceID); + Primitive prim = load_primitive(gl_InstanceID); + Border border = fetch_border(prim.prim_index); + + vec2 tl_outer = prim.local_rect.xy; + vec2 tl_inner = tl_outer + vec2(max(border.radii[0].x, border.widths.x), + max(border.radii[0].y, border.widths.y)); + + vec2 tr_outer = vec2(prim.local_rect.x + prim.local_rect.z, + prim.local_rect.y); + vec2 tr_inner = tr_outer + vec2(-max(border.radii[0].z, border.widths.z), + max(border.radii[0].w, border.widths.y)); + + vec2 br_outer = vec2(prim.local_rect.x + prim.local_rect.z, + prim.local_rect.y + prim.local_rect.w); + vec2 br_inner = br_outer - vec2(max(border.radii[1].x, border.widths.z), + max(border.radii[1].y, border.widths.w)); + + vec2 bl_outer = vec2(prim.local_rect.x, + prim.local_rect.y + prim.local_rect.w); + vec2 bl_inner = bl_outer + vec2(max(border.radii[1].z, border.widths.x), + -max(border.radii[1].w, border.widths.w)); + + vec4 segment_rect; + switch (prim.user_data.x) { + case PST_TOP_LEFT: + segment_rect = vec4(tl_outer, tl_inner - tl_outer); + break; + case PST_TOP_RIGHT: + segment_rect = vec4(tr_inner.x, + tr_outer.y, + tr_outer.x - tr_inner.x, + tr_inner.y - tr_outer.y); + break; + case PST_BOTTOM_RIGHT: + segment_rect = vec4(br_inner, br_outer - br_inner); + break; + case PST_BOTTOM_LEFT: + segment_rect = vec4(bl_outer.x, + bl_inner.y, + bl_inner.x - bl_outer.x, + bl_outer.y - bl_inner.y); + break; + case PST_LEFT: + segment_rect = vec4(tl_outer.x, + tl_inner.y, + border.widths.x, + bl_inner.y - tl_inner.y); + break; + case PST_RIGHT: + segment_rect = vec4(tr_outer.x - border.widths.z, + tr_inner.y, + border.widths.z, + br_inner.y - tr_inner.y); + break; + case PST_BOTTOM: + segment_rect = vec4(bl_inner.x, + bl_outer.y - border.widths.w, + br_inner.x - bl_inner.x, + border.widths.w); + break; + case PST_TOP: + segment_rect = vec4(tl_inner.x, + tl_outer.y, + tr_inner.x - tl_inner.x, + border.widths.y); + break; + } + #ifdef WR_FEATURE_TRANSFORM - TransformVertexInfo vi = write_transform_vertex(border.info); + TransformVertexInfo vi = write_transform_vertex(segment_rect, + prim.local_clip_rect, + prim.layer, + prim.tile); vLocalPos = vi.local_pos; // Local space vLocalRect = vi.clipped_local_rect; #else - VertexInfo vi = write_vertex(border.info); + VertexInfo vi = write_vertex(segment_rect, + prim.local_clip_rect, + prim.layer, + prim.tile); vLocalPos = vi.local_clamped_pos.xy; // Local space - vLocalRect = border.info.local_rect; + vLocalRect = prim.local_rect; #endif - // This is what was currently sent. - vVerticalColor = border.verticalColor; - vHorizontalColor = border.horizontalColor; + float x0, y0, x1, y1; + int sub_part = prim.user_data.x; - // Just our boring radius position. - vRadii = border.radii; + switch (sub_part) { + case PST_LEFT: + vBorderStyle = int(border.style.x); + vHorizontalColor = border.colors[BORDER_LEFT]; + vVerticalColor = border.colors[BORDER_LEFT]; + vRadii = vec4(0.0); + break; + case PST_TOP_LEFT: + vBorderStyle = int(border.style.x); + vHorizontalColor = border.colors[BORDER_LEFT]; + vVerticalColor = border.colors[BORDER_TOP]; + vRadii = vec4(border.radii[0].xy, + border.radii[0].xy - border.widths.xy); + break; + case PST_TOP: + vBorderStyle = int(border.style.y); + vHorizontalColor = border.colors[BORDER_TOP]; + vVerticalColor = border.colors[BORDER_TOP]; + vRadii = vec4(0.0); + break; + case PST_TOP_RIGHT: + vBorderStyle = int(border.style.y); + vHorizontalColor = border.colors[BORDER_TOP]; + vVerticalColor = border.colors[BORDER_RIGHT]; + vRadii = vec4(border.radii[0].zw, + border.radii[0].zw - border.widths.zy); + break; + case PST_RIGHT: + vBorderStyle = int(border.style.z); + vHorizontalColor = border.colors[BORDER_RIGHT]; + vVerticalColor = border.colors[BORDER_RIGHT]; + vRadii = vec4(0.0); + break; + case PST_BOTTOM_RIGHT: + vBorderStyle = int(border.style.z); + vHorizontalColor = border.colors[BORDER_BOTTOM]; + vVerticalColor = border.colors[BORDER_RIGHT]; + vRadii = vec4(border.radii[1].xy, + border.radii[1].xy - border.widths.zw); + break; + case PST_BOTTOM: + vBorderStyle = int(border.style.w); + vHorizontalColor = border.colors[BORDER_BOTTOM]; + vVerticalColor = border.colors[BORDER_BOTTOM]; + vRadii = vec4(0.0); + break; + case PST_BOTTOM_LEFT: + vBorderStyle = int(border.style.w); + vHorizontalColor = border.colors[BORDER_BOTTOM]; + vVerticalColor = border.colors[BORDER_LEFT]; + vRadii = vec4(border.radii[1].zw, + border.radii[1].zw - border.widths.xw); + break; + } - float x0, y0, x1, y1; - vBorderPart = uint(border.part.x); - switch (vBorderPart) { + switch (sub_part) { // These are the layer tile part PrimitivePart as uploaded by the tiling.rs case PST_TOP_LEFT: - x0 = border.info.local_rect.x; - y0 = border.info.local_rect.y; + x0 = segment_rect.x; + y0 = segment_rect.y; // These are width / heights - x1 = border.info.local_rect.x + border.info.local_rect.z; - y1 = border.info.local_rect.y + border.info.local_rect.w; + x1 = segment_rect.x + segment_rect.z; + y1 = segment_rect.y + segment_rect.w; // The radius here is the border-radius. This is 0, so vRefPoint will // just be the top left (x,y) corner. vRefPoint = vec2(x0, y0) + vRadii.xy; break; case PST_TOP_RIGHT: - x0 = border.info.local_rect.x + border.info.local_rect.z; - y0 = border.info.local_rect.y; - x1 = border.info.local_rect.x; - y1 = border.info.local_rect.y + border.info.local_rect.w; + x0 = segment_rect.x + segment_rect.z; + y0 = segment_rect.y; + x1 = segment_rect.x; + y1 = segment_rect.y + segment_rect.w; vRefPoint = vec2(x0, y0) + vec2(-vRadii.x, vRadii.y); break; case PST_BOTTOM_LEFT: - x0 = border.info.local_rect.x; - y0 = border.info.local_rect.y + border.info.local_rect.w; - x1 = border.info.local_rect.x + border.info.local_rect.z; - y1 = border.info.local_rect.y; + x0 = segment_rect.x; + y0 = segment_rect.y + segment_rect.w; + x1 = segment_rect.x + segment_rect.z; + y1 = segment_rect.y; vRefPoint = vec2(x0, y0) + vec2(vRadii.x, -vRadii.y); break; case PST_BOTTOM_RIGHT: - x0 = border.info.local_rect.x; - y0 = border.info.local_rect.y; - x1 = border.info.local_rect.x + border.info.local_rect.z; - y1 = border.info.local_rect.y + border.info.local_rect.w; + x0 = segment_rect.x; + y0 = segment_rect.y; + x1 = segment_rect.x + segment_rect.z; + y1 = segment_rect.y + segment_rect.w; vRefPoint = vec2(x1, y1) + vec2(-vRadii.x, -vRadii.y); break; case PST_TOP: case PST_LEFT: case PST_BOTTOM: case PST_RIGHT: - vRefPoint = border.info.local_rect.xy; - x0 = border.info.local_rect.x; - y0 = border.info.local_rect.y; - x1 = border.info.local_rect.x + border.info.local_rect.z; - y1 = border.info.local_rect.y + border.info.local_rect.w; + vRefPoint = segment_rect.xy; + x0 = segment_rect.x; + y0 = segment_rect.y; + x1 = segment_rect.x + segment_rect.z; + y1 = segment_rect.y + segment_rect.w; break; } - vBorderStyle = uint(get_border_style(border, vBorderPart)); - // y1 - y0 is the height of the corner / line // x1 - x0 is the width of the corner / line. float width = x1 - x0; float height = y1 - y0; + vBorderPart = sub_part; vPieceRect = vec4(x0, y0, width, height); // The fragment shader needs to calculate the distance from the bisecting line @@ -109,11 +213,5 @@ void main(void) { #else vDistanceFromMixLine = (vi.local_clamped_pos.x - x0) * height - (vi.local_clamped_pos.y - y0) * width; - - // These are in device space - vDevicePos = vi.global_clamped_pos; - - // These are in device space - vBorders = border.info.local_rect * uDevicePixelRatio; #endif } diff --git a/resources/shaders/ps_box_shadow.vs.glsl b/resources/shaders/ps_box_shadow.vs.glsl index e501548f87a..e863ab0a8fc 100644 --- a/resources/shaders/ps_box_shadow.vs.glsl +++ b/resources/shaders/ps_box_shadow.vs.glsl @@ -4,8 +4,14 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ void main(void) { - BoxShadow bs = fetch_boxshadow(gl_InstanceID); - VertexInfo vi = write_vertex(bs.info); + Primitive prim = load_primitive(gl_InstanceID); + BoxShadow bs = fetch_boxshadow(prim.prim_index); + vec4 segment_rect = fetch_instance_geometry(prim.user_data.x + prim.user_data.y); + + VertexInfo vi = write_vertex(segment_rect, + prim.local_clip_rect, + prim.layer, + prim.tile); vPos = vi.local_clamped_pos; vColor = bs.color; diff --git a/resources/shaders/ps_composite.vs.glsl b/resources/shaders/ps_composite.vs.glsl index 115a7532be9..3d2beadaf56 100644 --- a/resources/shaders/ps_composite.vs.glsl +++ b/resources/shaders/ps_composite.vs.glsl @@ -5,9 +5,9 @@ void main(void) { Composite composite = fetch_composite(gl_InstanceID); - Tile src0 = fetch_tile(int(composite.src0_src1_target_id.x)); - Tile src1 = fetch_tile(int(composite.src0_src1_target_id.y)); - Tile dest = fetch_tile(int(composite.src0_src1_target_id.z)); + Tile src0 = fetch_tile(composite.src0_src1_target_id.x); + Tile src1 = fetch_tile(composite.src0_src1_target_id.y); + Tile dest = fetch_tile(composite.src0_src1_target_id.z); vec2 local_pos = mix(vec2(dest.target_rect.xy), vec2(dest.target_rect.xy + dest.target_rect.zw), @@ -21,8 +21,8 @@ void main(void) { st1 = vec2(src1.target_rect.xy + src1.target_rect.zw) / 2048.0; vUv1 = mix(st0, st1, aPosition.xy); - vInfo = ivec2(composite.info_amount.xy); - vAmount = composite.info_amount.z; + vInfo = composite.info_amount.xy; + vAmount = composite.info_amount.z / 65535.0; gl_Position = uTransform * vec4(local_pos, 0, 1); } diff --git a/resources/shaders/ps_gradient_clip.fs.glsl b/resources/shaders/ps_gradient_clip.fs.glsl index f22194261cb..b36e93083b1 100644 --- a/resources/shaders/ps_gradient_clip.fs.glsl +++ b/resources/shaders/ps_gradient_clip.fs.glsl @@ -12,7 +12,7 @@ void main(void) { #endif alpha = min(alpha, do_clip(local_pos)); - oFragColor = mix(vColor0, vColor1, vF) * vec4(1, 1, 1, alpha); + oFragColor = vColor * vec4(1, 1, 1, alpha); #ifdef WR_FEATURE_TRANSFORM oFragColor.a *= alpha; diff --git a/resources/shaders/ps_gradient_clip.glsl b/resources/shaders/ps_gradient_clip.glsl index 160d506ce99..e1d18453633 100644 --- a/resources/shaders/ps_gradient_clip.glsl +++ b/resources/shaders/ps_gradient_clip.glsl @@ -2,9 +2,7 @@ * 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/. */ -flat varying vec4 vColor0; -flat varying vec4 vColor1; -varying float vF; +varying vec4 vColor; #ifdef WR_FEATURE_TRANSFORM varying vec3 vLocalPos; diff --git a/resources/shaders/ps_gradient_clip.vs.glsl b/resources/shaders/ps_gradient_clip.vs.glsl index e4bbeaf8436..e24c9837e9a 100644 --- a/resources/shaders/ps_gradient_clip.vs.glsl +++ b/resources/shaders/ps_gradient_clip.vs.glsl @@ -3,34 +3,70 @@ * 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/. */ -#define DIR_HORIZONTAL uint(0) -#define DIR_VERTICAL uint(1) - void main(void) { - AlignedGradient gradient = fetch_aligned_gradient(gl_InstanceID); + 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(gradient.info); + 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 - gradient.info.local_rect.xy) / gradient.info.local_rect.zw; + vec2 f = (vi.local_pos.xy - prim.local_rect.xy) / prim.local_rect.zw; #else - VertexInfo vi = write_vertex(gradient.info); - vec2 f = (vi.local_clamped_pos - gradient.info.local_rect.xy) / gradient.info.local_rect.zw; + 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 (uint(gradient.dir.x)) { - case DIR_HORIZONTAL: - vF = f.x; + switch (int(gradient.kind.x)) { + case GRADIENT_HORIZONTAL: + vColor = mix(g0.color, g1.color, f.x); break; - case DIR_VERTICAL: - vF = f.y; + 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; } - write_clip(gradient.clip); - - vColor0 = gradient.color0; - vColor1 = gradient.color1; + Clip clip = fetch_clip(prim.clip_index); + write_clip(clip); } diff --git a/resources/shaders/ps_image.vs.glsl b/resources/shaders/ps_image.vs.glsl index 1f5a997b0af..cb0500583a6 100644 --- a/resources/shaders/ps_image.vs.glsl +++ b/resources/shaders/ps_image.vs.glsl @@ -4,16 +4,21 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ void main(void) { - Image image = fetch_image(gl_InstanceID); + Primitive prim = load_primitive(gl_InstanceID); + Image image = fetch_image(prim.prim_index); #ifdef WR_FEATURE_TRANSFORM - TransformVertexInfo vi = write_transform_vertex(image.info); + TransformVertexInfo vi = write_transform_vertex(prim.local_rect, + prim.local_clip_rect, + prim.layer, + prim.tile); vLocalRect = vi.clipped_local_rect; vLocalPos = vi.local_pos; - vStretchSize = image.stretch_size_and_tile_spacing.xy; #else - VertexInfo vi = write_vertex(image.info); - vStretchSize = image.stretch_size_and_tile_spacing.xy; + VertexInfo vi = write_vertex(prim.local_rect, + prim.local_clip_rect, + prim.layer, + prim.tile); vLocalPos = vi.local_clamped_pos - vi.local_rect.p0; #endif @@ -21,18 +26,14 @@ void main(void) { vec2 st0 = image.st_rect.xy; vec2 st1 = image.st_rect.zw; - switch (uint(image.uvkind.x)) { - case UV_NORMALIZED: - break; - case UV_PIXEL: { - vec2 texture_size = vec2(textureSize(sDiffuse, 0)); - st0 /= texture_size; - st1 /= texture_size; - } - break; + if (image.has_pixel_coords) { + vec2 texture_size = vec2(textureSize(sDiffuse, 0)); + st0 /= texture_size; + st1 /= texture_size; } vTextureSize = st1 - st0; vTextureOffset = st0; vTileSpacing = image.stretch_size_and_tile_spacing.zw; + vStretchSize = image.stretch_size_and_tile_spacing.xy; } diff --git a/resources/shaders/ps_image_clip.glsl b/resources/shaders/ps_image_clip.glsl index 02c4ff78504..20c0343182e 100644 --- a/resources/shaders/ps_image_clip.glsl +++ b/resources/shaders/ps_image_clip.glsl @@ -1,3 +1,4 @@ +#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/. */ diff --git a/resources/shaders/ps_image_clip.vs.glsl b/resources/shaders/ps_image_clip.vs.glsl index 6a12546ee1a..cac9591d94c 100644 --- a/resources/shaders/ps_image_clip.vs.glsl +++ b/resources/shaders/ps_image_clip.vs.glsl @@ -4,35 +4,40 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ void main(void) { - ImageClip image = fetch_image_clip(gl_InstanceID); + Primitive prim = load_primitive(gl_InstanceID); + Image image = fetch_image(prim.prim_index); #ifdef WR_FEATURE_TRANSFORM - TransformVertexInfo vi = write_transform_vertex(image.info); + TransformVertexInfo vi = write_transform_vertex(prim.local_rect, + prim.local_clip_rect, + prim.layer, + prim.tile); + vLocalRect = vi.clipped_local_rect; vLocalPos = vi.local_pos; #else - VertexInfo vi = write_vertex(image.info); + VertexInfo vi = write_vertex(prim.local_rect, + prim.local_clip_rect, + prim.layer, + prim.tile); + vLocalRect = prim.local_rect; vLocalPos = vi.local_clamped_pos; - vLocalRect = image.info.local_rect; #endif - write_clip(image.clip); + Clip clip = fetch_clip(prim.clip_index); + write_clip(clip); + // vUv will contain how many times this image has wrapped around the image size. vec2 st0 = image.st_rect.xy; vec2 st1 = image.st_rect.zw; - switch (uint(image.uvkind.x)) { - case UV_NORMALIZED: - break; - case UV_PIXEL: { - vec2 texture_size = vec2(textureSize(sDiffuse, 0)); - st0 /= texture_size; - st1 /= texture_size; - } - break; + if (image.has_pixel_coords) { + vec2 texture_size = vec2(textureSize(sDiffuse, 0)); + st0 /= texture_size; + st1 /= texture_size; } vTextureSize = st1 - st0; vTextureOffset = st0; - vStretchSize = image.stretch_size_and_tile_spacing.xy; vTileSpacing = image.stretch_size_and_tile_spacing.zw; + vStretchSize = image.stretch_size_and_tile_spacing.xy; } diff --git a/resources/shaders/ps_rectangle.vs.glsl b/resources/shaders/ps_rectangle.vs.glsl index ba5ccbb69d5..0c886b6fc4e 100644 --- a/resources/shaders/ps_rectangle.vs.glsl +++ b/resources/shaders/ps_rectangle.vs.glsl @@ -4,13 +4,20 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ void main(void) { - Rectangle rect = fetch_rectangle(gl_InstanceID); + Primitive prim = load_primitive(gl_InstanceID); + Rectangle rect = fetch_rectangle(prim.prim_index); vColor = rect.color; #ifdef WR_FEATURE_TRANSFORM - TransformVertexInfo vi = write_transform_vertex(rect.info); + TransformVertexInfo vi = write_transform_vertex(prim.local_rect, + prim.local_clip_rect, + prim.layer, + prim.tile); vLocalRect = vi.clipped_local_rect; vLocalPos = vi.local_pos; #else - write_vertex(rect.info); + write_vertex(prim.local_rect, + prim.local_clip_rect, + prim.layer, + prim.tile); #endif } diff --git a/resources/shaders/ps_rectangle_clip.vs.glsl b/resources/shaders/ps_rectangle_clip.vs.glsl index 90bb0ee4f50..7f58e829022 100644 --- a/resources/shaders/ps_rectangle_clip.vs.glsl +++ b/resources/shaders/ps_rectangle_clip.vs.glsl @@ -4,18 +4,24 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ void main(void) { - RectangleClip rect = fetch_rectangle_clip(gl_InstanceID); - + Primitive prim = load_primitive(gl_InstanceID); + Rectangle rect = fetch_rectangle(prim.prim_index); + vColor = rect.color; #ifdef WR_FEATURE_TRANSFORM - TransformVertexInfo vi = write_transform_vertex(rect.info); - vPos = vi.local_pos; + TransformVertexInfo vi = write_transform_vertex(prim.local_rect, + prim.local_clip_rect, + prim.layer, + prim.tile); vLocalRect = vi.clipped_local_rect; + vPos = vi.local_pos; #else - VertexInfo vi = write_vertex(rect.info); + VertexInfo vi = write_vertex(prim.local_rect, + prim.local_clip_rect, + prim.layer, + prim.tile); vPos = vi.local_clamped_pos; #endif - write_clip(rect.clip); - - vColor = rect.color; + Clip clip = fetch_clip(prim.clip_index); + write_clip(clip); } diff --git a/resources/shaders/ps_text_run.vs.glsl b/resources/shaders/ps_text_run.vs.glsl index 1c229d6f37a..c296073f048 100644 --- a/resources/shaders/ps_text_run.vs.glsl +++ b/resources/shaders/ps_text_run.vs.glsl @@ -4,23 +4,31 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ void main(void) { - vec4 color, uv_rect; - PrimitiveInfo info = fetch_text_run_glyph(gl_InstanceID, color, uv_rect); + Primitive prim = load_primitive(gl_InstanceID); + TextRun text = fetch_text_run(prim.prim_index); + Glyph glyph = fetch_glyph(prim.user_data.x + prim.user_data.y); + vec4 local_rect = vec4(glyph.offset.xy, (glyph.uv_rect.zw - glyph.uv_rect.xy) / uDevicePixelRatio); #ifdef WR_FEATURE_TRANSFORM - TransformVertexInfo vi = write_transform_vertex(info); + TransformVertexInfo vi = write_transform_vertex(local_rect, + prim.local_clip_rect, + prim.layer, + prim.tile); vLocalRect = vi.clipped_local_rect; vLocalPos = vi.local_pos; - vec2 f = (vi.local_pos.xy - info.local_rect.xy) / info.local_rect.zw; + vec2 f = (vi.local_pos.xy - prim.local_rect.xy) / prim.local_rect.zw; #else - VertexInfo vi = write_vertex(info); + VertexInfo vi = write_vertex(local_rect, + prim.local_clip_rect, + prim.layer, + prim.tile); vec2 f = (vi.local_clamped_pos - vi.local_rect.p0) / (vi.local_rect.p1 - vi.local_rect.p0); #endif vec2 texture_size = vec2(textureSize(sDiffuse, 0)); - vec2 st0 = uv_rect.xy / texture_size; - vec2 st1 = uv_rect.zw / texture_size; + vec2 st0 = glyph.uv_rect.xy / texture_size; + vec2 st1 = glyph.uv_rect.zw / texture_size; - vColor = color; + vColor = text.color; vUv = mix(st0, st1, f); } diff --git a/tests/wpt/metadata-css/filters-1_dev/html/filter-contrast-003.htm.ini b/tests/wpt/metadata-css/filters-1_dev/html/filter-contrast-003.htm.ini deleted file mode 100644 index 2d2f45594ad..00000000000 --- a/tests/wpt/metadata-css/filters-1_dev/html/filter-contrast-003.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[filter-contrast-003.htm] - type: testharness - expected: FAIL |