66#include < impeller/ types.glsl>
77
88uniform FragInfo {
9- f16vec4 color;
10- f16vec2 rect_size ;
11- float16_t blur_sigma ;
12- float16_t corner_radius;
9+ vec4 color;
10+ float blur_sigma ;
11+ vec2 rect_size ;
12+ float corner_radius;
1313}
1414frag_info;
1515
16- in f16vec2 v_position;
16+ in vec2 v_position;
1717
18- out f16vec4 frag_color;
18+ out vec4 frag_color;
1919
2020const int kSampleCount = 4 ;
2121
22- float16_t RRectDistance(f16vec2 sample_position, f16vec2 half_size) {
23- f16vec2 space = abs (sample_position) - half_size + frag_info.corner_radius;
24- return length (max (space, float16_t( 0 .0hf))) +
25- min ( max (space.x, space.y), float16_t( 0 .0hf)) - frag_info.corner_radius;
22+ float RRectDistance(vec2 sample_position, vec2 half_size) {
23+ vec2 space = abs (sample_position) - half_size + frag_info.corner_radius;
24+ return length (max (space, 0.0 )) + min ( max (space.x, space.y), 0.0 ) -
25+ frag_info.corner_radius;
2626}
2727
2828// / Closed form unidirectional rounded rect blur mask solution using the
2929// / analytical Gaussian integral (with approximated erf).
30- float16_t RRectShadowX(f16vec2 sample_position, f16vec2 half_size) {
30+ float RRectShadowX(vec2 sample_position, vec2 half_size) {
3131 // Compute the X direction distance field (not incorporating the Y distance)
3232 // for the rounded rect.
33- float16_t space =
34- min (float16_t(0 .0hf),
35- half_size.y - frag_info.corner_radius - abs (sample_position.y));
36- float16_t rrect_distance =
33+ float space =
34+ min (0 , half_size.y - frag_info.corner_radius - abs (sample_position.y));
35+ float rrect_distance =
3736 half_size.x - frag_info.corner_radius +
38- sqrt (max (
39- float16_t(0 .0hf),
40- frag_info.corner_radius * frag_info.corner_radius - space * space));
37+ sqrt (max (0 , frag_info.corner_radius * frag_info.corner_radius -
38+ space * space));
4139
4240 // Map the linear distance field to the approximate Gaussian integral.
43- f16vec2 integral = IPVec2FastGaussianIntegral(
44- sample_position.x + f16vec2 (- rrect_distance, rrect_distance),
41+ vec2 integral = IPVec2FastGaussianIntegral(
42+ sample_position.x + vec2 (- rrect_distance, rrect_distance),
4543 frag_info.blur_sigma);
4644 return integral.y - integral.x;
4745}
4846
49- float16_t RRectShadow(f16vec2 sample_position, f16vec2 half_size) {
47+ float RRectShadow(vec2 sample_position, vec2 half_size) {
5048 // Limit the sampling range to 3 standard deviations in the Y direction from
5149 // the kernel center to incorporate 99.7% of the color contribution.
52- float16_t half_sampling_range = frag_info.blur_sigma * 3 .0hf ;
50+ float half_sampling_range = frag_info.blur_sigma * 3 ;
5351
54- float16_t begin_y =
55- max (- half_sampling_range, sample_position.y - half_size.y);
56- float16_t end_y = min (half_sampling_range, sample_position.y + half_size.y);
57- float16_t interval = (end_y - begin_y) / float16_t(kSampleCount);
52+ float begin_y = max (- half_sampling_range, sample_position.y - half_size.y);
53+ float end_y = min (half_sampling_range, sample_position.y + half_size.y);
54+ float interval = (end_y - begin_y) / kSampleCount;
5855
5956 // Sample the X blur kSampleCount times, weighted by the Gaussian function.
60- float16_t result = 0 .0hf ;
57+ float result = 0 ;
6158 for (int sample_i = 0 ; sample_i < kSampleCount; sample_i++ ) {
62- float16_t y = begin_y + interval * (float16_t( sample_i) + 0 .5hf );
63- result += RRectShadowX(f16vec2 (sample_position.x, sample_position.y - y),
59+ float y = begin_y + interval * (sample_i + 0.5 );
60+ result += RRectShadowX(vec2 (sample_position.x, sample_position.y - y),
6461 half_size) *
6562 IPGaussian(y, frag_info.blur_sigma) * interval;
6663 }
@@ -71,10 +68,10 @@ float16_t RRectShadow(f16vec2 sample_position, f16vec2 half_size) {
7168void main() {
7269 frag_color = frag_info.color;
7370
74- f16vec2 half_size = frag_info.rect_size * 0 .5hf ;
75- f16vec2 sample_position = v_position - half_size;
71+ vec2 half_size = frag_info.rect_size * 0.5 ;
72+ vec2 sample_position = v_position - half_size;
7673
77- if (frag_info.blur_sigma > 0 .0hf ) {
74+ if (frag_info.blur_sigma > 0 ) {
7875 frag_color *= RRectShadow(sample_position, half_size);
7976 } else {
8077 frag_color *= - RRectDistance(sample_position, half_size);
0 commit comments