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 #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_foreach.h" 31 #include "ScriptC_fe_all.h" 32 #include "ScriptC_noroot.h" 33 34 using namespace android::RSC; 35 36 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSForEachTest_testForEach(JNIEnv * env, 37 jclass obj, 38 jstring pathObj) 39 { 40 const char * path = env->GetStringUTFChars(pathObj, NULL); 41 sp<RS> mRS = new RS(); 42 mRS->init(path); 43 env->ReleaseStringUTFChars(pathObj, path); 44 45 bool passed = true; 46 int x = 7; 47 48 sp<ScriptC_fe_all> fe_all = new ScriptC_fe_all(mRS); 49 sp<const Type> t = Type::create(mRS, Element::I8(mRS), x, 0, 0); 50 51 // I8 52 sp<Allocation> in = Allocation::createTyped(mRS, t); 53 t = Type::create(mRS, Element::U8(mRS), x, 0, 0); 54 sp<Allocation> out = Allocation::createTyped(mRS, t); 55 fe_all->forEach_test_i8(in, out); 56 mRS->finish(); 57 58 // I8_2 59 t = Type::create(mRS, Element::I8_2(mRS), x, 0, 0); 60 in = Allocation::createTyped(mRS, t); 61 t = Type::create(mRS, Element::U8_2(mRS), x, 0, 0); 62 out = Allocation::createTyped(mRS, t); 63 fe_all->forEach_test_i8_2(in, out); 64 mRS->finish(); 65 66 // I8_3 67 t = Type::create(mRS, Element::I8_3(mRS), x, 0, 0); 68 in = Allocation::createTyped(mRS, t); 69 t = Type::create(mRS, Element::U8_3(mRS), x, 0, 0); 70 out = Allocation::createTyped(mRS, t); 71 fe_all->forEach_test_i8_3(in, out); 72 mRS->finish(); 73 74 // I8_4 75 t = Type::create(mRS, Element::I8_4(mRS), x, 0, 0); 76 in = Allocation::createTyped(mRS, t); 77 t = Type::create(mRS, Element::U8_4(mRS), x, 0, 0); 78 out = Allocation::createTyped(mRS, t); 79 fe_all->forEach_test_i8_4(in, out); 80 mRS->finish(); 81 82 // I16 83 t = Type::create(mRS, Element::I16(mRS), x, 0, 0); 84 in = Allocation::createTyped(mRS, t); 85 t = Type::create(mRS, Element::U16(mRS), x, 0, 0); 86 out = Allocation::createTyped(mRS, t); 87 fe_all->forEach_test_i16(in, out); 88 mRS->finish(); 89 90 // I16_2 91 t = Type::create(mRS, Element::I16_2(mRS), x, 0, 0); 92 in = Allocation::createTyped(mRS, t); 93 t = Type::create(mRS, Element::U16_2(mRS), x, 0, 0); 94 out = Allocation::createTyped(mRS, t); 95 fe_all->forEach_test_i16_2(in, out); 96 mRS->finish(); 97 98 // I16_3 99 t = Type::create(mRS, Element::I16_3(mRS), x, 0, 0); 100 in = Allocation::createTyped(mRS, t); 101 t = Type::create(mRS, Element::U16_3(mRS), x, 0, 0); 102 out = Allocation::createTyped(mRS, t); 103 fe_all->forEach_test_i16_3(in, out); 104 mRS->finish(); 105 106 // I16_4 107 t = Type::create(mRS, Element::I16_4(mRS), x, 0, 0); 108 in = Allocation::createTyped(mRS, t); 109 t = Type::create(mRS, Element::U16_4(mRS), x, 0, 0); 110 out = Allocation::createTyped(mRS, t); 111 fe_all->forEach_test_i16_4(in, out); 112 mRS->finish(); 113 114 // I32 115 t = Type::create(mRS, Element::I32(mRS), x, 0, 0); 116 in = Allocation::createTyped(mRS, t); 117 t = Type::create(mRS, Element::U32(mRS), x, 0, 0); 118 out = Allocation::createTyped(mRS, t); 119 fe_all->forEach_test_i32(in, out); 120 mRS->finish(); 121 122 // I32_2 123 t = Type::create(mRS, Element::I32_2(mRS), x, 0, 0); 124 in = Allocation::createTyped(mRS, t); 125 t = Type::create(mRS, Element::U32_2(mRS), x, 0, 0); 126 out = Allocation::createTyped(mRS, t); 127 fe_all->forEach_test_i32_2(in, out); 128 mRS->finish(); 129 130 // I32_3 131 t = Type::create(mRS, Element::I32_3(mRS), x, 0, 0); 132 in = Allocation::createTyped(mRS, t); 133 t = Type::create(mRS, Element::U32_3(mRS), x, 0, 0); 134 out = Allocation::createTyped(mRS, t); 135 fe_all->forEach_test_i32_3(in, out); 136 mRS->finish(); 137 138 // I32_4 139 t = Type::create(mRS, Element::I32_4(mRS), x, 0, 0); 140 in = Allocation::createTyped(mRS, t); 141 t = Type::create(mRS, Element::U32_4(mRS), x, 0, 0); 142 out = Allocation::createTyped(mRS, t); 143 fe_all->forEach_test_i32_4(in, out); 144 mRS->finish(); 145 146 // I64 147 t = Type::create(mRS, Element::I64(mRS), x, 0, 0); 148 in = Allocation::createTyped(mRS, t); 149 t = Type::create(mRS, Element::U64(mRS), x, 0, 0); 150 out = Allocation::createTyped(mRS, t); 151 fe_all->forEach_test_i64(in, out); 152 mRS->finish(); 153 154 // I64_2 155 t = Type::create(mRS, Element::I64_2(mRS), x, 0, 0); 156 in = Allocation::createTyped(mRS, t); 157 t = Type::create(mRS, Element::U64_2(mRS), x, 0, 0); 158 out = Allocation::createTyped(mRS, t); 159 fe_all->forEach_test_i64_2(in, out); 160 mRS->finish(); 161 162 // I64_3 163 t = Type::create(mRS, Element::I64_3(mRS), x, 0, 0); 164 in = Allocation::createTyped(mRS, t); 165 t = Type::create(mRS, Element::U64_3(mRS), x, 0, 0); 166 out = Allocation::createTyped(mRS, t); 167 fe_all->forEach_test_i64_3(in, out); 168 mRS->finish(); 169 170 // I64_4 171 t = Type::create(mRS, Element::I64_4(mRS), x, 0, 0); 172 in = Allocation::createTyped(mRS, t); 173 t = Type::create(mRS, Element::U64_4(mRS), x, 0, 0); 174 out = Allocation::createTyped(mRS, t); 175 fe_all->forEach_test_i64_4(in, out); 176 mRS->finish(); 177 178 // F32 179 t = Type::create(mRS, Element::F32(mRS), x, 0, 0); 180 in = Allocation::createTyped(mRS, t); 181 out = Allocation::createTyped(mRS, t); 182 fe_all->forEach_test_f32(in, out); 183 mRS->finish(); 184 185 // F32_2 186 t = Type::create(mRS, Element::F32_2(mRS), x, 0, 0); 187 in = Allocation::createTyped(mRS, t); 188 t = Type::create(mRS, Element::F32_2(mRS), x, 0, 0); 189 out = Allocation::createTyped(mRS, t); 190 fe_all->forEach_test_f32_2(in, out); 191 mRS->finish(); 192 193 // F32_3 194 t = Type::create(mRS, Element::F32_3(mRS), x, 0, 0); 195 in = Allocation::createTyped(mRS, t); 196 out = Allocation::createTyped(mRS, t); 197 fe_all->forEach_test_f32_3(in, out); 198 mRS->finish(); 199 200 // F32_4 201 t = Type::create(mRS, Element::F32_4(mRS), x, 0, 0); 202 in = Allocation::createTyped(mRS, t); 203 out = Allocation::createTyped(mRS, t); 204 fe_all->forEach_test_f32_4(in, out); 205 mRS->finish(); 206 207 // F64 208 t = Type::create(mRS, Element::F64(mRS), x, 0, 0); 209 in = Allocation::createTyped(mRS, t); 210 out = Allocation::createTyped(mRS, t); 211 fe_all->forEach_test_f64(in, out); 212 mRS->finish(); 213 214 // F64_2 215 t = Type::create(mRS, Element::F64_2(mRS), x, 0, 0); 216 in = Allocation::createTyped(mRS, t); 217 out = Allocation::createTyped(mRS, t); 218 fe_all->forEach_test_f64_2(in, out); 219 mRS->finish(); 220 221 // F64_3 222 t = Type::create(mRS, Element::F64_3(mRS), x, 0, 0); 223 in = Allocation::createTyped(mRS, t); 224 out = Allocation::createTyped(mRS, t); 225 fe_all->forEach_test_f64_3(in, out); 226 mRS->finish(); 227 228 // F64_4 229 t = Type::create(mRS, Element::F64_4(mRS), x, 0, 0); 230 in = Allocation::createTyped(mRS, t); 231 out = Allocation::createTyped(mRS, t); 232 fe_all->forEach_test_f64_4(in, out); 233 mRS->finish(); 234 235 // BOOLEAN 236 t = Type::create(mRS, Element::BOOLEAN(mRS), x, 0, 0); 237 in = Allocation::createTyped(mRS, t); 238 out = Allocation::createTyped(mRS, t); 239 fe_all->forEach_test_bool(in, out); 240 mRS->finish(); 241 242 // A_8 243 t = Type::create(mRS, Element::I8(mRS), x, 0, 0); 244 in = Allocation::createTyped(mRS, t); 245 t = Type::create(mRS, Element::A_8(mRS), x, 0, 0); 246 out = Allocation::createTyped(mRS, t); 247 fe_all->forEach_test_i8(in, out); 248 mRS->finish(); 249 250 // RGBA_8888 251 t = Type::create(mRS, Element::I8_4(mRS), x, 0, 0); 252 in = Allocation::createTyped(mRS, t); 253 t = Type::create(mRS, Element::RGBA_8888(mRS), x, 0, 0); 254 out = Allocation::createTyped(mRS, t); 255 fe_all->forEach_test_i8_4(in, out); 256 mRS->finish(); 257 258 // RGB_888 259 t = Type::create(mRS, Element::I8_3(mRS), x, 0, 0); 260 in = Allocation::createTyped(mRS, t); 261 t = Type::create(mRS, Element::RGB_888(mRS), x, 0, 0); 262 out = Allocation::createTyped(mRS, t); 263 fe_all->forEach_test_i8_3(in, out); 264 mRS->finish(); 265 266 return passed; 267 } 268 269 #define RS_MSG_TEST_PASSED 100 270 #define RS_MSG_TEST_FAILED 101 271 272 static int result = 0; 273 static void rsMsgHandler(uint32_t msgNum, const void *msgData, size_t msgLen) { 274 if (result == 0) { 275 result = msgNum; 276 } 277 } 278 279 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSForEachTest_testMultipleForEach(JNIEnv * env, 280 jclass obj, 281 jstring pathObj) 282 { 283 const char * path = env->GetStringUTFChars(pathObj, NULL); 284 sp<RS> mRS = new RS(); 285 mRS->init(path); 286 env->ReleaseStringUTFChars(pathObj, path); 287 MessageHandlerFunc_t mHandler = rsMsgHandler; 288 mRS->setMessageHandler(mHandler); 289 290 bool passed = true; 291 sp<ScriptC_foreach> s = new ScriptC_foreach(mRS); 292 293 int X = 5; 294 int Y = 7; 295 s->set_dimX(X); 296 s->set_dimY(Y); 297 sp<const Type> t = Type::create(mRS, Element::I32(mRS), X, Y, 0); 298 sp<Allocation> A = Allocation::createTyped(mRS, t); 299 s->set_aRaw(A); 300 s->forEach_root(A); 301 s->invoke_verify_root(); 302 s->forEach_foo(A, A); 303 s->invoke_verify_foo(); 304 s->invoke_foreach_test(); 305 mRS->finish(); 306 if (result == RS_MSG_TEST_FAILED) { 307 passed = false; 308 } 309 result = 0; 310 return passed; 311 } 312 313 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSForEachTest_testNoRoot(JNIEnv * env, 314 jclass obj, 315 jstring pathObj) 316 { 317 const char * path = env->GetStringUTFChars(pathObj, NULL); 318 sp<RS> mRS = new RS(); 319 mRS->init(path); 320 env->ReleaseStringUTFChars(pathObj, path); 321 MessageHandlerFunc_t mHandler = rsMsgHandler; 322 mRS->setMessageHandler(mHandler); 323 324 bool passed = true; 325 sp<ScriptC_noroot> s = new ScriptC_noroot(mRS); 326 327 int X = 5; 328 int Y = 7; 329 s->set_dimX(X); 330 s->set_dimY(Y); 331 sp<const Type> t = Type::create(mRS, Element::I32(mRS), X, Y, 0); 332 sp<Allocation> A = Allocation::createTyped(mRS, t); 333 s->set_aRaw(A); 334 s->forEach_foo(A, A); 335 s->invoke_verify_foo(); 336 s->invoke_noroot_test(); 337 mRS->finish(); 338 if (result == RS_MSG_TEST_FAILED) { 339 passed = false; 340 } 341 result = 0; 342 return passed; 343 } 344 345