android_renderscript_RenderScript.cpp revision 835b8544cc333ef87e42b1d71cf8ad3cddccdc19
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) 153{ 154 LOG_API("nContextCreate"); 155 return (jint)rsContextCreate((RsDevice)dev, ver); 156} 157 158static jint 159nContextCreateGL(JNIEnv *_env, jobject _this, jint dev, jint ver, 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, 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 LOGV("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 LOGV("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, jintArray _IDs, jobjectArray _names) 375{ 376 int dataSize = _env->GetArrayLength(_IDs); 377 LOG_API("nElementGetSubElements, con(%p)", con); 378 379 uint32_t *ids = (uint32_t *)malloc((uint32_t)dataSize * sizeof(uint32_t)); 380 const char **names = (const char **)malloc((uint32_t)dataSize * sizeof(const char *)); 381 382 rsaElementGetSubElements(con, (RsElement)id, ids, names, (uint32_t)dataSize); 383 384 for(jint i = 0; i < dataSize; i++) { 385 _env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i])); 386 _env->SetIntArrayRegion(_IDs, i, 1, (const jint*)&ids[i]); 387 } 388 389 free(ids); 390 free(names); 391} 392 393// ----------------------------------- 394 395static int 396nTypeCreate(JNIEnv *_env, jobject _this, RsContext con, RsElement eid, 397 jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces) 398{ 399 LOG_API("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i)", 400 con, eid, dimx, dimy, dimz, mips, faces); 401 402 jint id = (jint)rsTypeCreate(con, (RsElement)eid, dimx, dimy, dimz, mips, faces); 403 return (jint)id; 404} 405 406static void 407nTypeGetNativeData(JNIEnv *_env, jobject _this, RsContext con, jint id, jintArray _typeData) 408{ 409 // We are packing 6 items: mDimX; mDimY; mDimZ; 410 // mDimLOD; mDimFaces; mElement; into typeData 411 int elementCount = _env->GetArrayLength(_typeData); 412 413 assert(elementCount == 6); 414 LOG_API("nTypeCreate, con(%p)", con); 415 416 uint32_t typeData[6]; 417 rsaTypeGetNativeData(con, (RsType)id, typeData, 6); 418 419 for(jint i = 0; i < elementCount; i ++) { 420 _env->SetIntArrayRegion(_typeData, i, 1, (const jint*)&typeData[i]); 421 } 422} 423 424// ----------------------------------- 425 426static jint 427nAllocationCreateTyped(JNIEnv *_env, jobject _this, RsContext con, jint type, jint mips, jint usage) 428{ 429 LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i)", con, (RsElement)type, mips, usage); 430 return (jint) rsAllocationCreateTyped(con, (RsType)type, (RsAllocationMipmapControl)mips, (uint32_t)usage); 431} 432 433static void 434nAllocationSyncAll(JNIEnv *_env, jobject _this, RsContext con, jint a, jint bits) 435{ 436 LOG_API("nAllocationSyncAll, con(%p), a(%p), bits(0x%08x)", con, (RsAllocation)a, bits); 437 rsAllocationSyncAll(con, (RsAllocation)a, (RsAllocationUsageType)bits); 438} 439 440static void 441nAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, RsContext con, jint alloc) 442{ 443 LOG_API("nAllocationGenerateMipmaps, con(%p), a(%p)", con, (RsAllocation)alloc); 444 rsAllocationGenerateMipmaps(con, (RsAllocation)alloc); 445} 446 447static int 448nAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, RsContext con, jint type, jint mip, jobject jbitmap, jint usage) 449{ 450 SkBitmap const * nativeBitmap = 451 (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID); 452 const SkBitmap& bitmap(*nativeBitmap); 453 454 bitmap.lockPixels(); 455 const void* ptr = bitmap.getPixels(); 456 jint id = (jint)rsAllocationCreateFromBitmap(con, 457 (RsType)type, (RsAllocationMipmapControl)mip, 458 ptr, bitmap.getSize(), usage); 459 bitmap.unlockPixels(); 460 return id; 461} 462 463static int 464nAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, RsContext con, jint type, jint mip, jobject jbitmap, jint usage) 465{ 466 SkBitmap const * nativeBitmap = 467 (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID); 468 const SkBitmap& bitmap(*nativeBitmap); 469 470 bitmap.lockPixels(); 471 const void* ptr = bitmap.getPixels(); 472 jint id = (jint)rsAllocationCubeCreateFromBitmap(con, 473 (RsType)type, (RsAllocationMipmapControl)mip, 474 ptr, bitmap.getSize(), usage); 475 bitmap.unlockPixels(); 476 return id; 477} 478 479static void 480nAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jobject jbitmap) 481{ 482 SkBitmap const * nativeBitmap = 483 (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID); 484 const SkBitmap& bitmap(*nativeBitmap); 485 int w = bitmap.width(); 486 int h = bitmap.height(); 487 488 bitmap.lockPixels(); 489 const void* ptr = bitmap.getPixels(); 490 rsAllocation2DData(con, (RsAllocation)alloc, 0, 0, 491 0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 492 w, h, ptr, bitmap.getSize()); 493 bitmap.unlockPixels(); 494} 495 496static void 497nAllocationCopyToBitmap(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jobject jbitmap) 498{ 499 SkBitmap const * nativeBitmap = 500 (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID); 501 const SkBitmap& bitmap(*nativeBitmap); 502 503 bitmap.lockPixels(); 504 void* ptr = bitmap.getPixels(); 505 rsAllocationCopyToBitmap(con, (RsAllocation)alloc, ptr, bitmap.getSize()); 506 bitmap.unlockPixels(); 507 bitmap.notifyPixelsChanged(); 508} 509 510static void ReleaseBitmapCallback(void *bmp) 511{ 512 SkBitmap const * nativeBitmap = (SkBitmap const *)bmp; 513 nativeBitmap->unlockPixels(); 514} 515 516 517static void 518nAllocationData1D_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jintArray data, int sizeBytes) 519{ 520 jint len = _env->GetArrayLength(data); 521 LOG_API("nAllocation1DData_i, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes); 522 jint *ptr = _env->GetIntArrayElements(data, NULL); 523 rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes); 524 _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT); 525} 526 527static void 528nAllocationData1D_s(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jshortArray data, int sizeBytes) 529{ 530 jint len = _env->GetArrayLength(data); 531 LOG_API("nAllocation1DData_s, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes); 532 jshort *ptr = _env->GetShortArrayElements(data, NULL); 533 rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes); 534 _env->ReleaseShortArrayElements(data, ptr, JNI_ABORT); 535} 536 537static void 538nAllocationData1D_b(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jbyteArray data, int sizeBytes) 539{ 540 jint len = _env->GetArrayLength(data); 541 LOG_API("nAllocation1DData_b, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes); 542 jbyte *ptr = _env->GetByteArrayElements(data, NULL); 543 rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes); 544 _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT); 545} 546 547static void 548nAllocationData1D_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jfloatArray data, int sizeBytes) 549{ 550 jint len = _env->GetArrayLength(data); 551 LOG_API("nAllocation1DData_f, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes); 552 jfloat *ptr = _env->GetFloatArrayElements(data, NULL); 553 rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes); 554 _env->ReleaseFloatArrayElements(data, ptr, JNI_ABORT); 555} 556 557static void 558// native void rsnAllocationElementData1D(int con, int id, int xoff, int compIdx, byte[] d, int sizeBytes); 559nAllocationElementData1D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint compIdx, jbyteArray data, int sizeBytes) 560{ 561 jint len = _env->GetArrayLength(data); 562 LOG_API("nAllocationElementData1D, con(%p), alloc(%p), offset(%i), comp(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, compIdx, len, sizeBytes); 563 jbyte *ptr = _env->GetByteArrayElements(data, NULL); 564 rsAllocation1DElementData(con, (RsAllocation)alloc, offset, lod, ptr, compIdx, sizeBytes); 565 _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT); 566} 567 568static void 569nAllocationData2D_s(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face, 570 jint w, jint h, jshortArray data, int sizeBytes) 571{ 572 jint len = _env->GetArrayLength(data); 573 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); 574 jshort *ptr = _env->GetShortArrayElements(data, NULL); 575 rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes); 576 _env->ReleaseShortArrayElements(data, ptr, JNI_ABORT); 577} 578 579static void 580nAllocationData2D_b(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face, 581 jint w, jint h, jbyteArray data, int sizeBytes) 582{ 583 jint len = _env->GetArrayLength(data); 584 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); 585 jbyte *ptr = _env->GetByteArrayElements(data, NULL); 586 rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes); 587 _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT); 588} 589 590static void 591nAllocationData2D_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face, 592 jint w, jint h, jintArray data, int sizeBytes) 593{ 594 jint len = _env->GetArrayLength(data); 595 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); 596 jint *ptr = _env->GetIntArrayElements(data, NULL); 597 rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes); 598 _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT); 599} 600 601static void 602nAllocationData2D_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face, 603 jint w, jint h, jfloatArray data, int sizeBytes) 604{ 605 jint len = _env->GetArrayLength(data); 606 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); 607 jfloat *ptr = _env->GetFloatArrayElements(data, NULL); 608 rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes); 609 _env->ReleaseFloatArrayElements(data, ptr, JNI_ABORT); 610} 611 612static void 613nAllocationData2D_alloc(JNIEnv *_env, jobject _this, RsContext con, 614 jint dstAlloc, jint dstXoff, jint dstYoff, 615 jint dstMip, jint dstFace, 616 jint width, jint height, 617 jint srcAlloc, jint srcXoff, jint srcYoff, 618 jint srcMip, jint srcFace) 619{ 620 LOG_API("nAllocation2DData_s, con(%p), dstAlloc(%p), dstXoff, dstYoff," 621 " dstMip(%i), dstFace(%i), width(%i), height(%i)," 622 " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i), srcFace(%i)", 623 con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace, 624 width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace); 625 626 rsAllocationCopy2DRange(con, 627 (RsAllocation)dstAlloc, 628 dstXoff, dstYoff, 629 dstMip, dstFace, 630 width, height, 631 (RsAllocation)srcAlloc, 632 srcXoff, srcYoff, 633 srcMip, srcFace); 634} 635 636static void 637nAllocationRead_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jintArray data) 638{ 639 jint len = _env->GetArrayLength(data); 640 LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len); 641 jint *ptr = _env->GetIntArrayElements(data, NULL); 642 jsize length = _env->GetArrayLength(data); 643 rsAllocationRead(con, (RsAllocation)alloc, ptr, length); 644 _env->ReleaseIntArrayElements(data, ptr, 0); 645} 646 647static void 648nAllocationRead_s(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jshortArray data) 649{ 650 jint len = _env->GetArrayLength(data); 651 LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len); 652 jshort *ptr = _env->GetShortArrayElements(data, NULL); 653 jsize length = _env->GetArrayLength(data); 654 rsAllocationRead(con, (RsAllocation)alloc, ptr, length); 655 _env->ReleaseShortArrayElements(data, ptr, 0); 656} 657 658static void 659nAllocationRead_b(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jbyteArray data) 660{ 661 jint len = _env->GetArrayLength(data); 662 LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len); 663 jbyte *ptr = _env->GetByteArrayElements(data, NULL); 664 jsize length = _env->GetArrayLength(data); 665 rsAllocationRead(con, (RsAllocation)alloc, ptr, length); 666 _env->ReleaseByteArrayElements(data, ptr, 0); 667} 668 669static void 670nAllocationRead_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jfloatArray data) 671{ 672 jint len = _env->GetArrayLength(data); 673 LOG_API("nAllocationRead_f, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len); 674 jfloat *ptr = _env->GetFloatArrayElements(data, NULL); 675 jsize length = _env->GetArrayLength(data); 676 rsAllocationRead(con, (RsAllocation)alloc, ptr, length); 677 _env->ReleaseFloatArrayElements(data, ptr, 0); 678} 679 680static jint 681nAllocationGetType(JNIEnv *_env, jobject _this, RsContext con, jint a) 682{ 683 LOG_API("nAllocationGetType, con(%p), a(%p)", con, (RsAllocation)a); 684 return (jint) rsaAllocationGetType(con, (RsAllocation)a); 685} 686 687static void 688nAllocationResize1D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint dimX) 689{ 690 LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", con, (RsAllocation)alloc, dimX); 691 rsAllocationResize1D(con, (RsAllocation)alloc, dimX); 692} 693 694static void 695nAllocationResize2D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint dimX, jint dimY) 696{ 697 LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i), sizeY(%i)", con, (RsAllocation)alloc, dimX, dimY); 698 rsAllocationResize2D(con, (RsAllocation)alloc, dimX, dimY); 699} 700 701// ----------------------------------- 702 703static int 704nFileA3DCreateFromAssetStream(JNIEnv *_env, jobject _this, RsContext con, jint native_asset) 705{ 706 LOGV("______nFileA3D %u", (uint32_t) native_asset); 707 708 Asset* asset = reinterpret_cast<Asset*>(native_asset); 709 710 jint id = (jint)rsaFileA3DCreateFromMemory(con, asset->getBuffer(false), asset->getLength()); 711 return id; 712} 713 714static int 715nFileA3DCreateFromAsset(JNIEnv *_env, jobject _this, RsContext con, jobject _assetMgr, jstring _path) 716{ 717 AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr); 718 if (mgr == NULL) { 719 return 0; 720 } 721 722 AutoJavaStringToUTF8 str(_env, _path); 723 Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER); 724 if (asset == NULL) { 725 return 0; 726 } 727 728 jint id = (jint)rsaFileA3DCreateFromAsset(con, asset); 729 return id; 730} 731 732static int 733nFileA3DCreateFromFile(JNIEnv *_env, jobject _this, RsContext con, jstring fileName) 734{ 735 AutoJavaStringToUTF8 fileNameUTF(_env, fileName); 736 jint id = (jint)rsaFileA3DCreateFromFile(con, fileNameUTF.c_str()); 737 738 return id; 739} 740 741static int 742nFileA3DGetNumIndexEntries(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D) 743{ 744 int32_t numEntries = 0; 745 rsaFileA3DGetNumIndexEntries(con, &numEntries, (RsFile)fileA3D); 746 return numEntries; 747} 748 749static void 750nFileA3DGetIndexEntries(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D, jint numEntries, jintArray _ids, jobjectArray _entries) 751{ 752 LOGV("______nFileA3D %u", (uint32_t) fileA3D); 753 RsFileIndexEntry *fileEntries = (RsFileIndexEntry*)malloc((uint32_t)numEntries * sizeof(RsFileIndexEntry)); 754 755 rsaFileA3DGetIndexEntries(con, fileEntries, (uint32_t)numEntries, (RsFile)fileA3D); 756 757 for(jint i = 0; i < numEntries; i ++) { 758 _env->SetObjectArrayElement(_entries, i, _env->NewStringUTF(fileEntries[i].objectName)); 759 _env->SetIntArrayRegion(_ids, i, 1, (const jint*)&fileEntries[i].classID); 760 } 761 762 free(fileEntries); 763} 764 765static int 766nFileA3DGetEntryByIndex(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D, jint index) 767{ 768 LOGV("______nFileA3D %u", (uint32_t) fileA3D); 769 jint id = (jint)rsaFileA3DGetEntryByIndex(con, (uint32_t)index, (RsFile)fileA3D); 770 return id; 771} 772 773// ----------------------------------- 774 775static int 776nFontCreateFromFile(JNIEnv *_env, jobject _this, RsContext con, 777 jstring fileName, jfloat fontSize, jint dpi) 778{ 779 AutoJavaStringToUTF8 fileNameUTF(_env, fileName); 780 jint id = (jint)rsFontCreateFromFile(con, 781 fileNameUTF.c_str(), fileNameUTF.length(), 782 fontSize, dpi); 783 784 return id; 785} 786 787static int 788nFontCreateFromAssetStream(JNIEnv *_env, jobject _this, RsContext con, 789 jstring name, jfloat fontSize, jint dpi, jint native_asset) 790{ 791 Asset* asset = reinterpret_cast<Asset*>(native_asset); 792 AutoJavaStringToUTF8 nameUTF(_env, name); 793 794 jint id = (jint)rsFontCreateFromMemory(con, 795 nameUTF.c_str(), nameUTF.length(), 796 fontSize, dpi, 797 asset->getBuffer(false), asset->getLength()); 798 return id; 799} 800 801static int 802nFontCreateFromAsset(JNIEnv *_env, jobject _this, RsContext con, jobject _assetMgr, jstring _path, 803 jfloat fontSize, jint dpi) 804{ 805 AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr); 806 if (mgr == NULL) { 807 return 0; 808 } 809 810 AutoJavaStringToUTF8 str(_env, _path); 811 Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER); 812 if (asset == NULL) { 813 return 0; 814 } 815 816 jint id = (jint)rsFontCreateFromMemory(con, 817 str.c_str(), str.length(), 818 fontSize, dpi, 819 asset->getBuffer(false), asset->getLength()); 820 delete asset; 821 return id; 822} 823 824// ----------------------------------- 825 826static void 827nScriptBindAllocation(JNIEnv *_env, jobject _this, RsContext con, jint script, jint alloc, jint slot) 828{ 829 LOG_API("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)", con, (RsScript)script, (RsAllocation)alloc, slot); 830 rsScriptBindAllocation(con, (RsScript)script, (RsAllocation)alloc, slot); 831} 832 833static void 834nScriptSetVarI(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jint val) 835{ 836 LOG_API("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", con, (void *)script, slot, val); 837 rsScriptSetVarI(con, (RsScript)script, slot, val); 838} 839 840static void 841nScriptSetVarObj(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jint val) 842{ 843 LOG_API("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%i)", con, (void *)script, slot, val); 844 rsScriptSetVarObj(con, (RsScript)script, slot, (RsObjectBase)val); 845} 846 847static void 848nScriptSetVarJ(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jlong val) 849{ 850 LOG_API("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%lli)", con, (void *)script, slot, val); 851 rsScriptSetVarJ(con, (RsScript)script, slot, val); 852} 853 854static void 855nScriptSetVarF(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, float val) 856{ 857 LOG_API("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", con, (void *)script, slot, val); 858 rsScriptSetVarF(con, (RsScript)script, slot, val); 859} 860 861static void 862nScriptSetVarD(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, double val) 863{ 864 LOG_API("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", con, (void *)script, slot, val); 865 rsScriptSetVarD(con, (RsScript)script, slot, val); 866} 867 868static void 869nScriptSetVarV(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jbyteArray data) 870{ 871 LOG_API("nScriptSetVarV, con(%p), s(%p), slot(%i)", con, (void *)script, slot); 872 jint len = _env->GetArrayLength(data); 873 jbyte *ptr = _env->GetByteArrayElements(data, NULL); 874 rsScriptSetVarV(con, (RsScript)script, slot, ptr, len); 875 _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT); 876} 877 878 879static void 880nScriptSetTimeZone(JNIEnv *_env, jobject _this, RsContext con, jint script, jbyteArray timeZone) 881{ 882 LOG_API("nScriptCSetTimeZone, con(%p), s(%p), timeZone(%s)", con, (void *)script, (const char *)timeZone); 883 884 jint length = _env->GetArrayLength(timeZone); 885 jbyte* timeZone_ptr; 886 timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0); 887 888 rsScriptSetTimeZone(con, (RsScript)script, (const char *)timeZone_ptr, length); 889 890 if (timeZone_ptr) { 891 _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0); 892 } 893} 894 895static void 896nScriptInvoke(JNIEnv *_env, jobject _this, RsContext con, jint obj, jint slot) 897{ 898 LOG_API("nScriptInvoke, con(%p), script(%p)", con, (void *)obj); 899 rsScriptInvoke(con, (RsScript)obj, slot); 900} 901 902static void 903nScriptInvokeV(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jbyteArray data) 904{ 905 LOG_API("nScriptInvokeV, con(%p), s(%p), slot(%i)", con, (void *)script, slot); 906 jint len = _env->GetArrayLength(data); 907 jbyte *ptr = _env->GetByteArrayElements(data, NULL); 908 rsScriptInvokeV(con, (RsScript)script, slot, ptr, len); 909 _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT); 910} 911 912static void 913nScriptForEach(JNIEnv *_env, jobject _this, RsContext con, 914 jint script, jint slot, jint ain, jint aout) 915{ 916 LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", con, (void *)script, slot); 917 rsScriptForEach(con, (RsScript)script, slot, (RsAllocation)ain, (RsAllocation)aout, NULL, 0); 918} 919static void 920nScriptForEachV(JNIEnv *_env, jobject _this, RsContext con, 921 jint script, jint slot, jint ain, jint aout, jbyteArray params) 922{ 923 LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", con, (void *)script, slot); 924 jint len = _env->GetArrayLength(params); 925 jbyte *ptr = _env->GetByteArrayElements(params, NULL); 926 rsScriptForEach(con, (RsScript)script, slot, (RsAllocation)ain, (RsAllocation)aout, ptr, len); 927 _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT); 928} 929 930 931// ----------------------------------- 932 933static jint 934nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con, 935 jstring resName, jstring cacheDir, 936 jbyteArray scriptRef, jint length) 937{ 938 LOG_API("nScriptCCreate, con(%p)", con); 939 940 AutoJavaStringToUTF8 resNameUTF(_env, resName); 941 AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir); 942 jint ret = 0; 943 jbyte* script_ptr = NULL; 944 jint _exception = 0; 945 jint remaining; 946 if (!scriptRef) { 947 _exception = 1; 948 //jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null"); 949 goto exit; 950 } 951 if (length < 0) { 952 _exception = 1; 953 //jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0"); 954 goto exit; 955 } 956 remaining = _env->GetArrayLength(scriptRef); 957 if (remaining < length) { 958 _exception = 1; 959 //jniThrowException(_env, "java/lang/IllegalArgumentException", 960 // "length > script.length - offset"); 961 goto exit; 962 } 963 script_ptr = (jbyte *) 964 _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0); 965 966 //rsScriptCSetText(con, (const char *)script_ptr, length); 967 968 ret = (jint)rsScriptCCreate(con, 969 resNameUTF.c_str(), resNameUTF.length(), 970 cacheDirUTF.c_str(), cacheDirUTF.length(), 971 (const char *)script_ptr, length); 972 973exit: 974 if (script_ptr) { 975 _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr, 976 _exception ? JNI_ABORT: 0); 977 } 978 979 return ret; 980} 981 982// --------------------------------------------------------------------------- 983 984static jint 985nProgramStoreCreate(JNIEnv *_env, jobject _this, RsContext con, 986 jboolean colorMaskR, jboolean colorMaskG, jboolean colorMaskB, jboolean colorMaskA, 987 jboolean depthMask, jboolean ditherEnable, 988 jint srcFunc, jint destFunc, 989 jint depthFunc) 990{ 991 LOG_API("nProgramStoreCreate, con(%p)", con); 992 return (jint)rsProgramStoreCreate(con, colorMaskR, colorMaskG, colorMaskB, colorMaskA, 993 depthMask, ditherEnable, (RsBlendSrcFunc)srcFunc, 994 (RsBlendDstFunc)destFunc, (RsDepthFunc)depthFunc); 995} 996 997// --------------------------------------------------------------------------- 998 999static void 1000nProgramBindConstants(JNIEnv *_env, jobject _this, RsContext con, jint vpv, jint slot, jint a) 1001{ 1002 LOG_API("nProgramBindConstants, con(%p), vpf(%p), sloat(%i), a(%p)", con, (RsProgramVertex)vpv, slot, (RsAllocation)a); 1003 rsProgramBindConstants(con, (RsProgram)vpv, slot, (RsAllocation)a); 1004} 1005 1006static void 1007nProgramBindTexture(JNIEnv *_env, jobject _this, RsContext con, jint vpf, jint slot, jint a) 1008{ 1009 LOG_API("nProgramBindTexture, con(%p), vpf(%p), slot(%i), a(%p)", con, (RsProgramFragment)vpf, slot, (RsAllocation)a); 1010 rsProgramBindTexture(con, (RsProgramFragment)vpf, slot, (RsAllocation)a); 1011} 1012 1013static void 1014nProgramBindSampler(JNIEnv *_env, jobject _this, RsContext con, jint vpf, jint slot, jint a) 1015{ 1016 LOG_API("nProgramBindSampler, con(%p), vpf(%p), slot(%i), a(%p)", con, (RsProgramFragment)vpf, slot, (RsSampler)a); 1017 rsProgramBindSampler(con, (RsProgramFragment)vpf, slot, (RsSampler)a); 1018} 1019 1020// --------------------------------------------------------------------------- 1021 1022static jint 1023nProgramFragmentCreate(JNIEnv *_env, jobject _this, RsContext con, jstring shader, jintArray params) 1024{ 1025 AutoJavaStringToUTF8 shaderUTF(_env, shader); 1026 jint *paramPtr = _env->GetIntArrayElements(params, NULL); 1027 jint paramLen = _env->GetArrayLength(params); 1028 1029 LOG_API("nProgramFragmentCreate, con(%p), paramLen(%i)", con, paramLen); 1030 1031 jint ret = (jint)rsProgramFragmentCreate(con, shaderUTF.c_str(), shaderUTF.length(), (uint32_t *)paramPtr, paramLen); 1032 _env->ReleaseIntArrayElements(params, paramPtr, JNI_ABORT); 1033 return ret; 1034} 1035 1036 1037// --------------------------------------------------------------------------- 1038 1039static jint 1040nProgramVertexCreate(JNIEnv *_env, jobject _this, RsContext con, jstring shader, jintArray params) 1041{ 1042 AutoJavaStringToUTF8 shaderUTF(_env, shader); 1043 jint *paramPtr = _env->GetIntArrayElements(params, NULL); 1044 jint paramLen = _env->GetArrayLength(params); 1045 1046 LOG_API("nProgramVertexCreate, con(%p), paramLen(%i)", con, paramLen); 1047 1048 jint ret = (jint)rsProgramVertexCreate(con, shaderUTF.c_str(), shaderUTF.length(), (uint32_t *)paramPtr, paramLen); 1049 _env->ReleaseIntArrayElements(params, paramPtr, JNI_ABORT); 1050 return ret; 1051} 1052 1053// --------------------------------------------------------------------------- 1054 1055static jint 1056nProgramRasterCreate(JNIEnv *_env, jobject _this, RsContext con, jboolean pointSmooth, 1057 jboolean lineSmooth, jboolean pointSprite, jfloat lineWidth, jint cull) 1058{ 1059 LOG_API("nProgramRasterCreate, con(%p), pointSmooth(%i), lineSmooth(%i), pointSprite(%i)", 1060 con, pointSmooth, lineSmooth, pointSprite); 1061 return (jint)rsProgramRasterCreate(con, pointSmooth, lineSmooth, pointSprite, lineWidth, (RsCullMode)cull); 1062} 1063 1064 1065// --------------------------------------------------------------------------- 1066 1067static void 1068nContextBindRootScript(JNIEnv *_env, jobject _this, RsContext con, jint script) 1069{ 1070 LOG_API("nContextBindRootScript, con(%p), script(%p)", con, (RsScript)script); 1071 rsContextBindRootScript(con, (RsScript)script); 1072} 1073 1074static void 1075nContextBindProgramStore(JNIEnv *_env, jobject _this, RsContext con, jint pfs) 1076{ 1077 LOG_API("nContextBindProgramStore, con(%p), pfs(%p)", con, (RsProgramStore)pfs); 1078 rsContextBindProgramStore(con, (RsProgramStore)pfs); 1079} 1080 1081static void 1082nContextBindProgramFragment(JNIEnv *_env, jobject _this, RsContext con, jint pf) 1083{ 1084 LOG_API("nContextBindProgramFragment, con(%p), pf(%p)", con, (RsProgramFragment)pf); 1085 rsContextBindProgramFragment(con, (RsProgramFragment)pf); 1086} 1087 1088static void 1089nContextBindProgramVertex(JNIEnv *_env, jobject _this, RsContext con, jint pf) 1090{ 1091 LOG_API("nContextBindProgramVertex, con(%p), pf(%p)", con, (RsProgramVertex)pf); 1092 rsContextBindProgramVertex(con, (RsProgramVertex)pf); 1093} 1094 1095static void 1096nContextBindProgramRaster(JNIEnv *_env, jobject _this, RsContext con, jint pf) 1097{ 1098 LOG_API("nContextBindProgramRaster, con(%p), pf(%p)", con, (RsProgramRaster)pf); 1099 rsContextBindProgramRaster(con, (RsProgramRaster)pf); 1100} 1101 1102 1103// --------------------------------------------------------------------------- 1104 1105static jint 1106nSamplerCreate(JNIEnv *_env, jobject _this, RsContext con, jint magFilter, jint minFilter, 1107 jint wrapS, jint wrapT, jint wrapR, jfloat aniso) 1108{ 1109 LOG_API("nSamplerCreate, con(%p)", con); 1110 return (jint)rsSamplerCreate(con, 1111 (RsSamplerValue)magFilter, 1112 (RsSamplerValue)minFilter, 1113 (RsSamplerValue)wrapS, 1114 (RsSamplerValue)wrapT, 1115 (RsSamplerValue)wrapR, 1116 aniso); 1117} 1118 1119// --------------------------------------------------------------------------- 1120 1121static jint 1122nMeshCreate(JNIEnv *_env, jobject _this, RsContext con, jintArray _vtx, jintArray _idx, jintArray _prim) 1123{ 1124 LOG_API("nMeshCreate, con(%p)", con); 1125 1126 jint vtxLen = _env->GetArrayLength(_vtx); 1127 jint *vtxPtr = _env->GetIntArrayElements(_vtx, NULL); 1128 jint idxLen = _env->GetArrayLength(_idx); 1129 jint *idxPtr = _env->GetIntArrayElements(_idx, NULL); 1130 jint primLen = _env->GetArrayLength(_prim); 1131 jint *primPtr = _env->GetIntArrayElements(_prim, NULL); 1132 1133 int id = (int)rsMeshCreate(con, 1134 (RsAllocation *)vtxPtr, vtxLen, 1135 (RsAllocation *)idxPtr, idxLen, 1136 (uint32_t *)primPtr, primLen); 1137 1138 _env->ReleaseIntArrayElements(_vtx, vtxPtr, 0); 1139 _env->ReleaseIntArrayElements(_idx, idxPtr, 0); 1140 _env->ReleaseIntArrayElements(_prim, primPtr, 0); 1141 return id; 1142} 1143 1144static jint 1145nMeshGetVertexBufferCount(JNIEnv *_env, jobject _this, RsContext con, jint mesh) 1146{ 1147 LOG_API("nMeshGetVertexBufferCount, con(%p), Mesh(%p)", con, (RsMesh)mesh); 1148 jint vtxCount = 0; 1149 rsaMeshGetVertexBufferCount(con, (RsMesh)mesh, &vtxCount); 1150 return vtxCount; 1151} 1152 1153static jint 1154nMeshGetIndexCount(JNIEnv *_env, jobject _this, RsContext con, jint mesh) 1155{ 1156 LOG_API("nMeshGetIndexCount, con(%p), Mesh(%p)", con, (RsMesh)mesh); 1157 jint idxCount = 0; 1158 rsaMeshGetIndexCount(con, (RsMesh)mesh, &idxCount); 1159 return idxCount; 1160} 1161 1162static void 1163nMeshGetVertices(JNIEnv *_env, jobject _this, RsContext con, jint mesh, jintArray _ids, int numVtxIDs) 1164{ 1165 LOG_API("nMeshGetVertices, con(%p), Mesh(%p)", con, (RsMesh)mesh); 1166 1167 RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numVtxIDs * sizeof(RsAllocation)); 1168 rsaMeshGetVertices(con, (RsMesh)mesh, allocs, (uint32_t)numVtxIDs); 1169 1170 for(jint i = 0; i < numVtxIDs; i ++) { 1171 _env->SetIntArrayRegion(_ids, i, 1, (const jint*)&allocs[i]); 1172 } 1173 1174 free(allocs); 1175} 1176 1177static void 1178nMeshGetIndices(JNIEnv *_env, jobject _this, RsContext con, jint mesh, jintArray _idxIds, jintArray _primitives, int numIndices) 1179{ 1180 LOG_API("nMeshGetVertices, con(%p), Mesh(%p)", con, (RsMesh)mesh); 1181 1182 RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numIndices * sizeof(RsAllocation)); 1183 uint32_t *prims= (uint32_t*)malloc((uint32_t)numIndices * sizeof(uint32_t)); 1184 1185 rsaMeshGetIndices(con, (RsMesh)mesh, allocs, prims, (uint32_t)numIndices); 1186 1187 for(jint i = 0; i < numIndices; i ++) { 1188 _env->SetIntArrayRegion(_idxIds, i, 1, (const jint*)&allocs[i]); 1189 _env->SetIntArrayRegion(_primitives, i, 1, (const jint*)&prims[i]); 1190 } 1191 1192 free(allocs); 1193 free(prims); 1194} 1195 1196// --------------------------------------------------------------------------- 1197 1198 1199static const char *classPathName = "android/renderscript/RenderScript"; 1200 1201static JNINativeMethod methods[] = { 1202{"_nInit", "()V", (void*)_nInit }, 1203 1204{"nDeviceCreate", "()I", (void*)nDeviceCreate }, 1205{"nDeviceDestroy", "(I)V", (void*)nDeviceDestroy }, 1206{"nDeviceSetConfig", "(III)V", (void*)nDeviceSetConfig }, 1207{"nContextGetUserMessage", "(I[I)I", (void*)nContextGetUserMessage }, 1208{"nContextGetErrorMessage", "(I)Ljava/lang/String;", (void*)nContextGetErrorMessage }, 1209{"nContextPeekMessage", "(I[I)I", (void*)nContextPeekMessage }, 1210 1211{"nContextInitToClient", "(I)V", (void*)nContextInitToClient }, 1212{"nContextDeinitToClient", "(I)V", (void*)nContextDeinitToClient }, 1213 1214 1215// All methods below are thread protected in java. 1216{"rsnContextCreate", "(II)I", (void*)nContextCreate }, 1217{"rsnContextCreateGL", "(IIIIIIIIIIIIFI)I", (void*)nContextCreateGL }, 1218{"rsnContextFinish", "(I)V", (void*)nContextFinish }, 1219{"rsnContextSetPriority", "(II)V", (void*)nContextSetPriority }, 1220{"rsnContextSetSurface", "(IIILandroid/view/Surface;)V", (void*)nContextSetSurface }, 1221{"rsnContextSetSurfaceTexture", "(IIILandroid/graphics/SurfaceTexture;)V", (void*)nContextSetSurfaceTexture }, 1222{"rsnContextDestroy", "(I)V", (void*)nContextDestroy }, 1223{"rsnContextDump", "(II)V", (void*)nContextDump }, 1224{"rsnContextPause", "(I)V", (void*)nContextPause }, 1225{"rsnContextResume", "(I)V", (void*)nContextResume }, 1226{"rsnAssignName", "(II[B)V", (void*)nAssignName }, 1227{"rsnGetName", "(II)Ljava/lang/String;", (void*)nGetName }, 1228{"rsnObjDestroy", "(II)V", (void*)nObjDestroy }, 1229 1230{"rsnFileA3DCreateFromFile", "(ILjava/lang/String;)I", (void*)nFileA3DCreateFromFile }, 1231{"rsnFileA3DCreateFromAssetStream", "(II)I", (void*)nFileA3DCreateFromAssetStream }, 1232{"rsnFileA3DCreateFromAsset", "(ILandroid/content/res/AssetManager;Ljava/lang/String;)I", (void*)nFileA3DCreateFromAsset }, 1233{"rsnFileA3DGetNumIndexEntries", "(II)I", (void*)nFileA3DGetNumIndexEntries }, 1234{"rsnFileA3DGetIndexEntries", "(III[I[Ljava/lang/String;)V", (void*)nFileA3DGetIndexEntries }, 1235{"rsnFileA3DGetEntryByIndex", "(III)I", (void*)nFileA3DGetEntryByIndex }, 1236 1237{"rsnFontCreateFromFile", "(ILjava/lang/String;FI)I", (void*)nFontCreateFromFile }, 1238{"rsnFontCreateFromAssetStream", "(ILjava/lang/String;FII)I", (void*)nFontCreateFromAssetStream }, 1239{"rsnFontCreateFromAsset", "(ILandroid/content/res/AssetManager;Ljava/lang/String;FI)I", (void*)nFontCreateFromAsset }, 1240 1241{"rsnElementCreate", "(IIIZI)I", (void*)nElementCreate }, 1242{"rsnElementCreate2", "(I[I[Ljava/lang/String;[I)I", (void*)nElementCreate2 }, 1243{"rsnElementGetNativeData", "(II[I)V", (void*)nElementGetNativeData }, 1244{"rsnElementGetSubElements", "(II[I[Ljava/lang/String;)V", (void*)nElementGetSubElements }, 1245 1246{"rsnTypeCreate", "(IIIIIZZ)I", (void*)nTypeCreate }, 1247{"rsnTypeGetNativeData", "(II[I)V", (void*)nTypeGetNativeData }, 1248 1249{"rsnAllocationCreateTyped", "(IIII)I", (void*)nAllocationCreateTyped }, 1250{"rsnAllocationCreateFromBitmap", "(IIILandroid/graphics/Bitmap;I)I", (void*)nAllocationCreateFromBitmap }, 1251{"rsnAllocationCubeCreateFromBitmap","(IIILandroid/graphics/Bitmap;I)I", (void*)nAllocationCubeCreateFromBitmap }, 1252 1253{"rsnAllocationCopyFromBitmap", "(IILandroid/graphics/Bitmap;)V", (void*)nAllocationCopyFromBitmap }, 1254{"rsnAllocationCopyToBitmap", "(IILandroid/graphics/Bitmap;)V", (void*)nAllocationCopyToBitmap }, 1255 1256{"rsnAllocationSyncAll", "(III)V", (void*)nAllocationSyncAll }, 1257{"rsnAllocationData1D", "(IIIII[II)V", (void*)nAllocationData1D_i }, 1258{"rsnAllocationData1D", "(IIIII[SI)V", (void*)nAllocationData1D_s }, 1259{"rsnAllocationData1D", "(IIIII[BI)V", (void*)nAllocationData1D_b }, 1260{"rsnAllocationData1D", "(IIIII[FI)V", (void*)nAllocationData1D_f }, 1261{"rsnAllocationElementData1D", "(IIIII[BI)V", (void*)nAllocationElementData1D }, 1262{"rsnAllocationData2D", "(IIIIIIII[II)V", (void*)nAllocationData2D_i }, 1263{"rsnAllocationData2D", "(IIIIIIII[SI)V", (void*)nAllocationData2D_s }, 1264{"rsnAllocationData2D", "(IIIIIIII[BI)V", (void*)nAllocationData2D_b }, 1265{"rsnAllocationData2D", "(IIIIIIII[FI)V", (void*)nAllocationData2D_f }, 1266{"rsnAllocationData2D", "(IIIIIIIIIIIII)V", (void*)nAllocationData2D_alloc }, 1267{"rsnAllocationRead", "(II[I)V", (void*)nAllocationRead_i }, 1268{"rsnAllocationRead", "(II[S)V", (void*)nAllocationRead_s }, 1269{"rsnAllocationRead", "(II[B)V", (void*)nAllocationRead_b }, 1270{"rsnAllocationRead", "(II[F)V", (void*)nAllocationRead_f }, 1271{"rsnAllocationGetType", "(II)I", (void*)nAllocationGetType}, 1272{"rsnAllocationResize1D", "(III)V", (void*)nAllocationResize1D }, 1273{"rsnAllocationResize2D", "(IIII)V", (void*)nAllocationResize2D }, 1274{"rsnAllocationGenerateMipmaps", "(II)V", (void*)nAllocationGenerateMipmaps }, 1275 1276{"rsnScriptBindAllocation", "(IIII)V", (void*)nScriptBindAllocation }, 1277{"rsnScriptSetTimeZone", "(II[B)V", (void*)nScriptSetTimeZone }, 1278{"rsnScriptInvoke", "(III)V", (void*)nScriptInvoke }, 1279{"rsnScriptInvokeV", "(III[B)V", (void*)nScriptInvokeV }, 1280{"rsnScriptForEach", "(IIIII)V", (void*)nScriptForEach }, 1281{"rsnScriptForEach", "(IIIII[B)V", (void*)nScriptForEachV }, 1282{"rsnScriptSetVarI", "(IIII)V", (void*)nScriptSetVarI }, 1283{"rsnScriptSetVarJ", "(IIIJ)V", (void*)nScriptSetVarJ }, 1284{"rsnScriptSetVarF", "(IIIF)V", (void*)nScriptSetVarF }, 1285{"rsnScriptSetVarD", "(IIID)V", (void*)nScriptSetVarD }, 1286{"rsnScriptSetVarV", "(III[B)V", (void*)nScriptSetVarV }, 1287{"rsnScriptSetVarObj", "(IIII)V", (void*)nScriptSetVarObj }, 1288 1289{"rsnScriptCCreate", "(ILjava/lang/String;Ljava/lang/String;[BI)I", (void*)nScriptCCreate }, 1290 1291{"rsnProgramStoreCreate", "(IZZZZZZIII)I", (void*)nProgramStoreCreate }, 1292 1293{"rsnProgramBindConstants", "(IIII)V", (void*)nProgramBindConstants }, 1294{"rsnProgramBindTexture", "(IIII)V", (void*)nProgramBindTexture }, 1295{"rsnProgramBindSampler", "(IIII)V", (void*)nProgramBindSampler }, 1296 1297{"rsnProgramFragmentCreate", "(ILjava/lang/String;[I)I", (void*)nProgramFragmentCreate }, 1298{"rsnProgramRasterCreate", "(IZZZFI)I", (void*)nProgramRasterCreate }, 1299{"rsnProgramVertexCreate", "(ILjava/lang/String;[I)I", (void*)nProgramVertexCreate }, 1300 1301{"rsnContextBindRootScript", "(II)V", (void*)nContextBindRootScript }, 1302{"rsnContextBindProgramStore", "(II)V", (void*)nContextBindProgramStore }, 1303{"rsnContextBindProgramFragment", "(II)V", (void*)nContextBindProgramFragment }, 1304{"rsnContextBindProgramVertex", "(II)V", (void*)nContextBindProgramVertex }, 1305{"rsnContextBindProgramRaster", "(II)V", (void*)nContextBindProgramRaster }, 1306 1307{"rsnSamplerCreate", "(IIIIIIF)I", (void*)nSamplerCreate }, 1308 1309{"rsnMeshCreate", "(I[I[I[I)I", (void*)nMeshCreate }, 1310 1311{"rsnMeshGetVertexBufferCount", "(II)I", (void*)nMeshGetVertexBufferCount }, 1312{"rsnMeshGetIndexCount", "(II)I", (void*)nMeshGetIndexCount }, 1313{"rsnMeshGetVertices", "(II[II)V", (void*)nMeshGetVertices }, 1314{"rsnMeshGetIndices", "(II[I[II)V", (void*)nMeshGetIndices }, 1315 1316}; 1317 1318static int registerFuncs(JNIEnv *_env) 1319{ 1320 return android::AndroidRuntime::registerNativeMethods( 1321 _env, classPathName, methods, NELEM(methods)); 1322} 1323 1324// --------------------------------------------------------------------------- 1325 1326jint JNI_OnLoad(JavaVM* vm, void* reserved) 1327{ 1328 JNIEnv* env = NULL; 1329 jint result = -1; 1330 1331 if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { 1332 LOGE("ERROR: GetEnv failed\n"); 1333 goto bail; 1334 } 1335 assert(env != NULL); 1336 1337 if (registerFuncs(env) < 0) { 1338 LOGE("ERROR: MediaPlayer native registration failed\n"); 1339 goto bail; 1340 } 1341 1342 /* success -- return valid version number */ 1343 result = JNI_VERSION_1_4; 1344 1345bail: 1346 return result; 1347} 1348