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 
setup(boolean makeIn, boolean makeOut, int x, int y, int z, boolean face, boolean lods, int a0, int a1, int a2, int a3)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 
verifyCell(int x, int y, int z, int[] a, Script.LaunchOptions sc)97     private void verifyCell(int x, int y, int z, int[] a, Script.LaunchOptions sc) {
98         int expected = 0x80000000;
99         boolean inRange = true;
100 
101         if (mDimX != 0) {
102             if (x >= sc.getXStart() && x < sc.getXEnd()) {
103                 expected |= x;
104             } else {
105                 inRange = false;
106             }
107         }
108 
109         if (mDimY != 0) {
110             if (y >= sc.getYStart() && y < sc.getYEnd()) {
111                 expected |= y << 8;
112             } else {
113                 inRange = false;
114             }
115         }
116 
117         if (mDimZ != 0) {
118             if (z >= sc.getZStart() && z < sc.getZEnd()) {
119                 expected |= z << 16;
120             } else {
121                 inRange = false;
122             }
123         }
124 
125         if (!inRange) {
126             expected = 0;
127         }
128 
129         int val = a[x + y * mDimX + z * mDimX * mDimY];
130         if (val != expected) {
131             String s = new String("verify error @ " + x + ", " + y + ", " + z +
132                                   ", expected " + expected + ", got " + val);
133             ///android.util.Log.e("rs", s);
134             throw new IllegalStateException(s);
135         }
136     }
137 
verifyRange(Script.LaunchOptions sc, int[] a)138     void verifyRange(Script.LaunchOptions sc, int[] a) {
139         int itY = (mDimY > 0) ? mDimY : 1;
140         int itZ = (mDimZ > 0) ? mDimZ : 1;
141 
142         for (int x = 0; x < mDimX; x++) {
143             for (int y = 0; y < itY; y++) {
144                 for (int z = 0; z < itZ; z++) {
145                     verifyCell(x, y, z, a, sc);
146                 }
147             }
148         }
149     }
150 
makeAdapter(Allocation base, int ax, int ay, int az, int ox, int oy, int oz)151     AllocationAdapter makeAdapter(Allocation base, int ax, int ay, int az, int ox, int oy, int oz) {
152         Type.Builder tb = new Type.Builder(mRS, base.getType().getElement());
153         tb.setX(ax);
154         if (ay > 0) {
155             tb.setY(ay);
156         }
157         if (az > 0) {
158             tb.setZ(az);
159         }
160         Type t = tb.create();
161 
162         AllocationAdapter a = AllocationAdapter.createTyped(mRS, base, t);
163         a.setX(ox);
164         if (base.getType().getY() > 0) {
165             a.setY(oy);
166         }
167         if (base.getType().getZ() > 0) {
168             a.setZ(oz);
169         }
170 
171         mScript.set_biasX(ox);
172         mScript.set_biasY(oy);
173         mScript.set_biasZ(oz);
174         return a;
175     }
176 
testWrite1D()177     public void testWrite1D() {
178         setup(false, true, 256, 0, 0, false, false, 0, 0, 0, 0);
179         Script.LaunchOptions sc = new Script.LaunchOptions();
180         sc.setX(9, 77);
181 
182         mScript.forEach_write1d(mAout, sc);
183         mAout.copyTo(mOut);
184 
185         verifyRange(sc, mOut);
186     }
187 
testWrite1DAdapter1D()188     public void testWrite1DAdapter1D() {
189         setup(false, true, 256, 0, 0, false, false, 0, 0, 0, 0);
190         Script.LaunchOptions sc = new Script.LaunchOptions();
191         sc.setX(9, 77);
192 
193         AllocationAdapter a = makeAdapter(mAout, 68, 0, 0,  9, 0, 0);
194         mScript.forEach_write1d(a);
195         mAout.copyTo(mOut);
196 
197         verifyRange(sc, mOut);
198     }
199 
200 
testWrite2D()201     public void testWrite2D() {
202         setup(false, true, 256, 256, 0, false, false, 0, 0, 0, 0);
203         Script.LaunchOptions sc = new Script.LaunchOptions();
204         sc.setX(9, 77);
205         sc.setY(17, 177);
206 
207         mScript.forEach_write2d(mAout, sc);
208         mAout.copyTo(mOut);
209 
210         verifyRange(sc, mOut);
211     }
212 
testWrite2DAdapter1D()213     public void testWrite2DAdapter1D() {
214         setup(false, true, 256, 256, 0, false, false, 0, 0, 0, 0);
215         Script.LaunchOptions sc = new Script.LaunchOptions();
216         sc.setX(9, 77);
217         sc.setY(17, 18);
218 
219         AllocationAdapter a = makeAdapter(mAout, 68, 0, 0,  9, 17, 0);
220         mScript.forEach_write1d(a);
221         mAout.copyTo(mOut);
222 
223         verifyRange(sc, mOut);
224     }
225 
testWrite2DAdapter2D()226     public void testWrite2DAdapter2D() {
227         setup(false, true, 256, 256, 0, false, false, 0, 0, 0, 0);
228         Script.LaunchOptions sc = new Script.LaunchOptions();
229         sc.setX(9, 77);
230         sc.setY(17, 177);
231 
232         AllocationAdapter a = makeAdapter(mAout, 68, 160, 0,  9, 17, 0);
233         mScript.forEach_write2d(a);
234         mAout.copyTo(mOut);
235 
236         verifyRange(sc, mOut);
237     }
238 
testWrite3D()239     public void testWrite3D() {
240         setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0);
241 
242         Script.LaunchOptions sc = new Script.LaunchOptions();
243         sc.setX(9, 37);
244         sc.setY(17, 27);
245         sc.setZ(7, 21);
246         mScript.forEach_write3d(mAout, sc);
247         mAout.copyTo(mOut);
248 
249         verifyRange(sc, mOut);
250     }
251 
testWrite3DAdapter1D()252     public void testWrite3DAdapter1D() {
253         setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0);
254 
255         Script.LaunchOptions sc = new Script.LaunchOptions();
256         sc.setX(9, 37);
257         sc.setY(17, 18);
258         sc.setZ(7, 8);
259 
260         AllocationAdapter a = makeAdapter(mAout, 28, 0, 0,  9, 17, 7);
261         mScript.forEach_write1d(a);
262         mAout.copyTo(mOut);
263 
264         verifyRange(sc, mOut);
265     }
266 
testWrite3DAdapter2D()267     public void testWrite3DAdapter2D() {
268         setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0);
269 
270         Script.LaunchOptions sc = new Script.LaunchOptions();
271         sc.setX(9, 37);
272         sc.setY(17, 27);
273         sc.setZ(7, 8);
274 
275         AllocationAdapter a = makeAdapter(mAout, 28, 10, 0,  9, 17, 7);
276         mScript.forEach_write2d(a);
277         mAout.copyTo(mOut);
278 
279         verifyRange(sc, mOut);
280     }
281 
testWrite3DAdapter3D()282     public void testWrite3DAdapter3D() {
283         setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0);
284 
285         Script.LaunchOptions sc = new Script.LaunchOptions();
286         sc.setX(9, 37);
287         sc.setY(17, 27);
288         sc.setZ(7, 21);
289 
290         AllocationAdapter a = makeAdapter(mAout, 28, 10, 14,  9, 17, 7);
291         mScript.forEach_write3d(a);
292         mAout.copyTo(mOut);
293 
294         verifyRange(sc, mOut);
295     }
296 
297 }
298