diff --git a/tests/MatrixTest.cpp b/tests/MatrixTest.cpp
index 6f7a14f..578e8b0 100644
--- a/tests/MatrixTest.cpp
+++ b/tests/MatrixTest.cpp
@@ -8,6 +8,7 @@
 #include "SkMath.h"
 #include "SkMatrix.h"
 #include "SkMatrixUtils.h"
+#include "SkPoint3.h"
 #include "SkRandom.h"
 #include "Test.h"
 
@@ -647,9 +648,15 @@
 }
 
 // For test_matrix_homogeneous, below.
-static bool scalar_array_nearly_equal_relative(const SkScalar a[], const SkScalar b[], int count) {
+static bool point3_array_nearly_equal_relative(const SkPoint3 a[], const SkPoint3 b[], int count) {
     for (int i = 0; i < count; ++i) {
-        if (!scalar_nearly_equal_relative(a[i], b[i])) {
+        if (!scalar_nearly_equal_relative(a[i].fX, b[i].fX)) {
+            return false;
+        }
+        if (!scalar_nearly_equal_relative(a[i].fY, b[i].fY)) {
+            return false;
+        }
+        if (!scalar_nearly_equal_relative(a[i].fZ, b[i].fZ)) {
             return false;
         }
     }
@@ -658,16 +665,16 @@
 
 // For test_matrix_homogeneous, below.
 // Maps a single triple in src using m and compares results to those in dst
-static bool naive_homogeneous_mapping(const SkMatrix& m, const SkScalar src[3],
-                                      const SkScalar dst[3]) {
-    SkScalar res[3];
+static bool naive_homogeneous_mapping(const SkMatrix& m, const SkPoint3& src,
+                                      const SkPoint3& dst) {
+    SkPoint3 res;
     SkScalar ms[9] = {m[0], m[1], m[2],
                       m[3], m[4], m[5],
                       m[6], m[7], m[8]};
-    res[0] = src[0] * ms[0] + src[1] * ms[1] + src[2] * ms[2];
-    res[1] = src[0] * ms[3] + src[1] * ms[4] + src[2] * ms[5];
-    res[2] = src[0] * ms[6] + src[1] * ms[7] + src[2] * ms[8];
-    return scalar_array_nearly_equal_relative(res, dst, 3);
+    res.fX = src.fX * ms[0] + src.fY * ms[1] + src.fZ * ms[2];
+    res.fY = src.fX * ms[3] + src.fY * ms[4] + src.fZ * ms[5];
+    res.fZ = src.fX * ms[6] + src.fY * ms[7] + src.fZ * ms[8];
+    return point3_array_nearly_equal_relative(&res, &dst, 1);
 }
 
 static void test_matrix_homogeneous(skiatest::Reporter* reporter) {
@@ -687,9 +694,11 @@
 #endif
     SkRandom rand;
 
-    SkScalar randTriples[3*kTripleCount];
-    for (int i = 0; i < 3*kTripleCount; ++i) {
-        randTriples[i] = rand.nextRangeF(-3000.f, 3000.f);
+    SkPoint3 randTriples[kTripleCount];
+    for (int i = 0; i < kTripleCount; ++i) {
+        randTriples[i].fX = rand.nextRangeF(-3000.f, 3000.f);
+        randTriples[i].fY = rand.nextRangeF(-3000.f, 3000.f);
+        randTriples[i].fZ = rand.nextRangeF(-3000.f, 3000.f);
     }
 
     SkMatrix mats[kMatrixCount];
@@ -702,29 +711,28 @@
     // identity
     {
     mat.reset();
-    SkScalar dst[3*kTripleCount];
+    SkPoint3 dst[kTripleCount];
     mat.mapHomogeneousPoints(dst, randTriples, kTripleCount);
-    REPORTER_ASSERT(reporter, scalar_array_nearly_equal_relative(randTriples, dst, kTripleCount*3));
+    REPORTER_ASSERT(reporter, point3_array_nearly_equal_relative(randTriples, dst, kTripleCount));
     }
 
+    const SkPoint3 zeros = {0.f, 0.f, 0.f};
     // zero matrix
     {
     mat.setAll(0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f);
-    SkScalar dst[3*kTripleCount];
+    SkPoint3 dst[kTripleCount];
     mat.mapHomogeneousPoints(dst, randTriples, kTripleCount);
-    SkScalar zeros[3] = {0.f, 0.f, 0.f};
     for (int i = 0; i < kTripleCount; ++i) {
-        REPORTER_ASSERT(reporter, scalar_array_nearly_equal_relative(&dst[i*3], zeros, 3));
+        REPORTER_ASSERT(reporter, point3_array_nearly_equal_relative(&dst[i], &zeros, 1));
     }
     }
 
     // zero point
     {
-    SkScalar zeros[3] = {0.f, 0.f, 0.f};
     for (int i = 0; i < kMatrixCount; ++i) {
-        SkScalar dst[3];
-        mats[i].mapHomogeneousPoints(dst, zeros, 1);
-        REPORTER_ASSERT(reporter, scalar_array_nearly_equal_relative(dst, zeros, 3));
+        SkPoint3 dst;
+        mats[i].mapHomogeneousPoints(&dst, &zeros, 1);
+        REPORTER_ASSERT(reporter, point3_array_nearly_equal_relative(&dst, &zeros, 1));
     }
     }
 
@@ -736,29 +744,29 @@
     // uniform scale of point
     {
     mat.setScale(kScale0, kScale0);
-    SkScalar dst[3];
-    SkScalar src[3] = {randTriples[0], randTriples[1], 1.f};
+    SkPoint3 dst;
+    SkPoint3 src = {randTriples[0].fX, randTriples[0].fY, 1.f};
     SkPoint pnt;
-    pnt.set(src[0], src[1]);
-    mat.mapHomogeneousPoints(dst, src, 1);
+    pnt.set(src.fX, src.fY);
+    mat.mapHomogeneousPoints(&dst, &src, 1);
     mat.mapPoints(&pnt, &pnt, 1);
-    REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst[0], pnt.fX));
-    REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst[1], pnt.fY));
-    REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst[2], SK_Scalar1));
+    REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.fX, pnt.fX));
+    REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.fY, pnt.fY));
+    REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.fZ, SK_Scalar1));
     }
 
     // rotation of point
     {
     mat.setRotate(kRotation0);
-    SkScalar dst[3];
-    SkScalar src[3] = {randTriples[0], randTriples[1], 1.f};
+    SkPoint3 dst;
+    SkPoint3 src = {randTriples[0].fX, randTriples[0].fY, 1.f};
     SkPoint pnt;
-    pnt.set(src[0], src[1]);
-    mat.mapHomogeneousPoints(dst, src, 1);
+    pnt.set(src.fX, src.fY);
+    mat.mapHomogeneousPoints(&dst, &src, 1);
     mat.mapPoints(&pnt, &pnt, 1);
-    REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst[0], pnt.fX));
-    REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst[1], pnt.fY));
-    REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst[2], SK_Scalar1));
+    REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.fX, pnt.fX));
+    REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.fY, pnt.fY));
+    REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.fZ, SK_Scalar1));
     }
 
     // rotation, scale, rotation of point
@@ -766,24 +774,24 @@
     mat.setRotate(kRotation1);
     mat.postScale(kScale0, kScale0);
     mat.postRotate(kRotation0);
-    SkScalar dst[3];
-    SkScalar src[3] = {randTriples[0], randTriples[1], 1.f};
+    SkPoint3 dst;
+    SkPoint3 src = {randTriples[0].fX, randTriples[0].fY, 1.f};
     SkPoint pnt;
-    pnt.set(src[0], src[1]);
-    mat.mapHomogeneousPoints(dst, src, 1);
+    pnt.set(src.fX, src.fY);
+    mat.mapHomogeneousPoints(&dst, &src, 1);
     mat.mapPoints(&pnt, &pnt, 1);
-    REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst[0], pnt.fX));
-    REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst[1], pnt.fY));
-    REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst[2], SK_Scalar1));
+    REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.fX, pnt.fX));
+    REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.fY, pnt.fY));
+    REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.fZ, SK_Scalar1));
     }
 
     // compare with naive approach
     {
     for (int i = 0; i < kMatrixCount; ++i) {
         for (int j = 0; j < kTripleCount; ++j) {
-            SkScalar dst[3];
-            mats[i].mapHomogeneousPoints(dst, &randTriples[j*3], 1);
-            REPORTER_ASSERT(reporter, naive_homogeneous_mapping(mats[i], &randTriples[j*3], dst));
+            SkPoint3 dst;
+            mats[i].mapHomogeneousPoints(&dst, &randTriples[j], 1);
+            REPORTER_ASSERT(reporter, naive_homogeneous_mapping(mats[i], randTriples[j], dst));
         }
     }
     }
