blob: 200b54b3c3806caced3e12dfd5ea725a7fec2641 [file] [log] [blame]
Jason Samsd19f10d2009-05-22 14:03:28 -07001/*
Stephen Hines4cbe25a2012-01-18 18:46:27 -08002 * Copyright (C) 2011-2012 The Android Open Source Project
Jason Samsd19f10d2009-05-22 14:03:28 -07003 *
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
Jason Samsd1516df2015-05-05 18:00:34 -070017#define LOG_TAG "RenderScript_jni"
Jason Samsf29ca502009-06-23 12:22:47 -070018
Jason Samsd19f10d2009-05-22 14:03:28 -070019#include <stdlib.h>
20#include <stdio.h>
21#include <fcntl.h>
22#include <unistd.h>
23#include <math.h>
Jason Samsd19f10d2009-05-22 14:03:28 -070024#include <utils/misc.h>
Bernhard Rosenkränzer09993f72014-11-17 20:25:28 +010025#include <inttypes.h>
Jason Samsd19f10d2009-05-22 14:03:28 -070026
Mathias Agopianb13b9bd2012-02-17 18:27:36 -080027#include <androidfw/Asset.h>
28#include <androidfw/AssetManager.h>
29#include <androidfw/ResourceTypes.h>
Jason Samsf29ca502009-06-23 12:22:47 -070030
Jason Samsd19f10d2009-05-22 14:03:28 -070031#include "jni.h"
32#include "JNIHelp.h"
33#include "android_runtime/AndroidRuntime.h"
Jim Milleree956052010-08-19 18:56:00 -070034#include "android_runtime/android_view_Surface.h"
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -080035#include "android_runtime/android_util_AssetManager.h"
John Reckf4faeac2015-03-05 13:50:31 -080036#include "android/graphics/GraphicsJNI.h"
Jason Samsd19f10d2009-05-22 14:03:28 -070037
Jason Sams1d6983a2012-02-16 16:07:49 -080038#include <rs.h>
39#include <rsEnv.h>
Jason Samsfb9aa9f2012-03-28 15:30:07 -070040#include <gui/Surface.h>
Andy McFaddend47f7d82012-12-18 09:48:38 -080041#include <gui/GLConsumer.h>
Jason Samsfaa32b32011-06-20 16:58:04 -070042#include <android_runtime/android_graphics_SurfaceTexture.h>
Jason Samsd19f10d2009-05-22 14:03:28 -070043
Steve Block3762c312012-01-06 19:20:56 +000044//#define LOG_API ALOGE
Andreas Gampe67333922014-11-10 20:35:59 -080045static constexpr bool kLogApi = false;
Jason Samsd19f10d2009-05-22 14:03:28 -070046
47using namespace android;
48
Andreas Gampe67333922014-11-10 20:35:59 -080049template <typename... T>
50void UNUSED(T... t) {}
51
Stephen Hines414fa2c2014-04-17 01:02:42 -070052#define PER_ARRAY_TYPE(flag, fnc, readonly, ...) { \
Jason Samse729a942013-11-06 11:22:02 -080053 jint len = 0; \
Chris Wailes488230c32014-08-14 11:22:40 -070054 void *ptr = nullptr; \
Miao Wang87e908d2015-03-02 15:15:15 -080055 void *srcPtr = nullptr; \
Jason Sams21659ac2013-11-06 15:08:07 -080056 size_t typeBytes = 0; \
Stephen Hines414fa2c2014-04-17 01:02:42 -070057 jint relFlag = 0; \
58 if (readonly) { \
59 /* The on-release mode should only be JNI_ABORT for read-only accesses. */ \
Miao Wang87e908d2015-03-02 15:15:15 -080060 /* readonly = true, also indicates we are copying to the allocation . */ \
Stephen Hines414fa2c2014-04-17 01:02:42 -070061 relFlag = JNI_ABORT; \
62 } \
Jason Samse729a942013-11-06 11:22:02 -080063 switch(dataType) { \
64 case RS_TYPE_FLOAT_32: \
65 len = _env->GetArrayLength((jfloatArray)data); \
66 ptr = _env->GetFloatArrayElements((jfloatArray)data, flag); \
Miao Wangba8766c2015-10-12 17:24:13 -070067 if (ptr == nullptr) { \
68 ALOGE("Failed to get Java array elements."); \
69 return; \
70 } \
Jason Sams21659ac2013-11-06 15:08:07 -080071 typeBytes = 4; \
Miao Wang87e908d2015-03-02 15:15:15 -080072 if (usePadding) { \
73 srcPtr = ptr; \
74 len = len / 3 * 4; \
75 if (count == 0) { \
76 count = len / 4; \
77 } \
78 ptr = malloc (len * typeBytes); \
79 if (readonly) { \
80 copyWithPadding(ptr, srcPtr, mSize, count); \
81 fnc(__VA_ARGS__); \
82 } else { \
83 fnc(__VA_ARGS__); \
84 copyWithUnPadding(srcPtr, ptr, mSize, count); \
85 } \
86 free(ptr); \
87 ptr = srcPtr; \
88 } else { \
89 fnc(__VA_ARGS__); \
90 } \
Stephen Hines414fa2c2014-04-17 01:02:42 -070091 _env->ReleaseFloatArrayElements((jfloatArray)data, (jfloat *)ptr, relFlag); \
Jason Samse729a942013-11-06 11:22:02 -080092 return; \
93 case RS_TYPE_FLOAT_64: \
94 len = _env->GetArrayLength((jdoubleArray)data); \
95 ptr = _env->GetDoubleArrayElements((jdoubleArray)data, flag); \
Miao Wangba8766c2015-10-12 17:24:13 -070096 if (ptr == nullptr) { \
97 ALOGE("Failed to get Java array elements."); \
98 return; \
99 } \
Jason Sams21659ac2013-11-06 15:08:07 -0800100 typeBytes = 8; \
Miao Wang87e908d2015-03-02 15:15:15 -0800101 if (usePadding) { \
102 srcPtr = ptr; \
103 len = len / 3 * 4; \
104 if (count == 0) { \
105 count = len / 4; \
106 } \
107 ptr = malloc (len * typeBytes); \
108 if (readonly) { \
109 copyWithPadding(ptr, srcPtr, mSize, count); \
110 fnc(__VA_ARGS__); \
111 } else { \
112 fnc(__VA_ARGS__); \
113 copyWithUnPadding(srcPtr, ptr, mSize, count); \
114 } \
115 free(ptr); \
116 ptr = srcPtr; \
117 } else { \
118 fnc(__VA_ARGS__); \
119 } \
Stephen Hines414fa2c2014-04-17 01:02:42 -0700120 _env->ReleaseDoubleArrayElements((jdoubleArray)data, (jdouble *)ptr, relFlag); \
Jason Samse729a942013-11-06 11:22:02 -0800121 return; \
122 case RS_TYPE_SIGNED_8: \
123 case RS_TYPE_UNSIGNED_8: \
124 len = _env->GetArrayLength((jbyteArray)data); \
125 ptr = _env->GetByteArrayElements((jbyteArray)data, flag); \
Miao Wangba8766c2015-10-12 17:24:13 -0700126 if (ptr == nullptr) { \
127 ALOGE("Failed to get Java array elements."); \
128 return; \
129 } \
Jason Sams21659ac2013-11-06 15:08:07 -0800130 typeBytes = 1; \
Miao Wang87e908d2015-03-02 15:15:15 -0800131 if (usePadding) { \
132 srcPtr = ptr; \
133 len = len / 3 * 4; \
134 if (count == 0) { \
135 count = len / 4; \
136 } \
137 ptr = malloc (len * typeBytes); \
138 if (readonly) { \
139 copyWithPadding(ptr, srcPtr, mSize, count); \
140 fnc(__VA_ARGS__); \
141 } else { \
142 fnc(__VA_ARGS__); \
143 copyWithUnPadding(srcPtr, ptr, mSize, count); \
144 } \
145 free(ptr); \
146 ptr = srcPtr; \
147 } else { \
148 fnc(__VA_ARGS__); \
149 } \
Stephen Hines414fa2c2014-04-17 01:02:42 -0700150 _env->ReleaseByteArrayElements((jbyteArray)data, (jbyte*)ptr, relFlag); \
Jason Samse729a942013-11-06 11:22:02 -0800151 return; \
152 case RS_TYPE_SIGNED_16: \
153 case RS_TYPE_UNSIGNED_16: \
Pirama Arumuga Nainar13332152016-03-01 20:37:19 -0800154 case RS_TYPE_FLOAT_16: \
Jason Samse729a942013-11-06 11:22:02 -0800155 len = _env->GetArrayLength((jshortArray)data); \
156 ptr = _env->GetShortArrayElements((jshortArray)data, flag); \
Miao Wangba8766c2015-10-12 17:24:13 -0700157 if (ptr == nullptr) { \
158 ALOGE("Failed to get Java array elements."); \
159 return; \
160 } \
Jason Sams21659ac2013-11-06 15:08:07 -0800161 typeBytes = 2; \
Miao Wang87e908d2015-03-02 15:15:15 -0800162 if (usePadding) { \
163 srcPtr = ptr; \
164 len = len / 3 * 4; \
165 if (count == 0) { \
166 count = len / 4; \
167 } \
168 ptr = malloc (len * typeBytes); \
169 if (readonly) { \
170 copyWithPadding(ptr, srcPtr, mSize, count); \
171 fnc(__VA_ARGS__); \
172 } else { \
173 fnc(__VA_ARGS__); \
174 copyWithUnPadding(srcPtr, ptr, mSize, count); \
175 } \
176 free(ptr); \
177 ptr = srcPtr; \
178 } else { \
179 fnc(__VA_ARGS__); \
180 } \
Stephen Hines414fa2c2014-04-17 01:02:42 -0700181 _env->ReleaseShortArrayElements((jshortArray)data, (jshort *)ptr, relFlag); \
Jason Samse729a942013-11-06 11:22:02 -0800182 return; \
183 case RS_TYPE_SIGNED_32: \
184 case RS_TYPE_UNSIGNED_32: \
185 len = _env->GetArrayLength((jintArray)data); \
186 ptr = _env->GetIntArrayElements((jintArray)data, flag); \
Miao Wangba8766c2015-10-12 17:24:13 -0700187 if (ptr == nullptr) { \
188 ALOGE("Failed to get Java array elements."); \
189 return; \
190 } \
Jason Sams21659ac2013-11-06 15:08:07 -0800191 typeBytes = 4; \
Miao Wang87e908d2015-03-02 15:15:15 -0800192 if (usePadding) { \
193 srcPtr = ptr; \
194 len = len / 3 * 4; \
195 if (count == 0) { \
196 count = len / 4; \
197 } \
198 ptr = malloc (len * typeBytes); \
199 if (readonly) { \
200 copyWithPadding(ptr, srcPtr, mSize, count); \
201 fnc(__VA_ARGS__); \
202 } else { \
203 fnc(__VA_ARGS__); \
204 copyWithUnPadding(srcPtr, ptr, mSize, count); \
205 } \
206 free(ptr); \
207 ptr = srcPtr; \
208 } else { \
209 fnc(__VA_ARGS__); \
210 } \
Stephen Hines414fa2c2014-04-17 01:02:42 -0700211 _env->ReleaseIntArrayElements((jintArray)data, (jint *)ptr, relFlag); \
Jason Samse729a942013-11-06 11:22:02 -0800212 return; \
213 case RS_TYPE_SIGNED_64: \
214 case RS_TYPE_UNSIGNED_64: \
215 len = _env->GetArrayLength((jlongArray)data); \
216 ptr = _env->GetLongArrayElements((jlongArray)data, flag); \
Miao Wangba8766c2015-10-12 17:24:13 -0700217 if (ptr == nullptr) { \
218 ALOGE("Failed to get Java array elements."); \
219 return; \
220 } \
Jason Sams21659ac2013-11-06 15:08:07 -0800221 typeBytes = 8; \
Miao Wang87e908d2015-03-02 15:15:15 -0800222 if (usePadding) { \
223 srcPtr = ptr; \
224 len = len / 3 * 4; \
225 if (count == 0) { \
226 count = len / 4; \
227 } \
228 ptr = malloc (len * typeBytes); \
229 if (readonly) { \
230 copyWithPadding(ptr, srcPtr, mSize, count); \
231 fnc(__VA_ARGS__); \
232 } else { \
233 fnc(__VA_ARGS__); \
234 copyWithUnPadding(srcPtr, ptr, mSize, count); \
235 } \
236 free(ptr); \
237 ptr = srcPtr; \
238 } else { \
239 fnc(__VA_ARGS__); \
240 } \
Stephen Hines414fa2c2014-04-17 01:02:42 -0700241 _env->ReleaseLongArrayElements((jlongArray)data, (jlong *)ptr, relFlag); \
Jason Samse729a942013-11-06 11:22:02 -0800242 return; \
243 default: \
244 break; \
245 } \
Miao Wang87e908d2015-03-02 15:15:15 -0800246 UNUSED(len, ptr, srcPtr, typeBytes, relFlag); \
Jason Samse729a942013-11-06 11:22:02 -0800247}
248
249
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800250class AutoJavaStringToUTF8 {
251public:
Alex Sakhartchouk2123b462012-02-15 16:21:46 -0800252 AutoJavaStringToUTF8(JNIEnv* env, jstring str) : fEnv(env), fJStr(str) {
Chris Wailes488230c32014-08-14 11:22:40 -0700253 fCStr = env->GetStringUTFChars(str, nullptr);
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800254 fLength = env->GetStringUTFLength(str);
255 }
Alex Sakhartchouk2123b462012-02-15 16:21:46 -0800256 ~AutoJavaStringToUTF8() {
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800257 fEnv->ReleaseStringUTFChars(fJStr, fCStr);
258 }
259 const char* c_str() const { return fCStr; }
260 jsize length() const { return fLength; }
261
262private:
263 JNIEnv* fEnv;
264 jstring fJStr;
265 const char* fCStr;
266 jsize fLength;
267};
268
Alex Sakhartchouk2123b462012-02-15 16:21:46 -0800269class AutoJavaStringArrayToUTF8 {
270public:
271 AutoJavaStringArrayToUTF8(JNIEnv* env, jobjectArray strings, jsize stringsLength)
272 : mEnv(env), mStrings(strings), mStringsLength(stringsLength) {
Chris Wailes488230c32014-08-14 11:22:40 -0700273 mCStrings = nullptr;
274 mSizeArray = nullptr;
Alex Sakhartchouk2123b462012-02-15 16:21:46 -0800275 if (stringsLength > 0) {
276 mCStrings = (const char **)calloc(stringsLength, sizeof(char *));
277 mSizeArray = (size_t*)calloc(stringsLength, sizeof(size_t));
278 for (jsize ct = 0; ct < stringsLength; ct ++) {
279 jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
Chris Wailes488230c32014-08-14 11:22:40 -0700280 mCStrings[ct] = mEnv->GetStringUTFChars(s, nullptr);
Alex Sakhartchouk2123b462012-02-15 16:21:46 -0800281 mSizeArray[ct] = mEnv->GetStringUTFLength(s);
282 }
283 }
284 }
285 ~AutoJavaStringArrayToUTF8() {
286 for (jsize ct=0; ct < mStringsLength; ct++) {
287 jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
288 mEnv->ReleaseStringUTFChars(s, mCStrings[ct]);
289 }
290 free(mCStrings);
291 free(mSizeArray);
292 }
293 const char **c_str() const { return mCStrings; }
294 size_t *c_str_len() const { return mSizeArray; }
295 jsize length() const { return mStringsLength; }
296
297private:
298 JNIEnv *mEnv;
299 jobjectArray mStrings;
300 const char **mCStrings;
301 size_t *mSizeArray;
302 jsize mStringsLength;
303};
304
Jason Samsd19f10d2009-05-22 14:03:28 -0700305// ---------------------------------------------------------------------------
306
Jason Samsffe9f482009-06-01 17:45:53 -0700307static jfieldID gContextId = 0;
Jason Samsd19f10d2009-05-22 14:03:28 -0700308
309static void _nInit(JNIEnv *_env, jclass _this)
310{
Tim Murrayeff663f2013-11-15 13:08:30 -0800311 gContextId = _env->GetFieldID(_this, "mContext", "J");
Jason Samsd19f10d2009-05-22 14:03:28 -0700312}
313
Jason Samsd19f10d2009-05-22 14:03:28 -0700314// ---------------------------------------------------------------------------
315
Miao Wang87e908d2015-03-02 15:15:15 -0800316static void copyWithPadding(void* ptr, void* srcPtr, int mSize, int count) {
317 int sizeBytesPad = mSize * 4;
318 int sizeBytes = mSize * 3;
319 uint8_t *dst = static_cast<uint8_t *>(ptr);
320 uint8_t *src = static_cast<uint8_t *>(srcPtr);
321 for (int i = 0; i < count; i++) {
322 memcpy(dst, src, sizeBytes);
323 dst += sizeBytesPad;
324 src += sizeBytes;
325 }
326}
327
328static void copyWithUnPadding(void* ptr, void* srcPtr, int mSize, int count) {
329 int sizeBytesPad = mSize * 4;
330 int sizeBytes = mSize * 3;
331 uint8_t *dst = static_cast<uint8_t *>(ptr);
332 uint8_t *src = static_cast<uint8_t *>(srcPtr);
333 for (int i = 0; i < count; i++) {
334 memcpy(dst, src, sizeBytes);
335 dst += sizeBytes;
336 src += sizeBytesPad;
337 }
338}
339
340
341// ---------------------------------------------------------------------------
Jason Sams3eaa3382009-06-10 15:04:38 -0700342static void
Tim Murrayeff663f2013-11-15 13:08:30 -0800343nContextFinish(JNIEnv *_env, jobject _this, jlong con)
Jason Sams96ed4cf2010-06-15 12:15:57 -0700344{
Andreas Gampe67333922014-11-10 20:35:59 -0800345 if (kLogApi) {
346 ALOGD("nContextFinish, con(%p)", (RsContext)con);
347 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800348 rsContextFinish((RsContext)con);
Jason Sams96ed4cf2010-06-15 12:15:57 -0700349}
350
Yang Ni281c3252014-10-24 08:52:24 -0700351static jlong
352nClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong kernelID,
353 jlong returnValue, jlongArray fieldIDArray,
354 jlongArray valueArray, jintArray sizeArray,
355 jlongArray depClosureArray, jlongArray depFieldIDArray) {
Yang Ni17c2d7a2015-04-30 16:13:54 -0700356 jlong ret = 0;
357
Yang Ni281c3252014-10-24 08:52:24 -0700358 jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
359 jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
Miao Wangba8766c2015-10-12 17:24:13 -0700360 if (jFieldIDs == nullptr) {
361 ALOGE("Failed to get Java array elements: fieldIDs.");
362 return ret;
363 }
364
Yang Ni281c3252014-10-24 08:52:24 -0700365 jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
366 jsize values_length = _env->GetArrayLength(valueArray);
Miao Wangba8766c2015-10-12 17:24:13 -0700367 if (jValues == nullptr) {
368 ALOGE("Failed to get Java array elements: values.");
369 return ret;
370 }
371
Yang Ni17c2d7a2015-04-30 16:13:54 -0700372 jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
Yang Ni281c3252014-10-24 08:52:24 -0700373 jsize sizes_length = _env->GetArrayLength(sizeArray);
Miao Wangba8766c2015-10-12 17:24:13 -0700374 if (jSizes == nullptr) {
375 ALOGE("Failed to get Java array elements: sizes.");
376 return ret;
377 }
378
Yang Ni281c3252014-10-24 08:52:24 -0700379 jlong* jDepClosures =
380 _env->GetLongArrayElements(depClosureArray, nullptr);
381 jsize depClosures_length = _env->GetArrayLength(depClosureArray);
Miao Wangba8766c2015-10-12 17:24:13 -0700382 if (jDepClosures == nullptr) {
383 ALOGE("Failed to get Java array elements: depClosures.");
384 return ret;
385 }
386
Yang Ni281c3252014-10-24 08:52:24 -0700387 jlong* jDepFieldIDs =
388 _env->GetLongArrayElements(depFieldIDArray, nullptr);
389 jsize depFieldIDs_length = _env->GetArrayLength(depFieldIDArray);
Miao Wangba8766c2015-10-12 17:24:13 -0700390 if (jDepFieldIDs == nullptr) {
391 ALOGE("Failed to get Java array elements: depFieldIDs.");
392 return ret;
393 }
Yang Ni17c2d7a2015-04-30 16:13:54 -0700394
395 size_t numValues, numDependencies;
396 RsScriptFieldID* fieldIDs;
Yang Ni17c2d7a2015-04-30 16:13:54 -0700397 RsClosure* depClosures;
398 RsScriptFieldID* depFieldIDs;
399
400 if (fieldIDs_length != values_length || values_length != sizes_length) {
401 ALOGE("Unmatched field IDs, values, and sizes in closure creation.");
402 goto exit;
403 }
404
405 numValues = (size_t)fieldIDs_length;
406
407 if (depClosures_length != depFieldIDs_length) {
408 ALOGE("Unmatched closures and field IDs for dependencies in closure creation.");
409 goto exit;
410 }
411
412 numDependencies = (size_t)depClosures_length;
413
414 if (numDependencies > numValues) {
415 ALOGE("Unexpected number of dependencies in closure creation");
416 goto exit;
417 }
418
Yang Ni7b2a46f2015-05-05 12:41:19 -0700419 if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
Yang Ni17c2d7a2015-04-30 16:13:54 -0700420 ALOGE("Too many arguments or globals in closure creation");
421 goto exit;
422 }
423
Yang Ni86c5c2d2016-03-25 15:49:07 -0700424 if (numValues > 0) {
425 fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
426 if (fieldIDs == nullptr) {
427 goto exit;
428 }
429 } else {
430 // numValues == 0
431 // alloca(0) implementation is platform-dependent.
432 fieldIDs = nullptr;
Yang Ni17c2d7a2015-04-30 16:13:54 -0700433 }
434
435 for (size_t i = 0; i < numValues; i++) {
436 fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
437 }
438
Yang Ni86c5c2d2016-03-25 15:49:07 -0700439 if (numDependencies > 0) {
440 depClosures = (RsClosure*)alloca(sizeof(RsClosure) * numDependencies);
441 if (depClosures == nullptr) {
442 goto exit;
443 }
Yang Ni17c2d7a2015-04-30 16:13:54 -0700444
Yang Ni86c5c2d2016-03-25 15:49:07 -0700445 for (size_t i = 0; i < numDependencies; i++) {
446 depClosures[i] = (RsClosure)jDepClosures[i];
447 }
Yang Ni17c2d7a2015-04-30 16:13:54 -0700448
Yang Ni86c5c2d2016-03-25 15:49:07 -0700449 depFieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numDependencies);
450 if (depFieldIDs == nullptr) {
451 goto exit;
452 }
Yang Ni17c2d7a2015-04-30 16:13:54 -0700453
Yang Ni86c5c2d2016-03-25 15:49:07 -0700454 for (size_t i = 0; i < numDependencies; i++) {
455 depFieldIDs[i] = (RsClosure)jDepFieldIDs[i];
456 }
457 } else {
458 // alloca(0) implementation is platform-dependent.
459 depClosures = nullptr;
460 depFieldIDs = nullptr;
Yang Ni281c3252014-10-24 08:52:24 -0700461 }
462
Yang Ni17c2d7a2015-04-30 16:13:54 -0700463 ret = (jlong)(uintptr_t)rsClosureCreate(
Yang Ni281c3252014-10-24 08:52:24 -0700464 (RsContext)con, (RsScriptKernelID)kernelID, (RsAllocation)returnValue,
Yang Ni263cc902015-11-10 13:27:04 -0800465 fieldIDs, numValues, jValues, numValues,
Yang Ni17c2d7a2015-04-30 16:13:54 -0700466 (int*)jSizes, numValues,
467 depClosures, numDependencies,
468 depFieldIDs, numDependencies);
469
470exit:
471
472 _env->ReleaseLongArrayElements(depFieldIDArray, jDepFieldIDs, JNI_ABORT);
473 _env->ReleaseLongArrayElements(depClosureArray, jDepClosures, JNI_ABORT);
474 _env->ReleaseIntArrayElements (sizeArray, jSizes, JNI_ABORT);
475 _env->ReleaseLongArrayElements(valueArray, jValues, JNI_ABORT);
476 _env->ReleaseLongArrayElements(fieldIDArray, jFieldIDs, JNI_ABORT);
477
478 return ret;
Yang Ni281c3252014-10-24 08:52:24 -0700479}
480
Yang Nibe392ad2015-01-23 17:16:02 -0800481static jlong
482nInvokeClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong invokeID,
483 jbyteArray paramArray, jlongArray fieldIDArray, jlongArray valueArray,
484 jintArray sizeArray) {
Yang Ni17c2d7a2015-04-30 16:13:54 -0700485 jlong ret = 0;
486
Yang Nibe392ad2015-01-23 17:16:02 -0800487 jbyte* jParams = _env->GetByteArrayElements(paramArray, nullptr);
488 jsize jParamLength = _env->GetArrayLength(paramArray);
Miao Wangba8766c2015-10-12 17:24:13 -0700489 if (jParams == nullptr) {
490 ALOGE("Failed to get Java array elements: params.");
491 return ret;
492 }
493
Yang Nibe392ad2015-01-23 17:16:02 -0800494 jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
495 jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
Miao Wangba8766c2015-10-12 17:24:13 -0700496 if (jFieldIDs == nullptr) {
497 ALOGE("Failed to get Java array elements: fieldIDs.");
498 return ret;
499 }
500
Yang Ni17c2d7a2015-04-30 16:13:54 -0700501 jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
502 jsize values_length = _env->GetArrayLength(valueArray);
Miao Wangba8766c2015-10-12 17:24:13 -0700503 if (jValues == nullptr) {
504 ALOGE("Failed to get Java array elements: values.");
505 return ret;
506 }
507
Yang Ni17c2d7a2015-04-30 16:13:54 -0700508 jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
509 jsize sizes_length = _env->GetArrayLength(sizeArray);
Miao Wangba8766c2015-10-12 17:24:13 -0700510 if (jSizes == nullptr) {
511 ALOGE("Failed to get Java array elements: sizes.");
512 return ret;
513 }
Yang Ni17c2d7a2015-04-30 16:13:54 -0700514
515 size_t numValues;
516 RsScriptFieldID* fieldIDs;
Yang Ni17c2d7a2015-04-30 16:13:54 -0700517
518 if (fieldIDs_length != values_length || values_length != sizes_length) {
519 ALOGE("Unmatched field IDs, values, and sizes in closure creation.");
520 goto exit;
521 }
522
523 numValues = (size_t) fieldIDs_length;
524
Yang Ni7b2a46f2015-05-05 12:41:19 -0700525 if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
Yang Ni17c2d7a2015-04-30 16:13:54 -0700526 ALOGE("Too many arguments or globals in closure creation");
527 goto exit;
528 }
529
530 fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
531 if (fieldIDs == nullptr) {
532 goto exit;
533 }
534
535 for (size_t i = 0; i< numValues; i++) {
Yang Nibe392ad2015-01-23 17:16:02 -0800536 fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
537 }
538
Yang Ni17c2d7a2015-04-30 16:13:54 -0700539 ret = (jlong)(uintptr_t)rsInvokeClosureCreate(
Yang Nibe392ad2015-01-23 17:16:02 -0800540 (RsContext)con, (RsScriptInvokeID)invokeID, jParams, jParamLength,
Yang Ni263cc902015-11-10 13:27:04 -0800541 fieldIDs, numValues, jValues, numValues,
Yang Ni17c2d7a2015-04-30 16:13:54 -0700542 (int*)jSizes, numValues);
543
544exit:
545
546 _env->ReleaseIntArrayElements (sizeArray, jSizes, JNI_ABORT);
547 _env->ReleaseLongArrayElements(valueArray, jValues, JNI_ABORT);
548 _env->ReleaseLongArrayElements(fieldIDArray, jFieldIDs, JNI_ABORT);
549 _env->ReleaseByteArrayElements(paramArray, jParams, JNI_ABORT);
550
551 return ret;
Yang Nibe392ad2015-01-23 17:16:02 -0800552}
553
Yang Ni281c3252014-10-24 08:52:24 -0700554static void
555nClosureSetArg(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
556 jint index, jlong value, jint size) {
Yang Ni263cc902015-11-10 13:27:04 -0800557 // Size is signed with -1 indicating the value is an Allocation
Yang Ni281c3252014-10-24 08:52:24 -0700558 rsClosureSetArg((RsContext)con, (RsClosure)closureID, (uint32_t)index,
Yang Ni263cc902015-11-10 13:27:04 -0800559 (uintptr_t)value, size);
Yang Ni281c3252014-10-24 08:52:24 -0700560}
561
562static void
563nClosureSetGlobal(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
564 jlong fieldID, jlong value, jint size) {
Yang Ni263cc902015-11-10 13:27:04 -0800565 // Size is signed with -1 indicating the value is an Allocation
Yang Ni281c3252014-10-24 08:52:24 -0700566 rsClosureSetGlobal((RsContext)con, (RsClosure)closureID,
Yang Ni263cc902015-11-10 13:27:04 -0800567 (RsScriptFieldID)fieldID, (int64_t)value, size);
Yang Ni281c3252014-10-24 08:52:24 -0700568}
569
570static long
Yang Ni35be56c2015-04-02 17:47:56 -0700571nScriptGroup2Create(JNIEnv *_env, jobject _this, jlong con, jstring name,
Yang Niebf63402015-01-16 11:06:26 -0800572 jstring cacheDir, jlongArray closureArray) {
Yang Ni17c2d7a2015-04-30 16:13:54 -0700573 jlong ret = 0;
574
Yang Ni35be56c2015-04-02 17:47:56 -0700575 AutoJavaStringToUTF8 nameUTF(_env, name);
Yang Niebf63402015-01-16 11:06:26 -0800576 AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
577
Yang Ni281c3252014-10-24 08:52:24 -0700578 jlong* jClosures = _env->GetLongArrayElements(closureArray, nullptr);
579 jsize numClosures = _env->GetArrayLength(closureArray);
Miao Wangba8766c2015-10-12 17:24:13 -0700580 if (jClosures == nullptr) {
581 ALOGE("Failed to get Java array elements: closures.");
582 return ret;
583 }
Yang Ni17c2d7a2015-04-30 16:13:54 -0700584
585 RsClosure* closures;
586
Yang Ni7b2a46f2015-05-05 12:41:19 -0700587 if (numClosures > (jsize) RS_SCRIPT_GROUP_MAX_NUMBER_CLOSURES) {
Yang Ni17c2d7a2015-04-30 16:13:54 -0700588 ALOGE("Too many closures in script group");
589 goto exit;
590 }
591
592 closures = (RsClosure*)alloca(sizeof(RsClosure) * numClosures);
593 if (closures == nullptr) {
594 goto exit;
595 }
596
Yang Ni281c3252014-10-24 08:52:24 -0700597 for (int i = 0; i < numClosures; i++) {
598 closures[i] = (RsClosure)jClosures[i];
599 }
600
Yang Ni17c2d7a2015-04-30 16:13:54 -0700601 ret = (jlong)(uintptr_t)rsScriptGroup2Create(
Yang Ni35be56c2015-04-02 17:47:56 -0700602 (RsContext)con, nameUTF.c_str(), nameUTF.length(),
603 cacheDirUTF.c_str(), cacheDirUTF.length(),
Yang Niebf63402015-01-16 11:06:26 -0800604 closures, numClosures);
Yang Ni17c2d7a2015-04-30 16:13:54 -0700605
606exit:
607
608 _env->ReleaseLongArrayElements(closureArray, jClosures, JNI_ABORT);
609
610 return ret;
Yang Ni281c3252014-10-24 08:52:24 -0700611}
612
613static void
614nScriptGroup2Execute(JNIEnv *_env, jobject _this, jlong con, jlong groupID) {
615 rsScriptGroupExecute((RsContext)con, (RsScriptGroup2)groupID);
616}
617
Jason Sams96ed4cf2010-06-15 12:15:57 -0700618static void
Tim Murray25207df2015-01-12 16:47:56 -0800619nScriptIntrinsicBLAS_Single(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
620 jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
621 jfloat alpha, jlong A, jlong B, jfloat beta, jlong C, jint incX, jint incY,
622 jint KL, jint KU) {
623 RsBlasCall call;
624 memset(&call, 0, sizeof(call));
625 call.func = (RsBlasFunction)func;
626 call.transA = (RsBlasTranspose)TransA;
627 call.transB = (RsBlasTranspose)TransB;
628 call.side = (RsBlasSide)Side;
629 call.uplo = (RsBlasUplo)Uplo;
630 call.diag = (RsBlasDiag)Diag;
631 call.M = M;
632 call.N = N;
633 call.K = K;
634 call.alpha.f = alpha;
635 call.beta.f = beta;
636 call.incX = incX;
637 call.incY = incY;
638 call.KL = KL;
639 call.KU = KU;
640
641 RsAllocation in_allocs[3];
642 in_allocs[0] = (RsAllocation)A;
643 in_allocs[1] = (RsAllocation)B;
644 in_allocs[2] = (RsAllocation)C;
645
646 rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
647 in_allocs, sizeof(in_allocs), nullptr,
648 &call, sizeof(call), nullptr, 0);
649}
650
651static void
652nScriptIntrinsicBLAS_Double(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
653 jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
654 jdouble alpha, jlong A, jlong B, jdouble beta, jlong C, jint incX, jint incY,
655 jint KL, jint KU) {
656 RsBlasCall call;
657 memset(&call, 0, sizeof(call));
658 call.func = (RsBlasFunction)func;
659 call.transA = (RsBlasTranspose)TransA;
660 call.transB = (RsBlasTranspose)TransB;
661 call.side = (RsBlasSide)Side;
662 call.uplo = (RsBlasUplo)Uplo;
663 call.diag = (RsBlasDiag)Diag;
664 call.M = M;
665 call.N = N;
666 call.K = K;
667 call.alpha.d = alpha;
668 call.beta.d = beta;
669 call.incX = incX;
670 call.incY = incY;
671 call.KL = KL;
672 call.KU = KU;
673
674 RsAllocation in_allocs[3];
675 in_allocs[0] = (RsAllocation)A;
676 in_allocs[1] = (RsAllocation)B;
677 in_allocs[2] = (RsAllocation)C;
678
679 rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
Miao Wang0b34f2a2015-09-30 15:38:07 -0700680 in_allocs, NELEM(in_allocs), nullptr,
Tim Murray25207df2015-01-12 16:47:56 -0800681 &call, sizeof(call), nullptr, 0);
682}
683
684static void
685nScriptIntrinsicBLAS_Complex(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
686 jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
687 jfloat alphaX, jfloat alphaY, jlong A, jlong B, jfloat betaX,
688 jfloat betaY, jlong C, jint incX, jint incY, jint KL, jint KU) {
689 RsBlasCall call;
690 memset(&call, 0, sizeof(call));
691 call.func = (RsBlasFunction)func;
692 call.transA = (RsBlasTranspose)TransA;
693 call.transB = (RsBlasTranspose)TransB;
694 call.side = (RsBlasSide)Side;
695 call.uplo = (RsBlasUplo)Uplo;
696 call.diag = (RsBlasDiag)Diag;
697 call.M = M;
698 call.N = N;
699 call.K = K;
700 call.alpha.c.r = alphaX;
701 call.alpha.c.i = alphaY;
702 call.beta.c.r = betaX;
Miao Wang82585b32015-04-30 13:44:49 -0700703 call.beta.c.i = betaY;
Tim Murray25207df2015-01-12 16:47:56 -0800704 call.incX = incX;
705 call.incY = incY;
706 call.KL = KL;
707 call.KU = KU;
708
709 RsAllocation in_allocs[3];
710 in_allocs[0] = (RsAllocation)A;
711 in_allocs[1] = (RsAllocation)B;
712 in_allocs[2] = (RsAllocation)C;
713
714 rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
Miao Wang0b34f2a2015-09-30 15:38:07 -0700715 in_allocs, NELEM(in_allocs), nullptr,
Tim Murray25207df2015-01-12 16:47:56 -0800716 &call, sizeof(call), nullptr, 0);
717}
718
719static void
720nScriptIntrinsicBLAS_Z(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
721 jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
722 jdouble alphaX, jdouble alphaY, jlong A, jlong B, jdouble betaX,
723 jdouble betaY, jlong C, jint incX, jint incY, jint KL, jint KU) {
724 RsBlasCall call;
725 memset(&call, 0, sizeof(call));
726 call.func = (RsBlasFunction)func;
727 call.transA = (RsBlasTranspose)TransA;
728 call.transB = (RsBlasTranspose)TransB;
729 call.side = (RsBlasSide)Side;
730 call.uplo = (RsBlasUplo)Uplo;
731 call.diag = (RsBlasDiag)Diag;
732 call.M = M;
733 call.N = N;
734 call.K = K;
735 call.alpha.z.r = alphaX;
736 call.alpha.z.i = alphaY;
737 call.beta.z.r = betaX;
Miao Wang82585b32015-04-30 13:44:49 -0700738 call.beta.z.i = betaY;
Tim Murray25207df2015-01-12 16:47:56 -0800739 call.incX = incX;
740 call.incY = incY;
741 call.KL = KL;
742 call.KU = KU;
743
744 RsAllocation in_allocs[3];
745 in_allocs[0] = (RsAllocation)A;
746 in_allocs[1] = (RsAllocation)B;
747 in_allocs[2] = (RsAllocation)C;
748
749 rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
Miao Wang0b34f2a2015-09-30 15:38:07 -0700750 in_allocs, NELEM(in_allocs), nullptr,
Tim Murray25207df2015-01-12 16:47:56 -0800751 &call, sizeof(call), nullptr, 0);
752}
753
754
755static void
Tim Murray9cb16a22015-04-01 11:07:16 -0700756nScriptIntrinsicBLAS_BNNM(JNIEnv *_env, jobject _this, jlong con, jlong id, jint M, jint N, jint K,
757 jlong A, jint a_offset, jlong B, jint b_offset, jlong C, jint c_offset,
758 jint c_mult_int) {
759 RsBlasCall call;
760 memset(&call, 0, sizeof(call));
761 call.func = RsBlas_bnnm;
762 call.M = M;
763 call.N = N;
764 call.K = K;
Miao Wang25148062015-06-29 17:43:03 -0700765 call.a_offset = a_offset & 0xFF;
766 call.b_offset = b_offset & 0xFF;
Tim Murray9cb16a22015-04-01 11:07:16 -0700767 call.c_offset = c_offset;
768 call.c_mult_int = c_mult_int;
769
770 RsAllocation in_allocs[3];
771 in_allocs[0] = (RsAllocation)A;
772 in_allocs[1] = (RsAllocation)B;
773 in_allocs[2] = (RsAllocation)C;
774
775 rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
Miao Wang0b34f2a2015-09-30 15:38:07 -0700776 in_allocs, NELEM(in_allocs), nullptr,
Tim Murray9cb16a22015-04-01 11:07:16 -0700777 &call, sizeof(call), nullptr, 0);
778}
779
780
781static void
Tim Murray460a0492013-11-19 12:45:54 -0800782nAssignName(JNIEnv *_env, jobject _this, jlong con, jlong obj, jbyteArray str)
Jason Sams3eaa3382009-06-10 15:04:38 -0700783{
Andreas Gampe67333922014-11-10 20:35:59 -0800784 if (kLogApi) {
785 ALOGD("nAssignName, con(%p), obj(%p)", (RsContext)con, (void *)obj);
786 }
Jason Sams3eaa3382009-06-10 15:04:38 -0700787 jint len = _env->GetArrayLength(str);
788 jbyte * cptr = (jbyte *) _env->GetPrimitiveArrayCritical(str, 0);
Miao Wangba8766c2015-10-12 17:24:13 -0700789 if (cptr == nullptr) {
790 ALOGE("Failed to get Java array elements");
791 return;
792 }
793
Tim Murrayeff663f2013-11-15 13:08:30 -0800794 rsAssignName((RsContext)con, (void *)obj, (const char *)cptr, len);
Jason Sams3eaa3382009-06-10 15:04:38 -0700795 _env->ReleasePrimitiveArrayCritical(str, cptr, JNI_ABORT);
796}
797
Alex Sakhartchoukfb10c162010-08-04 14:45:48 -0700798static jstring
Tim Murray460a0492013-11-19 12:45:54 -0800799nGetName(JNIEnv *_env, jobject _this, jlong con, jlong obj)
Alex Sakhartchoukfb10c162010-08-04 14:45:48 -0700800{
Andreas Gampe67333922014-11-10 20:35:59 -0800801 if (kLogApi) {
802 ALOGD("nGetName, con(%p), obj(%p)", (RsContext)con, (void *)obj);
803 }
Chris Wailes488230c32014-08-14 11:22:40 -0700804 const char *name = nullptr;
Tim Murrayeff663f2013-11-15 13:08:30 -0800805 rsaGetName((RsContext)con, (void *)obj, &name);
Chris Wailes488230c32014-08-14 11:22:40 -0700806 if(name == nullptr || strlen(name) == 0) {
807 return nullptr;
Alex Sakhartchouk581cc642010-10-27 14:10:07 -0700808 }
Alex Sakhartchoukfb10c162010-08-04 14:45:48 -0700809 return _env->NewStringUTF(name);
810}
811
Jason Sams7ce033d2009-08-18 14:14:24 -0700812static void
Tim Murray460a0492013-11-19 12:45:54 -0800813nObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj)
Jason Sams7ce033d2009-08-18 14:14:24 -0700814{
Andreas Gampe67333922014-11-10 20:35:59 -0800815 if (kLogApi) {
816 ALOGD("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj);
817 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800818 rsObjDestroy((RsContext)con, (void *)obj);
Jason Sams7ce033d2009-08-18 14:14:24 -0700819}
820
Jason Sams3eaa3382009-06-10 15:04:38 -0700821// ---------------------------------------------------------------------------
822
Tim Murrayeff663f2013-11-15 13:08:30 -0800823static jlong
Jason Samsd19f10d2009-05-22 14:03:28 -0700824nDeviceCreate(JNIEnv *_env, jobject _this)
825{
Andreas Gampe67333922014-11-10 20:35:59 -0800826 if (kLogApi) {
827 ALOGD("nDeviceCreate");
828 }
Tim Murray3aa89c12014-08-18 17:51:22 -0700829 return (jlong)(uintptr_t)rsDeviceCreate();
Jason Samsd19f10d2009-05-22 14:03:28 -0700830}
831
832static void
Tim Murray5eaf4682014-01-10 11:25:52 -0800833nDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev)
Jason Samsd19f10d2009-05-22 14:03:28 -0700834{
Andreas Gampe67333922014-11-10 20:35:59 -0800835 if (kLogApi) {
836 ALOGD("nDeviceDestroy");
837 }
Jason Samsd19f10d2009-05-22 14:03:28 -0700838 return rsDeviceDestroy((RsDevice)dev);
839}
840
Jason Samsebfb4362009-09-23 13:57:02 -0700841static void
Tim Murray5eaf4682014-01-10 11:25:52 -0800842nDeviceSetConfig(JNIEnv *_env, jobject _this, jlong dev, jint p, jint value)
Jason Samsebfb4362009-09-23 13:57:02 -0700843{
Andreas Gampe67333922014-11-10 20:35:59 -0800844 if (kLogApi) {
845 ALOGD("nDeviceSetConfig dev(%p), param(%i), value(%i)", (void *)dev, p, value);
846 }
Jason Samsebfb4362009-09-23 13:57:02 -0700847 return rsDeviceSetConfig((RsDevice)dev, (RsDeviceParam)p, value);
848}
849
Tim Murrayeff663f2013-11-15 13:08:30 -0800850static jlong
Jason Sams81cd2b12014-12-02 12:36:43 -0800851nContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint flags, jint sdkVer, jint contextType)
Jason Samsd19f10d2009-05-22 14:03:28 -0700852{
Andreas Gampe67333922014-11-10 20:35:59 -0800853 if (kLogApi) {
854 ALOGD("nContextCreate");
855 }
Jason Sams81cd2b12014-12-02 12:36:43 -0800856 return (jlong)(uintptr_t)rsContextCreate((RsDevice)dev, 0, sdkVer, (RsContextType)contextType, flags);
Jason Sams704ff642010-02-09 16:05:07 -0800857}
858
Tim Murrayeff663f2013-11-15 13:08:30 -0800859static jlong
Tim Murray5eaf4682014-01-10 11:25:52 -0800860nContextCreateGL(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer,
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000861 jint colorMin, jint colorPref,
862 jint alphaMin, jint alphaPref,
863 jint depthMin, jint depthPref,
864 jint stencilMin, jint stencilPref,
865 jint samplesMin, jint samplesPref, jfloat samplesQ,
866 jint dpi)
Jason Sams704ff642010-02-09 16:05:07 -0800867{
Yang Ni86c5c2d2016-03-25 15:49:07 -0700868 RsSurfaceConfig sc = {};
Jason Sams11c8af92010-10-13 15:31:10 -0700869 sc.alphaMin = alphaMin;
870 sc.alphaPref = alphaPref;
871 sc.colorMin = colorMin;
872 sc.colorPref = colorPref;
873 sc.depthMin = depthMin;
874 sc.depthPref = depthPref;
875 sc.samplesMin = samplesMin;
876 sc.samplesPref = samplesPref;
877 sc.samplesQ = samplesQ;
878
Andreas Gampe67333922014-11-10 20:35:59 -0800879 if (kLogApi) {
880 ALOGD("nContextCreateGL");
881 }
Tim Murray3aa89c12014-08-18 17:51:22 -0700882 return (jlong)(uintptr_t)rsContextCreateGL((RsDevice)dev, ver, sdkVer, sc, dpi);
Jason Samsd19f10d2009-05-22 14:03:28 -0700883}
884
885static void
Tim Murrayeff663f2013-11-15 13:08:30 -0800886nContextSetPriority(JNIEnv *_env, jobject _this, jlong con, jint p)
Jason Sams7d787b42009-11-15 12:14:26 -0800887{
Andreas Gampe67333922014-11-10 20:35:59 -0800888 if (kLogApi) {
889 ALOGD("ContextSetPriority, con(%p), priority(%i)", (RsContext)con, p);
890 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800891 rsContextSetPriority((RsContext)con, p);
Jason Sams7d787b42009-11-15 12:14:26 -0800892}
893
Tim Murray47f31582015-04-07 15:43:24 -0700894static void
895nContextSetCacheDir(JNIEnv *_env, jobject _this, jlong con, jstring cacheDir)
896{
897 AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
898
899 if (kLogApi) {
900 ALOGD("ContextSetCacheDir, con(%p), cacheDir(%s)", (RsContext)con, cacheDirUTF.c_str());
901 }
902 rsContextSetCacheDir((RsContext)con, cacheDirUTF.c_str(), cacheDirUTF.length());
903}
904
Jason Sams7d787b42009-11-15 12:14:26 -0800905
906
907static void
Tim Murrayeff663f2013-11-15 13:08:30 -0800908nContextSetSurface(JNIEnv *_env, jobject _this, jlong con, jint width, jint height, jobject wnd)
Jason Samsefd9b6fb2009-11-03 13:58:36 -0800909{
Andreas Gampe67333922014-11-10 20:35:59 -0800910 if (kLogApi) {
911 ALOGD("nContextSetSurface, con(%p), width(%i), height(%i), surface(%p)", (RsContext)con,
912 width, height, (Surface *)wnd);
913 }
Jason Samsefd9b6fb2009-11-03 13:58:36 -0800914
Chris Wailes488230c32014-08-14 11:22:40 -0700915 ANativeWindow * window = nullptr;
916 if (wnd == nullptr) {
Jason Samsefd9b6fb2009-11-03 13:58:36 -0800917
918 } else {
Jeff Brown64a55af2012-08-26 02:47:39 -0700919 window = android_view_Surface_getNativeWindow(_env, wnd).get();
Jason Samsefd9b6fb2009-11-03 13:58:36 -0800920 }
921
Tim Murrayeff663f2013-11-15 13:08:30 -0800922 rsContextSetSurface((RsContext)con, width, height, window);
Jason Samsefd9b6fb2009-11-03 13:58:36 -0800923}
924
925static void
Tim Murrayeff663f2013-11-15 13:08:30 -0800926nContextDestroy(JNIEnv *_env, jobject _this, jlong con)
Jason Samsd19f10d2009-05-22 14:03:28 -0700927{
Andreas Gampe67333922014-11-10 20:35:59 -0800928 if (kLogApi) {
929 ALOGD("nContextDestroy, con(%p)", (RsContext)con);
930 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800931 rsContextDestroy((RsContext)con);
Jason Samsd19f10d2009-05-22 14:03:28 -0700932}
933
Jason Sams715333b2009-11-17 17:26:46 -0800934static void
Tim Murrayeff663f2013-11-15 13:08:30 -0800935nContextDump(JNIEnv *_env, jobject _this, jlong con, jint bits)
Jason Sams715333b2009-11-17 17:26:46 -0800936{
Andreas Gampe67333922014-11-10 20:35:59 -0800937 if (kLogApi) {
938 ALOGD("nContextDump, con(%p) bits(%i)", (RsContext)con, bits);
939 }
Jason Sams715333b2009-11-17 17:26:46 -0800940 rsContextDump((RsContext)con, bits);
941}
Jason Samsd19f10d2009-05-22 14:03:28 -0700942
943static void
Tim Murrayeff663f2013-11-15 13:08:30 -0800944nContextPause(JNIEnv *_env, jobject _this, jlong con)
Jason Sams65e7aa52009-09-24 17:38:20 -0700945{
Andreas Gampe67333922014-11-10 20:35:59 -0800946 if (kLogApi) {
947 ALOGD("nContextPause, con(%p)", (RsContext)con);
948 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800949 rsContextPause((RsContext)con);
Jason Sams65e7aa52009-09-24 17:38:20 -0700950}
951
952static void
Tim Murrayeff663f2013-11-15 13:08:30 -0800953nContextResume(JNIEnv *_env, jobject _this, jlong con)
Jason Sams65e7aa52009-09-24 17:38:20 -0700954{
Andreas Gampe67333922014-11-10 20:35:59 -0800955 if (kLogApi) {
956 ALOGD("nContextResume, con(%p)", (RsContext)con);
957 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800958 rsContextResume((RsContext)con);
Jason Sams65e7aa52009-09-24 17:38:20 -0700959}
960
Jason Sams1c415172010-11-08 17:06:46 -0800961
962static jstring
Tim Murrayeff663f2013-11-15 13:08:30 -0800963nContextGetErrorMessage(JNIEnv *_env, jobject _this, jlong con)
Jason Sams1c415172010-11-08 17:06:46 -0800964{
Andreas Gampe67333922014-11-10 20:35:59 -0800965 if (kLogApi) {
966 ALOGD("nContextGetErrorMessage, con(%p)", (RsContext)con);
967 }
Jason Sams1c415172010-11-08 17:06:46 -0800968 char buf[1024];
969
970 size_t receiveLen;
971 uint32_t subID;
Tim Murrayeff663f2013-11-15 13:08:30 -0800972 int id = rsContextGetMessage((RsContext)con,
Jason Sams65bdaf12011-04-26 14:50:00 -0700973 buf, sizeof(buf),
974 &receiveLen, sizeof(receiveLen),
Jason Samsedbfabd2011-05-17 15:01:29 -0700975 &subID, sizeof(subID));
Jason Sams1c415172010-11-08 17:06:46 -0800976 if (!id && receiveLen) {
Bernhard Rosenkränzer09993f72014-11-17 20:25:28 +0100977 ALOGV("message receive buffer too small. %zu", receiveLen);
Jason Sams1c415172010-11-08 17:06:46 -0800978 }
979 return _env->NewStringUTF(buf);
980}
981
Jason Samsedbfabd2011-05-17 15:01:29 -0700982static jint
Tim Murrayeff663f2013-11-15 13:08:30 -0800983nContextGetUserMessage(JNIEnv *_env, jobject _this, jlong con, jintArray data)
Jason Sams516c3192009-10-06 13:58:47 -0700984{
Jason Sams516c3192009-10-06 13:58:47 -0700985 jint len = _env->GetArrayLength(data);
Andreas Gampe67333922014-11-10 20:35:59 -0800986 if (kLogApi) {
987 ALOGD("nContextGetMessage, con(%p), len(%i)", (RsContext)con, len);
988 }
Chris Wailes488230c32014-08-14 11:22:40 -0700989 jint *ptr = _env->GetIntArrayElements(data, nullptr);
Miao Wangba8766c2015-10-12 17:24:13 -0700990 if (ptr == nullptr) {
991 ALOGE("Failed to get Java array elements");
992 return 0;
993 }
Jason Sams516c3192009-10-06 13:58:47 -0700994 size_t receiveLen;
Jason Sams1c415172010-11-08 17:06:46 -0800995 uint32_t subID;
Tim Murrayeff663f2013-11-15 13:08:30 -0800996 int id = rsContextGetMessage((RsContext)con,
Jason Sams65bdaf12011-04-26 14:50:00 -0700997 ptr, len * 4,
998 &receiveLen, sizeof(receiveLen),
Jason Samsedbfabd2011-05-17 15:01:29 -0700999 &subID, sizeof(subID));
Jason Sams516c3192009-10-06 13:58:47 -07001000 if (!id && receiveLen) {
Bernhard Rosenkränzer09993f72014-11-17 20:25:28 +01001001 ALOGV("message receive buffer too small. %zu", receiveLen);
Jason Sams516c3192009-10-06 13:58:47 -07001002 }
1003 _env->ReleaseIntArrayElements(data, ptr, 0);
Ashok Bhat0e0c0882014-02-04 14:57:58 +00001004 return (jint)id;
Jason Sams1c415172010-11-08 17:06:46 -08001005}
1006
1007static jint
Tim Murrayeff663f2013-11-15 13:08:30 -08001008nContextPeekMessage(JNIEnv *_env, jobject _this, jlong con, jintArray auxData)
Jason Sams1c415172010-11-08 17:06:46 -08001009{
Andreas Gampe67333922014-11-10 20:35:59 -08001010 if (kLogApi) {
1011 ALOGD("nContextPeekMessage, con(%p)", (RsContext)con);
1012 }
Chris Wailes488230c32014-08-14 11:22:40 -07001013 jint *auxDataPtr = _env->GetIntArrayElements(auxData, nullptr);
Miao Wangba8766c2015-10-12 17:24:13 -07001014 if (auxDataPtr == nullptr) {
1015 ALOGE("Failed to get Java array elements");
1016 return 0;
1017 }
Jason Sams1c415172010-11-08 17:06:46 -08001018 size_t receiveLen;
1019 uint32_t subID;
Tim Murrayeff663f2013-11-15 13:08:30 -08001020 int id = rsContextPeekMessage((RsContext)con, &receiveLen, sizeof(receiveLen),
Jason Samsedbfabd2011-05-17 15:01:29 -07001021 &subID, sizeof(subID));
Jason Sams1c415172010-11-08 17:06:46 -08001022 auxDataPtr[0] = (jint)subID;
1023 auxDataPtr[1] = (jint)receiveLen;
1024 _env->ReleaseIntArrayElements(auxData, auxDataPtr, 0);
Ashok Bhat0e0c0882014-02-04 14:57:58 +00001025 return (jint)id;
Jason Sams516c3192009-10-06 13:58:47 -07001026}
1027
Tim Murrayeff663f2013-11-15 13:08:30 -08001028static void nContextInitToClient(JNIEnv *_env, jobject _this, jlong con)
Jason Sams516c3192009-10-06 13:58:47 -07001029{
Andreas Gampe67333922014-11-10 20:35:59 -08001030 if (kLogApi) {
1031 ALOGD("nContextInitToClient, con(%p)", (RsContext)con);
1032 }
Tim Murrayeff663f2013-11-15 13:08:30 -08001033 rsContextInitToClient((RsContext)con);
Jason Sams516c3192009-10-06 13:58:47 -07001034}
1035
Tim Murrayeff663f2013-11-15 13:08:30 -08001036static void nContextDeinitToClient(JNIEnv *_env, jobject _this, jlong con)
Jason Sams516c3192009-10-06 13:58:47 -07001037{
Andreas Gampe67333922014-11-10 20:35:59 -08001038 if (kLogApi) {
1039 ALOGD("nContextDeinitToClient, con(%p)", (RsContext)con);
1040 }
Tim Murrayeff663f2013-11-15 13:08:30 -08001041 rsContextDeinitToClient((RsContext)con);
Jason Sams516c3192009-10-06 13:58:47 -07001042}
1043
Jason Sams455d6442013-02-05 19:20:18 -08001044static void
Tim Murrayeff663f2013-11-15 13:08:30 -08001045nContextSendMessage(JNIEnv *_env, jobject _this, jlong con, jint id, jintArray data)
Jason Sams455d6442013-02-05 19:20:18 -08001046{
Chris Wailes488230c32014-08-14 11:22:40 -07001047 jint *ptr = nullptr;
Jason Sams455d6442013-02-05 19:20:18 -08001048 jint len = 0;
1049 if (data) {
1050 len = _env->GetArrayLength(data);
Stephen Hines4a043c12014-08-21 23:20:32 -07001051 ptr = _env->GetIntArrayElements(data, nullptr);
Miao Wangba8766c2015-10-12 17:24:13 -07001052 if (ptr == nullptr) {
1053 ALOGE("Failed to get Java array elements");
1054 return;
1055 }
Jason Sams455d6442013-02-05 19:20:18 -08001056 }
Andreas Gampe67333922014-11-10 20:35:59 -08001057 if (kLogApi) {
1058 ALOGD("nContextSendMessage, con(%p), id(%i), len(%i)", (RsContext)con, id, len);
1059 }
Tim Murrayeff663f2013-11-15 13:08:30 -08001060 rsContextSendMessage((RsContext)con, id, (const uint8_t *)ptr, len * sizeof(int));
Jason Sams455d6442013-02-05 19:20:18 -08001061 if (data) {
1062 _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
1063 }
1064}
1065
1066
Jason Sams516c3192009-10-06 13:58:47 -07001067
Tim Murray460a0492013-11-19 12:45:54 -08001068static jlong
Andreas Gampe67333922014-11-10 20:35:59 -08001069nElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind, jboolean norm,
1070 jint size)
Jason Samsd19f10d2009-05-22 14:03:28 -07001071{
Andreas Gampe67333922014-11-10 20:35:59 -08001072 if (kLogApi) {
Bernhard Rosenkränzer09993f72014-11-17 20:25:28 +01001073 ALOGD("nElementCreate, con(%p), type(%" PRId64 "), kind(%i), norm(%i), size(%i)", (RsContext)con,
Andreas Gampe67333922014-11-10 20:35:59 -08001074 type, kind, norm, size);
1075 }
1076 return (jlong)(uintptr_t)rsElementCreate((RsContext)con, (RsDataType)type, (RsDataKind)kind,
Yang Ni8c8daea2016-03-08 21:01:54 +00001077 norm, size);
Jason Samsd19f10d2009-05-22 14:03:28 -07001078}
1079
Tim Murray460a0492013-11-19 12:45:54 -08001080static jlong
Tim Murrayeff663f2013-11-15 13:08:30 -08001081nElementCreate2(JNIEnv *_env, jobject _this, jlong con,
Ashok Bhat98071552014-02-12 09:54:43 +00001082 jlongArray _ids, jobjectArray _names, jintArray _arraySizes)
Jason Samsd19f10d2009-05-22 14:03:28 -07001083{
Jason Sams718cd1f2009-12-23 14:35:29 -08001084 int fieldCount = _env->GetArrayLength(_ids);
Andreas Gampe67333922014-11-10 20:35:59 -08001085 if (kLogApi) {
1086 ALOGD("nElementCreate2, con(%p)", (RsContext)con);
1087 }
Jason Sams718cd1f2009-12-23 14:35:29 -08001088
Chris Wailes488230c32014-08-14 11:22:40 -07001089 jlong *jIds = _env->GetLongArrayElements(_ids, nullptr);
Miao Wangba8766c2015-10-12 17:24:13 -07001090 if (jIds == nullptr) {
1091 ALOGE("Failed to get Java array elements: ids");
1092 return 0;
1093 }
Chris Wailes488230c32014-08-14 11:22:40 -07001094 jint *jArraySizes = _env->GetIntArrayElements(_arraySizes, nullptr);
Miao Wangba8766c2015-10-12 17:24:13 -07001095 if (jArraySizes == nullptr) {
1096 ALOGE("Failed to get Java array elements: arraySizes");
1097 return 0;
1098 }
Ashok Bhat98071552014-02-12 09:54:43 +00001099
1100 RsElement *ids = (RsElement*)malloc(fieldCount * sizeof(RsElement));
1101 uint32_t *arraySizes = (uint32_t *)malloc(fieldCount * sizeof(uint32_t));
1102
1103 for(int i = 0; i < fieldCount; i ++) {
1104 ids[i] = (RsElement)jIds[i];
1105 arraySizes[i] = (uint32_t)jArraySizes[i];
1106 }
Jason Sams718cd1f2009-12-23 14:35:29 -08001107
Alex Sakhartchouk2123b462012-02-15 16:21:46 -08001108 AutoJavaStringArrayToUTF8 names(_env, _names, fieldCount);
1109
1110 const char **nameArray = names.c_str();
1111 size_t *sizeArray = names.c_str_len();
1112
Tim Murray3aa89c12014-08-18 17:51:22 -07001113 jlong id = (jlong)(uintptr_t)rsElementCreate2((RsContext)con,
Ashok Bhat98071552014-02-12 09:54:43 +00001114 (const RsElement *)ids, fieldCount,
Jason Sams7a22e102011-05-06 14:14:30 -07001115 nameArray, fieldCount * sizeof(size_t), sizeArray,
Yang Ni8c8daea2016-03-08 21:01:54 +00001116 (const uint32_t *)arraySizes, fieldCount);
Alex Sakhartchouk2123b462012-02-15 16:21:46 -08001117
Ashok Bhat98071552014-02-12 09:54:43 +00001118 free(ids);
1119 free(arraySizes);
1120 _env->ReleaseLongArrayElements(_ids, jIds, JNI_ABORT);
1121 _env->ReleaseIntArrayElements(_arraySizes, jArraySizes, JNI_ABORT);
1122
Tim Murray3aa89c12014-08-18 17:51:22 -07001123 return (jlong)(uintptr_t)id;
Jason Samsd19f10d2009-05-22 14:03:28 -07001124}
1125
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001126static void
Tim Murray460a0492013-11-19 12:45:54 -08001127nElementGetNativeData(JNIEnv *_env, jobject _this, jlong con, jlong id, jintArray _elementData)
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001128{
1129 int dataSize = _env->GetArrayLength(_elementData);
Andreas Gampe67333922014-11-10 20:35:59 -08001130 if (kLogApi) {
1131 ALOGD("nElementGetNativeData, con(%p)", (RsContext)con);
1132 }
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001133
1134 // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
1135 assert(dataSize == 5);
1136
Narayan Kamath78c0ce52014-03-19 10:15:51 +00001137 uintptr_t elementData[5];
Tim Murrayeff663f2013-11-15 13:08:30 -08001138 rsaElementGetNativeData((RsContext)con, (RsElement)id, elementData, dataSize);
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001139
1140 for(jint i = 0; i < dataSize; i ++) {
Ashok Bhat98071552014-02-12 09:54:43 +00001141 const jint data = (jint)elementData[i];
1142 _env->SetIntArrayRegion(_elementData, i, 1, &data);
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001143 }
1144}
1145
1146
1147static void
Tim Murray460a0492013-11-19 12:45:54 -08001148nElementGetSubElements(JNIEnv *_env, jobject _this, jlong con, jlong id,
Ashok Bhat98071552014-02-12 09:54:43 +00001149 jlongArray _IDs,
Alex Sakhartchouk7d5f5e72011-10-18 11:08:31 -07001150 jobjectArray _names,
1151 jintArray _arraySizes)
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001152{
Ashok Bhat98071552014-02-12 09:54:43 +00001153 uint32_t dataSize = _env->GetArrayLength(_IDs);
Andreas Gampe67333922014-11-10 20:35:59 -08001154 if (kLogApi) {
1155 ALOGD("nElementGetSubElements, con(%p)", (RsContext)con);
1156 }
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001157
Ashok Bhat98071552014-02-12 09:54:43 +00001158 uintptr_t *ids = (uintptr_t*)malloc(dataSize * sizeof(uintptr_t));
1159 const char **names = (const char **)malloc(dataSize * sizeof(const char *));
Narayan Kamath78c0ce52014-03-19 10:15:51 +00001160 uint32_t *arraySizes = (uint32_t *)malloc(dataSize * sizeof(uint32_t));
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001161
Andreas Gampe67333922014-11-10 20:35:59 -08001162 rsaElementGetSubElements((RsContext)con, (RsElement)id, ids, names, arraySizes,
1163 (uint32_t)dataSize);
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001164
Ashok Bhat98071552014-02-12 09:54:43 +00001165 for(uint32_t i = 0; i < dataSize; i++) {
Tim Murray3aa89c12014-08-18 17:51:22 -07001166 const jlong id = (jlong)(uintptr_t)ids[i];
Ashok Bhat98071552014-02-12 09:54:43 +00001167 const jint arraySize = (jint)arraySizes[i];
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001168 _env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i]));
Ashok Bhat98071552014-02-12 09:54:43 +00001169 _env->SetLongArrayRegion(_IDs, i, 1, &id);
1170 _env->SetIntArrayRegion(_arraySizes, i, 1, &arraySize);
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001171 }
1172
1173 free(ids);
1174 free(names);
Alex Sakhartchouk7d5f5e72011-10-18 11:08:31 -07001175 free(arraySizes);
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001176}
1177
Jason Samsd19f10d2009-05-22 14:03:28 -07001178// -----------------------------------
1179
Tim Murray460a0492013-11-19 12:45:54 -08001180static jlong
1181nTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid,
Jason Samsb109cc72013-01-07 18:20:12 -08001182 jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv)
Jason Samsd19f10d2009-05-22 14:03:28 -07001183{
Andreas Gampe67333922014-11-10 20:35:59 -08001184 if (kLogApi) {
1185 ALOGD("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)",
Bernhard Rosenkränzer09993f72014-11-17 20:25:28 +01001186 (RsContext)con, (void*)eid, dimx, dimy, dimz, mips, faces, yuv);
Andreas Gampe67333922014-11-10 20:35:59 -08001187 }
Jason Sams3b9c52a2010-10-14 17:48:46 -07001188
Andreas Gampe67333922014-11-10 20:35:59 -08001189 return (jlong)(uintptr_t)rsTypeCreate((RsContext)con, (RsElement)eid, dimx, dimy, dimz, mips,
Yang Ni8c8daea2016-03-08 21:01:54 +00001190 faces, yuv);
Jason Samsd19f10d2009-05-22 14:03:28 -07001191}
1192
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001193static void
Ashok Bhat98071552014-02-12 09:54:43 +00001194nTypeGetNativeData(JNIEnv *_env, jobject _this, jlong con, jlong id, jlongArray _typeData)
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001195{
1196 // We are packing 6 items: mDimX; mDimY; mDimZ;
1197 // mDimLOD; mDimFaces; mElement; into typeData
1198 int elementCount = _env->GetArrayLength(_typeData);
1199
1200 assert(elementCount == 6);
Andreas Gampe67333922014-11-10 20:35:59 -08001201 if (kLogApi) {
1202 ALOGD("nTypeGetNativeData, con(%p)", (RsContext)con);
1203 }
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001204
Ashok Bhat98071552014-02-12 09:54:43 +00001205 uintptr_t typeData[6];
Tim Murrayeff663f2013-11-15 13:08:30 -08001206 rsaTypeGetNativeData((RsContext)con, (RsType)id, typeData, 6);
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001207
1208 for(jint i = 0; i < elementCount; i ++) {
Tim Murray3aa89c12014-08-18 17:51:22 -07001209 const jlong data = (jlong)(uintptr_t)typeData[i];
Ashok Bhat98071552014-02-12 09:54:43 +00001210 _env->SetLongArrayRegion(_typeData, i, 1, &data);
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001211 }
1212}
1213
Jason Samsd19f10d2009-05-22 14:03:28 -07001214// -----------------------------------
1215
Tim Murray460a0492013-11-19 12:45:54 -08001216static jlong
Andreas Gampe67333922014-11-10 20:35:59 -08001217nAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mips, jint usage,
1218 jlong pointer)
Jason Samsd19f10d2009-05-22 14:03:28 -07001219{
Andreas Gampe67333922014-11-10 20:35:59 -08001220 if (kLogApi) {
1221 ALOGD("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)",
1222 (RsContext)con, (RsElement)type, mips, usage, (void *)pointer);
1223 }
1224 return (jlong)(uintptr_t) rsAllocationCreateTyped((RsContext)con, (RsType)type,
1225 (RsAllocationMipmapControl)mips,
Yang Ni8c8daea2016-03-08 21:01:54 +00001226 (uint32_t)usage, (uintptr_t)pointer);
Jason Samsd19f10d2009-05-22 14:03:28 -07001227}
1228
Jason Samsd19f10d2009-05-22 14:03:28 -07001229static void
Tim Murray460a0492013-11-19 12:45:54 -08001230nAllocationSyncAll(JNIEnv *_env, jobject _this, jlong con, jlong a, jint bits)
Jason Sams5476b452010-12-08 16:14:36 -08001231{
Andreas Gampe67333922014-11-10 20:35:59 -08001232 if (kLogApi) {
1233 ALOGD("nAllocationSyncAll, con(%p), a(%p), bits(0x%08x)", (RsContext)con, (RsAllocation)a,
1234 bits);
1235 }
Tim Murrayeff663f2013-11-15 13:08:30 -08001236 rsAllocationSyncAll((RsContext)con, (RsAllocation)a, (RsAllocationUsageType)bits);
Jason Sams5476b452010-12-08 16:14:36 -08001237}
1238
Miao Wang8c150922015-10-26 17:44:10 -07001239static void
1240nAllocationSetupBufferQueue(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint numAlloc)
1241{
1242 if (kLogApi) {
1243 ALOGD("nAllocationSetupBufferQueue, con(%p), alloc(%p), numAlloc(%d)", (RsContext)con,
1244 (RsAllocation)alloc, numAlloc);
1245 }
1246 rsAllocationSetupBufferQueue((RsContext)con, (RsAllocation)alloc, (uint32_t)numAlloc);
1247}
1248
1249static void
1250nAllocationShareBufferQueue(JNIEnv *_env, jobject _this, jlong con, jlong alloc1, jlong alloc2)
1251{
1252 if (kLogApi) {
1253 ALOGD("nAllocationShareBufferQueue, con(%p), alloc1(%p), alloc2(%p)", (RsContext)con,
1254 (RsAllocation)alloc1, (RsAllocation)alloc2);
1255 }
1256
1257 rsAllocationShareBufferQueue((RsContext)con, (RsAllocation)alloc1, (RsAllocation)alloc2);
1258}
1259
Jason Sams72226e02013-02-22 12:45:54 -08001260static jobject
Tim Murray460a0492013-11-19 12:45:54 -08001261nAllocationGetSurface(JNIEnv *_env, jobject _this, jlong con, jlong a)
Jason Sams615e7ce2012-01-13 14:01:20 -08001262{
Andreas Gampe67333922014-11-10 20:35:59 -08001263 if (kLogApi) {
1264 ALOGD("nAllocationGetSurface, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
1265 }
Jason Sams615e7ce2012-01-13 14:01:20 -08001266
Andreas Gampe67333922014-11-10 20:35:59 -08001267 IGraphicBufferProducer *v = (IGraphicBufferProducer *)rsAllocationGetSurface((RsContext)con,
1268 (RsAllocation)a);
Jason Sams72226e02013-02-22 12:45:54 -08001269 sp<IGraphicBufferProducer> bp = v;
Chris Wailes488230c32014-08-14 11:22:40 -07001270 v->decStrong(nullptr);
Jason Samsfe1d5ff2012-03-23 11:47:26 -07001271
Jason Sams72226e02013-02-22 12:45:54 -08001272 jobject o = android_view_Surface_createFromIGraphicBufferProducer(_env, bp);
1273 return o;
Jason Samsfe1d5ff2012-03-23 11:47:26 -07001274}
1275
1276static void
Tim Murray460a0492013-11-19 12:45:54 -08001277nAllocationSetSurface(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject sur)
Jason Sams163766c2012-02-15 12:04:24 -08001278{
Andreas Gampe67333922014-11-10 20:35:59 -08001279 if (kLogApi) {
1280 ALOGD("nAllocationSetSurface, con(%p), alloc(%p), surface(%p)", (RsContext)con,
1281 (RsAllocation)alloc, (Surface *)sur);
1282 }
Jason Sams163766c2012-02-15 12:04:24 -08001283
Jason Samsfb9aa9f2012-03-28 15:30:07 -07001284 sp<Surface> s;
Jason Sams163766c2012-02-15 12:04:24 -08001285 if (sur != 0) {
Jeff Brown64a55af2012-08-26 02:47:39 -07001286 s = android_view_Surface_getSurface(_env, sur);
Jason Sams163766c2012-02-15 12:04:24 -08001287 }
1288
Andreas Gampe67333922014-11-10 20:35:59 -08001289 rsAllocationSetSurface((RsContext)con, (RsAllocation)alloc,
1290 static_cast<ANativeWindow *>(s.get()));
Jason Sams163766c2012-02-15 12:04:24 -08001291}
1292
1293static void
Tim Murray460a0492013-11-19 12:45:54 -08001294nAllocationIoSend(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
Jason Sams163766c2012-02-15 12:04:24 -08001295{
Andreas Gampe67333922014-11-10 20:35:59 -08001296 if (kLogApi) {
Bernhard Rosenkränzer09993f72014-11-17 20:25:28 +01001297 ALOGD("nAllocationIoSend, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
Andreas Gampe67333922014-11-10 20:35:59 -08001298 }
Tim Murray460a0492013-11-19 12:45:54 -08001299 rsAllocationIoSend((RsContext)con, (RsAllocation)alloc);
Jason Sams163766c2012-02-15 12:04:24 -08001300}
1301
Miao Wang8c150922015-10-26 17:44:10 -07001302static jlong
Tim Murray460a0492013-11-19 12:45:54 -08001303nAllocationIoReceive(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
Jason Sams163766c2012-02-15 12:04:24 -08001304{
Andreas Gampe67333922014-11-10 20:35:59 -08001305 if (kLogApi) {
Bernhard Rosenkränzer09993f72014-11-17 20:25:28 +01001306 ALOGD("nAllocationIoReceive, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
Andreas Gampe67333922014-11-10 20:35:59 -08001307 }
Miao Wang8c150922015-10-26 17:44:10 -07001308 return (jlong) rsAllocationIoReceive((RsContext)con, (RsAllocation)alloc);
Jason Sams163766c2012-02-15 12:04:24 -08001309}
1310
Jason Sams163766c2012-02-15 12:04:24 -08001311static void
Tim Murray460a0492013-11-19 12:45:54 -08001312nAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
Jason Samsf7086092011-01-12 13:28:37 -08001313{
Andreas Gampe67333922014-11-10 20:35:59 -08001314 if (kLogApi) {
1315 ALOGD("nAllocationGenerateMipmaps, con(%p), a(%p)", (RsContext)con, (RsAllocation)alloc);
1316 }
Tim Murrayeff663f2013-11-15 13:08:30 -08001317 rsAllocationGenerateMipmaps((RsContext)con, (RsAllocation)alloc);
Jason Samsf7086092011-01-12 13:28:37 -08001318}
1319
Tim Murray460a0492013-11-19 12:45:54 -08001320static jlong
Andreas Gampe67333922014-11-10 20:35:59 -08001321nAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,
1322 jobject jbitmap, jint usage)
Jason Samsffe9f482009-06-01 17:45:53 -07001323{
John Recked207b92015-04-10 13:52:57 -07001324 SkBitmap bitmap;
1325 GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
Jason Samsffe9f482009-06-01 17:45:53 -07001326
Jason Sams5476b452010-12-08 16:14:36 -08001327 bitmap.lockPixels();
1328 const void* ptr = bitmap.getPixels();
Tim Murray3aa89c12014-08-18 17:51:22 -07001329 jlong id = (jlong)(uintptr_t)rsAllocationCreateFromBitmap((RsContext)con,
Jason Sams65bdaf12011-04-26 14:50:00 -07001330 (RsType)type, (RsAllocationMipmapControl)mip,
Yang Ni8c8daea2016-03-08 21:01:54 +00001331 ptr, bitmap.getSize(), usage);
Jason Sams5476b452010-12-08 16:14:36 -08001332 bitmap.unlockPixels();
1333 return id;
Jason Samsffe9f482009-06-01 17:45:53 -07001334}
Jason Samsfe08d992009-05-27 14:45:32 -07001335
Tim Murray460a0492013-11-19 12:45:54 -08001336static jlong
Andreas Gampe67333922014-11-10 20:35:59 -08001337nAllocationCreateBitmapBackedAllocation(JNIEnv *_env, jobject _this, jlong con, jlong type,
1338 jint mip, jobject jbitmap, jint usage)
Tim Murraya3145512012-12-04 17:59:29 -08001339{
John Recked207b92015-04-10 13:52:57 -07001340 SkBitmap bitmap;
1341 GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
Tim Murraya3145512012-12-04 17:59:29 -08001342
1343 bitmap.lockPixels();
1344 const void* ptr = bitmap.getPixels();
Tim Murray3aa89c12014-08-18 17:51:22 -07001345 jlong id = (jlong)(uintptr_t)rsAllocationCreateTyped((RsContext)con,
Tim Murraya3145512012-12-04 17:59:29 -08001346 (RsType)type, (RsAllocationMipmapControl)mip,
Yang Ni8c8daea2016-03-08 21:01:54 +00001347 (uint32_t)usage, (uintptr_t)ptr);
Tim Murraya3145512012-12-04 17:59:29 -08001348 bitmap.unlockPixels();
1349 return id;
1350}
1351
Tim Murray460a0492013-11-19 12:45:54 -08001352static jlong
Andreas Gampe67333922014-11-10 20:35:59 -08001353nAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,
1354 jobject jbitmap, jint usage)
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -08001355{
John Recked207b92015-04-10 13:52:57 -07001356 SkBitmap bitmap;
1357 GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -08001358
Jason Sams5476b452010-12-08 16:14:36 -08001359 bitmap.lockPixels();
1360 const void* ptr = bitmap.getPixels();
Tim Murray3aa89c12014-08-18 17:51:22 -07001361 jlong id = (jlong)(uintptr_t)rsAllocationCubeCreateFromBitmap((RsContext)con,
Jason Sams65bdaf12011-04-26 14:50:00 -07001362 (RsType)type, (RsAllocationMipmapControl)mip,
Yang Ni8c8daea2016-03-08 21:01:54 +00001363 ptr, bitmap.getSize(), usage);
Jason Sams5476b452010-12-08 16:14:36 -08001364 bitmap.unlockPixels();
1365 return id;
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -08001366}
1367
Alex Sakhartchouk26ae3902010-10-11 12:35:15 -07001368static void
Tim Murray460a0492013-11-19 12:45:54 -08001369nAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
Alex Sakhartchouk26ae3902010-10-11 12:35:15 -07001370{
John Recked207b92015-04-10 13:52:57 -07001371 SkBitmap bitmap;
1372 GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
Jason Samsf7086092011-01-12 13:28:37 -08001373 int w = bitmap.width();
1374 int h = bitmap.height();
Alex Sakhartchouk26ae3902010-10-11 12:35:15 -07001375
Jason Sams4ef66502010-12-10 16:03:15 -08001376 bitmap.lockPixels();
1377 const void* ptr = bitmap.getPixels();
Tim Murrayeff663f2013-11-15 13:08:30 -08001378 rsAllocation2DData((RsContext)con, (RsAllocation)alloc, 0, 0,
Alex Sakhartchouk304b1f52011-06-14 11:13:19 -07001379 0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X,
Tim Murray38faea32012-11-27 14:55:08 -08001380 w, h, ptr, bitmap.getSize(), 0);
Jason Sams4ef66502010-12-10 16:03:15 -08001381 bitmap.unlockPixels();
1382}
1383
1384static void
Tim Murray460a0492013-11-19 12:45:54 -08001385nAllocationCopyToBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
Jason Sams4ef66502010-12-10 16:03:15 -08001386{
John Recked207b92015-04-10 13:52:57 -07001387 SkBitmap bitmap;
1388 GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
Jason Sams4ef66502010-12-10 16:03:15 -08001389
1390 bitmap.lockPixels();
1391 void* ptr = bitmap.getPixels();
Tim Murrayeff663f2013-11-15 13:08:30 -08001392 rsAllocationCopyToBitmap((RsContext)con, (RsAllocation)alloc, ptr, bitmap.getSize());
Jason Sams4ef66502010-12-10 16:03:15 -08001393 bitmap.unlockPixels();
Alex Sakhartchouk835b8542011-07-20 14:33:10 -07001394 bitmap.notifyPixelsChanged();
Alex Sakhartchouk26ae3902010-10-11 12:35:15 -07001395}
1396
Stephen Hines414fa2c2014-04-17 01:02:42 -07001397// Copies from the Java object data into the Allocation pointed to by _alloc.
Jason Samsd19f10d2009-05-22 14:03:28 -07001398static void
Tim Murray460a0492013-11-19 12:45:54 -08001399nAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
Miao Wang87e908d2015-03-02 15:15:15 -08001400 jint count, jobject data, jint sizeBytes, jint dataType, jint mSize,
1401 jboolean usePadding)
Jason Samsd19f10d2009-05-22 14:03:28 -07001402{
Jason Samse729a942013-11-06 11:22:02 -08001403 RsAllocation *alloc = (RsAllocation *)_alloc;
Andreas Gampe67333922014-11-10 20:35:59 -08001404 if (kLogApi) {
1405 ALOGD("nAllocation1DData, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
1406 "dataType(%i)", (RsContext)con, (RsAllocation)alloc, offset, count, sizeBytes,
1407 dataType);
1408 }
Miao Wang87e908d2015-03-02 15:15:15 -08001409 PER_ARRAY_TYPE(nullptr, rsAllocation1DData, true,
1410 (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
Jason Samsd19f10d2009-05-22 14:03:28 -07001411}
1412
1413static void
Miao Wangc8e237e2015-02-20 18:36:32 -08001414nAllocationElementData(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
1415 jint xoff, jint yoff, jint zoff,
1416 jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
Jason Sams49bdaf02010-08-31 13:50:42 -07001417{
Andreas Gampe67333922014-11-10 20:35:59 -08001418 if (kLogApi) {
Yang Ni86c5c2d2016-03-25 15:49:07 -07001419 jint len = _env->GetArrayLength(data);
Miao Wangc8e237e2015-02-20 18:36:32 -08001420 ALOGD("nAllocationElementData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
1421 "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
Andreas Gampe67333922014-11-10 20:35:59 -08001422 sizeBytes);
1423 }
Chris Wailes488230c32014-08-14 11:22:40 -07001424 jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
Miao Wangba8766c2015-10-12 17:24:13 -07001425 if (ptr == nullptr) {
1426 ALOGE("Failed to get Java array elements");
1427 return;
1428 }
Miao Wangc8e237e2015-02-20 18:36:32 -08001429 rsAllocationElementData((RsContext)con, (RsAllocation)alloc,
1430 xoff, yoff, zoff,
1431 lod, ptr, sizeBytes, compIdx);
Jason Sams49bdaf02010-08-31 13:50:42 -07001432 _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1433}
1434
Miao Wangc8e237e2015-02-20 18:36:32 -08001435
Stephen Hines414fa2c2014-04-17 01:02:42 -07001436// Copies from the Java object data into the Allocation pointed to by _alloc.
Jason Sams49bdaf02010-08-31 13:50:42 -07001437static void
Tim Murray460a0492013-11-19 12:45:54 -08001438nAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
Miao Wang87e908d2015-03-02 15:15:15 -08001439 jint w, jint h, jobject data, jint sizeBytes, jint dataType, jint mSize,
1440 jboolean usePadding)
Jason Samsfb9f82c2011-01-12 14:53:25 -08001441{
Jason Samse729a942013-11-06 11:22:02 -08001442 RsAllocation *alloc = (RsAllocation *)_alloc;
1443 RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
Andreas Gampe67333922014-11-10 20:35:59 -08001444 if (kLogApi) {
1445 ALOGD("nAllocation2DData, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
1446 "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
1447 }
Miao Wang87e908d2015-03-02 15:15:15 -08001448 int count = w * h;
1449 PER_ARRAY_TYPE(nullptr, rsAllocation2DData, true,
1450 (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
Jason Samsd19f10d2009-05-22 14:03:28 -07001451}
1452
Stephen Hines414fa2c2014-04-17 01:02:42 -07001453// Copies from the Allocation pointed to by srcAlloc into the Allocation
1454// pointed to by dstAlloc.
Jason Sams40a29e82009-08-10 14:55:26 -07001455static void
Tim Murrayeff663f2013-11-15 13:08:30 -08001456nAllocationData2D_alloc(JNIEnv *_env, jobject _this, jlong con,
Tim Murray460a0492013-11-19 12:45:54 -08001457 jlong dstAlloc, jint dstXoff, jint dstYoff,
Alex Sakhartchouk304b1f52011-06-14 11:13:19 -07001458 jint dstMip, jint dstFace,
1459 jint width, jint height,
Tim Murray460a0492013-11-19 12:45:54 -08001460 jlong srcAlloc, jint srcXoff, jint srcYoff,
Alex Sakhartchouk304b1f52011-06-14 11:13:19 -07001461 jint srcMip, jint srcFace)
1462{
Andreas Gampe67333922014-11-10 20:35:59 -08001463 if (kLogApi) {
1464 ALOGD("nAllocation2DData_s, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
1465 " dstMip(%i), dstFace(%i), width(%i), height(%i),"
1466 " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i), srcFace(%i)",
1467 (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
1468 width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
1469 }
Alex Sakhartchouk304b1f52011-06-14 11:13:19 -07001470
Tim Murrayeff663f2013-11-15 13:08:30 -08001471 rsAllocationCopy2DRange((RsContext)con,
Alex Sakhartchouk304b1f52011-06-14 11:13:19 -07001472 (RsAllocation)dstAlloc,
1473 dstXoff, dstYoff,
1474 dstMip, dstFace,
1475 width, height,
1476 (RsAllocation)srcAlloc,
1477 srcXoff, srcYoff,
1478 srcMip, srcFace);
1479}
1480
Stephen Hines414fa2c2014-04-17 01:02:42 -07001481// Copies from the Java object data into the Allocation pointed to by _alloc.
Alex Sakhartchouk304b1f52011-06-14 11:13:19 -07001482static void
Tim Murray460a0492013-11-19 12:45:54 -08001483nAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
Miao Wang87e908d2015-03-02 15:15:15 -08001484 jint w, jint h, jint d, jobject data, jint sizeBytes, jint dataType,
1485 jint mSize, jboolean usePadding)
Jason Samsb05d6892013-04-09 15:59:24 -07001486{
Jason Samse729a942013-11-06 11:22:02 -08001487 RsAllocation *alloc = (RsAllocation *)_alloc;
Andreas Gampe67333922014-11-10 20:35:59 -08001488 if (kLogApi) {
1489 ALOGD("nAllocation3DData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
1490 " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
1491 lod, w, h, d, sizeBytes);
1492 }
Miao Wang87e908d2015-03-02 15:15:15 -08001493 int count = w * h * d;
1494 PER_ARRAY_TYPE(nullptr, rsAllocation3DData, true,
1495 (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
Jason Samsb05d6892013-04-09 15:59:24 -07001496}
1497
Stephen Hines414fa2c2014-04-17 01:02:42 -07001498// Copies from the Allocation pointed to by srcAlloc into the Allocation
1499// pointed to by dstAlloc.
Jason Samsb05d6892013-04-09 15:59:24 -07001500static void
Tim Murrayeff663f2013-11-15 13:08:30 -08001501nAllocationData3D_alloc(JNIEnv *_env, jobject _this, jlong con,
Tim Murray460a0492013-11-19 12:45:54 -08001502 jlong dstAlloc, jint dstXoff, jint dstYoff, jint dstZoff,
Jason Samsb05d6892013-04-09 15:59:24 -07001503 jint dstMip,
1504 jint width, jint height, jint depth,
Tim Murray460a0492013-11-19 12:45:54 -08001505 jlong srcAlloc, jint srcXoff, jint srcYoff, jint srcZoff,
Jason Samsb05d6892013-04-09 15:59:24 -07001506 jint srcMip)
1507{
Andreas Gampe67333922014-11-10 20:35:59 -08001508 if (kLogApi) {
1509 ALOGD("nAllocationData3D_alloc, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
1510 " dstMip(%i), width(%i), height(%i),"
1511 " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i)",
1512 (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip,
1513 width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip);
1514 }
Jason Samsb05d6892013-04-09 15:59:24 -07001515
Tim Murrayeff663f2013-11-15 13:08:30 -08001516 rsAllocationCopy3DRange((RsContext)con,
Jason Samsb05d6892013-04-09 15:59:24 -07001517 (RsAllocation)dstAlloc,
1518 dstXoff, dstYoff, dstZoff, dstMip,
1519 width, height, depth,
1520 (RsAllocation)srcAlloc,
1521 srcXoff, srcYoff, srcZoff, srcMip);
1522}
1523
Jason Sams21659ac2013-11-06 15:08:07 -08001524
Stephen Hines414fa2c2014-04-17 01:02:42 -07001525// Copies from the Allocation pointed to by _alloc into the Java object data.
Jason Samsb05d6892013-04-09 15:59:24 -07001526static void
Miao Wang87e908d2015-03-02 15:15:15 -08001527nAllocationRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jobject data, jint dataType,
1528 jint mSize, jboolean usePadding)
Jason Sams40a29e82009-08-10 14:55:26 -07001529{
Jason Sams21659ac2013-11-06 15:08:07 -08001530 RsAllocation *alloc = (RsAllocation *)_alloc;
Andreas Gampe67333922014-11-10 20:35:59 -08001531 if (kLogApi) {
1532 ALOGD("nAllocationRead, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
1533 }
Miao Wang87e908d2015-03-02 15:15:15 -08001534 int count = 0;
1535 PER_ARRAY_TYPE(0, rsAllocationRead, false,
1536 (RsContext)con, alloc, ptr, len * typeBytes);
Jason Sams40a29e82009-08-10 14:55:26 -07001537}
1538
Stephen Hines414fa2c2014-04-17 01:02:42 -07001539// Copies from the Allocation pointed to by _alloc into the Java object data.
Jason Sams40a29e82009-08-10 14:55:26 -07001540static void
Tim Murray460a0492013-11-19 12:45:54 -08001541nAllocationRead1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
Miao Wang87e908d2015-03-02 15:15:15 -08001542 jint count, jobject data, jint sizeBytes, jint dataType,
1543 jint mSize, jboolean usePadding)
Jason Samsfb9f82c2011-01-12 14:53:25 -08001544{
Jason Sams21659ac2013-11-06 15:08:07 -08001545 RsAllocation *alloc = (RsAllocation *)_alloc;
Andreas Gampe67333922014-11-10 20:35:59 -08001546 if (kLogApi) {
1547 ALOGD("nAllocation1DRead, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
1548 "dataType(%i)", (RsContext)con, alloc, offset, count, sizeBytes, dataType);
1549 }
Miao Wang87e908d2015-03-02 15:15:15 -08001550 PER_ARRAY_TYPE(0, rsAllocation1DRead, false,
1551 (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
Jason Samsfb9f82c2011-01-12 14:53:25 -08001552}
1553
Miao Wangc8e237e2015-02-20 18:36:32 -08001554// Copies from the Element in the Allocation pointed to by _alloc into the Java array data.
1555static void
Miao Wang45cec0a2015-03-04 16:40:21 -08001556nAllocationElementRead(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
Miao Wangc8e237e2015-02-20 18:36:32 -08001557 jint xoff, jint yoff, jint zoff,
Miao Wang45cec0a2015-03-04 16:40:21 -08001558 jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
Miao Wangc8e237e2015-02-20 18:36:32 -08001559{
Miao Wangc8e237e2015-02-20 18:36:32 -08001560 if (kLogApi) {
Yang Ni86c5c2d2016-03-25 15:49:07 -07001561 jint len = _env->GetArrayLength(data);
Miao Wang45cec0a2015-03-04 16:40:21 -08001562 ALOGD("nAllocationElementRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
1563 "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
1564 sizeBytes);
Miao Wangc8e237e2015-02-20 18:36:32 -08001565 }
Miao Wang45cec0a2015-03-04 16:40:21 -08001566 jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
Miao Wangba8766c2015-10-12 17:24:13 -07001567 if (ptr == nullptr) {
1568 ALOGE("Failed to get Java array elements");
1569 return;
1570 }
Miao Wang45cec0a2015-03-04 16:40:21 -08001571 rsAllocationElementRead((RsContext)con, (RsAllocation)alloc,
1572 xoff, yoff, zoff,
Jason Samsa7e25092015-03-11 11:00:00 -07001573 lod, ptr, sizeBytes, compIdx);
Miao Wangbfa5e652015-05-04 15:29:25 -07001574 _env->ReleaseByteArrayElements(data, ptr, 0);
Miao Wangc8e237e2015-02-20 18:36:32 -08001575}
1576
Stephen Hines414fa2c2014-04-17 01:02:42 -07001577// Copies from the Allocation pointed to by _alloc into the Java object data.
Jason Samsfb9f82c2011-01-12 14:53:25 -08001578static void
Tim Murray460a0492013-11-19 12:45:54 -08001579nAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
Miao Wang87e908d2015-03-02 15:15:15 -08001580 jint w, jint h, jobject data, jint sizeBytes, jint dataType,
1581 jint mSize, jboolean usePadding)
Jason Samsfb9f82c2011-01-12 14:53:25 -08001582{
Jason Sams21659ac2013-11-06 15:08:07 -08001583 RsAllocation *alloc = (RsAllocation *)_alloc;
1584 RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
Andreas Gampe67333922014-11-10 20:35:59 -08001585 if (kLogApi) {
1586 ALOGD("nAllocation2DRead, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
1587 "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
1588 }
Miao Wang87e908d2015-03-02 15:15:15 -08001589 int count = w * h;
1590 PER_ARRAY_TYPE(0, rsAllocation2DRead, false,
1591 (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
Jason Sams40a29e82009-08-10 14:55:26 -07001592}
Miao Wang87e908d2015-03-02 15:15:15 -08001593
Miao Wangc8e237e2015-02-20 18:36:32 -08001594// Copies from the Allocation pointed to by _alloc into the Java object data.
1595static void
1596nAllocationRead3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
Miao Wang87e908d2015-03-02 15:15:15 -08001597 jint w, jint h, jint d, jobject data, int sizeBytes, int dataType,
1598 jint mSize, jboolean usePadding)
Miao Wangc8e237e2015-02-20 18:36:32 -08001599{
1600 RsAllocation *alloc = (RsAllocation *)_alloc;
1601 if (kLogApi) {
1602 ALOGD("nAllocation3DRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
1603 " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
1604 lod, w, h, d, sizeBytes);
1605 }
Miao Wang87e908d2015-03-02 15:15:15 -08001606 int count = w * h * d;
1607 PER_ARRAY_TYPE(nullptr, rsAllocation3DRead, false,
1608 (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
Miao Wangc8e237e2015-02-20 18:36:32 -08001609}
Jason Samsd19f10d2009-05-22 14:03:28 -07001610
Tim Murray460a0492013-11-19 12:45:54 -08001611static jlong
1612nAllocationGetType(JNIEnv *_env, jobject _this, jlong con, jlong a)
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001613{
Andreas Gampe67333922014-11-10 20:35:59 -08001614 if (kLogApi) {
1615 ALOGD("nAllocationGetType, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
1616 }
Tim Murray3aa89c12014-08-18 17:51:22 -07001617 return (jlong)(uintptr_t) rsaAllocationGetType((RsContext)con, (RsAllocation)a);
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -07001618}
1619
Jason Sams5edc6082010-10-05 13:32:49 -07001620static void
Tim Murray460a0492013-11-19 12:45:54 -08001621nAllocationResize1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint dimX)
Jason Sams5edc6082010-10-05 13:32:49 -07001622{
Andreas Gampe67333922014-11-10 20:35:59 -08001623 if (kLogApi) {
1624 ALOGD("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", (RsContext)con,
1625 (RsAllocation)alloc, dimX);
1626 }
Tim Murrayeff663f2013-11-15 13:08:30 -08001627 rsAllocationResize1D((RsContext)con, (RsAllocation)alloc, dimX);
Jason Sams5edc6082010-10-05 13:32:49 -07001628}
1629
Jason Sams46ba27e32015-02-06 17:45:15 -08001630
1631static jlong
1632nAllocationAdapterCreate(JNIEnv *_env, jobject _this, jlong con, jlong basealloc, jlong type)
1633{
1634 if (kLogApi) {
1635 ALOGD("nAllocationAdapterCreate, con(%p), base(%p), type(%p)",
1636 (RsContext)con, (RsAllocation)basealloc, (RsElement)type);
1637 }
1638 return (jlong)(uintptr_t) rsAllocationAdapterCreate((RsContext)con, (RsType)type,
1639 (RsAllocation)basealloc);
1640
1641}
1642
1643static void
1644nAllocationAdapterOffset(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
1645 jint x, jint y, jint z, jint face, jint lod,
1646 jint a1, jint a2, jint a3, jint a4)
1647{
1648 uint32_t params[] = {
1649 (uint32_t)x, (uint32_t)y, (uint32_t)z, (uint32_t)face,
1650 (uint32_t)lod, (uint32_t)a1, (uint32_t)a2, (uint32_t)a3, (uint32_t)a4
1651 };
1652 if (kLogApi) {
1653 ALOGD("nAllocationAdapterOffset, con(%p), alloc(%p), x(%i), y(%i), z(%i), face(%i), lod(%i), arrays(%i %i %i %i)",
1654 (RsContext)con, (RsAllocation)alloc, x, y, z, face, lod, a1, a2, a3, a4);
1655 }
1656 rsAllocationAdapterOffset((RsContext)con, (RsAllocation)alloc,
1657 params, sizeof(params));
1658}
1659
1660
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -07001661// -----------------------------------
1662
Tim Murray460a0492013-11-19 12:45:54 -08001663static jlong
1664nFileA3DCreateFromAssetStream(JNIEnv *_env, jobject _this, jlong con, jlong native_asset)
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -07001665{
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -07001666 Asset* asset = reinterpret_cast<Asset*>(native_asset);
Ashok Bhat0e0c0882014-02-04 14:57:58 +00001667 ALOGV("______nFileA3D %p", asset);
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -07001668
Tim Murray3aa89c12014-08-18 17:51:22 -07001669 jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromMemory((RsContext)con, asset->getBuffer(false), asset->getLength());
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08001670 return id;
1671}
1672
Tim Murray460a0492013-11-19 12:45:54 -08001673static jlong
Tim Murrayeff663f2013-11-15 13:08:30 -08001674nFileA3DCreateFromAsset(JNIEnv *_env, jobject _this, jlong con, jobject _assetMgr, jstring _path)
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08001675{
1676 AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr);
Chris Wailes488230c32014-08-14 11:22:40 -07001677 if (mgr == nullptr) {
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08001678 return 0;
1679 }
1680
1681 AutoJavaStringToUTF8 str(_env, _path);
1682 Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
Chris Wailes488230c32014-08-14 11:22:40 -07001683 if (asset == nullptr) {
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08001684 return 0;
1685 }
1686
Tim Murray3aa89c12014-08-18 17:51:22 -07001687 jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromAsset((RsContext)con, asset);
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08001688 return id;
1689}
1690
Tim Murray460a0492013-11-19 12:45:54 -08001691static jlong
Tim Murrayeff663f2013-11-15 13:08:30 -08001692nFileA3DCreateFromFile(JNIEnv *_env, jobject _this, jlong con, jstring fileName)
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08001693{
1694 AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
Tim Murray3aa89c12014-08-18 17:51:22 -07001695 jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromFile((RsContext)con, fileNameUTF.c_str());
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08001696
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -07001697 return id;
1698}
1699
Tim Murray460a0492013-11-19 12:45:54 -08001700static jint
1701nFileA3DGetNumIndexEntries(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D)
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -07001702{
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -07001703 int32_t numEntries = 0;
Tim Murrayeff663f2013-11-15 13:08:30 -08001704 rsaFileA3DGetNumIndexEntries((RsContext)con, &numEntries, (RsFile)fileA3D);
Ashok Bhat0e0c0882014-02-04 14:57:58 +00001705 return (jint)numEntries;
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -07001706}
1707
1708static void
Tim Murray460a0492013-11-19 12:45:54 -08001709nFileA3DGetIndexEntries(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D, jint numEntries, jintArray _ids, jobjectArray _entries)
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -07001710{
Ashok Bhat0e0c0882014-02-04 14:57:58 +00001711 ALOGV("______nFileA3D %p", (RsFile) fileA3D);
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -07001712 RsFileIndexEntry *fileEntries = (RsFileIndexEntry*)malloc((uint32_t)numEntries * sizeof(RsFileIndexEntry));
1713
Tim Murrayeff663f2013-11-15 13:08:30 -08001714 rsaFileA3DGetIndexEntries((RsContext)con, fileEntries, (uint32_t)numEntries, (RsFile)fileA3D);
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -07001715
1716 for(jint i = 0; i < numEntries; i ++) {
1717 _env->SetObjectArrayElement(_entries, i, _env->NewStringUTF(fileEntries[i].objectName));
1718 _env->SetIntArrayRegion(_ids, i, 1, (const jint*)&fileEntries[i].classID);
1719 }
1720
1721 free(fileEntries);
1722}
1723
Ashok Bhat0e0c0882014-02-04 14:57:58 +00001724static jlong
Tim Murray460a0492013-11-19 12:45:54 -08001725nFileA3DGetEntryByIndex(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D, jint index)
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -07001726{
Ashok Bhat0e0c0882014-02-04 14:57:58 +00001727 ALOGV("______nFileA3D %p", (RsFile) fileA3D);
Tim Murray3aa89c12014-08-18 17:51:22 -07001728 jlong id = (jlong)(uintptr_t)rsaFileA3DGetEntryByIndex((RsContext)con, (uint32_t)index, (RsFile)fileA3D);
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -07001729 return id;
1730}
Jason Samsd19f10d2009-05-22 14:03:28 -07001731
1732// -----------------------------------
1733
Ashok Bhat0e0c0882014-02-04 14:57:58 +00001734static jlong
Tim Murrayeff663f2013-11-15 13:08:30 -08001735nFontCreateFromFile(JNIEnv *_env, jobject _this, jlong con,
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08001736 jstring fileName, jfloat fontSize, jint dpi)
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -07001737{
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08001738 AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
Tim Murray3aa89c12014-08-18 17:51:22 -07001739 jlong id = (jlong)(uintptr_t)rsFontCreateFromFile((RsContext)con,
Alex Sakhartchouke7c4a752011-04-06 10:57:51 -07001740 fileNameUTF.c_str(), fileNameUTF.length(),
1741 fontSize, dpi);
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -07001742
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08001743 return id;
1744}
1745
Ashok Bhat0e0c0882014-02-04 14:57:58 +00001746static jlong
Tim Murrayeff663f2013-11-15 13:08:30 -08001747nFontCreateFromAssetStream(JNIEnv *_env, jobject _this, jlong con,
Ashok Bhat0e0c0882014-02-04 14:57:58 +00001748 jstring name, jfloat fontSize, jint dpi, jlong native_asset)
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08001749{
1750 Asset* asset = reinterpret_cast<Asset*>(native_asset);
1751 AutoJavaStringToUTF8 nameUTF(_env, name);
1752
Tim Murray3aa89c12014-08-18 17:51:22 -07001753 jlong id = (jlong)(uintptr_t)rsFontCreateFromMemory((RsContext)con,
Alex Sakhartchouke7c4a752011-04-06 10:57:51 -07001754 nameUTF.c_str(), nameUTF.length(),
1755 fontSize, dpi,
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08001756 asset->getBuffer(false), asset->getLength());
1757 return id;
1758}
1759
Ashok Bhat0e0c0882014-02-04 14:57:58 +00001760static jlong
Tim Murrayeff663f2013-11-15 13:08:30 -08001761nFontCreateFromAsset(JNIEnv *_env, jobject _this, jlong con, jobject _assetMgr, jstring _path,
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08001762 jfloat fontSize, jint dpi)
1763{
1764 AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr);
Chris Wailes488230c32014-08-14 11:22:40 -07001765 if (mgr == nullptr) {
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08001766 return 0;
1767 }
1768
1769 AutoJavaStringToUTF8 str(_env, _path);
1770 Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
Chris Wailes488230c32014-08-14 11:22:40 -07001771 if (asset == nullptr) {
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08001772 return 0;
1773 }
1774
Tim Murray3aa89c12014-08-18 17:51:22 -07001775 jlong id = (jlong)(uintptr_t)rsFontCreateFromMemory((RsContext)con,
Alex Sakhartchouke7c4a752011-04-06 10:57:51 -07001776 str.c_str(), str.length(),
1777 fontSize, dpi,
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08001778 asset->getBuffer(false), asset->getLength());
1779 delete asset;
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -07001780 return id;
1781}
1782
Jason Samsbd1c3ad2009-08-03 16:03:08 -07001783// -----------------------------------
1784
1785static void
Tim Murray460a0492013-11-19 12:45:54 -08001786nScriptBindAllocation(JNIEnv *_env, jobject _this, jlong con, jlong script, jlong alloc, jint slot)
Jason Samsd19f10d2009-05-22 14:03:28 -07001787{
Andreas Gampe67333922014-11-10 20:35:59 -08001788 if (kLogApi) {
1789 ALOGD("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)", (RsContext)con,
1790 (RsScript)script, (RsAllocation)alloc, slot);
1791 }
Tim Murrayeff663f2013-11-15 13:08:30 -08001792 rsScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
Jason Samsd19f10d2009-05-22 14:03:28 -07001793}
1794
1795static void
Tim Murray460a0492013-11-19 12:45:54 -08001796nScriptSetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jint val)
Jason Sams4d339932010-05-11 14:03:58 -07001797{
Andreas Gampe67333922014-11-10 20:35:59 -08001798 if (kLogApi) {
1799 ALOGD("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con, (void *)script,
1800 slot, val);
1801 }
Tim Murrayeff663f2013-11-15 13:08:30 -08001802 rsScriptSetVarI((RsContext)con, (RsScript)script, slot, val);
Jason Sams4d339932010-05-11 14:03:58 -07001803}
1804
Tim Murray7c4caad2013-04-10 16:21:40 -07001805static jint
Tim Murray460a0492013-11-19 12:45:54 -08001806nScriptGetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
Tim Murray7c4caad2013-04-10 16:21:40 -07001807{
Andreas Gampe67333922014-11-10 20:35:59 -08001808 if (kLogApi) {
1809 ALOGD("nScriptGetVarI, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1810 }
Tim Murray7c4caad2013-04-10 16:21:40 -07001811 int value = 0;
Tim Murrayeff663f2013-11-15 13:08:30 -08001812 rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
Tim Murray7c4caad2013-04-10 16:21:40 -07001813 return value;
1814}
1815
Jason Sams4d339932010-05-11 14:03:58 -07001816static void
Tim Murray460a0492013-11-19 12:45:54 -08001817nScriptSetVarObj(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val)
Jason Sams6f4cf0b2010-11-16 17:37:02 -08001818{
Andreas Gampe67333922014-11-10 20:35:59 -08001819 if (kLogApi) {
Bernhard Rosenkränzer09993f72014-11-17 20:25:28 +01001820 ALOGD("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%" PRId64 ")", (RsContext)con, (void *)script,
Andreas Gampe67333922014-11-10 20:35:59 -08001821 slot, val);
1822 }
Tim Murrayeff663f2013-11-15 13:08:30 -08001823 rsScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val);
Jason Sams6f4cf0b2010-11-16 17:37:02 -08001824}
1825
1826static void
Tim Murray460a0492013-11-19 12:45:54 -08001827nScriptSetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val)
Stephen Hines031ec58c2010-10-11 10:54:21 -07001828{
Andreas Gampe67333922014-11-10 20:35:59 -08001829 if (kLogApi) {
Bernhard Rosenkränzer09993f72014-11-17 20:25:28 +01001830 ALOGD("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%" PRId64 ")", (RsContext)con, (void *)script,
Andreas Gampe67333922014-11-10 20:35:59 -08001831 slot, val);
1832 }
Tim Murrayeff663f2013-11-15 13:08:30 -08001833 rsScriptSetVarJ((RsContext)con, (RsScript)script, slot, val);
Stephen Hines031ec58c2010-10-11 10:54:21 -07001834}
1835
Tim Murray7c4caad2013-04-10 16:21:40 -07001836static jlong
Tim Murray460a0492013-11-19 12:45:54 -08001837nScriptGetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
Tim Murray7c4caad2013-04-10 16:21:40 -07001838{
Andreas Gampe67333922014-11-10 20:35:59 -08001839 if (kLogApi) {
1840 ALOGD("nScriptGetVarJ, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1841 }
Tim Murray7c4caad2013-04-10 16:21:40 -07001842 jlong value = 0;
Tim Murrayeff663f2013-11-15 13:08:30 -08001843 rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
Tim Murray7c4caad2013-04-10 16:21:40 -07001844 return value;
1845}
1846
Stephen Hines031ec58c2010-10-11 10:54:21 -07001847static void
Tim Murray460a0492013-11-19 12:45:54 -08001848nScriptSetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, float val)
Jason Sams4d339932010-05-11 14:03:58 -07001849{
Andreas Gampe67333922014-11-10 20:35:59 -08001850 if (kLogApi) {
1851 ALOGD("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", (RsContext)con, (void *)script,
1852 slot, val);
1853 }
Tim Murrayeff663f2013-11-15 13:08:30 -08001854 rsScriptSetVarF((RsContext)con, (RsScript)script, slot, val);
Jason Sams4d339932010-05-11 14:03:58 -07001855}
1856
Tim Murray7c4caad2013-04-10 16:21:40 -07001857static jfloat
Tim Murray460a0492013-11-19 12:45:54 -08001858nScriptGetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
Tim Murray7c4caad2013-04-10 16:21:40 -07001859{
Andreas Gampe67333922014-11-10 20:35:59 -08001860 if (kLogApi) {
1861 ALOGD("nScriptGetVarF, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1862 }
Tim Murray7c4caad2013-04-10 16:21:40 -07001863 jfloat value = 0;
Tim Murrayeff663f2013-11-15 13:08:30 -08001864 rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
Tim Murray7c4caad2013-04-10 16:21:40 -07001865 return value;
1866}
1867
Jason Sams4d339932010-05-11 14:03:58 -07001868static void
Tim Murray460a0492013-11-19 12:45:54 -08001869nScriptSetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, double val)
Stephen Hinesca54ec32010-09-20 17:20:30 -07001870{
Andreas Gampe67333922014-11-10 20:35:59 -08001871 if (kLogApi) {
1872 ALOGD("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", (RsContext)con, (void *)script,
1873 slot, val);
1874 }
Tim Murrayeff663f2013-11-15 13:08:30 -08001875 rsScriptSetVarD((RsContext)con, (RsScript)script, slot, val);
Stephen Hinesca54ec32010-09-20 17:20:30 -07001876}
1877
Tim Murray7c4caad2013-04-10 16:21:40 -07001878static jdouble
Tim Murray460a0492013-11-19 12:45:54 -08001879nScriptGetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
Tim Murray7c4caad2013-04-10 16:21:40 -07001880{
Andreas Gampe67333922014-11-10 20:35:59 -08001881 if (kLogApi) {
1882 ALOGD("nScriptGetVarD, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1883 }
Tim Murray7c4caad2013-04-10 16:21:40 -07001884 jdouble value = 0;
Tim Murrayeff663f2013-11-15 13:08:30 -08001885 rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
Tim Murray7c4caad2013-04-10 16:21:40 -07001886 return value;
1887}
1888
Stephen Hinesca54ec32010-09-20 17:20:30 -07001889static void
Tim Murray460a0492013-11-19 12:45:54 -08001890nScriptSetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data)
Jason Sams4d339932010-05-11 14:03:58 -07001891{
Andreas Gampe67333922014-11-10 20:35:59 -08001892 if (kLogApi) {
1893 ALOGD("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1894 }
Jason Sams4d339932010-05-11 14:03:58 -07001895 jint len = _env->GetArrayLength(data);
Chris Wailes488230c32014-08-14 11:22:40 -07001896 jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
Miao Wangba8766c2015-10-12 17:24:13 -07001897 if (ptr == nullptr) {
1898 ALOGE("Failed to get Java array elements");
1899 return;
1900 }
Tim Murrayeff663f2013-11-15 13:08:30 -08001901 rsScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
Jason Sams4d339932010-05-11 14:03:58 -07001902 _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1903}
1904
Stephen Hinesadeb8092012-04-20 14:26:06 -07001905static void
Tim Murray460a0492013-11-19 12:45:54 -08001906nScriptGetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data)
Tim Murray7c4caad2013-04-10 16:21:40 -07001907{
Andreas Gampe67333922014-11-10 20:35:59 -08001908 if (kLogApi) {
1909 ALOGD("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1910 }
Tim Murray7c4caad2013-04-10 16:21:40 -07001911 jint len = _env->GetArrayLength(data);
Chris Wailes488230c32014-08-14 11:22:40 -07001912 jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
Miao Wangba8766c2015-10-12 17:24:13 -07001913 if (ptr == nullptr) {
1914 ALOGE("Failed to get Java array elements");
1915 return;
1916 }
Tim Murrayeff663f2013-11-15 13:08:30 -08001917 rsScriptGetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
Stephen Hines414fa2c2014-04-17 01:02:42 -07001918 _env->ReleaseByteArrayElements(data, ptr, 0);
Tim Murray7c4caad2013-04-10 16:21:40 -07001919}
1920
1921static void
Andreas Gampe67333922014-11-10 20:35:59 -08001922nScriptSetVarVE(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data,
1923 jlong elem, jintArray dims)
Stephen Hinesadeb8092012-04-20 14:26:06 -07001924{
Andreas Gampe67333922014-11-10 20:35:59 -08001925 if (kLogApi) {
1926 ALOGD("nScriptSetVarVE, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1927 }
Stephen Hinesadeb8092012-04-20 14:26:06 -07001928 jint len = _env->GetArrayLength(data);
Chris Wailes488230c32014-08-14 11:22:40 -07001929 jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
Miao Wangba8766c2015-10-12 17:24:13 -07001930 if (ptr == nullptr) {
1931 ALOGE("Failed to get Java array elements");
1932 return;
1933 }
Stephen Hinesadeb8092012-04-20 14:26:06 -07001934 jint dimsLen = _env->GetArrayLength(dims) * sizeof(int);
Chris Wailes488230c32014-08-14 11:22:40 -07001935 jint *dimsPtr = _env->GetIntArrayElements(dims, nullptr);
Miao Wangba8766c2015-10-12 17:24:13 -07001936 if (dimsPtr == nullptr) {
1937 ALOGE("Failed to get Java array elements");
1938 return;
1939 }
Tim Murrayeff663f2013-11-15 13:08:30 -08001940 rsScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem,
Stephen Hinesbc5d3ee2014-06-25 00:03:39 -07001941 (const uint32_t*) dimsPtr, dimsLen);
Stephen Hinesadeb8092012-04-20 14:26:06 -07001942 _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1943 _env->ReleaseIntArrayElements(dims, dimsPtr, JNI_ABORT);
1944}
1945
Jason Samsd19f10d2009-05-22 14:03:28 -07001946
1947static void
Tim Murray460a0492013-11-19 12:45:54 -08001948nScriptSetTimeZone(JNIEnv *_env, jobject _this, jlong con, jlong script, jbyteArray timeZone)
Jason Samsd19f10d2009-05-22 14:03:28 -07001949{
Andreas Gampe67333922014-11-10 20:35:59 -08001950 if (kLogApi) {
1951 ALOGD("nScriptCSetTimeZone, con(%p), s(%p)", (RsContext)con, (void *)script);
1952 }
Romain Guy584a3752009-07-30 18:45:01 -07001953
1954 jint length = _env->GetArrayLength(timeZone);
1955 jbyte* timeZone_ptr;
1956 timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0);
Miao Wangba8766c2015-10-12 17:24:13 -07001957 if (timeZone_ptr == nullptr) {
1958 ALOGE("Failed to get Java array elements");
1959 return;
1960 }
Romain Guy584a3752009-07-30 18:45:01 -07001961
Tim Murrayeff663f2013-11-15 13:08:30 -08001962 rsScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length);
Romain Guy584a3752009-07-30 18:45:01 -07001963
1964 if (timeZone_ptr) {
1965 _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0);
1966 }
1967}
1968
Jason Samsfbf0b9e2009-08-13 12:59:04 -07001969static void
Tim Murray460a0492013-11-19 12:45:54 -08001970nScriptInvoke(JNIEnv *_env, jobject _this, jlong con, jlong obj, jint slot)
Jason Samsbe2e8412009-09-16 15:04:38 -07001971{
Andreas Gampe67333922014-11-10 20:35:59 -08001972 if (kLogApi) {
1973 ALOGD("nScriptInvoke, con(%p), script(%p)", (RsContext)con, (void *)obj);
1974 }
Tim Murrayeff663f2013-11-15 13:08:30 -08001975 rsScriptInvoke((RsContext)con, (RsScript)obj, slot);
Jason Samsbe2e8412009-09-16 15:04:38 -07001976}
1977
1978static void
Tim Murray460a0492013-11-19 12:45:54 -08001979nScriptInvokeV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data)
Jason Sams4d339932010-05-11 14:03:58 -07001980{
Andreas Gampe67333922014-11-10 20:35:59 -08001981 if (kLogApi) {
1982 ALOGD("nScriptInvokeV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1983 }
Jason Sams4d339932010-05-11 14:03:58 -07001984 jint len = _env->GetArrayLength(data);
Chris Wailes488230c32014-08-14 11:22:40 -07001985 jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
Miao Wangba8766c2015-10-12 17:24:13 -07001986 if (ptr == nullptr) {
1987 ALOGE("Failed to get Java array elements");
1988 return;
1989 }
Tim Murrayeff663f2013-11-15 13:08:30 -08001990 rsScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len);
Jason Sams4d339932010-05-11 14:03:58 -07001991 _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1992}
1993
Jason Sams6e494d32011-04-27 16:33:11 -07001994static void
Chris Wailesbe7b1de2014-07-15 10:56:14 -07001995nScriptForEach(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
1996 jlongArray ains, jlong aout, jbyteArray params,
1997 jintArray limits)
Jason Sams6e494d32011-04-27 16:33:11 -07001998{
Andreas Gampe67333922014-11-10 20:35:59 -08001999 if (kLogApi) {
Chih-Hung Hsieh9eb9dd32015-05-06 14:42:04 -07002000 ALOGD("nScriptForEach, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
Andreas Gampe67333922014-11-10 20:35:59 -08002001 }
Jason Sams6e494d32011-04-27 16:33:11 -07002002
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002003 jint in_len = 0;
Chris Wailes488230c32014-08-14 11:22:40 -07002004 jlong *in_ptr = nullptr;
Chris Wailes94961062014-06-11 12:01:28 -07002005
Chris Wailes488230c32014-08-14 11:22:40 -07002006 RsAllocation *in_allocs = nullptr;
Chris Wailes94961062014-06-11 12:01:28 -07002007
Chris Wailes488230c32014-08-14 11:22:40 -07002008 if (ains != nullptr) {
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002009 in_len = _env->GetArrayLength(ains);
Yang Ni7b2a46f2015-05-05 12:41:19 -07002010 if (in_len > (jint)RS_KERNEL_MAX_ARGUMENTS) {
Yang Ni17c2d7a2015-04-30 16:13:54 -07002011 ALOGE("Too many arguments in kernel launch.");
2012 // TODO (b/20758983): Report back to Java and throw an exception
2013 return;
2014 }
Chris Wailes94961062014-06-11 12:01:28 -07002015
Yang Ni17c2d7a2015-04-30 16:13:54 -07002016 in_ptr = _env->GetLongArrayElements(ains, nullptr);
Miao Wangba8766c2015-10-12 17:24:13 -07002017 if (in_ptr == nullptr) {
2018 ALOGE("Failed to get Java array elements");
2019 return;
2020 }
2021
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002022 if (sizeof(RsAllocation) == sizeof(jlong)) {
2023 in_allocs = (RsAllocation*)in_ptr;
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002024 } else {
2025 // Convert from 64-bit jlong types to the native pointer type.
Chris Wailes94961062014-06-11 12:01:28 -07002026
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002027 in_allocs = (RsAllocation*)alloca(in_len * sizeof(RsAllocation));
Yang Ni17c2d7a2015-04-30 16:13:54 -07002028 if (in_allocs == nullptr) {
2029 ALOGE("Failed launching kernel for lack of memory.");
2030 _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
2031 return;
2032 }
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002033
2034 for (int index = in_len; --index >= 0;) {
2035 in_allocs[index] = (RsAllocation)in_ptr[index];
2036 }
2037 }
Chris Wailes94961062014-06-11 12:01:28 -07002038 }
2039
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002040 jint param_len = 0;
Chris Wailes488230c32014-08-14 11:22:40 -07002041 jbyte *param_ptr = nullptr;
Chris Wailes94961062014-06-11 12:01:28 -07002042
Chris Wailes488230c32014-08-14 11:22:40 -07002043 if (params != nullptr) {
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002044 param_len = _env->GetArrayLength(params);
Chris Wailes488230c32014-08-14 11:22:40 -07002045 param_ptr = _env->GetByteArrayElements(params, nullptr);
Miao Wangba8766c2015-10-12 17:24:13 -07002046 if (param_ptr == nullptr) {
2047 ALOGE("Failed to get Java array elements");
2048 return;
2049 }
Chris Wailes94961062014-06-11 12:01:28 -07002050 }
2051
Chris Wailes488230c32014-08-14 11:22:40 -07002052 RsScriptCall sc, *sca = nullptr;
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002053 uint32_t sc_size = 0;
Chris Wailes94961062014-06-11 12:01:28 -07002054
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002055 jint limit_len = 0;
Chris Wailes488230c32014-08-14 11:22:40 -07002056 jint *limit_ptr = nullptr;
Chris Wailes94961062014-06-11 12:01:28 -07002057
Chris Wailes488230c32014-08-14 11:22:40 -07002058 if (limits != nullptr) {
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002059 limit_len = _env->GetArrayLength(limits);
Chris Wailes488230c32014-08-14 11:22:40 -07002060 limit_ptr = _env->GetIntArrayElements(limits, nullptr);
Miao Wangba8766c2015-10-12 17:24:13 -07002061 if (limit_ptr == nullptr) {
2062 ALOGE("Failed to get Java array elements");
2063 return;
2064 }
Chris Wailes94961062014-06-11 12:01:28 -07002065
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002066 assert(limit_len == 6);
Andreas Gampe67333922014-11-10 20:35:59 -08002067 UNUSED(limit_len); // As the assert might not be compiled.
Chris Wailes94961062014-06-11 12:01:28 -07002068
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002069 sc.xStart = limit_ptr[0];
2070 sc.xEnd = limit_ptr[1];
2071 sc.yStart = limit_ptr[2];
2072 sc.yEnd = limit_ptr[3];
2073 sc.zStart = limit_ptr[4];
2074 sc.zEnd = limit_ptr[5];
2075 sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
Jason Sams14331ab2015-01-26 18:14:36 -08002076 sc.arrayStart = 0;
2077 sc.arrayEnd = 0;
2078 sc.array2Start = 0;
2079 sc.array2End = 0;
2080 sc.array3Start = 0;
2081 sc.array3End = 0;
2082 sc.array4Start = 0;
2083 sc.array4End = 0;
Chris Wailes94961062014-06-11 12:01:28 -07002084
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002085 sca = &sc;
Yang Nie8f2e442016-03-15 16:00:02 -07002086 // sc_size is required, but unused, by the runtime and drivers.
2087 sc_size = sizeof(sc);
Chris Wailes94961062014-06-11 12:01:28 -07002088 }
2089
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002090 rsScriptForEachMulti((RsContext)con, (RsScript)script, slot,
2091 in_allocs, in_len, (RsAllocation)aout,
2092 param_ptr, param_len, sca, sc_size);
Chris Wailes94961062014-06-11 12:01:28 -07002093
Chris Wailes488230c32014-08-14 11:22:40 -07002094 if (ains != nullptr) {
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002095 _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
Chris Wailes94961062014-06-11 12:01:28 -07002096 }
2097
Chris Wailes488230c32014-08-14 11:22:40 -07002098 if (params != nullptr) {
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002099 _env->ReleaseByteArrayElements(params, param_ptr, JNI_ABORT);
2100 }
2101
Chris Wailes488230c32014-08-14 11:22:40 -07002102 if (limits != nullptr) {
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002103 _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
2104 }
Chris Wailes94961062014-06-11 12:01:28 -07002105}
2106
Matt Wala36eb1f72015-07-20 15:35:27 -07002107static void
2108nScriptReduce(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
2109 jlong ain, jlong aout, jintArray limits)
2110{
2111 if (kLogApi) {
2112 ALOGD("nScriptReduce, con(%p), s(%p), slot(%i) ain(%" PRId64 ") aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ain, aout);
2113 }
2114
2115 RsScriptCall sc, *sca = nullptr;
2116 uint32_t sc_size = 0;
2117
2118 jint limit_len = 0;
2119 jint *limit_ptr = nullptr;
2120
2121 // If the caller passed limits, reflect them in the RsScriptCall.
2122 if (limits != nullptr) {
2123 limit_len = _env->GetArrayLength(limits);
2124 limit_ptr = _env->GetIntArrayElements(limits, nullptr);
Miao Wangba8766c2015-10-12 17:24:13 -07002125 if (limit_ptr == nullptr) {
2126 ALOGE("Failed to get Java array elements");
2127 return;
2128 }
Matt Wala36eb1f72015-07-20 15:35:27 -07002129
2130 // We expect to be passed an array [x1, x2] which specifies
2131 // the sub-range for a 1-dimensional reduction.
2132 assert(limit_len == 2);
2133 UNUSED(limit_len); // As the assert might not be compiled.
2134
2135 sc.xStart = limit_ptr[0];
2136 sc.xEnd = limit_ptr[1];
2137 sc.yStart = 0;
2138 sc.yEnd = 0;
2139 sc.zStart = 0;
2140 sc.zEnd = 0;
2141 sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
2142 sc.arrayStart = 0;
2143 sc.arrayEnd = 0;
2144 sc.array2Start = 0;
2145 sc.array2End = 0;
2146 sc.array3Start = 0;
2147 sc.array3End = 0;
2148 sc.array4Start = 0;
2149 sc.array4End = 0;
2150
2151 sca = &sc;
2152 sc_size = sizeof(sc);
2153 }
2154
2155 rsScriptReduce((RsContext)con, (RsScript)script, slot,
2156 (RsAllocation)ain, (RsAllocation)aout,
2157 sca, sc_size);
2158
2159 if (limits != nullptr) {
2160 _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
2161 }
2162}
2163
David Gross26ef7a732016-01-12 12:19:15 -08002164static void
2165nScriptReduceNew(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
2166 jlongArray ains, jlong aout, jintArray limits)
2167{
2168 if (kLogApi) {
2169 ALOGD("nScriptReduceNew, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
2170 }
2171
2172 if (ains == nullptr) {
2173 ALOGE("At least one input required.");
2174 // TODO (b/20758983): Report back to Java and throw an exception
2175 return;
2176 }
2177 jint in_len = _env->GetArrayLength(ains);
2178 if (in_len > (jint)RS_KERNEL_MAX_ARGUMENTS) {
2179 ALOGE("Too many arguments in kernel launch.");
2180 // TODO (b/20758983): Report back to Java and throw an exception
2181 return;
2182 }
2183
2184 jlong *in_ptr = _env->GetLongArrayElements(ains, nullptr);
2185 if (in_ptr == nullptr) {
2186 ALOGE("Failed to get Java array elements");
2187 // TODO (b/20758983): Report back to Java and throw an exception
2188 return;
2189 }
2190
2191 RsAllocation *in_allocs = nullptr;
2192 if (sizeof(RsAllocation) == sizeof(jlong)) {
2193 in_allocs = (RsAllocation*)in_ptr;
2194 } else {
2195 // Convert from 64-bit jlong types to the native pointer type.
2196
2197 in_allocs = (RsAllocation*)alloca(in_len * sizeof(RsAllocation));
2198 if (in_allocs == nullptr) {
2199 ALOGE("Failed launching kernel for lack of memory.");
2200 // TODO (b/20758983): Report back to Java and throw an exception
2201 _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
2202 return;
2203 }
2204
2205 for (int index = in_len; --index >= 0;) {
2206 in_allocs[index] = (RsAllocation)in_ptr[index];
2207 }
2208 }
2209
2210 RsScriptCall sc, *sca = nullptr;
2211 uint32_t sc_size = 0;
2212
2213 jint limit_len = 0;
2214 jint *limit_ptr = nullptr;
2215
2216 if (limits != nullptr) {
2217 limit_len = _env->GetArrayLength(limits);
2218 limit_ptr = _env->GetIntArrayElements(limits, nullptr);
2219 if (limit_ptr == nullptr) {
2220 ALOGE("Failed to get Java array elements");
2221 // TODO (b/20758983): Report back to Java and throw an exception
2222 return;
2223 }
2224
2225 assert(limit_len == 6);
2226 UNUSED(limit_len); // As the assert might not be compiled.
2227
2228 sc.xStart = limit_ptr[0];
2229 sc.xEnd = limit_ptr[1];
2230 sc.yStart = limit_ptr[2];
2231 sc.yEnd = limit_ptr[3];
2232 sc.zStart = limit_ptr[4];
2233 sc.zEnd = limit_ptr[5];
2234 sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
2235 sc.arrayStart = 0;
2236 sc.arrayEnd = 0;
2237 sc.array2Start = 0;
2238 sc.array2End = 0;
2239 sc.array3Start = 0;
2240 sc.array3End = 0;
2241 sc.array4Start = 0;
2242 sc.array4End = 0;
2243
2244 sca = &sc;
2245 sc_size = sizeof(sc);
2246 }
2247
2248 rsScriptReduceNew((RsContext)con, (RsScript)script, slot,
2249 in_allocs, in_len, (RsAllocation)aout,
2250 sca, sc_size);
2251
2252 _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
2253
2254 if (limits != nullptr) {
2255 _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
2256 }
2257}
2258
Jason Sams22534172009-08-04 16:58:20 -07002259// -----------------------------------
2260
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002261static jlong
Tim Murrayeff663f2013-11-15 13:08:30 -08002262nScriptCCreate(JNIEnv *_env, jobject _this, jlong con,
Jason Samse4a06c52011-03-16 16:29:28 -07002263 jstring resName, jstring cacheDir,
2264 jbyteArray scriptRef, jint length)
Jason Sams22534172009-08-04 16:58:20 -07002265{
Andreas Gampe67333922014-11-10 20:35:59 -08002266 if (kLogApi) {
2267 ALOGD("nScriptCCreate, con(%p)", (RsContext)con);
2268 }
Jason Sams22534172009-08-04 16:58:20 -07002269
Jason Samse4a06c52011-03-16 16:29:28 -07002270 AutoJavaStringToUTF8 resNameUTF(_env, resName);
2271 AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002272 jlong ret = 0;
Chris Wailes488230c32014-08-14 11:22:40 -07002273 jbyte* script_ptr = nullptr;
Jack Palevich43702d82009-05-28 13:38:16 -07002274 jint _exception = 0;
2275 jint remaining;
Jack Palevich43702d82009-05-28 13:38:16 -07002276 if (!scriptRef) {
2277 _exception = 1;
Elliott Hughes8451b252011-04-07 19:17:57 -07002278 //jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null");
Jack Palevich43702d82009-05-28 13:38:16 -07002279 goto exit;
2280 }
Jack Palevich43702d82009-05-28 13:38:16 -07002281 if (length < 0) {
2282 _exception = 1;
Elliott Hughes8451b252011-04-07 19:17:57 -07002283 //jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0");
Jack Palevich43702d82009-05-28 13:38:16 -07002284 goto exit;
2285 }
Jason Samse4a06c52011-03-16 16:29:28 -07002286 remaining = _env->GetArrayLength(scriptRef);
Jack Palevich43702d82009-05-28 13:38:16 -07002287 if (remaining < length) {
2288 _exception = 1;
Elliott Hughes8451b252011-04-07 19:17:57 -07002289 //jniThrowException(_env, "java/lang/IllegalArgumentException",
2290 // "length > script.length - offset");
Jack Palevich43702d82009-05-28 13:38:16 -07002291 goto exit;
2292 }
Jason Samse4a06c52011-03-16 16:29:28 -07002293 script_ptr = (jbyte *)
Jack Palevich43702d82009-05-28 13:38:16 -07002294 _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0);
Miao Wangba8766c2015-10-12 17:24:13 -07002295 if (script_ptr == nullptr) {
2296 ALOGE("Failed to get Java array elements");
2297 return ret;
2298 }
Jack Palevich43702d82009-05-28 13:38:16 -07002299
Tim Murrayeff663f2013-11-15 13:08:30 -08002300 //rsScriptCSetText((RsContext)con, (const char *)script_ptr, length);
Jason Samse4a06c52011-03-16 16:29:28 -07002301
Tim Murray3aa89c12014-08-18 17:51:22 -07002302 ret = (jlong)(uintptr_t)rsScriptCCreate((RsContext)con,
Alex Sakhartchouke7c4a752011-04-06 10:57:51 -07002303 resNameUTF.c_str(), resNameUTF.length(),
2304 cacheDirUTF.c_str(), cacheDirUTF.length(),
Jason Samse4a06c52011-03-16 16:29:28 -07002305 (const char *)script_ptr, length);
Jason Sams39ddc9502009-06-05 17:35:09 -07002306
Jack Palevich43702d82009-05-28 13:38:16 -07002307exit:
Jason Samse4a06c52011-03-16 16:29:28 -07002308 if (script_ptr) {
2309 _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr,
Jack Palevich43702d82009-05-28 13:38:16 -07002310 _exception ? JNI_ABORT: 0);
2311 }
Jason Samsd19f10d2009-05-22 14:03:28 -07002312
Tim Murray3aa89c12014-08-18 17:51:22 -07002313 return (jlong)(uintptr_t)ret;
Jason Samsd19f10d2009-05-22 14:03:28 -07002314}
2315
Tim Murray460a0492013-11-19 12:45:54 -08002316static jlong
2317nScriptIntrinsicCreate(JNIEnv *_env, jobject _this, jlong con, jint id, jlong eid)
Jason Sams6ab97682012-08-10 12:09:43 -07002318{
Andreas Gampe67333922014-11-10 20:35:59 -08002319 if (kLogApi) {
2320 ALOGD("nScriptIntrinsicCreate, con(%p) id(%i) element(%p)", (RsContext)con, id,
2321 (void *)eid);
2322 }
Tim Murray3aa89c12014-08-18 17:51:22 -07002323 return (jlong)(uintptr_t)rsScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
Jason Sams6ab97682012-08-10 12:09:43 -07002324}
2325
Tim Murray460a0492013-11-19 12:45:54 -08002326static jlong
2327nScriptKernelIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jint sig)
Jason Sams08a81582012-09-18 12:32:10 -07002328{
Andreas Gampe67333922014-11-10 20:35:59 -08002329 if (kLogApi) {
2330 ALOGD("nScriptKernelIDCreate, con(%p) script(%p), slot(%i), sig(%i)", (RsContext)con,
2331 (void *)sid, slot, sig);
2332 }
Tim Murray3aa89c12014-08-18 17:51:22 -07002333 return (jlong)(uintptr_t)rsScriptKernelIDCreate((RsContext)con, (RsScript)sid, slot, sig);
Jason Sams08a81582012-09-18 12:32:10 -07002334}
2335
Tim Murray460a0492013-11-19 12:45:54 -08002336static jlong
Yang Nibe392ad2015-01-23 17:16:02 -08002337nScriptInvokeIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
2338{
2339 if (kLogApi) {
Elliott Hughes7ff53fa2015-02-05 21:36:10 -08002340 ALOGD("nScriptInvokeIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con,
Yang Nibe392ad2015-01-23 17:16:02 -08002341 (void *)sid, slot);
2342 }
2343 return (jlong)(uintptr_t)rsScriptInvokeIDCreate((RsContext)con, (RsScript)sid, slot);
2344}
2345
2346static jlong
Tim Murray460a0492013-11-19 12:45:54 -08002347nScriptFieldIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
Jason Sams08a81582012-09-18 12:32:10 -07002348{
Andreas Gampe67333922014-11-10 20:35:59 -08002349 if (kLogApi) {
2350 ALOGD("nScriptFieldIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con, (void *)sid,
2351 slot);
2352 }
Tim Murray3aa89c12014-08-18 17:51:22 -07002353 return (jlong)(uintptr_t)rsScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
Jason Sams08a81582012-09-18 12:32:10 -07002354}
2355
Tim Murray460a0492013-11-19 12:45:54 -08002356static jlong
Ashok Bhat98071552014-02-12 09:54:43 +00002357nScriptGroupCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _kernels, jlongArray _src,
2358 jlongArray _dstk, jlongArray _dstf, jlongArray _types)
Jason Sams08a81582012-09-18 12:32:10 -07002359{
Andreas Gampe67333922014-11-10 20:35:59 -08002360 if (kLogApi) {
2361 ALOGD("nScriptGroupCreate, con(%p)", (RsContext)con);
2362 }
Jason Sams08a81582012-09-18 12:32:10 -07002363
Miao Wanga4ad5f82016-02-11 12:32:39 -08002364 jlong id = 0;
2365
2366 RsScriptKernelID* kernelsPtr;
Ashok Bhat98071552014-02-12 09:54:43 +00002367 jint kernelsLen = _env->GetArrayLength(_kernels);
Chris Wailes488230c32014-08-14 11:22:40 -07002368 jlong *jKernelsPtr = _env->GetLongArrayElements(_kernels, nullptr);
Miao Wanga4ad5f82016-02-11 12:32:39 -08002369
2370 RsScriptKernelID* srcPtr;
2371 jint srcLen = _env->GetArrayLength(_src);
2372 jlong *jSrcPtr = _env->GetLongArrayElements(_src, nullptr);
2373
2374 RsScriptKernelID* dstkPtr;
2375 jint dstkLen = _env->GetArrayLength(_dstk);
2376 jlong *jDstkPtr = _env->GetLongArrayElements(_dstk, nullptr);
2377
2378 RsScriptKernelID* dstfPtr;
2379 jint dstfLen = _env->GetArrayLength(_dstf);
2380 jlong *jDstfPtr = _env->GetLongArrayElements(_dstf, nullptr);
2381
2382 RsType* typesPtr;
2383 jint typesLen = _env->GetArrayLength(_types);
2384 jlong *jTypesPtr = _env->GetLongArrayElements(_types, nullptr);
2385
Miao Wangba8766c2015-10-12 17:24:13 -07002386 if (jKernelsPtr == nullptr) {
2387 ALOGE("Failed to get Java array elements: kernels");
Miao Wanga4ad5f82016-02-11 12:32:39 -08002388 goto cleanup;
Miao Wangba8766c2015-10-12 17:24:13 -07002389 }
Miao Wanga4ad5f82016-02-11 12:32:39 -08002390 if (jSrcPtr == nullptr) {
2391 ALOGE("Failed to get Java array elements: src");
2392 goto cleanup;
2393 }
2394 if (jDstkPtr == nullptr) {
2395 ALOGE("Failed to get Java array elements: dstk");
2396 goto cleanup;
2397 }
2398 if (jDstfPtr == nullptr) {
2399 ALOGE("Failed to get Java array elements: dstf");
2400 goto cleanup;
2401 }
2402 if (jTypesPtr == nullptr) {
2403 ALOGE("Failed to get Java array elements: types");
2404 goto cleanup;
2405 }
2406
2407 kernelsPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * kernelsLen);
Ashok Bhat98071552014-02-12 09:54:43 +00002408 for(int i = 0; i < kernelsLen; ++i) {
2409 kernelsPtr[i] = (RsScriptKernelID)jKernelsPtr[i];
2410 }
Jason Sams08a81582012-09-18 12:32:10 -07002411
Miao Wanga4ad5f82016-02-11 12:32:39 -08002412 srcPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * srcLen);
Ashok Bhat98071552014-02-12 09:54:43 +00002413 for(int i = 0; i < srcLen; ++i) {
2414 srcPtr[i] = (RsScriptKernelID)jSrcPtr[i];
2415 }
Jason Sams08a81582012-09-18 12:32:10 -07002416
Miao Wanga4ad5f82016-02-11 12:32:39 -08002417 dstkPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstkLen);
Ashok Bhat98071552014-02-12 09:54:43 +00002418 for(int i = 0; i < dstkLen; ++i) {
2419 dstkPtr[i] = (RsScriptKernelID)jDstkPtr[i];
2420 }
2421
Miao Wanga4ad5f82016-02-11 12:32:39 -08002422 dstfPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstfLen);
Ashok Bhat98071552014-02-12 09:54:43 +00002423 for(int i = 0; i < dstfLen; ++i) {
2424 dstfPtr[i] = (RsScriptKernelID)jDstfPtr[i];
2425 }
2426
Miao Wanga4ad5f82016-02-11 12:32:39 -08002427 typesPtr = (RsType*) malloc(sizeof(RsType) * typesLen);
Ashok Bhat98071552014-02-12 09:54:43 +00002428 for(int i = 0; i < typesLen; ++i) {
2429 typesPtr[i] = (RsType)jTypesPtr[i];
2430 }
2431
Miao Wanga4ad5f82016-02-11 12:32:39 -08002432 id = (jlong)(uintptr_t)rsScriptGroupCreate((RsContext)con,
Ashok Bhat98071552014-02-12 09:54:43 +00002433 (RsScriptKernelID *)kernelsPtr, kernelsLen * sizeof(RsScriptKernelID),
2434 (RsScriptKernelID *)srcPtr, srcLen * sizeof(RsScriptKernelID),
2435 (RsScriptKernelID *)dstkPtr, dstkLen * sizeof(RsScriptKernelID),
2436 (RsScriptFieldID *)dstfPtr, dstfLen * sizeof(RsScriptKernelID),
2437 (RsType *)typesPtr, typesLen * sizeof(RsType));
2438
2439 free(kernelsPtr);
2440 free(srcPtr);
2441 free(dstkPtr);
2442 free(dstfPtr);
2443 free(typesPtr);
Miao Wanga4ad5f82016-02-11 12:32:39 -08002444
2445cleanup:
2446 if (jKernelsPtr != nullptr) {
2447 _env->ReleaseLongArrayElements(_kernels, jKernelsPtr, 0);
2448 }
2449 if (jSrcPtr != nullptr) {
2450 _env->ReleaseLongArrayElements(_src, jSrcPtr, 0);
2451 }
2452 if (jDstkPtr != nullptr) {
2453 _env->ReleaseLongArrayElements(_dstk, jDstkPtr, 0);
2454 }
2455 if (jDstfPtr != nullptr) {
2456 _env->ReleaseLongArrayElements(_dstf, jDstfPtr, 0);
2457 }
2458 if (jTypesPtr != nullptr) {
2459 _env->ReleaseLongArrayElements(_types, jTypesPtr, 0);
2460 }
2461
Jason Sams08a81582012-09-18 12:32:10 -07002462 return id;
2463}
2464
2465static void
Tim Murray460a0492013-11-19 12:45:54 -08002466nScriptGroupSetInput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
Jason Sams08a81582012-09-18 12:32:10 -07002467{
Andreas Gampe67333922014-11-10 20:35:59 -08002468 if (kLogApi) {
2469 ALOGD("nScriptGroupSetInput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
2470 (void *)gid, (void *)kid, (void *)alloc);
2471 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002472 rsScriptGroupSetInput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid, (RsAllocation)alloc);
Jason Sams08a81582012-09-18 12:32:10 -07002473}
2474
2475static void
Tim Murray460a0492013-11-19 12:45:54 -08002476nScriptGroupSetOutput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
Jason Sams08a81582012-09-18 12:32:10 -07002477{
Andreas Gampe67333922014-11-10 20:35:59 -08002478 if (kLogApi) {
2479 ALOGD("nScriptGroupSetOutput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
2480 (void *)gid, (void *)kid, (void *)alloc);
2481 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002482 rsScriptGroupSetOutput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid, (RsAllocation)alloc);
Jason Sams08a81582012-09-18 12:32:10 -07002483}
2484
2485static void
Tim Murray460a0492013-11-19 12:45:54 -08002486nScriptGroupExecute(JNIEnv *_env, jobject _this, jlong con, jlong gid)
Jason Sams08a81582012-09-18 12:32:10 -07002487{
Andreas Gampe67333922014-11-10 20:35:59 -08002488 if (kLogApi) {
2489 ALOGD("nScriptGroupSetOutput, con(%p) group(%p)", (RsContext)con, (void *)gid);
2490 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002491 rsScriptGroupExecute((RsContext)con, (RsScriptGroup)gid);
Jason Sams08a81582012-09-18 12:32:10 -07002492}
2493
Jason Samsd19f10d2009-05-22 14:03:28 -07002494// ---------------------------------------------------------------------------
2495
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002496static jlong
Tim Murrayeff663f2013-11-15 13:08:30 -08002497nProgramStoreCreate(JNIEnv *_env, jobject _this, jlong con,
Jason Sams331bf9b2011-04-06 11:23:54 -07002498 jboolean colorMaskR, jboolean colorMaskG, jboolean colorMaskB, jboolean colorMaskA,
2499 jboolean depthMask, jboolean ditherEnable,
2500 jint srcFunc, jint destFunc,
2501 jint depthFunc)
Jason Samsd19f10d2009-05-22 14:03:28 -07002502{
Andreas Gampe67333922014-11-10 20:35:59 -08002503 if (kLogApi) {
2504 ALOGD("nProgramStoreCreate, con(%p)", (RsContext)con);
2505 }
Tim Murray3aa89c12014-08-18 17:51:22 -07002506 return (jlong)(uintptr_t)rsProgramStoreCreate((RsContext)con, colorMaskR, colorMaskG, colorMaskB, colorMaskA,
Jason Sams331bf9b2011-04-06 11:23:54 -07002507 depthMask, ditherEnable, (RsBlendSrcFunc)srcFunc,
2508 (RsBlendDstFunc)destFunc, (RsDepthFunc)depthFunc);
Jason Samsd19f10d2009-05-22 14:03:28 -07002509}
2510
Jason Sams0011bcf2009-12-15 12:58:36 -08002511// ---------------------------------------------------------------------------
2512
2513static void
Tim Murray460a0492013-11-19 12:45:54 -08002514nProgramBindConstants(JNIEnv *_env, jobject _this, jlong con, jlong vpv, jint slot, jlong a)
Jason Sams0011bcf2009-12-15 12:58:36 -08002515{
Andreas Gampe67333922014-11-10 20:35:59 -08002516 if (kLogApi) {
2517 ALOGD("nProgramBindConstants, con(%p), vpf(%p), sloat(%i), a(%p)", (RsContext)con,
2518 (RsProgramVertex)vpv, slot, (RsAllocation)a);
2519 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002520 rsProgramBindConstants((RsContext)con, (RsProgram)vpv, slot, (RsAllocation)a);
Jason Sams0011bcf2009-12-15 12:58:36 -08002521}
Jason Sams54c0ec12009-11-30 14:49:55 -08002522
Jason Sams68afd012009-12-17 16:55:08 -08002523static void
Tim Murray460a0492013-11-19 12:45:54 -08002524nProgramBindTexture(JNIEnv *_env, jobject _this, jlong con, jlong vpf, jint slot, jlong a)
Jason Sams68afd012009-12-17 16:55:08 -08002525{
Andreas Gampe67333922014-11-10 20:35:59 -08002526 if (kLogApi) {
2527 ALOGD("nProgramBindTexture, con(%p), vpf(%p), slot(%i), a(%p)", (RsContext)con,
2528 (RsProgramFragment)vpf, slot, (RsAllocation)a);
2529 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002530 rsProgramBindTexture((RsContext)con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
Jason Sams68afd012009-12-17 16:55:08 -08002531}
2532
2533static void
Tim Murray460a0492013-11-19 12:45:54 -08002534nProgramBindSampler(JNIEnv *_env, jobject _this, jlong con, jlong vpf, jint slot, jlong a)
Jason Sams68afd012009-12-17 16:55:08 -08002535{
Andreas Gampe67333922014-11-10 20:35:59 -08002536 if (kLogApi) {
2537 ALOGD("nProgramBindSampler, con(%p), vpf(%p), slot(%i), a(%p)", (RsContext)con,
2538 (RsProgramFragment)vpf, slot, (RsSampler)a);
2539 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002540 rsProgramBindSampler((RsContext)con, (RsProgramFragment)vpf, slot, (RsSampler)a);
Jason Sams68afd012009-12-17 16:55:08 -08002541}
2542
Jason Samsd19f10d2009-05-22 14:03:28 -07002543// ---------------------------------------------------------------------------
2544
Tim Murray460a0492013-11-19 12:45:54 -08002545static jlong
Tim Murrayeff663f2013-11-15 13:08:30 -08002546nProgramFragmentCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader,
Ashok Bhat98071552014-02-12 09:54:43 +00002547 jobjectArray texNames, jlongArray params)
Jason Sams7e5ab3b2009-12-15 13:27:04 -08002548{
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08002549 AutoJavaStringToUTF8 shaderUTF(_env, shader);
Chris Wailes488230c32014-08-14 11:22:40 -07002550 jlong *jParamPtr = _env->GetLongArrayElements(params, nullptr);
Jason Sams7e5ab3b2009-12-15 13:27:04 -08002551 jint paramLen = _env->GetArrayLength(params);
Miao Wangba8766c2015-10-12 17:24:13 -07002552 if (jParamPtr == nullptr) {
2553 ALOGE("Failed to get Java array elements");
2554 return 0;
2555 }
Jason Sams7e5ab3b2009-12-15 13:27:04 -08002556
Alex Sakhartchouk2123b462012-02-15 16:21:46 -08002557 int texCount = _env->GetArrayLength(texNames);
2558 AutoJavaStringArrayToUTF8 names(_env, texNames, texCount);
2559 const char ** nameArray = names.c_str();
2560 size_t* sizeArray = names.c_str_len();
2561
Andreas Gampe67333922014-11-10 20:35:59 -08002562 if (kLogApi) {
2563 ALOGD("nProgramFragmentCreate, con(%p), paramLen(%i)", (RsContext)con, paramLen);
2564 }
Jason Sams7e5ab3b2009-12-15 13:27:04 -08002565
Ashok Bhat98071552014-02-12 09:54:43 +00002566 uintptr_t * paramPtr = (uintptr_t*) malloc(sizeof(uintptr_t) * paramLen);
2567 for(int i = 0; i < paramLen; ++i) {
2568 paramPtr[i] = (uintptr_t)jParamPtr[i];
2569 }
Tim Murray3aa89c12014-08-18 17:51:22 -07002570 jlong ret = (jlong)(uintptr_t)rsProgramFragmentCreate((RsContext)con, shaderUTF.c_str(), shaderUTF.length(),
Alex Sakhartchouk2123b462012-02-15 16:21:46 -08002571 nameArray, texCount, sizeArray,
Ashok Bhat98071552014-02-12 09:54:43 +00002572 paramPtr, paramLen);
Alex Sakhartchouk2123b462012-02-15 16:21:46 -08002573
Ashok Bhat98071552014-02-12 09:54:43 +00002574 free(paramPtr);
2575 _env->ReleaseLongArrayElements(params, jParamPtr, JNI_ABORT);
Jason Sams7e5ab3b2009-12-15 13:27:04 -08002576 return ret;
2577}
2578
2579
Jason Sams1fe9b8c2009-06-11 14:46:10 -07002580// ---------------------------------------------------------------------------
2581
Tim Murray460a0492013-11-19 12:45:54 -08002582static jlong
Tim Murrayeff663f2013-11-15 13:08:30 -08002583nProgramVertexCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader,
Ashok Bhat98071552014-02-12 09:54:43 +00002584 jobjectArray texNames, jlongArray params)
Jason Sams1fe9b8c2009-06-11 14:46:10 -07002585{
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08002586 AutoJavaStringToUTF8 shaderUTF(_env, shader);
Chris Wailes488230c32014-08-14 11:22:40 -07002587 jlong *jParamPtr = _env->GetLongArrayElements(params, nullptr);
Jason Sams0011bcf2009-12-15 12:58:36 -08002588 jint paramLen = _env->GetArrayLength(params);
Miao Wangba8766c2015-10-12 17:24:13 -07002589 if (jParamPtr == nullptr) {
2590 ALOGE("Failed to get Java array elements");
2591 return 0;
2592 }
Jason Sams1fe9b8c2009-06-11 14:46:10 -07002593
Andreas Gampe67333922014-11-10 20:35:59 -08002594 if (kLogApi) {
2595 ALOGD("nProgramVertexCreate, con(%p), paramLen(%i)", (RsContext)con, paramLen);
2596 }
Jason Sams0011bcf2009-12-15 12:58:36 -08002597
Alex Sakhartchouk2123b462012-02-15 16:21:46 -08002598 int texCount = _env->GetArrayLength(texNames);
2599 AutoJavaStringArrayToUTF8 names(_env, texNames, texCount);
2600 const char ** nameArray = names.c_str();
2601 size_t* sizeArray = names.c_str_len();
2602
Ashok Bhat98071552014-02-12 09:54:43 +00002603 uintptr_t * paramPtr = (uintptr_t*) malloc(sizeof(uintptr_t) * paramLen);
2604 for(int i = 0; i < paramLen; ++i) {
2605 paramPtr[i] = (uintptr_t)jParamPtr[i];
2606 }
2607
Tim Murray3aa89c12014-08-18 17:51:22 -07002608 jlong ret = (jlong)(uintptr_t)rsProgramVertexCreate((RsContext)con, shaderUTF.c_str(), shaderUTF.length(),
Alex Sakhartchouk2123b462012-02-15 16:21:46 -08002609 nameArray, texCount, sizeArray,
Ashok Bhat98071552014-02-12 09:54:43 +00002610 paramPtr, paramLen);
Alex Sakhartchouk2123b462012-02-15 16:21:46 -08002611
Ashok Bhat98071552014-02-12 09:54:43 +00002612 free(paramPtr);
2613 _env->ReleaseLongArrayElements(params, jParamPtr, JNI_ABORT);
Jason Sams0011bcf2009-12-15 12:58:36 -08002614 return ret;
2615}
Jason Sams1fe9b8c2009-06-11 14:46:10 -07002616
Jason Samsebfb4362009-09-23 13:57:02 -07002617// ---------------------------------------------------------------------------
2618
Tim Murray460a0492013-11-19 12:45:54 -08002619static jlong
Tim Murrayeff663f2013-11-15 13:08:30 -08002620nProgramRasterCreate(JNIEnv *_env, jobject _this, jlong con, jboolean pointSprite, jint cull)
Jason Samsebfb4362009-09-23 13:57:02 -07002621{
Andreas Gampe67333922014-11-10 20:35:59 -08002622 if (kLogApi) {
2623 ALOGD("nProgramRasterCreate, con(%p), pointSprite(%i), cull(%i)", (RsContext)con,
2624 pointSprite, cull);
2625 }
Tim Murray3aa89c12014-08-18 17:51:22 -07002626 return (jlong)(uintptr_t)rsProgramRasterCreate((RsContext)con, pointSprite, (RsCullMode)cull);
Jason Samsebfb4362009-09-23 13:57:02 -07002627}
2628
Jason Samsd19f10d2009-05-22 14:03:28 -07002629
2630// ---------------------------------------------------------------------------
2631
2632static void
Narayan Kamath78c0ce52014-03-19 10:15:51 +00002633nContextBindRootScript(JNIEnv *_env, jobject _this, jlong con, jlong script)
Jason Samsd19f10d2009-05-22 14:03:28 -07002634{
Andreas Gampe67333922014-11-10 20:35:59 -08002635 if (kLogApi) {
2636 ALOGD("nContextBindRootScript, con(%p), script(%p)", (RsContext)con, (RsScript)script);
2637 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002638 rsContextBindRootScript((RsContext)con, (RsScript)script);
Jason Samsd19f10d2009-05-22 14:03:28 -07002639}
2640
2641static void
Narayan Kamath78c0ce52014-03-19 10:15:51 +00002642nContextBindProgramStore(JNIEnv *_env, jobject _this, jlong con, jlong pfs)
Jason Samsd19f10d2009-05-22 14:03:28 -07002643{
Andreas Gampe67333922014-11-10 20:35:59 -08002644 if (kLogApi) {
2645 ALOGD("nContextBindProgramStore, con(%p), pfs(%p)", (RsContext)con, (RsProgramStore)pfs);
2646 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002647 rsContextBindProgramStore((RsContext)con, (RsProgramStore)pfs);
Jason Samsd19f10d2009-05-22 14:03:28 -07002648}
2649
2650static void
Narayan Kamath78c0ce52014-03-19 10:15:51 +00002651nContextBindProgramFragment(JNIEnv *_env, jobject _this, jlong con, jlong pf)
Jason Samsd19f10d2009-05-22 14:03:28 -07002652{
Andreas Gampe67333922014-11-10 20:35:59 -08002653 if (kLogApi) {
2654 ALOGD("nContextBindProgramFragment, con(%p), pf(%p)", (RsContext)con,
2655 (RsProgramFragment)pf);
2656 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002657 rsContextBindProgramFragment((RsContext)con, (RsProgramFragment)pf);
Jason Samsd19f10d2009-05-22 14:03:28 -07002658}
2659
Jason Sams0826a6f2009-06-15 19:04:56 -07002660static void
Narayan Kamath78c0ce52014-03-19 10:15:51 +00002661nContextBindProgramVertex(JNIEnv *_env, jobject _this, jlong con, jlong pf)
Jason Sams0826a6f2009-06-15 19:04:56 -07002662{
Andreas Gampe67333922014-11-10 20:35:59 -08002663 if (kLogApi) {
2664 ALOGD("nContextBindProgramVertex, con(%p), pf(%p)", (RsContext)con, (RsProgramVertex)pf);
2665 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002666 rsContextBindProgramVertex((RsContext)con, (RsProgramVertex)pf);
Jason Sams0826a6f2009-06-15 19:04:56 -07002667}
2668
Joe Onoratod7b37742009-08-09 22:57:44 -07002669static void
Narayan Kamath78c0ce52014-03-19 10:15:51 +00002670nContextBindProgramRaster(JNIEnv *_env, jobject _this, jlong con, jlong pf)
Jason Samsebfb4362009-09-23 13:57:02 -07002671{
Andreas Gampe67333922014-11-10 20:35:59 -08002672 if (kLogApi) {
2673 ALOGD("nContextBindProgramRaster, con(%p), pf(%p)", (RsContext)con, (RsProgramRaster)pf);
2674 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002675 rsContextBindProgramRaster((RsContext)con, (RsProgramRaster)pf);
Jason Samsebfb4362009-09-23 13:57:02 -07002676}
2677
Joe Onoratod7b37742009-08-09 22:57:44 -07002678
Jason Sams02fb2cb2009-05-28 15:37:57 -07002679// ---------------------------------------------------------------------------
2680
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002681static jlong
Tim Murrayeff663f2013-11-15 13:08:30 -08002682nSamplerCreate(JNIEnv *_env, jobject _this, jlong con, jint magFilter, jint minFilter,
Alex Sakhartchouka89094a2011-05-04 17:45:36 -07002683 jint wrapS, jint wrapT, jint wrapR, jfloat aniso)
Jason Sams02fb2cb2009-05-28 15:37:57 -07002684{
Andreas Gampe67333922014-11-10 20:35:59 -08002685 if (kLogApi) {
2686 ALOGD("nSamplerCreate, con(%p)", (RsContext)con);
2687 }
Tim Murray3aa89c12014-08-18 17:51:22 -07002688 return (jlong)(uintptr_t)rsSamplerCreate((RsContext)con,
Alex Sakhartchouka89094a2011-05-04 17:45:36 -07002689 (RsSamplerValue)magFilter,
2690 (RsSamplerValue)minFilter,
2691 (RsSamplerValue)wrapS,
2692 (RsSamplerValue)wrapT,
2693 (RsSamplerValue)wrapR,
2694 aniso);
Jason Sams02fb2cb2009-05-28 15:37:57 -07002695}
2696
Jason Samsbba134c2009-06-22 15:49:21 -07002697// ---------------------------------------------------------------------------
2698
Tim Murray460a0492013-11-19 12:45:54 -08002699static jlong
Ashok Bhat98071552014-02-12 09:54:43 +00002700nMeshCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _vtx, jlongArray _idx, jintArray _prim)
Jason Samsbba134c2009-06-22 15:49:21 -07002701{
Andreas Gampe67333922014-11-10 20:35:59 -08002702 if (kLogApi) {
2703 ALOGD("nMeshCreate, con(%p)", (RsContext)con);
2704 }
Alex Sakhartchouk25999a02011-05-12 10:38:03 -07002705
Miao Wanga4ad5f82016-02-11 12:32:39 -08002706 jlong id = 0;
2707
2708 RsAllocation* vtxPtr;
Alex Sakhartchouk25999a02011-05-12 10:38:03 -07002709 jint vtxLen = _env->GetArrayLength(_vtx);
Chris Wailes488230c32014-08-14 11:22:40 -07002710 jlong *jVtxPtr = _env->GetLongArrayElements(_vtx, nullptr);
Miao Wanga4ad5f82016-02-11 12:32:39 -08002711
2712 RsAllocation* idxPtr;
2713 jint idxLen = _env->GetArrayLength(_idx);
2714 jlong *jIdxPtr = _env->GetLongArrayElements(_idx, nullptr);
2715
2716 jint primLen = _env->GetArrayLength(_prim);
2717 jint *primPtr = _env->GetIntArrayElements(_prim, nullptr);
2718
Miao Wangba8766c2015-10-12 17:24:13 -07002719 if (jVtxPtr == nullptr) {
2720 ALOGE("Failed to get Java array elements: vtx");
Miao Wanga4ad5f82016-02-11 12:32:39 -08002721 goto cleanupMesh;
Miao Wangba8766c2015-10-12 17:24:13 -07002722 }
Miao Wanga4ad5f82016-02-11 12:32:39 -08002723 if (jIdxPtr == nullptr) {
2724 ALOGE("Failed to get Java array elements: idx");
2725 goto cleanupMesh;
2726 }
2727 if (primPtr == nullptr) {
2728 ALOGE("Failed to get Java array elements: prim");
2729 goto cleanupMesh;
2730 }
2731
2732 vtxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * vtxLen);
Ashok Bhat98071552014-02-12 09:54:43 +00002733 for(int i = 0; i < vtxLen; ++i) {
2734 vtxPtr[i] = (RsAllocation)(uintptr_t)jVtxPtr[i];
2735 }
2736
Miao Wanga4ad5f82016-02-11 12:32:39 -08002737 idxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * idxLen);
Ashok Bhat98071552014-02-12 09:54:43 +00002738 for(int i = 0; i < idxLen; ++i) {
2739 idxPtr[i] = (RsAllocation)(uintptr_t)jIdxPtr[i];
2740 }
2741
Miao Wanga4ad5f82016-02-11 12:32:39 -08002742 id = (jlong)(uintptr_t)rsMeshCreate((RsContext)con,
2743 (RsAllocation *)vtxPtr, vtxLen,
2744 (RsAllocation *)idxPtr, idxLen,
2745 (uint32_t *)primPtr, primLen);
Alex Sakhartchouk25999a02011-05-12 10:38:03 -07002746
Ashok Bhat98071552014-02-12 09:54:43 +00002747 free(vtxPtr);
2748 free(idxPtr);
Miao Wanga4ad5f82016-02-11 12:32:39 -08002749
2750cleanupMesh:
2751 if (jVtxPtr != nullptr) {
2752 _env->ReleaseLongArrayElements(_vtx, jVtxPtr, 0);
2753 }
2754 if (jIdxPtr != nullptr) {
2755 _env->ReleaseLongArrayElements(_idx, jIdxPtr, 0);
2756 }
2757 if (primPtr != nullptr) {
2758 _env->ReleaseIntArrayElements(_prim, primPtr, 0);
2759 }
2760
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -07002761 return id;
2762}
2763
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002764static jint
Tim Murray460a0492013-11-19 12:45:54 -08002765nMeshGetVertexBufferCount(JNIEnv *_env, jobject _this, jlong con, jlong mesh)
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002766{
Andreas Gampe67333922014-11-10 20:35:59 -08002767 if (kLogApi) {
2768 ALOGD("nMeshGetVertexBufferCount, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
2769 }
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002770 jint vtxCount = 0;
Tim Murrayeff663f2013-11-15 13:08:30 -08002771 rsaMeshGetVertexBufferCount((RsContext)con, (RsMesh)mesh, &vtxCount);
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002772 return vtxCount;
2773}
2774
2775static jint
Tim Murray460a0492013-11-19 12:45:54 -08002776nMeshGetIndexCount(JNIEnv *_env, jobject _this, jlong con, jlong mesh)
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002777{
Andreas Gampe67333922014-11-10 20:35:59 -08002778 if (kLogApi) {
2779 ALOGD("nMeshGetIndexCount, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
2780 }
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002781 jint idxCount = 0;
Tim Murrayeff663f2013-11-15 13:08:30 -08002782 rsaMeshGetIndexCount((RsContext)con, (RsMesh)mesh, &idxCount);
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002783 return idxCount;
2784}
2785
2786static void
Ashok Bhat98071552014-02-12 09:54:43 +00002787nMeshGetVertices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jlongArray _ids, jint numVtxIDs)
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002788{
Andreas Gampe67333922014-11-10 20:35:59 -08002789 if (kLogApi) {
2790 ALOGD("nMeshGetVertices, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
2791 }
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002792
2793 RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numVtxIDs * sizeof(RsAllocation));
Tim Murrayeff663f2013-11-15 13:08:30 -08002794 rsaMeshGetVertices((RsContext)con, (RsMesh)mesh, allocs, (uint32_t)numVtxIDs);
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002795
2796 for(jint i = 0; i < numVtxIDs; i ++) {
Tim Murray3aa89c12014-08-18 17:51:22 -07002797 const jlong alloc = (jlong)(uintptr_t)allocs[i];
Ashok Bhat98071552014-02-12 09:54:43 +00002798 _env->SetLongArrayRegion(_ids, i, 1, &alloc);
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002799 }
2800
2801 free(allocs);
2802}
2803
2804static void
Ashok Bhat98071552014-02-12 09:54:43 +00002805nMeshGetIndices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jlongArray _idxIds, jintArray _primitives, jint numIndices)
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002806{
Andreas Gampe67333922014-11-10 20:35:59 -08002807 if (kLogApi) {
2808 ALOGD("nMeshGetVertices, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
2809 }
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002810
2811 RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numIndices * sizeof(RsAllocation));
2812 uint32_t *prims= (uint32_t*)malloc((uint32_t)numIndices * sizeof(uint32_t));
2813
Tim Murrayeff663f2013-11-15 13:08:30 -08002814 rsaMeshGetIndices((RsContext)con, (RsMesh)mesh, allocs, prims, (uint32_t)numIndices);
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002815
2816 for(jint i = 0; i < numIndices; i ++) {
Tim Murray3aa89c12014-08-18 17:51:22 -07002817 const jlong alloc = (jlong)(uintptr_t)allocs[i];
Ashok Bhat98071552014-02-12 09:54:43 +00002818 const jint prim = (jint)prims[i];
2819 _env->SetLongArrayRegion(_idxIds, i, 1, &alloc);
2820 _env->SetIntArrayRegion(_primitives, i, 1, &prim);
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002821 }
2822
2823 free(allocs);
2824 free(prims);
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -07002825}
2826
Tim Murray56f9e6f2014-05-16 11:47:26 -07002827static jint
2828nSystemGetPointerSize(JNIEnv *_env, jobject _this) {
2829 return (jint)sizeof(void*);
2830}
2831
Miao Wang0facf022015-11-25 11:21:13 -08002832static jobject
2833nAllocationGetByteBuffer(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
2834 jlongArray strideArr, jint xBytesSize,
2835 jint dimY, jint dimZ) {
2836 if (kLogApi) {
2837 ALOGD("nAllocationGetByteBuffer, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
2838 }
Tim Murray56f9e6f2014-05-16 11:47:26 -07002839
Miao Wang0facf022015-11-25 11:21:13 -08002840 jlong *jStridePtr = _env->GetLongArrayElements(strideArr, nullptr);
2841 if (jStridePtr == nullptr) {
2842 ALOGE("Failed to get Java array elements: strideArr");
2843 return 0;
2844 }
2845
2846 size_t strideIn = xBytesSize;
2847 void* ptr = nullptr;
2848 if (alloc != 0) {
2849 ptr = rsAllocationGetPointer((RsContext)con, (RsAllocation)alloc, 0,
2850 RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 0, 0,
2851 &strideIn, sizeof(size_t));
2852 }
2853
2854 jobject byteBuffer = nullptr;
2855 if (ptr != nullptr) {
2856 size_t bufferSize = strideIn;
2857 jStridePtr[0] = strideIn;
2858 if (dimY > 0) {
2859 bufferSize *= dimY;
2860 }
2861 if (dimZ > 0) {
2862 bufferSize *= dimZ;
2863 }
2864 byteBuffer = _env->NewDirectByteBuffer(ptr, (jlong) bufferSize);
2865 }
2866 _env->ReleaseLongArrayElements(strideArr, jStridePtr, 0);
2867 return byteBuffer;
2868}
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -07002869// ---------------------------------------------------------------------------
2870
Jason Samsd19f10d2009-05-22 14:03:28 -07002871
Jason Sams94d8e90a2009-06-10 16:09:05 -07002872static const char *classPathName = "android/renderscript/RenderScript";
Jason Samsd19f10d2009-05-22 14:03:28 -07002873
Daniel Micay76f6a862015-09-19 17:31:01 -04002874static const JNINativeMethod methods[] = {
Jason Sams1c415172010-11-08 17:06:46 -08002875{"_nInit", "()V", (void*)_nInit },
Jason Samsea84a7c2009-09-04 14:42:41 -07002876
Tim Murrayeff663f2013-11-15 13:08:30 -08002877{"nDeviceCreate", "()J", (void*)nDeviceCreate },
2878{"nDeviceDestroy", "(J)V", (void*)nDeviceDestroy },
2879{"nDeviceSetConfig", "(JII)V", (void*)nDeviceSetConfig },
2880{"nContextGetUserMessage", "(J[I)I", (void*)nContextGetUserMessage },
2881{"nContextGetErrorMessage", "(J)Ljava/lang/String;", (void*)nContextGetErrorMessage },
2882{"nContextPeekMessage", "(J[I)I", (void*)nContextPeekMessage },
Jason Sams1c415172010-11-08 17:06:46 -08002883
Tim Murrayeff663f2013-11-15 13:08:30 -08002884{"nContextInitToClient", "(J)V", (void*)nContextInitToClient },
2885{"nContextDeinitToClient", "(J)V", (void*)nContextDeinitToClient },
Jason Samsd19f10d2009-05-22 14:03:28 -07002886
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -07002887
Jason Sams2e1872f2010-08-17 16:25:41 -07002888// All methods below are thread protected in java.
Tim Murrayeff663f2013-11-15 13:08:30 -08002889{"rsnContextCreate", "(JIII)J", (void*)nContextCreate },
2890{"rsnContextCreateGL", "(JIIIIIIIIIIIIFI)J", (void*)nContextCreateGL },
2891{"rsnContextFinish", "(J)V", (void*)nContextFinish },
2892{"rsnContextSetPriority", "(JI)V", (void*)nContextSetPriority },
Tim Murray47f31582015-04-07 15:43:24 -07002893{"rsnContextSetCacheDir", "(JLjava/lang/String;)V", (void*)nContextSetCacheDir },
Tim Murrayeff663f2013-11-15 13:08:30 -08002894{"rsnContextSetSurface", "(JIILandroid/view/Surface;)V", (void*)nContextSetSurface },
2895{"rsnContextDestroy", "(J)V", (void*)nContextDestroy },
2896{"rsnContextDump", "(JI)V", (void*)nContextDump },
2897{"rsnContextPause", "(J)V", (void*)nContextPause },
2898{"rsnContextResume", "(J)V", (void*)nContextResume },
2899{"rsnContextSendMessage", "(JI[I)V", (void*)nContextSendMessage },
Yang Ni281c3252014-10-24 08:52:24 -07002900{"rsnClosureCreate", "(JJJ[J[J[I[J[J)J", (void*)nClosureCreate },
Yang Nibe392ad2015-01-23 17:16:02 -08002901{"rsnInvokeClosureCreate", "(JJ[B[J[J[I)J", (void*)nInvokeClosureCreate },
Yang Ni281c3252014-10-24 08:52:24 -07002902{"rsnClosureSetArg", "(JJIJI)V", (void*)nClosureSetArg },
2903{"rsnClosureSetGlobal", "(JJJJI)V", (void*)nClosureSetGlobal },
Tim Murray460a0492013-11-19 12:45:54 -08002904{"rsnAssignName", "(JJ[B)V", (void*)nAssignName },
2905{"rsnGetName", "(JJ)Ljava/lang/String;", (void*)nGetName },
2906{"rsnObjDestroy", "(JJ)V", (void*)nObjDestroy },
Jason Sams64676f32009-07-08 18:01:53 -07002907
Tim Murray460a0492013-11-19 12:45:54 -08002908{"rsnFileA3DCreateFromFile", "(JLjava/lang/String;)J", (void*)nFileA3DCreateFromFile },
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002909{"rsnFileA3DCreateFromAssetStream", "(JJ)J", (void*)nFileA3DCreateFromAssetStream },
Tim Murray460a0492013-11-19 12:45:54 -08002910{"rsnFileA3DCreateFromAsset", "(JLandroid/content/res/AssetManager;Ljava/lang/String;)J", (void*)nFileA3DCreateFromAsset },
2911{"rsnFileA3DGetNumIndexEntries", "(JJ)I", (void*)nFileA3DGetNumIndexEntries },
2912{"rsnFileA3DGetIndexEntries", "(JJI[I[Ljava/lang/String;)V", (void*)nFileA3DGetIndexEntries },
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002913{"rsnFileA3DGetEntryByIndex", "(JJI)J", (void*)nFileA3DGetEntryByIndex },
Jason Samsd19f10d2009-05-22 14:03:28 -07002914
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002915{"rsnFontCreateFromFile", "(JLjava/lang/String;FI)J", (void*)nFontCreateFromFile },
2916{"rsnFontCreateFromAssetStream", "(JLjava/lang/String;FIJ)J", (void*)nFontCreateFromAssetStream },
2917{"rsnFontCreateFromAsset", "(JLandroid/content/res/AssetManager;Ljava/lang/String;FI)J", (void*)nFontCreateFromAsset },
Jason Samsd19f10d2009-05-22 14:03:28 -07002918
Tim Murray460a0492013-11-19 12:45:54 -08002919{"rsnElementCreate", "(JJIZI)J", (void*)nElementCreate },
Ashok Bhat98071552014-02-12 09:54:43 +00002920{"rsnElementCreate2", "(J[J[Ljava/lang/String;[I)J", (void*)nElementCreate2 },
Tim Murray460a0492013-11-19 12:45:54 -08002921{"rsnElementGetNativeData", "(JJ[I)V", (void*)nElementGetNativeData },
Ashok Bhat98071552014-02-12 09:54:43 +00002922{"rsnElementGetSubElements", "(JJ[J[Ljava/lang/String;[I)V", (void*)nElementGetSubElements },
Jason Samsd19f10d2009-05-22 14:03:28 -07002923
Tim Murray460a0492013-11-19 12:45:54 -08002924{"rsnTypeCreate", "(JJIIIZZI)J", (void*)nTypeCreate },
Ashok Bhat98071552014-02-12 09:54:43 +00002925{"rsnTypeGetNativeData", "(JJ[J)V", (void*)nTypeGetNativeData },
Jason Samsd19f10d2009-05-22 14:03:28 -07002926
Ashok Bhat98071552014-02-12 09:54:43 +00002927{"rsnAllocationCreateTyped", "(JJIIJ)J", (void*)nAllocationCreateTyped },
Tim Murray460a0492013-11-19 12:45:54 -08002928{"rsnAllocationCreateFromBitmap", "(JJILandroid/graphics/Bitmap;I)J", (void*)nAllocationCreateFromBitmap },
2929{"rsnAllocationCreateBitmapBackedAllocation", "(JJILandroid/graphics/Bitmap;I)J", (void*)nAllocationCreateBitmapBackedAllocation },
2930{"rsnAllocationCubeCreateFromBitmap","(JJILandroid/graphics/Bitmap;I)J", (void*)nAllocationCubeCreateFromBitmap },
Jason Sams5476b452010-12-08 16:14:36 -08002931
Tim Murray460a0492013-11-19 12:45:54 -08002932{"rsnAllocationCopyFromBitmap", "(JJLandroid/graphics/Bitmap;)V", (void*)nAllocationCopyFromBitmap },
2933{"rsnAllocationCopyToBitmap", "(JJLandroid/graphics/Bitmap;)V", (void*)nAllocationCopyToBitmap },
Jason Sams4ef66502010-12-10 16:03:15 -08002934
Tim Murray460a0492013-11-19 12:45:54 -08002935{"rsnAllocationSyncAll", "(JJI)V", (void*)nAllocationSyncAll },
Miao Wang8c150922015-10-26 17:44:10 -07002936{"rsnAllocationSetupBufferQueue", "(JJI)V", (void*)nAllocationSetupBufferQueue },
2937{"rsnAllocationShareBufferQueue", "(JJJ)V", (void*)nAllocationShareBufferQueue },
Tim Murray460a0492013-11-19 12:45:54 -08002938{"rsnAllocationGetSurface", "(JJ)Landroid/view/Surface;", (void*)nAllocationGetSurface },
2939{"rsnAllocationSetSurface", "(JJLandroid/view/Surface;)V", (void*)nAllocationSetSurface },
2940{"rsnAllocationIoSend", "(JJ)V", (void*)nAllocationIoSend },
Miao Wang8c150922015-10-26 17:44:10 -07002941{"rsnAllocationIoReceive", "(JJ)J", (void*)nAllocationIoReceive },
Miao Wang87e908d2015-03-02 15:15:15 -08002942{"rsnAllocationData1D", "(JJIIILjava/lang/Object;IIIZ)V", (void*)nAllocationData1D },
Miao Wangc8e237e2015-02-20 18:36:32 -08002943{"rsnAllocationElementData", "(JJIIIII[BI)V", (void*)nAllocationElementData },
Miao Wang87e908d2015-03-02 15:15:15 -08002944{"rsnAllocationData2D", "(JJIIIIIILjava/lang/Object;IIIZ)V", (void*)nAllocationData2D },
Tim Murray460a0492013-11-19 12:45:54 -08002945{"rsnAllocationData2D", "(JJIIIIIIJIIII)V", (void*)nAllocationData2D_alloc },
Miao Wang87e908d2015-03-02 15:15:15 -08002946{"rsnAllocationData3D", "(JJIIIIIIILjava/lang/Object;IIIZ)V", (void*)nAllocationData3D },
Tim Murray460a0492013-11-19 12:45:54 -08002947{"rsnAllocationData3D", "(JJIIIIIIIJIIII)V", (void*)nAllocationData3D_alloc },
Miao Wang87e908d2015-03-02 15:15:15 -08002948{"rsnAllocationRead", "(JJLjava/lang/Object;IIZ)V", (void*)nAllocationRead },
2949{"rsnAllocationRead1D", "(JJIIILjava/lang/Object;IIIZ)V", (void*)nAllocationRead1D },
Miao Wang45cec0a2015-03-04 16:40:21 -08002950{"rsnAllocationElementRead", "(JJIIIII[BI)V", (void*)nAllocationElementRead },
Miao Wang87e908d2015-03-02 15:15:15 -08002951{"rsnAllocationRead2D", "(JJIIIIIILjava/lang/Object;IIIZ)V", (void*)nAllocationRead2D },
2952{"rsnAllocationRead3D", "(JJIIIIIIILjava/lang/Object;IIIZ)V", (void*)nAllocationRead3D },
Tim Murray460a0492013-11-19 12:45:54 -08002953{"rsnAllocationGetType", "(JJ)J", (void*)nAllocationGetType},
2954{"rsnAllocationResize1D", "(JJI)V", (void*)nAllocationResize1D },
2955{"rsnAllocationGenerateMipmaps", "(JJ)V", (void*)nAllocationGenerateMipmaps },
Jason Samsbd1c3ad2009-08-03 16:03:08 -07002956
Jason Sams46ba27e32015-02-06 17:45:15 -08002957{"rsnAllocationAdapterCreate", "(JJJ)J", (void*)nAllocationAdapterCreate },
2958{"rsnAllocationAdapterOffset", "(JJIIIIIIIII)V", (void*)nAllocationAdapterOffset },
2959
Tim Murray460a0492013-11-19 12:45:54 -08002960{"rsnScriptBindAllocation", "(JJJI)V", (void*)nScriptBindAllocation },
2961{"rsnScriptSetTimeZone", "(JJ[B)V", (void*)nScriptSetTimeZone },
2962{"rsnScriptInvoke", "(JJI)V", (void*)nScriptInvoke },
2963{"rsnScriptInvokeV", "(JJI[B)V", (void*)nScriptInvokeV },
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002964
2965{"rsnScriptForEach", "(JJI[JJ[B[I)V", (void*)nScriptForEach },
Matt Wala36eb1f72015-07-20 15:35:27 -07002966{"rsnScriptReduce", "(JJIJJ[I)V", (void*)nScriptReduce },
David Gross26ef7a732016-01-12 12:19:15 -08002967{"rsnScriptReduceNew", "(JJI[JJ[I)V", (void*)nScriptReduceNew },
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002968
Tim Murray460a0492013-11-19 12:45:54 -08002969{"rsnScriptSetVarI", "(JJII)V", (void*)nScriptSetVarI },
2970{"rsnScriptGetVarI", "(JJI)I", (void*)nScriptGetVarI },
2971{"rsnScriptSetVarJ", "(JJIJ)V", (void*)nScriptSetVarJ },
2972{"rsnScriptGetVarJ", "(JJI)J", (void*)nScriptGetVarJ },
2973{"rsnScriptSetVarF", "(JJIF)V", (void*)nScriptSetVarF },
2974{"rsnScriptGetVarF", "(JJI)F", (void*)nScriptGetVarF },
2975{"rsnScriptSetVarD", "(JJID)V", (void*)nScriptSetVarD },
2976{"rsnScriptGetVarD", "(JJI)D", (void*)nScriptGetVarD },
2977{"rsnScriptSetVarV", "(JJI[B)V", (void*)nScriptSetVarV },
2978{"rsnScriptGetVarV", "(JJI[B)V", (void*)nScriptGetVarV },
2979{"rsnScriptSetVarVE", "(JJI[BJ[I)V", (void*)nScriptSetVarVE },
2980{"rsnScriptSetVarObj", "(JJIJ)V", (void*)nScriptSetVarObj },
Jason Samsd19f10d2009-05-22 14:03:28 -07002981
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002982{"rsnScriptCCreate", "(JLjava/lang/String;Ljava/lang/String;[BI)J", (void*)nScriptCCreate },
Tim Murray460a0492013-11-19 12:45:54 -08002983{"rsnScriptIntrinsicCreate", "(JIJ)J", (void*)nScriptIntrinsicCreate },
2984{"rsnScriptKernelIDCreate", "(JJII)J", (void*)nScriptKernelIDCreate },
Yang Nibe392ad2015-01-23 17:16:02 -08002985{"rsnScriptInvokeIDCreate", "(JJI)J", (void*)nScriptInvokeIDCreate },
Tim Murray460a0492013-11-19 12:45:54 -08002986{"rsnScriptFieldIDCreate", "(JJI)J", (void*)nScriptFieldIDCreate },
Ashok Bhat98071552014-02-12 09:54:43 +00002987{"rsnScriptGroupCreate", "(J[J[J[J[J[J)J", (void*)nScriptGroupCreate },
Yang Ni35be56c2015-04-02 17:47:56 -07002988{"rsnScriptGroup2Create", "(JLjava/lang/String;Ljava/lang/String;[J)J", (void*)nScriptGroup2Create },
Tim Murray460a0492013-11-19 12:45:54 -08002989{"rsnScriptGroupSetInput", "(JJJJ)V", (void*)nScriptGroupSetInput },
2990{"rsnScriptGroupSetOutput", "(JJJJ)V", (void*)nScriptGroupSetOutput },
2991{"rsnScriptGroupExecute", "(JJ)V", (void*)nScriptGroupExecute },
Yang Ni281c3252014-10-24 08:52:24 -07002992{"rsnScriptGroup2Execute", "(JJ)V", (void*)nScriptGroup2Execute },
Jason Sams0011bcf2009-12-15 12:58:36 -08002993
Tim Murray25207df2015-01-12 16:47:56 -08002994{"rsnScriptIntrinsicBLAS_Single", "(JJIIIIIIIIIFJJFJIIII)V", (void*)nScriptIntrinsicBLAS_Single },
2995{"rsnScriptIntrinsicBLAS_Double", "(JJIIIIIIIIIDJJDJIIII)V", (void*)nScriptIntrinsicBLAS_Double },
2996{"rsnScriptIntrinsicBLAS_Complex", "(JJIIIIIIIIIFFJJFFJIIII)V", (void*)nScriptIntrinsicBLAS_Complex },
2997{"rsnScriptIntrinsicBLAS_Z", "(JJIIIIIIIIIDDJJDDJIIII)V", (void*)nScriptIntrinsicBLAS_Z },
2998
Tim Murray9cb16a22015-04-01 11:07:16 -07002999{"rsnScriptIntrinsicBLAS_BNNM", "(JJIIIJIJIJII)V", (void*)nScriptIntrinsicBLAS_BNNM },
3000
Ashok Bhat0e0c0882014-02-04 14:57:58 +00003001{"rsnProgramStoreCreate", "(JZZZZZZIII)J", (void*)nProgramStoreCreate },
Jason Samsd19f10d2009-05-22 14:03:28 -07003002
Tim Murray460a0492013-11-19 12:45:54 -08003003{"rsnProgramBindConstants", "(JJIJ)V", (void*)nProgramBindConstants },
3004{"rsnProgramBindTexture", "(JJIJ)V", (void*)nProgramBindTexture },
3005{"rsnProgramBindSampler", "(JJIJ)V", (void*)nProgramBindSampler },
Jason Samsebfb4362009-09-23 13:57:02 -07003006
Ashok Bhat98071552014-02-12 09:54:43 +00003007{"rsnProgramFragmentCreate", "(JLjava/lang/String;[Ljava/lang/String;[J)J", (void*)nProgramFragmentCreate },
Tim Murray460a0492013-11-19 12:45:54 -08003008{"rsnProgramRasterCreate", "(JZI)J", (void*)nProgramRasterCreate },
Ashok Bhat98071552014-02-12 09:54:43 +00003009{"rsnProgramVertexCreate", "(JLjava/lang/String;[Ljava/lang/String;[J)J", (void*)nProgramVertexCreate },
Jason Samsd19f10d2009-05-22 14:03:28 -07003010
Narayan Kamath78c0ce52014-03-19 10:15:51 +00003011{"rsnContextBindRootScript", "(JJ)V", (void*)nContextBindRootScript },
3012{"rsnContextBindProgramStore", "(JJ)V", (void*)nContextBindProgramStore },
3013{"rsnContextBindProgramFragment", "(JJ)V", (void*)nContextBindProgramFragment },
3014{"rsnContextBindProgramVertex", "(JJ)V", (void*)nContextBindProgramVertex },
3015{"rsnContextBindProgramRaster", "(JJ)V", (void*)nContextBindProgramRaster },
Jason Sams02fb2cb2009-05-28 15:37:57 -07003016
Ashok Bhat0e0c0882014-02-04 14:57:58 +00003017{"rsnSamplerCreate", "(JIIIIIF)J", (void*)nSamplerCreate },
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -07003018
Ashok Bhat98071552014-02-12 09:54:43 +00003019{"rsnMeshCreate", "(J[J[J[I)J", (void*)nMeshCreate },
Jason Sams2e1872f2010-08-17 16:25:41 -07003020
Tim Murray460a0492013-11-19 12:45:54 -08003021{"rsnMeshGetVertexBufferCount", "(JJ)I", (void*)nMeshGetVertexBufferCount },
3022{"rsnMeshGetIndexCount", "(JJ)I", (void*)nMeshGetIndexCount },
Ashok Bhat98071552014-02-12 09:54:43 +00003023{"rsnMeshGetVertices", "(JJ[JI)V", (void*)nMeshGetVertices },
3024{"rsnMeshGetIndices", "(JJ[J[II)V", (void*)nMeshGetIndices },
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07003025
Tim Murray56f9e6f2014-05-16 11:47:26 -07003026{"rsnSystemGetPointerSize", "()I", (void*)nSystemGetPointerSize },
Miao Wang0facf022015-11-25 11:21:13 -08003027{"rsnAllocationGetByteBuffer", "(JJ[JIII)Ljava/nio/ByteBuffer;", (void*)nAllocationGetByteBuffer },
Jason Samsd19f10d2009-05-22 14:03:28 -07003028};
3029
3030static int registerFuncs(JNIEnv *_env)
3031{
3032 return android::AndroidRuntime::registerNativeMethods(
3033 _env, classPathName, methods, NELEM(methods));
3034}
3035
3036// ---------------------------------------------------------------------------
3037
3038jint JNI_OnLoad(JavaVM* vm, void* reserved)
3039{
Chris Wailes488230c32014-08-14 11:22:40 -07003040 JNIEnv* env = nullptr;
Jason Samsd19f10d2009-05-22 14:03:28 -07003041 jint result = -1;
3042
Jason Samsd19f10d2009-05-22 14:03:28 -07003043 if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
Steve Block3762c312012-01-06 19:20:56 +00003044 ALOGE("ERROR: GetEnv failed\n");
Jason Samsd19f10d2009-05-22 14:03:28 -07003045 goto bail;
3046 }
Chris Wailes488230c32014-08-14 11:22:40 -07003047 assert(env != nullptr);
Jason Samsd19f10d2009-05-22 14:03:28 -07003048
3049 if (registerFuncs(env) < 0) {
Ashok Bhat0e0c0882014-02-04 14:57:58 +00003050 ALOGE("ERROR: Renderscript native registration failed\n");
Jason Samsd19f10d2009-05-22 14:03:28 -07003051 goto bail;
3052 }
3053
3054 /* success -- return valid version number */
3055 result = JNI_VERSION_1_4;
3056
3057bail:
3058 return result;
3059}