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 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 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 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 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 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 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 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 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 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 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