OSDN Git Service

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