1 /* 2 * Copyright (C) 2011-2012 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 #define LOG_TAG "libRS_jni" 18 19 #include <stdlib.h> 20 #include <stdio.h> 21 #include <fcntl.h> 22 #include <unistd.h> 23 #include <math.h> 24 #include <utils/misc.h> 25 26 #include <SkBitmap.h> 27 28 #include <androidfw/Asset.h> 29 #include <androidfw/AssetManager.h> 30 #include <androidfw/ResourceTypes.h> 31 32 #include "jni.h" 33 #include "JNIHelp.h" 34 #include "android_runtime/AndroidRuntime.h" 35 #include "android_runtime/android_view_Surface.h" 36 #include "android_runtime/android_util_AssetManager.h" 37 38 #include <rs.h> 39 #include <rsEnv.h> 40 #include <gui/Surface.h> 41 #include <gui/GLConsumer.h> 42 #include <gui/Surface.h> 43 #include <android_runtime/android_graphics_SurfaceTexture.h> 44 45 //#define LOG_API ALOGE 46 #define LOG_API(...) 47 48 using namespace android; 49 50 #define PER_ARRAY_TYPE(flag, fnc, readonly, ...) { \ 51 jint len = 0; \ 52 void *ptr = NULL; \ 53 size_t typeBytes = 0; \ 54 jint relFlag = 0; \ 55 if (readonly) { \ 56 /* The on-release mode should only be JNI_ABORT for read-only accesses. */ \ 57 relFlag = JNI_ABORT; \ 58 } \ 59 switch(dataType) { \ 60 case RS_TYPE_FLOAT_32: \ 61 len = _env->GetArrayLength((jfloatArray)data); \ 62 ptr = _env->GetFloatArrayElements((jfloatArray)data, flag); \ 63 typeBytes = 4; \ 64 fnc(__VA_ARGS__); \ 65 _env->ReleaseFloatArrayElements((jfloatArray)data, (jfloat *)ptr, relFlag); \ 66 return; \ 67 case RS_TYPE_FLOAT_64: \ 68 len = _env->GetArrayLength((jdoubleArray)data); \ 69 ptr = _env->GetDoubleArrayElements((jdoubleArray)data, flag); \ 70 typeBytes = 8; \ 71 fnc(__VA_ARGS__); \ 72 _env->ReleaseDoubleArrayElements((jdoubleArray)data, (jdouble *)ptr, relFlag); \ 73 return; \ 74 case RS_TYPE_SIGNED_8: \ 75 case RS_TYPE_UNSIGNED_8: \ 76 len = _env->GetArrayLength((jbyteArray)data); \ 77 ptr = _env->GetByteArrayElements((jbyteArray)data, flag); \ 78 typeBytes = 1; \ 79 fnc(__VA_ARGS__); \ 80 _env->ReleaseByteArrayElements((jbyteArray)data, (jbyte*)ptr, relFlag); \ 81 return; \ 82 case RS_TYPE_SIGNED_16: \ 83 case RS_TYPE_UNSIGNED_16: \ 84 len = _env->GetArrayLength((jshortArray)data); \ 85 ptr = _env->GetShortArrayElements((jshortArray)data, flag); \ 86 typeBytes = 2; \ 87 fnc(__VA_ARGS__); \ 88 _env->ReleaseShortArrayElements((jshortArray)data, (jshort *)ptr, relFlag); \ 89 return; \ 90 case RS_TYPE_SIGNED_32: \ 91 case RS_TYPE_UNSIGNED_32: \ 92 len = _env->GetArrayLength((jintArray)data); \ 93 ptr = _env->GetIntArrayElements((jintArray)data, flag); \ 94 typeBytes = 4; \ 95 fnc(__VA_ARGS__); \ 96 _env->ReleaseIntArrayElements((jintArray)data, (jint *)ptr, relFlag); \ 97 return; \ 98 case RS_TYPE_SIGNED_64: \ 99 case RS_TYPE_UNSIGNED_64: \ 100 len = _env->GetArrayLength((jlongArray)data); \ 101 ptr = _env->GetLongArrayElements((jlongArray)data, flag); \ 102 typeBytes = 8; \ 103 fnc(__VA_ARGS__); \ 104 _env->ReleaseLongArrayElements((jlongArray)data, (jlong *)ptr, relFlag); \ 105 return; \ 106 default: \ 107 break; \ 108 } \ 109 } 110 111 112 class AutoJavaStringToUTF8 { 113 public: 114 AutoJavaStringToUTF8(JNIEnv* env, jstring str) : fEnv(env), fJStr(str) { 115 fCStr = env->GetStringUTFChars(str, NULL); 116 fLength = env->GetStringUTFLength(str); 117 } 118 ~AutoJavaStringToUTF8() { 119 fEnv->ReleaseStringUTFChars(fJStr, fCStr); 120 } 121 const char* c_str() const { return fCStr; } 122 jsize length() const { return fLength; } 123 124 private: 125 JNIEnv* fEnv; 126 jstring fJStr; 127 const char* fCStr; 128 jsize fLength; 129 }; 130 131 class AutoJavaStringArrayToUTF8 { 132 public: 133 AutoJavaStringArrayToUTF8(JNIEnv* env, jobjectArray strings, jsize stringsLength) 134 : mEnv(env), mStrings(strings), mStringsLength(stringsLength) { 135 mCStrings = NULL; 136 mSizeArray = NULL; 137 if (stringsLength > 0) { 138 mCStrings = (const char **)calloc(stringsLength, sizeof(char *)); 139 mSizeArray = (size_t*)calloc(stringsLength, sizeof(size_t)); 140 for (jsize ct = 0; ct < stringsLength; ct ++) { 141 jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct); 142 mCStrings[ct] = mEnv->GetStringUTFChars(s, NULL); 143 mSizeArray[ct] = mEnv->GetStringUTFLength(s); 144 } 145 } 146 } 147 ~AutoJavaStringArrayToUTF8() { 148 for (jsize ct=0; ct < mStringsLength; ct++) { 149 jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct); 150 mEnv->ReleaseStringUTFChars(s, mCStrings[ct]); 151 } 152 free(mCStrings); 153 free(mSizeArray); 154 } 155 const char **c_str() const { return mCStrings; } 156 size_t *c_str_len() const { return mSizeArray; } 157 jsize length() const { return mStringsLength; } 158 159 private: 160 JNIEnv *mEnv; 161 jobjectArray mStrings; 162 const char **mCStrings; 163 size_t *mSizeArray; 164 jsize mStringsLength; 165 }; 166 167 // --------------------------------------------------------------------------- 168 169 static jfieldID gContextId = 0; 170 static jfieldID gNativeBitmapID = 0; 171 static jfieldID gTypeNativeCache = 0; 172 173 static void _nInit(JNIEnv *_env, jclass _this) 174 { 175 gContextId = _env->GetFieldID(_this, "mContext", "J"); 176 177 jclass bitmapClass = _env->FindClass("android/graphics/Bitmap"); 178 gNativeBitmapID = _env->GetFieldID(bitmapClass, "mNativeBitmap", "J"); 179 } 180 181 // --------------------------------------------------------------------------- 182 183 static void 184 nContextFinish(JNIEnv *_env, jobject _this, jlong con) 185 { 186 LOG_API("nContextFinish, con(%p)", (RsContext)con); 187 rsContextFinish((RsContext)con); 188 } 189 190 static void 191 nAssignName(JNIEnv *_env, jobject _this, jlong con, jlong obj, jbyteArray str) 192 { 193 LOG_API("nAssignName, con(%p), obj(%p)", (RsContext)con, (void *)obj); 194 jint len = _env->GetArrayLength(str); 195 jbyte * cptr = (jbyte *) _env->GetPrimitiveArrayCritical(str, 0); 196 rsAssignName((RsContext)con, (void *)obj, (const char *)cptr, len); 197 _env->ReleasePrimitiveArrayCritical(str, cptr, JNI_ABORT); 198 } 199 200 static jstring 201 nGetName(JNIEnv *_env, jobject _this, jlong con, jlong obj) 202 { 203 LOG_API("nGetName, con(%p), obj(%p)", (RsContext)con, (void *)obj); 204 const char *name = NULL; 205 rsaGetName((RsContext)con, (void *)obj, &name); 206 if(name == NULL || strlen(name) == 0) { 207 return NULL; 208 } 209 return _env->NewStringUTF(name); 210 } 211 212 static void 213 nObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj) 214 { 215 LOG_API("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj); 216 rsObjDestroy((RsContext)con, (void *)obj); 217 } 218 219 // --------------------------------------------------------------------------- 220 221 static jlong 222 nDeviceCreate(JNIEnv *_env, jobject _this) 223 { 224 LOG_API("nDeviceCreate"); 225 return (jlong)(uintptr_t)rsDeviceCreate(); 226 } 227 228 static void 229 nDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev) 230 { 231 LOG_API("nDeviceDestroy"); 232 return rsDeviceDestroy((RsDevice)dev); 233 } 234 235 static void 236 nDeviceSetConfig(JNIEnv *_env, jobject _this, jlong dev, jint p, jint value) 237 { 238 LOG_API("nDeviceSetConfig dev(%p), param(%i), value(%i)", (void *)dev, p, value); 239 return rsDeviceSetConfig((RsDevice)dev, (RsDeviceParam)p, value); 240 } 241 242 static jlong 243 nContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint flags, jint sdkVer, jint contextType) 244 { 245 LOG_API("nContextCreate"); 246 return (jlong)(uintptr_t)rsContextCreate((RsDevice)dev, 0, sdkVer, (RsContextType)contextType, flags); 247 } 248 249 static jlong 250 nContextCreateGL(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer, 251 jint colorMin, jint colorPref, 252 jint alphaMin, jint alphaPref, 253 jint depthMin, jint depthPref, 254 jint stencilMin, jint stencilPref, 255 jint samplesMin, jint samplesPref, jfloat samplesQ, 256 jint dpi) 257 { 258 RsSurfaceConfig sc; 259 sc.alphaMin = alphaMin; 260 sc.alphaPref = alphaPref; 261 sc.colorMin = colorMin; 262 sc.colorPref = colorPref; 263 sc.depthMin = depthMin; 264 sc.depthPref = depthPref; 265 sc.samplesMin = samplesMin; 266 sc.samplesPref = samplesPref; 267 sc.samplesQ = samplesQ; 268 269 LOG_API("nContextCreateGL"); 270 return (jlong)(uintptr_t)rsContextCreateGL((RsDevice)dev, ver, sdkVer, sc, dpi); 271 } 272 273 static void 274 nContextSetPriority(JNIEnv *_env, jobject _this, jlong con, jint p) 275 { 276 LOG_API("ContextSetPriority, con(%p), priority(%i)", (RsContext)con, p); 277 rsContextSetPriority((RsContext)con, p); 278 } 279 280 281 282 static void 283 nContextSetSurface(JNIEnv *_env, jobject _this, jlong con, jint width, jint height, jobject wnd) 284 { 285 LOG_API("nContextSetSurface, con(%p), width(%i), height(%i), surface(%p)", (RsContext)con, width, height, (Surface *)wnd); 286 287 ANativeWindow * window = NULL; 288 if (wnd == NULL) { 289 290 } else { 291 window = android_view_Surface_getNativeWindow(_env, wnd).get(); 292 } 293 294 rsContextSetSurface((RsContext)con, width, height, window); 295 } 296 297 static void 298 nContextDestroy(JNIEnv *_env, jobject _this, jlong con) 299 { 300 LOG_API("nContextDestroy, con(%p)", (RsContext)con); 301 rsContextDestroy((RsContext)con); 302 } 303 304 static void 305 nContextDump(JNIEnv *_env, jobject _this, jlong con, jint bits) 306 { 307 LOG_API("nContextDump, con(%p) bits(%i)", (RsContext)con, bits); 308 rsContextDump((RsContext)con, bits); 309 } 310 311 static void 312 nContextPause(JNIEnv *_env, jobject _this, jlong con) 313 { 314 LOG_API("nContextPause, con(%p)", (RsContext)con); 315 rsContextPause((RsContext)con); 316 } 317 318 static void 319 nContextResume(JNIEnv *_env, jobject _this, jlong con) 320 { 321 LOG_API("nContextResume, con(%p)", (RsContext)con); 322 rsContextResume((RsContext)con); 323 } 324 325 326 static jstring 327 nContextGetErrorMessage(JNIEnv *_env, jobject _this, jlong con) 328 { 329 LOG_API("nContextGetErrorMessage, con(%p)", (RsContext)con); 330 char buf[1024]; 331 332 size_t receiveLen; 333 uint32_t subID; 334 int id = rsContextGetMessage((RsContext)con, 335 buf, sizeof(buf), 336 &receiveLen, sizeof(receiveLen), 337 &subID, sizeof(subID)); 338 if (!id && receiveLen) { 339 ALOGV("message receive buffer too small. %i", receiveLen); 340 } 341 return _env->NewStringUTF(buf); 342 } 343 344 static jint 345 nContextGetUserMessage(JNIEnv *_env, jobject _this, jlong con, jintArray data) 346 { 347 jint len = _env->GetArrayLength(data); 348 LOG_API("nContextGetMessage, con(%p), len(%i)", (RsContext)con, len); 349 jint *ptr = _env->GetIntArrayElements(data, NULL); 350 size_t receiveLen; 351 uint32_t subID; 352 int id = rsContextGetMessage((RsContext)con, 353 ptr, len * 4, 354 &receiveLen, sizeof(receiveLen), 355 &subID, sizeof(subID)); 356 if (!id && receiveLen) { 357 ALOGV("message receive buffer too small. %i", receiveLen); 358 } 359 _env->ReleaseIntArrayElements(data, ptr, 0); 360 return (jint)id; 361 } 362 363 static jint 364 nContextPeekMessage(JNIEnv *_env, jobject _this, jlong con, jintArray auxData) 365 { 366 LOG_API("nContextPeekMessage, con(%p)", (RsContext)con); 367 jint *auxDataPtr = _env->GetIntArrayElements(auxData, NULL); 368 size_t receiveLen; 369 uint32_t subID; 370 int id = rsContextPeekMessage((RsContext)con, &receiveLen, sizeof(receiveLen), 371 &subID, sizeof(subID)); 372 auxDataPtr[0] = (jint)subID; 373 auxDataPtr[1] = (jint)receiveLen; 374 _env->ReleaseIntArrayElements(auxData, auxDataPtr, 0); 375 return (jint)id; 376 } 377 378 static void nContextInitToClient(JNIEnv *_env, jobject _this, jlong con) 379 { 380 LOG_API("nContextInitToClient, con(%p)", (RsContext)con); 381 rsContextInitToClient((RsContext)con); 382 } 383 384 static void nContextDeinitToClient(JNIEnv *_env, jobject _this, jlong con) 385 { 386 LOG_API("nContextDeinitToClient, con(%p)", (RsContext)con); 387 rsContextDeinitToClient((RsContext)con); 388 } 389 390 static void 391 nContextSendMessage(JNIEnv *_env, jobject _this, jlong con, jint id, jintArray data) 392 { 393 jint *ptr = NULL; 394 jint len = 0; 395 if (data) { 396 len = _env->GetArrayLength(data); 397 ptr = _env->GetIntArrayElements(data, NULL); 398 } 399 LOG_API("nContextSendMessage, con(%p), id(%i), len(%i)", (RsContext)con, id, len); 400 rsContextSendMessage((RsContext)con, id, (const uint8_t *)ptr, len * sizeof(int)); 401 if (data) { 402 _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT); 403 } 404 } 405 406 407 408 static jlong 409 nElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind, jboolean norm, jint size) 410 { 411 LOG_API("nElementCreate, con(%p), type(%i), kind(%i), norm(%i), size(%i)", (RsContext)con, type, kind, norm, size); 412 return (jlong)(uintptr_t)rsElementCreate((RsContext)con, (RsDataType)type, (RsDataKind)kind, norm, size); 413 } 414 415 static jlong 416 nElementCreate2(JNIEnv *_env, jobject _this, jlong con, 417 jlongArray _ids, jobjectArray _names, jintArray _arraySizes) 418 { 419 int fieldCount = _env->GetArrayLength(_ids); 420 LOG_API("nElementCreate2, con(%p)", (RsContext)con); 421 422 jlong *jIds = _env->GetLongArrayElements(_ids, NULL); 423 jint *jArraySizes = _env->GetIntArrayElements(_arraySizes, NULL); 424 425 RsElement *ids = (RsElement*)malloc(fieldCount * sizeof(RsElement)); 426 uint32_t *arraySizes = (uint32_t *)malloc(fieldCount * sizeof(uint32_t)); 427 428 for(int i = 0; i < fieldCount; i ++) { 429 ids[i] = (RsElement)jIds[i]; 430 arraySizes[i] = (uint32_t)jArraySizes[i]; 431 } 432 433 AutoJavaStringArrayToUTF8 names(_env, _names, fieldCount); 434 435 const char **nameArray = names.c_str(); 436 size_t *sizeArray = names.c_str_len(); 437 438 jlong id = (jlong)(uintptr_t)rsElementCreate2((RsContext)con, 439 (const RsElement *)ids, fieldCount, 440 nameArray, fieldCount * sizeof(size_t), sizeArray, 441 (const uint32_t *)arraySizes, fieldCount); 442 443 free(ids); 444 free(arraySizes); 445 _env->ReleaseLongArrayElements(_ids, jIds, JNI_ABORT); 446 _env->ReleaseIntArrayElements(_arraySizes, jArraySizes, JNI_ABORT); 447 448 return (jlong)(uintptr_t)id; 449 } 450 451 static void 452 nElementGetNativeData(JNIEnv *_env, jobject _this, jlong con, jlong id, jintArray _elementData) 453 { 454 int dataSize = _env->GetArrayLength(_elementData); 455 LOG_API("nElementGetNativeData, con(%p)", (RsContext)con); 456 457 // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements 458 assert(dataSize == 5); 459 460 uintptr_t elementData[5]; 461 rsaElementGetNativeData((RsContext)con, (RsElement)id, elementData, dataSize); 462 463 for(jint i = 0; i < dataSize; i ++) { 464 const jint data = (jint)elementData[i]; 465 _env->SetIntArrayRegion(_elementData, i, 1, &data); 466 } 467 } 468 469 470 static void 471 nElementGetSubElements(JNIEnv *_env, jobject _this, jlong con, jlong id, 472 jlongArray _IDs, 473 jobjectArray _names, 474 jintArray _arraySizes) 475 { 476 uint32_t dataSize = _env->GetArrayLength(_IDs); 477 LOG_API("nElementGetSubElements, con(%p)", (RsContext)con); 478 479 uintptr_t *ids = (uintptr_t*)malloc(dataSize * sizeof(uintptr_t)); 480 const char **names = (const char **)malloc(dataSize * sizeof(const char *)); 481 uint32_t *arraySizes = (uint32_t *)malloc(dataSize * sizeof(uint32_t)); 482 483 rsaElementGetSubElements((RsContext)con, (RsElement)id, ids, names, arraySizes, (uint32_t)dataSize); 484 485 for(uint32_t i = 0; i < dataSize; i++) { 486 const jlong id = (jlong)(uintptr_t)ids[i]; 487 const jint arraySize = (jint)arraySizes[i]; 488 _env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i])); 489 _env->SetLongArrayRegion(_IDs, i, 1, &id); 490 _env->SetIntArrayRegion(_arraySizes, i, 1, &arraySize); 491 } 492 493 free(ids); 494 free(names); 495 free(arraySizes); 496 } 497 498 // ----------------------------------- 499 500 static jlong 501 nTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid, 502 jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv) 503 { 504 LOG_API("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)", 505 (RsContext)con, eid, dimx, dimy, dimz, mips, faces, yuv); 506 507 return (jlong)(uintptr_t)rsTypeCreate((RsContext)con, (RsElement)eid, dimx, dimy, dimz, mips, faces, yuv); 508 } 509 510 static void 511 nTypeGetNativeData(JNIEnv *_env, jobject _this, jlong con, jlong id, jlongArray _typeData) 512 { 513 // We are packing 6 items: mDimX; mDimY; mDimZ; 514 // mDimLOD; mDimFaces; mElement; into typeData 515 int elementCount = _env->GetArrayLength(_typeData); 516 517 assert(elementCount == 6); 518 LOG_API("nTypeGetNativeData, con(%p)", (RsContext)con); 519 520 uintptr_t typeData[6]; 521 rsaTypeGetNativeData((RsContext)con, (RsType)id, typeData, 6); 522 523 for(jint i = 0; i < elementCount; i ++) { 524 const jlong data = (jlong)(uintptr_t)typeData[i]; 525 _env->SetLongArrayRegion(_typeData, i, 1, &data); 526 } 527 } 528 529 // ----------------------------------- 530 531 static jlong 532 nAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mips, jint usage, jlong pointer) 533 { 534 LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)", (RsContext)con, (RsElement)type, mips, usage, (void *)pointer); 535 return (jlong)(uintptr_t) rsAllocationCreateTyped((RsContext)con, (RsType)type, (RsAllocationMipmapControl)mips, (uint32_t)usage, (uintptr_t)pointer); 536 } 537 538 static void 539 nAllocationSyncAll(JNIEnv *_env, jobject _this, jlong con, jlong a, jint bits) 540 { 541 LOG_API("nAllocationSyncAll, con(%p), a(%p), bits(0x%08x)", (RsContext)con, (RsAllocation)a, bits); 542 rsAllocationSyncAll((RsContext)con, (RsAllocation)a, (RsAllocationUsageType)bits); 543 } 544 545 static jobject 546 nAllocationGetSurface(JNIEnv *_env, jobject _this, jlong con, jlong a) 547 { 548 LOG_API("nAllocationGetSurface, con(%p), a(%p)", (RsContext)con, (RsAllocation)a); 549 550 IGraphicBufferProducer *v = (IGraphicBufferProducer *)rsAllocationGetSurface((RsContext)con, (RsAllocation)a); 551 sp<IGraphicBufferProducer> bp = v; 552 v->decStrong(NULL); 553 554 jobject o = android_view_Surface_createFromIGraphicBufferProducer(_env, bp); 555 return o; 556 } 557 558 static void 559 nAllocationSetSurface(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject sur) 560 { 561 LOG_API("nAllocationSetSurface, con(%p), alloc(%p), surface(%p)", 562 (RsContext)con, (RsAllocation)alloc, (Surface *)sur); 563 564 sp<Surface> s; 565 if (sur != 0) { 566 s = android_view_Surface_getSurface(_env, sur); 567 } 568 569 rsAllocationSetSurface((RsContext)con, (RsAllocation)alloc, static_cast<ANativeWindow *>(s.get())); 570 } 571 572 static void 573 nAllocationIoSend(JNIEnv *_env, jobject _this, jlong con, jlong alloc) 574 { 575 LOG_API("nAllocationIoSend, con(%p), alloc(%p)", (RsContext)con, alloc); 576 rsAllocationIoSend((RsContext)con, (RsAllocation)alloc); 577 } 578 579 static void 580 nAllocationIoReceive(JNIEnv *_env, jobject _this, jlong con, jlong alloc) 581 { 582 LOG_API("nAllocationIoReceive, con(%p), alloc(%p)", (RsContext)con, alloc); 583 rsAllocationIoReceive((RsContext)con, (RsAllocation)alloc); 584 } 585 586 587 static void 588 nAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, jlong con, jlong alloc) 589 { 590 LOG_API("nAllocationGenerateMipmaps, con(%p), a(%p)", (RsContext)con, (RsAllocation)alloc); 591 rsAllocationGenerateMipmaps((RsContext)con, (RsAllocation)alloc); 592 } 593 594 static jlong 595 nAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip, jobject jbitmap, jint usage) 596 { 597 SkBitmap const * nativeBitmap = 598 (SkBitmap const *)_env->GetLongField(jbitmap, gNativeBitmapID); 599 const SkBitmap& bitmap(*nativeBitmap); 600 601 bitmap.lockPixels(); 602 const void* ptr = bitmap.getPixels(); 603 jlong id = (jlong)(uintptr_t)rsAllocationCreateFromBitmap((RsContext)con, 604 (RsType)type, (RsAllocationMipmapControl)mip, 605 ptr, bitmap.getSize(), usage); 606 bitmap.unlockPixels(); 607 return id; 608 } 609 610 static jlong 611 nAllocationCreateBitmapBackedAllocation(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip, jobject jbitmap, jint usage) 612 { 613 SkBitmap const * nativeBitmap = 614 (SkBitmap const *)_env->GetLongField(jbitmap, gNativeBitmapID); 615 const SkBitmap& bitmap(*nativeBitmap); 616 617 bitmap.lockPixels(); 618 const void* ptr = bitmap.getPixels(); 619 jlong id = (jlong)(uintptr_t)rsAllocationCreateTyped((RsContext)con, 620 (RsType)type, (RsAllocationMipmapControl)mip, 621 (uint32_t)usage, (uintptr_t)ptr); 622 bitmap.unlockPixels(); 623 return id; 624 } 625 626 static jlong 627 nAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip, jobject jbitmap, jint usage) 628 { 629 SkBitmap const * nativeBitmap = 630 (SkBitmap const *)_env->GetLongField(jbitmap, gNativeBitmapID); 631 const SkBitmap& bitmap(*nativeBitmap); 632 633 bitmap.lockPixels(); 634 const void* ptr = bitmap.getPixels(); 635 jlong id = (jlong)(uintptr_t)rsAllocationCubeCreateFromBitmap((RsContext)con, 636 (RsType)type, (RsAllocationMipmapControl)mip, 637 ptr, bitmap.getSize(), usage); 638 bitmap.unlockPixels(); 639 return id; 640 } 641 642 static void 643 nAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap) 644 { 645 SkBitmap const * nativeBitmap = 646 (SkBitmap const *)_env->GetLongField(jbitmap, gNativeBitmapID); 647 const SkBitmap& bitmap(*nativeBitmap); 648 int w = bitmap.width(); 649 int h = bitmap.height(); 650 651 bitmap.lockPixels(); 652 const void* ptr = bitmap.getPixels(); 653 rsAllocation2DData((RsContext)con, (RsAllocation)alloc, 0, 0, 654 0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 655 w, h, ptr, bitmap.getSize(), 0); 656 bitmap.unlockPixels(); 657 } 658 659 static void 660 nAllocationCopyToBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap) 661 { 662 SkBitmap const * nativeBitmap = 663 (SkBitmap const *)_env->GetLongField(jbitmap, gNativeBitmapID); 664 const SkBitmap& bitmap(*nativeBitmap); 665 666 bitmap.lockPixels(); 667 void* ptr = bitmap.getPixels(); 668 rsAllocationCopyToBitmap((RsContext)con, (RsAllocation)alloc, ptr, bitmap.getSize()); 669 bitmap.unlockPixels(); 670 bitmap.notifyPixelsChanged(); 671 } 672 673 static void ReleaseBitmapCallback(void *bmp) 674 { 675 SkBitmap const * nativeBitmap = (SkBitmap const *)bmp; 676 nativeBitmap->unlockPixels(); 677 } 678 679 680 // Copies from the Java object data into the Allocation pointed to by _alloc. 681 static void 682 nAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod, 683 jint count, jobject data, jint sizeBytes, jint dataType) 684 { 685 RsAllocation *alloc = (RsAllocation *)_alloc; 686 LOG_API("nAllocation1DData, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), dataType(%i)", 687 (RsContext)con, (RsAllocation)alloc, offset, count, sizeBytes, dataType); 688 PER_ARRAY_TYPE(NULL, rsAllocation1DData, true, (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes); 689 } 690 691 // Copies from the Java array data into the Allocation pointed to by alloc. 692 static void 693 // native void rsnAllocationElementData1D(long con, long id, int xoff, int compIdx, byte[] d, int sizeBytes); 694 nAllocationElementData1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint offset, jint lod, jint compIdx, jbyteArray data, jint sizeBytes) 695 { 696 jint len = _env->GetArrayLength(data); 697 LOG_API("nAllocationElementData1D, con(%p), alloc(%p), offset(%i), comp(%i), len(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, offset, compIdx, len, sizeBytes); 698 jbyte *ptr = _env->GetByteArrayElements(data, NULL); 699 rsAllocation1DElementData((RsContext)con, (RsAllocation)alloc, offset, lod, ptr, sizeBytes, compIdx); 700 _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT); 701 } 702 703 // Copies from the Java object data into the Allocation pointed to by _alloc. 704 static void 705 nAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face, 706 jint w, jint h, jobject data, jint sizeBytes, jint dataType) 707 { 708 RsAllocation *alloc = (RsAllocation *)_alloc; 709 RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face; 710 LOG_API("nAllocation2DData, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) type(%i)", 711 (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType); 712 PER_ARRAY_TYPE(NULL, rsAllocation2DData, true, (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0); 713 } 714 715 // Copies from the Allocation pointed to by srcAlloc into the Allocation 716 // pointed to by dstAlloc. 717 static void 718 nAllocationData2D_alloc(JNIEnv *_env, jobject _this, jlong con, 719 jlong dstAlloc, jint dstXoff, jint dstYoff, 720 jint dstMip, jint dstFace, 721 jint width, jint height, 722 jlong srcAlloc, jint srcXoff, jint srcYoff, 723 jint srcMip, jint srcFace) 724 { 725 LOG_API("nAllocation2DData_s, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i)," 726 " dstMip(%i), dstFace(%i), width(%i), height(%i)," 727 " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i), srcFace(%i)", 728 (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace, 729 width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace); 730 731 rsAllocationCopy2DRange((RsContext)con, 732 (RsAllocation)dstAlloc, 733 dstXoff, dstYoff, 734 dstMip, dstFace, 735 width, height, 736 (RsAllocation)srcAlloc, 737 srcXoff, srcYoff, 738 srcMip, srcFace); 739 } 740 741 // Copies from the Java object data into the Allocation pointed to by _alloc. 742 static void 743 nAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod, 744 jint w, jint h, jint d, jobject data, int sizeBytes, int dataType) 745 { 746 RsAllocation *alloc = (RsAllocation *)_alloc; 747 LOG_API("nAllocation3DData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i), h(%i), d(%i), sizeBytes(%i)", 748 (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, lod, w, h, d, sizeBytes); 749 PER_ARRAY_TYPE(NULL, rsAllocation3DData, true, (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0); 750 } 751 752 // Copies from the Allocation pointed to by srcAlloc into the Allocation 753 // pointed to by dstAlloc. 754 static void 755 nAllocationData3D_alloc(JNIEnv *_env, jobject _this, jlong con, 756 jlong dstAlloc, jint dstXoff, jint dstYoff, jint dstZoff, 757 jint dstMip, 758 jint width, jint height, jint depth, 759 jlong srcAlloc, jint srcXoff, jint srcYoff, jint srcZoff, 760 jint srcMip) 761 { 762 LOG_API("nAllocationData3D_alloc, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i)," 763 " dstMip(%i), width(%i), height(%i)," 764 " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i)", 765 (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, 766 width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip); 767 768 rsAllocationCopy3DRange((RsContext)con, 769 (RsAllocation)dstAlloc, 770 dstXoff, dstYoff, dstZoff, dstMip, 771 width, height, depth, 772 (RsAllocation)srcAlloc, 773 srcXoff, srcYoff, srcZoff, srcMip); 774 } 775 776 777 // Copies from the Allocation pointed to by _alloc into the Java object data. 778 static void 779 nAllocationRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jobject data, int dataType) 780 { 781 RsAllocation *alloc = (RsAllocation *)_alloc; 782 LOG_API("nAllocationRead, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc); 783 PER_ARRAY_TYPE(0, rsAllocationRead, false, (RsContext)con, alloc, ptr, len * typeBytes); 784 } 785 786 // Copies from the Allocation pointed to by _alloc into the Java object data. 787 static void 788 nAllocationRead1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod, 789 jint count, jobject data, int sizeBytes, int dataType) 790 { 791 RsAllocation *alloc = (RsAllocation *)_alloc; 792 LOG_API("nAllocation1DRead, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), dataType(%i)", 793 (RsContext)con, alloc, offset, count, sizeBytes, dataType); 794 PER_ARRAY_TYPE(0, rsAllocation1DRead, false, (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes); 795 } 796 797 // Copies from the Allocation pointed to by _alloc into the Java object data. 798 static void 799 nAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face, 800 jint w, jint h, jobject data, int sizeBytes, int dataType) 801 { 802 RsAllocation *alloc = (RsAllocation *)_alloc; 803 RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face; 804 LOG_API("nAllocation2DRead, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) type(%i)", 805 (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType); 806 PER_ARRAY_TYPE(0, rsAllocation2DRead, false, (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0); 807 } 808 809 static jlong 810 nAllocationGetType(JNIEnv *_env, jobject _this, jlong con, jlong a) 811 { 812 LOG_API("nAllocationGetType, con(%p), a(%p)", (RsContext)con, (RsAllocation)a); 813 return (jlong)(uintptr_t) rsaAllocationGetType((RsContext)con, (RsAllocation)a); 814 } 815 816 static void 817 nAllocationResize1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint dimX) 818 { 819 LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", (RsContext)con, (RsAllocation)alloc, dimX); 820 rsAllocationResize1D((RsContext)con, (RsAllocation)alloc, dimX); 821 } 822 823 // ----------------------------------- 824 825 static jlong 826 nFileA3DCreateFromAssetStream(JNIEnv *_env, jobject _this, jlong con, jlong native_asset) 827 { 828 Asset* asset = reinterpret_cast<Asset*>(native_asset); 829 ALOGV("______nFileA3D %p", asset); 830 831 jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromMemory((RsContext)con, asset->getBuffer(false), asset->getLength()); 832 return id; 833 } 834 835 static jlong 836 nFileA3DCreateFromAsset(JNIEnv *_env, jobject _this, jlong con, jobject _assetMgr, jstring _path) 837 { 838 AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr); 839 if (mgr == NULL) { 840 return 0; 841 } 842 843 AutoJavaStringToUTF8 str(_env, _path); 844 Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER); 845 if (asset == NULL) { 846 return 0; 847 } 848 849 jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromAsset((RsContext)con, asset); 850 return id; 851 } 852 853 static jlong 854 nFileA3DCreateFromFile(JNIEnv *_env, jobject _this, jlong con, jstring fileName) 855 { 856 AutoJavaStringToUTF8 fileNameUTF(_env, fileName); 857 jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromFile((RsContext)con, fileNameUTF.c_str()); 858 859 return id; 860 } 861 862 static jint 863 nFileA3DGetNumIndexEntries(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D) 864 { 865 int32_t numEntries = 0; 866 rsaFileA3DGetNumIndexEntries((RsContext)con, &numEntries, (RsFile)fileA3D); 867 return (jint)numEntries; 868 } 869 870 static void 871 nFileA3DGetIndexEntries(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D, jint numEntries, jintArray _ids, jobjectArray _entries) 872 { 873 ALOGV("______nFileA3D %p", (RsFile) fileA3D); 874 RsFileIndexEntry *fileEntries = (RsFileIndexEntry*)malloc((uint32_t)numEntries * sizeof(RsFileIndexEntry)); 875 876 rsaFileA3DGetIndexEntries((RsContext)con, fileEntries, (uint32_t)numEntries, (RsFile)fileA3D); 877 878 for(jint i = 0; i < numEntries; i ++) { 879 _env->SetObjectArrayElement(_entries, i, _env->NewStringUTF(fileEntries[i].objectName)); 880 _env->SetIntArrayRegion(_ids, i, 1, (const jint*)&fileEntries[i].classID); 881 } 882 883 free(fileEntries); 884 } 885 886 static jlong 887 nFileA3DGetEntryByIndex(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D, jint index) 888 { 889 ALOGV("______nFileA3D %p", (RsFile) fileA3D); 890 jlong id = (jlong)(uintptr_t)rsaFileA3DGetEntryByIndex((RsContext)con, (uint32_t)index, (RsFile)fileA3D); 891 return id; 892 } 893 894 // ----------------------------------- 895 896 static jlong 897 nFontCreateFromFile(JNIEnv *_env, jobject _this, jlong con, 898 jstring fileName, jfloat fontSize, jint dpi) 899 { 900 AutoJavaStringToUTF8 fileNameUTF(_env, fileName); 901 jlong id = (jlong)(uintptr_t)rsFontCreateFromFile((RsContext)con, 902 fileNameUTF.c_str(), fileNameUTF.length(), 903 fontSize, dpi); 904 905 return id; 906 } 907 908 static jlong 909 nFontCreateFromAssetStream(JNIEnv *_env, jobject _this, jlong con, 910 jstring name, jfloat fontSize, jint dpi, jlong native_asset) 911 { 912 Asset* asset = reinterpret_cast<Asset*>(native_asset); 913 AutoJavaStringToUTF8 nameUTF(_env, name); 914 915 jlong id = (jlong)(uintptr_t)rsFontCreateFromMemory((RsContext)con, 916 nameUTF.c_str(), nameUTF.length(), 917 fontSize, dpi, 918 asset->getBuffer(false), asset->getLength()); 919 return id; 920 } 921 922 static jlong 923 nFontCreateFromAsset(JNIEnv *_env, jobject _this, jlong con, jobject _assetMgr, jstring _path, 924 jfloat fontSize, jint dpi) 925 { 926 AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr); 927 if (mgr == NULL) { 928 return 0; 929 } 930 931 AutoJavaStringToUTF8 str(_env, _path); 932 Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER); 933 if (asset == NULL) { 934 return 0; 935 } 936 937 jlong id = (jlong)(uintptr_t)rsFontCreateFromMemory((RsContext)con, 938 str.c_str(), str.length(), 939 fontSize, dpi, 940 asset->getBuffer(false), asset->getLength()); 941 delete asset; 942 return id; 943 } 944 945 // ----------------------------------- 946 947 static void 948 nScriptBindAllocation(JNIEnv *_env, jobject _this, jlong con, jlong script, jlong alloc, jint slot) 949 { 950 LOG_API("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)", (RsContext)con, (RsScript)script, (RsAllocation)alloc, slot); 951 rsScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot); 952 } 953 954 static void 955 nScriptSetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jint val) 956 { 957 LOG_API("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con, (void *)script, slot, val); 958 rsScriptSetVarI((RsContext)con, (RsScript)script, slot, val); 959 } 960 961 static jint 962 nScriptGetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot) 963 { 964 LOG_API("nScriptGetVarI, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot); 965 int value = 0; 966 rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value)); 967 return value; 968 } 969 970 static void 971 nScriptSetVarObj(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val) 972 { 973 LOG_API("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con, (void *)script, slot, val); 974 rsScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val); 975 } 976 977 static void 978 nScriptSetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val) 979 { 980 LOG_API("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%lli)", (RsContext)con, (void *)script, slot, val); 981 rsScriptSetVarJ((RsContext)con, (RsScript)script, slot, val); 982 } 983 984 static jlong 985 nScriptGetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot) 986 { 987 LOG_API("nScriptGetVarJ, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot); 988 jlong value = 0; 989 rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value)); 990 return value; 991 } 992 993 static void 994 nScriptSetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, float val) 995 { 996 LOG_API("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", (RsContext)con, (void *)script, slot, val); 997 rsScriptSetVarF((RsContext)con, (RsScript)script, slot, val); 998 } 999 1000 static jfloat 1001 nScriptGetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot) 1002 { 1003 LOG_API("nScriptGetVarF, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot); 1004 jfloat value = 0; 1005 rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value)); 1006 return value; 1007 } 1008 1009 static void 1010 nScriptSetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, double val) 1011 { 1012 LOG_API("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", (RsContext)con, (void *)script, slot, val); 1013 rsScriptSetVarD((RsContext)con, (RsScript)script, slot, val); 1014 } 1015 1016 static jdouble 1017 nScriptGetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot) 1018 { 1019 LOG_API("nScriptGetVarD, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot); 1020 jdouble value = 0; 1021 rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value)); 1022 return value; 1023 } 1024 1025 static void 1026 nScriptSetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data) 1027 { 1028 LOG_API("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot); 1029 jint len = _env->GetArrayLength(data); 1030 jbyte *ptr = _env->GetByteArrayElements(data, NULL); 1031 rsScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len); 1032 _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT); 1033 } 1034 1035 static void 1036 nScriptGetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data) 1037 { 1038 LOG_API("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot); 1039 jint len = _env->GetArrayLength(data); 1040 jbyte *ptr = _env->GetByteArrayElements(data, NULL); 1041 rsScriptGetVarV((RsContext)con, (RsScript)script, slot, ptr, len); 1042 _env->ReleaseByteArrayElements(data, ptr, 0); 1043 } 1044 1045 static void 1046 nScriptSetVarVE(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data, jlong elem, jintArray dims) 1047 { 1048 LOG_API("nScriptSetVarVE, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot); 1049 jint len = _env->GetArrayLength(data); 1050 jbyte *ptr = _env->GetByteArrayElements(data, NULL); 1051 jint dimsLen = _env->GetArrayLength(dims) * sizeof(int); 1052 jint *dimsPtr = _env->GetIntArrayElements(dims, NULL); 1053 rsScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem, 1054 (const uint32_t*) dimsPtr, dimsLen); 1055 _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT); 1056 _env->ReleaseIntArrayElements(dims, dimsPtr, JNI_ABORT); 1057 } 1058 1059 1060 static void 1061 nScriptSetTimeZone(JNIEnv *_env, jobject _this, jlong con, jlong script, jbyteArray timeZone) 1062 { 1063 LOG_API("nScriptCSetTimeZone, con(%p), s(%p)", (RsContext)con, (void *)script); 1064 1065 jint length = _env->GetArrayLength(timeZone); 1066 jbyte* timeZone_ptr; 1067 timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0); 1068 1069 rsScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length); 1070 1071 if (timeZone_ptr) { 1072 _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0); 1073 } 1074 } 1075 1076 static void 1077 nScriptInvoke(JNIEnv *_env, jobject _this, jlong con, jlong obj, jint slot) 1078 { 1079 LOG_API("nScriptInvoke, con(%p), script(%p)", (RsContext)con, (void *)obj); 1080 rsScriptInvoke((RsContext)con, (RsScript)obj, slot); 1081 } 1082 1083 static void 1084 nScriptInvokeV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data) 1085 { 1086 LOG_API("nScriptInvokeV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot); 1087 jint len = _env->GetArrayLength(data); 1088 jbyte *ptr = _env->GetByteArrayElements(data, NULL); 1089 rsScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len); 1090 _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT); 1091 } 1092 1093 static void 1094 nScriptForEach(JNIEnv *_env, jobject _this, jlong con, 1095 jlong script, jint slot, jlong ain, jlong aout) 1096 { 1097 LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot); 1098 rsScriptForEach((RsContext)con, (RsScript)script, slot, (RsAllocation)ain, (RsAllocation)aout, NULL, 0, NULL, 0); 1099 } 1100 static void 1101 nScriptForEachV(JNIEnv *_env, jobject _this, jlong con, 1102 jlong script, jint slot, jlong ain, jlong aout, jbyteArray params) 1103 { 1104 LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot); 1105 jint len = _env->GetArrayLength(params); 1106 jbyte *ptr = _env->GetByteArrayElements(params, NULL); 1107 rsScriptForEach((RsContext)con, (RsScript)script, slot, (RsAllocation)ain, (RsAllocation)aout, ptr, len, NULL, 0); 1108 _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT); 1109 } 1110 1111 static void 1112 nScriptForEachClipped(JNIEnv *_env, jobject _this, jlong con, 1113 jlong script, jint slot, jlong ain, jlong aout, 1114 jint xstart, jint xend, 1115 jint ystart, jint yend, jint zstart, jint zend) 1116 { 1117 LOG_API("nScriptForEachClipped, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot); 1118 RsScriptCall sc; 1119 sc.xStart = xstart; 1120 sc.xEnd = xend; 1121 sc.yStart = ystart; 1122 sc.yEnd = yend; 1123 sc.zStart = zstart; 1124 sc.zEnd = zend; 1125 sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE; 1126 sc.arrayStart = 0; 1127 sc.arrayEnd = 0; 1128 rsScriptForEach((RsContext)con, (RsScript)script, slot, (RsAllocation)ain, (RsAllocation)aout, NULL, 0, &sc, sizeof(sc)); 1129 } 1130 1131 static void 1132 nScriptForEachClippedV(JNIEnv *_env, jobject _this, jlong con, 1133 jlong script, jint slot, jlong ain, jlong aout, 1134 jbyteArray params, jint xstart, jint xend, 1135 jint ystart, jint yend, jint zstart, jint zend) 1136 { 1137 LOG_API("nScriptForEachClipped, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot); 1138 jint len = _env->GetArrayLength(params); 1139 jbyte *ptr = _env->GetByteArrayElements(params, NULL); 1140 RsScriptCall sc; 1141 sc.xStart = xstart; 1142 sc.xEnd = xend; 1143 sc.yStart = ystart; 1144 sc.yEnd = yend; 1145 sc.zStart = zstart; 1146 sc.zEnd = zend; 1147 sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE; 1148 sc.arrayStart = 0; 1149 sc.arrayEnd = 0; 1150 rsScriptForEach((RsContext)con, (RsScript)script, slot, (RsAllocation)ain, (RsAllocation)aout, ptr, len, &sc, sizeof(sc)); 1151 _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT); 1152 } 1153 1154 static void 1155 nScriptForEachMultiClipped(JNIEnv *_env, jobject _this, jlong con, 1156 jlong script, jint slot, jlongArray ains, jlong aout, 1157 jint xstart, jint xend, 1158 jint ystart, jint yend, jint zstart, jint zend) 1159 { 1160 LOG_API("nScriptForEachMultiClipped, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot); 1161 1162 jint in_len = _env->GetArrayLength(ains); 1163 jlong* in_ptr = _env->GetLongArrayElements(ains, NULL); 1164 1165 RsAllocation *in_allocs = NULL; 1166 1167 if (sizeof(RsAllocation) == sizeof(jlong)) { 1168 in_allocs = (RsAllocation*)in_ptr; 1169 1170 } else { 1171 // Convert from 64-bit jlong types to the native pointer type. 1172 1173 in_allocs = new RsAllocation[in_len]; 1174 1175 for (int index = in_len; --index >= 0;) { 1176 in_allocs[index] = (RsAllocation)in_ptr[index]; 1177 } 1178 } 1179 1180 RsScriptCall sc; 1181 sc.xStart = xstart; 1182 sc.xEnd = xend; 1183 sc.yStart = ystart; 1184 sc.yEnd = yend; 1185 sc.zStart = zstart; 1186 sc.zEnd = zend; 1187 sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE; 1188 sc.arrayStart = 0; 1189 sc.arrayEnd = 0; 1190 1191 rsScriptForEachMulti((RsContext)con, (RsScript)script, slot, in_allocs, in_len, (RsAllocation)aout, NULL, 0, &sc, sizeof(sc)); 1192 1193 if (sizeof(RsAllocation) != sizeof(jlong)) { 1194 delete[] in_allocs; 1195 } 1196 1197 _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT); 1198 } 1199 1200 static void 1201 nScriptForEachMultiClippedV(JNIEnv *_env, jobject _this, jlong con, 1202 jlong script, jint slot, jlongArray ains, jlong aout, 1203 jbyteArray params, jint xstart, jint xend, 1204 jint ystart, jint yend, jint zstart, jint zend) 1205 { 1206 LOG_API("nScriptForEachMultiClippedV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot); 1207 1208 jint in_len = _env->GetArrayLength(ains); 1209 jlong* in_ptr = _env->GetLongArrayElements(ains, NULL); 1210 1211 RsAllocation *in_allocs = NULL; 1212 1213 if (sizeof(RsAllocation) == sizeof(jlong)) { 1214 in_allocs = (RsAllocation*)in_ptr; 1215 1216 } else { 1217 // Convert from 64-bit jlong types to the native pointer type. 1218 1219 in_allocs = new RsAllocation[in_len]; 1220 1221 for (int index = in_len; --index >= 0;) { 1222 in_allocs[index] = (RsAllocation)in_ptr[index]; 1223 } 1224 } 1225 1226 jint param_len = _env->GetArrayLength(params); 1227 jbyte* param_ptr = _env->GetByteArrayElements(params, NULL); 1228 1229 RsScriptCall sc; 1230 sc.xStart = xstart; 1231 sc.xEnd = xend; 1232 sc.yStart = ystart; 1233 sc.yEnd = yend; 1234 sc.zStart = zstart; 1235 sc.zEnd = zend; 1236 sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE; 1237 sc.arrayStart = 0; 1238 sc.arrayEnd = 0; 1239 rsScriptForEachMulti((RsContext)con, (RsScript)script, slot, in_allocs, in_len, (RsAllocation)aout, param_ptr, param_len, &sc, sizeof(sc)); 1240 1241 if (sizeof(RsAllocation) != sizeof(jlong)) { 1242 delete[] in_allocs; 1243 } 1244 1245 _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT); 1246 _env->ReleaseByteArrayElements(params, param_ptr, JNI_ABORT); 1247 } 1248 1249 // ----------------------------------- 1250 1251 static jlong 1252 nScriptCCreate(JNIEnv *_env, jobject _this, jlong con, 1253 jstring resName, jstring cacheDir, 1254 jbyteArray scriptRef, jint length) 1255 { 1256 LOG_API("nScriptCCreate, con(%p)", (RsContext)con); 1257 1258 AutoJavaStringToUTF8 resNameUTF(_env, resName); 1259 AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir); 1260 jlong ret = 0; 1261 jbyte* script_ptr = NULL; 1262 jint _exception = 0; 1263 jint remaining; 1264 if (!scriptRef) { 1265 _exception = 1; 1266 //jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null"); 1267 goto exit; 1268 } 1269 if (length < 0) { 1270 _exception = 1; 1271 //jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0"); 1272 goto exit; 1273 } 1274 remaining = _env->GetArrayLength(scriptRef); 1275 if (remaining < length) { 1276 _exception = 1; 1277 //jniThrowException(_env, "java/lang/IllegalArgumentException", 1278 // "length > script.length - offset"); 1279 goto exit; 1280 } 1281 script_ptr = (jbyte *) 1282 _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0); 1283 1284 //rsScriptCSetText((RsContext)con, (const char *)script_ptr, length); 1285 1286 ret = (jlong)(uintptr_t)rsScriptCCreate((RsContext)con, 1287 resNameUTF.c_str(), resNameUTF.length(), 1288 cacheDirUTF.c_str(), cacheDirUTF.length(), 1289 (const char *)script_ptr, length); 1290 1291 exit: 1292 if (script_ptr) { 1293 _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr, 1294 _exception ? JNI_ABORT: 0); 1295 } 1296 1297 return (jlong)(uintptr_t)ret; 1298 } 1299 1300 static jlong 1301 nScriptIntrinsicCreate(JNIEnv *_env, jobject _this, jlong con, jint id, jlong eid) 1302 { 1303 LOG_API("nScriptIntrinsicCreate, con(%p) id(%i) element(%p)", (RsContext)con, id, (void *)eid); 1304 return (jlong)(uintptr_t)rsScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid); 1305 } 1306 1307 static jlong 1308 nScriptKernelIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jint sig) 1309 { 1310 LOG_API("nScriptKernelIDCreate, con(%p) script(%p), slot(%i), sig(%i)", (RsContext)con, (void *)sid, slot, sig); 1311 return (jlong)(uintptr_t)rsScriptKernelIDCreate((RsContext)con, (RsScript)sid, slot, sig); 1312 } 1313 1314 static jlong 1315 nScriptFieldIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot) 1316 { 1317 LOG_API("nScriptFieldIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con, (void *)sid, slot); 1318 return (jlong)(uintptr_t)rsScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot); 1319 } 1320 1321 static jlong 1322 nScriptGroupCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _kernels, jlongArray _src, 1323 jlongArray _dstk, jlongArray _dstf, jlongArray _types) 1324 { 1325 LOG_API("nScriptGroupCreate, con(%p)", (RsContext)con); 1326 1327 jint kernelsLen = _env->GetArrayLength(_kernels); 1328 jlong *jKernelsPtr = _env->GetLongArrayElements(_kernels, NULL); 1329 RsScriptKernelID* kernelsPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * kernelsLen); 1330 for(int i = 0; i < kernelsLen; ++i) { 1331 kernelsPtr[i] = (RsScriptKernelID)jKernelsPtr[i]; 1332 } 1333 1334 jint srcLen = _env->GetArrayLength(_src); 1335 jlong *jSrcPtr = _env->GetLongArrayElements(_src, NULL); 1336 RsScriptKernelID* srcPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * srcLen); 1337 for(int i = 0; i < srcLen; ++i) { 1338 srcPtr[i] = (RsScriptKernelID)jSrcPtr[i]; 1339 } 1340 1341 jint dstkLen = _env->GetArrayLength(_dstk); 1342 jlong *jDstkPtr = _env->GetLongArrayElements(_dstk, NULL); 1343 RsScriptKernelID* dstkPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstkLen); 1344 for(int i = 0; i < dstkLen; ++i) { 1345 dstkPtr[i] = (RsScriptKernelID)jDstkPtr[i]; 1346 } 1347 1348 jint dstfLen = _env->GetArrayLength(_dstf); 1349 jlong *jDstfPtr = _env->GetLongArrayElements(_dstf, NULL); 1350 RsScriptKernelID* dstfPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstfLen); 1351 for(int i = 0; i < dstfLen; ++i) { 1352 dstfPtr[i] = (RsScriptKernelID)jDstfPtr[i]; 1353 } 1354 1355 jint typesLen = _env->GetArrayLength(_types); 1356 jlong *jTypesPtr = _env->GetLongArrayElements(_types, NULL); 1357 RsType* typesPtr = (RsType*) malloc(sizeof(RsType) * typesLen); 1358 for(int i = 0; i < typesLen; ++i) { 1359 typesPtr[i] = (RsType)jTypesPtr[i]; 1360 } 1361 1362 jlong id = (jlong)(uintptr_t)rsScriptGroupCreate((RsContext)con, 1363 (RsScriptKernelID *)kernelsPtr, kernelsLen * sizeof(RsScriptKernelID), 1364 (RsScriptKernelID *)srcPtr, srcLen * sizeof(RsScriptKernelID), 1365 (RsScriptKernelID *)dstkPtr, dstkLen * sizeof(RsScriptKernelID), 1366 (RsScriptFieldID *)dstfPtr, dstfLen * sizeof(RsScriptKernelID), 1367 (RsType *)typesPtr, typesLen * sizeof(RsType)); 1368 1369 free(kernelsPtr); 1370 free(srcPtr); 1371 free(dstkPtr); 1372 free(dstfPtr); 1373 free(typesPtr); 1374 _env->ReleaseLongArrayElements(_kernels, jKernelsPtr, 0); 1375 _env->ReleaseLongArrayElements(_src, jSrcPtr, 0); 1376 _env->ReleaseLongArrayElements(_dstk, jDstkPtr, 0); 1377 _env->ReleaseLongArrayElements(_dstf, jDstfPtr, 0); 1378 _env->ReleaseLongArrayElements(_types, jTypesPtr, 0); 1379 return id; 1380 } 1381 1382 static void 1383 nScriptGroupSetInput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc) 1384 { 1385 LOG_API("nScriptGroupSetInput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con, 1386 (void *)gid, (void *)kid, (void *)alloc); 1387 rsScriptGroupSetInput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid, (RsAllocation)alloc); 1388 } 1389 1390 static void 1391 nScriptGroupSetOutput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc) 1392 { 1393 LOG_API("nScriptGroupSetOutput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con, 1394 (void *)gid, (void *)kid, (void *)alloc); 1395 rsScriptGroupSetOutput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid, (RsAllocation)alloc); 1396 } 1397 1398 static void 1399 nScriptGroupExecute(JNIEnv *_env, jobject _this, jlong con, jlong gid) 1400 { 1401 LOG_API("nScriptGroupSetOutput, con(%p) group(%p)", (RsContext)con, (void *)gid); 1402 rsScriptGroupExecute((RsContext)con, (RsScriptGroup)gid); 1403 } 1404 1405 // --------------------------------------------------------------------------- 1406 1407 static jlong 1408 nProgramStoreCreate(JNIEnv *_env, jobject _this, jlong con, 1409 jboolean colorMaskR, jboolean colorMaskG, jboolean colorMaskB, jboolean colorMaskA, 1410 jboolean depthMask, jboolean ditherEnable, 1411 jint srcFunc, jint destFunc, 1412 jint depthFunc) 1413 { 1414 LOG_API("nProgramStoreCreate, con(%p)", (RsContext)con); 1415 return (jlong)(uintptr_t)rsProgramStoreCreate((RsContext)con, colorMaskR, colorMaskG, colorMaskB, colorMaskA, 1416 depthMask, ditherEnable, (RsBlendSrcFunc)srcFunc, 1417 (RsBlendDstFunc)destFunc, (RsDepthFunc)depthFunc); 1418 } 1419 1420 // --------------------------------------------------------------------------- 1421 1422 static void 1423 nProgramBindConstants(JNIEnv *_env, jobject _this, jlong con, jlong vpv, jint slot, jlong a) 1424 { 1425 LOG_API("nProgramBindConstants, con(%p), vpf(%p), sloat(%i), a(%p)", (RsContext)con, (RsProgramVertex)vpv, slot, (RsAllocation)a); 1426 rsProgramBindConstants((RsContext)con, (RsProgram)vpv, slot, (RsAllocation)a); 1427 } 1428 1429 static void 1430 nProgramBindTexture(JNIEnv *_env, jobject _this, jlong con, jlong vpf, jint slot, jlong a) 1431 { 1432 LOG_API("nProgramBindTexture, con(%p), vpf(%p), slot(%i), a(%p)", (RsContext)con, (RsProgramFragment)vpf, slot, (RsAllocation)a); 1433 rsProgramBindTexture((RsContext)con, (RsProgramFragment)vpf, slot, (RsAllocation)a); 1434 } 1435 1436 static void 1437 nProgramBindSampler(JNIEnv *_env, jobject _this, jlong con, jlong vpf, jint slot, jlong a) 1438 { 1439 LOG_API("nProgramBindSampler, con(%p), vpf(%p), slot(%i), a(%p)", (RsContext)con, (RsProgramFragment)vpf, slot, (RsSampler)a); 1440 rsProgramBindSampler((RsContext)con, (RsProgramFragment)vpf, slot, (RsSampler)a); 1441 } 1442 1443 // --------------------------------------------------------------------------- 1444 1445 static jlong 1446 nProgramFragmentCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader, 1447 jobjectArray texNames, jlongArray params) 1448 { 1449 AutoJavaStringToUTF8 shaderUTF(_env, shader); 1450 jlong *jParamPtr = _env->GetLongArrayElements(params, NULL); 1451 jint paramLen = _env->GetArrayLength(params); 1452 1453 int texCount = _env->GetArrayLength(texNames); 1454 AutoJavaStringArrayToUTF8 names(_env, texNames, texCount); 1455 const char ** nameArray = names.c_str(); 1456 size_t* sizeArray = names.c_str_len(); 1457 1458 LOG_API("nProgramFragmentCreate, con(%p), paramLen(%i)", (RsContext)con, paramLen); 1459 1460 uintptr_t * paramPtr = (uintptr_t*) malloc(sizeof(uintptr_t) * paramLen); 1461 for(int i = 0; i < paramLen; ++i) { 1462 paramPtr[i] = (uintptr_t)jParamPtr[i]; 1463 } 1464 jlong ret = (jlong)(uintptr_t)rsProgramFragmentCreate((RsContext)con, shaderUTF.c_str(), shaderUTF.length(), 1465 nameArray, texCount, sizeArray, 1466 paramPtr, paramLen); 1467 1468 free(paramPtr); 1469 _env->ReleaseLongArrayElements(params, jParamPtr, JNI_ABORT); 1470 return ret; 1471 } 1472 1473 1474 // --------------------------------------------------------------------------- 1475 1476 static jlong 1477 nProgramVertexCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader, 1478 jobjectArray texNames, jlongArray params) 1479 { 1480 AutoJavaStringToUTF8 shaderUTF(_env, shader); 1481 jlong *jParamPtr = _env->GetLongArrayElements(params, NULL); 1482 jint paramLen = _env->GetArrayLength(params); 1483 1484 LOG_API("nProgramVertexCreate, con(%p), paramLen(%i)", (RsContext)con, paramLen); 1485 1486 int texCount = _env->GetArrayLength(texNames); 1487 AutoJavaStringArrayToUTF8 names(_env, texNames, texCount); 1488 const char ** nameArray = names.c_str(); 1489 size_t* sizeArray = names.c_str_len(); 1490 1491 uintptr_t * paramPtr = (uintptr_t*) malloc(sizeof(uintptr_t) * paramLen); 1492 for(int i = 0; i < paramLen; ++i) { 1493 paramPtr[i] = (uintptr_t)jParamPtr[i]; 1494 } 1495 1496 jlong ret = (jlong)(uintptr_t)rsProgramVertexCreate((RsContext)con, shaderUTF.c_str(), shaderUTF.length(), 1497 nameArray, texCount, sizeArray, 1498 paramPtr, paramLen); 1499 1500 free(paramPtr); 1501 _env->ReleaseLongArrayElements(params, jParamPtr, JNI_ABORT); 1502 return ret; 1503 } 1504 1505 // --------------------------------------------------------------------------- 1506 1507 static jlong 1508 nProgramRasterCreate(JNIEnv *_env, jobject _this, jlong con, jboolean pointSprite, jint cull) 1509 { 1510 LOG_API("nProgramRasterCreate, con(%p), pointSprite(%i), cull(%i)", (RsContext)con, pointSprite, cull); 1511 return (jlong)(uintptr_t)rsProgramRasterCreate((RsContext)con, pointSprite, (RsCullMode)cull); 1512 } 1513 1514 1515 // --------------------------------------------------------------------------- 1516 1517 static void 1518 nContextBindRootScript(JNIEnv *_env, jobject _this, jlong con, jlong script) 1519 { 1520 LOG_API("nContextBindRootScript, con(%p), script(%p)", (RsContext)con, (RsScript)script); 1521 rsContextBindRootScript((RsContext)con, (RsScript)script); 1522 } 1523 1524 static void 1525 nContextBindProgramStore(JNIEnv *_env, jobject _this, jlong con, jlong pfs) 1526 { 1527 LOG_API("nContextBindProgramStore, con(%p), pfs(%p)", (RsContext)con, (RsProgramStore)pfs); 1528 rsContextBindProgramStore((RsContext)con, (RsProgramStore)pfs); 1529 } 1530 1531 static void 1532 nContextBindProgramFragment(JNIEnv *_env, jobject _this, jlong con, jlong pf) 1533 { 1534 LOG_API("nContextBindProgramFragment, con(%p), pf(%p)", (RsContext)con, (RsProgramFragment)pf); 1535 rsContextBindProgramFragment((RsContext)con, (RsProgramFragment)pf); 1536 } 1537 1538 static void 1539 nContextBindProgramVertex(JNIEnv *_env, jobject _this, jlong con, jlong pf) 1540 { 1541 LOG_API("nContextBindProgramVertex, con(%p), pf(%p)", (RsContext)con, (RsProgramVertex)pf); 1542 rsContextBindProgramVertex((RsContext)con, (RsProgramVertex)pf); 1543 } 1544 1545 static void 1546 nContextBindProgramRaster(JNIEnv *_env, jobject _this, jlong con, jlong pf) 1547 { 1548 LOG_API("nContextBindProgramRaster, con(%p), pf(%p)", (RsContext)con, (RsProgramRaster)pf); 1549 rsContextBindProgramRaster((RsContext)con, (RsProgramRaster)pf); 1550 } 1551 1552 1553 // --------------------------------------------------------------------------- 1554 1555 static jlong 1556 nSamplerCreate(JNIEnv *_env, jobject _this, jlong con, jint magFilter, jint minFilter, 1557 jint wrapS, jint wrapT, jint wrapR, jfloat aniso) 1558 { 1559 LOG_API("nSamplerCreate, con(%p)", (RsContext)con); 1560 return (jlong)(uintptr_t)rsSamplerCreate((RsContext)con, 1561 (RsSamplerValue)magFilter, 1562 (RsSamplerValue)minFilter, 1563 (RsSamplerValue)wrapS, 1564 (RsSamplerValue)wrapT, 1565 (RsSamplerValue)wrapR, 1566 aniso); 1567 } 1568 1569 // --------------------------------------------------------------------------- 1570 1571 static jlong 1572 nPathCreate(JNIEnv *_env, jobject _this, jlong con, jint prim, jboolean isStatic, jlong _vtx, jlong _loop, jfloat q) { 1573 LOG_API("nPathCreate, con(%p)", (RsContext)con); 1574 1575 jlong id = (jlong)(uintptr_t)rsPathCreate((RsContext)con, (RsPathPrimitive)prim, isStatic, 1576 (RsAllocation)_vtx, 1577 (RsAllocation)_loop, q); 1578 return id; 1579 } 1580 1581 static jlong 1582 nMeshCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _vtx, jlongArray _idx, jintArray _prim) 1583 { 1584 LOG_API("nMeshCreate, con(%p)", (RsContext)con); 1585 1586 jint vtxLen = _env->GetArrayLength(_vtx); 1587 jlong *jVtxPtr = _env->GetLongArrayElements(_vtx, NULL); 1588 RsAllocation* vtxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * vtxLen); 1589 for(int i = 0; i < vtxLen; ++i) { 1590 vtxPtr[i] = (RsAllocation)(uintptr_t)jVtxPtr[i]; 1591 } 1592 1593 jint idxLen = _env->GetArrayLength(_idx); 1594 jlong *jIdxPtr = _env->GetLongArrayElements(_idx, NULL); 1595 RsAllocation* idxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * idxLen); 1596 for(int i = 0; i < idxLen; ++i) { 1597 idxPtr[i] = (RsAllocation)(uintptr_t)jIdxPtr[i]; 1598 } 1599 1600 jint primLen = _env->GetArrayLength(_prim); 1601 jint *primPtr = _env->GetIntArrayElements(_prim, NULL); 1602 1603 jlong id = (jlong)(uintptr_t)rsMeshCreate((RsContext)con, 1604 (RsAllocation *)vtxPtr, vtxLen, 1605 (RsAllocation *)idxPtr, idxLen, 1606 (uint32_t *)primPtr, primLen); 1607 1608 free(vtxPtr); 1609 free(idxPtr); 1610 _env->ReleaseLongArrayElements(_vtx, jVtxPtr, 0); 1611 _env->ReleaseLongArrayElements(_idx, jIdxPtr, 0); 1612 _env->ReleaseIntArrayElements(_prim, primPtr, 0); 1613 return id; 1614 } 1615 1616 static jint 1617 nMeshGetVertexBufferCount(JNIEnv *_env, jobject _this, jlong con, jlong mesh) 1618 { 1619 LOG_API("nMeshGetVertexBufferCount, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh); 1620 jint vtxCount = 0; 1621 rsaMeshGetVertexBufferCount((RsContext)con, (RsMesh)mesh, &vtxCount); 1622 return vtxCount; 1623 } 1624 1625 static jint 1626 nMeshGetIndexCount(JNIEnv *_env, jobject _this, jlong con, jlong mesh) 1627 { 1628 LOG_API("nMeshGetIndexCount, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh); 1629 jint idxCount = 0; 1630 rsaMeshGetIndexCount((RsContext)con, (RsMesh)mesh, &idxCount); 1631 return idxCount; 1632 } 1633 1634 static void 1635 nMeshGetVertices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jlongArray _ids, jint numVtxIDs) 1636 { 1637 LOG_API("nMeshGetVertices, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh); 1638 1639 RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numVtxIDs * sizeof(RsAllocation)); 1640 rsaMeshGetVertices((RsContext)con, (RsMesh)mesh, allocs, (uint32_t)numVtxIDs); 1641 1642 for(jint i = 0; i < numVtxIDs; i ++) { 1643 const jlong alloc = (jlong)(uintptr_t)allocs[i]; 1644 _env->SetLongArrayRegion(_ids, i, 1, &alloc); 1645 } 1646 1647 free(allocs); 1648 } 1649 1650 static void 1651 nMeshGetIndices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jlongArray _idxIds, jintArray _primitives, jint numIndices) 1652 { 1653 LOG_API("nMeshGetVertices, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh); 1654 1655 RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numIndices * sizeof(RsAllocation)); 1656 uint32_t *prims= (uint32_t*)malloc((uint32_t)numIndices * sizeof(uint32_t)); 1657 1658 rsaMeshGetIndices((RsContext)con, (RsMesh)mesh, allocs, prims, (uint32_t)numIndices); 1659 1660 for(jint i = 0; i < numIndices; i ++) { 1661 const jlong alloc = (jlong)(uintptr_t)allocs[i]; 1662 const jint prim = (jint)prims[i]; 1663 _env->SetLongArrayRegion(_idxIds, i, 1, &alloc); 1664 _env->SetIntArrayRegion(_primitives, i, 1, &prim); 1665 } 1666 1667 free(allocs); 1668 free(prims); 1669 } 1670 1671 static jint 1672 nSystemGetPointerSize(JNIEnv *_env, jobject _this) { 1673 return (jint)sizeof(void*); 1674 } 1675 1676 1677 // --------------------------------------------------------------------------- 1678 1679 1680 static const char *classPathName = "android/renderscript/RenderScript"; 1681 1682 static JNINativeMethod methods[] = { 1683 {"_nInit", "()V", (void*)_nInit }, 1684 1685 {"nDeviceCreate", "()J", (void*)nDeviceCreate }, 1686 {"nDeviceDestroy", "(J)V", (void*)nDeviceDestroy }, 1687 {"nDeviceSetConfig", "(JII)V", (void*)nDeviceSetConfig }, 1688 {"nContextGetUserMessage", "(J[I)I", (void*)nContextGetUserMessage }, 1689 {"nContextGetErrorMessage", "(J)Ljava/lang/String;", (void*)nContextGetErrorMessage }, 1690 {"nContextPeekMessage", "(J[I)I", (void*)nContextPeekMessage }, 1691 1692 {"nContextInitToClient", "(J)V", (void*)nContextInitToClient }, 1693 {"nContextDeinitToClient", "(J)V", (void*)nContextDeinitToClient }, 1694 1695 1696 // All methods below are thread protected in java. 1697 {"rsnContextCreate", "(JIII)J", (void*)nContextCreate }, 1698 {"rsnContextCreateGL", "(JIIIIIIIIIIIIFI)J", (void*)nContextCreateGL }, 1699 {"rsnContextFinish", "(J)V", (void*)nContextFinish }, 1700 {"rsnContextSetPriority", "(JI)V", (void*)nContextSetPriority }, 1701 {"rsnContextSetSurface", "(JIILandroid/view/Surface;)V", (void*)nContextSetSurface }, 1702 {"rsnContextDestroy", "(J)V", (void*)nContextDestroy }, 1703 {"rsnContextDump", "(JI)V", (void*)nContextDump }, 1704 {"rsnContextPause", "(J)V", (void*)nContextPause }, 1705 {"rsnContextResume", "(J)V", (void*)nContextResume }, 1706 {"rsnContextSendMessage", "(JI[I)V", (void*)nContextSendMessage }, 1707 {"rsnAssignName", "(JJ[B)V", (void*)nAssignName }, 1708 {"rsnGetName", "(JJ)Ljava/lang/String;", (void*)nGetName }, 1709 {"rsnObjDestroy", "(JJ)V", (void*)nObjDestroy }, 1710 1711 {"rsnFileA3DCreateFromFile", "(JLjava/lang/String;)J", (void*)nFileA3DCreateFromFile }, 1712 {"rsnFileA3DCreateFromAssetStream", "(JJ)J", (void*)nFileA3DCreateFromAssetStream }, 1713 {"rsnFileA3DCreateFromAsset", "(JLandroid/content/res/AssetManager;Ljava/lang/String;)J", (void*)nFileA3DCreateFromAsset }, 1714 {"rsnFileA3DGetNumIndexEntries", "(JJ)I", (void*)nFileA3DGetNumIndexEntries }, 1715 {"rsnFileA3DGetIndexEntries", "(JJI[I[Ljava/lang/String;)V", (void*)nFileA3DGetIndexEntries }, 1716 {"rsnFileA3DGetEntryByIndex", "(JJI)J", (void*)nFileA3DGetEntryByIndex }, 1717 1718 {"rsnFontCreateFromFile", "(JLjava/lang/String;FI)J", (void*)nFontCreateFromFile }, 1719 {"rsnFontCreateFromAssetStream", "(JLjava/lang/String;FIJ)J", (void*)nFontCreateFromAssetStream }, 1720 {"rsnFontCreateFromAsset", "(JLandroid/content/res/AssetManager;Ljava/lang/String;FI)J", (void*)nFontCreateFromAsset }, 1721 1722 {"rsnElementCreate", "(JJIZI)J", (void*)nElementCreate }, 1723 {"rsnElementCreate2", "(J[J[Ljava/lang/String;[I)J", (void*)nElementCreate2 }, 1724 {"rsnElementGetNativeData", "(JJ[I)V", (void*)nElementGetNativeData }, 1725 {"rsnElementGetSubElements", "(JJ[J[Ljava/lang/String;[I)V", (void*)nElementGetSubElements }, 1726 1727 {"rsnTypeCreate", "(JJIIIZZI)J", (void*)nTypeCreate }, 1728 {"rsnTypeGetNativeData", "(JJ[J)V", (void*)nTypeGetNativeData }, 1729 1730 {"rsnAllocationCreateTyped", "(JJIIJ)J", (void*)nAllocationCreateTyped }, 1731 {"rsnAllocationCreateFromBitmap", "(JJILandroid/graphics/Bitmap;I)J", (void*)nAllocationCreateFromBitmap }, 1732 {"rsnAllocationCreateBitmapBackedAllocation", "(JJILandroid/graphics/Bitmap;I)J", (void*)nAllocationCreateBitmapBackedAllocation }, 1733 {"rsnAllocationCubeCreateFromBitmap","(JJILandroid/graphics/Bitmap;I)J", (void*)nAllocationCubeCreateFromBitmap }, 1734 1735 {"rsnAllocationCopyFromBitmap", "(JJLandroid/graphics/Bitmap;)V", (void*)nAllocationCopyFromBitmap }, 1736 {"rsnAllocationCopyToBitmap", "(JJLandroid/graphics/Bitmap;)V", (void*)nAllocationCopyToBitmap }, 1737 1738 {"rsnAllocationSyncAll", "(JJI)V", (void*)nAllocationSyncAll }, 1739 {"rsnAllocationGetSurface", "(JJ)Landroid/view/Surface;", (void*)nAllocationGetSurface }, 1740 {"rsnAllocationSetSurface", "(JJLandroid/view/Surface;)V", (void*)nAllocationSetSurface }, 1741 {"rsnAllocationIoSend", "(JJ)V", (void*)nAllocationIoSend }, 1742 {"rsnAllocationIoReceive", "(JJ)V", (void*)nAllocationIoReceive }, 1743 {"rsnAllocationData1D", "(JJIIILjava/lang/Object;II)V", (void*)nAllocationData1D }, 1744 {"rsnAllocationElementData1D", "(JJIII[BI)V", (void*)nAllocationElementData1D }, 1745 {"rsnAllocationData2D", "(JJIIIIIILjava/lang/Object;II)V", (void*)nAllocationData2D }, 1746 {"rsnAllocationData2D", "(JJIIIIIIJIIII)V", (void*)nAllocationData2D_alloc }, 1747 {"rsnAllocationData3D", "(JJIIIIIIILjava/lang/Object;II)V", (void*)nAllocationData3D }, 1748 {"rsnAllocationData3D", "(JJIIIIIIIJIIII)V", (void*)nAllocationData3D_alloc }, 1749 {"rsnAllocationRead", "(JJLjava/lang/Object;I)V", (void*)nAllocationRead }, 1750 {"rsnAllocationRead1D", "(JJIIILjava/lang/Object;II)V", (void*)nAllocationRead1D }, 1751 {"rsnAllocationRead2D", "(JJIIIIIILjava/lang/Object;II)V", (void*)nAllocationRead2D }, 1752 {"rsnAllocationGetType", "(JJ)J", (void*)nAllocationGetType}, 1753 {"rsnAllocationResize1D", "(JJI)V", (void*)nAllocationResize1D }, 1754 {"rsnAllocationGenerateMipmaps", "(JJ)V", (void*)nAllocationGenerateMipmaps }, 1755 1756 {"rsnScriptBindAllocation", "(JJJI)V", (void*)nScriptBindAllocation }, 1757 {"rsnScriptSetTimeZone", "(JJ[B)V", (void*)nScriptSetTimeZone }, 1758 {"rsnScriptInvoke", "(JJI)V", (void*)nScriptInvoke }, 1759 {"rsnScriptInvokeV", "(JJI[B)V", (void*)nScriptInvokeV }, 1760 {"rsnScriptForEach", "(JJIJJ)V", (void*)nScriptForEach }, 1761 {"rsnScriptForEach", "(JJIJJ[B)V", (void*)nScriptForEachV }, 1762 {"rsnScriptForEachClipped", "(JJIJJIIIIII)V", (void*)nScriptForEachClipped }, 1763 {"rsnScriptForEachClipped", "(JJIJJ[BIIIIII)V", (void*)nScriptForEachClippedV }, 1764 {"rsnScriptForEachMultiClipped", "(JJI[JJIIIIII)V", (void*)nScriptForEachMultiClipped }, 1765 {"rsnScriptForEachMultiClipped", "(JJI[JJ[BIIIIII)V", (void*)nScriptForEachMultiClippedV }, 1766 {"rsnScriptSetVarI", "(JJII)V", (void*)nScriptSetVarI }, 1767 {"rsnScriptGetVarI", "(JJI)I", (void*)nScriptGetVarI }, 1768 {"rsnScriptSetVarJ", "(JJIJ)V", (void*)nScriptSetVarJ }, 1769 {"rsnScriptGetVarJ", "(JJI)J", (void*)nScriptGetVarJ }, 1770 {"rsnScriptSetVarF", "(JJIF)V", (void*)nScriptSetVarF }, 1771 {"rsnScriptGetVarF", "(JJI)F", (void*)nScriptGetVarF }, 1772 {"rsnScriptSetVarD", "(JJID)V", (void*)nScriptSetVarD }, 1773 {"rsnScriptGetVarD", "(JJI)D", (void*)nScriptGetVarD }, 1774 {"rsnScriptSetVarV", "(JJI[B)V", (void*)nScriptSetVarV }, 1775 {"rsnScriptGetVarV", "(JJI[B)V", (void*)nScriptGetVarV }, 1776 {"rsnScriptSetVarVE", "(JJI[BJ[I)V", (void*)nScriptSetVarVE }, 1777 {"rsnScriptSetVarObj", "(JJIJ)V", (void*)nScriptSetVarObj }, 1778 1779 {"rsnScriptCCreate", "(JLjava/lang/String;Ljava/lang/String;[BI)J", (void*)nScriptCCreate }, 1780 {"rsnScriptIntrinsicCreate", "(JIJ)J", (void*)nScriptIntrinsicCreate }, 1781 {"rsnScriptKernelIDCreate", "(JJII)J", (void*)nScriptKernelIDCreate }, 1782 {"rsnScriptFieldIDCreate", "(JJI)J", (void*)nScriptFieldIDCreate }, 1783 {"rsnScriptGroupCreate", "(J[J[J[J[J[J)J", (void*)nScriptGroupCreate }, 1784 {"rsnScriptGroupSetInput", "(JJJJ)V", (void*)nScriptGroupSetInput }, 1785 {"rsnScriptGroupSetOutput", "(JJJJ)V", (void*)nScriptGroupSetOutput }, 1786 {"rsnScriptGroupExecute", "(JJ)V", (void*)nScriptGroupExecute }, 1787 1788 {"rsnProgramStoreCreate", "(JZZZZZZIII)J", (void*)nProgramStoreCreate }, 1789 1790 {"rsnProgramBindConstants", "(JJIJ)V", (void*)nProgramBindConstants }, 1791 {"rsnProgramBindTexture", "(JJIJ)V", (void*)nProgramBindTexture }, 1792 {"rsnProgramBindSampler", "(JJIJ)V", (void*)nProgramBindSampler }, 1793 1794 {"rsnProgramFragmentCreate", "(JLjava/lang/String;[Ljava/lang/String;[J)J", (void*)nProgramFragmentCreate }, 1795 {"rsnProgramRasterCreate", "(JZI)J", (void*)nProgramRasterCreate }, 1796 {"rsnProgramVertexCreate", "(JLjava/lang/String;[Ljava/lang/String;[J)J", (void*)nProgramVertexCreate }, 1797 1798 {"rsnContextBindRootScript", "(JJ)V", (void*)nContextBindRootScript }, 1799 {"rsnContextBindProgramStore", "(JJ)V", (void*)nContextBindProgramStore }, 1800 {"rsnContextBindProgramFragment", "(JJ)V", (void*)nContextBindProgramFragment }, 1801 {"rsnContextBindProgramVertex", "(JJ)V", (void*)nContextBindProgramVertex }, 1802 {"rsnContextBindProgramRaster", "(JJ)V", (void*)nContextBindProgramRaster }, 1803 1804 {"rsnSamplerCreate", "(JIIIIIF)J", (void*)nSamplerCreate }, 1805 1806 {"rsnPathCreate", "(JIZJJF)J", (void*)nPathCreate }, 1807 {"rsnMeshCreate", "(J[J[J[I)J", (void*)nMeshCreate }, 1808 1809 {"rsnMeshGetVertexBufferCount", "(JJ)I", (void*)nMeshGetVertexBufferCount }, 1810 {"rsnMeshGetIndexCount", "(JJ)I", (void*)nMeshGetIndexCount }, 1811 {"rsnMeshGetVertices", "(JJ[JI)V", (void*)nMeshGetVertices }, 1812 {"rsnMeshGetIndices", "(JJ[J[II)V", (void*)nMeshGetIndices }, 1813 1814 {"rsnSystemGetPointerSize", "()I", (void*)nSystemGetPointerSize }, 1815 }; 1816 1817 static int registerFuncs(JNIEnv *_env) 1818 { 1819 return android::AndroidRuntime::registerNativeMethods( 1820 _env, classPathName, methods, NELEM(methods)); 1821 } 1822 1823 // --------------------------------------------------------------------------- 1824 1825 jint JNI_OnLoad(JavaVM* vm, void* reserved) 1826 { 1827 JNIEnv* env = NULL; 1828 jint result = -1; 1829 1830 if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { 1831 ALOGE("ERROR: GetEnv failed\n"); 1832 goto bail; 1833 } 1834 assert(env != NULL); 1835 1836 if (registerFuncs(env) < 0) { 1837 ALOGE("ERROR: Renderscript native registration failed\n"); 1838 goto bail; 1839 } 1840 1841 /* success -- return valid version number */ 1842 result = JNI_VERSION_1_4; 1843 1844 bail: 1845 return result; 1846 } 1847