blob: a0e3b7af8f99ad47c092e9da270a86ae87ea0c4b [file] [log] [blame]
/*
* Copyright (C) 2014 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 java.util.Random;
import android.renderscript.*;
public class AtomicTest extends RSBaseCompute {
int[] mSrcData;
int[] mReturnData = new int[1];
int[] mRefData = new int[1];
ScriptC_AtomicTest mScript;
Allocation mSrc;
Allocation mReturn;
private void initS(boolean fillData, int sz) {
mSrcData = new int[sz * sz];
mScript = new ScriptC_AtomicTest(mRS);
mSrc = Allocation.createTyped(mRS, Type.createXY(mRS, Element.I32(mRS), sz, sz));
mReturn = Allocation.createSized(mRS, Element.I32(mRS), 1);
if (fillData) {
RSUtils.genRandomInts(0, mSrcData, true, 32);
mSrc.copyFrom(mSrcData);
}
}
private void initU(boolean fillData, int sz) {
mSrcData = new int[sz * sz];
mScript = new ScriptC_AtomicTest(mRS);
mSrc = Allocation.createTyped(mRS, Type.createXY(mRS, Element.U32(mRS), sz, sz));
mReturn = Allocation.createSized(mRS, Element.U32(mRS), 1);
if (fillData) {
RSUtils.genRandomInts(0, mSrcData, false, 32);
mSrc.copyFrom(mSrcData);
}
}
public void testCas() {
initS(true, 1024);
mScript.set_gISum(10);
mScript.forEach_test_Cas(mSrc);
mScript.invoke_getValueS(mReturn);
mReturn.copyTo(mReturnData);
assertEquals("Incorrect value for Cas ", (10 + 1024*1024), mReturnData[0]);
}
public void testUCas() {
initU(true, 1024);
mScript.set_gUSum(10);
mScript.forEach_test_uCas(mSrc);
mScript.invoke_getValueU(mReturn);
mReturn.copyTo(mReturnData);
assertEquals("Incorrect value for UCas ", (10 + 1024*1024), mReturnData[0]);
}
public void testInc() {
initS(true, 1024);
mScript.set_gISum(10);
mScript.forEach_test_Inc(mSrc);
mScript.invoke_getValueS(mReturn);
mReturn.copyTo(mReturnData);
assertEquals("Incorrect value for Inc ", (10 + 1024*1024), mReturnData[0]);
}
public void testUInc() {
initU(true, 1024);
mScript.set_gUSum(10);
mScript.forEach_test_uInc(mSrc);
mScript.invoke_getValueU(mReturn);
mReturn.copyTo(mReturnData);
assertEquals("Incorrect value for UInc ", (10 + 1024*1024), mReturnData[0]);
}
public void testDec() {
initS(true, 1024);
mScript.set_gISum(10 + 1024*1024);
mScript.forEach_test_Dec(mSrc);
mScript.invoke_getValueS(mReturn);
mReturn.copyTo(mReturnData);
assertEquals("Incorrect value for Dec ", 10, mReturnData[0]);
}
public void testUDec() {
initU(true, 1024);
mScript.set_gUSum(10 + 1024*1024);
mScript.forEach_test_uDec(mSrc);
mScript.invoke_getValueU(mReturn);
mReturn.copyTo(mReturnData);
assertEquals("Incorrect value for UDec ", 10, mReturnData[0]);
}
public void testAdd() {
initS(true, 1024);
mScript.set_gISum(10);
mScript.forEach_test_Add(mSrc);
mScript.invoke_getValueS(mReturn);
mReturn.copyTo(mReturnData);
int sExpected = 10;
for (int i=0; i < mSrcData.length; i++) {
sExpected += mSrcData[i];
}
assertEquals("Incorrect value for Add ", sExpected, mReturnData[0]);
}
public void testUAdd() {
initU(true, 1024);
mScript.set_gUSum(10);
mScript.forEach_test_uAdd(mSrc);
mScript.invoke_getValueU(mReturn);
mReturn.copyTo(mReturnData);
int sExpected = 10;
for (int i=0; i < mSrcData.length; i++) {
sExpected += mSrcData[i];
}
assertEquals("Incorrect value for UAdd ", sExpected, mReturnData[0]);
}
public void testSub() {
initS(true, 1024);
mScript.set_gISum(10);
mScript.forEach_test_Sub(mSrc);
mScript.invoke_getValueS(mReturn);
mReturn.copyTo(mReturnData);
int sExpected = 10;
for (int i=0; i < mSrcData.length; i++) {
sExpected -= mSrcData[i];
}
assertEquals("Incorrect value for Sub ", sExpected, mReturnData[0]);
}
public void testUSub() {
initU(true, 1024);
mScript.set_gUSum(10);
mScript.forEach_test_uSub(mSrc);
mScript.invoke_getValueU(mReturn);
mReturn.copyTo(mReturnData);
int sExpected = 10;
for (int i=0; i < mSrcData.length; i++) {
sExpected -= mSrcData[i];
}
assertEquals("Incorrect value for USub ", sExpected, mReturnData[0]);
}
public void testXor() {
initS(true, 1024);
mScript.set_gISum(10);
mScript.forEach_test_Xor(mSrc);
mScript.invoke_getValueS(mReturn);
mReturn.copyTo(mReturnData);
int sExpected = 10;
for (int i=0; i < mSrcData.length; i++) {
sExpected ^= mSrcData[i];
}
assertEquals("Incorrect value for Xor ", sExpected, mReturnData[0]);
}
public void testUXor() {
initU(true, 1024);
mScript.set_gUSum(10);
mScript.forEach_test_uXor(mSrc);
mScript.invoke_getValueU(mReturn);
mReturn.copyTo(mReturnData);
int sExpected = 10;
for (int i=0; i < mSrcData.length; i++) {
sExpected ^= mSrcData[i];
}
assertEquals("Incorrect value for UXor ", sExpected, mReturnData[0]);
}
public void testMin() {
for (int i = 0; i < 16; i++) {
initS(true, 256);
mScript.set_gISum(0x7fffffff);
mScript.forEach_test_Min(mSrc);
mScript.invoke_getValueS(mReturn);
mReturn.copyTo(mReturnData);
mScript.set_gISum(0x7fffffff);
mScript.invoke_computeReference_Min(mSrc, mReturn);
mReturn.copyTo(mRefData);
assertEquals("Incorrect value for Min ", mRefData[0], mReturnData[0]);
}
}
public void testUMin() {
for (int i = 0; i < 16; i++) {
initU(true, 256);
mScript.set_gUSum(0xffffffffL);
mScript.forEach_test_uMin(mSrc);
mScript.invoke_getValueU(mReturn);
mReturn.copyTo(mReturnData);
mScript.set_gUSum(0xffffffffL);
mScript.invoke_computeReference_uMin(mSrc, mReturn);
mReturn.copyTo(mRefData);
assertEquals("Incorrect value for UMin ", mRefData[0], mReturnData[0]);
}
}
public void testMax() {
for (int i = 0; i < 16; i++) {
initS(true, 256);
mScript.set_gISum(0);
mScript.forEach_test_Max(mSrc);
mScript.invoke_getValueS(mReturn);
mReturn.copyTo(mReturnData);
mScript.set_gISum(0);
mScript.invoke_computeReference_Max(mSrc, mReturn);
mReturn.copyTo(mRefData);
assertEquals("Incorrect value for Min ", mRefData[0], mReturnData[0]);
}
}
public void testUMax() {
for (int i = 0; i < 16; i++) {
initU(true, 256);
mScript.set_gISum(0);
mScript.forEach_test_uMax(mSrc);
mScript.invoke_getValueU(mReturn);
mReturn.copyTo(mReturnData);
mScript.set_gISum(0);
mScript.invoke_computeReference_uMax(mSrc, mReturn);
mReturn.copyTo(mRefData);
assertEquals("Incorrect value for UMax ", mRefData[0], mReturnData[0]);
}
}
public void testAnd() {
Random r = new Random(78);
for (int i = 0; i < 64; i++) {
initS(false, 128);
for (int j = 0; j < mSrcData.length; j++) {
mSrcData[j] = ~0;
}
mSrcData[r.nextInt(mSrcData.length)] = ~0x40000000;
mSrcData[r.nextInt(mSrcData.length)] = ~0x10000000;
mSrcData[r.nextInt(mSrcData.length)] = ~0x02000000;
mSrcData[r.nextInt(mSrcData.length)] = ~0x00c00000;
mSrcData[r.nextInt(mSrcData.length)] = ~0x00010000;
mSrcData[r.nextInt(mSrcData.length)] = ~0x00080000;
mSrcData[r.nextInt(mSrcData.length)] = ~0x00001000;
mSrcData[r.nextInt(mSrcData.length)] = ~0x00000200;
mSrcData[r.nextInt(mSrcData.length)] = ~0x0000000f;
mSrc.copyFrom(mSrcData);
mScript.set_gISum(0xffffffff);
mScript.forEach_test_And(mSrc);
mScript.invoke_getValueS(mReturn);
mReturn.copyTo(mReturnData);
int sExpected = 0xffffffff;
for (int j = 0; j < mSrcData.length; j++) {
sExpected &= mSrcData[j];
}
assertEquals("Incorrect value for And ", sExpected, mReturnData[0]);
}
}
public void testUAnd() {
Random r = new Random(78);
for (int i = 0; i < 64; i++) {
initU(false, 128);
for (int j = 0; j < mSrcData.length; j++) {
mSrcData[j] = ~0;
}
mSrcData[r.nextInt(mSrcData.length)] = ~0x40000000;
mSrcData[r.nextInt(mSrcData.length)] = ~0x10000000;
mSrcData[r.nextInt(mSrcData.length)] = ~0x02000000;
mSrcData[r.nextInt(mSrcData.length)] = ~0x00c00000;
mSrcData[r.nextInt(mSrcData.length)] = ~0x00010000;
mSrcData[r.nextInt(mSrcData.length)] = ~0x00080000;
mSrcData[r.nextInt(mSrcData.length)] = ~0x00001000;
mSrcData[r.nextInt(mSrcData.length)] = ~0x00000200;
mSrcData[r.nextInt(mSrcData.length)] = ~0x0000000f;
mSrc.copyFrom(mSrcData);
mScript.set_gUSum(0xffffffffL);
mScript.forEach_test_uAnd(mSrc);
mScript.invoke_getValueU(mReturn);
mReturn.copyTo(mReturnData);
int sExpected = 0xffffffff;
for (int j = 0; j < mSrcData.length; j++) {
sExpected &= mSrcData[j];
}
assertEquals("Incorrect value for uAnd ", sExpected, mReturnData[0]);
}
}
public void testOr() {
Random r = new Random(78);
for (int i = 0; i < 64; i++) {
initS(false, 128);
for (int j = 0; j < mSrcData.length; j++) {
mSrcData[j] = 0;
}
mSrcData[r.nextInt(mSrcData.length)] = 0x40000000;
mSrcData[r.nextInt(mSrcData.length)] = 0x10000000;
mSrcData[r.nextInt(mSrcData.length)] = 0x02000000;
mSrcData[r.nextInt(mSrcData.length)] = 0x00c00000;
mSrcData[r.nextInt(mSrcData.length)] = 0x00010000;
mSrcData[r.nextInt(mSrcData.length)] = 0x00080000;
mSrcData[r.nextInt(mSrcData.length)] = 0x00001000;
mSrcData[r.nextInt(mSrcData.length)] = 0x00000200;
mSrcData[r.nextInt(mSrcData.length)] = 0x0000000f;
mSrc.copyFrom(mSrcData);
mScript.set_gISum(0);
mScript.forEach_test_Or(mSrc);
mScript.invoke_getValueS(mReturn);
mReturn.copyTo(mReturnData);
int sExpected = 0;
for (int j = 0; j < mSrcData.length; j++) {
sExpected |= mSrcData[j];
}
assertEquals("Incorrect value for Or ", sExpected, mReturnData[0]);
}
}
public void testUOr() {
Random r = new Random(78);
for (int i = 0; i < 64; i++) {
initU(false, 128);
for (int j = 0; j < mSrcData.length; j++) {
mSrcData[j] = 0;
}
mSrcData[r.nextInt(mSrcData.length)] = 0x40000000;
mSrcData[r.nextInt(mSrcData.length)] = 0x10000000;
mSrcData[r.nextInt(mSrcData.length)] = 0x02000000;
mSrcData[r.nextInt(mSrcData.length)] = 0x00c00000;
mSrcData[r.nextInt(mSrcData.length)] = 0x00010000;
mSrcData[r.nextInt(mSrcData.length)] = 0x00080000;
mSrcData[r.nextInt(mSrcData.length)] = 0x00001000;
mSrcData[r.nextInt(mSrcData.length)] = 0x00000200;
mSrcData[r.nextInt(mSrcData.length)] = 0x0000000f;
mSrc.copyFrom(mSrcData);
mScript.set_gUSum(0);
mScript.forEach_test_uOr(mSrc);
mScript.invoke_getValueU(mReturn);
mReturn.copyTo(mReturnData);
int sExpected = 0;
for (int j = 0; j < mSrcData.length; j++) {
sExpected |= mSrcData[j];
}
assertEquals("Incorrect value for UOr ", sExpected, mReturnData[0]);
}
}
}