Merge "Improve linker_namespaces CTS test"
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GetAllocationTest.java b/tests/tests/renderscript/src/android/renderscript/cts/GetAllocationTest.java
index f938569..177a804 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GetAllocationTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/GetAllocationTest.java
@@ -37,7 +37,6 @@
         Allocation mOut = Allocation.createTyped(mRS, mTemp.getType());
 
         ms.bind_pointer(mTemp);
-        ms.set_script(ms);
         ms.set_alloc_out(mOut);
         ms.invoke_start();
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/SingleSourceForEachTest.java b/tests/tests/renderscript/src/android/renderscript/cts/SingleSourceForEachTest.java
new file mode 100644
index 0000000..e005013
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/SingleSourceForEachTest.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2015-2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.renderscript.cts;
+
+import android.renderscript.Allocation;
+import android.renderscript.Element;
+import android.renderscript.Script;
+import android.renderscript.Type;
+import android.renderscript.Type.Builder;
+
+public class SingleSourceForEachTest extends RSBaseCompute {
+
+    private static final int X = 1024;
+    private static final int Y = 768;
+
+    private Allocation testInputAlloc;
+    private Allocation testInputAlloc2;
+    private Allocation testOutputAlloc;
+    private Allocation baselineOutputAlloc;
+    private int testInputArray[];
+    private int testInputArray2[];
+    private int testOutputArray[];
+    private int baselineOutputArray[];
+    private ScriptC_single_source_script s;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        Type.Builder i32TypeBuilder = new Type.Builder(mRS, Element.I32(mRS));
+        i32TypeBuilder.setX(X).setY(Y);
+        testInputAlloc = Allocation.createTyped(mRS, i32TypeBuilder.create());
+        testInputAlloc2 = Allocation.createTyped(mRS, i32TypeBuilder.create());
+        testOutputAlloc = Allocation.createTyped(mRS, i32TypeBuilder.create());
+        baselineOutputAlloc = Allocation.createTyped(mRS, i32TypeBuilder.create());
+
+        testInputArray = new int[X * Y];
+        testInputArray2 = new int[X * Y];
+        testOutputArray = new int[X * Y];
+        baselineOutputArray = new int[X * Y];
+
+        s = new ScriptC_single_source_script(mRS);
+
+        RSUtils.genRandomInts(0x900d5eed, testInputArray, true, 32);
+        testInputAlloc.copyFrom(testInputArray);
+
+        for (int i = 0; i < testInputArray2.length; i++) {
+            testInputArray2[i] = i + 1;
+        }
+        testInputAlloc2.copyFrom(testInputArray2);
+    }
+
+    public void testSingleInputKernelLaunch() {
+        s.forEach_foo(testInputAlloc, baselineOutputAlloc);
+        s.invoke_testSingleInput(testInputAlloc, testOutputAlloc);
+        testOutputAlloc.copyTo(testOutputArray);
+        baselineOutputAlloc.copyTo(baselineOutputArray);
+        checkArray(baselineOutputArray, testOutputArray, Y, X, X);
+    }
+
+    public void testMultiInputKernelLaunch() {
+        s.forEach_goo(testInputAlloc, testInputAlloc2,
+                      baselineOutputAlloc);
+        s.invoke_testMultiInput(testInputAlloc, testInputAlloc2,
+                                testOutputAlloc);
+        testOutputAlloc.copyTo(testOutputArray);
+        baselineOutputAlloc.copyTo(baselineOutputArray);
+        checkArray(baselineOutputArray, testOutputArray, Y, X, X);
+    }
+
+    public void testKernelLaunchWithOptions() {
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(0, X);
+        sc.setY(0, Y / 2);
+        s.forEach_foo(testInputAlloc, baselineOutputAlloc, sc);
+        s.invoke_testLaunchOptions(testInputAlloc, testOutputAlloc, X, Y);
+        testOutputAlloc.copyTo(testOutputArray);
+        baselineOutputAlloc.copyTo(baselineOutputArray);
+        checkArray(baselineOutputArray, testOutputArray, Y, X, X);
+    }
+
+    public void testAllocationlessKernelLaunch() {
+        baselineOutputAlloc.copyFrom(testInputArray);
+        testOutputAlloc.copyFrom(testInputArray);
+
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(0, X);
+        sc.setY(0, Y);
+        s.set_gAllocOut(baselineOutputAlloc);
+        s.forEach_bar(sc);
+
+        s.invoke_testAllocationlessLaunch(testOutputAlloc, X, Y);
+
+        testOutputAlloc.copyTo(testOutputArray);
+        baselineOutputAlloc.copyTo(baselineOutputArray);
+        checkArray(baselineOutputArray, testOutputArray, Y, X, X);
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/get_allocation.rs b/tests/tests/renderscript/src/android/renderscript/cts/get_allocation.rs
index 0149e6c..ae7d3e6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/get_allocation.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/get_allocation.rs
@@ -2,15 +2,14 @@
 #pragma rs java_package_name(android.renderscript.cts)
 
 const int* pointer;
-rs_script script;
 rs_allocation alloc_in;
 rs_allocation alloc_out;
 
-void root(const int* in, int *out) {
-    *out = *in;
+int __attribute__((kernel)) copy(int in) {
+    return in;
 }
 
 void start() {
     alloc_in = rsGetAllocation(pointer);
-    rsForEach(script, alloc_in, alloc_out);
+    rsForEach(copy, alloc_in, alloc_out);
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/single_source_script.rs b/tests/tests/renderscript/src/android/renderscript/cts/single_source_script.rs
new file mode 100644
index 0000000..5e35aa3
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/single_source_script.rs
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2015-2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "shared.rsh"
+
+rs_allocation gAllocOut;
+
+int RS_KERNEL foo(int a) {
+    return a * 2;
+}
+
+int RS_KERNEL goo(int a, int b) {
+    return a + b;
+}
+
+void RS_KERNEL bar(int x, int y) {
+  int a = rsGetElementAt_int(gAllocOut, x, y);
+  a++;
+  rsSetElementAt_int(gAllocOut, a, x, y);
+}
+
+void testSingleInput(rs_allocation in, rs_allocation out) {
+    rsForEach(foo, in, out);
+}
+
+void testMultiInput(rs_allocation in1, rs_allocation in2, rs_allocation out) {
+    rsForEach(goo, in1, in2, out);
+}
+
+void testLaunchOptions(rs_allocation in, rs_allocation out, int dimX, int dimY) {
+    rs_script_call_t opts = {};
+    opts.xStart = 0;
+    opts.xEnd = dimX;
+    opts.yStart = 0;
+    opts.yEnd = dimY / 2;
+    rsForEachWithOptions(foo, &opts, in, out);
+}
+
+void testAllocationlessLaunch(rs_allocation inAndOut, int dimX, int dimY) {
+    gAllocOut = inAndOut;
+    rs_script_call_t opts = {};
+    opts.xStart = 0;
+    opts.xEnd = dimX;
+    opts.yStart = 0;
+    opts.yEnd = dimY;
+    rsForEachWithOptions(bar, &opts);
+}