Index: src/gpu/effects/GrDistanceFieldGeoProc.cpp |
diff --git a/src/gpu/effects/GrDistanceFieldGeoProc.cpp b/src/gpu/effects/GrDistanceFieldGeoProc.cpp |
index f43a1e89946faf9195e21453e30e2ff39b6059b8..cb1e496f9778825ec186b9c2b0b381f9aa5dcc61 100644 |
--- a/src/gpu/effects/GrDistanceFieldGeoProc.cpp |
+++ b/src/gpu/effects/GrDistanceFieldGeoProc.cpp |
@@ -119,11 +119,16 @@ public: |
// For uniform scale, we adjust for the effect of the transformation on the distance |
// by using the length of the gradient of the t coordinate in the y direction. |
// We use st coordinates to ensure we're mapping 1:1 from texel space to pixel space. |
- // We use the y gradient because there is a bug in the Mali 400 in the x direction. |
// this gives us a smooth step across approximately one fragment |
+#ifdef SK_VULKAN |
+ fragBuilder->codeAppendf("afwidth = abs(" SK_DistanceFieldAAFactor "*dFdx(%s.x));", |
+ st.fsIn()); |
+#else |
+ // We use the y gradient because there is a bug in the Mali 400 in the x direction. |
fragBuilder->codeAppendf("afwidth = abs(" SK_DistanceFieldAAFactor "*dFdy(%s.y));", |
st.fsIn()); |
+#endif |
} else if (isSimilarity) { |
// For similarity transform, we adjust the effect of the transformation on the distance |
// by using the length of the gradient of the texture coordinates. We use st coordinates |
@@ -131,7 +136,12 @@ public: |
// We use the y gradient because there is a bug in the Mali 400 in the x direction. |
// this gives us a smooth step across approximately one fragment |
+#ifdef SK_VULKAN |
+ fragBuilder->codeAppendf("float st_grad_len = length(dFdx(%s));", st.fsIn()); |
+#else |
+ // We use the y gradient because there is a bug in the Mali 400 in the x direction. |
fragBuilder->codeAppendf("float st_grad_len = length(dFdy(%s));", st.fsIn()); |
+#endif |
fragBuilder->codeAppend("afwidth = abs(" SK_DistanceFieldAAFactor "*st_grad_len);"); |
} else { |
// For general transforms, to determine the amount of correction we multiply a unit |
@@ -368,19 +378,26 @@ public: |
// For uniform scale, we adjust for the effect of the transformation on the distance |
// by using the length of the gradient of the t coordinate in the y direction. |
// We use st coordinates to ensure we're mapping 1:1 from texel space to pixel space. |
- // We use the y gradient because there is a bug in the Mali 400 in the x direction. |
// this gives us a smooth step across approximately one fragment |
+#ifdef SK_VULKAN |
+ fragBuilder->codeAppend("afwidth = abs(" SK_DistanceFieldAAFactor "*dFdx(st.x));"); |
+#else |
+ // We use the y gradient because there is a bug in the Mali 400 in the x direction. |
fragBuilder->codeAppend("afwidth = abs(" SK_DistanceFieldAAFactor "*dFdy(st.y));"); |
- |
+#endif |
} else if (isSimilarity) { |
// For similarity transform, we adjust the effect of the transformation on the distance |
// by using the length of the gradient of the texture coordinates. We use st coordinates |
// to ensure we're mapping 1:1 from texel space to pixel space. |
- // We use the y gradient because there is a bug in the Mali 400 in the x direction. |
// this gives us a smooth step across approximately one fragment |
+#ifdef SK_VULKAN |
+ fragBuilder->codeAppend("float st_grad_len = length(dFdx(st));"); |
+#else |
+ // We use the y gradient because there is a bug in the Mali 400 in the x direction. |
fragBuilder->codeAppend("float st_grad_len = length(dFdy(st));"); |
+#endif |
fragBuilder->codeAppend("afwidth = abs(" SK_DistanceFieldAAFactor "*st_grad_len);"); |
} else { |
// For general transforms, to determine the amount of correction we multiply a unit |
@@ -610,16 +627,26 @@ public: |
fragBuilder->codeAppendf("float delta = %.*f;\n", SK_FLT_DECIMAL_DIG, lcdDelta); |
} |
if (isUniformScale) { |
+#ifdef SK_VULKAN |
+ fragBuilder->codeAppendf("float st_grad_len = abs(dFdx(%s.x));", st.fsIn()); |
+#else |
+ // We use the y gradient because there is a bug in the Mali 400 in the x direction. |
fragBuilder->codeAppendf("float st_grad_len = abs(dFdy(%s.y));", st.fsIn()); |
+#endif |
fragBuilder->codeAppend("vec2 offset = vec2(st_grad_len*delta, 0.0);"); |
} else if (isSimilarity) { |
// For a similarity matrix with rotation, the gradient will not be aligned |
// with the texel coordinate axes, so we need to calculate it. |
+#ifdef SK_VULKAN |
+ fragBuilder->codeAppendf("vec2 st_grad = dFdx(%s);", st.fsIn()); |
+ fragBuilder->codeAppend("vec2 offset = delta*st_grad;"); |
+#else |
// We use dFdy because of a Mali 400 bug, and rotate -90 degrees to |
// get the gradient in the x direction. |
fragBuilder->codeAppendf("vec2 st_grad = dFdy(%s);", st.fsIn()); |
- fragBuilder->codeAppend("float st_grad_len = length(st_grad);"); |
fragBuilder->codeAppend("vec2 offset = delta*vec2(st_grad.y, -st_grad.x);"); |
+#endif |
+ fragBuilder->codeAppend("float st_grad_len = length(st_grad);"); |
} else { |
fragBuilder->codeAppendf("vec2 st = %s;\n", st.fsIn()); |