android_renderscript_RenderScript.cpp revision 4cbe25a86b4aa3353c8016a129028671e902611f
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)
434{
435    LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i)", con, (RsElement)type, mips, usage);
436    return (jint) rsAllocationCreateTyped(con, (RsType)type, (RsAllocationMipmapControl)mips, (uint32_t)usage);
437}
438
439static void
440nAllocationSyncAll(JNIEnv *_env, jobject _this, RsContext con, jint a, jint bits)
441{
442    LOG_API("nAllocationSyncAll, con(%p), a(%p), bits(0x%08x)", con, (RsAllocation)a, bits);
443    rsAllocationSyncAll(con, (RsAllocation)a, (RsAllocationUsageType)bits);
444}
445
446static void
447nAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, RsContext con, jint alloc)
448{
449    LOG_API("nAllocationGenerateMipmaps, con(%p), a(%p)", con, (RsAllocation)alloc);
450    rsAllocationGenerateMipmaps(con, (RsAllocation)alloc);
451}
452
453static int
454nAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, RsContext con, jint type, jint mip, jobject jbitmap, jint usage)
455{
456    SkBitmap const * nativeBitmap =
457            (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID);
458    const SkBitmap& bitmap(*nativeBitmap);
459
460    bitmap.lockPixels();
461    const void* ptr = bitmap.getPixels();
462    jint id = (jint)rsAllocationCreateFromBitmap(con,
463                                                  (RsType)type, (RsAllocationMipmapControl)mip,
464                                                  ptr, bitmap.getSize(), usage);
465    bitmap.unlockPixels();
466    return id;
467}
468
469static int
470nAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, RsContext con, jint type, jint mip, jobject jbitmap, jint usage)
471{
472    SkBitmap const * nativeBitmap =
473            (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID);
474    const SkBitmap& bitmap(*nativeBitmap);
475
476    bitmap.lockPixels();
477    const void* ptr = bitmap.getPixels();
478    jint id = (jint)rsAllocationCubeCreateFromBitmap(con,
479                                                      (RsType)type, (RsAllocationMipmapControl)mip,
480                                                      ptr, bitmap.getSize(), usage);
481    bitmap.unlockPixels();
482    return id;
483}
484
485static void
486nAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jobject jbitmap)
487{
488    SkBitmap const * nativeBitmap =
489            (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID);
490    const SkBitmap& bitmap(*nativeBitmap);
491    int w = bitmap.width();
492    int h = bitmap.height();
493
494    bitmap.lockPixels();
495    const void* ptr = bitmap.getPixels();
496    rsAllocation2DData(con, (RsAllocation)alloc, 0, 0,
497                       0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X,
498                       w, h, ptr, bitmap.getSize());
499    bitmap.unlockPixels();
500}
501
502static void
503nAllocationCopyToBitmap(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jobject jbitmap)
504{
505    SkBitmap const * nativeBitmap =
506            (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID);
507    const SkBitmap& bitmap(*nativeBitmap);
508
509    bitmap.lockPixels();
510    void* ptr = bitmap.getPixels();
511    rsAllocationCopyToBitmap(con, (RsAllocation)alloc, ptr, bitmap.getSize());
512    bitmap.unlockPixels();
513    bitmap.notifyPixelsChanged();
514}
515
516static void ReleaseBitmapCallback(void *bmp)
517{
518    SkBitmap const * nativeBitmap = (SkBitmap const *)bmp;
519    nativeBitmap->unlockPixels();
520}
521
522
523static void
524nAllocationData1D_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jintArray data, int sizeBytes)
525{
526    jint len = _env->GetArrayLength(data);
527    LOG_API("nAllocation1DData_i, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes);
528    jint *ptr = _env->GetIntArrayElements(data, NULL);
529    rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes);
530    _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
531}
532
533static void
534nAllocationData1D_s(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jshortArray data, int sizeBytes)
535{
536    jint len = _env->GetArrayLength(data);
537    LOG_API("nAllocation1DData_s, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes);
538    jshort *ptr = _env->GetShortArrayElements(data, NULL);
539    rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes);
540    _env->ReleaseShortArrayElements(data, ptr, JNI_ABORT);
541}
542
543static void
544nAllocationData1D_b(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jbyteArray data, int sizeBytes)
545{
546    jint len = _env->GetArrayLength(data);
547    LOG_API("nAllocation1DData_b, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes);
548    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
549    rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes);
550    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
551}
552
553static void
554nAllocationData1D_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jfloatArray data, int sizeBytes)
555{
556    jint len = _env->GetArrayLength(data);
557    LOG_API("nAllocation1DData_f, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes);
558    jfloat *ptr = _env->GetFloatArrayElements(data, NULL);
559    rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes);
560    _env->ReleaseFloatArrayElements(data, ptr, JNI_ABORT);
561}
562
563static void
564//    native void rsnAllocationElementData1D(int con, int id, int xoff, int compIdx, byte[] d, int sizeBytes);
565nAllocationElementData1D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint compIdx, jbyteArray data, int sizeBytes)
566{
567    jint len = _env->GetArrayLength(data);
568    LOG_API("nAllocationElementData1D, con(%p), alloc(%p), offset(%i), comp(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, compIdx, len, sizeBytes);
569    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
570    rsAllocation1DElementData(con, (RsAllocation)alloc, offset, lod, ptr, sizeBytes, compIdx);
571    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
572}
573
574static void
575nAllocationData2D_s(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face,
576                    jint w, jint h, jshortArray data, int sizeBytes)
577{
578    jint len = _env->GetArrayLength(data);
579    LOG_API("nAllocation2DData_s, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", con, (RsAllocation)alloc, xoff, yoff, w, h, len);
580    jshort *ptr = _env->GetShortArrayElements(data, NULL);
581    rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes);
582    _env->ReleaseShortArrayElements(data, ptr, JNI_ABORT);
583}
584
585static void
586nAllocationData2D_b(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face,
587                    jint w, jint h, jbyteArray data, int sizeBytes)
588{
589    jint len = _env->GetArrayLength(data);
590    LOG_API("nAllocation2DData_b, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", con, (RsAllocation)alloc, xoff, yoff, w, h, len);
591    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
592    rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes);
593    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
594}
595
596static void
597nAllocationData2D_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face,
598                    jint w, jint h, jintArray data, int sizeBytes)
599{
600    jint len = _env->GetArrayLength(data);
601    LOG_API("nAllocation2DData_i, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", con, (RsAllocation)alloc, xoff, yoff, w, h, len);
602    jint *ptr = _env->GetIntArrayElements(data, NULL);
603    rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes);
604    _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
605}
606
607static void
608nAllocationData2D_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face,
609                    jint w, jint h, jfloatArray data, int sizeBytes)
610{
611    jint len = _env->GetArrayLength(data);
612    LOG_API("nAllocation2DData_i, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", con, (RsAllocation)alloc, xoff, yoff, w, h, len);
613    jfloat *ptr = _env->GetFloatArrayElements(data, NULL);
614    rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes);
615    _env->ReleaseFloatArrayElements(data, ptr, JNI_ABORT);
616}
617
618static void
619nAllocationData2D_alloc(JNIEnv *_env, jobject _this, RsContext con,
620                        jint dstAlloc, jint dstXoff, jint dstYoff,
621                        jint dstMip, jint dstFace,
622                        jint width, jint height,
623                        jint srcAlloc, jint srcXoff, jint srcYoff,
624                        jint srcMip, jint srcFace)
625{
626    LOG_API("nAllocation2DData_s, con(%p), dstAlloc(%p), dstXoff, dstYoff,"
627            " dstMip(%i), dstFace(%i), width(%i), height(%i),"
628            " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i), srcFace(%i)",
629            con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
630            width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
631
632    rsAllocationCopy2DRange(con,
633                            (RsAllocation)dstAlloc,
634                            dstXoff, dstYoff,
635                            dstMip, dstFace,
636                            width, height,
637                            (RsAllocation)srcAlloc,
638                            srcXoff, srcYoff,
639                            srcMip, srcFace);
640}
641
642static void
643nAllocationRead_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jintArray data)
644{
645    jint len = _env->GetArrayLength(data);
646    LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len);
647    jint *ptr = _env->GetIntArrayElements(data, NULL);
648    jsize length = _env->GetArrayLength(data);
649    rsAllocationRead(con, (RsAllocation)alloc, ptr, length);
650    _env->ReleaseIntArrayElements(data, ptr, 0);
651}
652
653static void
654nAllocationRead_s(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jshortArray data)
655{
656    jint len = _env->GetArrayLength(data);
657    LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len);
658    jshort *ptr = _env->GetShortArrayElements(data, NULL);
659    jsize length = _env->GetArrayLength(data);
660    rsAllocationRead(con, (RsAllocation)alloc, ptr, length);
661    _env->ReleaseShortArrayElements(data, ptr, 0);
662}
663
664static void
665nAllocationRead_b(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jbyteArray data)
666{
667    jint len = _env->GetArrayLength(data);
668    LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len);
669    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
670    jsize length = _env->GetArrayLength(data);
671    rsAllocationRead(con, (RsAllocation)alloc, ptr, length);
672    _env->ReleaseByteArrayElements(data, ptr, 0);
673}
674
675static void
676nAllocationRead_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jfloatArray data)
677{
678    jint len = _env->GetArrayLength(data);
679    LOG_API("nAllocationRead_f, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len);
680    jfloat *ptr = _env->GetFloatArrayElements(data, NULL);
681    jsize length = _env->GetArrayLength(data);
682    rsAllocationRead(con, (RsAllocation)alloc, ptr, length);
683    _env->ReleaseFloatArrayElements(data, ptr, 0);
684}
685
686static jint
687nAllocationGetType(JNIEnv *_env, jobject _this, RsContext con, jint a)
688{
689    LOG_API("nAllocationGetType, con(%p), a(%p)", con, (RsAllocation)a);
690    return (jint) rsaAllocationGetType(con, (RsAllocation)a);
691}
692
693static void
694nAllocationResize1D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint dimX)
695{
696    LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", con, (RsAllocation)alloc, dimX);
697    rsAllocationResize1D(con, (RsAllocation)alloc, dimX);
698}
699
700static void
701nAllocationResize2D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint dimX, jint dimY)
702{
703    LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i), sizeY(%i)", con, (RsAllocation)alloc, dimX, dimY);
704    rsAllocationResize2D(con, (RsAllocation)alloc, dimX, dimY);
705}
706
707// -----------------------------------
708
709static int
710nFileA3DCreateFromAssetStream(JNIEnv *_env, jobject _this, RsContext con, jint native_asset)
711{
712    ALOGV("______nFileA3D %u", (uint32_t) native_asset);
713
714    Asset* asset = reinterpret_cast<Asset*>(native_asset);
715
716    jint id = (jint)rsaFileA3DCreateFromMemory(con, asset->getBuffer(false), asset->getLength());
717    return id;
718}
719
720static int
721nFileA3DCreateFromAsset(JNIEnv *_env, jobject _this, RsContext con, jobject _assetMgr, jstring _path)
722{
723    AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr);
724    if (mgr == NULL) {
725        return 0;
726    }
727
728    AutoJavaStringToUTF8 str(_env, _path);
729    Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
730    if (asset == NULL) {
731        return 0;
732    }
733
734    jint id = (jint)rsaFileA3DCreateFromAsset(con, asset);
735    return id;
736}
737
738static int
739nFileA3DCreateFromFile(JNIEnv *_env, jobject _this, RsContext con, jstring fileName)
740{
741    AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
742    jint id = (jint)rsaFileA3DCreateFromFile(con, fileNameUTF.c_str());
743
744    return id;
745}
746
747static int
748nFileA3DGetNumIndexEntries(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D)
749{
750    int32_t numEntries = 0;
751    rsaFileA3DGetNumIndexEntries(con, &numEntries, (RsFile)fileA3D);
752    return numEntries;
753}
754
755static void
756nFileA3DGetIndexEntries(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D, jint numEntries, jintArray _ids, jobjectArray _entries)
757{
758    ALOGV("______nFileA3D %u", (uint32_t) fileA3D);
759    RsFileIndexEntry *fileEntries = (RsFileIndexEntry*)malloc((uint32_t)numEntries * sizeof(RsFileIndexEntry));
760
761    rsaFileA3DGetIndexEntries(con, fileEntries, (uint32_t)numEntries, (RsFile)fileA3D);
762
763    for(jint i = 0; i < numEntries; i ++) {
764        _env->SetObjectArrayElement(_entries, i, _env->NewStringUTF(fileEntries[i].objectName));
765        _env->SetIntArrayRegion(_ids, i, 1, (const jint*)&fileEntries[i].classID);
766    }
767
768    free(fileEntries);
769}
770
771static int
772nFileA3DGetEntryByIndex(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D, jint index)
773{
774    ALOGV("______nFileA3D %u", (uint32_t) fileA3D);
775    jint id = (jint)rsaFileA3DGetEntryByIndex(con, (uint32_t)index, (RsFile)fileA3D);
776    return id;
777}
778
779// -----------------------------------
780
781static int
782nFontCreateFromFile(JNIEnv *_env, jobject _this, RsContext con,
783                    jstring fileName, jfloat fontSize, jint dpi)
784{
785    AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
786    jint id = (jint)rsFontCreateFromFile(con,
787                                         fileNameUTF.c_str(), fileNameUTF.length(),
788                                         fontSize, dpi);
789
790    return id;
791}
792
793static int
794nFontCreateFromAssetStream(JNIEnv *_env, jobject _this, RsContext con,
795                           jstring name, jfloat fontSize, jint dpi, jint native_asset)
796{
797    Asset* asset = reinterpret_cast<Asset*>(native_asset);
798    AutoJavaStringToUTF8 nameUTF(_env, name);
799
800    jint id = (jint)rsFontCreateFromMemory(con,
801                                           nameUTF.c_str(), nameUTF.length(),
802                                           fontSize, dpi,
803                                           asset->getBuffer(false), asset->getLength());
804    return id;
805}
806
807static int
808nFontCreateFromAsset(JNIEnv *_env, jobject _this, RsContext con, jobject _assetMgr, jstring _path,
809                     jfloat fontSize, jint dpi)
810{
811    AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr);
812    if (mgr == NULL) {
813        return 0;
814    }
815
816    AutoJavaStringToUTF8 str(_env, _path);
817    Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
818    if (asset == NULL) {
819        return 0;
820    }
821
822    jint id = (jint)rsFontCreateFromMemory(con,
823                                           str.c_str(), str.length(),
824                                           fontSize, dpi,
825                                           asset->getBuffer(false), asset->getLength());
826    delete asset;
827    return id;
828}
829
830// -----------------------------------
831
832static void
833nScriptBindAllocation(JNIEnv *_env, jobject _this, RsContext con, jint script, jint alloc, jint slot)
834{
835    LOG_API("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)", con, (RsScript)script, (RsAllocation)alloc, slot);
836    rsScriptBindAllocation(con, (RsScript)script, (RsAllocation)alloc, slot);
837}
838
839static void
840nScriptSetVarI(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jint val)
841{
842    LOG_API("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", con, (void *)script, slot, val);
843    rsScriptSetVarI(con, (RsScript)script, slot, val);
844}
845
846static void
847nScriptSetVarObj(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jint val)
848{
849    LOG_API("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%i)", con, (void *)script, slot, val);
850    rsScriptSetVarObj(con, (RsScript)script, slot, (RsObjectBase)val);
851}
852
853static void
854nScriptSetVarJ(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jlong val)
855{
856    LOG_API("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%lli)", con, (void *)script, slot, val);
857    rsScriptSetVarJ(con, (RsScript)script, slot, val);
858}
859
860static void
861nScriptSetVarF(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, float val)
862{
863    LOG_API("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", con, (void *)script, slot, val);
864    rsScriptSetVarF(con, (RsScript)script, slot, val);
865}
866
867static void
868nScriptSetVarD(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, double val)
869{
870    LOG_API("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", con, (void *)script, slot, val);
871    rsScriptSetVarD(con, (RsScript)script, slot, val);
872}
873
874static void
875nScriptSetVarV(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jbyteArray data)
876{
877    LOG_API("nScriptSetVarV, con(%p), s(%p), slot(%i)", con, (void *)script, slot);
878    jint len = _env->GetArrayLength(data);
879    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
880    rsScriptSetVarV(con, (RsScript)script, slot, ptr, len);
881    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
882}
883
884
885static void
886nScriptSetTimeZone(JNIEnv *_env, jobject _this, RsContext con, jint script, jbyteArray timeZone)
887{
888    LOG_API("nScriptCSetTimeZone, con(%p), s(%p), timeZone(%s)", con, (void *)script, (const char *)timeZone);
889
890    jint length = _env->GetArrayLength(timeZone);
891    jbyte* timeZone_ptr;
892    timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0);
893
894    rsScriptSetTimeZone(con, (RsScript)script, (const char *)timeZone_ptr, length);
895
896    if (timeZone_ptr) {
897        _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0);
898    }
899}
900
901static void
902nScriptInvoke(JNIEnv *_env, jobject _this, RsContext con, jint obj, jint slot)
903{
904    LOG_API("nScriptInvoke, con(%p), script(%p)", con, (void *)obj);
905    rsScriptInvoke(con, (RsScript)obj, slot);
906}
907
908static void
909nScriptInvokeV(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jbyteArray data)
910{
911    LOG_API("nScriptInvokeV, con(%p), s(%p), slot(%i)", con, (void *)script, slot);
912    jint len = _env->GetArrayLength(data);
913    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
914    rsScriptInvokeV(con, (RsScript)script, slot, ptr, len);
915    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
916}
917
918static void
919nScriptForEach(JNIEnv *_env, jobject _this, RsContext con,
920               jint script, jint slot, jint ain, jint aout)
921{
922    LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", con, (void *)script, slot);
923    rsScriptForEach(con, (RsScript)script, slot, (RsAllocation)ain, (RsAllocation)aout, NULL, 0);
924}
925static void
926nScriptForEachV(JNIEnv *_env, jobject _this, RsContext con,
927                jint script, jint slot, jint ain, jint aout, jbyteArray params)
928{
929    LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", con, (void *)script, slot);
930    jint len = _env->GetArrayLength(params);
931    jbyte *ptr = _env->GetByteArrayElements(params, NULL);
932    rsScriptForEach(con, (RsScript)script, slot, (RsAllocation)ain, (RsAllocation)aout, ptr, len);
933    _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT);
934}
935
936
937// -----------------------------------
938
939static jint
940nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con,
941               jstring resName, jstring cacheDir,
942               jbyteArray scriptRef, jint length)
943{
944    LOG_API("nScriptCCreate, con(%p)", con);
945
946    AutoJavaStringToUTF8 resNameUTF(_env, resName);
947    AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
948    jint ret = 0;
949    jbyte* script_ptr = NULL;
950    jint _exception = 0;
951    jint remaining;
952    if (!scriptRef) {
953        _exception = 1;
954        //jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null");
955        goto exit;
956    }
957    if (length < 0) {
958        _exception = 1;
959        //jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0");
960        goto exit;
961    }
962    remaining = _env->GetArrayLength(scriptRef);
963    if (remaining < length) {
964        _exception = 1;
965        //jniThrowException(_env, "java/lang/IllegalArgumentException",
966        //        "length > script.length - offset");
967        goto exit;
968    }
969    script_ptr = (jbyte *)
970        _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0);
971
972    //rsScriptCSetText(con, (const char *)script_ptr, length);
973
974    ret = (jint)rsScriptCCreate(con,
975                                resNameUTF.c_str(), resNameUTF.length(),
976                                cacheDirUTF.c_str(), cacheDirUTF.length(),
977                                (const char *)script_ptr, length);
978
979exit:
980    if (script_ptr) {
981        _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr,
982                _exception ? JNI_ABORT: 0);
983    }
984
985    return ret;
986}
987
988// ---------------------------------------------------------------------------
989
990static jint
991nProgramStoreCreate(JNIEnv *_env, jobject _this, RsContext con,
992                    jboolean colorMaskR, jboolean colorMaskG, jboolean colorMaskB, jboolean colorMaskA,
993                    jboolean depthMask, jboolean ditherEnable,
994                    jint srcFunc, jint destFunc,
995                    jint depthFunc)
996{
997    LOG_API("nProgramStoreCreate, con(%p)", con);
998    return (jint)rsProgramStoreCreate(con, colorMaskR, colorMaskG, colorMaskB, colorMaskA,
999                                      depthMask, ditherEnable, (RsBlendSrcFunc)srcFunc,
1000                                      (RsBlendDstFunc)destFunc, (RsDepthFunc)depthFunc);
1001}
1002
1003// ---------------------------------------------------------------------------
1004
1005static void
1006nProgramBindConstants(JNIEnv *_env, jobject _this, RsContext con, jint vpv, jint slot, jint a)
1007{
1008    LOG_API("nProgramBindConstants, con(%p), vpf(%p), sloat(%i), a(%p)", con, (RsProgramVertex)vpv, slot, (RsAllocation)a);
1009    rsProgramBindConstants(con, (RsProgram)vpv, slot, (RsAllocation)a);
1010}
1011
1012static void
1013nProgramBindTexture(JNIEnv *_env, jobject _this, RsContext con, jint vpf, jint slot, jint a)
1014{
1015    LOG_API("nProgramBindTexture, con(%p), vpf(%p), slot(%i), a(%p)", con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
1016    rsProgramBindTexture(con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
1017}
1018
1019static void
1020nProgramBindSampler(JNIEnv *_env, jobject _this, RsContext con, jint vpf, jint slot, jint a)
1021{
1022    LOG_API("nProgramBindSampler, con(%p), vpf(%p), slot(%i), a(%p)", con, (RsProgramFragment)vpf, slot, (RsSampler)a);
1023    rsProgramBindSampler(con, (RsProgramFragment)vpf, slot, (RsSampler)a);
1024}
1025
1026// ---------------------------------------------------------------------------
1027
1028static jint
1029nProgramFragmentCreate(JNIEnv *_env, jobject _this, RsContext con, jstring shader, jintArray params)
1030{
1031    AutoJavaStringToUTF8 shaderUTF(_env, shader);
1032    jint *paramPtr = _env->GetIntArrayElements(params, NULL);
1033    jint paramLen = _env->GetArrayLength(params);
1034
1035    LOG_API("nProgramFragmentCreate, con(%p), paramLen(%i)", con, paramLen);
1036
1037    jint ret = (jint)rsProgramFragmentCreate(con, shaderUTF.c_str(), shaderUTF.length(), (uint32_t *)paramPtr, paramLen);
1038    _env->ReleaseIntArrayElements(params, paramPtr, JNI_ABORT);
1039    return ret;
1040}
1041
1042
1043// ---------------------------------------------------------------------------
1044
1045static jint
1046nProgramVertexCreate(JNIEnv *_env, jobject _this, RsContext con, jstring shader, jintArray params)
1047{
1048    AutoJavaStringToUTF8 shaderUTF(_env, shader);
1049    jint *paramPtr = _env->GetIntArrayElements(params, NULL);
1050    jint paramLen = _env->GetArrayLength(params);
1051
1052    LOG_API("nProgramVertexCreate, con(%p), paramLen(%i)", con, paramLen);
1053
1054    jint ret = (jint)rsProgramVertexCreate(con, shaderUTF.c_str(), shaderUTF.length(), (uint32_t *)paramPtr, paramLen);
1055    _env->ReleaseIntArrayElements(params, paramPtr, JNI_ABORT);
1056    return ret;
1057}
1058
1059// ---------------------------------------------------------------------------
1060
1061static jint
1062nProgramRasterCreate(JNIEnv *_env, jobject _this, RsContext con, jboolean pointSprite, jint cull)
1063{
1064    LOG_API("nProgramRasterCreate, con(%p), pointSprite(%i), cull(%i)", con, pointSprite, cull);
1065    return (jint)rsProgramRasterCreate(con, pointSprite, (RsCullMode)cull);
1066}
1067
1068
1069// ---------------------------------------------------------------------------
1070
1071static void
1072nContextBindRootScript(JNIEnv *_env, jobject _this, RsContext con, jint script)
1073{
1074    LOG_API("nContextBindRootScript, con(%p), script(%p)", con, (RsScript)script);
1075    rsContextBindRootScript(con, (RsScript)script);
1076}
1077
1078static void
1079nContextBindProgramStore(JNIEnv *_env, jobject _this, RsContext con, jint pfs)
1080{
1081    LOG_API("nContextBindProgramStore, con(%p), pfs(%p)", con, (RsProgramStore)pfs);
1082    rsContextBindProgramStore(con, (RsProgramStore)pfs);
1083}
1084
1085static void
1086nContextBindProgramFragment(JNIEnv *_env, jobject _this, RsContext con, jint pf)
1087{
1088    LOG_API("nContextBindProgramFragment, con(%p), pf(%p)", con, (RsProgramFragment)pf);
1089    rsContextBindProgramFragment(con, (RsProgramFragment)pf);
1090}
1091
1092static void
1093nContextBindProgramVertex(JNIEnv *_env, jobject _this, RsContext con, jint pf)
1094{
1095    LOG_API("nContextBindProgramVertex, con(%p), pf(%p)", con, (RsProgramVertex)pf);
1096    rsContextBindProgramVertex(con, (RsProgramVertex)pf);
1097}
1098
1099static void
1100nContextBindProgramRaster(JNIEnv *_env, jobject _this, RsContext con, jint pf)
1101{
1102    LOG_API("nContextBindProgramRaster, con(%p), pf(%p)", con, (RsProgramRaster)pf);
1103    rsContextBindProgramRaster(con, (RsProgramRaster)pf);
1104}
1105
1106
1107// ---------------------------------------------------------------------------
1108
1109static jint
1110nSamplerCreate(JNIEnv *_env, jobject _this, RsContext con, jint magFilter, jint minFilter,
1111               jint wrapS, jint wrapT, jint wrapR, jfloat aniso)
1112{
1113    LOG_API("nSamplerCreate, con(%p)", con);
1114    return (jint)rsSamplerCreate(con,
1115                                 (RsSamplerValue)magFilter,
1116                                 (RsSamplerValue)minFilter,
1117                                 (RsSamplerValue)wrapS,
1118                                 (RsSamplerValue)wrapT,
1119                                 (RsSamplerValue)wrapR,
1120                                 aniso);
1121}
1122
1123// ---------------------------------------------------------------------------
1124
1125static jint
1126nMeshCreate(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
1148static jint
1149nMeshGetVertexBufferCount(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
1157static jint
1158nMeshGetIndexCount(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
1166static void
1167nMeshGetVertices(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
1181static void
1182nMeshGetIndices(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
1203static const char *classPathName = "android/renderscript/RenderScript";
1204
1205static 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
1322static int registerFuncs(JNIEnv *_env)
1323{
1324    return android::AndroidRuntime::registerNativeMethods(
1325            _env, classPathName, methods, NELEM(methods));
1326}
1327
1328// ---------------------------------------------------------------------------
1329
1330jint 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        ALOGE("ERROR: GetEnv failed\n");
1337        goto bail;
1338    }
1339    assert(env != NULL);
1340
1341    if (registerFuncs(env) < 0) {
1342        ALOGE("ERROR: MediaPlayer native registration failed\n");
1343        goto bail;
1344    }
1345
1346    /* success -- return valid version number */
1347    result = JNI_VERSION_1_4;
1348
1349bail:
1350    return result;
1351}
1352