Fix issues with U8->U8 when mixed with add or lane conversion

bug 10427746

Change-Id: Iea14223c754d0b2256d752d9211a0c45109c3a02
diff --git a/cpu_ref/rsCpuIntrinsicColorMatrix.cpp b/cpu_ref/rsCpuIntrinsicColorMatrix.cpp
index d89d5d7..0f49dc8 100644
--- a/cpu_ref/rsCpuIntrinsicColorMatrix.cpp
+++ b/cpu_ref/rsCpuIntrinsicColorMatrix.cpp
@@ -591,8 +591,14 @@
             }
         }
         for (int j=0; j < 4; j++) {
-            if (key.u.addMask & (1 << j)) {
-                buf = addVQADD_S32(buf, 8+j, 8+j, 4+j);
+            if (opInit[j]) {
+                if (key.u.addMask & (1 << j)) {
+                    buf = addVQADD_S32(buf, 8+j, 8+j, 4+j);
+                }
+            } else {
+                if (key.u.addMask & (1 << j)) {
+                    buf = addVQADD_S32(buf, 8+j, 12+j, 4+j);
+                }
             }
         }
 
@@ -659,27 +665,29 @@
 #endif
 }
 
-void RsdCpuScriptIntrinsicColorMatrix::updateCoeffCache(float fpMul, float adMul) {
+void RsdCpuScriptIntrinsicColorMatrix::updateCoeffCache(float fpMul, float addMul) {
     for(int ct=0; ct < 16; ct++) {
         ip[ct] = (short)(fp[ct] * 256.f + 0.5f);
         tmpFp[ct] = fp[ct] * fpMul;
         //ALOGE("mat %i %f  %f", ct, fp[ct], tmpFp[ct]);
     }
 
-    float ad = 0.f;
-    if (fpMul > 254.f) ad = 0.5f;
+    float add = 0.f;
+    if (fpMul > 254.f) add = 0.5f;
     for(int ct=0; ct < 4; ct++) {
-        tmpFpa[ct * 4 + 0] = fpa[ct] * adMul + ad;
+        tmpFpa[ct * 4 + 0] = fpa[ct] * addMul + add;
         //ALOGE("fpa %i %f  %f", ct, fpa[ct], tmpFpa[ct * 4 + 0]);
         tmpFpa[ct * 4 + 1] = tmpFpa[ct * 4];
         tmpFpa[ct * 4 + 2] = tmpFpa[ct * 4];
         tmpFpa[ct * 4 + 3] = tmpFpa[ct * 4];
     }
 
-    for(int ct=0; ct < 16; ct++) {
-        ipa[ct] = (int)(fpa[ct] * 65536.f + 0.5f);
+    for(int ct=0; ct < 4; ct++) {
+        ipa[ct * 4 + 0] = (int)(fpa[ct] * 65536.f + 0.5f);
+        ipa[ct * 4 + 1] = ipa[ct * 4];
+        ipa[ct * 4 + 2] = ipa[ct * 4];
+        ipa[ct * 4 + 3] = ipa[ct * 4];
     }
-
 }
 
 void RsdCpuScriptIntrinsicColorMatrix::setGlobalVar(uint32_t slot, const void *data,
@@ -759,9 +767,9 @@
     //ALOGE("f2  %f %f %f %f", sum.x, sum.y, sum.z, sum.w);
 
     sum.x += add[0];
-    sum.y += add[1];
-    sum.z += add[2];
-    sum.w += add[3];
+    sum.y += add[4];
+    sum.z += add[8];
+    sum.w += add[12];
 
 
     //ALOGE("fout %i vs %i, sum %f %f %f %f", fout, vsout, sum.x, sum.y, sum.z, sum.w);
@@ -779,7 +787,6 @@
             break;
         }
     } else {
-        sum += 0.5f;
         sum.x = sum.x < 0 ? 0 : (sum.x > 255.5 ? 255.5 : sum.x);
         sum.y = sum.y < 0 ? 0 : (sum.y > 255.5 ? 255.5 : sum.y);
         sum.z = sum.z < 0 ? 0 : (sum.z > 255.5 ? 255.5 : sum.z);
@@ -827,7 +834,7 @@
         }
 
         while(x1 != x2) {
-            One(p, out, in, cp->tmpFp, cp->fpa, vsin, vsout, floatIn, floatOut);
+            One(p, out, in, cp->tmpFp, cp->tmpFpa, vsin, vsout, floatIn, floatOut);
             out += outstep;
             in += instep;
             x1++;
@@ -843,7 +850,11 @@
     const Element *eout = aout->mHal.state.type->getElement();
 
     if (ein->getType() == eout->getType()) {
-        updateCoeffCache(1.f, 1.f);
+        if (eout->getType() == RS_TYPE_UNSIGNED_8) {
+            updateCoeffCache(1.f, 255.f);
+        } else {
+            updateCoeffCache(1.f, 1.f);
+        }
     } else {
         if (eout->getType() == RS_TYPE_UNSIGNED_8) {
             updateCoeffCache(255.f, 255.f);
diff --git a/cpu_ref/rsCpuIntrinsics_neon_ColorMatrix.S b/cpu_ref/rsCpuIntrinsics_neon_ColorMatrix.S
index 7b4d7f6..646c37a 100644
--- a/cpu_ref/rsCpuIntrinsics_neon_ColorMatrix.S
+++ b/cpu_ref/rsCpuIntrinsics_neon_ColorMatrix.S
@@ -36,6 +36,9 @@
     vld1.32 {q7}, [r2]!
     veor q0, q0
     veor q1, q1
+    veor q9, q9
+    veor q10, q10
+    veor q11, q11
 SNIP_END(_N_ColorMatrix_prefix_i)
 
 SNIP_START(_N_ColorMatrix_prefix_f)
@@ -305,15 +308,21 @@
     vmovl.u8 q12, d0  /* R */
     vmovl.u8 q13, d1  /* G */
     vmovl.u8 q14, d2  /* B */
+    veor q15, q15
 SNIP_END(_N_ColorMatrix_unpack_u8_3)
 
 SNIP_START(_N_ColorMatrix_unpack_u8_2)
     vmovl.u8 q12, d0  /* R */
     vmovl.u8 q13, d1  /* G */
+    veor q14, q14
+    veor q15, q15
 SNIP_END(_N_ColorMatrix_unpack_u8_2)
 
 SNIP_START(_N_ColorMatrix_unpack_u8_1)
     vmovl.u8 q12, d0  /* R */
+    veor q13, q13
+    veor q14, q14
+    veor q15, q15
 SNIP_END(_N_ColorMatrix_unpack_u8_1)
 
 SNIP_START(_N_ColorMatrix_pack_u8_4)