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