Avoid unsafe casts to int in SkNx
Bug: skia:8867
Change-Id: Ifc040f801dff349e5178cca030bc727e2a9af99b
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/201383
Reviewed-by: Mike Klein <mtklein@google.com>
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
diff --git a/src/gpu/ops/GrQuadPerEdgeAA.cpp b/src/gpu/ops/GrQuadPerEdgeAA.cpp
index cdc49b3..2593875 100644
--- a/src/gpu/ops/GrQuadPerEdgeAA.cpp
+++ b/src/gpu/ops/GrQuadPerEdgeAA.cpp
@@ -302,10 +302,15 @@
}
// Track whether or not the quad vertices in (xs, ys) are on the proper sides of l, t, r, and b
- Sk4i leftValid = SkNx_cast<int32_t>(quad.fX >= left);
- Sk4i rightValid = SkNx_cast<int32_t>(quad.fX <= right);
- Sk4i topValid = SkNx_cast<int32_t>(quad.fY >= top);
- Sk4i botValid = SkNx_cast<int32_t>(quad.fY <= bot);
+ Sk4f left4f = quad.fX >= left;
+ Sk4f right4f = quad.fX <= right;
+ Sk4f top4f = quad.fY >= top;
+ Sk4f bot4f = quad.fY <= bot;
+ // Use bit casting so that overflows don't occur on WASM (will be cleaned up in SkVx port)
+ Sk4i leftValid = Sk4i::Load(&left4f);
+ Sk4i rightValid = Sk4i::Load(&right4f);
+ Sk4i topValid = Sk4i::Load(&top4f);
+ Sk4i botValid = Sk4i::Load(&bot4f);
// Intercepts of quad lines with the 4 pixel edges
Sk4f leftCross = -(edges.fC + edges.fA * left) / edges.fB;
@@ -485,8 +490,8 @@
Sk4f d2v0 = dists2 < kTolerance;
// FIXME(michaelludwig): Sk4f has anyTrue() and allTrue(), but not & or |. Sk4i has & or | but
// not anyTrue() and allTrue(). Moving to SkVx from SkNx will clean this up.
- Sk4i d1And2 = SkNx_cast<int32_t>(d1v0) & SkNx_cast<int32_t>(d2v0);
- Sk4i d1Or2 = SkNx_cast<int32_t>(d1v0) | SkNx_cast<int32_t>(d2v0);
+ Sk4i d1And2 = Sk4i::Load(&d1v0) & Sk4i::Load(&d2v0);
+ Sk4i d1Or2 = Sk4i::Load(&d1v0) | Sk4i::Load(&d2v0);
Sk4f coverage;
if (!d1Or2[0] && !d1Or2[1] && !d1Or2[2] && !d1Or2[3]) {