• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013 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 #include <jni.h>
18 #include <android/log.h>
19 
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <math.h>
23 
24 #include <RenderScript.h>
25 
26 #define  LOG_TAG    "rscpptest"
27 #define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
28 #define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
29 
30 #include "ScriptC_setelementat.h"
31 
32 using namespace android::RSC;
33 
createTypedHelper(sp<RS> mRS,sp<const Element> e)34 static void createTypedHelper (sp<RS> mRS, sp<const Element> e) {
35     Type::Builder typeBuilder(mRS, e);
36     for (int mips = 0; mips <= 1; mips ++) {
37         bool useMips = (mips == 1);
38 
39         for (int faces = 0; faces <= 1; faces++) {
40             bool useFaces = (faces == 1);
41 
42             for (uint32_t x = 1; x < 8; x ++) {
43                 for (uint32_t y = 1; y < 8; y ++) {
44                     typeBuilder.setMipmaps(useMips);
45                     typeBuilder.setFaces(useFaces);
46                     typeBuilder.setX(x);
47                     typeBuilder.setY(y);
48                     Allocation::createTyped(mRS, typeBuilder.create());
49                 }
50             }
51         }
52     }
53 
54 }
55 
Java_android_cts_rscpp_RSAllocationTest_typedTest(JNIEnv * env,jclass obj,jstring pathObj)56 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_typedTest(JNIEnv * env,
57                                                                                         jclass obj,
58                                                                                         jstring pathObj)
59 {
60     const char * path = env->GetStringUTFChars(pathObj, NULL);
61     sp<RS> mRS = new RS();
62     mRS->init(path);
63     env->ReleaseStringUTFChars(pathObj, path);
64 
65     createTypedHelper(mRS, Element::A_8(mRS));
66     createTypedHelper(mRS, Element::RGBA_4444(mRS));
67     createTypedHelper(mRS, Element::RGBA_5551(mRS));
68     createTypedHelper(mRS, Element::RGB_565(mRS));
69     createTypedHelper(mRS, Element::RGB_888(mRS));
70     createTypedHelper(mRS, Element::RGBA_8888(mRS));
71     createTypedHelper(mRS, Element::F32(mRS));
72     createTypedHelper(mRS, Element::F32_2(mRS));
73     createTypedHelper(mRS, Element::F32_3(mRS));
74     createTypedHelper(mRS, Element::F32_4(mRS));
75     createTypedHelper(mRS, Element::F64(mRS));
76     createTypedHelper(mRS, Element::F64_2(mRS));
77     createTypedHelper(mRS, Element::F64_3(mRS));
78     createTypedHelper(mRS, Element::F64_4(mRS));
79     createTypedHelper(mRS, Element::I8(mRS));
80     createTypedHelper(mRS, Element::I8_2(mRS));
81     createTypedHelper(mRS, Element::I8_3(mRS));
82     createTypedHelper(mRS, Element::I8_4(mRS));
83     createTypedHelper(mRS, Element::I16(mRS));
84     createTypedHelper(mRS, Element::I16_2(mRS));
85     createTypedHelper(mRS, Element::I16_3(mRS));
86     createTypedHelper(mRS, Element::I16_4(mRS));
87     createTypedHelper(mRS, Element::I32(mRS));
88     createTypedHelper(mRS, Element::I32_2(mRS));
89     createTypedHelper(mRS, Element::I32_3(mRS));
90     createTypedHelper(mRS, Element::I32_4(mRS));
91     createTypedHelper(mRS, Element::I64(mRS));
92     createTypedHelper(mRS, Element::I64_2(mRS));
93     createTypedHelper(mRS, Element::I64_3(mRS));
94     createTypedHelper(mRS, Element::I64_4(mRS));
95     createTypedHelper(mRS, Element::U8(mRS));
96     createTypedHelper(mRS, Element::U8_2(mRS));
97     createTypedHelper(mRS, Element::U8_3(mRS));
98     createTypedHelper(mRS, Element::U8_4(mRS));
99     createTypedHelper(mRS, Element::U16(mRS));
100     createTypedHelper(mRS, Element::U16_2(mRS));
101     createTypedHelper(mRS, Element::U16_3(mRS));
102     createTypedHelper(mRS, Element::U16_4(mRS));
103     createTypedHelper(mRS, Element::U32(mRS));
104     createTypedHelper(mRS, Element::U32_2(mRS));
105     createTypedHelper(mRS, Element::U32_3(mRS));
106     createTypedHelper(mRS, Element::U32_4(mRS));
107     createTypedHelper(mRS, Element::U64(mRS));
108     createTypedHelper(mRS, Element::U64_2(mRS));
109     createTypedHelper(mRS, Element::U64_3(mRS));
110     createTypedHelper(mRS, Element::U64_4(mRS));
111     createTypedHelper(mRS, Element::MATRIX_2X2(mRS));
112     createTypedHelper(mRS, Element::MATRIX_3X3(mRS));
113     createTypedHelper(mRS, Element::MATRIX_4X4(mRS));
114     createTypedHelper(mRS, Element::SAMPLER(mRS));
115     createTypedHelper(mRS, Element::SCRIPT(mRS));
116     createTypedHelper(mRS, Element::TYPE(mRS));
117     createTypedHelper(mRS, Element::BOOLEAN(mRS));
118     createTypedHelper(mRS, Element::ELEMENT(mRS));
119     createTypedHelper(mRS, Element::ALLOCATION(mRS));
120 
121     mRS->finish();
122     return true;
123 }
124 
helperFloatCopy(sp<RS> mRS,int nElems,int offset,int count,int copyMode)125 static bool helperFloatCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
126     bool passed = true;
127     sp<Allocation> A = Allocation::createSized(mRS, Element::F32(mRS), nElems);
128 
129     float *src, *dst;
130     src = new float[nElems];
131     dst = new float[nElems];
132 
133     for (int i = 0; i < count; i++) {
134         src[i] = (float)i;
135         dst[offset + i] = -1.0f;
136     }
137 
138     switch (copyMode) {
139     case 0: A->copy1DFrom(src); break;
140     case 1: A->copy1DRangeFrom(offset, count, src); break;
141     }
142     A->copy1DTo(dst);
143 
144     for (int i = 0; i < count; i++) {
145         if (dst[offset + i] != src[i]) {
146             passed = false;
147             break;
148         }
149     }
150 
151     delete[] src;
152     delete[] dst;
153     return passed;
154 }
155 
helperCharCopy(sp<RS> mRS,int nElems,int offset,int count,int copyMode)156 static bool helperCharCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
157     bool passed = true;
158     sp<Allocation> A = Allocation::createSized(mRS, Element::I8(mRS), nElems);
159 
160     char *src, *dst;
161     src = new char[nElems];
162     dst = new char[nElems];
163 
164     for (int i = 0; i < count; i++) {
165         src[i] = (char)i;
166         dst[offset + i] = -1;
167     }
168 
169     switch (copyMode) {
170     case 0: A->copy1DFrom(src); break;
171     case 1: A->copy1DRangeFrom(offset, count, src); break;
172     }
173     A->copy1DTo(dst);
174 
175     for (int i = 0; i < count; i++) {
176         if (dst[offset + i] != src[i]) {
177             passed = false;
178             break;
179         }
180     }
181 
182     delete[] src;
183     delete[] dst;
184     return passed;
185 }
186 
helperShortCopy(sp<RS> mRS,int nElems,int offset,int count,int copyMode)187 static bool helperShortCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
188     bool passed = true;
189     sp<Allocation> A = Allocation::createSized(mRS, Element::I16(mRS), nElems);
190 
191     short *src, *dst;
192     src = new short[nElems];
193     dst = new short[nElems];
194 
195     for (int i = 0; i < count; i++) {
196         src[i] = (short)i;
197         dst[offset + i] = -1;
198     }
199 
200     switch (copyMode) {
201     case 0: A->copy1DFrom(src); break;
202     case 1: A->copy1DRangeFrom(offset, count, src); break;
203     }
204     A->copy1DTo(dst);
205 
206     for (int i = 0; i < count; i++) {
207         if (dst[offset + i] != src[i]) {
208             passed = false;
209             break;
210         }
211     }
212 
213     delete[] src;
214     delete[] dst;
215     return passed;
216 }
217 
helperIntCopy(sp<RS> mRS,int nElems,int offset,int count,int copyMode)218 static bool helperIntCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
219     bool passed = true;
220     sp<Allocation> A = Allocation::createSized(mRS, Element::I32(mRS), nElems);
221 
222     int *src, *dst;
223     src = new int[nElems];
224     dst = new int[nElems];
225 
226     for (int i = 0; i < count; i++) {
227         src[i] = (int)i;
228         dst[offset + i] = -1;
229     }
230 
231     switch (copyMode) {
232     case 0: A->copy1DFrom(src); break;
233     case 1: A->copy1DRangeFrom(offset, count, src); break;
234     }
235     A->copy1DTo(dst);
236 
237     for (int i = 0; i < count; i++) {
238         if (dst[offset + i] != src[i]) {
239             passed = false;
240             break;
241         }
242     }
243 
244     delete[] src;
245     delete[] dst;
246     return passed;
247 }
248 
helperDoubleCopy(sp<RS> mRS,int nElems,int offset,int count,int copyMode)249 static bool helperDoubleCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
250     bool passed = true;
251     sp<Allocation> A = Allocation::createSized(mRS, Element::F64(mRS), nElems);
252 
253     double *src, *dst;
254     src = new double[nElems];
255     dst = new double[nElems];
256 
257     for (int i = 0; i < count; i++) {
258         src[i] = (double)i;
259         dst[offset + i] = -1;
260     }
261 
262     switch (copyMode) {
263     case 0: A->copy1DFrom(src); break;
264     case 1: A->copy1DRangeFrom(offset, count, src); break;
265     }
266     A->copy1DTo(dst);
267 
268     for (int i = 0; i < count; i++) {
269         if (dst[offset + i] != src[i]) {
270             passed = false;
271             break;
272         }
273     }
274 
275     delete[] src;
276     delete[] dst;
277     return passed;
278 }
279 
helperFloatAllocationCopy(sp<RS> mRS,int nElems,int offset,int count)280 static bool helperFloatAllocationCopy(sp<RS> mRS, int nElems, int offset, int count) {
281 
282     bool passed = true;
283     sp<Allocation> srcA = Allocation::createSized(mRS, Element::F32(mRS), nElems);
284     sp<Allocation> dstA = Allocation::createSized(mRS, Element::F32(mRS), nElems);
285 
286     float *src, *dst;
287     src = new float[nElems];
288     dst = new float[nElems];
289     for (int i = 0; i < nElems; i++) {
290         src[i] = (float)i;
291         dst[i] = -1.0f;
292     }
293 
294     // First populate the source allocation
295     srcA->copy1DFrom(src);
296     // Now test allocation to allocation copy
297     dstA->copy1DRangeFrom(offset, count, srcA, offset);
298     dstA->copy1DTo(dst);
299 
300     for (int i = 0; i < count; i++) {
301         if (dst[offset + i] != src[offset + i]) {
302             passed = false;
303             break;
304         }
305     }
306 
307     delete[] src;
308     delete[] dst;
309     return passed;
310 }
311 
312 static int elemsToTest = 20;
313 
Java_android_cts_rscpp_RSAllocationTest_test1DCopy(JNIEnv * env,jclass obj,jstring pathObj)314 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_test1DCopy(JNIEnv * env,
315                                                                                          jclass obj,
316                                                                                          jstring pathObj)
317 {
318     const char * path = env->GetStringUTFChars(pathObj, NULL);
319     sp<RS> mRS = new RS();
320     mRS->init(path);
321     env->ReleaseStringUTFChars(pathObj, path);
322     bool passed = true;
323 
324     for (int s = 8; s <= elemsToTest; s += 2) {
325         for (int mode = 0; mode < 1; mode ++) {
326             passed &= helperFloatCopy(mRS, s, 0, s, mode);
327             passed &= helperCharCopy(mRS, s, 0, s, mode);
328             passed &= helperShortCopy(mRS, s, 0, s, mode);
329             passed &= helperIntCopy(mRS, s, 0, s, mode);
330             //helperBaseObjCopy(mRS, s, 0, s, mode);
331         }
332 
333         // now test copy range
334         for (int mode = 1; mode < 2; mode ++) {
335             for (int off = 0; off < s; off ++) {
336                 for (int count = 1; count <= s - off; count ++) {
337                     passed &= helperFloatCopy(mRS, s, off, count, mode);
338                     passed &= helperCharCopy(mRS, s, off, count, mode);
339                     passed &= helperShortCopy(mRS, s, off, count, mode);
340                     passed &= helperIntCopy(mRS, s, off, count, mode);
341                     //helperBaseObjCopy(mRS, s, off, count, mode);
342                 }
343             }
344         }
345 
346         for (int off = 0; off < s; off ++) {
347             for (int count = 1; count <= s - off; count ++) {
348                 passed &= helperFloatAllocationCopy(mRS, s, off, count);
349                 //helperByteAllocationCopy(mRS, s, off, count);
350             }
351         }
352     }
353     return passed;
354 }
355 
Java_android_cts_rscpp_RSAllocationTest_testSetElementAt(JNIEnv * env,jclass obj,jstring pathObj)356 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_testSetElementAt(JNIEnv * env,
357                                                                                                jclass obj,
358                                                                                                jstring pathObj)
359 {
360     const char * path = env->GetStringUTFChars(pathObj, NULL);
361     sp<RS> mRS = new RS();
362     mRS->init(path);
363     env->ReleaseStringUTFChars(pathObj, path);
364 
365     bool passed = true;
366 
367     Type::Builder b(mRS, Element::I32(mRS));
368     b.setX(48);
369     sp<Allocation> largeArray = Allocation::createTyped(mRS, b.create());
370     b.setX(1);
371     sp<Allocation> singleElement = Allocation::createTyped(mRS, b.create());
372 
373     sp<ScriptC_setelementat> script = new ScriptC_setelementat(mRS);
374 
375     script->set_memset_toValue(1);
376     script->forEach_memset(singleElement);
377 
378     script->set_dimX(48);
379     script->set_array(largeArray);
380 
381     script->forEach_setLargeArray(singleElement);
382 
383     int result = 0;
384 
385     script->set_compare_value(10);
386     script->forEach_compare(largeArray);
387     script->forEach_getCompareResult(singleElement);
388     singleElement->copy1DTo(&result);
389     if (result != 2) {
390         passed = false;
391     }
392 
393     return passed;
394 }
395