android_renderscript_RenderScript.cpp revision e5125574a68ee6283c300732a11662d8f9945624
1c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main/*
2c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main * Copyright (C) 2011-2012 The Android Open Source Project
3c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main *
4c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main * Licensed under the Apache License, Version 2.0 (the "License");
5c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main * you may not use this file except in compliance with the License.
6c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main * You may obtain a copy of the License at
7c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main *
8c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main *      http://www.apache.org/licenses/LICENSE-2.0
9c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main *
10c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main * Unless required by applicable law or agreed to in writing, software
11c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main * distributed under the License is distributed on an "AS IS" BASIS,
12c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main * See the License for the specific language governing permissions and
14c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main * limitations under the License.
15c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main */
16c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
17c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main#define LOG_TAG "libRS_jni"
18c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
19c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main#include <stdlib.h>
20c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main#include <stdio.h>
21c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main#include <fcntl.h>
22c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main#include <unistd.h>
23c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main#include <math.h>
24c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main#include <android/bitmap.h>
25257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines#include <android/log.h>
26c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
27dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang#include <rsEnv.h>
28470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang#include "rsDispatch.h"
29470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang#include <dlfcn.h>
30470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang
31c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main//#define LOG_API ALOG
32c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main#define LOG_API(...)
33d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang#define LOG_ERR(...) __android_log_print(ANDROID_LOG_ERROR, "RenderScript JNI", __VA_ARGS__);
34d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang#define RS_JNI_VERSION 2301
35c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
36257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines#define NELEM(m) (sizeof(m) / sizeof((m)[0]))
37c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
388352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wangtemplate <typename... T>
398352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wangvoid UNUSED(T... t) {}
408352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang#define PER_ARRAY_TYPE(flag, fnc, readonly, ...) {                                      \
418352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    jint len = 0;                                                                       \
428352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    void *ptr = nullptr;                                                                \
432e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    void *srcPtr = nullptr;                                                             \
448352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    size_t typeBytes = 0;                                                               \
458352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    jint relFlag = 0;                                                                   \
468352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    if (readonly) {                                                                     \
478352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        /* The on-release mode should only be JNI_ABORT for read-only accesses. */      \
482e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        /* readonly = true, also indicates we are copying to the allocation   . */      \
498352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        relFlag = JNI_ABORT;                                                            \
508352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }                                                                                   \
518352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    switch(dataType) {                                                                  \
528352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_FLOAT_32:                                                              \
538352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        len = _env->GetArrayLength((jfloatArray)data);                                  \
548352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        ptr = _env->GetFloatArrayElements((jfloatArray)data, flag);                     \
558352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        typeBytes = 4;                                                                  \
562e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        if (usePadding) {                                                               \
572e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            srcPtr = ptr;                                                               \
582e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            len = len / 3 * 4;                                                          \
592e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (count == 0) {                                                           \
602e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                count = len / 4;                                                        \
612e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
622e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = malloc (len * typeBytes);                                             \
632e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (readonly) {                                                             \
642e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
652e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
662e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            } else {                                                                    \
672e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
682e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
692e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
702e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            free(ptr);                                                                  \
712e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = srcPtr;                                                               \
722e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        } else {                                                                        \
732e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            fnc(__VA_ARGS__);                                                           \
742e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        }                                                                               \
758352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        _env->ReleaseFloatArrayElements((jfloatArray)data, (jfloat *)ptr, relFlag);     \
768352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return;                                                                         \
778352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_FLOAT_64:                                                              \
788352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        len = _env->GetArrayLength((jdoubleArray)data);                                 \
798352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        ptr = _env->GetDoubleArrayElements((jdoubleArray)data, flag);                   \
808352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        typeBytes = 8;                                                                  \
812e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        if (usePadding) {                                                               \
822e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            srcPtr = ptr;                                                               \
832e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            len = len / 3 * 4;                                                          \
842e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (count == 0) {                                                           \
852e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                count = len / 4;                                                        \
862e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
872e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = malloc (len * typeBytes);                                             \
882e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (readonly) {                                                             \
892e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
902e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
912e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            } else {                                                                    \
922e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
932e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
942e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
952e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            free(ptr);                                                                  \
962e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = srcPtr;                                                               \
972e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        } else {                                                                        \
982e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            fnc(__VA_ARGS__);                                                           \
992e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        }                                                                               \
1008352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        _env->ReleaseDoubleArrayElements((jdoubleArray)data, (jdouble *)ptr, relFlag);  \
1018352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return;                                                                         \
1028352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_SIGNED_8:                                                              \
1038352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_UNSIGNED_8:                                                            \
1048352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        len = _env->GetArrayLength((jbyteArray)data);                                   \
1058352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        ptr = _env->GetByteArrayElements((jbyteArray)data, flag);                       \
1068352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        typeBytes = 1;                                                                  \
1072e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        if (usePadding) {                                                               \
1082e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            srcPtr = ptr;                                                               \
1092e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            len = len / 3 * 4;                                                          \
1102e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (count == 0) {                                                           \
1112e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                count = len / 4;                                                        \
1122e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
1132e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = malloc (len * typeBytes);                                             \
1142e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (readonly) {                                                             \
1152e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
1162e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
1172e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            } else {                                                                    \
1182e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
1192e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
1202e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
1212e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            free(ptr);                                                                  \
1222e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = srcPtr;                                                               \
1232e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        } else {                                                                        \
1242e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            fnc(__VA_ARGS__);                                                           \
1252e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        }                                                                               \
1268352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        _env->ReleaseByteArrayElements((jbyteArray)data, (jbyte*)ptr, relFlag);         \
1278352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return;                                                                         \
1288352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_SIGNED_16:                                                             \
1298352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_UNSIGNED_16:                                                           \
1308352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        len = _env->GetArrayLength((jshortArray)data);                                  \
1318352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        ptr = _env->GetShortArrayElements((jshortArray)data, flag);                     \
1328352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        typeBytes = 2;                                                                  \
1332e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        if (usePadding) {                                                               \
1342e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            srcPtr = ptr;                                                               \
1352e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            len = len / 3 * 4;                                                          \
1362e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (count == 0) {                                                           \
1372e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                count = len / 4;                                                        \
1382e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
1392e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = malloc (len * typeBytes);                                             \
1402e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (readonly) {                                                             \
1412e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
1422e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
1432e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            } else {                                                                    \
1442e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
1452e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
1462e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
1472e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            free(ptr);                                                                  \
1482e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = srcPtr;                                                               \
1492e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        } else {                                                                        \
1502e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            fnc(__VA_ARGS__);                                                           \
1512e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        }                                                                               \
1528352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        _env->ReleaseShortArrayElements((jshortArray)data, (jshort *)ptr, relFlag);     \
1538352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return;                                                                         \
1548352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_SIGNED_32:                                                             \
1558352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_UNSIGNED_32:                                                           \
1568352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        len = _env->GetArrayLength((jintArray)data);                                    \
1578352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        ptr = _env->GetIntArrayElements((jintArray)data, flag);                         \
1588352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        typeBytes = 4;                                                                  \
1592e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        if (usePadding) {                                                               \
1602e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            srcPtr = ptr;                                                               \
1612e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            len = len / 3 * 4;                                                          \
1622e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (count == 0) {                                                           \
1632e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                count = len / 4;                                                        \
1642e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
1652e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = malloc (len * typeBytes);                                             \
1662e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (readonly) {                                                             \
1672e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
1682e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
1692e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            } else {                                                                    \
1702e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
1712e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
1722e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
1732e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            free(ptr);                                                                  \
1742e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = srcPtr;                                                               \
1752e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        } else {                                                                        \
1762e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            fnc(__VA_ARGS__);                                                           \
1772e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        }                                                                               \
1788352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        _env->ReleaseIntArrayElements((jintArray)data, (jint *)ptr, relFlag);           \
1798352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return;                                                                         \
1808352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_SIGNED_64:                                                             \
1818352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_UNSIGNED_64:                                                           \
1828352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        len = _env->GetArrayLength((jlongArray)data);                                   \
1838352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        ptr = _env->GetLongArrayElements((jlongArray)data, flag);                       \
1848352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        typeBytes = 8;                                                                  \
1852e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        if (usePadding) {                                                               \
1862e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            srcPtr = ptr;                                                               \
1872e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            len = len / 3 * 4;                                                          \
1882e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (count == 0) {                                                           \
1892e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                count = len / 4;                                                        \
1902e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
1912e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = malloc (len * typeBytes);                                             \
1922e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (readonly) {                                                             \
1932e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
1942e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
1952e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            } else {                                                                    \
1962e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
1972e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
1982e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
1992e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            free(ptr);                                                                  \
2002e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = srcPtr;                                                               \
2012e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        } else {                                                                        \
2022e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            fnc(__VA_ARGS__);                                                           \
2032e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        }                                                                               \
2048352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        _env->ReleaseLongArrayElements((jlongArray)data, (jlong *)ptr, relFlag);        \
2058352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return;                                                                         \
2068352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    default:                                                                            \
2078352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        break;                                                                          \
2088352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }                                                                                   \
2092e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    UNUSED(len, ptr, srcPtr, typeBytes, relFlag);                                       \
2108352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang}
2118352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
2128352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
213c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainclass AutoJavaStringToUTF8 {
214c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainpublic:
215c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringToUTF8(JNIEnv* env, jstring str) : fEnv(env), fJStr(str) {
216c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        fCStr = env->GetStringUTFChars(str, NULL);
217c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        fLength = env->GetStringUTFLength(str);
218c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
219c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    ~AutoJavaStringToUTF8() {
220c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        fEnv->ReleaseStringUTFChars(fJStr, fCStr);
221c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
222c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    const char* c_str() const { return fCStr; }
223c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jsize length() const { return fLength; }
224c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
225c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainprivate:
226c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    JNIEnv*     fEnv;
227c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jstring     fJStr;
228c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    const char* fCStr;
229c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jsize       fLength;
230c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main};
231c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
232c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainclass AutoJavaStringArrayToUTF8 {
233c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainpublic:
234c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringArrayToUTF8(JNIEnv* env, jobjectArray strings, jsize stringsLength)
235c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    : mEnv(env), mStrings(strings), mStringsLength(stringsLength) {
236c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        mCStrings = NULL;
237c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        mSizeArray = NULL;
238c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        if (stringsLength > 0) {
239c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            mCStrings = (const char **)calloc(stringsLength, sizeof(char *));
240c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            mSizeArray = (size_t*)calloc(stringsLength, sizeof(size_t));
241c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            for (jsize ct = 0; ct < stringsLength; ct ++) {
242c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
243c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                mCStrings[ct] = mEnv->GetStringUTFChars(s, NULL);
244c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                mSizeArray[ct] = mEnv->GetStringUTFLength(s);
245c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            }
246c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        }
247c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
248c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    ~AutoJavaStringArrayToUTF8() {
249c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        for (jsize ct=0; ct < mStringsLength; ct++) {
250c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
251c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            mEnv->ReleaseStringUTFChars(s, mCStrings[ct]);
252c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        }
253c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        free(mCStrings);
254c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        free(mSizeArray);
255c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
256c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    const char **c_str() const { return mCStrings; }
257c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t *c_str_len() const { return mSizeArray; }
258c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jsize length() const { return mStringsLength; }
259c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
260c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainprivate:
261c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    JNIEnv      *mEnv;
262c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jobjectArray mStrings;
263c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    const char **mCStrings;
264c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t      *mSizeArray;
265c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jsize        mStringsLength;
266c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main};
267c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
268470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang
269470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang// ---------------------------------------------------------------------------
270470b3b5b70ec71042d30004747c625ca76c4007aMiao Wangstatic dispatchTable dispatchTab;
2716f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Incremental Support lib
2726f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic dispatchTable dispatchTabInc;
273470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang
274d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wangstatic jboolean nLoadSO(JNIEnv *_env, jobject _this, jboolean useNative, jint targetApi, jstring libPath) {
275470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    void* handle = NULL;
276470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    if (useNative) {
277470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang        handle = dlopen("libRS.so", RTLD_LAZY | RTLD_LOCAL);
278470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    } else {
279d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        // For API 9+, dlopen the full path of libRSSupport.
280d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        if (libPath != NULL) {
281d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang            const char * libPathJni = _env->GetStringUTFChars(libPath, JNI_FALSE);
282d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang            handle = dlopen(libPathJni, RTLD_LAZY | RTLD_LOCAL);
283d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang            _env->ReleaseStringUTFChars(libPath, libPathJni);
284d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        } else {
285d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang            handle = dlopen("libRSSupport.so", RTLD_LAZY | RTLD_LOCAL);
286d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        }
287470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    }
288470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    if (handle == NULL) {
289d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        LOG_ERR("couldn't dlopen %s; librsjni version: %d", dlerror(), RS_JNI_VERSION);
290470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang        return false;
291470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    }
292470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang
293e27a340e3a55a3650e1f74bf1d350104596c4d4bMiao Wang    if (loadSymbols(handle, dispatchTab, targetApi) == false) {
294d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        LOG_ERR("Dispatch table init failed! librsjni version: %d", RS_JNI_VERSION);
295d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        dlclose(handle);
296470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang        return false;
297470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    }
298d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang    LOG_API("Successfully loaded runtime");
299470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    return true;
300470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang}
301470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang
302dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wangstatic ioSuppDT ioDispatch;
303dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wangstatic jboolean nLoadIOSO(JNIEnv *_env, jobject _this) {
304dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    void* handleIO = NULL;
305dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    handleIO = dlopen("libRSSupportIO.so", RTLD_LAZY | RTLD_LOCAL);
306dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    if (handleIO == NULL) {
307d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        LOG_ERR("Couldn't load libRSSupportIO.so, librsjni version: %d", RS_JNI_VERSION);
308dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang        return false;
309dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    }
310dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    if (loadIOSuppSyms(handleIO, ioDispatch) == false) {
311d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        LOG_ERR("libRSSupportIO init failed! librsjni version: %d", RS_JNI_VERSION);
312dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang        return false;
313dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    }
314dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    return true;
315dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang}
316ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang
317c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// ---------------------------------------------------------------------------
318c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
3192e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wangstatic void copyWithPadding(void* ptr, void* srcPtr, int mSize, int count) {
3202e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int sizeBytesPad = mSize * 4;
3212e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int sizeBytes = mSize * 3;
3222e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    uint8_t *dst = static_cast<uint8_t *>(ptr);
3232e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    uint8_t *src = static_cast<uint8_t *>(srcPtr);
3242e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    for (int i = 0; i < count; i++) {
3252e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        memcpy(dst, src, sizeBytes);
3262e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        dst += sizeBytesPad;
3272e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        src += sizeBytes;
3282e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    }
3292e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang}
3302e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang
3312e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wangstatic void copyWithUnPadding(void* ptr, void* srcPtr, int mSize, int count) {
3322e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int sizeBytesPad = mSize * 4;
3332e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int sizeBytes = mSize * 3;
3342e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    uint8_t *dst = static_cast<uint8_t *>(ptr);
3352e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    uint8_t *src = static_cast<uint8_t *>(srcPtr);
3362e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    for (int i = 0; i < count; i++) {
3372e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        memcpy(dst, src, sizeBytes);
3382e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        dst += sizeBytes;
3392e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        src += sizeBytesPad;
3402e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    }
3412e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang}
3422e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang
3432e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang
3442e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang// ---------------------------------------------------------------------------
3452e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang
346c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
347bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextFinish(JNIEnv *_env, jobject _this, jlong con)
348c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
349bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextFinish, con(%p)", (RsContext)con);
350bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextFinish((RsContext)con);
351c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
352c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
353936fbd696aac243a514f74b6fee6efd5959527a4Yang Nistatic jlong
354936fbd696aac243a514f74b6fee6efd5959527a4Yang NinClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong kernelID,
355936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni               jlong returnValue, jlongArray fieldIDArray,
356936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni               jlongArray valueArray, jintArray sizeArray,
357936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni               jlongArray depClosureArray, jlongArray depFieldIDArray) {
358d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong ret = 0;
359d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
360936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
361936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
362d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
363d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jsize values_length = _env->GetArrayLength(valueArray);
364d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
365d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jsize sizes_length = _env->GetArrayLength(sizeArray);
366d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong* jDepClosures =
367d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      _env->GetLongArrayElements(depClosureArray, nullptr);
368d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jsize depClosures_length = _env->GetArrayLength(depClosureArray);
369d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong* jDepFieldIDs =
370d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      _env->GetLongArrayElements(depFieldIDArray, nullptr);
371d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jsize depFieldIDs_length = _env->GetArrayLength(depFieldIDArray);
372d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
373d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  size_t numValues, numDependencies;
374d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  RsScriptFieldID* fieldIDs;
375d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  RsClosure* depClosures;
376d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  RsScriptFieldID* depFieldIDs;
377d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
378d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (fieldIDs_length != values_length || values_length != sizes_length) {
379d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang      LOG_ERR("Unmatched field IDs, values, and sizes in closure creation.");
380d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
381d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
382d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
383d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  numValues = (size_t)fieldIDs_length;
384d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
385d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (depClosures_length != depFieldIDs_length) {
386d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang      LOG_ERR("Unmatched closures and field IDs for dependencies in closure creation.");
387d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
388d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
389d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
390d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  numDependencies = (size_t)depClosures_length;
391d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
392d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (numDependencies > numValues) {
393d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang      LOG_ERR("Unexpected number of dependencies in closure creation");
394d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
395d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
396d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
397d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
398d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang      LOG_ERR("Too many arguments or globals in closure creation");
399d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
400d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
401d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
402e5125574a68ee6283c300732a11662d8f9945624Yang Ni  if (numValues > 0) {
403e5125574a68ee6283c300732a11662d8f9945624Yang Ni      fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
404e5125574a68ee6283c300732a11662d8f9945624Yang Ni      if (fieldIDs == nullptr) {
405e5125574a68ee6283c300732a11662d8f9945624Yang Ni          goto exit;
406e5125574a68ee6283c300732a11662d8f9945624Yang Ni      }
407e5125574a68ee6283c300732a11662d8f9945624Yang Ni  } else {
408e5125574a68ee6283c300732a11662d8f9945624Yang Ni      // numValues == 0
409e5125574a68ee6283c300732a11662d8f9945624Yang Ni      // alloca(0) implementation is platform dependent
410e5125574a68ee6283c300732a11662d8f9945624Yang Ni      fieldIDs = nullptr;
411d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
412d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
413d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  for (size_t i = 0; i < numValues; i++) {
414936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni    fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
415936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
416936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
417e5125574a68ee6283c300732a11662d8f9945624Yang Ni  if (numDependencies > 0) {
418e5125574a68ee6283c300732a11662d8f9945624Yang Ni      depClosures = (RsClosure*)alloca(sizeof(RsClosure) * numDependencies);
419e5125574a68ee6283c300732a11662d8f9945624Yang Ni      if (depClosures == nullptr) {
420e5125574a68ee6283c300732a11662d8f9945624Yang Ni          goto exit;
421e5125574a68ee6283c300732a11662d8f9945624Yang Ni      }
422e5125574a68ee6283c300732a11662d8f9945624Yang Ni
423e5125574a68ee6283c300732a11662d8f9945624Yang Ni      for (size_t i = 0; i < numDependencies; i++) {
424e5125574a68ee6283c300732a11662d8f9945624Yang Ni          depClosures[i] = (RsClosure)jDepClosures[i];
425e5125574a68ee6283c300732a11662d8f9945624Yang Ni      }
426e5125574a68ee6283c300732a11662d8f9945624Yang Ni
427e5125574a68ee6283c300732a11662d8f9945624Yang Ni      depFieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numDependencies);
428e5125574a68ee6283c300732a11662d8f9945624Yang Ni      if (depFieldIDs == nullptr) {
429e5125574a68ee6283c300732a11662d8f9945624Yang Ni          goto exit;
430e5125574a68ee6283c300732a11662d8f9945624Yang Ni      }
431e5125574a68ee6283c300732a11662d8f9945624Yang Ni
432e5125574a68ee6283c300732a11662d8f9945624Yang Ni      for (size_t i = 0; i < numDependencies; i++) {
433e5125574a68ee6283c300732a11662d8f9945624Yang Ni          depFieldIDs[i] = (RsClosure)jDepFieldIDs[i];
434e5125574a68ee6283c300732a11662d8f9945624Yang Ni      }
435e5125574a68ee6283c300732a11662d8f9945624Yang Ni  } else {
436e5125574a68ee6283c300732a11662d8f9945624Yang Ni      // numDependencies == 0
437e5125574a68ee6283c300732a11662d8f9945624Yang Ni      // alloca(0) implementation is platform dependent
438e5125574a68ee6283c300732a11662d8f9945624Yang Ni      depClosures = nullptr;
439e5125574a68ee6283c300732a11662d8f9945624Yang Ni      depFieldIDs = nullptr;
440936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
441936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
442d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  ret = (jlong)(uintptr_t)dispatchTab.ClosureCreate(
443936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni      (RsContext)con, (RsScriptKernelID)kernelID, (RsAllocation)returnValue,
44475c84f43017db82b547665436e7abda2caa2a645Yang Ni      fieldIDs, numValues, jValues, numValues,
445d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      (int*)jSizes, numValues,
446d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      depClosures, numDependencies,
447d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      depFieldIDs, numDependencies);
448d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
449d454f4541683a6bddfa1d00424a71f5855675e86Yang Niexit:
450d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
451d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(depFieldIDArray, jDepFieldIDs, JNI_ABORT);
452d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(depClosureArray, jDepClosures, JNI_ABORT);
453d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseIntArrayElements (sizeArray,       jSizes,       JNI_ABORT);
454d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(valueArray,      jValues,      JNI_ABORT);
455d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(fieldIDArray,    jFieldIDs,    JNI_ABORT);
456d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
457d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  return ret;
458936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni}
459936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
460b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wangstatic jlong
461b1c365bfb0566142c49375f09f2b8289182f1f47Miao WangnInvokeClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong invokeID,
462b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                     jbyteArray paramArray, jlongArray fieldIDArray, jlongArray valueArray,
463b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                     jintArray sizeArray) {
464d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong ret = 0;
465d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
466b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jbyte* jParams = _env->GetByteArrayElements(paramArray, nullptr);
467b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jsize jParamLength = _env->GetArrayLength(paramArray);
468b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
469b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
470d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
471d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jsize values_length = _env->GetArrayLength(valueArray);
472d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
473d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jsize sizes_length = _env->GetArrayLength(sizeArray);
474d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
475d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  size_t numValues;
476d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  RsScriptFieldID* fieldIDs;
477d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
478d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (fieldIDs_length != values_length || values_length != sizes_length) {
479d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang      LOG_ERR("Unmatched field IDs, values, and sizes in closure creation.");
480d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
481d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
482d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
483d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  numValues = (size_t) fieldIDs_length;
484d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
485d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
486d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang      LOG_ERR("Too many arguments or globals in closure creation");
487d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
488d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
489d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
490d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
491d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (fieldIDs == nullptr) {
492d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
493d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
494d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
495d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  for (size_t i = 0; i < numValues; i++) {
496b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
497b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  }
498b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
499d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  ret = (jlong)(uintptr_t)dispatchTab.InvokeClosureCreate(
500b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      (RsContext)con, (RsScriptInvokeID)invokeID, jParams, jParamLength,
50175c84f43017db82b547665436e7abda2caa2a645Yang Ni      fieldIDs, numValues, jValues, numValues,
502d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      (int*)jSizes, numValues);
503d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
504d454f4541683a6bddfa1d00424a71f5855675e86Yang Niexit:
505d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
506d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseIntArrayElements (sizeArray,       jSizes,       JNI_ABORT);
507d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(valueArray,      jValues,      JNI_ABORT);
508d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(fieldIDArray,    jFieldIDs,    JNI_ABORT);
509d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseByteArrayElements(paramArray,      jParams,      JNI_ABORT);
510d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
511d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  return ret;
512b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang}
513b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
514936fbd696aac243a514f74b6fee6efd5959527a4Yang Nistatic void
515936fbd696aac243a514f74b6fee6efd5959527a4Yang NinClosureSetArg(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
516936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni               jint index, jlong value, jint size) {
51775c84f43017db82b547665436e7abda2caa2a645Yang Ni  // Size is signed with -1 indicating the values is an Allocation
518b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  dispatchTab.ClosureSetArg((RsContext)con, (RsClosure)closureID, (uint32_t)index,
51975c84f43017db82b547665436e7abda2caa2a645Yang Ni                  (uintptr_t)value, size);
520936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni}
521936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
522936fbd696aac243a514f74b6fee6efd5959527a4Yang Nistatic void
523936fbd696aac243a514f74b6fee6efd5959527a4Yang NinClosureSetGlobal(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
524936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni                  jlong fieldID, jlong value, jint size) {
52575c84f43017db82b547665436e7abda2caa2a645Yang Ni  // Size is signed with -1 indicating the values is an Allocation
526936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  dispatchTab.ClosureSetGlobal((RsContext)con, (RsClosure)closureID,
52775c84f43017db82b547665436e7abda2caa2a645Yang Ni                     (RsScriptFieldID)fieldID, (int64_t)value, size);
528936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni}
529936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
530936fbd696aac243a514f74b6fee6efd5959527a4Yang Nistatic long
531e68c5973af1e80c77cab9aea0b77f46a801aef96Yang NinScriptGroup2Create(JNIEnv *_env, jobject _this, jlong con, jstring name,
532b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                    jstring cacheDir, jlongArray closureArray) {
533d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong ret = 0;
534d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
535e68c5973af1e80c77cab9aea0b77f46a801aef96Yang Ni  AutoJavaStringToUTF8 nameUTF(_env, name);
536b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
537b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
538936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jlong* jClosures = _env->GetLongArrayElements(closureArray, nullptr);
539936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jsize numClosures = _env->GetArrayLength(closureArray);
540d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
541d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  RsClosure* closures;
542d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
543d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (numClosures > (jsize) RS_SCRIPT_GROUP_MAX_NUMBER_CLOSURES) {
544d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang    LOG_ERR("Too many closures in script group");
545d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni    goto exit;
546d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
547d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
548d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  closures = (RsClosure*)alloca(sizeof(RsClosure) * numClosures);
549d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (closures == nullptr) {
550d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
551d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
552d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
553936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  for (int i = 0; i < numClosures; i++) {
554936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni    closures[i] = (RsClosure)jClosures[i];
555936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
556936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
557d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  ret = (jlong)(uintptr_t)dispatchTab.ScriptGroup2Create(
558e68c5973af1e80c77cab9aea0b77f46a801aef96Yang Ni      (RsContext)con, nameUTF.c_str(), nameUTF.length(),
559e68c5973af1e80c77cab9aea0b77f46a801aef96Yang Ni      cacheDirUTF.c_str(), cacheDirUTF.length(),
560b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      closures, numClosures);
561d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
562d454f4541683a6bddfa1d00424a71f5855675e86Yang Niexit:
563d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
564d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(closureArray, jClosures, JNI_ABORT);
565d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
566d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  return ret;
567b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang}
568b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
569b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wangstatic void
570b1c365bfb0566142c49375f09f2b8289182f1f47Miao WangnScriptGroup2Execute(JNIEnv *_env, jobject _this, jlong con, jlong groupID) {
571b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  dispatchTab.ScriptGroupExecute((RsContext)con, (RsScriptGroup2)groupID);
572936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni}
573936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
574c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
575bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj)
576c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
577bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj);
578bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ObjDestroy((RsContext)con, (void *)obj);
579c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
580c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
5818919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
5828919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wangstatic void
5838919a441f977cb787d244aa42cc2d4dda1cbfa11Miao WangnScriptIntrinsicBLAS_Single(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong id, jint func, jint TransA,
5848919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                            jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
5858919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                            jfloat alpha, jlong A, jlong B, jfloat beta, jlong C, jint incX, jint incY,
5868919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                            jint KL, jint KU, jboolean mUseInc) {
5878919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsBlasCall call;
5888919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    memset(&call, 0, sizeof(call));
5898919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.func = (RsBlasFunction)func;
5908919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.transA = (RsBlasTranspose)TransA;
5918919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.transB = (RsBlasTranspose)TransB;
5928919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.side = (RsBlasSide)Side;
5938919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.uplo = (RsBlasUplo)Uplo;
5948919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.diag = (RsBlasDiag)Diag;
5958919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.M = M;
5968919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.N = N;
5978919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.K = K;
5988919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.alpha.f = alpha;
5998919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.beta.f = beta;
6008919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.incX = incX;
6018919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.incY = incY;
6028919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.KL = KL;
6038919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.KU = KU;
6048919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
6058919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsAllocation in_allocs[3];
6068919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[0] = (RsAllocation)A;
6078919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[1] = (RsAllocation)B;
6088919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[2] = (RsAllocation)C;
6098919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
6108919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    if (mUseInc) {
6118919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ContextFinish((RsContext)con);
6128919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
6131e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                          in_allocs, NELEM(in_allocs), nullptr,
6148919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                          &call, sizeof(call), nullptr, 0);
6158919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    } else {
6168919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
6171e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                       in_allocs, NELEM(in_allocs), nullptr,
6188919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                       &call, sizeof(call), nullptr, 0);
6198919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    }
6208919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang}
6218919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
6228919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wangstatic void
6238919a441f977cb787d244aa42cc2d4dda1cbfa11Miao WangnScriptIntrinsicBLAS_Double(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong id, jint func, jint TransA,
6248919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                            jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
6258919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                            jdouble alpha, jlong A, jlong B, jdouble beta, jlong C, jint incX, jint incY,
6268919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                            jint KL, jint KU, jboolean mUseInc) {
6278919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsBlasCall call;
6288919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    memset(&call, 0, sizeof(call));
6298919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.func = (RsBlasFunction)func;
6308919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.transA = (RsBlasTranspose)TransA;
6318919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.transB = (RsBlasTranspose)TransB;
6328919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.side = (RsBlasSide)Side;
6338919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.uplo = (RsBlasUplo)Uplo;
6348919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.diag = (RsBlasDiag)Diag;
6358919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.M = M;
6368919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.N = N;
6378919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.K = K;
6388919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.alpha.d = alpha;
6398919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.beta.d = beta;
6408919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.incX = incX;
6418919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.incY = incY;
6428919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.KL = KL;
6438919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.KU = KU;
6448919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
6458919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsAllocation in_allocs[3];
6468919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[0] = (RsAllocation)A;
6478919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[1] = (RsAllocation)B;
6488919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[2] = (RsAllocation)C;
6498919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
6508919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    if (mUseInc) {
6518919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ContextFinish((RsContext)con);
6528919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
6531e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                          in_allocs, NELEM(in_allocs), nullptr,
6548919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                          &call, sizeof(call), nullptr, 0);
6558919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    } else {
6568919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
6571e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                        in_allocs, NELEM(in_allocs), nullptr,
6588919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                        &call, sizeof(call), nullptr, 0);
6598919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    }
6608919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang}
6618919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
6628919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wangstatic void
6638919a441f977cb787d244aa42cc2d4dda1cbfa11Miao WangnScriptIntrinsicBLAS_Complex(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong id, jint func, jint TransA,
6648919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                             jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
6658919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                             jfloat alphaX, jfloat alphaY, jlong A, jlong B, jfloat betaX,
6668919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                             jfloat betaY, jlong C, jint incX, jint incY, jint KL, jint KU, jboolean mUseInc) {
6678919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsBlasCall call;
6688919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    memset(&call, 0, sizeof(call));
6698919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.func = (RsBlasFunction)func;
6708919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.transA = (RsBlasTranspose)TransA;
6718919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.transB = (RsBlasTranspose)TransB;
6728919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.side = (RsBlasSide)Side;
6738919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.uplo = (RsBlasUplo)Uplo;
6748919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.diag = (RsBlasDiag)Diag;
6758919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.M = M;
6768919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.N = N;
6778919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.K = K;
6788919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.alpha.c.r = alphaX;
6798919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.alpha.c.i = alphaY;
6808919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.beta.c.r = betaX;
6818919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.beta.c.i = betaY;
6828919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.incX = incX;
6838919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.incY = incY;
6848919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.KL = KL;
6858919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.KU = KU;
6868919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
6878919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsAllocation in_allocs[3];
6888919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[0] = (RsAllocation)A;
6898919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[1] = (RsAllocation)B;
6908919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[2] = (RsAllocation)C;
6918919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
6928919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
6938919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    if (mUseInc) {
6948919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ContextFinish((RsContext)con);
6958919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
6961e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                          in_allocs, NELEM(in_allocs), nullptr,
6978919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                          &call, sizeof(call), nullptr, 0);
6988919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    } else {
6998919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7001e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                       in_allocs, NELEM(in_allocs), nullptr,
7018919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                       &call, sizeof(call), nullptr, 0);
7028919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    }
7038919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang}
7048919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
7058919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wangstatic void
7068919a441f977cb787d244aa42cc2d4dda1cbfa11Miao WangnScriptIntrinsicBLAS_Z(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong id, jint func, jint TransA,
7078919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                       jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
7088919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                       jdouble alphaX, jdouble alphaY, jlong A, jlong B, jdouble betaX,
7098919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                       jdouble betaY, jlong C, jint incX, jint incY, jint KL, jint KU, jboolean mUseInc) {
7108919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsBlasCall call;
7118919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    memset(&call, 0, sizeof(call));
7128919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.func = (RsBlasFunction)func;
7138919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.transA = (RsBlasTranspose)TransA;
7148919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.transB = (RsBlasTranspose)TransB;
7158919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.side = (RsBlasSide)Side;
7168919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.uplo = (RsBlasUplo)Uplo;
7178919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.diag = (RsBlasDiag)Diag;
7188919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.M = M;
7198919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.N = N;
7208919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.K = K;
7218919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.alpha.z.r = alphaX;
7228919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.alpha.z.i = alphaY;
7238919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.beta.z.r = betaX;
7248919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.beta.z.i = betaY;
7258919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.incX = incX;
7268919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.incY = incY;
7278919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.KL = KL;
7288919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.KU = KU;
7298919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
7308919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsAllocation in_allocs[3];
7318919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[0] = (RsAllocation)A;
7328919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[1] = (RsAllocation)B;
7338919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[2] = (RsAllocation)C;
7348919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
7358919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
7368919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    if (mUseInc) {
7378919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ContextFinish((RsContext)con);
7388919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
7391e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                          in_allocs, NELEM(in_allocs), nullptr,
7408919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                          &call, sizeof(call), nullptr, 0);
7418919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    } else {
7428919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7431e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                        in_allocs, NELEM(in_allocs), nullptr,
7448919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                        &call, sizeof(call), nullptr, 0);
7458919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    }
7468919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang}
7478919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
7488919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
7498919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wangstatic void
7508919a441f977cb787d244aa42cc2d4dda1cbfa11Miao WangnScriptIntrinsicBLAS_BNNM(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong id, jint M, jint N, jint K,
7518919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                          jlong A, jint a_offset, jlong B, jint b_offset, jlong C, jint c_offset,
7528919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                          jint c_mult_int, jboolean mUseInc) {
7538919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsBlasCall call;
7548919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    memset(&call, 0, sizeof(call));
7558919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.func = RsBlas_bnnm;
7568919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.M = M;
7578919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.N = N;
7588919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.K = K;
759341032cd8e6c1a8a8ddceccdafbf02687d0828acMiao Wang    call.a_offset = a_offset & 0xFF;
760341032cd8e6c1a8a8ddceccdafbf02687d0828acMiao Wang    call.b_offset = b_offset & 0xFF;
7618919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.c_offset = c_offset;
7628919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.c_mult_int = c_mult_int;
7638919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
7648919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsAllocation in_allocs[3];
7658919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[0] = (RsAllocation)A;
7668919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[1] = (RsAllocation)B;
7678919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[2] = (RsAllocation)C;
7688919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
7698919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    if (mUseInc) {
7708919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ContextFinish((RsContext)con);
7718919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
7721e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                          in_allocs, NELEM(in_allocs), nullptr,
7738919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                          &call, sizeof(call), nullptr, 0);
7748919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    } else {
7758919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7761e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                        in_allocs, NELEM(in_allocs), nullptr,
7778919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                        &call, sizeof(call), nullptr, 0);
7788919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    }
7798919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang}
780c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// ---------------------------------------------------------------------------
781bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
782c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott MainnDeviceCreate(JNIEnv *_env, jobject _this)
783c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
784c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nDeviceCreate");
785bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)dispatchTab.DeviceCreate();
786c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
787c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
788c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
789bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev)
790c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
791c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nDeviceDestroy");
792470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    return dispatchTab.DeviceDestroy((RsDevice)dev);
793c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
794c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
795c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
796bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnDeviceSetConfig(JNIEnv *_env, jobject _this, jlong dev, jint p, jint value)
797c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
798c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nDeviceSetConfig  dev(%p), param(%i), value(%i)", (void *)dev, p, value);
799470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    return dispatchTab.DeviceSetConfig((RsDevice)dev, (RsDeviceParam)p, value);
800c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
801c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
802bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
803ecccf940f72679f7602c52b0b4bcb245acdad55bMiao WangnContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer,
804ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang               jint ct, jstring nativeLibDirJava)
805c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
806c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nContextCreate");
807ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    // Access the NativeLibDir in the Java Context.
808ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    const char * nativeLibDir = _env->GetStringUTFChars(nativeLibDirJava, JNI_FALSE);
809ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    size_t length = (size_t)_env->GetStringUTFLength(nativeLibDirJava);
810ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang
811ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    jlong id = (jlong)(uintptr_t)dispatchTab.ContextCreate((RsDevice)dev, ver,
812ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang                                                           sdkVer,
813ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang                                                           (RsContextType)ct, 0);
814ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    if (dispatchTab.SetNativeLibDir) {
815ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang        dispatchTab.SetNativeLibDir((RsContext)id, nativeLibDir, length);
816ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    }
817ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang
818ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    _env->ReleaseStringUTFChars(nativeLibDirJava, nativeLibDir);
819ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    return id;
820c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
821c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
822c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
823c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
824bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextSetPriority(JNIEnv *_env, jobject _this, jlong con, jint p)
825c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
826bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("ContextSetPriority, con(%p), priority(%i)", (RsContext)con, p);
827bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextSetPriority((RsContext)con, p);
828c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
829c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
830c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
831c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
832c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
833bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextDestroy(JNIEnv *_env, jobject _this, jlong con)
834c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
835bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextDestroy, con(%p)", (RsContext)con);
836bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextDestroy((RsContext)con);
837c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
838c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
839c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
840bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextDump(JNIEnv *_env, jobject _this, jlong con, jint bits)
841c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
842c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nContextDump, con(%p)  bits(%i)", (RsContext)con, bits);
843470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    dispatchTab.ContextDump((RsContext)con, bits);
844c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
845c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
846c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
847c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic jstring
848bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextGetErrorMessage(JNIEnv *_env, jobject _this, jlong con)
849c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
850bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextGetErrorMessage, con(%p)", (RsContext)con);
851c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    char buf[1024];
852c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
853c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t receiveLen;
854c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t subID;
855bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    int id = dispatchTab.ContextGetMessage((RsContext)con,
8566f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           buf, sizeof(buf),
8576f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &receiveLen, sizeof(receiveLen),
8586f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &subID, sizeof(subID));
859c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (!id && receiveLen) {
860184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,
861184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "message receive buffer too small.  %zu", receiveLen);
862c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
863c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return _env->NewStringUTF(buf);
864c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
865c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
866c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic jint
867bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextGetUserMessage(JNIEnv *_env, jobject _this, jlong con, jintArray data)
868c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
869c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
870bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextGetMessage, con(%p), len(%i)", (RsContext)con, len);
871c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *ptr = _env->GetIntArrayElements(data, NULL);
872c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t receiveLen;
873c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t subID;
874bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    int id = dispatchTab.ContextGetMessage((RsContext)con,
8756f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           ptr, len * 4,
8766f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &receiveLen, sizeof(receiveLen),
8776f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &subID, sizeof(subID));
878c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (!id && receiveLen) {
879184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,
880184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "message receive buffer too small.  %zu", receiveLen);
881c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
882c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseIntArrayElements(data, ptr, 0);
883bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jint)id;
884c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
885c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
886c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic jint
887bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextPeekMessage(JNIEnv *_env, jobject _this, jlong con, jintArray auxData)
888c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
889bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextPeekMessage, con(%p)", (RsContext)con);
890c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *auxDataPtr = _env->GetIntArrayElements(auxData, NULL);
891c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t receiveLen;
892c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t subID;
893bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    int id = dispatchTab.ContextPeekMessage((RsContext)con, &receiveLen, sizeof(receiveLen),
894c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                                  &subID, sizeof(subID));
895c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    auxDataPtr[0] = (jint)subID;
896c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    auxDataPtr[1] = (jint)receiveLen;
897c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseIntArrayElements(auxData, auxDataPtr, 0);
898bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jint)id;
899c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
900c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
901bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic void nContextInitToClient(JNIEnv *_env, jobject _this, jlong con)
902c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
903bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextInitToClient, con(%p)", (RsContext)con);
904bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextInitToClient((RsContext)con);
905c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
906c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
907bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic void nContextDeinitToClient(JNIEnv *_env, jobject _this, jlong con)
908c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
909bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextDeinitToClient, con(%p)", (RsContext)con);
910bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextDeinitToClient((RsContext)con);
911c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
912c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
913c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
914bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextSendMessage(JNIEnv *_env, jobject _this, jlong con, jint id, jintArray data)
915c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
916c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *ptr = NULL;
917c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = 0;
918c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (data) {
919c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        len = _env->GetArrayLength(data);
92038ac0d48403bd7e46bd32de0285e1de4c93afc74Miao Wang        ptr = _env->GetIntArrayElements(data, NULL);
921c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
922bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextSendMessage, con(%p), id(%i), len(%i)", (RsContext)con, id, len);
923bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextSendMessage((RsContext)con, id, (const uint8_t *)ptr, len * sizeof(int));
924c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (data) {
925c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
926c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
927c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
928c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
929c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
930c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
931bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
932086010500c28e2bca57ea583d3f38da9a2f2f414Yang NinElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind,
933086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni               jboolean norm, jint size)
934c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
935bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nElementCreate, con(%p), type(%i), kind(%i), norm(%i), size(%i)", (RsContext)con,
936bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            type, kind, norm, size);
937086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    return (jlong)(uintptr_t)dispatchTab.ElementCreate((RsContext)con,
938086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni                                                       (RsDataType)type,
939086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni                                                       (RsDataKind)kind,
940bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       norm, size);
941c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
942c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
943bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
944bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnElementCreate2(JNIEnv *_env, jobject _this, jlong con,
945bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                jlongArray _ids, jobjectArray _names, jintArray _arraySizes)
946c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
947c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    int fieldCount = _env->GetArrayLength(_ids);
948bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nElementCreate2, con(%p)", (RsContext)con);
949bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
950bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jIds = _env->GetLongArrayElements(_ids, NULL);
951bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint *jArraySizes = _env->GetIntArrayElements(_arraySizes, NULL);
952c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
953bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsElement *ids = (RsElement*)malloc(fieldCount * sizeof(RsElement));
954bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    uint32_t *arraySizes = (uint32_t *)malloc(fieldCount * sizeof(uint32_t));
955bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
956bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < fieldCount; i ++) {
957bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        ids[i] = (RsElement)jIds[i];
958bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        arraySizes[i] = (uint32_t)jArraySizes[i];
959bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
960c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
961c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringArrayToUTF8 names(_env, _names, fieldCount);
962c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
963c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    const char **nameArray = names.c_str();
964c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t *sizeArray = names.c_str_len();
965c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
9666f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    jlong id = (jlong)(uintptr_t)dispatchTab.ElementCreate2((RsContext)con, (RsElement *)ids,
9676f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                            fieldCount, nameArray,
9686f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                            fieldCount * sizeof(size_t),  sizeArray,
9696f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                            (const uint32_t *)arraySizes, fieldCount);
970c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
971bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(ids);
972bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(arraySizes);
973bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_ids, jIds, JNI_ABORT);
974bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseIntArrayElements(_arraySizes, jArraySizes, JNI_ABORT);
975bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return id;
976c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
977c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
978c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
979c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
980bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
981c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
982bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnElementGetSubElements(JNIEnv *_env, jobject _this, jlong con, jlong id,
983bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                       jlongArray _IDs,
984c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                       jobjectArray _names,
985c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                       jintArray _arraySizes)
986c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
987bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    uint32_t dataSize = _env->GetArrayLength(_IDs);
988bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nElementGetSubElements, con(%p)", (RsContext)con);
989c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
990bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    uintptr_t *ids = (uintptr_t *)malloc(dataSize * sizeof(uintptr_t));
991c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    const char **names = (const char **)malloc((uint32_t)dataSize * sizeof(const char *));
992c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t *arraySizes = (uint32_t *)malloc((uint32_t)dataSize * sizeof(uint32_t));
993c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
994bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ElementGetSubElements((RsContext)con, (RsElement)id, ids, names, arraySizes,
995bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (uint32_t)dataSize);
996c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
997bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(uint32_t i = 0; i < dataSize; i++) {
998bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        const jlong id = (jlong)(uintptr_t)ids[i];
999bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        const jint arraySize = (jint)arraySizes[i];
1000c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i]));
1001bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        _env->SetLongArrayRegion(_IDs, i, 1, &id);
1002bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        _env->SetIntArrayRegion(_arraySizes, i, 1, &arraySize);
1003c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1004c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1005c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    free(ids);
1006c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    free(names);
1007c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    free(arraySizes);
1008c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1009c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1010c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
1011c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1012bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1013bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid,
1014c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv)
1015c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1016c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)",
1017bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, eid, dimx, dimy, dimz, mips, faces, yuv);
1018c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1019bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)dispatchTab.TypeCreate((RsContext)con, (RsElement)eid, dimx, dimy,
1020bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                    dimz, mips, faces, yuv);
1021c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1022c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1023c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
1024c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1025bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1026bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mips, jint usage,
1027bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                       jlong pointer)
1028c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1029bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)",
1030bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsElement)type, mips, usage, (void *)pointer);
1031bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t) dispatchTab.AllocationCreateTyped((RsContext)con, (RsType)type,
1032bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                (RsAllocationMipmapControl)mips,
1033bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                (uint32_t)usage, (uintptr_t)pointer);
1034c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1035c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1036c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1037bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationSyncAll(JNIEnv *_env, jobject _this, jlong con, jlong a, jint bits)
1038c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1039bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationSyncAll, con(%p), a(%p), bits(0x%08x)", (RsContext)con, (RsAllocation)a, bits);
1040bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationSyncAll((RsContext)con, (RsAllocation)a, (RsAllocationUsageType)bits);
1041c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1042c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1043c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1044bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationSetSurface(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject sur)
1045dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang{
1046bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    ioDispatch.sAllocationSetSurface(_env, _this, (RsContext)con, (RsAllocation)alloc, sur, dispatchTab);
1047dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang}
1048dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang
1049dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wangstatic void
1050bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationIoSend(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1051dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang{
1052bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationIoSend((RsContext)con, (RsAllocation)alloc);
1053dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang}
1054dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang
1055dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wangstatic void
1056bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1057c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1058bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationGenerateMipmaps, con(%p), a(%p)", (RsContext)con, (RsAllocation)alloc);
1059bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationGenerateMipmaps((RsContext)con, (RsAllocation)alloc);
1060c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1061c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1062c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic size_t GetBitmapSize(JNIEnv *env, jobject jbitmap) {
1063c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmapInfo info;
1064c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    memset(&info, 0, sizeof(info));
1065c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_getInfo(env, jbitmap, &info);
1066c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t s = info.width * info.height;
1067c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    switch (info.format) {
1068c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        case ANDROID_BITMAP_FORMAT_RGBA_8888: s *= 4; break;
1069c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        case ANDROID_BITMAP_FORMAT_RGB_565: s *= 2; break;
1070c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        case ANDROID_BITMAP_FORMAT_RGBA_4444: s *= 2; break;
1071c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1072c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return s;
1073c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1074c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1075bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1076bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,
1077bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                            jobject jbitmap, jint usage)
1078c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1079bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = 0;
1080257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    void *pixels = NULL;
1081257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
1082c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1083257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (pixels != NULL) {
1084bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        id = (jlong)(uintptr_t)dispatchTab.AllocationCreateFromBitmap((RsContext)con,
1085bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      (RsType)type,
1086bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      (RsAllocationMipmapControl)mip,
1087bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      pixels,
1088bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      GetBitmapSize(_env, jbitmap),
1089bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      usage);
1090257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        AndroidBitmap_unlockPixels(_env, jbitmap);
1091257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
1092c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
1093c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1094c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1095bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1096bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCreateBitmapBackedAllocation(JNIEnv *_env, jobject _this, jlong con, jlong type,
1097bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                        jint mip, jobject jbitmap, jint usage)
1098c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1099bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = 0;
1100257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    void *pixels = NULL;
1101257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
1102c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1103257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (pixels != NULL) {
1104bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        id = (jlong)(uintptr_t)dispatchTab.AllocationCreateTyped((RsContext)con,
1105bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (RsType)type,
1106bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (RsAllocationMipmapControl)mip,
1107bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (uint32_t)usage,
1108bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (uintptr_t)pixels);
1109257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        AndroidBitmap_unlockPixels(_env, jbitmap);
1110257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
1111c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
1112c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1113c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1114bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1115bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type,
1116bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                jint mip, jobject jbitmap, jint usage)
1117c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1118c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    void *pixels = NULL;
1119c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
1120c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1121bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = 0;
1122c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (pixels != NULL) {
1123bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        id = (jlong)(uintptr_t)dispatchTab.AllocationCubeCreateFromBitmap((RsContext)con,
1124bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          (RsType)type,
1125bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          (RsAllocationMipmapControl)mip,
1126bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          pixels,
1127bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          GetBitmapSize(_env, jbitmap),
1128bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          usage);
1129c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        AndroidBitmap_unlockPixels(_env, jbitmap);
1130c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1131c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
1132c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1133c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1134c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1135bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
1136c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1137c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmapInfo info;
1138c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    memset(&info, 0, sizeof(info));
1139c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_getInfo(_env, jbitmap, &info);
1140c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1141c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    void *pixels = NULL;
1142c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
1143c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1144c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (pixels != NULL) {
1145bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dispatchTab.Allocation2DData((RsContext)con, (RsAllocation)alloc, 0, 0, 0,
1146bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                     RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, info.width,
1147bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                     info.height, pixels, GetBitmapSize(_env, jbitmap), 0);
1148c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        AndroidBitmap_unlockPixels(_env, jbitmap);
1149c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1150c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1151c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1152c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1153bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCopyToBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
1154c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1155c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmapInfo info;
1156c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    memset(&info, 0, sizeof(info));
1157c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_getInfo(_env, jbitmap, &info);
1158c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1159c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    void *pixels = NULL;
1160c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
1161c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1162c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (pixels != NULL) {
1163bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dispatchTab.AllocationCopyToBitmap((RsContext)con, (RsAllocation)alloc, pixels,
1164bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                           GetBitmapSize(_env, jbitmap));
1165c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        AndroidBitmap_unlockPixels(_env, jbitmap);
1166c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1167c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    //bitmap.notifyPixelsChanged();
1168c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1169c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
11708352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Java object data into the Allocation pointed to by _alloc.
1171c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
11728352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
11732e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint count, jobject data, jint sizeBytes, jint dataType, jint mSize,
11742e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jboolean usePadding)
1175c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
11768352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
11778352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation1DData, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
11788352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            "dataType(%i)", (RsContext)con, (RsAllocation)alloc, offset, count, sizeBytes,
11798352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            dataType);
11802e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation1DData, true,
11812e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
1182c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1183c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1184244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
1185c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1186244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationElementData1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint xoff,
1187244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                         jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
1188c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1189244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    LOG_API("nAllocationElementData1D, con(%p), alloc(%p), xoff(%i), comp(%i), len(%i), "
1190e5125574a68ee6283c300732a11662d8f9945624Yang Ni            "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, compIdx,
1191e5125574a68ee6283c300732a11662d8f9945624Yang Ni            _env->GetArrayLength(data),
1192244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            sizeBytes);
1193244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1194244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    dispatchTab.Allocation1DElementData((RsContext)con, (RsAllocation)alloc, xoff,
1195244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                                        lod, ptr, sizeBytes, compIdx);
1196c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1197c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1198c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1199244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang/*
1200244b72fe088a6393f37dea49ff89cf9df738a492Miao Wangstatic void
1201244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationElementData(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
1202244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                       jint xoff, jint yoff, jint zoff,
1203244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                       jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
1204244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang{
1205244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    jint len = _env->GetArrayLength(data);
1206244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    LOG_API("nAllocationElementData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
1207244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
1208244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            sizeBytes);
1209244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1210244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    dispatchTab.AllocationElementData((RsContext)con, (RsAllocation)alloc,
1211244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                                      xoff, yoff, zoff,
1212244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                                      lod, ptr, sizeBytes, compIdx);
1213244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1214244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang}
1215244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang*/
1216244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
12178352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Java object data into the Allocation pointed to by _alloc.
1218c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12198352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
12202e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType, jint mSize,
12212e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jboolean usePadding)
1222c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
12238352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
12248352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
12258352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation2DData, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
12268352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
12272e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h;
12282e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation2DData, true,
12292e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
1230c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1231c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1232c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1233bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationData2D_alloc(JNIEnv *_env, jobject _this, jlong con,
1234bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong dstAlloc, jint dstXoff, jint dstYoff,
1235c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint dstMip, jint dstFace,
1236c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint width, jint height,
1237bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong srcAlloc, jint srcXoff, jint srcYoff,
1238c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint srcMip, jint srcFace)
1239c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1240c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nAllocation2DData_s, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
1241c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " dstMip(%i), dstFace(%i), width(%i), height(%i),"
1242c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i), srcFace(%i)",
1243bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
1244c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
1245c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1246bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationCopy2DRange((RsContext)con,
1247bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)dstAlloc,
1248bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      dstXoff, dstYoff,
1249bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      dstMip, dstFace,
1250bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      width, height,
1251bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)srcAlloc,
1252bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      srcXoff, srcYoff,
1253bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      srcMip, srcFace);
1254c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1255c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
12568352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Java object data into the Allocation pointed to by _alloc.
1257c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12588352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
12592e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jint d, jobject data, jint sizeBytes, jint dataType,
12602e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
1261c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
12628352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
12638352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation3DData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
12648352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
12658352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            lod, w, h, d, sizeBytes);
12662e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h * d;
12672e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation3DData, true,
12682e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
1269c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1270c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1271c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1272bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationData3D_alloc(JNIEnv *_env, jobject _this, jlong con,
1273bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong dstAlloc, jint dstXoff, jint dstYoff, jint dstZoff,
1274c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint dstMip,
1275c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint width, jint height, jint depth,
1276bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong srcAlloc, jint srcXoff, jint srcYoff, jint srcZoff,
1277c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint srcMip)
1278c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1279c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nAllocationData3D_alloc, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
1280c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " dstMip(%i), width(%i), height(%i),"
1281c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i)",
1282bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
1283c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
1284c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1285bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationCopy3DRange((RsContext)con,
1286bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)dstAlloc,
1287bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      dstXoff, dstYoff, dstZoff, dstMip,
1288bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      width, height, depth,
1289bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)srcAlloc,
1290bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      srcXoff, srcYoff, srcZoff, srcMip);
1291bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang}
1292bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
12938352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1294bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic void
12952e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao WangnAllocationRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jobject data, jint dataType,
12962e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                jint mSize, jboolean usePadding)
1297bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{
12988352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
12998352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocationRead, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
13002e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = 0;
13012e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(0, dispatchTab.AllocationRead, false,
13022e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, ptr, len * typeBytes);
1303c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1304c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
13058352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1306c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
13078352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationRead1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
13082e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint count, jobject data, jint sizeBytes, jint dataType,
13092e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
1310c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
13118352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
13128352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation1DRead, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
13138352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang              "dataType(%i)", (RsContext)con, alloc, offset, count, sizeBytes, dataType);
13142e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(0, dispatchTab.Allocation1DRead, false,
13152e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
1316c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1317c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1318244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang// Copies from the Element in the Allocation pointed to by _alloc into the Java array data.
1319244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang/*
1320244b72fe088a6393f37dea49ff89cf9df738a492Miao Wangstatic void
1321244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationElementRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc,
1322244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                       jint xoff, jint yoff, jint zoff,
13233bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang                       jint lod, jint compIdx, jobject data, jint sizeBytes)
1324244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang{
13253bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    jint len = _env->GetArrayLength(data);
13263bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    LOG_API("nAllocationElementRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
13273bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang            "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
13283bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang            sizeBytes);
13293bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
13303bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    dispatchTab.AllocationElementRead((RsContext)con, (RsAllocation)alloc,
13313bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang                                      xoff, yoff, zoff,
13323bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang                                      lod, ptr, sizeBytes, compIdx);
13333bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1334244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang}
1335244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang*/
1336244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
13378352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1338c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
13398352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
13402e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType,
13412e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
1342c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
13438352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
13448352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
13458352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation2DRead, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
13468352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang              "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
13472e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h;
13482e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(0, dispatchTab.Allocation2DRead, false,
13492e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
1350c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1351c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1352244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1353244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang/*
1354244b72fe088a6393f37dea49ff89cf9df738a492Miao Wangstatic void
1355244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationRead3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
13562e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jint d, jobject data, int sizeBytes, int dataType,
13572e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
1358244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang{
1359244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
1360244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    LOG_API("nAllocation3DRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
1361244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
1362244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            lod, w, h, d, sizeBytes);
13632e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h * d;
13642e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation3DRead, false,
13652e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
1366244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang}
1367244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang*/
1368244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
1369bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1370bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationGetType(JNIEnv *_env, jobject _this, jlong con, jlong a)
1371c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1372bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationGetType, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
1373bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t) dispatchTab.AllocationGetType((RsContext)con, (RsAllocation)a);
1374c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1375c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1376c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1377bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationResize1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint dimX)
1378c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1379bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", (RsContext)con,
1380bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsAllocation)alloc, dimX);
1381bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationResize1D((RsContext)con, (RsAllocation)alloc, dimX);
1382c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1383c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1384c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
1385c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1386c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
13876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptBindAllocation(JNIEnv *_env, jobject _this, jlong con, jlong script, jlong alloc, jint slot, jboolean mUseInc)
1388c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1389bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)",
1390bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
13916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
13926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
13936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
13946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
13956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1396c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1397c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1398c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
13996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jint val, jboolean mUseInc)
1400c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1401bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con,
1402bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
14036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14046f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarI((RsContext)con, (RsScript)script, slot, val);
14056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
14066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarI((RsContext)con, (RsScript)script, slot, val);
14076f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1408c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1409c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1410c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
14116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarObj(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val, jboolean mUseInc)
1412c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1413bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con,
1414bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
14156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val);
14176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
14186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val);
14196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1420c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1421c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1422c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
14236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val, jboolean mUseInc)
1424c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1425bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%lli)", (RsContext)con,
1426bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
14276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarJ((RsContext)con, (RsScript)script, slot, val);
14296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
14306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarJ((RsContext)con, (RsScript)script, slot, val);
14316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1432c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1433c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1434c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
14356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, float val, jboolean mUseInc)
1436c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1437bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", (RsContext)con,
1438bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
14396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarF((RsContext)con, (RsScript)script, slot, val);
14416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
14426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarF((RsContext)con, (RsScript)script, slot, val);
14436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1444c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1445c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1446c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
14476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, double val, jboolean mUseInc)
1448c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1449bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", (RsContext)con,
1450bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
14516f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarD((RsContext)con, (RsScript)script, slot, val);
1453d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni    } else {
14546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarD((RsContext)con, (RsScript)script, slot, val);
14556f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1456c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1457c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1458c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
14596f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data, jboolean mUseInc)
1460c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1461bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1462c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
1463c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
14646f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14656f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
14666f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
14676f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
14686f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1469c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1470c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1471c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1472c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1473bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptSetVarVE(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data,
14746f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                jlong elem, jintArray dims, jboolean mUseInc)
1475c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1476bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarVE, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1477c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
1478c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
1479c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint dimsLen = _env->GetArrayLength(dims) * sizeof(int);
1480c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *dimsPtr = _env->GetIntArrayElements(dims, NULL);
14816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem,
14836f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                      (const uint32_t *)dimsPtr, dimsLen);
14846f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
14856f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem,
14866f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                   (const uint32_t *)dimsPtr, dimsLen);
14876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1488c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1489c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseIntArrayElements(dims, dimsPtr, JNI_ABORT);
1490c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1491c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1492c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1493c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
14946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetTimeZone(JNIEnv *_env, jobject _this, jlong con, jlong script, jbyteArray timeZone, jboolean mUseInc)
1495c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1496bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptCSetTimeZone, con(%p), s(%p), timeZone(%s)", (RsContext)con,
1497bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, (const char *)timeZone);
1498c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1499c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint length = _env->GetArrayLength(timeZone);
1500c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte* timeZone_ptr;
1501c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0);
15026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
15036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length);
15046f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
15056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length);
15066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1507c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1508c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (timeZone_ptr) {
1509c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0);
1510c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1511c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1512c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1513c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
15146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptInvoke(JNIEnv *_env, jobject _this, jlong con, jlong obj, jint slot, jboolean mUseInc)
1515c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1516bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptInvoke, con(%p), script(%p)", (RsContext)con, (void *)obj);
15176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
15186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptInvoke((RsContext)con, (RsScript)obj, slot);
15196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
15206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptInvoke((RsContext)con, (RsScript)obj, slot);
15216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1522c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1523c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1524c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
15256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptInvokeV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data, jboolean mUseInc)
1526c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1527bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptInvokeV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1528c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
1529c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
15306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
15316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len);
15326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
15336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len);
15346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1535c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1536c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1537c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1538c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
15396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEach(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
15406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang               jlong script, jint slot, jlong ain, jlong aout, jboolean mUseInc)
1541c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1542bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
15436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
15446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
15456f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
15466f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
15476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     NULL, 0, NULL, 0);
15486f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
15496f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
15506f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
15516f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  NULL, 0, NULL, 0);
15526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1553c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
15545154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
1555c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
15566f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEachV(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
15576f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                jlong script, jint slot, jlong ain, jlong aout, jbyteArray params, jboolean mUseInc)
1558c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1559bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1560c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(params);
1561c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(params, NULL);
15626f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
15636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
15646f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
15656f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
15666f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     ptr, len, NULL, 0);
15676f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
15686f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
15696f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
15706f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  ptr, len, NULL, 0);
15716f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1572c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT);
1573c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1574c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1575c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
15766f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEachClipped(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
1577bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                      jlong script, jint slot, jlong ain, jlong aout,
1578c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                      jint xstart, jint xend,
15796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                      jint ystart, jint yend, jint zstart, jint zend, jboolean mUseInc)
1580c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1581bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEachClipped, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1582c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    RsScriptCall sc;
1583c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xStart = xstart;
1584c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xEnd = xend;
1585c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yStart = ystart;
1586c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yEnd = yend;
1587c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zStart = zstart;
1588c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zEnd = zend;
1589c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
1590c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayStart = 0;
1591c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayEnd = 0;
15926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
15936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
15946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
15956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
15966f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     NULL, 0, &sc, sizeof(sc));
15976f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
15986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
15996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
16006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  NULL, 0, &sc, sizeof(sc));
16016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1602c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1603c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1604c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
16056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEachClippedV(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
1606bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                       jlong script, jint slot, jlong ain, jlong aout,
1607c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                       jbyteArray params, jint xstart, jint xend,
16086f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                       jint ystart, jint yend, jint zstart, jint zend, jboolean mUseInc)
1609c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1610bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEachClipped, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1611c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(params);
1612c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(params, NULL);
1613c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    RsScriptCall sc;
1614c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xStart = xstart;
1615c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xEnd = xend;
1616c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yStart = ystart;
1617c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yEnd = yend;
1618c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zStart = zstart;
1619c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zEnd = zend;
1620c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
1621c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayStart = 0;
1622c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayEnd = 0;
16236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
16246f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
16256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
16266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
16276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     ptr, len, &sc, sizeof(sc));
16286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
16296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
16306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
16316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  ptr, len, &sc, sizeof(sc));
16326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1633c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT);
1634c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1635c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
163689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wangstatic void
163789b58238694d7d1eebaac0aa59b0bdd67a779582Miao WangnScriptForEachMulti(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
163889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                    jlongArray ains, jlong aout, jbyteArray params,
163989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                    jintArray limits)
164089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang{
164189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    LOG_API("nScriptForEach, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
164289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
164389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    jint   in_len = 0;
164489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    jlong *in_ptr = nullptr;
164589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
164689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    RsAllocation *in_allocs = nullptr;
164789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
164889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    if (ains != nullptr) {
164989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        in_len = _env->GetArrayLength(ains);
165089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        if (in_len > (jint)RS_KERNEL_MAX_ARGUMENTS) {
1651d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang            LOG_ERR("Too many arguments in kernel launch.");
165289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            // TODO (b/20758983): Report back to Java and throw an exception
165389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            return;
165489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        }
165589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
165689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        // TODO (b/20760800): Check in_ptr is not null
165789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        in_ptr = _env->GetLongArrayElements(ains, nullptr);
165889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        if (sizeof(RsAllocation) == sizeof(jlong)) {
165989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            in_allocs = (RsAllocation*)in_ptr;
166089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
166189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        } else {
166289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            // Convert from 64-bit jlong types to the native pointer type.
166389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
166489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            in_allocs = (RsAllocation*)alloca(in_len * sizeof(RsAllocation));
166589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            if (in_allocs == nullptr) {
1666d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang                LOG_ERR("Failed launching kernel for lack of memory.");
166789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
166889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                return;
166989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            }
167089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
167189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            for (int index = in_len; --index >= 0;) {
167289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                in_allocs[index] = (RsAllocation)in_ptr[index];
167389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            }
167489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        }
167589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    }
167689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
167789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    jint   param_len = 0;
167889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    jbyte *param_ptr = nullptr;
167989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
168089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    if (params != nullptr) {
168189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        param_len = _env->GetArrayLength(params);
168289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        param_ptr = _env->GetByteArrayElements(params, nullptr);
168389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    }
168489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
168589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    RsScriptCall sc, *sca = nullptr;
168689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    uint32_t sc_size = 0;
168789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
168889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    jint  limit_len = 0;
168989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    jint *limit_ptr = nullptr;
169089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
169189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    if (limits != nullptr) {
169289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        limit_len = _env->GetArrayLength(limits);
169389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        limit_ptr = _env->GetIntArrayElements(limits, nullptr);
169489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
169589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        if (limit_len != 6) {
1696d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang            LOG_ERR("LaunchOptions cannot be recognized.");
169789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            goto exit;
169889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        }
169989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
170089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.xStart     = limit_ptr[0];
170189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.xEnd       = limit_ptr[1];
170289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.yStart     = limit_ptr[2];
170389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.yEnd       = limit_ptr[3];
170489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.zStart     = limit_ptr[4];
170589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.zEnd       = limit_ptr[5];
170689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.strategy   = RS_FOR_EACH_STRATEGY_DONT_CARE;
170789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.arrayStart = 0;
170889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.arrayEnd = 0;
170989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.array2Start = 0;
171089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.array2End = 0;
171189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.array3Start = 0;
171289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.array3End = 0;
171389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.array4Start = 0;
171489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.array4End = 0;
171589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
171689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sca = &sc;
171789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    }
171889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
171989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    dispatchTabInc.ScriptForEachMulti((RsContext)con, (RsScript)script, slot,
172089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                                      in_allocs, in_len, (RsAllocation)aout,
172189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                                      param_ptr, param_len, sca, sc_size);
172289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
172389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wangexit:
172489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
172589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    if (ains != nullptr) {
172689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
172789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    }
172889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
172989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    if (params != nullptr) {
173089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        _env->ReleaseByteArrayElements(params, param_ptr, JNI_ABORT);
173189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    }
173289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
173389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    if (limits != nullptr) {
173489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
173589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    }
173689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang}
173789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
17385154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Walastatic void
17395154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt WalanScriptReduce(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
17405154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala              jlong ain, jlong aout, jintArray limits)
17415154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala{
17425154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    LOG_API("nScriptReduce, con(%p), s(%p), slot(%i) ain(%" PRId64 ") aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ain, aout);
17435154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
17445154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    RsScriptCall sc, *sca = nullptr;
17455154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    uint32_t sc_size = 0;
17465154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
17475154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    jint  limit_len = 0;
17485154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    jint *limit_ptr = nullptr;
17495154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
17505154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    bool limitLengthValid = true;
17515154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
17525154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    // If the caller passed limits, reflect them in the RsScriptCall.
17535154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    if (limits != nullptr) {
17545154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala        limit_len = _env->GetArrayLength(limits);
17555154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala        limit_ptr = _env->GetIntArrayElements(limits, nullptr);
17565154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
17575154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala        // We expect to be passed an array [x1, x2] which specifies
17585154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala        // the sub-range for a 1-dimensional reduction.
17595154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala        if (limit_len == 2) {
17605154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.xStart     = limit_ptr[0];
17615154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.xEnd       = limit_ptr[1];
17625154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.yStart     = 0;
17635154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.yEnd       = 0;
17645154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.zStart     = 0;
17655154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.zEnd       = 0;
17665154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.strategy   = RS_FOR_EACH_STRATEGY_DONT_CARE;
17675154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.arrayStart = 0;
17685154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.arrayEnd = 0;
17695154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.array2Start = 0;
17705154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.array2End = 0;
17715154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.array3Start = 0;
17725154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.array3End = 0;
17735154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.array4Start = 0;
17745154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.array4End = 0;
17755154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
17765154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sca = &sc;
17775154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc_size = sizeof(sc);
17785154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala        } else {
1779d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang            LOG_ERR("LaunchOptions cannot be recognized.");
17805154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            limitLengthValid = false;
17815154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala        }
17825154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    }
17835154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
17845154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    if (limitLengthValid) {
17855154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala        dispatchTab.ScriptReduce((RsContext)con, (RsScript)script, slot,
17865154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala                                 (RsAllocation)ain, (RsAllocation)aout,
17875154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala                                 sca, sc_size);
17885154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    }
17895154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
17905154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    if (limits != nullptr) {
17915154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala        _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
17925154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    }
17935154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala}
17945154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
1795043d28678b7e52ed1011286af57173c2c7bec749David Grossstatic void
1796043d28678b7e52ed1011286af57173c2c7bec749David GrossnScriptReduceNew(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
1797043d28678b7e52ed1011286af57173c2c7bec749David Gross                 jlongArray ains, jlong aout, jintArray limits)
1798043d28678b7e52ed1011286af57173c2c7bec749David Gross{
1799043d28678b7e52ed1011286af57173c2c7bec749David Gross    LOG_API("nScriptReduceNew, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
1800043d28678b7e52ed1011286af57173c2c7bec749David Gross
1801043d28678b7e52ed1011286af57173c2c7bec749David Gross    if (ains == nullptr) {
1802043d28678b7e52ed1011286af57173c2c7bec749David Gross        LOG_ERR("At least one input required.");
1803043d28678b7e52ed1011286af57173c2c7bec749David Gross        // TODO (b/20758983): Report back to Java and throw an exception
1804043d28678b7e52ed1011286af57173c2c7bec749David Gross        return;
1805043d28678b7e52ed1011286af57173c2c7bec749David Gross    }
1806043d28678b7e52ed1011286af57173c2c7bec749David Gross    jint in_len = _env->GetArrayLength(ains);
1807043d28678b7e52ed1011286af57173c2c7bec749David Gross    if (in_len > (jint)RS_KERNEL_MAX_ARGUMENTS) {
1808043d28678b7e52ed1011286af57173c2c7bec749David Gross        LOG_ERR("Too many arguments in kernel launch.");
1809043d28678b7e52ed1011286af57173c2c7bec749David Gross        // TODO (b/20758983): Report back to Java and throw an exception
1810043d28678b7e52ed1011286af57173c2c7bec749David Gross        return;
1811043d28678b7e52ed1011286af57173c2c7bec749David Gross    }
1812043d28678b7e52ed1011286af57173c2c7bec749David Gross
1813043d28678b7e52ed1011286af57173c2c7bec749David Gross    jlong *in_ptr = _env->GetLongArrayElements(ains, nullptr);
1814043d28678b7e52ed1011286af57173c2c7bec749David Gross    if (in_ptr == nullptr) {
1815043d28678b7e52ed1011286af57173c2c7bec749David Gross        LOG_ERR("Failed to get Java array elements");
1816043d28678b7e52ed1011286af57173c2c7bec749David Gross        // TODO (b/20758983): Report back to Java and throw an exception
1817043d28678b7e52ed1011286af57173c2c7bec749David Gross        return;
1818043d28678b7e52ed1011286af57173c2c7bec749David Gross    }
1819043d28678b7e52ed1011286af57173c2c7bec749David Gross
1820043d28678b7e52ed1011286af57173c2c7bec749David Gross    RsAllocation *in_allocs = nullptr;
1821043d28678b7e52ed1011286af57173c2c7bec749David Gross    if (sizeof(RsAllocation) == sizeof(jlong)) {
1822043d28678b7e52ed1011286af57173c2c7bec749David Gross        in_allocs = (RsAllocation*)in_ptr;
1823043d28678b7e52ed1011286af57173c2c7bec749David Gross    } else {
1824043d28678b7e52ed1011286af57173c2c7bec749David Gross        // Convert from 64-bit jlong types to the native pointer type.
1825043d28678b7e52ed1011286af57173c2c7bec749David Gross
1826043d28678b7e52ed1011286af57173c2c7bec749David Gross        in_allocs = (RsAllocation*)alloca(in_len * sizeof(RsAllocation));
1827043d28678b7e52ed1011286af57173c2c7bec749David Gross        if (in_allocs == nullptr) {
1828043d28678b7e52ed1011286af57173c2c7bec749David Gross            LOG_ERR("Failed launching kernel for lack of memory.");
1829043d28678b7e52ed1011286af57173c2c7bec749David Gross            // TODO (b/20758983): Report back to Java and throw an exception
1830043d28678b7e52ed1011286af57173c2c7bec749David Gross            _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
1831043d28678b7e52ed1011286af57173c2c7bec749David Gross            return;
1832043d28678b7e52ed1011286af57173c2c7bec749David Gross        }
1833043d28678b7e52ed1011286af57173c2c7bec749David Gross
1834043d28678b7e52ed1011286af57173c2c7bec749David Gross        for (int index = in_len; --index >= 0;) {
1835043d28678b7e52ed1011286af57173c2c7bec749David Gross            in_allocs[index] = (RsAllocation)in_ptr[index];
1836043d28678b7e52ed1011286af57173c2c7bec749David Gross        }
1837043d28678b7e52ed1011286af57173c2c7bec749David Gross    }
1838043d28678b7e52ed1011286af57173c2c7bec749David Gross
1839043d28678b7e52ed1011286af57173c2c7bec749David Gross    RsScriptCall sc, *sca = nullptr;
1840043d28678b7e52ed1011286af57173c2c7bec749David Gross    uint32_t sc_size = 0;
1841043d28678b7e52ed1011286af57173c2c7bec749David Gross
1842043d28678b7e52ed1011286af57173c2c7bec749David Gross    jint  limit_len = 0;
1843043d28678b7e52ed1011286af57173c2c7bec749David Gross    jint *limit_ptr = nullptr;
1844043d28678b7e52ed1011286af57173c2c7bec749David Gross
1845043d28678b7e52ed1011286af57173c2c7bec749David Gross    if (limits != nullptr) {
1846043d28678b7e52ed1011286af57173c2c7bec749David Gross        limit_len = _env->GetArrayLength(limits);
1847043d28678b7e52ed1011286af57173c2c7bec749David Gross        limit_ptr = _env->GetIntArrayElements(limits, nullptr);
1848043d28678b7e52ed1011286af57173c2c7bec749David Gross        if (limit_ptr == nullptr) {
1849043d28678b7e52ed1011286af57173c2c7bec749David Gross            LOG_ERR("Failed to get Java array elements");
1850043d28678b7e52ed1011286af57173c2c7bec749David Gross            // TODO (b/20758983): Report back to Java and throw an exception
1851043d28678b7e52ed1011286af57173c2c7bec749David Gross            _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
1852043d28678b7e52ed1011286af57173c2c7bec749David Gross            return;
1853043d28678b7e52ed1011286af57173c2c7bec749David Gross        }
1854043d28678b7e52ed1011286af57173c2c7bec749David Gross
1855043d28678b7e52ed1011286af57173c2c7bec749David Gross        if (limit_len != 6) {
1856043d28678b7e52ed1011286af57173c2c7bec749David Gross            LOG_ERR("LaunchOptions cannot be recognized");
1857043d28678b7e52ed1011286af57173c2c7bec749David Gross            // TODO (b/20758983): Report back to Java and throw an exception
1858043d28678b7e52ed1011286af57173c2c7bec749David Gross            _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
1859043d28678b7e52ed1011286af57173c2c7bec749David Gross            return;
1860043d28678b7e52ed1011286af57173c2c7bec749David Gross        }
1861043d28678b7e52ed1011286af57173c2c7bec749David Gross
1862043d28678b7e52ed1011286af57173c2c7bec749David Gross        sc.xStart     = limit_ptr[0];
1863043d28678b7e52ed1011286af57173c2c7bec749David Gross        sc.xEnd       = limit_ptr[1];
1864043d28678b7e52ed1011286af57173c2c7bec749David Gross        sc.yStart     = limit_ptr[2];
1865043d28678b7e52ed1011286af57173c2c7bec749David Gross        sc.yEnd       = limit_ptr[3];
1866043d28678b7e52ed1011286af57173c2c7bec749David Gross        sc.zStart     = limit_ptr[4];
1867043d28678b7e52ed1011286af57173c2c7bec749David Gross        sc.zEnd       = limit_ptr[5];
1868043d28678b7e52ed1011286af57173c2c7bec749David Gross        sc.strategy   = RS_FOR_EACH_STRATEGY_DONT_CARE;
1869043d28678b7e52ed1011286af57173c2c7bec749David Gross        sc.arrayStart = 0;
1870043d28678b7e52ed1011286af57173c2c7bec749David Gross        sc.arrayEnd = 0;
1871043d28678b7e52ed1011286af57173c2c7bec749David Gross        sc.array2Start = 0;
1872043d28678b7e52ed1011286af57173c2c7bec749David Gross        sc.array2End = 0;
1873043d28678b7e52ed1011286af57173c2c7bec749David Gross        sc.array3Start = 0;
1874043d28678b7e52ed1011286af57173c2c7bec749David Gross        sc.array3End = 0;
1875043d28678b7e52ed1011286af57173c2c7bec749David Gross        sc.array4Start = 0;
1876043d28678b7e52ed1011286af57173c2c7bec749David Gross        sc.array4End = 0;
1877043d28678b7e52ed1011286af57173c2c7bec749David Gross
1878043d28678b7e52ed1011286af57173c2c7bec749David Gross        sca = &sc;
1879043d28678b7e52ed1011286af57173c2c7bec749David Gross        sc_size = sizeof(sc);
1880043d28678b7e52ed1011286af57173c2c7bec749David Gross    }
1881043d28678b7e52ed1011286af57173c2c7bec749David Gross
1882043d28678b7e52ed1011286af57173c2c7bec749David Gross    dispatchTab.ScriptReduceNew((RsContext)con, (RsScript)script, slot,
1883043d28678b7e52ed1011286af57173c2c7bec749David Gross                                in_allocs, in_len, (RsAllocation)aout,
1884043d28678b7e52ed1011286af57173c2c7bec749David Gross                                sca, sc_size);
1885043d28678b7e52ed1011286af57173c2c7bec749David Gross
1886043d28678b7e52ed1011286af57173c2c7bec749David Gross    _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
1887043d28678b7e52ed1011286af57173c2c7bec749David Gross
1888043d28678b7e52ed1011286af57173c2c7bec749David Gross    if (limits != nullptr) {
1889043d28678b7e52ed1011286af57173c2c7bec749David Gross        _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
1890043d28678b7e52ed1011286af57173c2c7bec749David Gross    }
1891043d28678b7e52ed1011286af57173c2c7bec749David Gross}
1892043d28678b7e52ed1011286af57173c2c7bec749David Gross
1893c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
1894c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1895bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1896bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptCCreate(JNIEnv *_env, jobject _this, jlong con,
1897c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main               jstring resName, jstring cacheDir,
1898c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main               jbyteArray scriptRef, jint length)
1899c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1900bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptCCreate, con(%p)", (RsContext)con);
1901c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1902c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringToUTF8 resNameUTF(_env, resName);
1903c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
1904bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong ret = 0;
1905c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte* script_ptr = NULL;
1906c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint _exception = 0;
1907c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint remaining;
1908c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (!scriptRef) {
1909c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _exception = 1;
1910c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null");
1911c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto exit;
1912c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1913c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (length < 0) {
1914c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _exception = 1;
1915c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0");
1916c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto exit;
1917c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1918c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    remaining = _env->GetArrayLength(scriptRef);
1919c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (remaining < length) {
1920c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _exception = 1;
1921c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //jniThrowException(_env, "java/lang/IllegalArgumentException",
1922c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //        "length > script.length - offset");
1923c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto exit;
1924c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1925c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    script_ptr = (jbyte *)
1926c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0);
1927c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1928c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    //rsScriptCSetText(con, (const char *)script_ptr, length);
1929c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1930bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    ret = (jlong)(uintptr_t)dispatchTab.ScriptCCreate((RsContext)con,
1931bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                      resNameUTF.c_str(), resNameUTF.length(),
1932bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                      cacheDirUTF.c_str(), cacheDirUTF.length(),
1933bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                      (const char *)script_ptr, length);
1934c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1935c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainexit:
1936c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (script_ptr) {
1937c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr,
1938c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                _exception ? JNI_ABORT: 0);
1939c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1940c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1941bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)ret;
1942c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1943c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1944bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
19456f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptIntrinsicCreate(JNIEnv *_env, jobject _this, jlong con, jint id, jlong eid, jboolean mUseInc)
1946c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1947bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptIntrinsicCreate, con(%p) id(%i) element(%p)", (RsContext)con, id, (void *)eid);
19486f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
19496f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTabInc.ScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
19506f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
19516f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTab.ScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
19526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1953c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1954c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1955bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
19566f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptKernelIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jint sig, jboolean mUseInc)
1957c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1958bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptKernelIDCreate, con(%p) script(%p), slot(%i), sig(%i)", (RsContext)con,
1959bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)sid, slot, sig);
19606f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
19616f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTabInc.ScriptKernelIDCreate((RsContext)con, (RsScript)sid,
1962d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni                                                                     slot, sig);
19636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
19646f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTab.ScriptKernelIDCreate((RsContext)con, (RsScript)sid,
19656f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                                  slot, sig);
19666f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1967c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1968c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1969bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1970086010500c28e2bca57ea583d3f38da9a2f2f414Yang NinScriptInvokeIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
1971086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni{
1972086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    LOG_API("nScriptInvokeIDCreate, con(%p) script(%p), slot(%i), sig(%i)", con,
1973086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni            (void *)sid, slot);
1974086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    return (jlong)dispatchTab.ScriptInvokeIDCreate((RsContext)con, (RsScript)sid, slot);
1975086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni}
1976086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni
1977086010500c28e2bca57ea583d3f38da9a2f2f414Yang Nistatic jlong
19786f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptFieldIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jboolean mUseInc)
1979c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1980bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptFieldIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con, (void *)sid, slot);
19816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
19826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTabInc.ScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
19836f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
19846f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTab.ScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
19856f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1986c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1987c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1988bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1989bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _kernels, jlongArray _src,
1990bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlongArray _dstk, jlongArray _dstf, jlongArray _types)
1991bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{
1992bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupCreate, con(%p)", (RsContext)con);
1993bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1994cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    jlong id = 0;
1995cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang
1996cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    RsScriptKernelID* kernelsPtr;
1997bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint kernelsLen = _env->GetArrayLength(_kernels);
1998bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jKernelsPtr = _env->GetLongArrayElements(_kernels, nullptr);
1999cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang
2000cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    RsScriptKernelID* srcPtr;
2001cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    jint srcLen = _env->GetArrayLength(_src);
2002cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    jlong *jSrcPtr = _env->GetLongArrayElements(_src, nullptr);
2003cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang
2004cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    RsScriptKernelID* dstkPtr;
2005cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    jint dstkLen = _env->GetArrayLength(_dstk);
2006cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    jlong *jDstkPtr = _env->GetLongArrayElements(_dstk, nullptr);
2007cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang
2008cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    RsScriptKernelID* dstfPtr;
2009cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    jint dstfLen = _env->GetArrayLength(_dstf);
2010cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    jlong *jDstfPtr = _env->GetLongArrayElements(_dstf, nullptr);
2011cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang
2012cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    RsType* typesPtr;
2013cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    jint typesLen = _env->GetArrayLength(_types);
2014cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    jlong *jTypesPtr = _env->GetLongArrayElements(_types, nullptr);
2015cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang
2016cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    if (jKernelsPtr == nullptr) {
2017cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang        LOG_ERR("Failed to get Java array elements: kernels");
2018cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang        goto cleanup;
2019cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    }
2020cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    if (jSrcPtr == nullptr) {
2021cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang        LOG_ERR("Failed to get Java array elements: src");
2022cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang        goto cleanup;
2023cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    }
2024cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    if (jDstkPtr == nullptr) {
2025cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang        LOG_ERR("Failed to get Java array elements: dstk");
2026cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang        goto cleanup;
2027cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    }
2028cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    if (jDstfPtr == nullptr) {
2029cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang        LOG_ERR("Failed to get Java array elements: dstf");
2030cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang        goto cleanup;
2031cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    }
2032cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    if (jTypesPtr == nullptr) {
2033cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang        LOG_ERR("Failed to get Java array elements: types");
2034cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang        goto cleanup;
2035cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    }
2036cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang
2037cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    kernelsPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * kernelsLen);
2038bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < kernelsLen; ++i) {
2039bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        kernelsPtr[i] = (RsScriptKernelID)jKernelsPtr[i];
2040bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
2041bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2042cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    srcPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * srcLen);
2043bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < srcLen; ++i) {
2044bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        srcPtr[i] = (RsScriptKernelID)jSrcPtr[i];
2045bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
2046bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2047cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    dstkPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstkLen);
2048bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < dstkLen; ++i) {
2049bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dstkPtr[i] = (RsScriptKernelID)jDstkPtr[i];
2050bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
2051bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2052cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    dstfPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstfLen);
2053bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < dstfLen; ++i) {
2054bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dstfPtr[i] = (RsScriptKernelID)jDstfPtr[i];
2055bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
2056bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2057cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    typesPtr = (RsType*) malloc(sizeof(RsType) * typesLen);
2058bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < typesLen; ++i) {
2059bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        typesPtr[i] = (RsType)jTypesPtr[i];
2060bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
2061bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2062cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    id = (jlong)(uintptr_t) dispatchTab.ScriptGroupCreate((RsContext)con,
2063bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptKernelID *)kernelsPtr, kernelsLen * sizeof(RsScriptKernelID),
2064bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptKernelID *)srcPtr, srcLen * sizeof(RsScriptKernelID),
2065bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptKernelID *)dstkPtr, dstkLen * sizeof(RsScriptKernelID),
2066bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptFieldID *)dstfPtr, dstfLen * sizeof(RsScriptKernelID),
2067bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsType *)typesPtr, typesLen * sizeof(RsType));
2068bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2069bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(kernelsPtr);
2070bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(srcPtr);
2071bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(dstkPtr);
2072bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(dstfPtr);
2073bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(typesPtr);
2074cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang
2075cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wangcleanup:
2076cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    if (jKernelsPtr != nullptr) {
2077cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang        _env->ReleaseLongArrayElements(_kernels, jKernelsPtr, 0);
2078cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    }
2079cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    if (jSrcPtr != nullptr) {
2080cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang        _env->ReleaseLongArrayElements(_src, jSrcPtr, 0);
2081cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    }
2082cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    if (jDstkPtr != nullptr) {
2083cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang        _env->ReleaseLongArrayElements(_dstk, jDstkPtr, 0);
2084cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    }
2085cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    if (jDstfPtr != nullptr) {
2086cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang        _env->ReleaseLongArrayElements(_dstf, jDstfPtr, 0);
2087cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    }
2088cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    if (jTypesPtr != nullptr) {
2089cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang        _env->ReleaseLongArrayElements(_types, jTypesPtr, 0);
2090cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang    }
2091cc99363890bf2d4ef5da32bad794cad7089b1eecMiao Wang
2092c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
2093c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
2094c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2095c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
2096bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupSetInput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
2097c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
2098bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupSetInput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
2099bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)gid, (void *)kid, (void *)alloc);
2100bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ScriptGroupSetInput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid,
2101bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                    (RsAllocation)alloc);
2102c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
2103c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2104c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
2105bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupSetOutput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
2106c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
2107bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupSetOutput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
2108bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)gid, (void *)kid, (void *)alloc);
2109bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ScriptGroupSetOutput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid,
2110bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                     (RsAllocation)alloc);
2111c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
2112c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2113c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
2114bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupExecute(JNIEnv *_env, jobject _this, jlong con, jlong gid)
2115c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
2116bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupSetOutput, con(%p) group(%p)", (RsContext)con, (void *)gid);
2117bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ScriptGroupExecute((RsContext)con, (RsScriptGroup)gid);
2118c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
2119c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2120c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// ---------------------------------------------------------------------------
2121c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2122bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
2123bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnSamplerCreate(JNIEnv *_env, jobject _this, jlong con, jint magFilter, jint minFilter,
2124c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main               jint wrapS, jint wrapT, jint wrapR, jfloat aniso)
2125c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
2126bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nSamplerCreate, con(%p)", (RsContext)con);
2127bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)dispatchTab.SamplerCreate((RsContext)con,
2128bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)magFilter,
2129bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)minFilter,
2130bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)wrapS,
2131bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)wrapT,
2132bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)wrapR,
2133bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       aniso);
2134bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang}
2135bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2136bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jint
2137bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnSystemGetPointerSize(JNIEnv *_env, jobject _this) {
2138bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jint)sizeof(void*);
2139c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
2140c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
21416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// ---------------------------------------------------------------------------
21426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// For Incremental Intrinsic Support
2143d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wangstatic jboolean nIncLoadSO(JNIEnv *_env, jobject _this, jint deviceApi, jstring libPath) {
21446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    void* handle = NULL;
2145d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang    // For API 9+, dlopen the full path of libRSSupport.
2146d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang    if (libPath != NULL) {
2147d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        const char * libPathJni = _env->GetStringUTFChars(libPath, JNI_FALSE);
2148d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        handle = dlopen(libPathJni, RTLD_LAZY | RTLD_LOCAL);
2149d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        _env->ReleaseStringUTFChars(libPath, libPathJni);
2150d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang    } else {
2151d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        handle = dlopen("libRSSupport.so", RTLD_LAZY | RTLD_LOCAL);
2152d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang    }
2153d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang
21546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (handle == NULL) {
2155d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        LOG_ERR("couldn't dlopen %s;  librsjni version: %d", dlerror(), RS_JNI_VERSION);
21566f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return false;
21576f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
21586f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
2159e27a340e3a55a3650e1f74bf1d350104596c4d4bMiao Wang    if (loadSymbols(handle, dispatchTabInc, deviceApi) == false) {
2160d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        LOG_ERR("Dispatch Table init failed! librsjni version: %d", RS_JNI_VERSION);
2161d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        dlclose(handle);
21626f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return false;
21636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
216494ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang    dispatchTabInc.AllocationCreateStrided = (AllocationCreateStridedFnPtr)dlsym(handle, "rsAllocationCreateStrided");
216594ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang    if (dispatchTabInc.AllocationCreateStrided == NULL) {
2166d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        LOG_ERR("Couldn't initialize dispatchTabInc.AllocationCreateStrided");
2167d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        dlclose(handle);
216894ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang        return false;
216994ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang    }
2170d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang    LOG_API("Successfully loaded compat runtime");
21716f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return true;
21726f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
21736f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
21746f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
21756f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// To create/destroy a dummy context
21766f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
21776f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj)
21786f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
21796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj);
21806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    dispatchTabInc.ObjDestroy((RsContext)con, (void *)obj);
21816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
21826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
21836f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
21846f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
21856f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncDeviceCreate(JNIEnv *_env, jobject _this)
21866f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
21876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nDeviceCreate");
21886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.DeviceCreate();
21896f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
21906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
21916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
21926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev)
21936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
21946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nDeviceDestroy");
21956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return dispatchTabInc.DeviceDestroy((RsDevice)dev);
21966f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
21976f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
21986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
21996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer, jint ct)
22006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
22016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nContextCreate");
22026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    //The compat context for incremental support will be synchronous.
22036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.ContextCreate((RsDevice)dev, ver, sdkVer,
22046f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                          (RsContextType)ct,
22056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                          RS_CONTEXT_SYNCHRONOUS);
22066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
22076f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
22086f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
22096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncContextFinish(JNIEnv *_env, jobject _this, jlong con)
22106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
22116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nContextFinish, con(%p)", (RsContext)con);
22126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    dispatchTabInc.ContextFinish((RsContext)con);
22136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
22146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
22156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
22166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncContextDestroy(JNIEnv *_env, jobject _this, jlong con)
22176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
22186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nContextDestroy, con(%p)", (RsContext)con);
22196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    dispatchTabInc.ContextDestroy((RsContext)con);
22206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
22216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
22226f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
22236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Create dummy Element
22246f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
22256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind, jboolean norm, jint size)
22266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
22276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nElementCreate, con(%p), type(%i), kind(%i), norm(%i), size(%i)", (RsContext)con,
22286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            type, kind, norm, size);
22296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.ElementCreate((RsContext)con, (RsDataType)type,
22306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                          (RsDataKind)kind, norm, size);
22316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
22326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
22336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Create dummy Type
22346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
22356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid,
22366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv)
22376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
22386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)",
22396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            incCon, eid, dimx, dimy, dimz, mips, faces, yuv);
22406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
22416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.TypeCreate((RsContext)con, (RsElement)eid, dimx, dimy,
22426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                       dimz, mips, faces, yuv);
22436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
22446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
22456f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
22466f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Create Allocation from pointer
22476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
224894ded3567e0f2a567887e5d8ab896634da855a2eMiao WangnIncAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong alloc, jlong type, jint xBytesSize)
22496f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
22506f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)",
22516f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            incCon, (RsElement)type, mips, usage, (void *)pointer);
22526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    size_t strideIn;
22536f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    void* pIn = NULL;
22546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    RsAllocation ainI = NULL;
22556f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (alloc != 0) {
22566f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        pIn = dispatchTab.AllocationGetPointer((RsContext)con, (RsAllocation)alloc, 0,
22576f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                               RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 0, 0,
22586f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                               &strideIn, sizeof(size_t));
225994ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang        /*
226094ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         * By definition stride is a roundup of xBytesSize with requiredAlignment, so requiredAlignment must
226194ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         * be strictly larger than the difference of (stride - xBytesSize).
226294ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         *
226394ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         * We can prove that as long as requiredAlignment satisfies the following two conditions, the
226494ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         * memory layout will be identical :
226594ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         * 1. Smaller or equal than stride;
226694ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         * 2. Larger than minRequiredAlignment.
226794ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         *
226894ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         * In this case we can simply choose the first power of 2 that satisfies both conditions.
226994ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         */
227094ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang        size_t requiredAlignment = 16;
227194ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang        size_t minRequiredAlignment = strideIn - xBytesSize;
227294ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang        while (requiredAlignment <= minRequiredAlignment) {
227394ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang            requiredAlignment <<= 1;
227494ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang        }
227594ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang        ainI = dispatchTabInc.AllocationCreateStrided((RsContext)incCon, (RsType)type,
227694ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang                                                      RS_ALLOCATION_MIPMAP_NONE,
227794ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang                                                      RS_ALLOCATION_USAGE_INCREMENTAL_SUPPORT | RS_ALLOCATION_USAGE_SHARED,
227894ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang                                                      (uintptr_t)pIn, requiredAlignment);
22796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
22806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t) ainI;
22816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
2282c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
228329f8636ee81c93588204e54273df97d8326b103cMiao Wangstatic jobject
228429f8636ee81c93588204e54273df97d8326b103cMiao WangnAllocationGetByteBuffer(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint xBytesSize, jint dimY, jint dimZ)
228529f8636ee81c93588204e54273df97d8326b103cMiao Wang{
228629f8636ee81c93588204e54273df97d8326b103cMiao Wang    LOG_API("nAllocationGetByteBuffer, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
228729f8636ee81c93588204e54273df97d8326b103cMiao Wang    size_t strideIn = xBytesSize;
228829f8636ee81c93588204e54273df97d8326b103cMiao Wang    void* ptr = NULL;
228929f8636ee81c93588204e54273df97d8326b103cMiao Wang    if (alloc != 0 && dispatchTab.AllocationGetPointer != nullptr) {
229029f8636ee81c93588204e54273df97d8326b103cMiao Wang        ptr = dispatchTab.AllocationGetPointer((RsContext)con, (RsAllocation)alloc, 0,
229129f8636ee81c93588204e54273df97d8326b103cMiao Wang                                               RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, dimZ, 0,
229229f8636ee81c93588204e54273df97d8326b103cMiao Wang                                               &strideIn, sizeof(size_t));
229329f8636ee81c93588204e54273df97d8326b103cMiao Wang    }
229429f8636ee81c93588204e54273df97d8326b103cMiao Wang    if (ptr != NULL) {
229529f8636ee81c93588204e54273df97d8326b103cMiao Wang        size_t bufferSize = strideIn;
229629f8636ee81c93588204e54273df97d8326b103cMiao Wang        if (dimY > 0) {
229729f8636ee81c93588204e54273df97d8326b103cMiao Wang            bufferSize *= dimY;
229829f8636ee81c93588204e54273df97d8326b103cMiao Wang        }
229929f8636ee81c93588204e54273df97d8326b103cMiao Wang        if (dimZ > 0) {
230029f8636ee81c93588204e54273df97d8326b103cMiao Wang            bufferSize *= dimZ;
230129f8636ee81c93588204e54273df97d8326b103cMiao Wang        }
230229f8636ee81c93588204e54273df97d8326b103cMiao Wang        jobject byteBuffer = _env->NewDirectByteBuffer(ptr, (jlong) bufferSize);
230329f8636ee81c93588204e54273df97d8326b103cMiao Wang        return byteBuffer;
230429f8636ee81c93588204e54273df97d8326b103cMiao Wang    } else {
230529f8636ee81c93588204e54273df97d8326b103cMiao Wang        return NULL;
230629f8636ee81c93588204e54273df97d8326b103cMiao Wang    }
230729f8636ee81c93588204e54273df97d8326b103cMiao Wang}
230829f8636ee81c93588204e54273df97d8326b103cMiao Wang
230929f8636ee81c93588204e54273df97d8326b103cMiao Wangstatic jlong
231029f8636ee81c93588204e54273df97d8326b103cMiao WangnAllocationGetStride(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
231129f8636ee81c93588204e54273df97d8326b103cMiao Wang{
231229f8636ee81c93588204e54273df97d8326b103cMiao Wang    LOG_API("nAllocationGetStride, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
23136a8ec7ed1b46523ad0b468c4345801fb9454ebefStephen Hines    size_t strideIn = 0;
231429f8636ee81c93588204e54273df97d8326b103cMiao Wang    if (alloc != 0 && dispatchTab.AllocationGetPointer != nullptr) {
2315e5125574a68ee6283c300732a11662d8f9945624Yang Ni        dispatchTab.AllocationGetPointer((RsContext)con, (RsAllocation)alloc, 0,
2316e5125574a68ee6283c300732a11662d8f9945624Yang Ni                                         RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 0, 0,
2317e5125574a68ee6283c300732a11662d8f9945624Yang Ni                                         &strideIn, sizeof(size_t));
231829f8636ee81c93588204e54273df97d8326b103cMiao Wang    }
231929f8636ee81c93588204e54273df97d8326b103cMiao Wang    return (jlong)strideIn;
232029f8636ee81c93588204e54273df97d8326b103cMiao Wang}
232129f8636ee81c93588204e54273df97d8326b103cMiao Wang
23222e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang// ---------------------------------------------------------------------------
2323c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2324bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2325c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic const char *classPathName = "android/support/v8/renderscript/RenderScript";
2326c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2327c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic JNINativeMethod methods[] = {
2328d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang{"nLoadSO",                        "(ZILjava/lang/String;)Z",                 (bool*)nLoadSO },
2329dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang{"nLoadIOSO",                      "()Z",                                     (bool*)nLoadIOSO },
2330bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nDeviceCreate",                  "()J",                                     (void*)nDeviceCreate },
2331bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nDeviceDestroy",                 "(J)V",                                    (void*)nDeviceDestroy },
2332bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nDeviceSetConfig",               "(JII)V",                                  (void*)nDeviceSetConfig },
2333bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextGetUserMessage",         "(J[I)I",                                  (void*)nContextGetUserMessage },
2334bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextGetErrorMessage",        "(J)Ljava/lang/String;",                   (void*)nContextGetErrorMessage },
2335bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextPeekMessage",            "(J[I)I",                                  (void*)nContextPeekMessage },
2336bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextInitToClient",           "(J)V",                                    (void*)nContextInitToClient },
2337bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextDeinitToClient",         "(J)V",                                    (void*)nContextDeinitToClient },
2338c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2339c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2340c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// All methods below are thread protected in java.
2341ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang{"rsnContextCreate",                 "(JIIILjava/lang/String;)J",             (void*)nContextCreate },
2342bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextFinish",                 "(J)V",                                  (void*)nContextFinish },
2343bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextSetPriority",            "(JI)V",                                 (void*)nContextSetPriority },
2344bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextDestroy",                "(J)V",                                  (void*)nContextDestroy },
2345bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextDump",                   "(JI)V",                                 (void*)nContextDump },
2346bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextSendMessage",            "(JI[I)V",                               (void*)nContextSendMessage },
2347b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnClosureCreate",                 "(JJJ[J[J[I[J[J)J",                      (void*)nClosureCreate },
2348b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnInvokeClosureCreate",           "(JJ[B[J[J[I)J",                         (void*)nInvokeClosureCreate },
2349b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnClosureSetArg",                 "(JJIJI)V",                              (void*)nClosureSetArg },
2350b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnClosureSetGlobal",              "(JJJJI)V",                              (void*)nClosureSetGlobal },
2351bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnObjDestroy",                    "(JJ)V",                                 (void*)nObjDestroy },
2352bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2353bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnElementCreate",                 "(JJIZI)J",                              (void*)nElementCreate },
2354bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnElementCreate2",                "(J[J[Ljava/lang/String;[I)J",           (void*)nElementCreate2 },
2355bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnElementGetSubElements",         "(JJ[J[Ljava/lang/String;[I)V",          (void*)nElementGetSubElements },
2356bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2357bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnTypeCreate",                    "(JJIIIZZI)J",                           (void*)nTypeCreate },
2358bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2359bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCreateTyped",         "(JJIIJ)J",                              (void*)nAllocationCreateTyped },
2360bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCreateFromBitmap",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateFromBitmap },
2361bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCreateBitmapBackedAllocation",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateBitmapBackedAllocation },
2362bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCubeCreateFromBitmap","(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCubeCreateFromBitmap },
2363bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2364bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCopyFromBitmap",      "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyFromBitmap },
2365bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCopyToBitmap",        "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyToBitmap },
2366bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2367bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationSyncAll",             "(JJI)V",                                (void*)nAllocationSyncAll },
2368bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationSetSurface",          "(JJLandroid/view/Surface;)V",           (void*)nAllocationSetSurface },
2369bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationIoSend",              "(JJ)V",                                 (void*)nAllocationIoSend },
23702e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationData1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationData1D },
2371bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationElementData1D",       "(JJIII[BI)V",                           (void*)nAllocationElementData1D },
2372244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang//{"rsnAllocationElementData",         "(JJIIIII[BI)V",                         (void*)nAllocationElementData },
23732e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationData2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationData2D },
2374bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationData2D",              "(JJIIIIIIJIIII)V",                      (void*)nAllocationData2D_alloc },
23752e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationData3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",    (void*)nAllocationData3D },
2376bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationData3D",              "(JJIIIIIIIJIIII)V",                     (void*)nAllocationData3D_alloc },
23772e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationRead",                "(JJLjava/lang/Object;IIZ)V",            (void*)nAllocationRead },
23782e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationRead1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationRead1D },
23793bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang//{"rsnAllocationElementRead",         "(JJIIIII[BI)V",                         (void*)nAllocationElementRead },
23802e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationRead2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationRead2D },
23812e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang//{"rsnAllocationRead3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",  (void*)nAllocationRead3D },
2382bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationGetType",             "(JJ)J",                                 (void*)nAllocationGetType},
2383bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationResize1D",            "(JJI)V",                                (void*)nAllocationResize1D },
2384bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationGenerateMipmaps",     "(JJ)V",                                 (void*)nAllocationGenerateMipmaps },
2385bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
23866f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptBindAllocation",          "(JJJIZ)V",                              (void*)nScriptBindAllocation },
23876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetTimeZone",             "(JJ[BZ)V",                              (void*)nScriptSetTimeZone },
23886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptInvoke",                  "(JJIZ)V",                               (void*)nScriptInvoke },
23896f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptInvokeV",                 "(JJI[BZ)V",                             (void*)nScriptInvokeV },
23906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEach",                 "(JJJIJJZ)V",                            (void*)nScriptForEach },
23916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEach",                 "(JJJIJJ[BZ)V",                          (void*)nScriptForEachV },
239289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang{"rsnScriptForEach",                 "(JJI[JJ[B[I)V",                         (void*)nScriptForEachMulti },
23936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEachClipped",          "(JJJIJJIIIIIIZ)V",                      (void*)nScriptForEachClipped },
23946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEachClipped",          "(JJJIJJ[BIIIIIIZ)V",                    (void*)nScriptForEachClippedV },
23955154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala{"rsnScriptReduce",                  "(JJIJJ[I)V",                            (void*)nScriptReduce },
2396043d28678b7e52ed1011286af57173c2c7bec749David Gross{"rsnScriptReduceNew",               "(JJI[JJ[I)V",                           (void*)nScriptReduceNew },
23976f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarI",                 "(JJIIZ)V",                              (void*)nScriptSetVarI },
23986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarJ",                 "(JJIJZ)V",                              (void*)nScriptSetVarJ },
23996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarF",                 "(JJIFZ)V",                              (void*)nScriptSetVarF },
24006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarD",                 "(JJIDZ)V",                              (void*)nScriptSetVarD },
24016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarV",                 "(JJI[BZ)V",                             (void*)nScriptSetVarV },
24026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarVE",                "(JJI[BJ[IZ)V",                          (void*)nScriptSetVarVE },
24036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarObj",               "(JJIJZ)V",                              (void*)nScriptSetVarObj },
2404bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2405bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptCCreate",                 "(JLjava/lang/String;Ljava/lang/String;[BI)J",  (void*)nScriptCCreate },
24066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptIntrinsicCreate",         "(JIJZ)J",                               (void*)nScriptIntrinsicCreate },
24076f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptKernelIDCreate",          "(JJIIZ)J",                              (void*)nScriptKernelIDCreate },
2408086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni{"rsnScriptInvokeIDCreate",          "(JJI)J",                                (void*)nScriptInvokeIDCreate },
24096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptFieldIDCreate",           "(JJIZ)J",                               (void*)nScriptFieldIDCreate },
2410bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupCreate",             "(J[J[J[J[J[J)J",                        (void*)nScriptGroupCreate },
2411e68c5973af1e80c77cab9aea0b77f46a801aef96Yang Ni{"rsnScriptGroup2Create",            "(JLjava/lang/String;Ljava/lang/String;[J)J", (void*)nScriptGroup2Create },
2412bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupSetInput",           "(JJJJ)V",                               (void*)nScriptGroupSetInput },
2413bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupSetOutput",          "(JJJJ)V",                               (void*)nScriptGroupSetOutput },
2414bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupExecute",            "(JJ)V",                                 (void*)nScriptGroupExecute },
2415b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnScriptGroup2Execute",           "(JJ)V",                                 (void*)nScriptGroup2Execute },
2416bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
24178919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang{"rsnScriptIntrinsicBLAS_Single",    "(JJJIIIIIIIIIFJJFJIIIIZ)V",             (void*)nScriptIntrinsicBLAS_Single },
24188919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang{"rsnScriptIntrinsicBLAS_Double",    "(JJJIIIIIIIIIDJJDJIIIIZ)V",             (void*)nScriptIntrinsicBLAS_Double },
24198919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang{"rsnScriptIntrinsicBLAS_Complex",   "(JJJIIIIIIIIIFFJJFFJIIIIZ)V",           (void*)nScriptIntrinsicBLAS_Complex },
24208919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang{"rsnScriptIntrinsicBLAS_Z",         "(JJJIIIIIIIIIDDJJDDJIIIIZ)V",           (void*)nScriptIntrinsicBLAS_Z },
24218919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
24228919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang{"rsnScriptIntrinsicBLAS_BNNM",      "(JJJIIIJIJIJIIZ)V",                     (void*)nScriptIntrinsicBLAS_BNNM },
24238919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
2424bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnSamplerCreate",                 "(JIIIIIF)J",                            (void*)nSamplerCreate },
2425c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2426bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnSystemGetPointerSize",          "()I",                                   (void*)nSystemGetPointerSize },
24276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
24286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Entry points for Inc libRSSupport
2429d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang{"nIncLoadSO",                       "(ILjava/lang/String;)Z",                (bool*)nIncLoadSO },
24306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"nIncDeviceCreate",                 "()J",                                   (void*)nIncDeviceCreate },
24316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"nIncDeviceDestroy",                "(J)V",                                  (void*)nIncDeviceDestroy },
24326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncContextCreate",              "(JIII)J",                               (void*)nIncContextCreate },
24336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncContextFinish",              "(J)V",                                  (void*)nIncContextFinish },
24346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncContextDestroy",             "(J)V",                                  (void*)nIncContextDestroy },
24356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncObjDestroy",                 "(JJ)V",                                 (void*)nIncObjDestroy },
24366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncElementCreate",              "(JJIZI)J",                              (void*)nIncElementCreate },
24376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncTypeCreate",                 "(JJIIIZZI)J",                           (void*)nIncTypeCreate },
243894ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang{"rsnIncAllocationCreateTyped",      "(JJJJI)J",                              (void*)nIncAllocationCreateTyped },
243929f8636ee81c93588204e54273df97d8326b103cMiao Wang{"rsnAllocationGetByteBuffer",       "(JJIII)Ljava/nio/ByteBuffer;",          (void*)nAllocationGetByteBuffer },
244029f8636ee81c93588204e54273df97d8326b103cMiao Wang{"rsnAllocationGetStride",           "(JJ)J",                                 (void*)nAllocationGetStride },
2441c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main};
2442c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2443c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// ---------------------------------------------------------------------------
2444c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2445c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainjint JNI_OnLoad(JavaVM* vm, void* reserved)
2446c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
2447c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    JNIEnv* env = NULL;
2448257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    jclass clazz = NULL;
2449c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint result = -1;
2450c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2451c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
2452184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
2453184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "ERROR: GetEnv failed\n");
2454257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        goto bail;
2455257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
2456257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (env == NULL) {
2457184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "ERROR: env == NULL");
2458257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        goto bail;
2459257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
2460257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines
2461257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    clazz = env->FindClass(classPathName);
2462257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (clazz == NULL) {
2463c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto bail;
2464c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
2465c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2466257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (env->RegisterNatives(clazz, methods, NELEM(methods)) < 0) {
2467184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
2468184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "ERROR: MediaPlayer native registration failed\n");
2469c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto bail;
2470c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
2471c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2472c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    /* success -- return valid version number */
2473c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    result = JNI_VERSION_1_4;
2474c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2475c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainbail:
2476c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return result;
2477c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
2478