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