blob: b87b7054317e77433c94d3d04d1f68dbb2047583 [file] [log] [blame]
/*
* Copyright (C) 2015 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.*;
public class LaunchClip extends RSBaseCompute {
Allocation mAPassFail;
Allocation mAin;
Allocation mAout;
ScriptC_launchclip mScript;
int[] mIn;
int[] mOut;
int[] mPassFail;
int mDimX = 0;
int mDimY = 0;
int mDimZ = 0;
boolean mHasFaces = false;
boolean mHasLods = false;
int mDimA0 = 0;
int mDimA1 = 0;
int mDimA2 = 0;
int mDimA3 = 0;
int mCellCount = 0;
void setup(boolean makeIn, boolean makeOut, int x, int y, int z, boolean face, boolean lods,
int a0, int a1, int a2, int a3) {
mDimX = x;
mDimY = y;
mDimZ = z;
mHasFaces = face;
mHasLods = lods;
mDimA0 = a0;
mDimA1 = a1;
mDimA2 = a2;
mDimA3 = a3;
mScript = new ScriptC_launchclip(mRS);
mScript.set_dimX(mDimX);
mScript.set_dimY(mDimY);
mScript.set_dimZ(mDimZ);
mScript.set_hasFaces(mHasFaces);
mScript.set_hasLod(mHasLods);
mScript.set_dimA0(mDimA0);
mScript.set_dimA1(mDimA1);
mScript.set_dimA2(mDimA2);
mScript.set_dimA3(mDimA3);
Type.Builder tb = new Type.Builder(mRS, Element.I32(mRS));
tb.setX(mDimX);
if (mDimY > 0) tb.setY(mDimY);
if (mDimZ > 0) tb.setZ(mDimZ);
if (mHasFaces) tb.setFaces(true);
if (mHasLods) tb.setMipmaps(true);
//if (mDimA0 != 0) tb.setArray(0, mDimA0);
//if (mDimA1 != 0) tb.setArray(1, mDimA1);
//if (mDimA2 != 0) tb.setArray(2, mDimA2);
//if (mDimA3 != 0) tb.setArray(3, mDimA3);
Type t = tb.create();
if (makeIn) {
mIn = new int[t.getCount()];
mAin = Allocation.createTyped(mRS, t);
mScript.forEach_zero(mAin);
}
if (makeOut) {
mOut = new int[t.getCount()];
mAout = Allocation.createTyped(mRS, t);
mScript.forEach_zero(mAout);
}
mPassFail = new int[1];
mAPassFail = Allocation.createSized(mRS, Element.U32(mRS), 1);
mAPassFail.copyFrom(mPassFail);
mScript.set_passfail(mAPassFail);
}
private void verifyCell(int x, int y, int z, int[] a, Script.LaunchOptions sc) {
int expected = 0x80000000;
boolean inRange = true;
if (mDimX != 0) {
if (x >= sc.getXStart() && x < sc.getXEnd()) {
expected |= x;
} else {
inRange = false;
}
}
if (mDimY != 0) {
if (y >= sc.getYStart() && y < sc.getYEnd()) {
expected |= y << 8;
} else {
inRange = false;
}
}
if (mDimZ != 0) {
if (z >= sc.getZStart() && z < sc.getZEnd()) {
expected |= z << 16;
} else {
inRange = false;
}
}
if (!inRange) {
expected = 0;
}
int val = a[x + y * mDimX + z * mDimX * mDimY];
if (val != expected) {
String s = new String("verify error @ " + x + ", " + y + ", " + z +
", expected " + expected + ", got " + val);
///android.util.Log.e("rs", s);
throw new IllegalStateException(s);
}
}
void verifyRange(Script.LaunchOptions sc, int[] a) {
int itY = (mDimY > 0) ? mDimY : 1;
int itZ = (mDimZ > 0) ? mDimZ : 1;
for (int x = 0; x < mDimX; x++) {
for (int y = 0; y < itY; y++) {
for (int z = 0; z < itZ; z++) {
verifyCell(x, y, z, a, sc);
}
}
}
}
AllocationAdapter makeAdapter(Allocation base, int ax, int ay, int az, int ox, int oy, int oz) {
Type.Builder tb = new Type.Builder(mRS, base.getType().getElement());
tb.setX(ax);
if (ay > 0) {
tb.setY(ay);
}
if (az > 0) {
tb.setZ(az);
}
Type t = tb.create();
AllocationAdapter a = AllocationAdapter.createTyped(mRS, base, t);
a.setX(ox);
if (base.getType().getY() > 0) {
a.setY(oy);
}
if (base.getType().getZ() > 0) {
a.setZ(oz);
}
mScript.set_biasX(ox);
mScript.set_biasY(oy);
mScript.set_biasZ(oz);
return a;
}
public void testWrite1D() {
setup(false, true, 256, 0, 0, false, false, 0, 0, 0, 0);
Script.LaunchOptions sc = new Script.LaunchOptions();
sc.setX(9, 77);
mScript.forEach_write1d(mAout, sc);
mAout.copyTo(mOut);
verifyRange(sc, mOut);
}
public void testWrite1DAdapter1D() {
setup(false, true, 256, 0, 0, false, false, 0, 0, 0, 0);
Script.LaunchOptions sc = new Script.LaunchOptions();
sc.setX(9, 77);
AllocationAdapter a = makeAdapter(mAout, 68, 0, 0, 9, 0, 0);
mScript.forEach_write1d(a);
mAout.copyTo(mOut);
verifyRange(sc, mOut);
}
public void testWrite2D() {
setup(false, true, 256, 256, 0, false, false, 0, 0, 0, 0);
Script.LaunchOptions sc = new Script.LaunchOptions();
sc.setX(9, 77);
sc.setY(17, 177);
mScript.forEach_write2d(mAout, sc);
mAout.copyTo(mOut);
verifyRange(sc, mOut);
}
public void testWrite2DAdapter1D() {
setup(false, true, 256, 256, 0, false, false, 0, 0, 0, 0);
Script.LaunchOptions sc = new Script.LaunchOptions();
sc.setX(9, 77);
sc.setY(17, 18);
AllocationAdapter a = makeAdapter(mAout, 68, 0, 0, 9, 17, 0);
mScript.forEach_write1d(a);
mAout.copyTo(mOut);
verifyRange(sc, mOut);
}
public void testWrite2DAdapter2D() {
setup(false, true, 256, 256, 0, false, false, 0, 0, 0, 0);
Script.LaunchOptions sc = new Script.LaunchOptions();
sc.setX(9, 77);
sc.setY(17, 177);
AllocationAdapter a = makeAdapter(mAout, 68, 160, 0, 9, 17, 0);
mScript.forEach_write2d(a);
mAout.copyTo(mOut);
verifyRange(sc, mOut);
}
public void testWrite3D() {
setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0);
Script.LaunchOptions sc = new Script.LaunchOptions();
sc.setX(9, 37);
sc.setY(17, 27);
sc.setZ(7, 21);
mScript.forEach_write3d(mAout, sc);
mAout.copyTo(mOut);
verifyRange(sc, mOut);
}
public void testWrite3DAdapter1D() {
setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0);
Script.LaunchOptions sc = new Script.LaunchOptions();
sc.setX(9, 37);
sc.setY(17, 18);
sc.setZ(7, 8);
AllocationAdapter a = makeAdapter(mAout, 28, 0, 0, 9, 17, 7);
mScript.forEach_write1d(a);
mAout.copyTo(mOut);
verifyRange(sc, mOut);
}
public void testWrite3DAdapter2D() {
setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0);
Script.LaunchOptions sc = new Script.LaunchOptions();
sc.setX(9, 37);
sc.setY(17, 27);
sc.setZ(7, 8);
AllocationAdapter a = makeAdapter(mAout, 28, 10, 0, 9, 17, 7);
mScript.forEach_write2d(a);
mAout.copyTo(mOut);
verifyRange(sc, mOut);
}
public void testWrite3DAdapter3D() {
setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0);
Script.LaunchOptions sc = new Script.LaunchOptions();
sc.setX(9, 37);
sc.setY(17, 27);
sc.setZ(7, 21);
AllocationAdapter a = makeAdapter(mAout, 28, 10, 14, 9, 17, 7);
mScript.forEach_write3d(a);
mAout.copyTo(mOut);
verifyRange(sc, mOut);
}
}