зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1664459 - simplify WebRender radial gradient shader. r=mattwoodrow
Differential Revision: https://phabricator.services.mozilla.com/D89915
This commit is contained in:
Родитель
ad56527f09
Коммит
16183ea20e
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
#define V_CENTER flat_varying_vec4_0.xy
|
#define V_CENTER flat_varying_vec4_0.xy
|
||||||
#define V_START_RADIUS flat_varying_vec4_0.z
|
#define V_START_RADIUS flat_varying_vec4_0.z
|
||||||
#define V_END_RADIUS flat_varying_vec4_0.w
|
#define V_RADIUS_SCALE flat_varying_vec4_0.w
|
||||||
|
|
||||||
#define V_REPEATED_SIZE flat_varying_vec4_1.xy
|
#define V_REPEATED_SIZE flat_varying_vec4_1.xy
|
||||||
#define V_GRADIENT_REPEAT flat_varying_vec4_1.z
|
#define V_GRADIENT_REPEAT flat_varying_vec4_1.z
|
||||||
|
@ -69,7 +69,13 @@ void radial_gradient_brush_vs(
|
||||||
|
|
||||||
V_CENTER = gradient.center_start_end_radius.xy;
|
V_CENTER = gradient.center_start_end_radius.xy;
|
||||||
V_START_RADIUS = gradient.center_start_end_radius.z;
|
V_START_RADIUS = gradient.center_start_end_radius.z;
|
||||||
V_END_RADIUS = gradient.center_start_end_radius.w;
|
if (gradient.center_start_end_radius.z != gradient.center_start_end_radius.w) {
|
||||||
|
// Store 1/rd where rd = end_radius - start_start
|
||||||
|
V_RADIUS_SCALE = 1.0 / (gradient.center_start_end_radius.w - gradient.center_start_end_radius.z);
|
||||||
|
} else {
|
||||||
|
// If rd = 0, we can't get its reciprocal. Instead, just use a zero scale.
|
||||||
|
V_RADIUS_SCALE = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
// Transform all coordinates by the y scale so the
|
// Transform all coordinates by the y scale so the
|
||||||
// fragment shader can work with circles
|
// fragment shader can work with circles
|
||||||
|
@ -114,43 +120,9 @@ Fragment radial_gradient_brush_fs() {
|
||||||
vec2 pos = mod(V_POS, V_REPEATED_SIZE);
|
vec2 pos = mod(V_POS, V_REPEATED_SIZE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Solve for t in length(pd) = V_START_RADIUS + t * rd
|
||||||
vec2 pd = pos - V_CENTER;
|
vec2 pd = pos - V_CENTER;
|
||||||
float rd = V_END_RADIUS - V_START_RADIUS;
|
float offset = (length(pd) - V_START_RADIUS) * V_RADIUS_SCALE;
|
||||||
|
|
||||||
// Solve for t in length(t - pd) = V_START_RADIUS + t * rd
|
|
||||||
// using a quadratic equation in form of At^2 - 2Bt + C = 0
|
|
||||||
float A = -(rd * rd);
|
|
||||||
float B = V_START_RADIUS * rd;
|
|
||||||
float C = dot(pd, pd) - V_START_RADIUS * V_START_RADIUS;
|
|
||||||
|
|
||||||
float offset;
|
|
||||||
if (A == 0.0) {
|
|
||||||
// Since A is 0, just solve for -2Bt + C = 0
|
|
||||||
if (B == 0.0) {
|
|
||||||
discard;
|
|
||||||
}
|
|
||||||
float t = 0.5 * C / B;
|
|
||||||
if (V_START_RADIUS + rd * t >= 0.0) {
|
|
||||||
offset = t;
|
|
||||||
} else {
|
|
||||||
discard;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
float discr = B * B - A * C;
|
|
||||||
if (discr < 0.0) {
|
|
||||||
discard;
|
|
||||||
}
|
|
||||||
discr = sqrt(discr);
|
|
||||||
float t0 = (B + discr) / A;
|
|
||||||
float t1 = (B - discr) / A;
|
|
||||||
if (V_START_RADIUS + rd * t0 >= 0.0) {
|
|
||||||
offset = t0;
|
|
||||||
} else if (V_START_RADIUS + rd * t1 >= 0.0) {
|
|
||||||
offset = t1;
|
|
||||||
} else {
|
|
||||||
discard;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vec4 color = sample_gradient(V_GRADIENT_ADDRESS,
|
vec4 color = sample_gradient(V_GRADIENT_ADDRESS,
|
||||||
offset,
|
offset,
|
||||||
|
@ -168,7 +140,7 @@ Fragment radial_gradient_brush_fs() {
|
||||||
#undef V_GRADIENT_ADDRESS
|
#undef V_GRADIENT_ADDRESS
|
||||||
#undef V_CENTER
|
#undef V_CENTER
|
||||||
#undef V_START_RADIUS
|
#undef V_START_RADIUS
|
||||||
#undef V_END_RADIUS
|
#undef V_RADIUS_SCALE
|
||||||
#undef V_REPEATED_SIZE
|
#undef V_REPEATED_SIZE
|
||||||
#undef V_GRADIENT_REPEAT
|
#undef V_GRADIENT_REPEAT
|
||||||
#undef V_POS
|
#undef V_POS
|
||||||
|
|
|
@ -57,7 +57,7 @@ fuzzy(0-1,0-2000) fuzzy-if(webrender&&!geckoview,1-2,3249-9500) == border-image-
|
||||||
fuzzy(0-1,0-8533) fuzzy-if(webrender&&!geckoview,1-3,3188-9500) == border-image-linear-gradient-repeat-repeat-3.html border-image-linear-gradient-repeat-repeat-3-ref.html
|
fuzzy(0-1,0-8533) fuzzy-if(webrender&&!geckoview,1-3,3188-9500) == border-image-linear-gradient-repeat-repeat-3.html border-image-linear-gradient-repeat-repeat-3-ref.html
|
||||||
fuzzy(0-3,0-107563) fuzzy-if(webrender&&!geckoview,1-3,43500-107563) == border-image-linear-gradient-repeat-round-3.html border-image-linear-gradient-repeat-round-3-ref.html
|
fuzzy(0-3,0-107563) fuzzy-if(webrender&&!geckoview,1-3,43500-107563) == border-image-linear-gradient-repeat-round-3.html border-image-linear-gradient-repeat-round-3-ref.html
|
||||||
|
|
||||||
fuzzy-if(webrender,0-1,0-2096) == border-image-radial-gradient.html border-image-radial-gradient-ref.html
|
fuzzy-if(webrender,0-2,0-2096) == border-image-radial-gradient.html border-image-radial-gradient-ref.html
|
||||||
fuzzy(0-1,0-42) fuzzy-if(skiaContent,0-2,0-20) fuzzy-if(webrender,0-1,0-37818) == border-image-radial-gradient-slice-1.html border-image-radial-gradient-slice-1-ref.html
|
fuzzy(0-1,0-42) fuzzy-if(skiaContent,0-2,0-20) fuzzy-if(webrender,0-1,0-37818) == border-image-radial-gradient-slice-1.html border-image-radial-gradient-slice-1-ref.html
|
||||||
fuzzy(0-1,0-46) fuzzy-if(OSX,0-2,0-4472) fuzzy-if(webrender,0-1,0-26363) == border-image-radial-gradient-slice-2.html border-image-radial-gradient-slice-2-ref.html
|
fuzzy(0-1,0-46) fuzzy-if(OSX,0-2,0-4472) fuzzy-if(webrender,0-1,0-26363) == border-image-radial-gradient-slice-2.html border-image-radial-gradient-slice-2-ref.html
|
||||||
fuzzy(0-1,0-85970) fuzzy-if(webrender,0-1,0-90873) == border-image-radial-gradient-slice-fill-1.html border-image-radial-gradient-slice-fill-1-ref.html
|
fuzzy(0-1,0-85970) fuzzy-if(webrender,0-1,0-90873) == border-image-radial-gradient-slice-fill-1.html border-image-radial-gradient-slice-fill-1-ref.html
|
||||||
|
|
Загрузка…
Ссылка в новой задаче