1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.renderscript.cts; 18 19 import android.renderscript.*; 20 21 22 23 public class LaunchClip extends RSBaseCompute { 24 Allocation mAPassFail; 25 Allocation mAin; 26 Allocation mAout; 27 ScriptC_launchclip mScript; 28 29 int[] mIn; 30 int[] mOut; 31 int[] mPassFail; 32 33 int mDimX = 0; 34 int mDimY = 0; 35 int mDimZ = 0; 36 boolean mHasFaces = false; 37 boolean mHasLods = false; 38 int mDimA0 = 0; 39 int mDimA1 = 0; 40 int mDimA2 = 0; 41 int mDimA3 = 0; 42 int mCellCount = 0; 43 44 void setup(boolean makeIn, boolean makeOut, int x, int y, int z, boolean face, boolean lods, 45 int a0, int a1, int a2, int a3) { 46 47 mDimX = x; 48 mDimY = y; 49 mDimZ = z; 50 mHasFaces = face; 51 mHasLods = lods; 52 mDimA0 = a0; 53 mDimA1 = a1; 54 mDimA2 = a2; 55 mDimA3 = a3; 56 57 mScript = new ScriptC_launchclip(mRS); 58 mScript.set_dimX(mDimX); 59 mScript.set_dimY(mDimY); 60 mScript.set_dimZ(mDimZ); 61 mScript.set_hasFaces(mHasFaces); 62 mScript.set_hasLod(mHasLods); 63 mScript.set_dimA0(mDimA0); 64 mScript.set_dimA1(mDimA1); 65 mScript.set_dimA2(mDimA2); 66 mScript.set_dimA3(mDimA3); 67 68 Type.Builder tb = new Type.Builder(mRS, Element.I32(mRS)); 69 tb.setX(mDimX); 70 if (mDimY > 0) tb.setY(mDimY); 71 if (mDimZ > 0) tb.setZ(mDimZ); 72 if (mHasFaces) tb.setFaces(true); 73 if (mHasLods) tb.setMipmaps(true); 74 //if (mDimA0 != 0) tb.setArray(0, mDimA0); 75 //if (mDimA1 != 0) tb.setArray(1, mDimA1); 76 //if (mDimA2 != 0) tb.setArray(2, mDimA2); 77 //if (mDimA3 != 0) tb.setArray(3, mDimA3); 78 Type t = tb.create(); 79 80 if (makeIn) { 81 mIn = new int[t.getCount()]; 82 mAin = Allocation.createTyped(mRS, t); 83 mScript.forEach_zero(mAin); 84 } 85 if (makeOut) { 86 mOut = new int[t.getCount()]; 87 mAout = Allocation.createTyped(mRS, t); 88 mScript.forEach_zero(mAout); 89 } 90 91 mPassFail = new int[1]; 92 mAPassFail = Allocation.createSized(mRS, Element.U32(mRS), 1); 93 mAPassFail.copyFrom(mPassFail); 94 mScript.set_passfail(mAPassFail); 95 } 96 97 @Override 98 protected void tearDown() throws Exception { 99 if (mAPassFail != null) { 100 mAPassFail.destroy(); 101 } 102 if (mAin != null) { 103 mAin.destroy(); 104 } 105 if (mAout != null) { 106 mAout.destroy(); 107 } 108 if (mScript != null) { 109 mScript.destroy(); 110 } 111 super.tearDown(); 112 } 113 114 private void verifyCell(int x, int y, int z, int[] a, Script.LaunchOptions sc) { 115 int expected = 0x80000000; 116 boolean inRange = true; 117 118 if (mDimX != 0) { 119 if (x >= sc.getXStart() && x < sc.getXEnd()) { 120 expected |= x; 121 } else { 122 inRange = false; 123 } 124 } 125 126 if (mDimY != 0) { 127 if (y >= sc.getYStart() && y < sc.getYEnd()) { 128 expected |= y << 8; 129 } else { 130 inRange = false; 131 } 132 } 133 134 if (mDimZ != 0) { 135 if (z >= sc.getZStart() && z < sc.getZEnd()) { 136 expected |= z << 16; 137 } else { 138 inRange = false; 139 } 140 } 141 142 if (!inRange) { 143 expected = 0; 144 } 145 146 int val = a[x + y * mDimX + z * mDimX * mDimY]; 147 if (val != expected) { 148 String s = new String("verify error @ " + x + ", " + y + ", " + z + 149 ", expected " + expected + ", got " + val); 150 ///android.util.Log.e("rs", s); 151 throw new IllegalStateException(s); 152 } 153 } 154 155 void verifyRange(Script.LaunchOptions sc, int[] a) { 156 int itY = (mDimY > 0) ? mDimY : 1; 157 int itZ = (mDimZ > 0) ? mDimZ : 1; 158 159 for (int x = 0; x < mDimX; x++) { 160 for (int y = 0; y < itY; y++) { 161 for (int z = 0; z < itZ; z++) { 162 verifyCell(x, y, z, a, sc); 163 } 164 } 165 } 166 } 167 168 AllocationAdapter makeAdapter(Allocation base, int ax, int ay, int az, int ox, int oy, int oz) { 169 Type.Builder tb = new Type.Builder(mRS, base.getType().getElement()); 170 tb.setX(ax); 171 if (ay > 0) { 172 tb.setY(ay); 173 } 174 if (az > 0) { 175 tb.setZ(az); 176 } 177 Type t = tb.create(); 178 179 AllocationAdapter a = AllocationAdapter.createTyped(mRS, base, t); 180 a.setX(ox); 181 if (base.getType().getY() > 0) { 182 a.setY(oy); 183 } 184 if (base.getType().getZ() > 0) { 185 a.setZ(oz); 186 } 187 188 mScript.set_biasX(ox); 189 mScript.set_biasY(oy); 190 mScript.set_biasZ(oz); 191 return a; 192 } 193 194 public void testWrite1D() { 195 setup(false, true, 256, 0, 0, false, false, 0, 0, 0, 0); 196 Script.LaunchOptions sc = new Script.LaunchOptions(); 197 sc.setX(9, 77); 198 199 mScript.forEach_write1d(mAout, sc); 200 mAout.copyTo(mOut); 201 202 verifyRange(sc, mOut); 203 } 204 205 public void testWrite1DAdapter1D() { 206 setup(false, true, 256, 0, 0, false, false, 0, 0, 0, 0); 207 Script.LaunchOptions sc = new Script.LaunchOptions(); 208 sc.setX(9, 77); 209 210 AllocationAdapter a = makeAdapter(mAout, 68, 0, 0, 9, 0, 0); 211 mScript.forEach_write1d(a); 212 mAout.copyTo(mOut); 213 214 verifyRange(sc, mOut); 215 } 216 217 218 public void testWrite2D() { 219 setup(false, true, 256, 256, 0, false, false, 0, 0, 0, 0); 220 Script.LaunchOptions sc = new Script.LaunchOptions(); 221 sc.setX(9, 77); 222 sc.setY(17, 177); 223 224 mScript.forEach_write2d(mAout, sc); 225 mAout.copyTo(mOut); 226 227 verifyRange(sc, mOut); 228 } 229 230 public void testWrite2DAdapter1D() { 231 setup(false, true, 256, 256, 0, false, false, 0, 0, 0, 0); 232 Script.LaunchOptions sc = new Script.LaunchOptions(); 233 sc.setX(9, 77); 234 sc.setY(17, 18); 235 236 AllocationAdapter a = makeAdapter(mAout, 68, 0, 0, 9, 17, 0); 237 mScript.forEach_write1d(a); 238 mAout.copyTo(mOut); 239 240 verifyRange(sc, mOut); 241 } 242 243 public void testWrite2DAdapter2D() { 244 setup(false, true, 256, 256, 0, false, false, 0, 0, 0, 0); 245 Script.LaunchOptions sc = new Script.LaunchOptions(); 246 sc.setX(9, 77); 247 sc.setY(17, 177); 248 249 AllocationAdapter a = makeAdapter(mAout, 68, 160, 0, 9, 17, 0); 250 mScript.forEach_write2d(a); 251 mAout.copyTo(mOut); 252 253 verifyRange(sc, mOut); 254 } 255 256 public void testWrite3D() { 257 setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0); 258 259 Script.LaunchOptions sc = new Script.LaunchOptions(); 260 sc.setX(9, 37); 261 sc.setY(17, 27); 262 sc.setZ(7, 21); 263 mScript.forEach_write3d(mAout, sc); 264 mAout.copyTo(mOut); 265 266 verifyRange(sc, mOut); 267 } 268 269 public void testWrite3DAdapter1D() { 270 setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0); 271 272 Script.LaunchOptions sc = new Script.LaunchOptions(); 273 sc.setX(9, 37); 274 sc.setY(17, 18); 275 sc.setZ(7, 8); 276 277 AllocationAdapter a = makeAdapter(mAout, 28, 0, 0, 9, 17, 7); 278 mScript.forEach_write1d(a); 279 mAout.copyTo(mOut); 280 281 verifyRange(sc, mOut); 282 } 283 284 public void testWrite3DAdapter2D() { 285 setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0); 286 287 Script.LaunchOptions sc = new Script.LaunchOptions(); 288 sc.setX(9, 37); 289 sc.setY(17, 27); 290 sc.setZ(7, 8); 291 292 AllocationAdapter a = makeAdapter(mAout, 28, 10, 0, 9, 17, 7); 293 mScript.forEach_write2d(a); 294 mAout.copyTo(mOut); 295 296 verifyRange(sc, mOut); 297 } 298 299 public void testWrite3DAdapter3D() { 300 setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0); 301 302 Script.LaunchOptions sc = new Script.LaunchOptions(); 303 sc.setX(9, 37); 304 sc.setY(17, 27); 305 sc.setZ(7, 21); 306 307 AllocationAdapter a = makeAdapter(mAout, 28, 10, 14, 9, 17, 7); 308 mScript.forEach_write3d(a); 309 mAout.copyTo(mOut); 310 311 verifyRange(sc, mOut); 312 } 313 314 } 315