servo: Merge #12832 - Copy updated WR shaders (from glennw:copy-shaders); r=glennw
authorGlenn Watson <gw@intuitionlibrary.com>
Fri, 12 Aug 2016 16:23:34 -0500
changeset 339482 84d0d7bb83813fbd1763fbae1d73fbdefd9f1cc7
parent 339481 e5a914814ebf8b46c6f483035a2885ac757e3008
child 339483 6cb5c20d54c738bfcc984f20373981ee792eca18
push id31307
push usergszorc@mozilla.com
push dateSat, 04 Feb 2017 00:59:06 +0000
treeherdermozilla-central@94079d43835f [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersglennw
servo: Merge #12832 - Copy updated WR shaders (from glennw:copy-shaders); r=glennw <!-- Please describe your changes on the following line: --> --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [ ] `./mach build -d` does not report any errors - [ ] `./mach test-tidy` does not report any errors - [ ] These changes fix #__ (github issue number if applicable). <!-- Either: --> - [ ] There are tests for these changes OR - [ ] These changes do not require tests because _____ <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> Source-Repo: https://github.com/servo/servo Source-Revision: 43c09d14d820f84beb4c2701b2706196e57e389f
servo/resources/shaders/prim_shared.glsl
servo/resources/shaders/ps_image.fs.glsl
servo/resources/shaders/ps_image.glsl
servo/resources/shaders/ps_image.vs.glsl
servo/resources/shaders/ps_rectangle.fs.glsl
servo/resources/shaders/ps_rectangle.glsl
servo/resources/shaders/ps_rectangle.vs.glsl
--- a/servo/resources/shaders/prim_shared.glsl
+++ b/servo/resources/shaders/prim_shared.glsl
@@ -213,25 +213,26 @@ void do_clip(vec2 pos, vec4 clip_rect, v
     bool out3 = pos.x < ref_bl.x && pos.y > ref_bl.y && d_bl > radius.w;
 
     // TODO(gw): Alpha anti-aliasing based on edge distance!
     if (out0 || out1 || out2 || out3) {
         discard;
     }
 }
 
-bool point_in_rect(vec2 p, vec2 p0, vec2 p1) {
-    return p.x >= p0.x &&
-           p.y >= p0.y &&
-           p.x <= p1.x &&
-           p.y <= p1.y;
+float squared_distance_from_rect(vec2 p, vec2 origin, vec2 size) {
+    vec2 clamped = clamp(p, origin, origin + size);
+    return distance(clamped, p);
 }
 
-vec2 init_transform_fs(vec3 local_pos, vec4 local_rect) {
+vec2 init_transform_fs(vec3 local_pos, vec4 local_rect, out float fragment_alpha) {
+    fragment_alpha = 1.0;
     vec2 pos = local_pos.xy / local_pos.z;
 
-    if (!point_in_rect(pos, local_rect.xy, local_rect.xy + local_rect.zw)) {
-        discard;
+    float squared_distance = squared_distance_from_rect(pos, local_rect.xy, local_rect.zw);
+    if (squared_distance != 0) {
+        float delta = length(fwidth(local_pos.xy));
+        fragment_alpha = smoothstep(1.0, 0.0, squared_distance / delta * 2);
     }
 
     return pos;
 }
 #endif
--- a/servo/resources/shaders/ps_image.fs.glsl
+++ b/servo/resources/shaders/ps_image.fs.glsl
@@ -1,8 +1,21 @@
+#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) {
-    vec2 st = vTextureOffset + vTextureSize * fract(vUv);
+#ifdef WR_FEATURE_TRANSFORM
+    float alpha = 0;
+    vec2 pos = init_transform_fs(vLocalPos, vLocalRect, alpha);
+    vec2 uv = (pos - vLocalRect.xy) / vStretchSize;
+#else
+    vec2 uv = vUv;
+#endif
+    vec2 st = vTextureOffset + vTextureSize * fract(uv);
+#ifdef WR_FEATURE_TRANSFORM
+    oFragColor = vec4(1, 1, 1, alpha) * texture(sDiffuse, st);
+#else
     oFragColor = texture(sDiffuse, st);
+#endif
 }
--- a/servo/resources/shaders/ps_image.glsl
+++ b/servo/resources/shaders/ps_image.glsl
@@ -1,7 +1,14 @@
 /* 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 vec2 vUv;                 // Location within the CSS box to draw.
 flat varying vec2 vTextureOffset; // Offset of this image into the texture atlas.
 flat varying vec2 vTextureSize;   // Size of the image in the texture atlas.
+
+#ifdef WR_FEATURE_TRANSFORM
+varying vec3 vLocalPos;
+flat varying vec4 vLocalRect;
+flat varying vec2 vStretchSize;
+#else
+varying vec2 vUv;                 // Location within the CSS box to draw.
+#endif
--- a/servo/resources/shaders/ps_image.vs.glsl
+++ b/servo/resources/shaders/ps_image.vs.glsl
@@ -10,15 +10,23 @@ struct Image {
 };
 
 layout(std140) uniform Items {
     Image images[WR_MAX_PRIM_ITEMS];
 };
 
 void main(void) {
     Image image = images[gl_InstanceID];
+
+#ifdef WR_FEATURE_TRANSFORM
+    TransformVertexInfo vi = write_transform_vertex(image.info);
+    vLocalRect = image.info.local_rect;
+    vLocalPos = vi.local_pos;
+    vStretchSize = image.stretch_size.xy;
+#else
     VertexInfo vi = write_vertex(image.info);
+    vUv = (vi.local_clamped_pos - vi.local_rect.p0) / image.stretch_size.xy;
+#endif
 
     // vUv will contain how many times this image has wrapped around the image size.
-    vUv = (vi.local_clamped_pos - vi.local_rect.p0) / image.stretch_size.xy;
     vTextureSize = image.st_rect.zw - image.st_rect.xy;
     vTextureOffset = image.st_rect.xy;
 }
--- a/servo/resources/shaders/ps_rectangle.fs.glsl
+++ b/servo/resources/shaders/ps_rectangle.fs.glsl
@@ -1,7 +1,13 @@
 /* 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;
+    init_transform_fs(vLocalPos, vLocalRect, alpha);
+    oFragColor = vec4(1, 1, 1, alpha) * vColor;
+#else
     oFragColor = vColor;
+#endif
 }
--- a/servo/resources/shaders/ps_rectangle.glsl
+++ b/servo/resources/shaders/ps_rectangle.glsl
@@ -1,5 +1,10 @@
 /* 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;
+#endif
--- a/servo/resources/shaders/ps_rectangle.vs.glsl
+++ b/servo/resources/shaders/ps_rectangle.vs.glsl
@@ -9,11 +9,17 @@ struct Rectangle {
 };
 
 layout(std140) uniform Items {
     Rectangle rects[WR_MAX_PRIM_ITEMS];
 };
 
 void main(void) {
     Rectangle rect = rects[gl_InstanceID];
+    vColor = rect.color;
+#ifdef WR_FEATURE_TRANSFORM
+    TransformVertexInfo vi = write_transform_vertex(rect.info);
+    vLocalRect = rect.info.local_rect;
+    vLocalPos = vi.local_pos;
+#else
     write_vertex(rect.info);
-    vColor = rect.color;
+#endif
 }