android_renderscript_RenderScript.cpp revision 26ae3904e8050eae655722caf93ee5d3f0ab195a
1/* 2 * Copyright (C) 2006 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 <surfaceflinger/Surface.h> 27 28#include <core/SkBitmap.h> 29#include <core/SkPixelRef.h> 30#include <core/SkStream.h> 31#include <core/SkTemplates.h> 32#include <images/SkImageDecoder.h> 33 34#include <utils/Asset.h> 35#include <utils/ResourceTypes.h> 36 37#include "jni.h" 38#include "JNIHelp.h" 39#include "android_runtime/AndroidRuntime.h" 40#include "android_runtime/android_view_Surface.h" 41 42#include <RenderScript.h> 43#include <RenderScriptEnv.h> 44 45//#define LOG_API LOGE 46#define LOG_API(...) 47 48using namespace android; 49 50// --------------------------------------------------------------------------- 51 52static void doThrow(JNIEnv* env, const char* exc, const char* msg = NULL) 53{ 54 jclass npeClazz = env->FindClass(exc); 55 env->ThrowNew(npeClazz, msg); 56} 57 58static jfieldID gContextId = 0; 59static jfieldID gNativeBitmapID = 0; 60static jfieldID gTypeNativeCache = 0; 61 62static RsElement g_A_8 = NULL; 63static RsElement g_RGBA_4444 = NULL; 64static RsElement g_RGBA_8888 = NULL; 65static RsElement g_RGB_565 = NULL; 66 67static void _nInit(JNIEnv *_env, jclass _this) 68{ 69 gContextId = _env->GetFieldID(_this, "mContext", "I"); 70 71 jclass bitmapClass = _env->FindClass("android/graphics/Bitmap"); 72 gNativeBitmapID = _env->GetFieldID(bitmapClass, "mNativeBitmap", "I"); 73} 74 75static void nInitElements(JNIEnv *_env, jobject _this, jint a8, jint rgba4444, jint rgba8888, jint rgb565) 76{ 77 g_A_8 = reinterpret_cast<RsElement>(a8); 78 g_RGBA_4444 = reinterpret_cast<RsElement>(rgba4444); 79 g_RGBA_8888 = reinterpret_cast<RsElement>(rgba8888); 80 g_RGB_565 = reinterpret_cast<RsElement>(rgb565); 81} 82 83// --------------------------------------------------------------------------- 84 85static void 86nContextFinish(JNIEnv *_env, jobject _this, RsContext con) 87{ 88 LOG_API("nContextFinish, con(%p)", con); 89 rsContextFinish(con); 90} 91 92static void 93nAssignName(JNIEnv *_env, jobject _this, RsContext con, jint obj, jbyteArray str) 94{ 95 LOG_API("nAssignName, con(%p), obj(%p)", con, (void *)obj); 96 jint len = _env->GetArrayLength(str); 97 jbyte * cptr = (jbyte *) _env->GetPrimitiveArrayCritical(str, 0); 98 rsAssignName(con, (void *)obj, (const char *)cptr, len); 99 _env->ReleasePrimitiveArrayCritical(str, cptr, JNI_ABORT); 100} 101 102static jstring 103nGetName(JNIEnv *_env, jobject _this, RsContext con, jint obj) 104{ 105 LOG_API("nGetName, con(%p), obj(%p)", con, (void *)obj); 106 const char *name = NULL; 107 rsGetName(con, (void *)obj, &name); 108 return _env->NewStringUTF(name); 109} 110 111static void 112nObjDestroy(JNIEnv *_env, jobject _this, RsContext con, jint obj) 113{ 114 LOG_API("nObjDestroy, con(%p) obj(%p)", con, (void *)obj); 115 rsObjDestroy(con, (void *)obj); 116} 117 118 119static jint 120nFileOpen(JNIEnv *_env, jobject _this, RsContext con, jbyteArray str) 121{ 122 LOG_API("nFileOpen, con(%p)", con); 123 jint len = _env->GetArrayLength(str); 124 jbyte * cptr = (jbyte *) _env->GetPrimitiveArrayCritical(str, 0); 125 jint ret = (jint)rsFileOpen(con, (const char *)cptr, len); 126 _env->ReleasePrimitiveArrayCritical(str, cptr, JNI_ABORT); 127 return ret; 128} 129 130// --------------------------------------------------------------------------- 131 132static jint 133nDeviceCreate(JNIEnv *_env, jobject _this) 134{ 135 LOG_API("nDeviceCreate"); 136 return (jint)rsDeviceCreate(); 137} 138 139static void 140nDeviceDestroy(JNIEnv *_env, jobject _this, jint dev) 141{ 142 LOG_API("nDeviceDestroy"); 143 return rsDeviceDestroy((RsDevice)dev); 144} 145 146static void 147nDeviceSetConfig(JNIEnv *_env, jobject _this, jint dev, jint p, jint value) 148{ 149 LOG_API("nDeviceSetConfig dev(%p), param(%i), value(%i)", (void *)dev, p, value); 150 return rsDeviceSetConfig((RsDevice)dev, (RsDeviceParam)p, value); 151} 152 153static jint 154nContextCreate(JNIEnv *_env, jobject _this, jint dev, jint ver) 155{ 156 LOG_API("nContextCreate"); 157 return (jint)rsContextCreate((RsDevice)dev, ver); 158} 159 160static jint 161nContextCreateGL(JNIEnv *_env, jobject _this, jint dev, jint ver, jboolean useDepth) 162{ 163 LOG_API("nContextCreateGL"); 164 return (jint)rsContextCreateGL((RsDevice)dev, ver, useDepth); 165} 166 167static void 168nContextSetPriority(JNIEnv *_env, jobject _this, RsContext con, jint p) 169{ 170 LOG_API("ContextSetPriority, con(%p), priority(%i)", con, p); 171 rsContextSetPriority(con, p); 172} 173 174 175 176static void 177nContextSetSurface(JNIEnv *_env, jobject _this, RsContext con, jint width, jint height, jobject wnd) 178{ 179 LOG_API("nContextSetSurface, con(%p), width(%i), height(%i), surface(%p)", con, width, height, (Surface *)wnd); 180 181 Surface * window = NULL; 182 if (wnd == NULL) { 183 184 } else { 185 window = (Surface*) android_Surface_getNativeWindow(_env, wnd).get(); 186 } 187 188 rsContextSetSurface(con, width, height, window); 189} 190 191static void 192nContextDestroy(JNIEnv *_env, jobject _this, RsContext con) 193{ 194 LOG_API("nContextDestroy, con(%p)", con); 195 rsContextDestroy(con); 196} 197 198static void 199nContextDump(JNIEnv *_env, jobject _this, RsContext con, jint bits) 200{ 201 LOG_API("nContextDump, con(%p) bits(%i)", (RsContext)con, bits); 202 rsContextDump((RsContext)con, bits); 203} 204 205static void 206nContextPause(JNIEnv *_env, jobject _this, RsContext con) 207{ 208 LOG_API("nContextPause, con(%p)", con); 209 rsContextPause(con); 210} 211 212static void 213nContextResume(JNIEnv *_env, jobject _this, RsContext con) 214{ 215 LOG_API("nContextResume, con(%p)", con); 216 rsContextResume(con); 217} 218 219static jint 220nContextGetMessage(JNIEnv *_env, jobject _this, RsContext con, jintArray data, jboolean wait) 221{ 222 jint len = _env->GetArrayLength(data); 223 LOG_API("nContextGetMessage, con(%p), len(%i)", con, len); 224 jint *ptr = _env->GetIntArrayElements(data, NULL); 225 size_t receiveLen; 226 int id = rsContextGetMessage(con, ptr, &receiveLen, len * 4, wait); 227 if (!id && receiveLen) { 228 LOGV("message receive buffer too small. %i", receiveLen); 229 *ptr = (jint)receiveLen; 230 } 231 _env->ReleaseIntArrayElements(data, ptr, 0); 232 return id; 233} 234 235static void nContextInitToClient(JNIEnv *_env, jobject _this, RsContext con) 236{ 237 LOG_API("nContextInitToClient, con(%p)", con); 238 rsContextInitToClient(con); 239} 240 241static void nContextDeinitToClient(JNIEnv *_env, jobject _this, RsContext con) 242{ 243 LOG_API("nContextDeinitToClient, con(%p)", con); 244 rsContextDeinitToClient(con); 245} 246 247 248static jint 249nElementCreate(JNIEnv *_env, jobject _this, RsContext con, jint type, jint kind, jboolean norm, jint size) 250{ 251 LOG_API("nElementCreate, con(%p), type(%i), kind(%i), norm(%i), size(%i)", con, type, kind, norm, size); 252 return (jint)rsElementCreate(con, (RsDataType)type, (RsDataKind)kind, norm, size); 253} 254 255static jint 256nElementCreate2(JNIEnv *_env, jobject _this, RsContext con, jintArray _ids, jobjectArray _names, jintArray _arraySizes) 257{ 258 int fieldCount = _env->GetArrayLength(_ids); 259 LOG_API("nElementCreate2, con(%p)", con); 260 261 jint *ids = _env->GetIntArrayElements(_ids, NULL); 262 jint *arraySizes = _env->GetIntArrayElements(_arraySizes, NULL); 263 const char ** nameArray = (const char **)calloc(fieldCount, sizeof(char *)); 264 size_t* sizeArray = (size_t*)calloc(fieldCount, sizeof(size_t)); 265 266 for (int ct=0; ct < fieldCount; ct++) { 267 jstring s = (jstring)_env->GetObjectArrayElement(_names, ct); 268 nameArray[ct] = _env->GetStringUTFChars(s, NULL); 269 sizeArray[ct] = _env->GetStringUTFLength(s); 270 } 271 jint id = (jint)rsElementCreate2(con, fieldCount, (RsElement *)ids, nameArray, sizeArray, (const uint32_t *)arraySizes); 272 for (int ct=0; ct < fieldCount; ct++) { 273 jstring s = (jstring)_env->GetObjectArrayElement(_names, ct); 274 _env->ReleaseStringUTFChars(s, nameArray[ct]); 275 } 276 _env->ReleaseIntArrayElements(_ids, ids, JNI_ABORT); 277 _env->ReleaseIntArrayElements(_arraySizes, arraySizes, JNI_ABORT); 278 free(nameArray); 279 free(sizeArray); 280 return (jint)id; 281} 282 283static void 284nElementGetNativeData(JNIEnv *_env, jobject _this, RsContext con, jint id, jintArray _elementData) 285{ 286 int dataSize = _env->GetArrayLength(_elementData); 287 LOG_API("nElementGetNativeData, con(%p)", con); 288 289 // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements 290 assert(dataSize == 5); 291 292 uint32_t elementData[5]; 293 rsElementGetNativeData(con, (RsElement)id, elementData, dataSize); 294 295 for(jint i = 0; i < dataSize; i ++) { 296 _env->SetIntArrayRegion(_elementData, i, 1, (const jint*)&elementData[i]); 297 } 298} 299 300 301static void 302nElementGetSubElements(JNIEnv *_env, jobject _this, RsContext con, jint id, jintArray _IDs, jobjectArray _names) 303{ 304 int dataSize = _env->GetArrayLength(_IDs); 305 LOG_API("nElementGetSubElements, con(%p)", con); 306 307 uint32_t *ids = (uint32_t *)malloc((uint32_t)dataSize * sizeof(uint32_t)); 308 const char **names = (const char **)malloc((uint32_t)dataSize * sizeof(const char *)); 309 310 rsElementGetSubElements(con, (RsElement)id, ids, names, (uint32_t)dataSize); 311 312 for(jint i = 0; i < dataSize; i ++) { 313 _env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i])); 314 _env->SetIntArrayRegion(_IDs, i, 1, (const jint*)&ids[i]); 315 } 316 317 free(ids); 318 free(names); 319} 320 321// ----------------------------------- 322 323static void 324nTypeBegin(JNIEnv *_env, jobject _this, RsContext con, jint eID) 325{ 326 LOG_API("nTypeBegin, con(%p) e(%p)", con, (RsElement)eID); 327 rsTypeBegin(con, (RsElement)eID); 328} 329 330static void 331nTypeAdd(JNIEnv *_env, jobject _this, RsContext con, jint dim, jint val) 332{ 333 LOG_API("nTypeAdd, con(%p) dim(%i), val(%i)", con, dim, val); 334 rsTypeAdd(con, (RsDimension)dim, val); 335} 336 337static jint 338nTypeCreate(JNIEnv *_env, jobject _this, RsContext con) 339{ 340 LOG_API("nTypeCreate, con(%p)", con); 341 return (jint)rsTypeCreate(con); 342} 343 344static void 345nTypeGetNativeData(JNIEnv *_env, jobject _this, RsContext con, jint id, jintArray _typeData) 346{ 347 // We are packing 6 items: mDimX; mDimY; mDimZ; 348 // mDimLOD; mDimFaces; mElement; into typeData 349 int elementCount = _env->GetArrayLength(_typeData); 350 351 assert(elementCount == 6); 352 LOG_API("nTypeCreate, con(%p)", con); 353 354 uint32_t typeData[6]; 355 rsTypeGetNativeData(con, (RsType)id, typeData, 6); 356 357 for(jint i = 0; i < elementCount; i ++) { 358 _env->SetIntArrayRegion(_typeData, i, 1, (const jint*)&typeData[i]); 359 } 360} 361 362// ----------------------------------- 363 364static jint 365nAllocationCreateTyped(JNIEnv *_env, jobject _this, RsContext con, jint e) 366{ 367 LOG_API("nAllocationCreateTyped, con(%p), e(%p)", con, (RsElement)e); 368 return (jint) rsAllocationCreateTyped(con, (RsElement)e); 369} 370 371static void 372nAllocationUploadToTexture(JNIEnv *_env, jobject _this, RsContext con, jint a, jboolean genMip, jint mip) 373{ 374 LOG_API("nAllocationUploadToTexture, con(%p), a(%p), genMip(%i), mip(%i)", con, (RsAllocation)a, genMip, mip); 375 rsAllocationUploadToTexture(con, (RsAllocation)a, genMip, mip); 376} 377 378static void 379nAllocationUploadToBufferObject(JNIEnv *_env, jobject _this, RsContext con, jint a) 380{ 381 LOG_API("nAllocationUploadToBufferObject, con(%p), a(%p)", con, (RsAllocation)a); 382 rsAllocationUploadToBufferObject(con, (RsAllocation)a); 383} 384 385static RsElement SkBitmapToPredefined(SkBitmap::Config cfg) 386{ 387 switch (cfg) { 388 case SkBitmap::kA8_Config: 389 return g_A_8; 390 case SkBitmap::kARGB_4444_Config: 391 return g_RGBA_4444; 392 case SkBitmap::kARGB_8888_Config: 393 return g_RGBA_8888; 394 case SkBitmap::kRGB_565_Config: 395 return g_RGB_565; 396 397 default: 398 break; 399 } 400 // If we don't have a conversion mark it as a user type. 401 LOGE("Unsupported bitmap type"); 402 return NULL; 403} 404 405static int 406nAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, RsContext con, jint dstFmt, jboolean genMips, jobject jbitmap) 407{ 408 SkBitmap const * nativeBitmap = 409 (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID); 410 const SkBitmap& bitmap(*nativeBitmap); 411 SkBitmap::Config config = bitmap.getConfig(); 412 413 RsElement e = SkBitmapToPredefined(config); 414 if (e) { 415 bitmap.lockPixels(); 416 const int w = bitmap.width(); 417 const int h = bitmap.height(); 418 const void* ptr = bitmap.getPixels(); 419 jint id = (jint)rsAllocationCreateFromBitmap(con, w, h, (RsElement)dstFmt, e, genMips, ptr); 420 bitmap.unlockPixels(); 421 return id; 422 } 423 return 0; 424} 425 426static void 427nAllocationUpdateFromBitmap(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jobject jbitmap) 428{ 429 SkBitmap const * nativeBitmap = 430 (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID); 431 const SkBitmap& bitmap(*nativeBitmap); 432 SkBitmap::Config config = bitmap.getConfig(); 433 434 RsElement e = SkBitmapToPredefined(config); 435 if (e) { 436 bitmap.lockPixels(); 437 const void* ptr = bitmap.getPixels(); 438 rsAllocationUpdateFromBitmap(con, (RsAllocation)alloc, e, ptr); 439 bitmap.unlockPixels(); 440 } 441} 442 443static void ReleaseBitmapCallback(void *bmp) 444{ 445 SkBitmap const * nativeBitmap = (SkBitmap const *)bmp; 446 nativeBitmap->unlockPixels(); 447} 448 449static int 450nAllocationCreateBitmapRef(JNIEnv *_env, jobject _this, RsContext con, jint type, jobject jbitmap) 451{ 452 SkBitmap * nativeBitmap = 453 (SkBitmap *)_env->GetIntField(jbitmap, gNativeBitmapID); 454 455 456 nativeBitmap->lockPixels(); 457 void* ptr = nativeBitmap->getPixels(); 458 jint id = (jint)rsAllocationCreateBitmapRef(con, (RsType)type, ptr, nativeBitmap, ReleaseBitmapCallback); 459 return id; 460} 461 462static int 463nAllocationCreateFromAssetStream(JNIEnv *_env, jobject _this, RsContext con, jint dstFmt, jboolean genMips, jint native_asset) 464{ 465 Asset* asset = reinterpret_cast<Asset*>(native_asset); 466 SkBitmap bitmap; 467 SkImageDecoder::DecodeMemory(asset->getBuffer(false), asset->getLength(), 468 &bitmap, SkBitmap::kNo_Config, SkImageDecoder::kDecodePixels_Mode); 469 470 SkBitmap::Config config = bitmap.getConfig(); 471 472 RsElement e = SkBitmapToPredefined(config); 473 474 if (e) { 475 bitmap.lockPixels(); 476 const int w = bitmap.width(); 477 const int h = bitmap.height(); 478 const void* ptr = bitmap.getPixels(); 479 jint id = (jint)rsAllocationCreateFromBitmap(con, w, h, (RsElement)dstFmt, e, genMips, ptr); 480 bitmap.unlockPixels(); 481 return id; 482 } 483 return 0; 484} 485 486static void 487nAllocationSubData1D_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint count, jintArray data, int sizeBytes) 488{ 489 jint len = _env->GetArrayLength(data); 490 LOG_API("nAllocation1DSubData_i, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes); 491 jint *ptr = _env->GetIntArrayElements(data, NULL); 492 rsAllocation1DSubData(con, (RsAllocation)alloc, offset, count, ptr, sizeBytes); 493 _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT); 494} 495 496static void 497nAllocationSubData1D_s(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint count, jshortArray data, int sizeBytes) 498{ 499 jint len = _env->GetArrayLength(data); 500 LOG_API("nAllocation1DSubData_s, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes); 501 jshort *ptr = _env->GetShortArrayElements(data, NULL); 502 rsAllocation1DSubData(con, (RsAllocation)alloc, offset, count, ptr, sizeBytes); 503 _env->ReleaseShortArrayElements(data, ptr, JNI_ABORT); 504} 505 506static void 507nAllocationSubData1D_b(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint count, jbyteArray data, int sizeBytes) 508{ 509 jint len = _env->GetArrayLength(data); 510 LOG_API("nAllocation1DSubData_b, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes); 511 jbyte *ptr = _env->GetByteArrayElements(data, NULL); 512 rsAllocation1DSubData(con, (RsAllocation)alloc, offset, count, ptr, sizeBytes); 513 _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT); 514} 515 516static void 517nAllocationSubData1D_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint count, jfloatArray data, int sizeBytes) 518{ 519 jint len = _env->GetArrayLength(data); 520 LOG_API("nAllocation1DSubData_f, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes); 521 jfloat *ptr = _env->GetFloatArrayElements(data, NULL); 522 rsAllocation1DSubData(con, (RsAllocation)alloc, offset, count, ptr, sizeBytes); 523 _env->ReleaseFloatArrayElements(data, ptr, JNI_ABORT); 524} 525 526static void 527// native void rsnAllocationSubElementData1D(int con, int id, int xoff, int compIdx, byte[] d, int sizeBytes); 528nAllocationSubElementData1D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint compIdx, jbyteArray data, int sizeBytes) 529{ 530 jint len = _env->GetArrayLength(data); 531 LOG_API("nAllocationSubElementData1D, con(%p), alloc(%p), offset(%i), comp(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, compIdx, len, sizeBytes); 532 jbyte *ptr = _env->GetByteArrayElements(data, NULL); 533 rsAllocation1DSubElementData(con, (RsAllocation)alloc, offset, ptr, compIdx, sizeBytes); 534 _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT); 535} 536 537static void 538nAllocationSubData2D_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint w, jint h, jintArray data, int sizeBytes) 539{ 540 jint len = _env->GetArrayLength(data); 541 LOG_API("nAllocation2DSubData_i, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", con, (RsAllocation)alloc, xoff, yoff, w, h, len); 542 jint *ptr = _env->GetIntArrayElements(data, NULL); 543 rsAllocation2DSubData(con, (RsAllocation)alloc, xoff, yoff, w, h, ptr, sizeBytes); 544 _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT); 545} 546 547static void 548nAllocationSubData2D_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint w, jint h, jfloatArray data, int sizeBytes) 549{ 550 jint len = _env->GetArrayLength(data); 551 LOG_API("nAllocation2DSubData_i, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", con, (RsAllocation)alloc, xoff, yoff, w, h, len); 552 jfloat *ptr = _env->GetFloatArrayElements(data, NULL); 553 rsAllocation2DSubData(con, (RsAllocation)alloc, xoff, yoff, w, h, ptr, sizeBytes); 554 _env->ReleaseFloatArrayElements(data, ptr, JNI_ABORT); 555} 556 557static void 558nAllocationRead_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jintArray data) 559{ 560 jint len = _env->GetArrayLength(data); 561 LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len); 562 jint *ptr = _env->GetIntArrayElements(data, NULL); 563 rsAllocationRead(con, (RsAllocation)alloc, ptr); 564 _env->ReleaseIntArrayElements(data, ptr, 0); 565} 566 567static void 568nAllocationRead_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jfloatArray data) 569{ 570 jint len = _env->GetArrayLength(data); 571 LOG_API("nAllocationRead_f, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len); 572 jfloat *ptr = _env->GetFloatArrayElements(data, NULL); 573 rsAllocationRead(con, (RsAllocation)alloc, ptr); 574 _env->ReleaseFloatArrayElements(data, ptr, 0); 575} 576 577static jint 578nAllocationGetType(JNIEnv *_env, jobject _this, RsContext con, jint a) 579{ 580 LOG_API("nAllocationGetType, con(%p), a(%p)", con, (RsAllocation)a); 581 return (jint) rsAllocationGetType(con, (RsAllocation)a); 582} 583 584static void 585nAllocationResize1D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint dimX) 586{ 587 LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", con, (RsAllocation)alloc, dimX); 588 rsAllocationResize1D(con, (RsAllocation)alloc, dimX); 589} 590 591static void 592nAllocationResize2D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint dimX, jint dimY) 593{ 594 LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i), sizeY(%i)", con, (RsAllocation)alloc, dimX, dimY); 595 rsAllocationResize2D(con, (RsAllocation)alloc, dimX, dimY); 596} 597 598// ----------------------------------- 599 600static int 601nFileA3DCreateFromAssetStream(JNIEnv *_env, jobject _this, RsContext con, jint native_asset) 602{ 603 LOGV("______nFileA3D %u", (uint32_t) native_asset); 604 605 Asset* asset = reinterpret_cast<Asset*>(native_asset); 606 607 jint id = (jint)rsFileA3DCreateFromAssetStream(con, asset->getBuffer(false), asset->getLength()); 608 return id; 609} 610 611static int 612nFileA3DGetNumIndexEntries(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D) 613{ 614 int32_t numEntries = 0; 615 rsFileA3DGetNumIndexEntries(con, &numEntries, (RsFile)fileA3D); 616 return numEntries; 617} 618 619static void 620nFileA3DGetIndexEntries(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D, jint numEntries, jintArray _ids, jobjectArray _entries) 621{ 622 LOGV("______nFileA3D %u", (uint32_t) fileA3D); 623 RsFileIndexEntry *fileEntries = (RsFileIndexEntry*)malloc((uint32_t)numEntries * sizeof(RsFileIndexEntry)); 624 625 rsFileA3DGetIndexEntries(con, fileEntries, (uint32_t)numEntries, (RsFile)fileA3D); 626 627 for(jint i = 0; i < numEntries; i ++) { 628 _env->SetObjectArrayElement(_entries, i, _env->NewStringUTF(fileEntries[i].objectName)); 629 _env->SetIntArrayRegion(_ids, i, 1, (const jint*)&fileEntries[i].classID); 630 } 631 632 free(fileEntries); 633} 634 635static int 636nFileA3DGetEntryByIndex(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D, jint index) 637{ 638 LOGV("______nFileA3D %u", (uint32_t) fileA3D); 639 jint id = (jint)rsFileA3DGetEntryByIndex(con, (uint32_t)index, (RsFile)fileA3D); 640 return id; 641} 642 643// ----------------------------------- 644 645static int 646nFontCreateFromFile(JNIEnv *_env, jobject _this, RsContext con, jstring fileName, jint fontSize, jint dpi) 647{ 648 const char* fileNameUTF = _env->GetStringUTFChars(fileName, NULL); 649 650 jint id = (jint)rsFontCreateFromFile(con, fileNameUTF, fontSize, dpi); 651 return id; 652} 653 654 655// ----------------------------------- 656 657static void 658nAdapter1DBindAllocation(JNIEnv *_env, jobject _this, RsContext con, jint adapter, jint alloc) 659{ 660 LOG_API("nAdapter1DBindAllocation, con(%p), adapter(%p), alloc(%p)", con, (RsAdapter1D)adapter, (RsAllocation)alloc); 661 rsAdapter1DBindAllocation(con, (RsAdapter1D)adapter, (RsAllocation)alloc); 662} 663 664static void 665nAdapter1DSetConstraint(JNIEnv *_env, jobject _this, RsContext con, jint adapter, jint dim, jint value) 666{ 667 LOG_API("nAdapter1DSetConstraint, con(%p), adapter(%p), dim(%i), value(%i)", con, (RsAdapter1D)adapter, dim, value); 668 rsAdapter1DSetConstraint(con, (RsAdapter1D)adapter, (RsDimension)dim, value); 669} 670 671static void 672nAdapter1DData_i(JNIEnv *_env, jobject _this, RsContext con, jint adapter, jintArray data) 673{ 674 jint len = _env->GetArrayLength(data); 675 LOG_API("nAdapter1DData_i, con(%p), adapter(%p), len(%i)", con, (RsAdapter1D)adapter, len); 676 jint *ptr = _env->GetIntArrayElements(data, NULL); 677 rsAdapter1DData(con, (RsAdapter1D)adapter, ptr); 678 _env->ReleaseIntArrayElements(data, ptr, 0/*JNI_ABORT*/); 679} 680 681static void 682nAdapter1DSubData_i(JNIEnv *_env, jobject _this, RsContext con, jint adapter, jint offset, jint count, jintArray data) 683{ 684 jint len = _env->GetArrayLength(data); 685 LOG_API("nAdapter1DSubData_i, con(%p), adapter(%p), offset(%i), count(%i), len(%i)", con, (RsAdapter1D)adapter, offset, count, len); 686 jint *ptr = _env->GetIntArrayElements(data, NULL); 687 rsAdapter1DSubData(con, (RsAdapter1D)adapter, offset, count, ptr); 688 _env->ReleaseIntArrayElements(data, ptr, 0/*JNI_ABORT*/); 689} 690 691static void 692nAdapter1DData_f(JNIEnv *_env, jobject _this, RsContext con, jint adapter, jfloatArray data) 693{ 694 jint len = _env->GetArrayLength(data); 695 LOG_API("nAdapter1DData_f, con(%p), adapter(%p), len(%i)", con, (RsAdapter1D)adapter, len); 696 jfloat *ptr = _env->GetFloatArrayElements(data, NULL); 697 rsAdapter1DData(con, (RsAdapter1D)adapter, ptr); 698 _env->ReleaseFloatArrayElements(data, ptr, 0/*JNI_ABORT*/); 699} 700 701static void 702nAdapter1DSubData_f(JNIEnv *_env, jobject _this, RsContext con, jint adapter, jint offset, jint count, jfloatArray data) 703{ 704 jint len = _env->GetArrayLength(data); 705 LOG_API("nAdapter1DSubData_f, con(%p), adapter(%p), offset(%i), count(%i), len(%i)", con, (RsAdapter1D)adapter, offset, count, len); 706 jfloat *ptr = _env->GetFloatArrayElements(data, NULL); 707 rsAdapter1DSubData(con, (RsAdapter1D)adapter, offset, count, ptr); 708 _env->ReleaseFloatArrayElements(data, ptr, 0/*JNI_ABORT*/); 709} 710 711static jint 712nAdapter1DCreate(JNIEnv *_env, jobject _this, RsContext con) 713{ 714 LOG_API("nAdapter1DCreate, con(%p)", con); 715 return (jint)rsAdapter1DCreate(con); 716} 717 718// ----------------------------------- 719 720static void 721nAdapter2DBindAllocation(JNIEnv *_env, jobject _this, RsContext con, jint adapter, jint alloc) 722{ 723 LOG_API("nAdapter2DBindAllocation, con(%p), adapter(%p), alloc(%p)", con, (RsAdapter2D)adapter, (RsAllocation)alloc); 724 rsAdapter2DBindAllocation(con, (RsAdapter2D)adapter, (RsAllocation)alloc); 725} 726 727static void 728nAdapter2DSetConstraint(JNIEnv *_env, jobject _this, RsContext con, jint adapter, jint dim, jint value) 729{ 730 LOG_API("nAdapter2DSetConstraint, con(%p), adapter(%p), dim(%i), value(%i)", con, (RsAdapter2D)adapter, dim, value); 731 rsAdapter2DSetConstraint(con, (RsAdapter2D)adapter, (RsDimension)dim, value); 732} 733 734static void 735nAdapter2DData_i(JNIEnv *_env, jobject _this, RsContext con, jint adapter, jintArray data) 736{ 737 jint len = _env->GetArrayLength(data); 738 LOG_API("nAdapter2DData_i, con(%p), adapter(%p), len(%i)", con, (RsAdapter2D)adapter, len); 739 jint *ptr = _env->GetIntArrayElements(data, NULL); 740 rsAdapter2DData(con, (RsAdapter2D)adapter, ptr); 741 _env->ReleaseIntArrayElements(data, ptr, 0/*JNI_ABORT*/); 742} 743 744static void 745nAdapter2DData_f(JNIEnv *_env, jobject _this, RsContext con, jint adapter, jfloatArray data) 746{ 747 jint len = _env->GetArrayLength(data); 748 LOG_API("nAdapter2DData_f, con(%p), adapter(%p), len(%i)", con, (RsAdapter2D)adapter, len); 749 jfloat *ptr = _env->GetFloatArrayElements(data, NULL); 750 rsAdapter2DData(con, (RsAdapter2D)adapter, ptr); 751 _env->ReleaseFloatArrayElements(data, ptr, 0/*JNI_ABORT*/); 752} 753 754static void 755nAdapter2DSubData_i(JNIEnv *_env, jobject _this, RsContext con, jint adapter, jint xoff, jint yoff, jint w, jint h, jintArray data) 756{ 757 jint len = _env->GetArrayLength(data); 758 LOG_API("nAdapter2DSubData_i, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", 759 con, (RsAdapter2D)adapter, xoff, yoff, w, h, len); 760 jint *ptr = _env->GetIntArrayElements(data, NULL); 761 rsAdapter2DSubData(con, (RsAdapter2D)adapter, xoff, yoff, w, h, ptr); 762 _env->ReleaseIntArrayElements(data, ptr, 0/*JNI_ABORT*/); 763} 764 765static void 766nAdapter2DSubData_f(JNIEnv *_env, jobject _this, RsContext con, jint adapter, jint xoff, jint yoff, jint w, jint h, jfloatArray data) 767{ 768 jint len = _env->GetArrayLength(data); 769 LOG_API("nAdapter2DSubData_f, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", 770 con, (RsAdapter2D)adapter, xoff, yoff, w, h, len); 771 jfloat *ptr = _env->GetFloatArrayElements(data, NULL); 772 rsAdapter2DSubData(con, (RsAdapter1D)adapter, xoff, yoff, w, h, ptr); 773 _env->ReleaseFloatArrayElements(data, ptr, 0/*JNI_ABORT*/); 774} 775 776static jint 777nAdapter2DCreate(JNIEnv *_env, jobject _this, RsContext con) 778{ 779 LOG_API("nAdapter2DCreate, con(%p)", con); 780 return (jint)rsAdapter2DCreate(con); 781} 782 783// ----------------------------------- 784 785static void 786nScriptBindAllocation(JNIEnv *_env, jobject _this, RsContext con, jint script, jint alloc, jint slot) 787{ 788 LOG_API("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)", con, (RsScript)script, (RsAllocation)alloc, slot); 789 rsScriptBindAllocation(con, (RsScript)script, (RsAllocation)alloc, slot); 790} 791 792static void 793nScriptSetVarI(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jint val) 794{ 795 LOG_API("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", con, (void *)script, slot, val); 796 rsScriptSetVarI(con, (RsScript)script, slot, val); 797} 798 799static void 800nScriptSetVarJ(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jlong val) 801{ 802 LOG_API("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%lli)", con, (void *)script, slot, val); 803 rsScriptSetVarJ(con, (RsScript)script, slot, val); 804} 805 806static void 807nScriptSetVarF(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, float val) 808{ 809 LOG_API("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", con, (void *)script, slot, val); 810 rsScriptSetVarF(con, (RsScript)script, slot, val); 811} 812 813static void 814nScriptSetVarD(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, double val) 815{ 816 LOG_API("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", con, (void *)script, slot, val); 817 rsScriptSetVarD(con, (RsScript)script, slot, val); 818} 819 820static void 821nScriptSetVarV(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jbyteArray data) 822{ 823 LOG_API("nScriptSetVarV, con(%p), s(%p), slot(%i)", con, (void *)script, slot); 824 jint len = _env->GetArrayLength(data); 825 jbyte *ptr = _env->GetByteArrayElements(data, NULL); 826 rsScriptSetVarV(con, (RsScript)script, slot, ptr, len); 827 _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT); 828} 829 830 831static void 832nScriptSetTimeZone(JNIEnv *_env, jobject _this, RsContext con, jint script, jbyteArray timeZone) 833{ 834 LOG_API("nScriptCSetTimeZone, con(%p), s(%p), timeZone(%s)", con, (void *)script, (const char *)timeZone); 835 836 jint length = _env->GetArrayLength(timeZone); 837 jbyte* timeZone_ptr; 838 timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0); 839 840 rsScriptSetTimeZone(con, (RsScript)script, (const char *)timeZone_ptr, length); 841 842 if (timeZone_ptr) { 843 _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0); 844 } 845} 846 847static void 848nScriptInvoke(JNIEnv *_env, jobject _this, RsContext con, jint obj, jint slot) 849{ 850 LOG_API("nScriptInvoke, con(%p), script(%p)", con, (void *)obj); 851 rsScriptInvoke(con, (RsScript)obj, slot); 852} 853 854static void 855nScriptInvokeV(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jbyteArray data) 856{ 857 LOG_API("nScriptInvokeV, con(%p), s(%p), slot(%i)", con, (void *)script, slot); 858 jint len = _env->GetArrayLength(data); 859 jbyte *ptr = _env->GetByteArrayElements(data, NULL); 860 rsScriptInvokeV(con, (RsScript)script, slot, ptr, len); 861 _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT); 862} 863 864 865// ----------------------------------- 866 867static void 868nScriptCBegin(JNIEnv *_env, jobject _this, RsContext con) 869{ 870 LOG_API("nScriptCBegin, con(%p)", con); 871 rsScriptCBegin(con); 872} 873 874static void 875nScriptCSetScript(JNIEnv *_env, jobject _this, RsContext con, jbyteArray scriptRef, 876 jint offset, jint length) 877{ 878 LOG_API("!!! nScriptCSetScript, con(%p)", con); 879 jint _exception = 0; 880 jint remaining; 881 jbyte* script_base = 0; 882 jbyte* script_ptr; 883 if (!scriptRef) { 884 _exception = 1; 885 //_env->ThrowNew(IAEClass, "script == null"); 886 goto exit; 887 } 888 if (offset < 0) { 889 _exception = 1; 890 //_env->ThrowNew(IAEClass, "offset < 0"); 891 goto exit; 892 } 893 if (length < 0) { 894 _exception = 1; 895 //_env->ThrowNew(IAEClass, "length < 0"); 896 goto exit; 897 } 898 remaining = _env->GetArrayLength(scriptRef) - offset; 899 if (remaining < length) { 900 _exception = 1; 901 //_env->ThrowNew(IAEClass, "length > script.length - offset"); 902 goto exit; 903 } 904 script_base = (jbyte *) 905 _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0); 906 script_ptr = script_base + offset; 907 908 rsScriptCSetText(con, (const char *)script_ptr, length); 909 910exit: 911 if (script_base) { 912 _env->ReleasePrimitiveArrayCritical(scriptRef, script_base, 913 _exception ? JNI_ABORT: 0); 914 } 915} 916 917static jint 918nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con) 919{ 920 LOG_API("nScriptCCreate, con(%p)", con); 921 return (jint)rsScriptCCreate(con); 922} 923 924// --------------------------------------------------------------------------- 925 926static void 927nProgramStoreBegin(JNIEnv *_env, jobject _this, RsContext con, jint in, jint out) 928{ 929 LOG_API("nProgramStoreBegin, con(%p), in(%p), out(%p)", con, (RsElement)in, (RsElement)out); 930 rsProgramStoreBegin(con, (RsElement)in, (RsElement)out); 931} 932 933static void 934nProgramStoreDepthFunc(JNIEnv *_env, jobject _this, RsContext con, jint func) 935{ 936 LOG_API("nProgramStoreDepthFunc, con(%p), func(%i)", con, func); 937 rsProgramStoreDepthFunc(con, (RsDepthFunc)func); 938} 939 940static void 941nProgramStoreDepthMask(JNIEnv *_env, jobject _this, RsContext con, jboolean enable) 942{ 943 LOG_API("nProgramStoreDepthMask, con(%p), enable(%i)", con, enable); 944 rsProgramStoreDepthMask(con, enable); 945} 946 947static void 948nProgramStoreColorMask(JNIEnv *_env, jobject _this, RsContext con, jboolean r, jboolean g, jboolean b, jboolean a) 949{ 950 LOG_API("nProgramStoreColorMask, con(%p), r(%i), g(%i), b(%i), a(%i)", con, r, g, b, a); 951 rsProgramStoreColorMask(con, r, g, b, a); 952} 953 954static void 955nProgramStoreBlendFunc(JNIEnv *_env, jobject _this, RsContext con, int src, int dst) 956{ 957 LOG_API("nProgramStoreBlendFunc, con(%p), src(%i), dst(%i)", con, src, dst); 958 rsProgramStoreBlendFunc(con, (RsBlendSrcFunc)src, (RsBlendDstFunc)dst); 959} 960 961static void 962nProgramStoreDither(JNIEnv *_env, jobject _this, RsContext con, jboolean enable) 963{ 964 LOG_API("nProgramStoreDither, con(%p), enable(%i)", con, enable); 965 rsProgramStoreDither(con, enable); 966} 967 968static jint 969nProgramStoreCreate(JNIEnv *_env, jobject _this, RsContext con) 970{ 971 LOG_API("nProgramStoreCreate, con(%p)", con); 972 return (jint)rsProgramStoreCreate(con); 973} 974 975// --------------------------------------------------------------------------- 976 977static void 978nProgramBindConstants(JNIEnv *_env, jobject _this, RsContext con, jint vpv, jint slot, jint a) 979{ 980 LOG_API("nProgramBindConstants, con(%p), vpf(%p), sloat(%i), a(%p)", con, (RsProgramVertex)vpv, slot, (RsAllocation)a); 981 rsProgramBindConstants(con, (RsProgram)vpv, slot, (RsAllocation)a); 982} 983 984static void 985nProgramBindTexture(JNIEnv *_env, jobject _this, RsContext con, jint vpf, jint slot, jint a) 986{ 987 LOG_API("nProgramBindTexture, con(%p), vpf(%p), slot(%i), a(%p)", con, (RsProgramFragment)vpf, slot, (RsAllocation)a); 988 rsProgramBindTexture(con, (RsProgramFragment)vpf, slot, (RsAllocation)a); 989} 990 991static void 992nProgramBindSampler(JNIEnv *_env, jobject _this, RsContext con, jint vpf, jint slot, jint a) 993{ 994 LOG_API("nProgramBindSampler, con(%p), vpf(%p), slot(%i), a(%p)", con, (RsProgramFragment)vpf, slot, (RsSampler)a); 995 rsProgramBindSampler(con, (RsProgramFragment)vpf, slot, (RsSampler)a); 996} 997 998// --------------------------------------------------------------------------- 999 1000static jint 1001nProgramFragmentCreate(JNIEnv *_env, jobject _this, RsContext con, jstring shader, jintArray params) 1002{ 1003 const char* shaderUTF = _env->GetStringUTFChars(shader, NULL); 1004 jint shaderLen = _env->GetStringUTFLength(shader); 1005 jint *paramPtr = _env->GetIntArrayElements(params, NULL); 1006 jint paramLen = _env->GetArrayLength(params); 1007 1008 LOG_API("nProgramFragmentCreate, con(%p), shaderLen(%i), paramLen(%i)", con, shaderLen, paramLen); 1009 1010 jint ret = (jint)rsProgramFragmentCreate(con, shaderUTF, shaderLen, (uint32_t *)paramPtr, paramLen); 1011 _env->ReleaseStringUTFChars(shader, shaderUTF); 1012 _env->ReleaseIntArrayElements(params, paramPtr, JNI_ABORT); 1013 return ret; 1014} 1015 1016 1017// --------------------------------------------------------------------------- 1018 1019static jint 1020nProgramVertexCreate(JNIEnv *_env, jobject _this, RsContext con, jstring shader, jintArray params) 1021{ 1022 const char* shaderUTF = _env->GetStringUTFChars(shader, NULL); 1023 jint shaderLen = _env->GetStringUTFLength(shader); 1024 jint *paramPtr = _env->GetIntArrayElements(params, NULL); 1025 jint paramLen = _env->GetArrayLength(params); 1026 1027 LOG_API("nProgramVertexCreate, con(%p), shaderLen(%i), paramLen(%i)", con, shaderLen, paramLen); 1028 1029 jint ret = (jint)rsProgramVertexCreate(con, shaderUTF, shaderLen, (uint32_t *)paramPtr, paramLen); 1030 _env->ReleaseStringUTFChars(shader, shaderUTF); 1031 _env->ReleaseIntArrayElements(params, paramPtr, JNI_ABORT); 1032 return ret; 1033} 1034 1035// --------------------------------------------------------------------------- 1036 1037static jint 1038nProgramRasterCreate(JNIEnv *_env, jobject _this, RsContext con, jboolean pointSmooth, jboolean lineSmooth, jboolean pointSprite) 1039{ 1040 LOG_API("nProgramRasterCreate, con(%p), pointSmooth(%i), lineSmooth(%i), pointSprite(%i)", 1041 con, pointSmooth, lineSmooth, pointSprite); 1042 return (jint)rsProgramRasterCreate(con, pointSmooth, lineSmooth, pointSprite); 1043} 1044 1045static void 1046nProgramRasterSetLineWidth(JNIEnv *_env, jobject _this, RsContext con, jint vpr, jfloat v) 1047{ 1048 LOG_API("nProgramRasterSetLineWidth, con(%p), vpf(%p), value(%f)", con, (RsProgramRaster)vpr, v); 1049 rsProgramRasterSetLineWidth(con, (RsProgramRaster)vpr, v); 1050} 1051 1052static void 1053nProgramRasterSetCullMode(JNIEnv *_env, jobject _this, RsContext con, jint vpr, jint v) 1054{ 1055 LOG_API("nProgramRasterSetCullMode, con(%p), vpf(%p), value(%i)", con, (RsProgramRaster)vpr, v); 1056 rsProgramRasterSetCullMode(con, (RsProgramRaster)vpr, (RsCullMode)v); 1057} 1058 1059 1060// --------------------------------------------------------------------------- 1061 1062static void 1063nContextBindRootScript(JNIEnv *_env, jobject _this, RsContext con, jint script) 1064{ 1065 LOG_API("nContextBindRootScript, con(%p), script(%p)", con, (RsScript)script); 1066 rsContextBindRootScript(con, (RsScript)script); 1067} 1068 1069static void 1070nContextBindProgramStore(JNIEnv *_env, jobject _this, RsContext con, jint pfs) 1071{ 1072 LOG_API("nContextBindProgramStore, con(%p), pfs(%p)", con, (RsProgramStore)pfs); 1073 rsContextBindProgramStore(con, (RsProgramStore)pfs); 1074} 1075 1076static void 1077nContextBindProgramFragment(JNIEnv *_env, jobject _this, RsContext con, jint pf) 1078{ 1079 LOG_API("nContextBindProgramFragment, con(%p), pf(%p)", con, (RsProgramFragment)pf); 1080 rsContextBindProgramFragment(con, (RsProgramFragment)pf); 1081} 1082 1083static void 1084nContextBindProgramVertex(JNIEnv *_env, jobject _this, RsContext con, jint pf) 1085{ 1086 LOG_API("nContextBindProgramVertex, con(%p), pf(%p)", con, (RsProgramVertex)pf); 1087 rsContextBindProgramVertex(con, (RsProgramVertex)pf); 1088} 1089 1090static void 1091nContextBindProgramRaster(JNIEnv *_env, jobject _this, RsContext con, jint pf) 1092{ 1093 LOG_API("nContextBindProgramRaster, con(%p), pf(%p)", con, (RsProgramRaster)pf); 1094 rsContextBindProgramRaster(con, (RsProgramRaster)pf); 1095} 1096 1097 1098// --------------------------------------------------------------------------- 1099 1100static void 1101nSamplerBegin(JNIEnv *_env, jobject _this, RsContext con) 1102{ 1103 LOG_API("nSamplerBegin, con(%p)", con); 1104 rsSamplerBegin(con); 1105} 1106 1107static void 1108nSamplerSet(JNIEnv *_env, jobject _this, RsContext con, jint p, jint v) 1109{ 1110 LOG_API("nSamplerSet, con(%p), param(%i), value(%i)", con, p, v); 1111 rsSamplerSet(con, (RsSamplerParam)p, (RsSamplerValue)v); 1112} 1113 1114static void 1115nSamplerSet2(JNIEnv *_env, jobject _this, RsContext con, jint p, jfloat v) 1116{ 1117 LOG_API("nSamplerSet2, con(%p), param(%i), value(%f)", con, p, v); 1118 rsSamplerSet2(con, (RsSamplerParam)p, v); 1119} 1120 1121static jint 1122nSamplerCreate(JNIEnv *_env, jobject _this, RsContext con) 1123{ 1124 LOG_API("nSamplerCreate, con(%p)", con); 1125 return (jint)rsSamplerCreate(con); 1126} 1127 1128// --------------------------------------------------------------------------- 1129 1130static jint 1131nMeshCreate(JNIEnv *_env, jobject _this, RsContext con, jint vtxCount, jint idxCount) 1132{ 1133 LOG_API("nMeshCreate, con(%p), vtxCount(%i), idxCount(%i)", con, vtxCount, idxCount); 1134 int id = (int)rsMeshCreate(con, vtxCount, idxCount); 1135 return id; 1136} 1137 1138static void 1139nMeshBindVertex(JNIEnv *_env, jobject _this, RsContext con, jint mesh, jint alloc, jint slot) 1140{ 1141 LOG_API("nMeshBindVertex, con(%p), Mesh(%p), Alloc(%p), slot(%i)", con, (RsMesh)mesh, (RsAllocation)alloc, slot); 1142 rsMeshBindVertex(con, (RsMesh)mesh, (RsAllocation)alloc, slot); 1143} 1144 1145static void 1146nMeshBindIndex(JNIEnv *_env, jobject _this, RsContext con, jint mesh, jint alloc, jint primID, jint slot) 1147{ 1148 LOG_API("nMeshBindIndex, con(%p), Mesh(%p), Alloc(%p)", con, (RsMesh)mesh, (RsAllocation)alloc); 1149 rsMeshBindIndex(con, (RsMesh)mesh, (RsAllocation)alloc, primID, slot); 1150} 1151 1152static jint 1153nMeshGetVertexBufferCount(JNIEnv *_env, jobject _this, RsContext con, jint mesh) 1154{ 1155 LOG_API("nMeshGetVertexBufferCount, con(%p), Mesh(%p)", con, (RsMesh)mesh); 1156 jint vtxCount = 0; 1157 rsMeshGetVertexBufferCount(con, (RsMesh)mesh, &vtxCount); 1158 return vtxCount; 1159} 1160 1161static jint 1162nMeshGetIndexCount(JNIEnv *_env, jobject _this, RsContext con, jint mesh) 1163{ 1164 LOG_API("nMeshGetIndexCount, con(%p), Mesh(%p)", con, (RsMesh)mesh); 1165 jint idxCount = 0; 1166 rsMeshGetIndexCount(con, (RsMesh)mesh, &idxCount); 1167 return idxCount; 1168} 1169 1170static void 1171nMeshGetVertices(JNIEnv *_env, jobject _this, RsContext con, jint mesh, jintArray _ids, int numVtxIDs) 1172{ 1173 LOG_API("nMeshGetVertices, con(%p), Mesh(%p)", con, (RsMesh)mesh); 1174 1175 RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numVtxIDs * sizeof(RsAllocation)); 1176 rsMeshGetVertices(con, (RsMesh)mesh, allocs, (uint32_t)numVtxIDs); 1177 1178 for(jint i = 0; i < numVtxIDs; i ++) { 1179 _env->SetIntArrayRegion(_ids, i, 1, (const jint*)&allocs[i]); 1180 } 1181 1182 free(allocs); 1183} 1184 1185static void 1186nMeshGetIndices(JNIEnv *_env, jobject _this, RsContext con, jint mesh, jintArray _idxIds, jintArray _primitives, int numIndices) 1187{ 1188 LOG_API("nMeshGetVertices, con(%p), Mesh(%p)", con, (RsMesh)mesh); 1189 1190 RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numIndices * sizeof(RsAllocation)); 1191 uint32_t *prims= (uint32_t*)malloc((uint32_t)numIndices * sizeof(uint32_t)); 1192 1193 rsMeshGetIndices(con, (RsMesh)mesh, allocs, prims, (uint32_t)numIndices); 1194 1195 for(jint i = 0; i < numIndices; i ++) { 1196 _env->SetIntArrayRegion(_idxIds, i, 1, (const jint*)&allocs[i]); 1197 _env->SetIntArrayRegion(_primitives, i, 1, (const jint*)&prims[i]); 1198 } 1199 1200 free(allocs); 1201 free(prims); 1202} 1203 1204// --------------------------------------------------------------------------- 1205 1206 1207static const char *classPathName = "android/renderscript/RenderScript"; 1208 1209static JNINativeMethod methods[] = { 1210{"_nInit", "()V", (void*)_nInit }, 1211{"nInitElements", "(IIII)V", (void*)nInitElements }, 1212 1213{"nDeviceCreate", "()I", (void*)nDeviceCreate }, 1214{"nDeviceDestroy", "(I)V", (void*)nDeviceDestroy }, 1215{"nDeviceSetConfig", "(III)V", (void*)nDeviceSetConfig }, 1216{"nContextGetMessage", "(I[IZ)I", (void*)nContextGetMessage }, 1217{"nContextInitToClient", "(I)V", (void*)nContextInitToClient }, 1218{"nContextDeinitToClient", "(I)V", (void*)nContextDeinitToClient }, 1219 1220 1221// All methods below are thread protected in java. 1222{"rsnContextCreate", "(II)I", (void*)nContextCreate }, 1223{"rsnContextCreateGL", "(IIZ)I", (void*)nContextCreateGL }, 1224{"rsnContextFinish", "(I)V", (void*)nContextFinish }, 1225{"rsnContextSetPriority", "(II)V", (void*)nContextSetPriority }, 1226{"rsnContextSetSurface", "(IIILandroid/view/Surface;)V", (void*)nContextSetSurface }, 1227{"rsnContextDestroy", "(I)V", (void*)nContextDestroy }, 1228{"rsnContextDump", "(II)V", (void*)nContextDump }, 1229{"rsnContextPause", "(I)V", (void*)nContextPause }, 1230{"rsnContextResume", "(I)V", (void*)nContextResume }, 1231{"rsnAssignName", "(II[B)V", (void*)nAssignName }, 1232{"rsnGetName", "(II)Ljava/lang/String;", (void*)nGetName }, 1233{"rsnObjDestroy", "(II)V", (void*)nObjDestroy }, 1234 1235{"rsnFileOpen", "(I[B)I", (void*)nFileOpen }, 1236{"rsnFileA3DCreateFromAssetStream", "(II)I", (void*)nFileA3DCreateFromAssetStream }, 1237{"rsnFileA3DGetNumIndexEntries", "(II)I", (void*)nFileA3DGetNumIndexEntries }, 1238{"rsnFileA3DGetIndexEntries", "(III[I[Ljava/lang/String;)V", (void*)nFileA3DGetIndexEntries }, 1239{"rsnFileA3DGetEntryByIndex", "(III)I", (void*)nFileA3DGetEntryByIndex }, 1240 1241{"rsnFontCreateFromFile", "(ILjava/lang/String;II)I", (void*)nFontCreateFromFile }, 1242 1243{"rsnElementCreate", "(IIIZI)I", (void*)nElementCreate }, 1244{"rsnElementCreate2", "(I[I[Ljava/lang/String;[I)I", (void*)nElementCreate2 }, 1245{"rsnElementGetNativeData", "(II[I)V", (void*)nElementGetNativeData }, 1246{"rsnElementGetSubElements", "(II[I[Ljava/lang/String;)V", (void*)nElementGetSubElements }, 1247 1248{"rsnTypeBegin", "(II)V", (void*)nTypeBegin }, 1249{"rsnTypeAdd", "(III)V", (void*)nTypeAdd }, 1250{"rsnTypeCreate", "(I)I", (void*)nTypeCreate }, 1251{"rsnTypeGetNativeData", "(II[I)V", (void*)nTypeGetNativeData }, 1252 1253{"rsnAllocationCreateTyped", "(II)I", (void*)nAllocationCreateTyped }, 1254{"rsnAllocationUpdateFromBitmap", "(IILandroid/graphics/Bitmap;)V", (void*)nAllocationUpdateFromBitmap }, 1255{"rsnAllocationCreateFromBitmap", "(IIZLandroid/graphics/Bitmap;)I", (void*)nAllocationCreateFromBitmap }, 1256{"rsnAllocationCreateBitmapRef", "(IILandroid/graphics/Bitmap;)I", (void*)nAllocationCreateBitmapRef }, 1257{"rsnAllocationCreateFromAssetStream","(IIZI)I", (void*)nAllocationCreateFromAssetStream }, 1258{"rsnAllocationUploadToTexture", "(IIZI)V", (void*)nAllocationUploadToTexture }, 1259{"rsnAllocationUploadToBufferObject","(II)V", (void*)nAllocationUploadToBufferObject }, 1260{"rsnAllocationSubData1D", "(IIII[II)V", (void*)nAllocationSubData1D_i }, 1261{"rsnAllocationSubData1D", "(IIII[SI)V", (void*)nAllocationSubData1D_s }, 1262{"rsnAllocationSubData1D", "(IIII[BI)V", (void*)nAllocationSubData1D_b }, 1263{"rsnAllocationSubData1D", "(IIII[FI)V", (void*)nAllocationSubData1D_f }, 1264{"rsnAllocationSubElementData1D", "(IIII[BI)V", (void*)nAllocationSubElementData1D }, 1265{"rsnAllocationSubData2D", "(IIIIII[II)V", (void*)nAllocationSubData2D_i }, 1266{"rsnAllocationSubData2D", "(IIIIII[FI)V", (void*)nAllocationSubData2D_f }, 1267{"rsnAllocationRead", "(II[I)V", (void*)nAllocationRead_i }, 1268{"rsnAllocationRead", "(II[F)V", (void*)nAllocationRead_f }, 1269{"rsnAllocationGetType", "(II)I", (void*)nAllocationGetType}, 1270{"rsnAllocationResize1D", "(III)V", (void*)nAllocationResize1D }, 1271{"rsnAllocationResize2D", "(IIII)V", (void*)nAllocationResize2D }, 1272 1273{"rsnAdapter1DBindAllocation", "(III)V", (void*)nAdapter1DBindAllocation }, 1274{"rsnAdapter1DSetConstraint", "(IIII)V", (void*)nAdapter1DSetConstraint }, 1275{"rsnAdapter1DData", "(II[I)V", (void*)nAdapter1DData_i }, 1276{"rsnAdapter1DData", "(II[F)V", (void*)nAdapter1DData_f }, 1277{"rsnAdapter1DSubData", "(IIII[I)V", (void*)nAdapter1DSubData_i }, 1278{"rsnAdapter1DSubData", "(IIII[F)V", (void*)nAdapter1DSubData_f }, 1279{"rsnAdapter1DCreate", "(I)I", (void*)nAdapter1DCreate }, 1280 1281{"rsnAdapter2DBindAllocation", "(III)V", (void*)nAdapter2DBindAllocation }, 1282{"rsnAdapter2DSetConstraint", "(IIII)V", (void*)nAdapter2DSetConstraint }, 1283{"rsnAdapter2DData", "(II[I)V", (void*)nAdapter2DData_i }, 1284{"rsnAdapter2DData", "(II[F)V", (void*)nAdapter2DData_f }, 1285{"rsnAdapter2DSubData", "(IIIIII[I)V", (void*)nAdapter2DSubData_i }, 1286{"rsnAdapter2DSubData", "(IIIIII[F)V", (void*)nAdapter2DSubData_f }, 1287{"rsnAdapter2DCreate", "(I)I", (void*)nAdapter2DCreate }, 1288 1289{"rsnScriptBindAllocation", "(IIII)V", (void*)nScriptBindAllocation }, 1290{"rsnScriptSetTimeZone", "(II[B)V", (void*)nScriptSetTimeZone }, 1291{"rsnScriptInvoke", "(III)V", (void*)nScriptInvoke }, 1292{"rsnScriptInvokeV", "(III[B)V", (void*)nScriptInvokeV }, 1293{"rsnScriptSetVarI", "(IIII)V", (void*)nScriptSetVarI }, 1294{"rsnScriptSetVarJ", "(IIIJ)V", (void*)nScriptSetVarJ }, 1295{"rsnScriptSetVarF", "(IIIF)V", (void*)nScriptSetVarF }, 1296{"rsnScriptSetVarD", "(IIID)V", (void*)nScriptSetVarD }, 1297{"rsnScriptSetVarV", "(III[B)V", (void*)nScriptSetVarV }, 1298 1299{"rsnScriptCBegin", "(I)V", (void*)nScriptCBegin }, 1300{"rsnScriptCSetScript", "(I[BII)V", (void*)nScriptCSetScript }, 1301{"rsnScriptCCreate", "(I)I", (void*)nScriptCCreate }, 1302 1303{"rsnProgramStoreBegin", "(III)V", (void*)nProgramStoreBegin }, 1304{"rsnProgramStoreDepthFunc", "(II)V", (void*)nProgramStoreDepthFunc }, 1305{"rsnProgramStoreDepthMask", "(IZ)V", (void*)nProgramStoreDepthMask }, 1306{"rsnProgramStoreColorMask", "(IZZZZ)V", (void*)nProgramStoreColorMask }, 1307{"rsnProgramStoreBlendFunc", "(III)V", (void*)nProgramStoreBlendFunc }, 1308{"rsnProgramStoreDither", "(IZ)V", (void*)nProgramStoreDither }, 1309{"rsnProgramStoreCreate", "(I)I", (void*)nProgramStoreCreate }, 1310 1311{"rsnProgramBindConstants", "(IIII)V", (void*)nProgramBindConstants }, 1312{"rsnProgramBindTexture", "(IIII)V", (void*)nProgramBindTexture }, 1313{"rsnProgramBindSampler", "(IIII)V", (void*)nProgramBindSampler }, 1314 1315{"rsnProgramFragmentCreate", "(ILjava/lang/String;[I)I", (void*)nProgramFragmentCreate }, 1316 1317{"rsnProgramRasterCreate", "(IZZZ)I", (void*)nProgramRasterCreate }, 1318{"rsnProgramRasterSetLineWidth", "(IIF)V", (void*)nProgramRasterSetLineWidth }, 1319{"rsnProgramRasterSetCullMode", "(III)V", (void*)nProgramRasterSetCullMode }, 1320 1321{"rsnProgramVertexCreate", "(ILjava/lang/String;[I)I", (void*)nProgramVertexCreate }, 1322 1323{"rsnContextBindRootScript", "(II)V", (void*)nContextBindRootScript }, 1324{"rsnContextBindProgramStore", "(II)V", (void*)nContextBindProgramStore }, 1325{"rsnContextBindProgramFragment", "(II)V", (void*)nContextBindProgramFragment }, 1326{"rsnContextBindProgramVertex", "(II)V", (void*)nContextBindProgramVertex }, 1327{"rsnContextBindProgramRaster", "(II)V", (void*)nContextBindProgramRaster }, 1328 1329{"rsnSamplerBegin", "(I)V", (void*)nSamplerBegin }, 1330{"rsnSamplerSet", "(III)V", (void*)nSamplerSet }, 1331{"rsnSamplerSet2", "(IIF)V", (void*)nSamplerSet2 }, 1332{"rsnSamplerCreate", "(I)I", (void*)nSamplerCreate }, 1333 1334{"rsnMeshCreate", "(III)I", (void*)nMeshCreate }, 1335{"rsnMeshBindVertex", "(IIII)V", (void*)nMeshBindVertex }, 1336{"rsnMeshBindIndex", "(IIIII)V", (void*)nMeshBindIndex }, 1337 1338{"rsnMeshGetVertexBufferCount", "(II)I", (void*)nMeshGetVertexBufferCount }, 1339{"rsnMeshGetIndexCount", "(II)I", (void*)nMeshGetIndexCount }, 1340{"rsnMeshGetVertices", "(II[II)V", (void*)nMeshGetVertices }, 1341{"rsnMeshGetIndices", "(II[I[II)V", (void*)nMeshGetIndices }, 1342 1343}; 1344 1345static int registerFuncs(JNIEnv *_env) 1346{ 1347 return android::AndroidRuntime::registerNativeMethods( 1348 _env, classPathName, methods, NELEM(methods)); 1349} 1350 1351// --------------------------------------------------------------------------- 1352 1353jint JNI_OnLoad(JavaVM* vm, void* reserved) 1354{ 1355 JNIEnv* env = NULL; 1356 jint result = -1; 1357 1358 if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { 1359 LOGE("ERROR: GetEnv failed\n"); 1360 goto bail; 1361 } 1362 assert(env != NULL); 1363 1364 if (registerFuncs(env) < 0) { 1365 LOGE("ERROR: MediaPlayer native registration failed\n"); 1366 goto bail; 1367 } 1368 1369 /* success -- return valid version number */ 1370 result = JNI_VERSION_1_4; 1371 1372bail: 1373 return result; 1374} 1375 1376