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