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