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