blob: af370ff2f6309cb05b785ceaf3486eb90c7c7f52 [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,
Miao Wangb742fcc2016-10-06 10:45:42 -0700647 in_allocs, NELEM(in_allocs), nullptr,
Tim Murray25207df2015-01-12 16:47:56 -0800648 &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,
David Gross4a457852016-06-02 14:46:55 -07002109 jlongArray ains, jlong aout, jintArray limits)
Matt Wala36eb1f72015-07-20 15:35:27 -07002110{
2111 if (kLogApi) {
David Gross4a457852016-06-02 14:46:55 -07002112 ALOGD("nScriptReduce, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
David Gross26ef7a732016-01-12 12:19:15 -08002113 }
2114
2115 if (ains == nullptr) {
2116 ALOGE("At least one input required.");
2117 // TODO (b/20758983): Report back to Java and throw an exception
2118 return;
2119 }
2120 jint in_len = _env->GetArrayLength(ains);
2121 if (in_len > (jint)RS_KERNEL_MAX_ARGUMENTS) {
2122 ALOGE("Too many arguments in kernel launch.");
2123 // TODO (b/20758983): Report back to Java and throw an exception
2124 return;
2125 }
2126
2127 jlong *in_ptr = _env->GetLongArrayElements(ains, nullptr);
2128 if (in_ptr == nullptr) {
2129 ALOGE("Failed to get Java array elements");
2130 // TODO (b/20758983): Report back to Java and throw an exception
2131 return;
2132 }
2133
2134 RsAllocation *in_allocs = nullptr;
2135 if (sizeof(RsAllocation) == sizeof(jlong)) {
2136 in_allocs = (RsAllocation*)in_ptr;
2137 } else {
2138 // Convert from 64-bit jlong types to the native pointer type.
2139
2140 in_allocs = (RsAllocation*)alloca(in_len * sizeof(RsAllocation));
2141 if (in_allocs == nullptr) {
2142 ALOGE("Failed launching kernel for lack of memory.");
2143 // TODO (b/20758983): Report back to Java and throw an exception
2144 _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
2145 return;
2146 }
2147
2148 for (int index = in_len; --index >= 0;) {
2149 in_allocs[index] = (RsAllocation)in_ptr[index];
2150 }
2151 }
2152
2153 RsScriptCall sc, *sca = nullptr;
2154 uint32_t sc_size = 0;
2155
2156 jint limit_len = 0;
2157 jint *limit_ptr = nullptr;
2158
2159 if (limits != nullptr) {
2160 limit_len = _env->GetArrayLength(limits);
2161 limit_ptr = _env->GetIntArrayElements(limits, nullptr);
2162 if (limit_ptr == nullptr) {
2163 ALOGE("Failed to get Java array elements");
2164 // TODO (b/20758983): Report back to Java and throw an exception
2165 return;
2166 }
2167
2168 assert(limit_len == 6);
2169 UNUSED(limit_len); // As the assert might not be compiled.
2170
2171 sc.xStart = limit_ptr[0];
2172 sc.xEnd = limit_ptr[1];
2173 sc.yStart = limit_ptr[2];
2174 sc.yEnd = limit_ptr[3];
2175 sc.zStart = limit_ptr[4];
2176 sc.zEnd = limit_ptr[5];
2177 sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
2178 sc.arrayStart = 0;
2179 sc.arrayEnd = 0;
2180 sc.array2Start = 0;
2181 sc.array2End = 0;
2182 sc.array3Start = 0;
2183 sc.array3End = 0;
2184 sc.array4Start = 0;
2185 sc.array4End = 0;
2186
2187 sca = &sc;
2188 sc_size = sizeof(sc);
2189 }
2190
David Gross4a457852016-06-02 14:46:55 -07002191 rsScriptReduce((RsContext)con, (RsScript)script, slot,
2192 in_allocs, in_len, (RsAllocation)aout,
2193 sca, sc_size);
David Gross26ef7a732016-01-12 12:19:15 -08002194
2195 _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
2196
2197 if (limits != nullptr) {
2198 _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
2199 }
2200}
2201
Jason Sams22534172009-08-04 16:58:20 -07002202// -----------------------------------
2203
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002204static jlong
Tim Murrayeff663f2013-11-15 13:08:30 -08002205nScriptCCreate(JNIEnv *_env, jobject _this, jlong con,
Jason Samse4a06c52011-03-16 16:29:28 -07002206 jstring resName, jstring cacheDir,
2207 jbyteArray scriptRef, jint length)
Jason Sams22534172009-08-04 16:58:20 -07002208{
Andreas Gampe67333922014-11-10 20:35:59 -08002209 if (kLogApi) {
2210 ALOGD("nScriptCCreate, con(%p)", (RsContext)con);
2211 }
Jason Sams22534172009-08-04 16:58:20 -07002212
Jason Samse4a06c52011-03-16 16:29:28 -07002213 AutoJavaStringToUTF8 resNameUTF(_env, resName);
2214 AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002215 jlong ret = 0;
Chris Wailes488230c32014-08-14 11:22:40 -07002216 jbyte* script_ptr = nullptr;
Jack Palevich43702d82009-05-28 13:38:16 -07002217 jint _exception = 0;
2218 jint remaining;
Jack Palevich43702d82009-05-28 13:38:16 -07002219 if (!scriptRef) {
2220 _exception = 1;
Elliott Hughes8451b252011-04-07 19:17:57 -07002221 //jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null");
Jack Palevich43702d82009-05-28 13:38:16 -07002222 goto exit;
2223 }
Jack Palevich43702d82009-05-28 13:38:16 -07002224 if (length < 0) {
2225 _exception = 1;
Elliott Hughes8451b252011-04-07 19:17:57 -07002226 //jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0");
Jack Palevich43702d82009-05-28 13:38:16 -07002227 goto exit;
2228 }
Jason Samse4a06c52011-03-16 16:29:28 -07002229 remaining = _env->GetArrayLength(scriptRef);
Jack Palevich43702d82009-05-28 13:38:16 -07002230 if (remaining < length) {
2231 _exception = 1;
Elliott Hughes8451b252011-04-07 19:17:57 -07002232 //jniThrowException(_env, "java/lang/IllegalArgumentException",
2233 // "length > script.length - offset");
Jack Palevich43702d82009-05-28 13:38:16 -07002234 goto exit;
2235 }
Jason Samse4a06c52011-03-16 16:29:28 -07002236 script_ptr = (jbyte *)
Jack Palevich43702d82009-05-28 13:38:16 -07002237 _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0);
Miao Wangba8766c2015-10-12 17:24:13 -07002238 if (script_ptr == nullptr) {
2239 ALOGE("Failed to get Java array elements");
2240 return ret;
2241 }
Jack Palevich43702d82009-05-28 13:38:16 -07002242
Tim Murrayeff663f2013-11-15 13:08:30 -08002243 //rsScriptCSetText((RsContext)con, (const char *)script_ptr, length);
Jason Samse4a06c52011-03-16 16:29:28 -07002244
Tim Murray3aa89c12014-08-18 17:51:22 -07002245 ret = (jlong)(uintptr_t)rsScriptCCreate((RsContext)con,
Alex Sakhartchouke7c4a752011-04-06 10:57:51 -07002246 resNameUTF.c_str(), resNameUTF.length(),
2247 cacheDirUTF.c_str(), cacheDirUTF.length(),
Jason Samse4a06c52011-03-16 16:29:28 -07002248 (const char *)script_ptr, length);
Jason Sams39ddc9502009-06-05 17:35:09 -07002249
Jack Palevich43702d82009-05-28 13:38:16 -07002250exit:
Jason Samse4a06c52011-03-16 16:29:28 -07002251 if (script_ptr) {
2252 _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr,
Jack Palevich43702d82009-05-28 13:38:16 -07002253 _exception ? JNI_ABORT: 0);
2254 }
Jason Samsd19f10d2009-05-22 14:03:28 -07002255
Tim Murray3aa89c12014-08-18 17:51:22 -07002256 return (jlong)(uintptr_t)ret;
Jason Samsd19f10d2009-05-22 14:03:28 -07002257}
2258
Tim Murray460a0492013-11-19 12:45:54 -08002259static jlong
2260nScriptIntrinsicCreate(JNIEnv *_env, jobject _this, jlong con, jint id, jlong eid)
Jason Sams6ab97682012-08-10 12:09:43 -07002261{
Andreas Gampe67333922014-11-10 20:35:59 -08002262 if (kLogApi) {
2263 ALOGD("nScriptIntrinsicCreate, con(%p) id(%i) element(%p)", (RsContext)con, id,
2264 (void *)eid);
2265 }
Tim Murray3aa89c12014-08-18 17:51:22 -07002266 return (jlong)(uintptr_t)rsScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
Jason Sams6ab97682012-08-10 12:09:43 -07002267}
2268
Tim Murray460a0492013-11-19 12:45:54 -08002269static jlong
2270nScriptKernelIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jint sig)
Jason Sams08a81582012-09-18 12:32:10 -07002271{
Andreas Gampe67333922014-11-10 20:35:59 -08002272 if (kLogApi) {
2273 ALOGD("nScriptKernelIDCreate, con(%p) script(%p), slot(%i), sig(%i)", (RsContext)con,
2274 (void *)sid, slot, sig);
2275 }
Tim Murray3aa89c12014-08-18 17:51:22 -07002276 return (jlong)(uintptr_t)rsScriptKernelIDCreate((RsContext)con, (RsScript)sid, slot, sig);
Jason Sams08a81582012-09-18 12:32:10 -07002277}
2278
Tim Murray460a0492013-11-19 12:45:54 -08002279static jlong
Yang Nibe392ad2015-01-23 17:16:02 -08002280nScriptInvokeIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
2281{
2282 if (kLogApi) {
Elliott Hughes7ff53fa2015-02-05 21:36:10 -08002283 ALOGD("nScriptInvokeIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con,
Yang Nibe392ad2015-01-23 17:16:02 -08002284 (void *)sid, slot);
2285 }
2286 return (jlong)(uintptr_t)rsScriptInvokeIDCreate((RsContext)con, (RsScript)sid, slot);
2287}
2288
2289static jlong
Tim Murray460a0492013-11-19 12:45:54 -08002290nScriptFieldIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
Jason Sams08a81582012-09-18 12:32:10 -07002291{
Andreas Gampe67333922014-11-10 20:35:59 -08002292 if (kLogApi) {
2293 ALOGD("nScriptFieldIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con, (void *)sid,
2294 slot);
2295 }
Tim Murray3aa89c12014-08-18 17:51:22 -07002296 return (jlong)(uintptr_t)rsScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
Jason Sams08a81582012-09-18 12:32:10 -07002297}
2298
Tim Murray460a0492013-11-19 12:45:54 -08002299static jlong
Ashok Bhat98071552014-02-12 09:54:43 +00002300nScriptGroupCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _kernels, jlongArray _src,
2301 jlongArray _dstk, jlongArray _dstf, jlongArray _types)
Jason Sams08a81582012-09-18 12:32:10 -07002302{
Andreas Gampe67333922014-11-10 20:35:59 -08002303 if (kLogApi) {
2304 ALOGD("nScriptGroupCreate, con(%p)", (RsContext)con);
2305 }
Jason Sams08a81582012-09-18 12:32:10 -07002306
Miao Wanga4ad5f82016-02-11 12:32:39 -08002307 jlong id = 0;
2308
2309 RsScriptKernelID* kernelsPtr;
Ashok Bhat98071552014-02-12 09:54:43 +00002310 jint kernelsLen = _env->GetArrayLength(_kernels);
Chris Wailes488230c32014-08-14 11:22:40 -07002311 jlong *jKernelsPtr = _env->GetLongArrayElements(_kernels, nullptr);
Miao Wanga4ad5f82016-02-11 12:32:39 -08002312
2313 RsScriptKernelID* srcPtr;
2314 jint srcLen = _env->GetArrayLength(_src);
2315 jlong *jSrcPtr = _env->GetLongArrayElements(_src, nullptr);
2316
2317 RsScriptKernelID* dstkPtr;
2318 jint dstkLen = _env->GetArrayLength(_dstk);
2319 jlong *jDstkPtr = _env->GetLongArrayElements(_dstk, nullptr);
2320
2321 RsScriptKernelID* dstfPtr;
2322 jint dstfLen = _env->GetArrayLength(_dstf);
2323 jlong *jDstfPtr = _env->GetLongArrayElements(_dstf, nullptr);
2324
2325 RsType* typesPtr;
2326 jint typesLen = _env->GetArrayLength(_types);
2327 jlong *jTypesPtr = _env->GetLongArrayElements(_types, nullptr);
2328
Miao Wangba8766c2015-10-12 17:24:13 -07002329 if (jKernelsPtr == nullptr) {
2330 ALOGE("Failed to get Java array elements: kernels");
Miao Wanga4ad5f82016-02-11 12:32:39 -08002331 goto cleanup;
Miao Wangba8766c2015-10-12 17:24:13 -07002332 }
Miao Wanga4ad5f82016-02-11 12:32:39 -08002333 if (jSrcPtr == nullptr) {
2334 ALOGE("Failed to get Java array elements: src");
2335 goto cleanup;
2336 }
2337 if (jDstkPtr == nullptr) {
2338 ALOGE("Failed to get Java array elements: dstk");
2339 goto cleanup;
2340 }
2341 if (jDstfPtr == nullptr) {
2342 ALOGE("Failed to get Java array elements: dstf");
2343 goto cleanup;
2344 }
2345 if (jTypesPtr == nullptr) {
2346 ALOGE("Failed to get Java array elements: types");
2347 goto cleanup;
2348 }
2349
2350 kernelsPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * kernelsLen);
Ashok Bhat98071552014-02-12 09:54:43 +00002351 for(int i = 0; i < kernelsLen; ++i) {
2352 kernelsPtr[i] = (RsScriptKernelID)jKernelsPtr[i];
2353 }
Jason Sams08a81582012-09-18 12:32:10 -07002354
Miao Wanga4ad5f82016-02-11 12:32:39 -08002355 srcPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * srcLen);
Ashok Bhat98071552014-02-12 09:54:43 +00002356 for(int i = 0; i < srcLen; ++i) {
2357 srcPtr[i] = (RsScriptKernelID)jSrcPtr[i];
2358 }
Jason Sams08a81582012-09-18 12:32:10 -07002359
Miao Wanga4ad5f82016-02-11 12:32:39 -08002360 dstkPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstkLen);
Ashok Bhat98071552014-02-12 09:54:43 +00002361 for(int i = 0; i < dstkLen; ++i) {
2362 dstkPtr[i] = (RsScriptKernelID)jDstkPtr[i];
2363 }
2364
Miao Wanga4ad5f82016-02-11 12:32:39 -08002365 dstfPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstfLen);
Ashok Bhat98071552014-02-12 09:54:43 +00002366 for(int i = 0; i < dstfLen; ++i) {
2367 dstfPtr[i] = (RsScriptKernelID)jDstfPtr[i];
2368 }
2369
Miao Wanga4ad5f82016-02-11 12:32:39 -08002370 typesPtr = (RsType*) malloc(sizeof(RsType) * typesLen);
Ashok Bhat98071552014-02-12 09:54:43 +00002371 for(int i = 0; i < typesLen; ++i) {
2372 typesPtr[i] = (RsType)jTypesPtr[i];
2373 }
2374
Miao Wanga4ad5f82016-02-11 12:32:39 -08002375 id = (jlong)(uintptr_t)rsScriptGroupCreate((RsContext)con,
Ashok Bhat98071552014-02-12 09:54:43 +00002376 (RsScriptKernelID *)kernelsPtr, kernelsLen * sizeof(RsScriptKernelID),
2377 (RsScriptKernelID *)srcPtr, srcLen * sizeof(RsScriptKernelID),
2378 (RsScriptKernelID *)dstkPtr, dstkLen * sizeof(RsScriptKernelID),
2379 (RsScriptFieldID *)dstfPtr, dstfLen * sizeof(RsScriptKernelID),
2380 (RsType *)typesPtr, typesLen * sizeof(RsType));
2381
2382 free(kernelsPtr);
2383 free(srcPtr);
2384 free(dstkPtr);
2385 free(dstfPtr);
2386 free(typesPtr);
Miao Wanga4ad5f82016-02-11 12:32:39 -08002387
2388cleanup:
2389 if (jKernelsPtr != nullptr) {
2390 _env->ReleaseLongArrayElements(_kernels, jKernelsPtr, 0);
2391 }
2392 if (jSrcPtr != nullptr) {
2393 _env->ReleaseLongArrayElements(_src, jSrcPtr, 0);
2394 }
2395 if (jDstkPtr != nullptr) {
2396 _env->ReleaseLongArrayElements(_dstk, jDstkPtr, 0);
2397 }
2398 if (jDstfPtr != nullptr) {
2399 _env->ReleaseLongArrayElements(_dstf, jDstfPtr, 0);
2400 }
2401 if (jTypesPtr != nullptr) {
2402 _env->ReleaseLongArrayElements(_types, jTypesPtr, 0);
2403 }
2404
Jason Sams08a81582012-09-18 12:32:10 -07002405 return id;
2406}
2407
2408static void
Tim Murray460a0492013-11-19 12:45:54 -08002409nScriptGroupSetInput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
Jason Sams08a81582012-09-18 12:32:10 -07002410{
Andreas Gampe67333922014-11-10 20:35:59 -08002411 if (kLogApi) {
2412 ALOGD("nScriptGroupSetInput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
2413 (void *)gid, (void *)kid, (void *)alloc);
2414 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002415 rsScriptGroupSetInput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid, (RsAllocation)alloc);
Jason Sams08a81582012-09-18 12:32:10 -07002416}
2417
2418static void
Tim Murray460a0492013-11-19 12:45:54 -08002419nScriptGroupSetOutput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
Jason Sams08a81582012-09-18 12:32:10 -07002420{
Andreas Gampe67333922014-11-10 20:35:59 -08002421 if (kLogApi) {
2422 ALOGD("nScriptGroupSetOutput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
2423 (void *)gid, (void *)kid, (void *)alloc);
2424 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002425 rsScriptGroupSetOutput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid, (RsAllocation)alloc);
Jason Sams08a81582012-09-18 12:32:10 -07002426}
2427
2428static void
Tim Murray460a0492013-11-19 12:45:54 -08002429nScriptGroupExecute(JNIEnv *_env, jobject _this, jlong con, jlong gid)
Jason Sams08a81582012-09-18 12:32:10 -07002430{
Andreas Gampe67333922014-11-10 20:35:59 -08002431 if (kLogApi) {
2432 ALOGD("nScriptGroupSetOutput, con(%p) group(%p)", (RsContext)con, (void *)gid);
2433 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002434 rsScriptGroupExecute((RsContext)con, (RsScriptGroup)gid);
Jason Sams08a81582012-09-18 12:32:10 -07002435}
2436
Jason Samsd19f10d2009-05-22 14:03:28 -07002437// ---------------------------------------------------------------------------
2438
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002439static jlong
Tim Murrayeff663f2013-11-15 13:08:30 -08002440nProgramStoreCreate(JNIEnv *_env, jobject _this, jlong con,
Jason Sams331bf9b2011-04-06 11:23:54 -07002441 jboolean colorMaskR, jboolean colorMaskG, jboolean colorMaskB, jboolean colorMaskA,
2442 jboolean depthMask, jboolean ditherEnable,
2443 jint srcFunc, jint destFunc,
2444 jint depthFunc)
Jason Samsd19f10d2009-05-22 14:03:28 -07002445{
Andreas Gampe67333922014-11-10 20:35:59 -08002446 if (kLogApi) {
2447 ALOGD("nProgramStoreCreate, con(%p)", (RsContext)con);
2448 }
Tim Murray3aa89c12014-08-18 17:51:22 -07002449 return (jlong)(uintptr_t)rsProgramStoreCreate((RsContext)con, colorMaskR, colorMaskG, colorMaskB, colorMaskA,
Jason Sams331bf9b2011-04-06 11:23:54 -07002450 depthMask, ditherEnable, (RsBlendSrcFunc)srcFunc,
2451 (RsBlendDstFunc)destFunc, (RsDepthFunc)depthFunc);
Jason Samsd19f10d2009-05-22 14:03:28 -07002452}
2453
Jason Sams0011bcf2009-12-15 12:58:36 -08002454// ---------------------------------------------------------------------------
2455
2456static void
Tim Murray460a0492013-11-19 12:45:54 -08002457nProgramBindConstants(JNIEnv *_env, jobject _this, jlong con, jlong vpv, jint slot, jlong a)
Jason Sams0011bcf2009-12-15 12:58:36 -08002458{
Andreas Gampe67333922014-11-10 20:35:59 -08002459 if (kLogApi) {
2460 ALOGD("nProgramBindConstants, con(%p), vpf(%p), sloat(%i), a(%p)", (RsContext)con,
2461 (RsProgramVertex)vpv, slot, (RsAllocation)a);
2462 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002463 rsProgramBindConstants((RsContext)con, (RsProgram)vpv, slot, (RsAllocation)a);
Jason Sams0011bcf2009-12-15 12:58:36 -08002464}
Jason Sams54c0ec12009-11-30 14:49:55 -08002465
Jason Sams68afd012009-12-17 16:55:08 -08002466static void
Tim Murray460a0492013-11-19 12:45:54 -08002467nProgramBindTexture(JNIEnv *_env, jobject _this, jlong con, jlong vpf, jint slot, jlong a)
Jason Sams68afd012009-12-17 16:55:08 -08002468{
Andreas Gampe67333922014-11-10 20:35:59 -08002469 if (kLogApi) {
2470 ALOGD("nProgramBindTexture, con(%p), vpf(%p), slot(%i), a(%p)", (RsContext)con,
2471 (RsProgramFragment)vpf, slot, (RsAllocation)a);
2472 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002473 rsProgramBindTexture((RsContext)con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
Jason Sams68afd012009-12-17 16:55:08 -08002474}
2475
2476static void
Tim Murray460a0492013-11-19 12:45:54 -08002477nProgramBindSampler(JNIEnv *_env, jobject _this, jlong con, jlong vpf, jint slot, jlong a)
Jason Sams68afd012009-12-17 16:55:08 -08002478{
Andreas Gampe67333922014-11-10 20:35:59 -08002479 if (kLogApi) {
2480 ALOGD("nProgramBindSampler, con(%p), vpf(%p), slot(%i), a(%p)", (RsContext)con,
2481 (RsProgramFragment)vpf, slot, (RsSampler)a);
2482 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002483 rsProgramBindSampler((RsContext)con, (RsProgramFragment)vpf, slot, (RsSampler)a);
Jason Sams68afd012009-12-17 16:55:08 -08002484}
2485
Jason Samsd19f10d2009-05-22 14:03:28 -07002486// ---------------------------------------------------------------------------
2487
Tim Murray460a0492013-11-19 12:45:54 -08002488static jlong
Tim Murrayeff663f2013-11-15 13:08:30 -08002489nProgramFragmentCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader,
Ashok Bhat98071552014-02-12 09:54:43 +00002490 jobjectArray texNames, jlongArray params)
Jason Sams7e5ab3b2009-12-15 13:27:04 -08002491{
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08002492 AutoJavaStringToUTF8 shaderUTF(_env, shader);
Chris Wailes488230c32014-08-14 11:22:40 -07002493 jlong *jParamPtr = _env->GetLongArrayElements(params, nullptr);
Jason Sams7e5ab3b2009-12-15 13:27:04 -08002494 jint paramLen = _env->GetArrayLength(params);
Miao Wangba8766c2015-10-12 17:24:13 -07002495 if (jParamPtr == nullptr) {
2496 ALOGE("Failed to get Java array elements");
2497 return 0;
2498 }
Jason Sams7e5ab3b2009-12-15 13:27:04 -08002499
Alex Sakhartchouk2123b462012-02-15 16:21:46 -08002500 int texCount = _env->GetArrayLength(texNames);
2501 AutoJavaStringArrayToUTF8 names(_env, texNames, texCount);
2502 const char ** nameArray = names.c_str();
2503 size_t* sizeArray = names.c_str_len();
2504
Andreas Gampe67333922014-11-10 20:35:59 -08002505 if (kLogApi) {
2506 ALOGD("nProgramFragmentCreate, con(%p), paramLen(%i)", (RsContext)con, paramLen);
2507 }
Jason Sams7e5ab3b2009-12-15 13:27:04 -08002508
Ashok Bhat98071552014-02-12 09:54:43 +00002509 uintptr_t * paramPtr = (uintptr_t*) malloc(sizeof(uintptr_t) * paramLen);
2510 for(int i = 0; i < paramLen; ++i) {
2511 paramPtr[i] = (uintptr_t)jParamPtr[i];
2512 }
Tim Murray3aa89c12014-08-18 17:51:22 -07002513 jlong ret = (jlong)(uintptr_t)rsProgramFragmentCreate((RsContext)con, shaderUTF.c_str(), shaderUTF.length(),
Alex Sakhartchouk2123b462012-02-15 16:21:46 -08002514 nameArray, texCount, sizeArray,
Ashok Bhat98071552014-02-12 09:54:43 +00002515 paramPtr, paramLen);
Alex Sakhartchouk2123b462012-02-15 16:21:46 -08002516
Ashok Bhat98071552014-02-12 09:54:43 +00002517 free(paramPtr);
2518 _env->ReleaseLongArrayElements(params, jParamPtr, JNI_ABORT);
Jason Sams7e5ab3b2009-12-15 13:27:04 -08002519 return ret;
2520}
2521
2522
Jason Sams1fe9b8c2009-06-11 14:46:10 -07002523// ---------------------------------------------------------------------------
2524
Tim Murray460a0492013-11-19 12:45:54 -08002525static jlong
Tim Murrayeff663f2013-11-15 13:08:30 -08002526nProgramVertexCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader,
Ashok Bhat98071552014-02-12 09:54:43 +00002527 jobjectArray texNames, jlongArray params)
Jason Sams1fe9b8c2009-06-11 14:46:10 -07002528{
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -08002529 AutoJavaStringToUTF8 shaderUTF(_env, shader);
Chris Wailes488230c32014-08-14 11:22:40 -07002530 jlong *jParamPtr = _env->GetLongArrayElements(params, nullptr);
Jason Sams0011bcf2009-12-15 12:58:36 -08002531 jint paramLen = _env->GetArrayLength(params);
Miao Wangba8766c2015-10-12 17:24:13 -07002532 if (jParamPtr == nullptr) {
2533 ALOGE("Failed to get Java array elements");
2534 return 0;
2535 }
Jason Sams1fe9b8c2009-06-11 14:46:10 -07002536
Andreas Gampe67333922014-11-10 20:35:59 -08002537 if (kLogApi) {
2538 ALOGD("nProgramVertexCreate, con(%p), paramLen(%i)", (RsContext)con, paramLen);
2539 }
Jason Sams0011bcf2009-12-15 12:58:36 -08002540
Alex Sakhartchouk2123b462012-02-15 16:21:46 -08002541 int texCount = _env->GetArrayLength(texNames);
2542 AutoJavaStringArrayToUTF8 names(_env, texNames, texCount);
2543 const char ** nameArray = names.c_str();
2544 size_t* sizeArray = names.c_str_len();
2545
Ashok Bhat98071552014-02-12 09:54:43 +00002546 uintptr_t * paramPtr = (uintptr_t*) malloc(sizeof(uintptr_t) * paramLen);
2547 for(int i = 0; i < paramLen; ++i) {
2548 paramPtr[i] = (uintptr_t)jParamPtr[i];
2549 }
2550
Tim Murray3aa89c12014-08-18 17:51:22 -07002551 jlong ret = (jlong)(uintptr_t)rsProgramVertexCreate((RsContext)con, shaderUTF.c_str(), shaderUTF.length(),
Alex Sakhartchouk2123b462012-02-15 16:21:46 -08002552 nameArray, texCount, sizeArray,
Ashok Bhat98071552014-02-12 09:54:43 +00002553 paramPtr, paramLen);
Alex Sakhartchouk2123b462012-02-15 16:21:46 -08002554
Ashok Bhat98071552014-02-12 09:54:43 +00002555 free(paramPtr);
2556 _env->ReleaseLongArrayElements(params, jParamPtr, JNI_ABORT);
Jason Sams0011bcf2009-12-15 12:58:36 -08002557 return ret;
2558}
Jason Sams1fe9b8c2009-06-11 14:46:10 -07002559
Jason Samsebfb4362009-09-23 13:57:02 -07002560// ---------------------------------------------------------------------------
2561
Tim Murray460a0492013-11-19 12:45:54 -08002562static jlong
Tim Murrayeff663f2013-11-15 13:08:30 -08002563nProgramRasterCreate(JNIEnv *_env, jobject _this, jlong con, jboolean pointSprite, jint cull)
Jason Samsebfb4362009-09-23 13:57:02 -07002564{
Andreas Gampe67333922014-11-10 20:35:59 -08002565 if (kLogApi) {
2566 ALOGD("nProgramRasterCreate, con(%p), pointSprite(%i), cull(%i)", (RsContext)con,
2567 pointSprite, cull);
2568 }
Tim Murray3aa89c12014-08-18 17:51:22 -07002569 return (jlong)(uintptr_t)rsProgramRasterCreate((RsContext)con, pointSprite, (RsCullMode)cull);
Jason Samsebfb4362009-09-23 13:57:02 -07002570}
2571
Jason Samsd19f10d2009-05-22 14:03:28 -07002572
2573// ---------------------------------------------------------------------------
2574
2575static void
Narayan Kamath78c0ce52014-03-19 10:15:51 +00002576nContextBindRootScript(JNIEnv *_env, jobject _this, jlong con, jlong script)
Jason Samsd19f10d2009-05-22 14:03:28 -07002577{
Andreas Gampe67333922014-11-10 20:35:59 -08002578 if (kLogApi) {
2579 ALOGD("nContextBindRootScript, con(%p), script(%p)", (RsContext)con, (RsScript)script);
2580 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002581 rsContextBindRootScript((RsContext)con, (RsScript)script);
Jason Samsd19f10d2009-05-22 14:03:28 -07002582}
2583
2584static void
Narayan Kamath78c0ce52014-03-19 10:15:51 +00002585nContextBindProgramStore(JNIEnv *_env, jobject _this, jlong con, jlong pfs)
Jason Samsd19f10d2009-05-22 14:03:28 -07002586{
Andreas Gampe67333922014-11-10 20:35:59 -08002587 if (kLogApi) {
2588 ALOGD("nContextBindProgramStore, con(%p), pfs(%p)", (RsContext)con, (RsProgramStore)pfs);
2589 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002590 rsContextBindProgramStore((RsContext)con, (RsProgramStore)pfs);
Jason Samsd19f10d2009-05-22 14:03:28 -07002591}
2592
2593static void
Narayan Kamath78c0ce52014-03-19 10:15:51 +00002594nContextBindProgramFragment(JNIEnv *_env, jobject _this, jlong con, jlong pf)
Jason Samsd19f10d2009-05-22 14:03:28 -07002595{
Andreas Gampe67333922014-11-10 20:35:59 -08002596 if (kLogApi) {
2597 ALOGD("nContextBindProgramFragment, con(%p), pf(%p)", (RsContext)con,
2598 (RsProgramFragment)pf);
2599 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002600 rsContextBindProgramFragment((RsContext)con, (RsProgramFragment)pf);
Jason Samsd19f10d2009-05-22 14:03:28 -07002601}
2602
Jason Sams0826a6f2009-06-15 19:04:56 -07002603static void
Narayan Kamath78c0ce52014-03-19 10:15:51 +00002604nContextBindProgramVertex(JNIEnv *_env, jobject _this, jlong con, jlong pf)
Jason Sams0826a6f2009-06-15 19:04:56 -07002605{
Andreas Gampe67333922014-11-10 20:35:59 -08002606 if (kLogApi) {
2607 ALOGD("nContextBindProgramVertex, con(%p), pf(%p)", (RsContext)con, (RsProgramVertex)pf);
2608 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002609 rsContextBindProgramVertex((RsContext)con, (RsProgramVertex)pf);
Jason Sams0826a6f2009-06-15 19:04:56 -07002610}
2611
Joe Onoratod7b37742009-08-09 22:57:44 -07002612static void
Narayan Kamath78c0ce52014-03-19 10:15:51 +00002613nContextBindProgramRaster(JNIEnv *_env, jobject _this, jlong con, jlong pf)
Jason Samsebfb4362009-09-23 13:57:02 -07002614{
Andreas Gampe67333922014-11-10 20:35:59 -08002615 if (kLogApi) {
2616 ALOGD("nContextBindProgramRaster, con(%p), pf(%p)", (RsContext)con, (RsProgramRaster)pf);
2617 }
Tim Murrayeff663f2013-11-15 13:08:30 -08002618 rsContextBindProgramRaster((RsContext)con, (RsProgramRaster)pf);
Jason Samsebfb4362009-09-23 13:57:02 -07002619}
2620
Joe Onoratod7b37742009-08-09 22:57:44 -07002621
Jason Sams02fb2cb2009-05-28 15:37:57 -07002622// ---------------------------------------------------------------------------
2623
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002624static jlong
Tim Murrayeff663f2013-11-15 13:08:30 -08002625nSamplerCreate(JNIEnv *_env, jobject _this, jlong con, jint magFilter, jint minFilter,
Alex Sakhartchouka89094a2011-05-04 17:45:36 -07002626 jint wrapS, jint wrapT, jint wrapR, jfloat aniso)
Jason Sams02fb2cb2009-05-28 15:37:57 -07002627{
Andreas Gampe67333922014-11-10 20:35:59 -08002628 if (kLogApi) {
2629 ALOGD("nSamplerCreate, con(%p)", (RsContext)con);
2630 }
Tim Murray3aa89c12014-08-18 17:51:22 -07002631 return (jlong)(uintptr_t)rsSamplerCreate((RsContext)con,
Alex Sakhartchouka89094a2011-05-04 17:45:36 -07002632 (RsSamplerValue)magFilter,
2633 (RsSamplerValue)minFilter,
2634 (RsSamplerValue)wrapS,
2635 (RsSamplerValue)wrapT,
2636 (RsSamplerValue)wrapR,
2637 aniso);
Jason Sams02fb2cb2009-05-28 15:37:57 -07002638}
2639
Jason Samsbba134c2009-06-22 15:49:21 -07002640// ---------------------------------------------------------------------------
2641
Tim Murray460a0492013-11-19 12:45:54 -08002642static jlong
Ashok Bhat98071552014-02-12 09:54:43 +00002643nMeshCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _vtx, jlongArray _idx, jintArray _prim)
Jason Samsbba134c2009-06-22 15:49:21 -07002644{
Andreas Gampe67333922014-11-10 20:35:59 -08002645 if (kLogApi) {
2646 ALOGD("nMeshCreate, con(%p)", (RsContext)con);
2647 }
Alex Sakhartchouk25999a02011-05-12 10:38:03 -07002648
Miao Wanga4ad5f82016-02-11 12:32:39 -08002649 jlong id = 0;
2650
2651 RsAllocation* vtxPtr;
Alex Sakhartchouk25999a02011-05-12 10:38:03 -07002652 jint vtxLen = _env->GetArrayLength(_vtx);
Chris Wailes488230c32014-08-14 11:22:40 -07002653 jlong *jVtxPtr = _env->GetLongArrayElements(_vtx, nullptr);
Miao Wanga4ad5f82016-02-11 12:32:39 -08002654
2655 RsAllocation* idxPtr;
2656 jint idxLen = _env->GetArrayLength(_idx);
2657 jlong *jIdxPtr = _env->GetLongArrayElements(_idx, nullptr);
2658
2659 jint primLen = _env->GetArrayLength(_prim);
2660 jint *primPtr = _env->GetIntArrayElements(_prim, nullptr);
2661
Miao Wangba8766c2015-10-12 17:24:13 -07002662 if (jVtxPtr == nullptr) {
2663 ALOGE("Failed to get Java array elements: vtx");
Miao Wanga4ad5f82016-02-11 12:32:39 -08002664 goto cleanupMesh;
Miao Wangba8766c2015-10-12 17:24:13 -07002665 }
Miao Wanga4ad5f82016-02-11 12:32:39 -08002666 if (jIdxPtr == nullptr) {
2667 ALOGE("Failed to get Java array elements: idx");
2668 goto cleanupMesh;
2669 }
2670 if (primPtr == nullptr) {
2671 ALOGE("Failed to get Java array elements: prim");
2672 goto cleanupMesh;
2673 }
2674
2675 vtxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * vtxLen);
Ashok Bhat98071552014-02-12 09:54:43 +00002676 for(int i = 0; i < vtxLen; ++i) {
2677 vtxPtr[i] = (RsAllocation)(uintptr_t)jVtxPtr[i];
2678 }
2679
Miao Wanga4ad5f82016-02-11 12:32:39 -08002680 idxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * idxLen);
Ashok Bhat98071552014-02-12 09:54:43 +00002681 for(int i = 0; i < idxLen; ++i) {
2682 idxPtr[i] = (RsAllocation)(uintptr_t)jIdxPtr[i];
2683 }
2684
Miao Wanga4ad5f82016-02-11 12:32:39 -08002685 id = (jlong)(uintptr_t)rsMeshCreate((RsContext)con,
2686 (RsAllocation *)vtxPtr, vtxLen,
2687 (RsAllocation *)idxPtr, idxLen,
2688 (uint32_t *)primPtr, primLen);
Alex Sakhartchouk25999a02011-05-12 10:38:03 -07002689
Ashok Bhat98071552014-02-12 09:54:43 +00002690 free(vtxPtr);
2691 free(idxPtr);
Miao Wanga4ad5f82016-02-11 12:32:39 -08002692
2693cleanupMesh:
2694 if (jVtxPtr != nullptr) {
2695 _env->ReleaseLongArrayElements(_vtx, jVtxPtr, 0);
2696 }
2697 if (jIdxPtr != nullptr) {
2698 _env->ReleaseLongArrayElements(_idx, jIdxPtr, 0);
2699 }
2700 if (primPtr != nullptr) {
2701 _env->ReleaseIntArrayElements(_prim, primPtr, 0);
2702 }
2703
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -07002704 return id;
2705}
2706
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002707static jint
Tim Murray460a0492013-11-19 12:45:54 -08002708nMeshGetVertexBufferCount(JNIEnv *_env, jobject _this, jlong con, jlong mesh)
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002709{
Andreas Gampe67333922014-11-10 20:35:59 -08002710 if (kLogApi) {
2711 ALOGD("nMeshGetVertexBufferCount, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
2712 }
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002713 jint vtxCount = 0;
Tim Murrayeff663f2013-11-15 13:08:30 -08002714 rsaMeshGetVertexBufferCount((RsContext)con, (RsMesh)mesh, &vtxCount);
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002715 return vtxCount;
2716}
2717
2718static jint
Tim Murray460a0492013-11-19 12:45:54 -08002719nMeshGetIndexCount(JNIEnv *_env, jobject _this, jlong con, jlong mesh)
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002720{
Andreas Gampe67333922014-11-10 20:35:59 -08002721 if (kLogApi) {
2722 ALOGD("nMeshGetIndexCount, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
2723 }
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002724 jint idxCount = 0;
Tim Murrayeff663f2013-11-15 13:08:30 -08002725 rsaMeshGetIndexCount((RsContext)con, (RsMesh)mesh, &idxCount);
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002726 return idxCount;
2727}
2728
2729static void
Ashok Bhat98071552014-02-12 09:54:43 +00002730nMeshGetVertices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jlongArray _ids, jint numVtxIDs)
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002731{
Andreas Gampe67333922014-11-10 20:35:59 -08002732 if (kLogApi) {
2733 ALOGD("nMeshGetVertices, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
2734 }
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002735
2736 RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numVtxIDs * sizeof(RsAllocation));
Tim Murrayeff663f2013-11-15 13:08:30 -08002737 rsaMeshGetVertices((RsContext)con, (RsMesh)mesh, allocs, (uint32_t)numVtxIDs);
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002738
2739 for(jint i = 0; i < numVtxIDs; i ++) {
Tim Murray3aa89c12014-08-18 17:51:22 -07002740 const jlong alloc = (jlong)(uintptr_t)allocs[i];
Ashok Bhat98071552014-02-12 09:54:43 +00002741 _env->SetLongArrayRegion(_ids, i, 1, &alloc);
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002742 }
2743
2744 free(allocs);
2745}
2746
2747static void
Ashok Bhat98071552014-02-12 09:54:43 +00002748nMeshGetIndices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jlongArray _idxIds, jintArray _primitives, jint numIndices)
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002749{
Andreas Gampe67333922014-11-10 20:35:59 -08002750 if (kLogApi) {
2751 ALOGD("nMeshGetVertices, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
2752 }
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002753
2754 RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numIndices * sizeof(RsAllocation));
2755 uint32_t *prims= (uint32_t*)malloc((uint32_t)numIndices * sizeof(uint32_t));
2756
Tim Murrayeff663f2013-11-15 13:08:30 -08002757 rsaMeshGetIndices((RsContext)con, (RsMesh)mesh, allocs, prims, (uint32_t)numIndices);
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002758
2759 for(jint i = 0; i < numIndices; i ++) {
Tim Murray3aa89c12014-08-18 17:51:22 -07002760 const jlong alloc = (jlong)(uintptr_t)allocs[i];
Ashok Bhat98071552014-02-12 09:54:43 +00002761 const jint prim = (jint)prims[i];
2762 _env->SetLongArrayRegion(_idxIds, i, 1, &alloc);
2763 _env->SetIntArrayRegion(_primitives, i, 1, &prim);
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002764 }
2765
2766 free(allocs);
2767 free(prims);
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -07002768}
2769
Tim Murray56f9e6f2014-05-16 11:47:26 -07002770static jint
2771nSystemGetPointerSize(JNIEnv *_env, jobject _this) {
2772 return (jint)sizeof(void*);
2773}
2774
Miao Wang0facf022015-11-25 11:21:13 -08002775static jobject
2776nAllocationGetByteBuffer(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
2777 jlongArray strideArr, jint xBytesSize,
2778 jint dimY, jint dimZ) {
2779 if (kLogApi) {
2780 ALOGD("nAllocationGetByteBuffer, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
2781 }
Tim Murray56f9e6f2014-05-16 11:47:26 -07002782
Miao Wang0facf022015-11-25 11:21:13 -08002783 jlong *jStridePtr = _env->GetLongArrayElements(strideArr, nullptr);
2784 if (jStridePtr == nullptr) {
2785 ALOGE("Failed to get Java array elements: strideArr");
2786 return 0;
2787 }
2788
2789 size_t strideIn = xBytesSize;
2790 void* ptr = nullptr;
2791 if (alloc != 0) {
2792 ptr = rsAllocationGetPointer((RsContext)con, (RsAllocation)alloc, 0,
2793 RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 0, 0,
2794 &strideIn, sizeof(size_t));
2795 }
2796
2797 jobject byteBuffer = nullptr;
2798 if (ptr != nullptr) {
2799 size_t bufferSize = strideIn;
2800 jStridePtr[0] = strideIn;
2801 if (dimY > 0) {
2802 bufferSize *= dimY;
2803 }
2804 if (dimZ > 0) {
2805 bufferSize *= dimZ;
2806 }
2807 byteBuffer = _env->NewDirectByteBuffer(ptr, (jlong) bufferSize);
2808 }
2809 _env->ReleaseLongArrayElements(strideArr, jStridePtr, 0);
2810 return byteBuffer;
2811}
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -07002812// ---------------------------------------------------------------------------
2813
Jason Samsd19f10d2009-05-22 14:03:28 -07002814
Jason Sams94d8e90a2009-06-10 16:09:05 -07002815static const char *classPathName = "android/renderscript/RenderScript";
Jason Samsd19f10d2009-05-22 14:03:28 -07002816
Daniel Micay76f6a862015-09-19 17:31:01 -04002817static const JNINativeMethod methods[] = {
Jason Sams1c415172010-11-08 17:06:46 -08002818{"_nInit", "()V", (void*)_nInit },
Jason Samsea84a7c2009-09-04 14:42:41 -07002819
Tim Murrayeff663f2013-11-15 13:08:30 -08002820{"nDeviceCreate", "()J", (void*)nDeviceCreate },
2821{"nDeviceDestroy", "(J)V", (void*)nDeviceDestroy },
2822{"nDeviceSetConfig", "(JII)V", (void*)nDeviceSetConfig },
2823{"nContextGetUserMessage", "(J[I)I", (void*)nContextGetUserMessage },
2824{"nContextGetErrorMessage", "(J)Ljava/lang/String;", (void*)nContextGetErrorMessage },
2825{"nContextPeekMessage", "(J[I)I", (void*)nContextPeekMessage },
Jason Sams1c415172010-11-08 17:06:46 -08002826
Tim Murrayeff663f2013-11-15 13:08:30 -08002827{"nContextInitToClient", "(J)V", (void*)nContextInitToClient },
2828{"nContextDeinitToClient", "(J)V", (void*)nContextDeinitToClient },
Jason Samsd19f10d2009-05-22 14:03:28 -07002829
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -07002830
Jason Sams2e1872f2010-08-17 16:25:41 -07002831// All methods below are thread protected in java.
Tim Murrayeff663f2013-11-15 13:08:30 -08002832{"rsnContextCreate", "(JIII)J", (void*)nContextCreate },
2833{"rsnContextCreateGL", "(JIIIIIIIIIIIIFI)J", (void*)nContextCreateGL },
2834{"rsnContextFinish", "(J)V", (void*)nContextFinish },
2835{"rsnContextSetPriority", "(JI)V", (void*)nContextSetPriority },
Tim Murray47f31582015-04-07 15:43:24 -07002836{"rsnContextSetCacheDir", "(JLjava/lang/String;)V", (void*)nContextSetCacheDir },
Tim Murrayeff663f2013-11-15 13:08:30 -08002837{"rsnContextSetSurface", "(JIILandroid/view/Surface;)V", (void*)nContextSetSurface },
2838{"rsnContextDestroy", "(J)V", (void*)nContextDestroy },
2839{"rsnContextDump", "(JI)V", (void*)nContextDump },
2840{"rsnContextPause", "(J)V", (void*)nContextPause },
2841{"rsnContextResume", "(J)V", (void*)nContextResume },
2842{"rsnContextSendMessage", "(JI[I)V", (void*)nContextSendMessage },
Yang Ni281c3252014-10-24 08:52:24 -07002843{"rsnClosureCreate", "(JJJ[J[J[I[J[J)J", (void*)nClosureCreate },
Yang Nibe392ad2015-01-23 17:16:02 -08002844{"rsnInvokeClosureCreate", "(JJ[B[J[J[I)J", (void*)nInvokeClosureCreate },
Yang Ni281c3252014-10-24 08:52:24 -07002845{"rsnClosureSetArg", "(JJIJI)V", (void*)nClosureSetArg },
2846{"rsnClosureSetGlobal", "(JJJJI)V", (void*)nClosureSetGlobal },
Tim Murray460a0492013-11-19 12:45:54 -08002847{"rsnAssignName", "(JJ[B)V", (void*)nAssignName },
2848{"rsnGetName", "(JJ)Ljava/lang/String;", (void*)nGetName },
2849{"rsnObjDestroy", "(JJ)V", (void*)nObjDestroy },
Jason Sams64676f32009-07-08 18:01:53 -07002850
Tim Murray460a0492013-11-19 12:45:54 -08002851{"rsnFileA3DCreateFromFile", "(JLjava/lang/String;)J", (void*)nFileA3DCreateFromFile },
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002852{"rsnFileA3DCreateFromAssetStream", "(JJ)J", (void*)nFileA3DCreateFromAssetStream },
Tim Murray460a0492013-11-19 12:45:54 -08002853{"rsnFileA3DCreateFromAsset", "(JLandroid/content/res/AssetManager;Ljava/lang/String;)J", (void*)nFileA3DCreateFromAsset },
2854{"rsnFileA3DGetNumIndexEntries", "(JJ)I", (void*)nFileA3DGetNumIndexEntries },
2855{"rsnFileA3DGetIndexEntries", "(JJI[I[Ljava/lang/String;)V", (void*)nFileA3DGetIndexEntries },
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002856{"rsnFileA3DGetEntryByIndex", "(JJI)J", (void*)nFileA3DGetEntryByIndex },
Jason Samsd19f10d2009-05-22 14:03:28 -07002857
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002858{"rsnFontCreateFromFile", "(JLjava/lang/String;FI)J", (void*)nFontCreateFromFile },
2859{"rsnFontCreateFromAssetStream", "(JLjava/lang/String;FIJ)J", (void*)nFontCreateFromAssetStream },
2860{"rsnFontCreateFromAsset", "(JLandroid/content/res/AssetManager;Ljava/lang/String;FI)J", (void*)nFontCreateFromAsset },
Jason Samsd19f10d2009-05-22 14:03:28 -07002861
Tim Murray460a0492013-11-19 12:45:54 -08002862{"rsnElementCreate", "(JJIZI)J", (void*)nElementCreate },
Ashok Bhat98071552014-02-12 09:54:43 +00002863{"rsnElementCreate2", "(J[J[Ljava/lang/String;[I)J", (void*)nElementCreate2 },
Tim Murray460a0492013-11-19 12:45:54 -08002864{"rsnElementGetNativeData", "(JJ[I)V", (void*)nElementGetNativeData },
Ashok Bhat98071552014-02-12 09:54:43 +00002865{"rsnElementGetSubElements", "(JJ[J[Ljava/lang/String;[I)V", (void*)nElementGetSubElements },
Jason Samsd19f10d2009-05-22 14:03:28 -07002866
Tim Murray460a0492013-11-19 12:45:54 -08002867{"rsnTypeCreate", "(JJIIIZZI)J", (void*)nTypeCreate },
Ashok Bhat98071552014-02-12 09:54:43 +00002868{"rsnTypeGetNativeData", "(JJ[J)V", (void*)nTypeGetNativeData },
Jason Samsd19f10d2009-05-22 14:03:28 -07002869
Ashok Bhat98071552014-02-12 09:54:43 +00002870{"rsnAllocationCreateTyped", "(JJIIJ)J", (void*)nAllocationCreateTyped },
Tim Murray460a0492013-11-19 12:45:54 -08002871{"rsnAllocationCreateFromBitmap", "(JJILandroid/graphics/Bitmap;I)J", (void*)nAllocationCreateFromBitmap },
2872{"rsnAllocationCreateBitmapBackedAllocation", "(JJILandroid/graphics/Bitmap;I)J", (void*)nAllocationCreateBitmapBackedAllocation },
2873{"rsnAllocationCubeCreateFromBitmap","(JJILandroid/graphics/Bitmap;I)J", (void*)nAllocationCubeCreateFromBitmap },
Jason Sams5476b452010-12-08 16:14:36 -08002874
Tim Murray460a0492013-11-19 12:45:54 -08002875{"rsnAllocationCopyFromBitmap", "(JJLandroid/graphics/Bitmap;)V", (void*)nAllocationCopyFromBitmap },
2876{"rsnAllocationCopyToBitmap", "(JJLandroid/graphics/Bitmap;)V", (void*)nAllocationCopyToBitmap },
Jason Sams4ef66502010-12-10 16:03:15 -08002877
Tim Murray460a0492013-11-19 12:45:54 -08002878{"rsnAllocationSyncAll", "(JJI)V", (void*)nAllocationSyncAll },
Miao Wang8c150922015-10-26 17:44:10 -07002879{"rsnAllocationSetupBufferQueue", "(JJI)V", (void*)nAllocationSetupBufferQueue },
2880{"rsnAllocationShareBufferQueue", "(JJJ)V", (void*)nAllocationShareBufferQueue },
Tim Murray460a0492013-11-19 12:45:54 -08002881{"rsnAllocationGetSurface", "(JJ)Landroid/view/Surface;", (void*)nAllocationGetSurface },
2882{"rsnAllocationSetSurface", "(JJLandroid/view/Surface;)V", (void*)nAllocationSetSurface },
2883{"rsnAllocationIoSend", "(JJ)V", (void*)nAllocationIoSend },
Miao Wang8c150922015-10-26 17:44:10 -07002884{"rsnAllocationIoReceive", "(JJ)J", (void*)nAllocationIoReceive },
Miao Wang87e908d2015-03-02 15:15:15 -08002885{"rsnAllocationData1D", "(JJIIILjava/lang/Object;IIIZ)V", (void*)nAllocationData1D },
Miao Wangc8e237e2015-02-20 18:36:32 -08002886{"rsnAllocationElementData", "(JJIIIII[BI)V", (void*)nAllocationElementData },
Miao Wang87e908d2015-03-02 15:15:15 -08002887{"rsnAllocationData2D", "(JJIIIIIILjava/lang/Object;IIIZ)V", (void*)nAllocationData2D },
Tim Murray460a0492013-11-19 12:45:54 -08002888{"rsnAllocationData2D", "(JJIIIIIIJIIII)V", (void*)nAllocationData2D_alloc },
Miao Wang87e908d2015-03-02 15:15:15 -08002889{"rsnAllocationData3D", "(JJIIIIIIILjava/lang/Object;IIIZ)V", (void*)nAllocationData3D },
Tim Murray460a0492013-11-19 12:45:54 -08002890{"rsnAllocationData3D", "(JJIIIIIIIJIIII)V", (void*)nAllocationData3D_alloc },
Miao Wang87e908d2015-03-02 15:15:15 -08002891{"rsnAllocationRead", "(JJLjava/lang/Object;IIZ)V", (void*)nAllocationRead },
2892{"rsnAllocationRead1D", "(JJIIILjava/lang/Object;IIIZ)V", (void*)nAllocationRead1D },
Miao Wang45cec0a2015-03-04 16:40:21 -08002893{"rsnAllocationElementRead", "(JJIIIII[BI)V", (void*)nAllocationElementRead },
Miao Wang87e908d2015-03-02 15:15:15 -08002894{"rsnAllocationRead2D", "(JJIIIIIILjava/lang/Object;IIIZ)V", (void*)nAllocationRead2D },
2895{"rsnAllocationRead3D", "(JJIIIIIIILjava/lang/Object;IIIZ)V", (void*)nAllocationRead3D },
Tim Murray460a0492013-11-19 12:45:54 -08002896{"rsnAllocationGetType", "(JJ)J", (void*)nAllocationGetType},
2897{"rsnAllocationResize1D", "(JJI)V", (void*)nAllocationResize1D },
2898{"rsnAllocationGenerateMipmaps", "(JJ)V", (void*)nAllocationGenerateMipmaps },
Jason Samsbd1c3ad2009-08-03 16:03:08 -07002899
Jason Sams46ba27e32015-02-06 17:45:15 -08002900{"rsnAllocationAdapterCreate", "(JJJ)J", (void*)nAllocationAdapterCreate },
2901{"rsnAllocationAdapterOffset", "(JJIIIIIIIII)V", (void*)nAllocationAdapterOffset },
2902
Tim Murray460a0492013-11-19 12:45:54 -08002903{"rsnScriptBindAllocation", "(JJJI)V", (void*)nScriptBindAllocation },
2904{"rsnScriptSetTimeZone", "(JJ[B)V", (void*)nScriptSetTimeZone },
2905{"rsnScriptInvoke", "(JJI)V", (void*)nScriptInvoke },
2906{"rsnScriptInvokeV", "(JJI[B)V", (void*)nScriptInvokeV },
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002907
2908{"rsnScriptForEach", "(JJI[JJ[B[I)V", (void*)nScriptForEach },
David Gross4a457852016-06-02 14:46:55 -07002909{"rsnScriptReduce", "(JJI[JJ[I)V", (void*)nScriptReduce },
Chris Wailesbe7b1de2014-07-15 10:56:14 -07002910
Tim Murray460a0492013-11-19 12:45:54 -08002911{"rsnScriptSetVarI", "(JJII)V", (void*)nScriptSetVarI },
2912{"rsnScriptGetVarI", "(JJI)I", (void*)nScriptGetVarI },
2913{"rsnScriptSetVarJ", "(JJIJ)V", (void*)nScriptSetVarJ },
2914{"rsnScriptGetVarJ", "(JJI)J", (void*)nScriptGetVarJ },
2915{"rsnScriptSetVarF", "(JJIF)V", (void*)nScriptSetVarF },
2916{"rsnScriptGetVarF", "(JJI)F", (void*)nScriptGetVarF },
2917{"rsnScriptSetVarD", "(JJID)V", (void*)nScriptSetVarD },
2918{"rsnScriptGetVarD", "(JJI)D", (void*)nScriptGetVarD },
2919{"rsnScriptSetVarV", "(JJI[B)V", (void*)nScriptSetVarV },
2920{"rsnScriptGetVarV", "(JJI[B)V", (void*)nScriptGetVarV },
2921{"rsnScriptSetVarVE", "(JJI[BJ[I)V", (void*)nScriptSetVarVE },
2922{"rsnScriptSetVarObj", "(JJIJ)V", (void*)nScriptSetVarObj },
Jason Samsd19f10d2009-05-22 14:03:28 -07002923
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002924{"rsnScriptCCreate", "(JLjava/lang/String;Ljava/lang/String;[BI)J", (void*)nScriptCCreate },
Tim Murray460a0492013-11-19 12:45:54 -08002925{"rsnScriptIntrinsicCreate", "(JIJ)J", (void*)nScriptIntrinsicCreate },
2926{"rsnScriptKernelIDCreate", "(JJII)J", (void*)nScriptKernelIDCreate },
Yang Nibe392ad2015-01-23 17:16:02 -08002927{"rsnScriptInvokeIDCreate", "(JJI)J", (void*)nScriptInvokeIDCreate },
Tim Murray460a0492013-11-19 12:45:54 -08002928{"rsnScriptFieldIDCreate", "(JJI)J", (void*)nScriptFieldIDCreate },
Ashok Bhat98071552014-02-12 09:54:43 +00002929{"rsnScriptGroupCreate", "(J[J[J[J[J[J)J", (void*)nScriptGroupCreate },
Yang Ni35be56c2015-04-02 17:47:56 -07002930{"rsnScriptGroup2Create", "(JLjava/lang/String;Ljava/lang/String;[J)J", (void*)nScriptGroup2Create },
Tim Murray460a0492013-11-19 12:45:54 -08002931{"rsnScriptGroupSetInput", "(JJJJ)V", (void*)nScriptGroupSetInput },
2932{"rsnScriptGroupSetOutput", "(JJJJ)V", (void*)nScriptGroupSetOutput },
2933{"rsnScriptGroupExecute", "(JJ)V", (void*)nScriptGroupExecute },
Yang Ni281c3252014-10-24 08:52:24 -07002934{"rsnScriptGroup2Execute", "(JJ)V", (void*)nScriptGroup2Execute },
Jason Sams0011bcf2009-12-15 12:58:36 -08002935
Tim Murray25207df2015-01-12 16:47:56 -08002936{"rsnScriptIntrinsicBLAS_Single", "(JJIIIIIIIIIFJJFJIIII)V", (void*)nScriptIntrinsicBLAS_Single },
2937{"rsnScriptIntrinsicBLAS_Double", "(JJIIIIIIIIIDJJDJIIII)V", (void*)nScriptIntrinsicBLAS_Double },
2938{"rsnScriptIntrinsicBLAS_Complex", "(JJIIIIIIIIIFFJJFFJIIII)V", (void*)nScriptIntrinsicBLAS_Complex },
2939{"rsnScriptIntrinsicBLAS_Z", "(JJIIIIIIIIIDDJJDDJIIII)V", (void*)nScriptIntrinsicBLAS_Z },
2940
Tim Murray9cb16a22015-04-01 11:07:16 -07002941{"rsnScriptIntrinsicBLAS_BNNM", "(JJIIIJIJIJII)V", (void*)nScriptIntrinsicBLAS_BNNM },
2942
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002943{"rsnProgramStoreCreate", "(JZZZZZZIII)J", (void*)nProgramStoreCreate },
Jason Samsd19f10d2009-05-22 14:03:28 -07002944
Tim Murray460a0492013-11-19 12:45:54 -08002945{"rsnProgramBindConstants", "(JJIJ)V", (void*)nProgramBindConstants },
2946{"rsnProgramBindTexture", "(JJIJ)V", (void*)nProgramBindTexture },
2947{"rsnProgramBindSampler", "(JJIJ)V", (void*)nProgramBindSampler },
Jason Samsebfb4362009-09-23 13:57:02 -07002948
Ashok Bhat98071552014-02-12 09:54:43 +00002949{"rsnProgramFragmentCreate", "(JLjava/lang/String;[Ljava/lang/String;[J)J", (void*)nProgramFragmentCreate },
Tim Murray460a0492013-11-19 12:45:54 -08002950{"rsnProgramRasterCreate", "(JZI)J", (void*)nProgramRasterCreate },
Ashok Bhat98071552014-02-12 09:54:43 +00002951{"rsnProgramVertexCreate", "(JLjava/lang/String;[Ljava/lang/String;[J)J", (void*)nProgramVertexCreate },
Jason Samsd19f10d2009-05-22 14:03:28 -07002952
Narayan Kamath78c0ce52014-03-19 10:15:51 +00002953{"rsnContextBindRootScript", "(JJ)V", (void*)nContextBindRootScript },
2954{"rsnContextBindProgramStore", "(JJ)V", (void*)nContextBindProgramStore },
2955{"rsnContextBindProgramFragment", "(JJ)V", (void*)nContextBindProgramFragment },
2956{"rsnContextBindProgramVertex", "(JJ)V", (void*)nContextBindProgramVertex },
2957{"rsnContextBindProgramRaster", "(JJ)V", (void*)nContextBindProgramRaster },
Jason Sams02fb2cb2009-05-28 15:37:57 -07002958
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002959{"rsnSamplerCreate", "(JIIIIIF)J", (void*)nSamplerCreate },
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -07002960
Ashok Bhat98071552014-02-12 09:54:43 +00002961{"rsnMeshCreate", "(J[J[J[I)J", (void*)nMeshCreate },
Jason Sams2e1872f2010-08-17 16:25:41 -07002962
Tim Murray460a0492013-11-19 12:45:54 -08002963{"rsnMeshGetVertexBufferCount", "(JJ)I", (void*)nMeshGetVertexBufferCount },
2964{"rsnMeshGetIndexCount", "(JJ)I", (void*)nMeshGetIndexCount },
Ashok Bhat98071552014-02-12 09:54:43 +00002965{"rsnMeshGetVertices", "(JJ[JI)V", (void*)nMeshGetVertices },
2966{"rsnMeshGetIndices", "(JJ[J[II)V", (void*)nMeshGetIndices },
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -07002967
Tim Murray56f9e6f2014-05-16 11:47:26 -07002968{"rsnSystemGetPointerSize", "()I", (void*)nSystemGetPointerSize },
Miao Wang0facf022015-11-25 11:21:13 -08002969{"rsnAllocationGetByteBuffer", "(JJ[JIII)Ljava/nio/ByteBuffer;", (void*)nAllocationGetByteBuffer },
Jason Samsd19f10d2009-05-22 14:03:28 -07002970};
2971
2972static int registerFuncs(JNIEnv *_env)
2973{
2974 return android::AndroidRuntime::registerNativeMethods(
2975 _env, classPathName, methods, NELEM(methods));
2976}
2977
2978// ---------------------------------------------------------------------------
2979
2980jint JNI_OnLoad(JavaVM* vm, void* reserved)
2981{
Chris Wailes488230c32014-08-14 11:22:40 -07002982 JNIEnv* env = nullptr;
Jason Samsd19f10d2009-05-22 14:03:28 -07002983 jint result = -1;
2984
Jason Samsd19f10d2009-05-22 14:03:28 -07002985 if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
Steve Block3762c312012-01-06 19:20:56 +00002986 ALOGE("ERROR: GetEnv failed\n");
Jason Samsd19f10d2009-05-22 14:03:28 -07002987 goto bail;
2988 }
Chris Wailes488230c32014-08-14 11:22:40 -07002989 assert(env != nullptr);
Jason Samsd19f10d2009-05-22 14:03:28 -07002990
2991 if (registerFuncs(env) < 0) {
Ashok Bhat0e0c0882014-02-04 14:57:58 +00002992 ALOGE("ERROR: Renderscript native registration failed\n");
Jason Samsd19f10d2009-05-22 14:03:28 -07002993 goto bail;
2994 }
2995
2996 /* success -- return valid version number */
2997 result = JNI_VERSION_1_4;
2998
2999bail:
3000 return result;
3001}