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