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