Home | History | Annotate | Download | only in cts
      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