Merge "Add test for clipped convolve and color matrix." into lmp-dev
diff --git a/tests/src/android/renderscript/cts/intrinsic_colormatrix.rs b/tests/src/android/renderscript/cts/intrinsic_colormatrix.rs
index 30b40c4..15c781c 100644
--- a/tests/src/android/renderscript/cts/intrinsic_colormatrix.rs
+++ b/tests/src/android/renderscript/cts/intrinsic_colormatrix.rs
@@ -17,10 +17,8 @@
 #include "shared.rsh"
 
 
-void reference(rs_matrix4x4 m, float4 add, rs_allocation in, rs_allocation out) {
-    uint32_t w = rsAllocationGetDimX(in);
-    uint32_t h = rsAllocationGetDimY(in);
-
+void reference(rs_matrix4x4 m, float4 add, rs_allocation in, rs_allocation out,
+               int x1, int y1, int x2, int y2) {
     rs_element ein = rsAllocationGetElement(in);
     rs_element eout = rsAllocationGetElement(out);
     rs_data_type dtin = rsElementGetDataType(ein);
@@ -28,8 +26,8 @@
     uint32_t vsin = rsElementGetVectorSize(ein);
     uint32_t vsout = rsElementGetVectorSize(eout);
 
-    for (uint32_t y = 0; y < h; y++) {
-        for (uint32_t x = 0; x < w; x++) {
+    for (uint32_t y = y1; y < y2; y++) {
+        for (uint32_t x = x1; x < x2; x++) {
             float4 pin = 0.f;
 
             if (dtin == RS_TYPE_FLOAT_32) {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBase.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBase.java
index 7d952f6..bd02d7e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBase.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBase.java
@@ -21,6 +21,7 @@
 import android.renderscript.Allocation;
 import android.renderscript.Element;
 import android.renderscript.Type;
+import android.renderscript.Script;
 
 public class IntrinsicBase extends RSBaseCompute {
     protected final String TAG = "Img";
@@ -59,12 +60,24 @@
         return e;
     }
 
-    protected Allocation makeAllocation(int w, int h, Element e) {
+    protected Allocation makeAllocation(int w, int h, Element e, boolean clear) {
         Type.Builder tb = new Type.Builder(mRS, e);
         tb.setX(w);
         tb.setY(h);
         Type t = tb.create();
-        return Allocation.createTyped(mRS, t);
+        Allocation a = Allocation.createTyped(mRS, t);
+
+        if (clear) {
+            final int s = a.getBytesSize();
+            byte[] b = new byte[s];
+            a.copyFromUnchecked(b);
+        }
+
+        return a;
+    }
+
+    protected Allocation makeAllocation(int w, int h, Element e) {
+        return makeAllocation(w, h, e, true);
     }
 
     protected void makeSource(int w, int h, Element e) {
@@ -123,4 +136,11 @@
         checkForErrors();
     }
 
+    protected Script.LaunchOptions makeClipper(int x, int y, int x2, int y2) {
+        Script.LaunchOptions lo = new Script.LaunchOptions();
+        lo.setX(x, x2);
+        lo.setY(y, y2);
+        return lo;
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicColorMatrix.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicColorMatrix.java
index 2ac7d6f..ac48783 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicColorMatrix.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicColorMatrix.java
@@ -25,7 +25,8 @@
 
     private void subtest(int w, int h, Matrix4f mat, Float4 add,
                          Element.DataType dtIn, int vsIn,
-                         Element.DataType dtOut, int vsOut) {
+                         Element.DataType dtOut, int vsOut,
+                         boolean clip) {
 
 
         if (mat == null) {
@@ -42,21 +43,34 @@
 
 
         makeSource(w, h, ein);
-        mAllocRef = makeAllocation(w, h, eout);
-        mAllocDst = makeAllocation(w, h, eout);
+        mAllocRef = makeAllocation(w, h, eout, true);
+        mAllocDst = makeAllocation(w, h, eout, true);
+
+        int x1 = 0, y1 = 0, x2 = w, y2 = h;
+        if (clip) {
+            x1 = 11;
+            y1 = 11;
+            x2 = w - 11;
+            y2 = h - 11;
+        }
 
         mSi.setColorMatrix(mat);
         mSi.setAdd(add);
-        mSi.forEach(mAllocSrc, mAllocDst);
-        mSr.invoke_reference(mat, add, mAllocSrc, mAllocRef);
+        if (clip) {
+            mSi.forEach(mAllocSrc, mAllocDst, makeClipper(x1, y1, x2, y2));
+        } else {
+            mSi.forEach(mAllocSrc, mAllocDst);
+        }
+        mSr.invoke_reference(mat, add, mAllocSrc, mAllocRef, x1, y1, x2, y2);
 
-        android.util.Log.e("RSI test", "test ColorMatrix  vsin=" + vsIn + ", vsout=" + vsOut + ",  dim " + w + ", " + h);
+        //android.util.Log.e("RSI test", "test ColorMatrix  vsin=" + vsIn + ", vsout=" + vsOut + ",  dim " + w + ", " + h);
         mVerify.invoke_verify(mAllocRef, mAllocDst, mAllocSrc);
         mRS.finish();
     }
 
 
-    private void test(Element.DataType dtin, Element.DataType dtout, int subtest) {
+    private void test(Element.DataType dtin, Element.DataType dtout, int subtest,
+                      boolean clip) {
         Float4 add = new Float4();
         Matrix4f mat = new Matrix4f();
         java.util.Random r = new java.util.Random(100);
@@ -99,52 +113,84 @@
                     add.w = r.nextFloat() * (subtest - 1);
                 }
             }
-            android.util.Log.v("rs", "Mat [" + f[0] + ", " + f[4] + ", " + f[8] + ", " + f[12] + "]");
-            android.util.Log.v("rs", "    [" + f[1] + ", " + f[5] + ", " + f[9] + ", " + f[13] + "]");
-            android.util.Log.v("rs", "    [" + f[2] + ", " + f[6] + ", " + f[10] + ", " + f[14] + "]");
-            android.util.Log.v("rs", "    [" + f[3] + ", " + f[7] + ", " + f[11] + ", " + f[15] + "]");
+            //android.util.Log.v("rs", "Mat [" + f[0] + ", " + f[4] + ", " + f[8] + ", " + f[12] + "]");
+            //android.util.Log.v("rs", "    [" + f[1] + ", " + f[5] + ", " + f[9] + ", " + f[13] + "]");
+            //android.util.Log.v("rs", "    [" + f[2] + ", " + f[6] + ", " + f[10] + ", " + f[14] + "]");
+            //android.util.Log.v("rs", "    [" + f[3] + ", " + f[7] + ", " + f[11] + ", " + f[15] + "]");
         }
 
         for (int i=1; i <= 4; i++) {
             for (int j=1; j <=4; j++) {
                 subtest(101, 101, mat, add,
-                        dtin, i,
-                        dtout, j);
+                        dtin, i, dtout, j, clip);
             }
         }
         checkError();
     }
 
     public void test_U8_U8_Ident() {
-        test(Element.DataType.UNSIGNED_8, Element.DataType.UNSIGNED_8, 0);
+        test(Element.DataType.UNSIGNED_8, Element.DataType.UNSIGNED_8, 0, false);
     }
 
     public void test_F32_F32_Ident() {
-        test(Element.DataType.FLOAT_32, Element.DataType.FLOAT_32, 0);
+        test(Element.DataType.FLOAT_32, Element.DataType.FLOAT_32, 0, false);
     }
 
     public void test_U8_F32_Ident() {
-        test(Element.DataType.UNSIGNED_8, Element.DataType.FLOAT_32, 0);
+        test(Element.DataType.UNSIGNED_8, Element.DataType.FLOAT_32, 0, false);
     }
 
     public void test_F32_U8_Ident() {
-        test(Element.DataType.FLOAT_32, Element.DataType.UNSIGNED_8, 0);
+        test(Element.DataType.FLOAT_32, Element.DataType.UNSIGNED_8, 0, false);
     }
 
     public void test_U8_U8_Rand() {
-        test(Element.DataType.UNSIGNED_8, Element.DataType.UNSIGNED_8, 2);
+        test(Element.DataType.UNSIGNED_8, Element.DataType.UNSIGNED_8, 2, false);
     }
 
     public void test_F32_F32_Rand() {
-        test(Element.DataType.FLOAT_32, Element.DataType.FLOAT_32, 10);
+        test(Element.DataType.FLOAT_32, Element.DataType.FLOAT_32, 10, false);
     }
 
     public void test_U8_F32_Rand() {
-        test(Element.DataType.UNSIGNED_8, Element.DataType.FLOAT_32, 10);
+        test(Element.DataType.UNSIGNED_8, Element.DataType.FLOAT_32, 10, false);
     }
 
     public void test_F32_U8_Rand() {
-        test(Element.DataType.FLOAT_32, Element.DataType.UNSIGNED_8, 10);
+        test(Element.DataType.FLOAT_32, Element.DataType.UNSIGNED_8, 10, false);
     }
 
+
+
+    public void test_U8_U8_IdentC() {
+        test(Element.DataType.UNSIGNED_8, Element.DataType.UNSIGNED_8, 0, true);
+    }
+
+    public void test_F32_F32_IdentC() {
+        test(Element.DataType.FLOAT_32, Element.DataType.FLOAT_32, 0, true);
+    }
+
+    public void test_U8_F32_IdentC() {
+        test(Element.DataType.UNSIGNED_8, Element.DataType.FLOAT_32, 0, true);
+    }
+
+    public void test_F32_U8_IdentC() {
+        test(Element.DataType.FLOAT_32, Element.DataType.UNSIGNED_8, 0, true);
+    }
+
+    public void test_U8_U8_RandC() {
+        test(Element.DataType.UNSIGNED_8, Element.DataType.UNSIGNED_8, 2, true);
+    }
+
+    public void test_F32_F32_RandC() {
+        test(Element.DataType.FLOAT_32, Element.DataType.FLOAT_32, 10, true);
+    }
+
+    public void test_U8_F32_RandC() {
+        test(Element.DataType.UNSIGNED_8, Element.DataType.FLOAT_32, 10, true);
+    }
+
+    public void test_F32_U8_RandC() {
+        test(Element.DataType.FLOAT_32, Element.DataType.UNSIGNED_8, 10, true);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve3x3.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve3x3.java
index 12eae9a..1880132 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve3x3.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve3x3.java
@@ -20,138 +20,187 @@
 import android.util.Log;
 
 public class IntrinsicConvolve3x3 extends IntrinsicBase {
-    private void testConvolve3(int w, int h, Element.DataType dt, int vecSize) {
+    private void testConvolve3(int w, int h, Element.DataType dt, int vecSize, Script.LaunchOptions sc) {
         float cf1[] = {0.f, 0.f, 0.f,  0.f, 1.f, 0.f,  0.f, 0.f, 0.f};
         float cf2[] = {0.f, -1.f, 0.f,  -1.f, 5.f, -1.f,  0.f, -1.f, 0.f};
 
-
         Element e = makeElement(dt, vecSize);
 
         System.gc();
         makeBuffers(w, h, e);
 
-
         ScriptIntrinsicConvolve3x3 si = ScriptIntrinsicConvolve3x3.create(mRS, e);
         si.setCoefficients(cf1);
         si.setInput(mAllocSrc);
-        si.forEach(mAllocRef);
+        si.forEach(mAllocRef, sc);
 
         ScriptC_intrinsic_convolve3x3 sr = new ScriptC_intrinsic_convolve3x3(mRS);
         sr.set_gCoeffs(cf1);
         sr.set_gIn(mAllocSrc);
         sr.set_gWidth(w);
         sr.set_gHeight(h);
+
+        if (sc != null) {
+            mAllocRef.copyFrom(mAllocSrc);
+            mAllocDst.copyFrom(mAllocSrc);
+        }
+
         if (dt == Element.DataType.UNSIGNED_8) {
             switch(vecSize) {
             case 4:
-                sr.forEach_convolve_U4(mAllocDst);
+                sr.forEach_convolve_U4(mAllocDst, sc);
                 break;
             case 3:
-                sr.forEach_convolve_U3(mAllocDst);
+                sr.forEach_convolve_U3(mAllocDst, sc);
                 break;
             case 2:
-                sr.forEach_convolve_U2(mAllocDst);
+                sr.forEach_convolve_U2(mAllocDst, sc);
                 break;
             case 1:
-                sr.forEach_convolve_U1(mAllocDst);
+                sr.forEach_convolve_U1(mAllocDst, sc);
                 break;
             }
         } else {
             switch(vecSize) {
             case 4:
-                sr.forEach_convolve_F4(mAllocDst);
+                sr.forEach_convolve_F4(mAllocDst, sc);
                 break;
             case 3:
-                sr.forEach_convolve_F3(mAllocDst);
+                sr.forEach_convolve_F3(mAllocDst, sc);
                 break;
             case 2:
-                sr.forEach_convolve_F2(mAllocDst);
+                sr.forEach_convolve_F2(mAllocDst, sc);
                 break;
             case 1:
-                sr.forEach_convolve_F1(mAllocDst);
+                sr.forEach_convolve_F1(mAllocDst, sc);
                 break;
             }
         }
 
-        android.util.Log.e("RSI test", "test convolve U8_" + vecSize + " 1 " + w + ", " + h);
+        //android.util.Log.e("RSI test", "test convolve U8_" + vecSize + " 1 " + w + ", " + h);
         mVerify.invoke_verify(mAllocRef, mAllocDst, mAllocSrc);
 
         si.setCoefficients(cf2);
         sr.set_gCoeffs(cf2);
-        si.forEach(mAllocRef);
+        si.forEach(mAllocRef, sc);
         if (dt == Element.DataType.UNSIGNED_8) {
             switch(vecSize) {
             case 4:
-                sr.forEach_convolve_U4(mAllocDst);
+                sr.forEach_convolve_U4(mAllocDst, sc);
                 break;
             case 3:
-                sr.forEach_convolve_U3(mAllocDst);
+                sr.forEach_convolve_U3(mAllocDst, sc);
                 break;
             case 2:
-                sr.forEach_convolve_U2(mAllocDst);
+                sr.forEach_convolve_U2(mAllocDst, sc);
                 break;
             case 1:
-                sr.forEach_convolve_U1(mAllocDst);
+                sr.forEach_convolve_U1(mAllocDst, sc);
                 break;
             }
         } else {
             switch(vecSize) {
             case 4:
-                sr.forEach_convolve_F4(mAllocDst);
+                sr.forEach_convolve_F4(mAllocDst, sc);
                 break;
             case 3:
-                sr.forEach_convolve_F3(mAllocDst);
+                sr.forEach_convolve_F3(mAllocDst, sc);
                 break;
             case 2:
-                sr.forEach_convolve_F2(mAllocDst);
+                sr.forEach_convolve_F2(mAllocDst, sc);
                 break;
             case 1:
-                sr.forEach_convolve_F1(mAllocDst);
+                sr.forEach_convolve_F1(mAllocDst, sc);
                 break;
             }
         }
-        android.util.Log.e("RSI test", "test convolve U8_" + vecSize + " 2 " + w + ", " + h);
+        //android.util.Log.e("RSI test", "test convolve U8_" + vecSize + " 2 " + w + ", " + h);
         mVerify.invoke_verify(mAllocRef, mAllocDst, mAllocSrc);
         mRS.finish();
     }
 
 
     public void test_U8_4() {
-        testConvolve3(100, 100, Element.DataType.UNSIGNED_8, 4);
+        testConvolve3(100, 100, Element.DataType.UNSIGNED_8, 4, null);
         checkError();
     }
     public void test_U8_3() {
-        testConvolve3(100, 100, Element.DataType.UNSIGNED_8, 3);
+        testConvolve3(100, 100, Element.DataType.UNSIGNED_8, 3, null);
         checkError();
     }
     public void test_U8_2() {
-        testConvolve3(100, 100, Element.DataType.UNSIGNED_8, 2);
+        testConvolve3(100, 100, Element.DataType.UNSIGNED_8, 2, null);
         checkError();
     }
     public void test_U8_1() {
-        testConvolve3(100, 100, Element.DataType.UNSIGNED_8, 1);
+        testConvolve3(100, 100, Element.DataType.UNSIGNED_8, 1, null);
         checkError();
     }
 
     public void test_F32_4() {
-        testConvolve3(100, 100, Element.DataType.FLOAT_32, 4);
+        testConvolve3(100, 100, Element.DataType.FLOAT_32, 4, null);
         checkError();
     }
 
     public void test_F32_3() {
-        testConvolve3(100, 100, Element.DataType.FLOAT_32, 3);
+        testConvolve3(100, 100, Element.DataType.FLOAT_32, 3, null);
         checkError();
     }
 
     public void test_F32_2() {
-        testConvolve3(100, 100, Element.DataType.FLOAT_32, 2);
+        testConvolve3(100, 100, Element.DataType.FLOAT_32, 2, null);
         checkError();
     }
 
     public void test_F32_1() {
-        testConvolve3(100, 100, Element.DataType.FLOAT_32, 1);
+        testConvolve3(100, 100, Element.DataType.FLOAT_32, 1, null);
         checkError();
     }
 
 
+    public void test_U8_4C() {
+        testConvolve3(100, 100, Element.DataType.UNSIGNED_8, 4,
+                      makeClipper(11, 11, 90, 90));
+        checkError();
+    }
+    public void test_U8_3C() {
+        testConvolve3(100, 100, Element.DataType.UNSIGNED_8, 3,
+                      makeClipper(11, 11, 90, 90));
+        checkError();
+    }
+    public void test_U8_2C() {
+        testConvolve3(100, 100, Element.DataType.UNSIGNED_8, 2,
+                      makeClipper(11, 11, 90, 90));
+        checkError();
+    }
+    public void test_U8_1C() {
+        testConvolve3(100, 100, Element.DataType.UNSIGNED_8, 1,
+                      makeClipper(11, 11, 90, 90));
+        checkError();
+    }
+
+    public void test_F32_4C() {
+        testConvolve3(100, 100, Element.DataType.FLOAT_32, 4,
+                      makeClipper(11, 11, 90, 90));
+        checkError();
+    }
+
+    public void test_F32_3C() {
+        testConvolve3(100, 100, Element.DataType.FLOAT_32, 3,
+                      makeClipper(11, 11, 90, 90));
+        checkError();
+    }
+
+    public void test_F32_2C() {
+        testConvolve3(100, 100, Element.DataType.FLOAT_32, 2,
+                      makeClipper(11, 11, 90, 90));
+        checkError();
+    }
+
+    public void test_F32_1C() {
+        testConvolve3(100, 100, Element.DataType.FLOAT_32, 1,
+                      makeClipper(11, 11, 90, 90));
+        checkError();
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve5x5.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve5x5.java
index 482db59..ee92651 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve5x5.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve5x5.java
@@ -21,10 +21,16 @@
 
 public class IntrinsicConvolve5x5 extends IntrinsicBase {
     private void test5(ScriptC_intrinsic_convolve5x5 sr, ScriptIntrinsicConvolve5x5 si,
-                        Element e, float cf[], String name, int num, int w, int h) {
+                       Element e, float cf[], String name, int num, int w, int h,
+                       Script.LaunchOptions sc) {
         si.setCoefficients(cf);
         si.setInput(mAllocSrc);
-        si.forEach(mAllocRef);
+
+        if (sc != null) {
+            mAllocRef.copyFrom(mAllocSrc);
+            mAllocDst.copyFrom(mAllocSrc);
+        }
+        si.forEach(mAllocRef, sc);
 
         sr.set_gWidth(w);
         sr.set_gHeight(h);
@@ -33,41 +39,41 @@
         if (e.getDataType() == Element.DataType.UNSIGNED_8) {
             switch(e.getVectorSize()) {
             case 4:
-                sr.forEach_convolve_U4(mAllocDst);
+                sr.forEach_convolve_U4(mAllocDst, sc);
                 break;
             case 3:
-                sr.forEach_convolve_U3(mAllocDst);
+                sr.forEach_convolve_U3(mAllocDst, sc);
                 break;
             case 2:
-                sr.forEach_convolve_U2(mAllocDst);
+                sr.forEach_convolve_U2(mAllocDst, sc);
                 break;
             case 1:
-                sr.forEach_convolve_U1(mAllocDst);
+                sr.forEach_convolve_U1(mAllocDst, sc);
                 break;
             }
         } else {
             switch(e.getVectorSize()) {
             case 4:
-                sr.forEach_convolve_F4(mAllocDst);
+                sr.forEach_convolve_F4(mAllocDst, sc);
                 break;
             case 3:
-                sr.forEach_convolve_F3(mAllocDst);
+                sr.forEach_convolve_F3(mAllocDst, sc);
                 break;
             case 2:
-                sr.forEach_convolve_F2(mAllocDst);
+                sr.forEach_convolve_F2(mAllocDst, sc);
                 break;
             case 1:
-                sr.forEach_convolve_F1(mAllocDst);
+                sr.forEach_convolve_F1(mAllocDst, sc);
                 break;
             }
         }
 
-        android.util.Log.e("RSI test", name + "  " + e.getVectorSize() + " " + num + " " + w + ", " + h);
+        //android.util.Log.e("RSI test", name + "  " + e.getVectorSize() + " " + num + " " + w + ", " + h);
         mVerify.invoke_verify(mAllocRef, mAllocDst, mAllocSrc);
         mRS.finish();
     }
 
-    private void testConvolve5(int w, int h, Element.DataType dt, int vecSize) {
+    private void testConvolve5(int w, int h, Element.DataType dt, int vecSize, Script.LaunchOptions sc) {
         float cf1[] = { 0.f,  0.f,  0.f,  0.f,  0.f,
                         0.f,  0.f,  0.f,  0.f,  0.f,
                         0.f,  0.f,  1.f,  0.f,  0.f,
@@ -84,43 +90,87 @@
 
         ScriptIntrinsicConvolve5x5 si = ScriptIntrinsicConvolve5x5.create(mRS, e);
         ScriptC_intrinsic_convolve5x5 sr = new ScriptC_intrinsic_convolve5x5(mRS);
-        test5(sr, si, e, cf1, "test convolve", 1, w, h);
-        test5(sr, si, e, cf2, "test convolve", 2, w, h);
+        test5(sr, si, e, cf1, "test convolve", 1, w, h, sc);
+        test5(sr, si, e, cf2, "test convolve", 2, w, h, sc);
     }
 
     public void test_U8_4() {
-        testConvolve5(100, 100, Element.DataType.UNSIGNED_8, 4);
+        testConvolve5(100, 100, Element.DataType.UNSIGNED_8, 4, null);
         checkError();
     }
     public void test_U8_3() {
-        testConvolve5(100, 100, Element.DataType.UNSIGNED_8, 3);
+        testConvolve5(100, 100, Element.DataType.UNSIGNED_8, 3, null);
         checkError();
     }
     public void test_U8_2() {
-        testConvolve5(100, 100, Element.DataType.UNSIGNED_8, 2);
+        testConvolve5(100, 100, Element.DataType.UNSIGNED_8, 2, null);
         checkError();
     }
     public void test_U8_1() {
-        testConvolve5(100, 100, Element.DataType.UNSIGNED_8, 1);
+        testConvolve5(100, 100, Element.DataType.UNSIGNED_8, 1, null);
         checkError();
     }
 
     public void test_F32_4() {
-        testConvolve5(100, 100, Element.DataType.FLOAT_32, 4);
+        testConvolve5(100, 100, Element.DataType.FLOAT_32, 4, null);
         checkError();
     }
     public void test_F32_3() {
-        testConvolve5(100, 100, Element.DataType.FLOAT_32, 3);
+        testConvolve5(100, 100, Element.DataType.FLOAT_32, 3, null);
         checkError();
     }
     public void test_F32_2() {
-        testConvolve5(100, 100, Element.DataType.FLOAT_32, 2);
+        testConvolve5(100, 100, Element.DataType.FLOAT_32, 2, null);
         checkError();
     }
     public void test_F32_1() {
-        testConvolve5(100, 100, Element.DataType.FLOAT_32, 1);
+        testConvolve5(100, 100, Element.DataType.FLOAT_32, 1, null);
         checkError();
     }
 
+    public void test_U8_4C() {
+        testConvolve5(100, 100, Element.DataType.UNSIGNED_8, 4,
+                      makeClipper(11, 11, 90, 90));
+        checkError();
+    }
+    public void test_U8_3C() {
+        testConvolve5(100, 100, Element.DataType.UNSIGNED_8, 3,
+                      makeClipper(11, 11, 90, 90));
+        checkError();
+    }
+    public void test_U8_2C() {
+        testConvolve5(100, 100, Element.DataType.UNSIGNED_8, 2,
+                      makeClipper(11, 11, 90, 90));
+        checkError();
+    }
+    public void test_U8_1C() {
+        testConvolve5(100, 100, Element.DataType.UNSIGNED_8, 1,
+                      makeClipper(11, 11, 90, 90));
+        checkError();
+    }
+
+    public void test_F32_4C() {
+        testConvolve5(100, 100, Element.DataType.FLOAT_32, 4,
+                      makeClipper(11, 11, 90, 90));
+        checkError();
+    }
+
+    public void test_F32_3C() {
+        testConvolve5(100, 100, Element.DataType.FLOAT_32, 3,
+                      makeClipper(11, 11, 90, 90));
+        checkError();
+    }
+
+    public void test_F32_2C() {
+        testConvolve5(100, 100, Element.DataType.FLOAT_32, 2,
+                      makeClipper(11, 11, 90, 90));
+        checkError();
+    }
+
+    public void test_F32_1C() {
+        testConvolve5(100, 100, Element.DataType.FLOAT_32, 1,
+                      makeClipper(11, 11, 90, 90));
+        checkError();
+    }
 
 }