android_renderscript_RenderScript.cpp revision 1e46e4458cd167070301ecbc81ceea73c49eb0f6
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(...)
33c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
34257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines#define NELEM(m) (sizeof(m) / sizeof((m)[0]))
35c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
368352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wangtemplate <typename... T>
378352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wangvoid UNUSED(T... t) {}
388352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang#define PER_ARRAY_TYPE(flag, fnc, readonly, ...) {                                      \
398352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    jint len = 0;                                                                       \
408352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    void *ptr = nullptr;                                                                \
412e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    void *srcPtr = nullptr;                                                             \
428352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    size_t typeBytes = 0;                                                               \
438352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    jint relFlag = 0;                                                                   \
448352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    if (readonly) {                                                                     \
458352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        /* The on-release mode should only be JNI_ABORT for read-only accesses. */      \
462e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        /* readonly = true, also indicates we are copying to the allocation   . */      \
478352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        relFlag = JNI_ABORT;                                                            \
488352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }                                                                                   \
498352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    switch(dataType) {                                                                  \
508352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_FLOAT_32:                                                              \
518352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        len = _env->GetArrayLength((jfloatArray)data);                                  \
528352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        ptr = _env->GetFloatArrayElements((jfloatArray)data, flag);                     \
538352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        typeBytes = 4;                                                                  \
542e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        if (usePadding) {                                                               \
552e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            srcPtr = ptr;                                                               \
562e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            len = len / 3 * 4;                                                          \
572e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (count == 0) {                                                           \
582e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                count = len / 4;                                                        \
592e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
602e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = malloc (len * typeBytes);                                             \
612e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (readonly) {                                                             \
622e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
632e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
642e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            } else {                                                                    \
652e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
662e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
672e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
682e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            free(ptr);                                                                  \
692e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = srcPtr;                                                               \
702e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        } else {                                                                        \
712e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            fnc(__VA_ARGS__);                                                           \
722e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        }                                                                               \
738352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        _env->ReleaseFloatArrayElements((jfloatArray)data, (jfloat *)ptr, relFlag);     \
748352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return;                                                                         \
758352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_FLOAT_64:                                                              \
768352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        len = _env->GetArrayLength((jdoubleArray)data);                                 \
778352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        ptr = _env->GetDoubleArrayElements((jdoubleArray)data, flag);                   \
788352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        typeBytes = 8;                                                                  \
792e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        if (usePadding) {                                                               \
802e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            srcPtr = ptr;                                                               \
812e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            len = len / 3 * 4;                                                          \
822e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (count == 0) {                                                           \
832e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                count = len / 4;                                                        \
842e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
852e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = malloc (len * typeBytes);                                             \
862e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (readonly) {                                                             \
872e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
882e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
892e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            } else {                                                                    \
902e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
912e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
922e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
932e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            free(ptr);                                                                  \
942e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = srcPtr;                                                               \
952e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        } else {                                                                        \
962e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            fnc(__VA_ARGS__);                                                           \
972e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        }                                                                               \
988352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        _env->ReleaseDoubleArrayElements((jdoubleArray)data, (jdouble *)ptr, relFlag);  \
998352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return;                                                                         \
1008352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_SIGNED_8:                                                              \
1018352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_UNSIGNED_8:                                                            \
1028352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        len = _env->GetArrayLength((jbyteArray)data);                                   \
1038352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        ptr = _env->GetByteArrayElements((jbyteArray)data, flag);                       \
1048352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        typeBytes = 1;                                                                  \
1052e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        if (usePadding) {                                                               \
1062e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            srcPtr = ptr;                                                               \
1072e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            len = len / 3 * 4;                                                          \
1082e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (count == 0) {                                                           \
1092e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                count = len / 4;                                                        \
1102e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
1112e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = malloc (len * typeBytes);                                             \
1122e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (readonly) {                                                             \
1132e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
1142e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
1152e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            } else {                                                                    \
1162e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
1172e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
1182e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
1192e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            free(ptr);                                                                  \
1202e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = srcPtr;                                                               \
1212e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        } else {                                                                        \
1222e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            fnc(__VA_ARGS__);                                                           \
1232e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        }                                                                               \
1248352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        _env->ReleaseByteArrayElements((jbyteArray)data, (jbyte*)ptr, relFlag);         \
1258352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return;                                                                         \
1268352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_SIGNED_16:                                                             \
1278352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_UNSIGNED_16:                                                           \
1288352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        len = _env->GetArrayLength((jshortArray)data);                                  \
1298352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        ptr = _env->GetShortArrayElements((jshortArray)data, flag);                     \
1308352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        typeBytes = 2;                                                                  \
1312e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        if (usePadding) {                                                               \
1322e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            srcPtr = ptr;                                                               \
1332e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            len = len / 3 * 4;                                                          \
1342e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (count == 0) {                                                           \
1352e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                count = len / 4;                                                        \
1362e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
1372e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = malloc (len * typeBytes);                                             \
1382e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (readonly) {                                                             \
1392e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
1402e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
1412e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            } else {                                                                    \
1422e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
1432e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
1442e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
1452e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            free(ptr);                                                                  \
1462e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = srcPtr;                                                               \
1472e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        } else {                                                                        \
1482e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            fnc(__VA_ARGS__);                                                           \
1492e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        }                                                                               \
1508352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        _env->ReleaseShortArrayElements((jshortArray)data, (jshort *)ptr, relFlag);     \
1518352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return;                                                                         \
1528352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_SIGNED_32:                                                             \
1538352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_UNSIGNED_32:                                                           \
1548352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        len = _env->GetArrayLength((jintArray)data);                                    \
1558352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        ptr = _env->GetIntArrayElements((jintArray)data, flag);                         \
1568352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        typeBytes = 4;                                                                  \
1572e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        if (usePadding) {                                                               \
1582e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            srcPtr = ptr;                                                               \
1592e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            len = len / 3 * 4;                                                          \
1602e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (count == 0) {                                                           \
1612e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                count = len / 4;                                                        \
1622e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
1632e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = malloc (len * typeBytes);                                             \
1642e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (readonly) {                                                             \
1652e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
1662e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
1672e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            } else {                                                                    \
1682e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
1692e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
1702e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
1712e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            free(ptr);                                                                  \
1722e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = srcPtr;                                                               \
1732e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        } else {                                                                        \
1742e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            fnc(__VA_ARGS__);                                                           \
1752e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        }                                                                               \
1768352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        _env->ReleaseIntArrayElements((jintArray)data, (jint *)ptr, relFlag);           \
1778352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return;                                                                         \
1788352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_SIGNED_64:                                                             \
1798352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    case RS_TYPE_UNSIGNED_64:                                                           \
1808352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        len = _env->GetArrayLength((jlongArray)data);                                   \
1818352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        ptr = _env->GetLongArrayElements((jlongArray)data, flag);                       \
1828352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        typeBytes = 8;                                                                  \
1832e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        if (usePadding) {                                                               \
1842e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            srcPtr = ptr;                                                               \
1852e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            len = len / 3 * 4;                                                          \
1862e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (count == 0) {                                                           \
1872e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                count = len / 4;                                                        \
1882e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
1892e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = malloc (len * typeBytes);                                             \
1902e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            if (readonly) {                                                             \
1912e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
1922e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
1932e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            } else {                                                                    \
1942e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                fnc(__VA_ARGS__);                                                       \
1952e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
1962e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            }                                                                           \
1972e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            free(ptr);                                                                  \
1982e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            ptr = srcPtr;                                                               \
1992e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        } else {                                                                        \
2002e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang            fnc(__VA_ARGS__);                                                           \
2012e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        }                                                                               \
2028352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        _env->ReleaseLongArrayElements((jlongArray)data, (jlong *)ptr, relFlag);        \
2038352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return;                                                                         \
2048352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    default:                                                                            \
2058352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        break;                                                                          \
2068352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }                                                                                   \
2072e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    UNUSED(len, ptr, srcPtr, typeBytes, relFlag);                                       \
2088352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang}
2098352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
2108352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
211c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainclass AutoJavaStringToUTF8 {
212c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainpublic:
213c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringToUTF8(JNIEnv* env, jstring str) : fEnv(env), fJStr(str) {
214c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        fCStr = env->GetStringUTFChars(str, NULL);
215c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        fLength = env->GetStringUTFLength(str);
216c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
217c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    ~AutoJavaStringToUTF8() {
218c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        fEnv->ReleaseStringUTFChars(fJStr, fCStr);
219c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
220c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    const char* c_str() const { return fCStr; }
221c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jsize length() const { return fLength; }
222c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
223c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainprivate:
224c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    JNIEnv*     fEnv;
225c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jstring     fJStr;
226c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    const char* fCStr;
227c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jsize       fLength;
228c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main};
229c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
230c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainclass AutoJavaStringArrayToUTF8 {
231c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainpublic:
232c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringArrayToUTF8(JNIEnv* env, jobjectArray strings, jsize stringsLength)
233c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    : mEnv(env), mStrings(strings), mStringsLength(stringsLength) {
234c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        mCStrings = NULL;
235c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        mSizeArray = NULL;
236c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        if (stringsLength > 0) {
237c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            mCStrings = (const char **)calloc(stringsLength, sizeof(char *));
238c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            mSizeArray = (size_t*)calloc(stringsLength, sizeof(size_t));
239c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            for (jsize ct = 0; ct < stringsLength; ct ++) {
240c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
241c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                mCStrings[ct] = mEnv->GetStringUTFChars(s, NULL);
242c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                mSizeArray[ct] = mEnv->GetStringUTFLength(s);
243c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            }
244c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        }
245c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
246c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    ~AutoJavaStringArrayToUTF8() {
247c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        for (jsize ct=0; ct < mStringsLength; ct++) {
248c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
249c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            mEnv->ReleaseStringUTFChars(s, mCStrings[ct]);
250c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        }
251c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        free(mCStrings);
252c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        free(mSizeArray);
253c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
254c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    const char **c_str() const { return mCStrings; }
255c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t *c_str_len() const { return mSizeArray; }
256c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jsize length() const { return mStringsLength; }
257c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
258c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainprivate:
259c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    JNIEnv      *mEnv;
260c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jobjectArray mStrings;
261c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    const char **mCStrings;
262c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t      *mSizeArray;
263c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jsize        mStringsLength;
264c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main};
265c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
266470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang
267470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang// ---------------------------------------------------------------------------
268470b3b5b70ec71042d30004747c625ca76c4007aMiao Wangstatic dispatchTable dispatchTab;
2696f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Incremental Support lib
2706f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic dispatchTable dispatchTabInc;
271470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang
272e27a340e3a55a3650e1f74bf1d350104596c4d4bMiao Wangstatic jboolean nLoadSO(JNIEnv *_env, jobject _this, jboolean useNative, jint targetApi) {
273470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    void* handle = NULL;
274470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    if (useNative) {
275470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang        handle = dlopen("libRS.so", RTLD_LAZY | RTLD_LOCAL);
276470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    } else {
277470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang        handle = dlopen("libRSSupport.so", RTLD_LAZY | RTLD_LOCAL);
278470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    }
279470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    if (handle == NULL) {
280470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang        LOG_API("couldn't dlopen %s, %s", filename, dlerror());
281470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang        return false;
282470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    }
283470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang
284e27a340e3a55a3650e1f74bf1d350104596c4d4bMiao Wang    if (loadSymbols(handle, dispatchTab, targetApi) == false) {
285470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang        LOG_API("%s init failed!", filename);
286470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang        return false;
287470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    }
288470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    LOG_API("Successfully loaded %s", filename);
289470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    return true;
290470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang}
291470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang
292dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wangstatic ioSuppDT ioDispatch;
293dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wangstatic jboolean nLoadIOSO(JNIEnv *_env, jobject _this) {
294dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    void* handleIO = NULL;
295dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    handleIO = dlopen("libRSSupportIO.so", RTLD_LAZY | RTLD_LOCAL);
296dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    if (handleIO == NULL) {
297dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang        LOG_API("Couldn't load libRSSupportIO.so");
298dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang        return false;
299dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    }
300dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    if (loadIOSuppSyms(handleIO, ioDispatch) == false) {
301dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang        LOG_API("libRSSupportIO init failed!");
302dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang        return false;
303dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    }
304dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    return true;
305dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang}
306ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang
307c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// ---------------------------------------------------------------------------
308c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
3092e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wangstatic void copyWithPadding(void* ptr, void* srcPtr, int mSize, int count) {
3102e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int sizeBytesPad = mSize * 4;
3112e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int sizeBytes = mSize * 3;
3122e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    uint8_t *dst = static_cast<uint8_t *>(ptr);
3132e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    uint8_t *src = static_cast<uint8_t *>(srcPtr);
3142e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    for (int i = 0; i < count; i++) {
3152e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        memcpy(dst, src, sizeBytes);
3162e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        dst += sizeBytesPad;
3172e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        src += sizeBytes;
3182e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    }
3192e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang}
3202e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang
3212e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wangstatic void copyWithUnPadding(void* ptr, void* srcPtr, int mSize, int count) {
3222e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int sizeBytesPad = mSize * 4;
3232e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int sizeBytes = mSize * 3;
3242e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    uint8_t *dst = static_cast<uint8_t *>(ptr);
3252e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    uint8_t *src = static_cast<uint8_t *>(srcPtr);
3262e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    for (int i = 0; i < count; i++) {
3272e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        memcpy(dst, src, sizeBytes);
3282e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        dst += sizeBytes;
3292e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        src += sizeBytesPad;
3302e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    }
3312e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang}
3322e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang
3332e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang
3342e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang// ---------------------------------------------------------------------------
3352e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang
336c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
337bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextFinish(JNIEnv *_env, jobject _this, jlong con)
338c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
339bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextFinish, con(%p)", (RsContext)con);
340bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextFinish((RsContext)con);
341c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
342c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
343936fbd696aac243a514f74b6fee6efd5959527a4Yang Nistatic jlong
344936fbd696aac243a514f74b6fee6efd5959527a4Yang NinClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong kernelID,
345936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni               jlong returnValue, jlongArray fieldIDArray,
346936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni               jlongArray valueArray, jintArray sizeArray,
347936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni               jlongArray depClosureArray, jlongArray depFieldIDArray) {
348d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong ret = 0;
349d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
350936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
351936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
352d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
353d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jsize values_length = _env->GetArrayLength(valueArray);
354d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
355d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jsize sizes_length = _env->GetArrayLength(sizeArray);
356d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong* jDepClosures =
357d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      _env->GetLongArrayElements(depClosureArray, nullptr);
358d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jsize depClosures_length = _env->GetArrayLength(depClosureArray);
359d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong* jDepFieldIDs =
360d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      _env->GetLongArrayElements(depFieldIDArray, nullptr);
361d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jsize depFieldIDs_length = _env->GetArrayLength(depFieldIDArray);
362d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
363d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  size_t numValues, numDependencies;
364d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  RsScriptFieldID* fieldIDs;
365d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  uintptr_t* values;
366d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  RsClosure* depClosures;
367d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  RsScriptFieldID* depFieldIDs;
368d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
369d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (fieldIDs_length != values_length || values_length != sizes_length) {
370d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      LOG_API("Unmatched field IDs, values, and sizes in closure creation.");
371d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
372d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
373d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
374d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  numValues = (size_t)fieldIDs_length;
375d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
376d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (depClosures_length != depFieldIDs_length) {
377d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      LOG_API("Unmatched closures and field IDs for dependencies in closure creation.");
378d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
379d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
380d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
381d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  numDependencies = (size_t)depClosures_length;
382d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
383d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (numDependencies > numValues) {
384d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      LOG_API("Unexpected number of dependencies in closure creation");
385d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
386d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
387d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
388d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
389d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      LOG_API("Too many arguments or globals in closure creation");
390d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
391d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
392d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
393d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
394d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (fieldIDs == nullptr) {
395d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
396d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
397d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
398d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  for (size_t i = 0; i < numValues; i++) {
399936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni    fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
400936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
401936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
402d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  values = (uintptr_t*)alloca(sizeof(uintptr_t) * numValues);
403d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (values == nullptr) {
404d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
405d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
406d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
407d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  for (size_t i = 0; i < numValues; i++) {
408936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni    values[i] = (uintptr_t)jValues[i];
409936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
410936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
411d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  depClosures = (RsClosure*)alloca(sizeof(RsClosure) * numDependencies);
412d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (depClosures == nullptr) {
413d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
414d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
415936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
416d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  for (size_t i = 0; i < numDependencies; i++) {
417936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni    depClosures[i] = (RsClosure)jDepClosures[i];
418936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
419936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
420d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  depFieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numDependencies);
421d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (depFieldIDs == nullptr) {
422d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
423d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
424d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
425d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  for (size_t i = 0; i < numDependencies; i++) {
426936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni    depFieldIDs[i] = (RsClosure)jDepFieldIDs[i];
427936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
428936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
429d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  ret = (jlong)(uintptr_t)dispatchTab.ClosureCreate(
430936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni      (RsContext)con, (RsScriptKernelID)kernelID, (RsAllocation)returnValue,
431d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      fieldIDs, numValues, values, numValues,
432d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      (int*)jSizes, numValues,
433d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      depClosures, numDependencies,
434d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      depFieldIDs, numDependencies);
435d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
436d454f4541683a6bddfa1d00424a71f5855675e86Yang Niexit:
437d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
438d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(depFieldIDArray, jDepFieldIDs, JNI_ABORT);
439d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(depClosureArray, jDepClosures, JNI_ABORT);
440d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseIntArrayElements (sizeArray,       jSizes,       JNI_ABORT);
441d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(valueArray,      jValues,      JNI_ABORT);
442d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(fieldIDArray,    jFieldIDs,    JNI_ABORT);
443d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
444d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  return ret;
445936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni}
446936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
447b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wangstatic jlong
448b1c365bfb0566142c49375f09f2b8289182f1f47Miao WangnInvokeClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong invokeID,
449b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                     jbyteArray paramArray, jlongArray fieldIDArray, jlongArray valueArray,
450b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                     jintArray sizeArray) {
451d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong ret = 0;
452d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
453b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jbyte* jParams = _env->GetByteArrayElements(paramArray, nullptr);
454b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jsize jParamLength = _env->GetArrayLength(paramArray);
455b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
456b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
457d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
458d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jsize values_length = _env->GetArrayLength(valueArray);
459d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
460d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jsize sizes_length = _env->GetArrayLength(sizeArray);
461d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
462d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  size_t numValues;
463d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  RsScriptFieldID* fieldIDs;
464d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  uintptr_t* values;
465d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
466d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (fieldIDs_length != values_length || values_length != sizes_length) {
467d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      LOG_API("Unmatched field IDs, values, and sizes in closure creation.");
468d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
469d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
470d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
471d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  numValues = (size_t) fieldIDs_length;
472d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
473d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
474d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      LOG_API("Too many arguments or globals in closure creation");
475d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
476d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
477d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
478d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
479d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (fieldIDs == nullptr) {
480d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
481d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
482d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
483d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  for (size_t i = 0; i < numValues; i++) {
484b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
485b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  }
486b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
487d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  values = (uintptr_t*)alloca(sizeof(uintptr_t) * numValues);
488d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (values == nullptr) {
489d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
490b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  }
491b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
492d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  for (size_t i = 0; i < numValues; i++) {
493d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni    values[i] = (uintptr_t)jValues[i];
494d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
495b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
496d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  ret = (jlong)(uintptr_t)dispatchTab.InvokeClosureCreate(
497b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      (RsContext)con, (RsScriptInvokeID)invokeID, jParams, jParamLength,
498d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      fieldIDs, numValues, values, numValues,
499d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      (int*)jSizes, numValues);
500d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
501d454f4541683a6bddfa1d00424a71f5855675e86Yang Niexit:
502d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
503d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseIntArrayElements (sizeArray,       jSizes,       JNI_ABORT);
504d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(valueArray,      jValues,      JNI_ABORT);
505d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(fieldIDArray,    jFieldIDs,    JNI_ABORT);
506d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseByteArrayElements(paramArray,      jParams,      JNI_ABORT);
507d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
508d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  return ret;
509b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang}
510b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
511936fbd696aac243a514f74b6fee6efd5959527a4Yang Nistatic void
512936fbd696aac243a514f74b6fee6efd5959527a4Yang NinClosureSetArg(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
513936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni               jint index, jlong value, jint size) {
514b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  dispatchTab.ClosureSetArg((RsContext)con, (RsClosure)closureID, (uint32_t)index,
515b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                  (uintptr_t)value, (size_t)size);
516936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni}
517936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
518936fbd696aac243a514f74b6fee6efd5959527a4Yang Nistatic void
519936fbd696aac243a514f74b6fee6efd5959527a4Yang NinClosureSetGlobal(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
520936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni                  jlong fieldID, jlong value, jint size) {
521936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  dispatchTab.ClosureSetGlobal((RsContext)con, (RsClosure)closureID,
522b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                     (RsScriptFieldID)fieldID, (uintptr_t)value, (size_t)size);
523936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni}
524936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
525936fbd696aac243a514f74b6fee6efd5959527a4Yang Nistatic long
526e68c5973af1e80c77cab9aea0b77f46a801aef96Yang NinScriptGroup2Create(JNIEnv *_env, jobject _this, jlong con, jstring name,
527b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                    jstring cacheDir, jlongArray closureArray) {
528d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong ret = 0;
529d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
530e68c5973af1e80c77cab9aea0b77f46a801aef96Yang Ni  AutoJavaStringToUTF8 nameUTF(_env, name);
531b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
532b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
533936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jlong* jClosures = _env->GetLongArrayElements(closureArray, nullptr);
534936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jsize numClosures = _env->GetArrayLength(closureArray);
535d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
536d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  RsClosure* closures;
537d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
538d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (numClosures > (jsize) RS_SCRIPT_GROUP_MAX_NUMBER_CLOSURES) {
539d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni    LOG_API("Too many closures in script group");
540d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni    goto exit;
541d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
542d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
543d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  closures = (RsClosure*)alloca(sizeof(RsClosure) * numClosures);
544d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (closures == nullptr) {
545d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
546d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
547d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
548936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  for (int i = 0; i < numClosures; i++) {
549936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni    closures[i] = (RsClosure)jClosures[i];
550936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
551936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
552d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  ret = (jlong)(uintptr_t)dispatchTab.ScriptGroup2Create(
553e68c5973af1e80c77cab9aea0b77f46a801aef96Yang Ni      (RsContext)con, nameUTF.c_str(), nameUTF.length(),
554e68c5973af1e80c77cab9aea0b77f46a801aef96Yang Ni      cacheDirUTF.c_str(), cacheDirUTF.length(),
555b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      closures, numClosures);
556d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
557d454f4541683a6bddfa1d00424a71f5855675e86Yang Niexit:
558d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
559d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(closureArray, jClosures, JNI_ABORT);
560d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
561d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  return ret;
562b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang}
563b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
564b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wangstatic void
565b1c365bfb0566142c49375f09f2b8289182f1f47Miao WangnScriptGroup2Execute(JNIEnv *_env, jobject _this, jlong con, jlong groupID) {
566b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  dispatchTab.ScriptGroupExecute((RsContext)con, (RsScriptGroup2)groupID);
567936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni}
568936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
569c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
570bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj)
571c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
572bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj);
573bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ObjDestroy((RsContext)con, (void *)obj);
574c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
575c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
5768919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
5778919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wangstatic void
5788919a441f977cb787d244aa42cc2d4dda1cbfa11Miao WangnScriptIntrinsicBLAS_Single(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong id, jint func, jint TransA,
5798919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                            jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
5808919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                            jfloat alpha, jlong A, jlong B, jfloat beta, jlong C, jint incX, jint incY,
5818919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                            jint KL, jint KU, jboolean mUseInc) {
5828919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsBlasCall call;
5838919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    memset(&call, 0, sizeof(call));
5848919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.func = (RsBlasFunction)func;
5858919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.transA = (RsBlasTranspose)TransA;
5868919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.transB = (RsBlasTranspose)TransB;
5878919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.side = (RsBlasSide)Side;
5888919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.uplo = (RsBlasUplo)Uplo;
5898919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.diag = (RsBlasDiag)Diag;
5908919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.M = M;
5918919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.N = N;
5928919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.K = K;
5938919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.alpha.f = alpha;
5948919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.beta.f = beta;
5958919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.incX = incX;
5968919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.incY = incY;
5978919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.KL = KL;
5988919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.KU = KU;
5998919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
6008919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsAllocation in_allocs[3];
6018919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[0] = (RsAllocation)A;
6028919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[1] = (RsAllocation)B;
6038919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[2] = (RsAllocation)C;
6048919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
6058919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    if (mUseInc) {
6068919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ContextFinish((RsContext)con);
6078919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
6081e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                          in_allocs, NELEM(in_allocs), nullptr,
6098919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                          &call, sizeof(call), nullptr, 0);
6108919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    } else {
6118919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
6121e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                       in_allocs, NELEM(in_allocs), nullptr,
6138919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                       &call, sizeof(call), nullptr, 0);
6148919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    }
6158919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang}
6168919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
6178919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wangstatic void
6188919a441f977cb787d244aa42cc2d4dda1cbfa11Miao WangnScriptIntrinsicBLAS_Double(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong id, jint func, jint TransA,
6198919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                            jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
6208919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                            jdouble alpha, jlong A, jlong B, jdouble beta, jlong C, jint incX, jint incY,
6218919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                            jint KL, jint KU, jboolean mUseInc) {
6228919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsBlasCall call;
6238919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    memset(&call, 0, sizeof(call));
6248919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.func = (RsBlasFunction)func;
6258919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.transA = (RsBlasTranspose)TransA;
6268919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.transB = (RsBlasTranspose)TransB;
6278919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.side = (RsBlasSide)Side;
6288919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.uplo = (RsBlasUplo)Uplo;
6298919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.diag = (RsBlasDiag)Diag;
6308919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.M = M;
6318919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.N = N;
6328919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.K = K;
6338919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.alpha.d = alpha;
6348919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.beta.d = beta;
6358919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.incX = incX;
6368919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.incY = incY;
6378919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.KL = KL;
6388919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.KU = KU;
6398919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
6408919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsAllocation in_allocs[3];
6418919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[0] = (RsAllocation)A;
6428919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[1] = (RsAllocation)B;
6438919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[2] = (RsAllocation)C;
6448919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
6458919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    if (mUseInc) {
6468919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ContextFinish((RsContext)con);
6478919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
6481e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                          in_allocs, NELEM(in_allocs), nullptr,
6498919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                          &call, sizeof(call), nullptr, 0);
6508919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    } else {
6518919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
6521e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                        in_allocs, NELEM(in_allocs), nullptr,
6538919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                        &call, sizeof(call), nullptr, 0);
6548919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    }
6558919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang}
6568919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
6578919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wangstatic void
6588919a441f977cb787d244aa42cc2d4dda1cbfa11Miao WangnScriptIntrinsicBLAS_Complex(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong id, jint func, jint TransA,
6598919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                             jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
6608919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                             jfloat alphaX, jfloat alphaY, jlong A, jlong B, jfloat betaX,
6618919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                             jfloat betaY, jlong C, jint incX, jint incY, jint KL, jint KU, jboolean mUseInc) {
6628919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsBlasCall call;
6638919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    memset(&call, 0, sizeof(call));
6648919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.func = (RsBlasFunction)func;
6658919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.transA = (RsBlasTranspose)TransA;
6668919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.transB = (RsBlasTranspose)TransB;
6678919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.side = (RsBlasSide)Side;
6688919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.uplo = (RsBlasUplo)Uplo;
6698919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.diag = (RsBlasDiag)Diag;
6708919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.M = M;
6718919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.N = N;
6728919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.K = K;
6738919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.alpha.c.r = alphaX;
6748919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.alpha.c.i = alphaY;
6758919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.beta.c.r = betaX;
6768919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.beta.c.i = betaY;
6778919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.incX = incX;
6788919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.incY = incY;
6798919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.KL = KL;
6808919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.KU = KU;
6818919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
6828919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsAllocation in_allocs[3];
6838919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[0] = (RsAllocation)A;
6848919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[1] = (RsAllocation)B;
6858919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[2] = (RsAllocation)C;
6868919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
6878919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
6888919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    if (mUseInc) {
6898919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ContextFinish((RsContext)con);
6908919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
6911e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                          in_allocs, NELEM(in_allocs), nullptr,
6928919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                          &call, sizeof(call), nullptr, 0);
6938919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    } else {
6948919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
6951e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                       in_allocs, NELEM(in_allocs), nullptr,
6968919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                       &call, sizeof(call), nullptr, 0);
6978919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    }
6988919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang}
6998919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
7008919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wangstatic void
7018919a441f977cb787d244aa42cc2d4dda1cbfa11Miao WangnScriptIntrinsicBLAS_Z(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong id, jint func, jint TransA,
7028919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                       jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
7038919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                       jdouble alphaX, jdouble alphaY, jlong A, jlong B, jdouble betaX,
7048919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                       jdouble betaY, jlong C, jint incX, jint incY, jint KL, jint KU, jboolean mUseInc) {
7058919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsBlasCall call;
7068919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    memset(&call, 0, sizeof(call));
7078919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.func = (RsBlasFunction)func;
7088919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.transA = (RsBlasTranspose)TransA;
7098919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.transB = (RsBlasTranspose)TransB;
7108919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.side = (RsBlasSide)Side;
7118919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.uplo = (RsBlasUplo)Uplo;
7128919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.diag = (RsBlasDiag)Diag;
7138919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.M = M;
7148919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.N = N;
7158919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.K = K;
7168919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.alpha.z.r = alphaX;
7178919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.alpha.z.i = alphaY;
7188919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.beta.z.r = betaX;
7198919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.beta.z.i = betaY;
7208919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.incX = incX;
7218919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.incY = incY;
7228919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.KL = KL;
7238919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.KU = KU;
7248919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
7258919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsAllocation in_allocs[3];
7268919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[0] = (RsAllocation)A;
7278919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[1] = (RsAllocation)B;
7288919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[2] = (RsAllocation)C;
7298919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
7308919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
7318919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    if (mUseInc) {
7328919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ContextFinish((RsContext)con);
7338919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
7341e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                          in_allocs, NELEM(in_allocs), nullptr,
7358919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                          &call, sizeof(call), nullptr, 0);
7368919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    } else {
7378919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7381e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                        in_allocs, NELEM(in_allocs), nullptr,
7398919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                        &call, sizeof(call), nullptr, 0);
7408919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    }
7418919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang}
7428919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
7438919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
7448919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wangstatic void
7458919a441f977cb787d244aa42cc2d4dda1cbfa11Miao WangnScriptIntrinsicBLAS_BNNM(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong id, jint M, jint N, jint K,
7468919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                          jlong A, jint a_offset, jlong B, jint b_offset, jlong C, jint c_offset,
7478919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                          jint c_mult_int, jboolean mUseInc) {
7488919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsBlasCall call;
7498919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    memset(&call, 0, sizeof(call));
7508919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.func = RsBlas_bnnm;
7518919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.M = M;
7528919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.N = N;
7538919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.K = K;
754341032cd8e6c1a8a8ddceccdafbf02687d0828acMiao Wang    call.a_offset = a_offset & 0xFF;
755341032cd8e6c1a8a8ddceccdafbf02687d0828acMiao Wang    call.b_offset = b_offset & 0xFF;
7568919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.c_offset = c_offset;
7578919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    call.c_mult_int = c_mult_int;
7588919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
7598919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    RsAllocation in_allocs[3];
7608919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[0] = (RsAllocation)A;
7618919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[1] = (RsAllocation)B;
7628919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    in_allocs[2] = (RsAllocation)C;
7638919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
7648919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    if (mUseInc) {
7658919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ContextFinish((RsContext)con);
7668919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
7671e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                          in_allocs, NELEM(in_allocs), nullptr,
7688919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                          &call, sizeof(call), nullptr, 0);
7698919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    } else {
7708919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7711e46e4458cd167070301ecbc81ceea73c49eb0f6Miao Wang                                        in_allocs, NELEM(in_allocs), nullptr,
7728919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                        &call, sizeof(call), nullptr, 0);
7738919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    }
7748919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang}
775c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// ---------------------------------------------------------------------------
776bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
777c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott MainnDeviceCreate(JNIEnv *_env, jobject _this)
778c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
779c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nDeviceCreate");
780bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)dispatchTab.DeviceCreate();
781c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
782c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
783c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
784bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev)
785c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
786c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nDeviceDestroy");
787470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    return dispatchTab.DeviceDestroy((RsDevice)dev);
788c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
789c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
790c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
791bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnDeviceSetConfig(JNIEnv *_env, jobject _this, jlong dev, jint p, jint value)
792c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
793c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nDeviceSetConfig  dev(%p), param(%i), value(%i)", (void *)dev, p, value);
794470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    return dispatchTab.DeviceSetConfig((RsDevice)dev, (RsDeviceParam)p, value);
795c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
796c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
797bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
798ecccf940f72679f7602c52b0b4bcb245acdad55bMiao WangnContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer,
799ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang               jint ct, jstring nativeLibDirJava)
800c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
801c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nContextCreate");
802ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    // Access the NativeLibDir in the Java Context.
803ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    const char * nativeLibDir = _env->GetStringUTFChars(nativeLibDirJava, JNI_FALSE);
804ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    size_t length = (size_t)_env->GetStringUTFLength(nativeLibDirJava);
805ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang
806ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    jlong id = (jlong)(uintptr_t)dispatchTab.ContextCreate((RsDevice)dev, ver,
807ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang                                                           sdkVer,
808ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang                                                           (RsContextType)ct, 0);
809ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    if (dispatchTab.SetNativeLibDir) {
810ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang        dispatchTab.SetNativeLibDir((RsContext)id, nativeLibDir, length);
811ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    }
812ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang
813ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    _env->ReleaseStringUTFChars(nativeLibDirJava, nativeLibDir);
814ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    return id;
815c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
816c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
817c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
818c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
819bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextSetPriority(JNIEnv *_env, jobject _this, jlong con, jint p)
820c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
821bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("ContextSetPriority, con(%p), priority(%i)", (RsContext)con, p);
822bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextSetPriority((RsContext)con, p);
823c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
824c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
825c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
826c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
827c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
828bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextDestroy(JNIEnv *_env, jobject _this, jlong con)
829c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
830bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextDestroy, con(%p)", (RsContext)con);
831bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextDestroy((RsContext)con);
832c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
833c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
834c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
835bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextDump(JNIEnv *_env, jobject _this, jlong con, jint bits)
836c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
837c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nContextDump, con(%p)  bits(%i)", (RsContext)con, bits);
838470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    dispatchTab.ContextDump((RsContext)con, bits);
839c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
840c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
841c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
842c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic jstring
843bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextGetErrorMessage(JNIEnv *_env, jobject _this, jlong con)
844c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
845bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextGetErrorMessage, con(%p)", (RsContext)con);
846c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    char buf[1024];
847c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
848c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t receiveLen;
849c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t subID;
850bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    int id = dispatchTab.ContextGetMessage((RsContext)con,
8516f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           buf, sizeof(buf),
8526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &receiveLen, sizeof(receiveLen),
8536f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &subID, sizeof(subID));
854c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (!id && receiveLen) {
855184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,
856184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "message receive buffer too small.  %zu", receiveLen);
857c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
858c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return _env->NewStringUTF(buf);
859c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
860c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
861c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic jint
862bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextGetUserMessage(JNIEnv *_env, jobject _this, jlong con, jintArray data)
863c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
864c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
865bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextGetMessage, con(%p), len(%i)", (RsContext)con, len);
866c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *ptr = _env->GetIntArrayElements(data, NULL);
867c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t receiveLen;
868c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t subID;
869bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    int id = dispatchTab.ContextGetMessage((RsContext)con,
8706f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           ptr, len * 4,
8716f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &receiveLen, sizeof(receiveLen),
8726f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &subID, sizeof(subID));
873c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (!id && receiveLen) {
874184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,
875184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "message receive buffer too small.  %zu", receiveLen);
876c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
877c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseIntArrayElements(data, ptr, 0);
878bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jint)id;
879c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
880c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
881c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic jint
882bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextPeekMessage(JNIEnv *_env, jobject _this, jlong con, jintArray auxData)
883c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
884bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextPeekMessage, con(%p)", (RsContext)con);
885c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *auxDataPtr = _env->GetIntArrayElements(auxData, NULL);
886c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t receiveLen;
887c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t subID;
888bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    int id = dispatchTab.ContextPeekMessage((RsContext)con, &receiveLen, sizeof(receiveLen),
889c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                                  &subID, sizeof(subID));
890c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    auxDataPtr[0] = (jint)subID;
891c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    auxDataPtr[1] = (jint)receiveLen;
892c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseIntArrayElements(auxData, auxDataPtr, 0);
893bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jint)id;
894c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
895c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
896bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic void nContextInitToClient(JNIEnv *_env, jobject _this, jlong con)
897c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
898bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextInitToClient, con(%p)", (RsContext)con);
899bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextInitToClient((RsContext)con);
900c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
901c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
902bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic void nContextDeinitToClient(JNIEnv *_env, jobject _this, jlong con)
903c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
904bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextDeinitToClient, con(%p)", (RsContext)con);
905bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextDeinitToClient((RsContext)con);
906c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
907c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
908c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
909bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextSendMessage(JNIEnv *_env, jobject _this, jlong con, jint id, jintArray data)
910c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
911c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *ptr = NULL;
912c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = 0;
913c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (data) {
914c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        len = _env->GetArrayLength(data);
915c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        jint *ptr = _env->GetIntArrayElements(data, NULL);
916c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
917bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextSendMessage, con(%p), id(%i), len(%i)", (RsContext)con, id, len);
918bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextSendMessage((RsContext)con, id, (const uint8_t *)ptr, len * sizeof(int));
919c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (data) {
920c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
921c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
922c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
923c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
924c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
925c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
926bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
927086010500c28e2bca57ea583d3f38da9a2f2f414Yang NinElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind,
928086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni               jboolean norm, jint size)
929c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
930bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nElementCreate, con(%p), type(%i), kind(%i), norm(%i), size(%i)", (RsContext)con,
931bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            type, kind, norm, size);
932086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    return (jlong)(uintptr_t)dispatchTab.ElementCreate((RsContext)con,
933086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni                                                       (RsDataType)type,
934086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni                                                       (RsDataKind)kind,
935bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       norm, size);
936c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
937c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
938bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
939bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnElementCreate2(JNIEnv *_env, jobject _this, jlong con,
940bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                jlongArray _ids, jobjectArray _names, jintArray _arraySizes)
941c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
942c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    int fieldCount = _env->GetArrayLength(_ids);
943bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nElementCreate2, con(%p)", (RsContext)con);
944bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
945bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jIds = _env->GetLongArrayElements(_ids, NULL);
946bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint *jArraySizes = _env->GetIntArrayElements(_arraySizes, NULL);
947c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
948bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsElement *ids = (RsElement*)malloc(fieldCount * sizeof(RsElement));
949bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    uint32_t *arraySizes = (uint32_t *)malloc(fieldCount * sizeof(uint32_t));
950bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
951bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < fieldCount; i ++) {
952bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        ids[i] = (RsElement)jIds[i];
953bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        arraySizes[i] = (uint32_t)jArraySizes[i];
954bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
955c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
956c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringArrayToUTF8 names(_env, _names, fieldCount);
957c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
958c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    const char **nameArray = names.c_str();
959c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t *sizeArray = names.c_str_len();
960c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
9616f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    jlong id = (jlong)(uintptr_t)dispatchTab.ElementCreate2((RsContext)con, (RsElement *)ids,
9626f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                            fieldCount, nameArray,
9636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                            fieldCount * sizeof(size_t),  sizeArray,
9646f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                            (const uint32_t *)arraySizes, fieldCount);
965c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
966bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(ids);
967bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(arraySizes);
968bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_ids, jIds, JNI_ABORT);
969bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseIntArrayElements(_arraySizes, jArraySizes, JNI_ABORT);
970bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return id;
971c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
972c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
973c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
974c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
975bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
976c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
977bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnElementGetSubElements(JNIEnv *_env, jobject _this, jlong con, jlong id,
978bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                       jlongArray _IDs,
979c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                       jobjectArray _names,
980c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                       jintArray _arraySizes)
981c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
982bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    uint32_t dataSize = _env->GetArrayLength(_IDs);
983bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nElementGetSubElements, con(%p)", (RsContext)con);
984c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
985bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    uintptr_t *ids = (uintptr_t *)malloc(dataSize * sizeof(uintptr_t));
986c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    const char **names = (const char **)malloc((uint32_t)dataSize * sizeof(const char *));
987c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t *arraySizes = (uint32_t *)malloc((uint32_t)dataSize * sizeof(uint32_t));
988c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
989bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ElementGetSubElements((RsContext)con, (RsElement)id, ids, names, arraySizes,
990bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (uint32_t)dataSize);
991c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
992bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(uint32_t i = 0; i < dataSize; i++) {
993bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        const jlong id = (jlong)(uintptr_t)ids[i];
994bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        const jint arraySize = (jint)arraySizes[i];
995c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i]));
996bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        _env->SetLongArrayRegion(_IDs, i, 1, &id);
997bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        _env->SetIntArrayRegion(_arraySizes, i, 1, &arraySize);
998c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
999c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1000c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    free(ids);
1001c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    free(names);
1002c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    free(arraySizes);
1003c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1004c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1005c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
1006c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1007bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1008bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid,
1009c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv)
1010c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1011c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)",
1012bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, eid, dimx, dimy, dimz, mips, faces, yuv);
1013c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1014bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)dispatchTab.TypeCreate((RsContext)con, (RsElement)eid, dimx, dimy,
1015bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                    dimz, mips, faces, yuv);
1016c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1017c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1018c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
1019c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1020bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1021bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mips, jint usage,
1022bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                       jlong pointer)
1023c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1024bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)",
1025bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsElement)type, mips, usage, (void *)pointer);
1026bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t) dispatchTab.AllocationCreateTyped((RsContext)con, (RsType)type,
1027bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                (RsAllocationMipmapControl)mips,
1028bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                (uint32_t)usage, (uintptr_t)pointer);
1029c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1030c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1031c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1032bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationSyncAll(JNIEnv *_env, jobject _this, jlong con, jlong a, jint bits)
1033c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1034bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationSyncAll, con(%p), a(%p), bits(0x%08x)", (RsContext)con, (RsAllocation)a, bits);
1035bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationSyncAll((RsContext)con, (RsAllocation)a, (RsAllocationUsageType)bits);
1036c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1037c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1038c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1039bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationSetSurface(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject sur)
1040dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang{
1041bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    ioDispatch.sAllocationSetSurface(_env, _this, (RsContext)con, (RsAllocation)alloc, sur, dispatchTab);
1042dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang}
1043dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang
1044dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wangstatic void
1045bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationIoSend(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1046dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang{
1047bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationIoSend((RsContext)con, (RsAllocation)alloc);
1048dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang}
1049dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang
1050dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wangstatic void
1051bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1052c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1053bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationGenerateMipmaps, con(%p), a(%p)", (RsContext)con, (RsAllocation)alloc);
1054bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationGenerateMipmaps((RsContext)con, (RsAllocation)alloc);
1055c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1056c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1057c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic size_t GetBitmapSize(JNIEnv *env, jobject jbitmap) {
1058c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmapInfo info;
1059c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    memset(&info, 0, sizeof(info));
1060c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_getInfo(env, jbitmap, &info);
1061c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t s = info.width * info.height;
1062c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    switch (info.format) {
1063c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        case ANDROID_BITMAP_FORMAT_RGBA_8888: s *= 4; break;
1064c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        case ANDROID_BITMAP_FORMAT_RGB_565: s *= 2; break;
1065c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        case ANDROID_BITMAP_FORMAT_RGBA_4444: s *= 2; break;
1066c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1067c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return s;
1068c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1069c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1070bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1071bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,
1072bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                            jobject jbitmap, jint usage)
1073c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1074bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = 0;
1075257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    void *pixels = NULL;
1076257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
1077c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1078257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (pixels != NULL) {
1079bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        id = (jlong)(uintptr_t)dispatchTab.AllocationCreateFromBitmap((RsContext)con,
1080bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      (RsType)type,
1081bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      (RsAllocationMipmapControl)mip,
1082bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      pixels,
1083bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      GetBitmapSize(_env, jbitmap),
1084bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      usage);
1085257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        AndroidBitmap_unlockPixels(_env, jbitmap);
1086257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
1087c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
1088c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1089c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1090bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1091bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCreateBitmapBackedAllocation(JNIEnv *_env, jobject _this, jlong con, jlong type,
1092bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                        jint mip, jobject jbitmap, jint usage)
1093c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1094bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = 0;
1095257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    void *pixels = NULL;
1096257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
1097c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1098257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (pixels != NULL) {
1099bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        id = (jlong)(uintptr_t)dispatchTab.AllocationCreateTyped((RsContext)con,
1100bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (RsType)type,
1101bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (RsAllocationMipmapControl)mip,
1102bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (uint32_t)usage,
1103bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (uintptr_t)pixels);
1104257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        AndroidBitmap_unlockPixels(_env, jbitmap);
1105257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
1106c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
1107c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1108c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1109bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1110bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type,
1111bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                jint mip, jobject jbitmap, jint usage)
1112c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1113c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    void *pixels = NULL;
1114c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
1115c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1116bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = 0;
1117c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (pixels != NULL) {
1118bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        id = (jlong)(uintptr_t)dispatchTab.AllocationCubeCreateFromBitmap((RsContext)con,
1119bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          (RsType)type,
1120bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          (RsAllocationMipmapControl)mip,
1121bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          pixels,
1122bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          GetBitmapSize(_env, jbitmap),
1123bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          usage);
1124c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        AndroidBitmap_unlockPixels(_env, jbitmap);
1125c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1126c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
1127c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1128c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1129c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1130bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
1131c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1132c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmapInfo info;
1133c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    memset(&info, 0, sizeof(info));
1134c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_getInfo(_env, jbitmap, &info);
1135c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1136c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    void *pixels = NULL;
1137c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
1138c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1139c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (pixels != NULL) {
1140bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dispatchTab.Allocation2DData((RsContext)con, (RsAllocation)alloc, 0, 0, 0,
1141bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                     RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, info.width,
1142bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                     info.height, pixels, GetBitmapSize(_env, jbitmap), 0);
1143c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        AndroidBitmap_unlockPixels(_env, jbitmap);
1144c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1145c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1146c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1147c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1148bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCopyToBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
1149c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1150c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmapInfo info;
1151c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    memset(&info, 0, sizeof(info));
1152c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_getInfo(_env, jbitmap, &info);
1153c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1154c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    void *pixels = NULL;
1155c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
1156c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1157c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (pixels != NULL) {
1158bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dispatchTab.AllocationCopyToBitmap((RsContext)con, (RsAllocation)alloc, pixels,
1159bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                           GetBitmapSize(_env, jbitmap));
1160c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        AndroidBitmap_unlockPixels(_env, jbitmap);
1161c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1162c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    //bitmap.notifyPixelsChanged();
1163c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1164c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
11658352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Java object data into the Allocation pointed to by _alloc.
1166c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
11678352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
11682e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint count, jobject data, jint sizeBytes, jint dataType, jint mSize,
11692e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jboolean usePadding)
1170c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
11718352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
11728352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation1DData, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
11738352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            "dataType(%i)", (RsContext)con, (RsAllocation)alloc, offset, count, sizeBytes,
11748352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            dataType);
11752e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation1DData, true,
11762e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
1177c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1178c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1179244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
1180c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1181244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationElementData1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint xoff,
1182244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                         jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
1183c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1184c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
1185244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    LOG_API("nAllocationElementData1D, con(%p), alloc(%p), xoff(%i), comp(%i), len(%i), "
1186244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, compIdx, len,
1187244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            sizeBytes);
1188244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1189244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    dispatchTab.Allocation1DElementData((RsContext)con, (RsAllocation)alloc, xoff,
1190244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                                        lod, ptr, sizeBytes, compIdx);
1191c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1192c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1193c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1194244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang/*
1195244b72fe088a6393f37dea49ff89cf9df738a492Miao Wangstatic void
1196244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationElementData(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
1197244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                       jint xoff, jint yoff, jint zoff,
1198244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                       jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
1199244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang{
1200244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    jint len = _env->GetArrayLength(data);
1201244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    LOG_API("nAllocationElementData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
1202244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
1203244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            sizeBytes);
1204244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1205244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    dispatchTab.AllocationElementData((RsContext)con, (RsAllocation)alloc,
1206244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                                      xoff, yoff, zoff,
1207244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                                      lod, ptr, sizeBytes, compIdx);
1208244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1209244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang}
1210244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang*/
1211244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
12128352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Java object data into the Allocation pointed to by _alloc.
1213c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12148352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
12152e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType, jint mSize,
12162e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jboolean usePadding)
1217c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
12188352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
12198352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
12208352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation2DData, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
12218352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
12222e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h;
12232e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation2DData, true,
12242e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
1225c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1226c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1227c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1228bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationData2D_alloc(JNIEnv *_env, jobject _this, jlong con,
1229bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong dstAlloc, jint dstXoff, jint dstYoff,
1230c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint dstMip, jint dstFace,
1231c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint width, jint height,
1232bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong srcAlloc, jint srcXoff, jint srcYoff,
1233c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint srcMip, jint srcFace)
1234c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1235c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nAllocation2DData_s, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
1236c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " dstMip(%i), dstFace(%i), width(%i), height(%i),"
1237c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i), srcFace(%i)",
1238bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
1239c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
1240c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1241bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationCopy2DRange((RsContext)con,
1242bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)dstAlloc,
1243bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      dstXoff, dstYoff,
1244bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      dstMip, dstFace,
1245bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      width, height,
1246bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)srcAlloc,
1247bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      srcXoff, srcYoff,
1248bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      srcMip, srcFace);
1249c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1250c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
12518352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Java object data into the Allocation pointed to by _alloc.
1252c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12538352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
12542e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jint d, jobject data, jint sizeBytes, jint dataType,
12552e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
1256c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
12578352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
12588352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation3DData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
12598352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
12608352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            lod, w, h, d, sizeBytes);
12612e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h * d;
12622e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation3DData, true,
12632e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
1264c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1265c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1266c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1267bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationData3D_alloc(JNIEnv *_env, jobject _this, jlong con,
1268bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong dstAlloc, jint dstXoff, jint dstYoff, jint dstZoff,
1269c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint dstMip,
1270c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint width, jint height, jint depth,
1271bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong srcAlloc, jint srcXoff, jint srcYoff, jint srcZoff,
1272c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint srcMip)
1273c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1274c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nAllocationData3D_alloc, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
1275c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " dstMip(%i), width(%i), height(%i),"
1276c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i)",
1277bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
1278c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
1279c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1280bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationCopy3DRange((RsContext)con,
1281bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)dstAlloc,
1282bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      dstXoff, dstYoff, dstZoff, dstMip,
1283bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      width, height, depth,
1284bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)srcAlloc,
1285bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      srcXoff, srcYoff, srcZoff, srcMip);
1286bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang}
1287bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
12888352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1289bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic void
12902e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao WangnAllocationRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jobject data, jint dataType,
12912e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                jint mSize, jboolean usePadding)
1292bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{
12938352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
12948352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocationRead, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
12952e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = 0;
12962e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(0, dispatchTab.AllocationRead, false,
12972e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, ptr, len * typeBytes);
1298c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1299c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
13008352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1301c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
13028352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationRead1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
13032e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint count, jobject data, jint sizeBytes, jint dataType,
13042e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
1305c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
13068352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
13078352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation1DRead, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
13088352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang              "dataType(%i)", (RsContext)con, alloc, offset, count, sizeBytes, dataType);
13092e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(0, dispatchTab.Allocation1DRead, false,
13102e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
1311c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1312c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1313244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang// Copies from the Element in the Allocation pointed to by _alloc into the Java array data.
1314244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang/*
1315244b72fe088a6393f37dea49ff89cf9df738a492Miao Wangstatic void
1316244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationElementRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc,
1317244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                       jint xoff, jint yoff, jint zoff,
13183bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang                       jint lod, jint compIdx, jobject data, jint sizeBytes)
1319244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang{
13203bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    jint len = _env->GetArrayLength(data);
13213bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    LOG_API("nAllocationElementRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
13223bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang            "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
13233bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang            sizeBytes);
13243bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
13253bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    dispatchTab.AllocationElementRead((RsContext)con, (RsAllocation)alloc,
13263bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang                                      xoff, yoff, zoff,
13273bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang                                      lod, ptr, sizeBytes, compIdx);
13283bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1329244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang}
1330244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang*/
1331244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
13328352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1333c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
13348352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
13352e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType,
13362e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
1337c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
13388352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
13398352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
13408352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation2DRead, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
13418352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang              "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
13422e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h;
13432e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(0, dispatchTab.Allocation2DRead, false,
13442e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
1345c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1346c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1347244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1348244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang/*
1349244b72fe088a6393f37dea49ff89cf9df738a492Miao Wangstatic void
1350244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationRead3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
13512e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jint d, jobject data, int sizeBytes, int dataType,
13522e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
1353244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang{
1354244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
1355244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    LOG_API("nAllocation3DRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
1356244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
1357244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            lod, w, h, d, sizeBytes);
13582e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h * d;
13592e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation3DRead, false,
13602e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
1361244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang}
1362244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang*/
1363244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
1364bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1365bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationGetType(JNIEnv *_env, jobject _this, jlong con, jlong a)
1366c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1367bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationGetType, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
1368bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t) dispatchTab.AllocationGetType((RsContext)con, (RsAllocation)a);
1369c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1370c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1371c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1372bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationResize1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint dimX)
1373c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1374bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", (RsContext)con,
1375bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsAllocation)alloc, dimX);
1376bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationResize1D((RsContext)con, (RsAllocation)alloc, dimX);
1377c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1378c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1379c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
1380c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1381c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
13826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptBindAllocation(JNIEnv *_env, jobject _this, jlong con, jlong script, jlong alloc, jint slot, jboolean mUseInc)
1383c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1384bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)",
1385bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
13866f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
13876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
13886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
13896f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
13906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1391c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1392c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1393c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
13946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jint val, jboolean mUseInc)
1395c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1396bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con,
1397bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
13986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
13996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarI((RsContext)con, (RsScript)script, slot, val);
14006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
14016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarI((RsContext)con, (RsScript)script, slot, val);
14026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1403c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1404c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1405c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
14066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarObj(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val, jboolean mUseInc)
1407c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1408bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con,
1409bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
14106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val);
14126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
14136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val);
14146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1415c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1416c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1417c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
14186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val, jboolean mUseInc)
1419c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1420bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%lli)", (RsContext)con,
1421bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
14226f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarJ((RsContext)con, (RsScript)script, slot, val);
14246f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
14256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarJ((RsContext)con, (RsScript)script, slot, val);
14266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1427c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1428c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1429c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
14306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, float val, jboolean mUseInc)
1431c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1432bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", (RsContext)con,
1433bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
14346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarF((RsContext)con, (RsScript)script, slot, val);
14366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
14376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarF((RsContext)con, (RsScript)script, slot, val);
14386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1439c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1440c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1441c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
14426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, double val, jboolean mUseInc)
1443c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1444bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", (RsContext)con,
1445bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
14466f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarD((RsContext)con, (RsScript)script, slot, val);
1448d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni    } else {
14496f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarD((RsContext)con, (RsScript)script, slot, val);
14506f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1451c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1452c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1453c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
14546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data, jboolean mUseInc)
1455c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1456bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1457c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
1458c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
14596f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14606f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
14616f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
14626f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
14636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1464c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1465c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1466c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1467c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1468bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptSetVarVE(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data,
14696f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                jlong elem, jintArray dims, jboolean mUseInc)
1470c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1471bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarVE, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1472c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
1473c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
1474c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint dimsLen = _env->GetArrayLength(dims) * sizeof(int);
1475c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *dimsPtr = _env->GetIntArrayElements(dims, NULL);
14766f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14776f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem,
14786f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                      (const uint32_t *)dimsPtr, dimsLen);
14796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
14806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem,
14816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                   (const uint32_t *)dimsPtr, dimsLen);
14826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1483c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1484c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseIntArrayElements(dims, dimsPtr, JNI_ABORT);
1485c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1486c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1487c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1488c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
14896f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetTimeZone(JNIEnv *_env, jobject _this, jlong con, jlong script, jbyteArray timeZone, jboolean mUseInc)
1490c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1491bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptCSetTimeZone, con(%p), s(%p), timeZone(%s)", (RsContext)con,
1492bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, (const char *)timeZone);
1493c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1494c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint length = _env->GetArrayLength(timeZone);
1495c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte* timeZone_ptr;
1496c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0);
14976f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length);
14996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
15006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length);
15016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1502c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1503c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (timeZone_ptr) {
1504c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0);
1505c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1506c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1507c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1508c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
15096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptInvoke(JNIEnv *_env, jobject _this, jlong con, jlong obj, jint slot, jboolean mUseInc)
1510c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1511bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptInvoke, con(%p), script(%p)", (RsContext)con, (void *)obj);
15126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
15136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptInvoke((RsContext)con, (RsScript)obj, slot);
15146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
15156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptInvoke((RsContext)con, (RsScript)obj, slot);
15166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1517c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1518c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1519c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
15206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptInvokeV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data, jboolean mUseInc)
1521c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1522bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptInvokeV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1523c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
1524c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
15256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
15266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len);
15276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
15286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len);
15296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1530c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1531c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1532c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1533c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
15346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEach(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
15356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang               jlong script, jint slot, jlong ain, jlong aout, jboolean mUseInc)
1536c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1537bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
15386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
15396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
15406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
15416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
15426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     NULL, 0, NULL, 0);
15436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
15446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
15456f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
15466f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  NULL, 0, NULL, 0);
15476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1548c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
15495154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
1550c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
15516f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEachV(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
15526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                jlong script, jint slot, jlong ain, jlong aout, jbyteArray params, jboolean mUseInc)
1553c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1554bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1555c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(params);
1556c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(params, NULL);
15576f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
15586f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
15596f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
15606f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
15616f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     ptr, len, NULL, 0);
15626f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
15636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
15646f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
15656f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  ptr, len, NULL, 0);
15666f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1567c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT);
1568c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1569c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1570c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
15716f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEachClipped(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
1572bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                      jlong script, jint slot, jlong ain, jlong aout,
1573c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                      jint xstart, jint xend,
15746f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                      jint ystart, jint yend, jint zstart, jint zend, jboolean mUseInc)
1575c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1576bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEachClipped, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1577c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    RsScriptCall sc;
1578c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xStart = xstart;
1579c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xEnd = xend;
1580c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yStart = ystart;
1581c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yEnd = yend;
1582c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zStart = zstart;
1583c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zEnd = zend;
1584c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
1585c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayStart = 0;
1586c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayEnd = 0;
15876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
15886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
15896f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
15906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
15916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     NULL, 0, &sc, sizeof(sc));
15926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
15936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
15946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
15956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  NULL, 0, &sc, sizeof(sc));
15966f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1597c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1598c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1599c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
16006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEachClippedV(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
1601bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                       jlong script, jint slot, jlong ain, jlong aout,
1602c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                       jbyteArray params, jint xstart, jint xend,
16036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                       jint ystart, jint yend, jint zstart, jint zend, jboolean mUseInc)
1604c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1605bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEachClipped, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1606c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(params);
1607c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(params, NULL);
1608c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    RsScriptCall sc;
1609c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xStart = xstart;
1610c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xEnd = xend;
1611c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yStart = ystart;
1612c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yEnd = yend;
1613c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zStart = zstart;
1614c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zEnd = zend;
1615c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
1616c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayStart = 0;
1617c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayEnd = 0;
16186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
16196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
16206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
16216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
16226f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     ptr, len, &sc, sizeof(sc));
16236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
16246f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
16256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
16266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  ptr, len, &sc, sizeof(sc));
16276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1628c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT);
1629c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1630c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
163189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wangstatic void
163289b58238694d7d1eebaac0aa59b0bdd67a779582Miao WangnScriptForEachMulti(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
163389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                    jlongArray ains, jlong aout, jbyteArray params,
163489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                    jintArray limits)
163589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang{
163689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    LOG_API("nScriptForEach, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
163789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
163889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    jint   in_len = 0;
163989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    jlong *in_ptr = nullptr;
164089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
164189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    RsAllocation *in_allocs = nullptr;
164289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
164389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    if (ains != nullptr) {
164489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        in_len = _env->GetArrayLength(ains);
164589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        if (in_len > (jint)RS_KERNEL_MAX_ARGUMENTS) {
164689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            LOG_API("Too many arguments in kernel launch.");
164789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            // TODO (b/20758983): Report back to Java and throw an exception
164889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            return;
164989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        }
165089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
165189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        // TODO (b/20760800): Check in_ptr is not null
165289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        in_ptr = _env->GetLongArrayElements(ains, nullptr);
165389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        if (sizeof(RsAllocation) == sizeof(jlong)) {
165489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            in_allocs = (RsAllocation*)in_ptr;
165589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
165689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        } else {
165789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            // Convert from 64-bit jlong types to the native pointer type.
165889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
165989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            in_allocs = (RsAllocation*)alloca(in_len * sizeof(RsAllocation));
166089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            if (in_allocs == nullptr) {
166189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                LOG_API("Failed launching kernel for lack of memory.");
166289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
166389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                return;
166489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            }
166589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
166689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            for (int index = in_len; --index >= 0;) {
166789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                in_allocs[index] = (RsAllocation)in_ptr[index];
166889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            }
166989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        }
167089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    }
167189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
167289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    jint   param_len = 0;
167389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    jbyte *param_ptr = nullptr;
167489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
167589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    if (params != nullptr) {
167689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        param_len = _env->GetArrayLength(params);
167789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        param_ptr = _env->GetByteArrayElements(params, nullptr);
167889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    }
167989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
168089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    RsScriptCall sc, *sca = nullptr;
168189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    uint32_t sc_size = 0;
168289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
168389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    jint  limit_len = 0;
168489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    jint *limit_ptr = nullptr;
168589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
168689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    if (limits != nullptr) {
168789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        limit_len = _env->GetArrayLength(limits);
168889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        limit_ptr = _env->GetIntArrayElements(limits, nullptr);
168989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
169089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        if (limit_len != 6) {
169189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            LOG_API("LaunchOptions cannot be recognized.");
169289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            goto exit;
169389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        }
169489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
169589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.xStart     = limit_ptr[0];
169689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.xEnd       = limit_ptr[1];
169789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.yStart     = limit_ptr[2];
169889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.yEnd       = limit_ptr[3];
169989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.zStart     = limit_ptr[4];
170089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.zEnd       = limit_ptr[5];
170189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.strategy   = RS_FOR_EACH_STRATEGY_DONT_CARE;
170289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.arrayStart = 0;
170389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.arrayEnd = 0;
170489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.array2Start = 0;
170589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.array2End = 0;
170689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.array3Start = 0;
170789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.array3End = 0;
170889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.array4Start = 0;
170989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sc.array4End = 0;
171089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
171189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        sca = &sc;
171289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    }
171389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
171489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    dispatchTabInc.ScriptForEachMulti((RsContext)con, (RsScript)script, slot,
171589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                                      in_allocs, in_len, (RsAllocation)aout,
171689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                                      param_ptr, param_len, sca, sc_size);
171789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
171889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wangexit:
171989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
172089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    if (ains != nullptr) {
172189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
172289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    }
172389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
172489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    if (params != nullptr) {
172589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        _env->ReleaseByteArrayElements(params, param_ptr, JNI_ABORT);
172689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    }
172789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
172889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    if (limits != nullptr) {
172989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
173089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    }
173189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang}
173289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
17335154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Walastatic void
17345154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt WalanScriptReduce(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
17355154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala              jlong ain, jlong aout, jintArray limits)
17365154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala{
17375154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    LOG_API("nScriptReduce, con(%p), s(%p), slot(%i) ain(%" PRId64 ") aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ain, aout);
17385154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
17395154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    RsScriptCall sc, *sca = nullptr;
17405154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    uint32_t sc_size = 0;
17415154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
17425154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    jint  limit_len = 0;
17435154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    jint *limit_ptr = nullptr;
17445154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
17455154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    bool limitLengthValid = true;
17465154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
17475154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    // If the caller passed limits, reflect them in the RsScriptCall.
17485154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    if (limits != nullptr) {
17495154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala        limit_len = _env->GetArrayLength(limits);
17505154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala        limit_ptr = _env->GetIntArrayElements(limits, nullptr);
17515154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
17525154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala        // We expect to be passed an array [x1, x2] which specifies
17535154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala        // the sub-range for a 1-dimensional reduction.
17545154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala        if (limit_len == 2) {
17555154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.xStart     = limit_ptr[0];
17565154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.xEnd       = limit_ptr[1];
17575154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.yStart     = 0;
17585154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.yEnd       = 0;
17595154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.zStart     = 0;
17605154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.zEnd       = 0;
17615154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.strategy   = RS_FOR_EACH_STRATEGY_DONT_CARE;
17625154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.arrayStart = 0;
17635154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.arrayEnd = 0;
17645154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.array2Start = 0;
17655154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.array2End = 0;
17665154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.array3Start = 0;
17675154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.array3End = 0;
17685154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.array4Start = 0;
17695154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc.array4End = 0;
17705154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
17715154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sca = &sc;
17725154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            sc_size = sizeof(sc);
17735154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala        } else {
17745154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            LOG_API("LaunchOptions cannot be recognized.");
17755154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala            limitLengthValid = false;
17765154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala        }
17775154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    }
17785154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
17795154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    if (limitLengthValid) {
17805154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala        dispatchTab.ScriptReduce((RsContext)con, (RsScript)script, slot,
17815154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala                                 (RsAllocation)ain, (RsAllocation)aout,
17825154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala                                 sca, sc_size);
17835154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    }
17845154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
17855154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    if (limits != nullptr) {
17865154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala        _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
17875154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala    }
17885154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala}
17895154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala
1790c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
1791c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1792bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1793bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptCCreate(JNIEnv *_env, jobject _this, jlong con,
1794c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main               jstring resName, jstring cacheDir,
1795c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main               jbyteArray scriptRef, jint length)
1796c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1797bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptCCreate, con(%p)", (RsContext)con);
1798c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1799c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringToUTF8 resNameUTF(_env, resName);
1800c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
1801bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong ret = 0;
1802c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte* script_ptr = NULL;
1803c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint _exception = 0;
1804c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint remaining;
1805c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (!scriptRef) {
1806c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _exception = 1;
1807c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null");
1808c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto exit;
1809c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1810c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (length < 0) {
1811c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _exception = 1;
1812c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0");
1813c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto exit;
1814c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1815c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    remaining = _env->GetArrayLength(scriptRef);
1816c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (remaining < length) {
1817c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _exception = 1;
1818c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //jniThrowException(_env, "java/lang/IllegalArgumentException",
1819c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //        "length > script.length - offset");
1820c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto exit;
1821c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1822c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    script_ptr = (jbyte *)
1823c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0);
1824c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1825c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    //rsScriptCSetText(con, (const char *)script_ptr, length);
1826c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1827bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    ret = (jlong)(uintptr_t)dispatchTab.ScriptCCreate((RsContext)con,
1828bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                      resNameUTF.c_str(), resNameUTF.length(),
1829bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                      cacheDirUTF.c_str(), cacheDirUTF.length(),
1830bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                      (const char *)script_ptr, length);
1831c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1832c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainexit:
1833c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (script_ptr) {
1834c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr,
1835c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                _exception ? JNI_ABORT: 0);
1836c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1837c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1838bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)ret;
1839c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1840c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1841bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
18426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptIntrinsicCreate(JNIEnv *_env, jobject _this, jlong con, jint id, jlong eid, jboolean mUseInc)
1843c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1844bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptIntrinsicCreate, con(%p) id(%i) element(%p)", (RsContext)con, id, (void *)eid);
18456f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
18466f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTabInc.ScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
18476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
18486f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTab.ScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
18496f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1850c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1851c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1852bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
18536f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptKernelIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jint sig, jboolean mUseInc)
1854c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1855bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptKernelIDCreate, con(%p) script(%p), slot(%i), sig(%i)", (RsContext)con,
1856bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)sid, slot, sig);
18576f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
18586f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTabInc.ScriptKernelIDCreate((RsContext)con, (RsScript)sid,
1859d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni                                                                     slot, sig);
18606f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
18616f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTab.ScriptKernelIDCreate((RsContext)con, (RsScript)sid,
18626f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                                  slot, sig);
18636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1864c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1865c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1866bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1867086010500c28e2bca57ea583d3f38da9a2f2f414Yang NinScriptInvokeIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
1868086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni{
1869086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    LOG_API("nScriptInvokeIDCreate, con(%p) script(%p), slot(%i), sig(%i)", con,
1870086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni            (void *)sid, slot);
1871086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    return (jlong)dispatchTab.ScriptInvokeIDCreate((RsContext)con, (RsScript)sid, slot);
1872086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni}
1873086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni
1874086010500c28e2bca57ea583d3f38da9a2f2f414Yang Nistatic jlong
18756f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptFieldIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jboolean mUseInc)
1876c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1877bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptFieldIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con, (void *)sid, slot);
18786f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
18796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTabInc.ScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
18806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
18816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTab.ScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
18826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1883c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1884c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1885bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1886bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _kernels, jlongArray _src,
1887bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlongArray _dstk, jlongArray _dstf, jlongArray _types)
1888bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{
1889bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupCreate, con(%p)", (RsContext)con);
1890bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1891bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint kernelsLen = _env->GetArrayLength(_kernels);
1892bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jKernelsPtr = _env->GetLongArrayElements(_kernels, nullptr);
1893bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsScriptKernelID* kernelsPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * kernelsLen);
1894bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < kernelsLen; ++i) {
1895bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        kernelsPtr[i] = (RsScriptKernelID)jKernelsPtr[i];
1896bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1897bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1898bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint srcLen = _env->GetArrayLength(_src);
1899bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jSrcPtr = _env->GetLongArrayElements(_src, nullptr);
1900bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsScriptKernelID* srcPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * srcLen);
1901bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < srcLen; ++i) {
1902bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        srcPtr[i] = (RsScriptKernelID)jSrcPtr[i];
1903bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1904bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1905bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint dstkLen = _env->GetArrayLength(_dstk);
1906bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jDstkPtr = _env->GetLongArrayElements(_dstk, nullptr);
1907bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsScriptKernelID* dstkPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstkLen);
1908bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < dstkLen; ++i) {
1909bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dstkPtr[i] = (RsScriptKernelID)jDstkPtr[i];
1910bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1911bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1912bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint dstfLen = _env->GetArrayLength(_dstf);
1913bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jDstfPtr = _env->GetLongArrayElements(_dstf, nullptr);
1914bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsScriptKernelID* dstfPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstfLen);
1915bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < dstfLen; ++i) {
1916bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dstfPtr[i] = (RsScriptKernelID)jDstfPtr[i];
1917bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1918bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1919bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint typesLen = _env->GetArrayLength(_types);
1920bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jTypesPtr = _env->GetLongArrayElements(_types, nullptr);
1921bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsType* typesPtr = (RsType*) malloc(sizeof(RsType) * typesLen);
1922bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < typesLen; ++i) {
1923bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        typesPtr[i] = (RsType)jTypesPtr[i];
1924bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1925bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1926bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = (jlong)(uintptr_t) dispatchTab.ScriptGroupCreate((RsContext)con,
1927bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptKernelID *)kernelsPtr, kernelsLen * sizeof(RsScriptKernelID),
1928bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptKernelID *)srcPtr, srcLen * sizeof(RsScriptKernelID),
1929bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptKernelID *)dstkPtr, dstkLen * sizeof(RsScriptKernelID),
1930bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptFieldID *)dstfPtr, dstfLen * sizeof(RsScriptKernelID),
1931bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsType *)typesPtr, typesLen * sizeof(RsType));
1932bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1933bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(kernelsPtr);
1934bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(srcPtr);
1935bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(dstkPtr);
1936bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(dstfPtr);
1937bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(typesPtr);
1938bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_kernels, jKernelsPtr, 0);
1939bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_src, jSrcPtr, 0);
1940bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_dstk, jDstkPtr, 0);
1941bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_dstf, jDstfPtr, 0);
1942bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_types, jTypesPtr, 0);
1943c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
1944c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1945c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1946c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1947bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupSetInput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
1948c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1949bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupSetInput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
1950bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)gid, (void *)kid, (void *)alloc);
1951bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ScriptGroupSetInput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid,
1952bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                    (RsAllocation)alloc);
1953c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1954c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1955c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1956bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupSetOutput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
1957c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1958bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupSetOutput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
1959bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)gid, (void *)kid, (void *)alloc);
1960bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ScriptGroupSetOutput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid,
1961bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                     (RsAllocation)alloc);
1962c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1963c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1964c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1965bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupExecute(JNIEnv *_env, jobject _this, jlong con, jlong gid)
1966c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1967bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupSetOutput, con(%p) group(%p)", (RsContext)con, (void *)gid);
1968bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ScriptGroupExecute((RsContext)con, (RsScriptGroup)gid);
1969c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1970c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1971c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// ---------------------------------------------------------------------------
1972c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1973bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1974bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnSamplerCreate(JNIEnv *_env, jobject _this, jlong con, jint magFilter, jint minFilter,
1975c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main               jint wrapS, jint wrapT, jint wrapR, jfloat aniso)
1976c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1977bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nSamplerCreate, con(%p)", (RsContext)con);
1978bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)dispatchTab.SamplerCreate((RsContext)con,
1979bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)magFilter,
1980bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)minFilter,
1981bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)wrapS,
1982bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)wrapT,
1983bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)wrapR,
1984bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       aniso);
1985bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang}
1986bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1987bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jint
1988bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnSystemGetPointerSize(JNIEnv *_env, jobject _this) {
1989bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jint)sizeof(void*);
1990c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1991c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
19926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// ---------------------------------------------------------------------------
19936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// For Incremental Intrinsic Support
19948919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wangstatic jboolean nIncLoadSO(JNIEnv *_env, jobject _this, jint deviceApi) {
19956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    void* handle = NULL;
19966f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    handle = dlopen("libRSSupport.so", RTLD_LAZY | RTLD_LOCAL);
19976f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (handle == NULL) {
19986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        LOG_API("couldn't dlopen %s, %s", filename, dlerror());
19996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return false;
20006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
20016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
2002e27a340e3a55a3650e1f74bf1d350104596c4d4bMiao Wang    if (loadSymbols(handle, dispatchTabInc, deviceApi) == false) {
20036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        LOG_API("%s init failed!", filename);
20046f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return false;
20056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
200694ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang    dispatchTabInc.AllocationCreateStrided = (AllocationCreateStridedFnPtr)dlsym(handle, "rsAllocationCreateStrided");
200794ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang    if (dispatchTabInc.AllocationCreateStrided == NULL) {
200894ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang        LOG_API("Couldn't initialize dispatchTabInc.AllocationCreateStrided");
200994ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang        return false;
201094ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang    }
20116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("Successfully loaded %s", filename);
20126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return true;
20136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
20146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
20156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
20166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// To create/destroy a dummy context
20176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
20186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj)
20196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
20206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj);
20216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    dispatchTabInc.ObjDestroy((RsContext)con, (void *)obj);
20226f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
20236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
20246f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
20256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
20266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncDeviceCreate(JNIEnv *_env, jobject _this)
20276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
20286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nDeviceCreate");
20296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.DeviceCreate();
20306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
20316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
20326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
20336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev)
20346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
20356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nDeviceDestroy");
20366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return dispatchTabInc.DeviceDestroy((RsDevice)dev);
20376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
20386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
20396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
20406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer, jint ct)
20416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
20426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nContextCreate");
20436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    //The compat context for incremental support will be synchronous.
20446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.ContextCreate((RsDevice)dev, ver, sdkVer,
20456f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                          (RsContextType)ct,
20466f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                          RS_CONTEXT_SYNCHRONOUS);
20476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
20486f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
20496f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
20506f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncContextFinish(JNIEnv *_env, jobject _this, jlong con)
20516f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
20526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nContextFinish, con(%p)", (RsContext)con);
20536f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    dispatchTabInc.ContextFinish((RsContext)con);
20546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
20556f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
20566f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
20576f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncContextDestroy(JNIEnv *_env, jobject _this, jlong con)
20586f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
20596f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nContextDestroy, con(%p)", (RsContext)con);
20606f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    dispatchTabInc.ContextDestroy((RsContext)con);
20616f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
20626f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
20636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
20646f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Create dummy Element
20656f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
20666f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind, jboolean norm, jint size)
20676f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
20686f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nElementCreate, con(%p), type(%i), kind(%i), norm(%i), size(%i)", (RsContext)con,
20696f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            type, kind, norm, size);
20706f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.ElementCreate((RsContext)con, (RsDataType)type,
20716f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                          (RsDataKind)kind, norm, size);
20726f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
20736f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
20746f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Create dummy Type
20756f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
20766f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid,
20776f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv)
20786f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
20796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)",
20806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            incCon, eid, dimx, dimy, dimz, mips, faces, yuv);
20816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
20826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.TypeCreate((RsContext)con, (RsElement)eid, dimx, dimy,
20836f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                       dimz, mips, faces, yuv);
20846f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
20856f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
20866f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
20876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Create Allocation from pointer
20886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
208994ded3567e0f2a567887e5d8ab896634da855a2eMiao WangnIncAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong alloc, jlong type, jint xBytesSize)
20906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
20916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)",
20926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            incCon, (RsElement)type, mips, usage, (void *)pointer);
20936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    size_t strideIn;
20946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    void* pIn = NULL;
20956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    RsAllocation ainI = NULL;
20966f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (alloc != 0) {
20976f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        pIn = dispatchTab.AllocationGetPointer((RsContext)con, (RsAllocation)alloc, 0,
20986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                               RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 0, 0,
20996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                               &strideIn, sizeof(size_t));
210094ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang        /*
210194ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         * By definition stride is a roundup of xBytesSize with requiredAlignment, so requiredAlignment must
210294ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         * be strictly larger than the difference of (stride - xBytesSize).
210394ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         *
210494ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         * We can prove that as long as requiredAlignment satisfies the following two conditions, the
210594ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         * memory layout will be identical :
210694ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         * 1. Smaller or equal than stride;
210794ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         * 2. Larger than minRequiredAlignment.
210894ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         *
210994ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         * In this case we can simply choose the first power of 2 that satisfies both conditions.
211094ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang         */
211194ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang        size_t requiredAlignment = 16;
211294ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang        size_t minRequiredAlignment = strideIn - xBytesSize;
211394ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang        while (requiredAlignment <= minRequiredAlignment) {
211494ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang            requiredAlignment <<= 1;
211594ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang        }
211694ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang        ainI = dispatchTabInc.AllocationCreateStrided((RsContext)incCon, (RsType)type,
211794ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang                                                      RS_ALLOCATION_MIPMAP_NONE,
211894ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang                                                      RS_ALLOCATION_USAGE_INCREMENTAL_SUPPORT | RS_ALLOCATION_USAGE_SHARED,
211994ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang                                                      (uintptr_t)pIn, requiredAlignment);
21206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
21216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t) ainI;
21226f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
2123c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
21242e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang// ---------------------------------------------------------------------------
2125c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2126bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2127c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic const char *classPathName = "android/support/v8/renderscript/RenderScript";
2128c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2129c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic JNINativeMethod methods[] = {
21307c0de6383be18a1dae1297c54c56f3d9afbeaaadMiao Wang{"nLoadSO",                        "(ZI)Z",                                   (bool*)nLoadSO },
2131dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang{"nLoadIOSO",                      "()Z",                                     (bool*)nLoadIOSO },
2132bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nDeviceCreate",                  "()J",                                     (void*)nDeviceCreate },
2133bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nDeviceDestroy",                 "(J)V",                                    (void*)nDeviceDestroy },
2134bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nDeviceSetConfig",               "(JII)V",                                  (void*)nDeviceSetConfig },
2135bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextGetUserMessage",         "(J[I)I",                                  (void*)nContextGetUserMessage },
2136bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextGetErrorMessage",        "(J)Ljava/lang/String;",                   (void*)nContextGetErrorMessage },
2137bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextPeekMessage",            "(J[I)I",                                  (void*)nContextPeekMessage },
2138bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextInitToClient",           "(J)V",                                    (void*)nContextInitToClient },
2139bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextDeinitToClient",         "(J)V",                                    (void*)nContextDeinitToClient },
2140c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2141c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2142c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// All methods below are thread protected in java.
2143ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang{"rsnContextCreate",                 "(JIIILjava/lang/String;)J",             (void*)nContextCreate },
2144bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextFinish",                 "(J)V",                                  (void*)nContextFinish },
2145bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextSetPriority",            "(JI)V",                                 (void*)nContextSetPriority },
2146bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextDestroy",                "(J)V",                                  (void*)nContextDestroy },
2147bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextDump",                   "(JI)V",                                 (void*)nContextDump },
2148bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextSendMessage",            "(JI[I)V",                               (void*)nContextSendMessage },
2149b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnClosureCreate",                 "(JJJ[J[J[I[J[J)J",                      (void*)nClosureCreate },
2150b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnInvokeClosureCreate",           "(JJ[B[J[J[I)J",                         (void*)nInvokeClosureCreate },
2151b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnClosureSetArg",                 "(JJIJI)V",                              (void*)nClosureSetArg },
2152b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnClosureSetGlobal",              "(JJJJI)V",                              (void*)nClosureSetGlobal },
2153bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnObjDestroy",                    "(JJ)V",                                 (void*)nObjDestroy },
2154bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2155bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnElementCreate",                 "(JJIZI)J",                              (void*)nElementCreate },
2156bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnElementCreate2",                "(J[J[Ljava/lang/String;[I)J",           (void*)nElementCreate2 },
2157bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnElementGetSubElements",         "(JJ[J[Ljava/lang/String;[I)V",          (void*)nElementGetSubElements },
2158bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2159bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnTypeCreate",                    "(JJIIIZZI)J",                           (void*)nTypeCreate },
2160bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2161bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCreateTyped",         "(JJIIJ)J",                              (void*)nAllocationCreateTyped },
2162bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCreateFromBitmap",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateFromBitmap },
2163bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCreateBitmapBackedAllocation",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateBitmapBackedAllocation },
2164bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCubeCreateFromBitmap","(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCubeCreateFromBitmap },
2165bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2166bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCopyFromBitmap",      "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyFromBitmap },
2167bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCopyToBitmap",        "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyToBitmap },
2168bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2169bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationSyncAll",             "(JJI)V",                                (void*)nAllocationSyncAll },
2170bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationSetSurface",          "(JJLandroid/view/Surface;)V",           (void*)nAllocationSetSurface },
2171bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationIoSend",              "(JJ)V",                                 (void*)nAllocationIoSend },
21722e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationData1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationData1D },
2173bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationElementData1D",       "(JJIII[BI)V",                           (void*)nAllocationElementData1D },
2174244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang//{"rsnAllocationElementData",         "(JJIIIII[BI)V",                         (void*)nAllocationElementData },
21752e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationData2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationData2D },
2176bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationData2D",              "(JJIIIIIIJIIII)V",                      (void*)nAllocationData2D_alloc },
21772e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationData3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",    (void*)nAllocationData3D },
2178bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationData3D",              "(JJIIIIIIIJIIII)V",                     (void*)nAllocationData3D_alloc },
21792e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationRead",                "(JJLjava/lang/Object;IIZ)V",            (void*)nAllocationRead },
21802e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationRead1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationRead1D },
21813bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang//{"rsnAllocationElementRead",         "(JJIIIII[BI)V",                         (void*)nAllocationElementRead },
21822e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationRead2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationRead2D },
21832e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang//{"rsnAllocationRead3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",  (void*)nAllocationRead3D },
2184bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationGetType",             "(JJ)J",                                 (void*)nAllocationGetType},
2185bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationResize1D",            "(JJI)V",                                (void*)nAllocationResize1D },
2186bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationGenerateMipmaps",     "(JJ)V",                                 (void*)nAllocationGenerateMipmaps },
2187bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
21886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptBindAllocation",          "(JJJIZ)V",                              (void*)nScriptBindAllocation },
21896f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetTimeZone",             "(JJ[BZ)V",                              (void*)nScriptSetTimeZone },
21906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptInvoke",                  "(JJIZ)V",                               (void*)nScriptInvoke },
21916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptInvokeV",                 "(JJI[BZ)V",                             (void*)nScriptInvokeV },
21926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEach",                 "(JJJIJJZ)V",                            (void*)nScriptForEach },
21936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEach",                 "(JJJIJJ[BZ)V",                          (void*)nScriptForEachV },
219489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang{"rsnScriptForEach",                 "(JJI[JJ[B[I)V",                         (void*)nScriptForEachMulti },
21956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEachClipped",          "(JJJIJJIIIIIIZ)V",                      (void*)nScriptForEachClipped },
21966f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEachClipped",          "(JJJIJJ[BIIIIIIZ)V",                    (void*)nScriptForEachClippedV },
21975154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala{"rsnScriptReduce",                  "(JJIJJ[I)V",                            (void*)nScriptReduce },
21986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarI",                 "(JJIIZ)V",                              (void*)nScriptSetVarI },
21996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarJ",                 "(JJIJZ)V",                              (void*)nScriptSetVarJ },
22006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarF",                 "(JJIFZ)V",                              (void*)nScriptSetVarF },
22016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarD",                 "(JJIDZ)V",                              (void*)nScriptSetVarD },
22026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarV",                 "(JJI[BZ)V",                             (void*)nScriptSetVarV },
22036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarVE",                "(JJI[BJ[IZ)V",                          (void*)nScriptSetVarVE },
22046f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarObj",               "(JJIJZ)V",                              (void*)nScriptSetVarObj },
2205bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
2206bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptCCreate",                 "(JLjava/lang/String;Ljava/lang/String;[BI)J",  (void*)nScriptCCreate },
22076f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptIntrinsicCreate",         "(JIJZ)J",                               (void*)nScriptIntrinsicCreate },
22086f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptKernelIDCreate",          "(JJIIZ)J",                              (void*)nScriptKernelIDCreate },
2209086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni{"rsnScriptInvokeIDCreate",          "(JJI)J",                                (void*)nScriptInvokeIDCreate },
22106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptFieldIDCreate",           "(JJIZ)J",                               (void*)nScriptFieldIDCreate },
2211bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupCreate",             "(J[J[J[J[J[J)J",                        (void*)nScriptGroupCreate },
2212e68c5973af1e80c77cab9aea0b77f46a801aef96Yang Ni{"rsnScriptGroup2Create",            "(JLjava/lang/String;Ljava/lang/String;[J)J", (void*)nScriptGroup2Create },
2213bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupSetInput",           "(JJJJ)V",                               (void*)nScriptGroupSetInput },
2214bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupSetOutput",          "(JJJJ)V",                               (void*)nScriptGroupSetOutput },
2215bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupExecute",            "(JJ)V",                                 (void*)nScriptGroupExecute },
2216b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnScriptGroup2Execute",           "(JJ)V",                                 (void*)nScriptGroup2Execute },
2217bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
22188919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang{"rsnScriptIntrinsicBLAS_Single",    "(JJJIIIIIIIIIFJJFJIIIIZ)V",             (void*)nScriptIntrinsicBLAS_Single },
22198919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang{"rsnScriptIntrinsicBLAS_Double",    "(JJJIIIIIIIIIDJJDJIIIIZ)V",             (void*)nScriptIntrinsicBLAS_Double },
22208919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang{"rsnScriptIntrinsicBLAS_Complex",   "(JJJIIIIIIIIIFFJJFFJIIIIZ)V",           (void*)nScriptIntrinsicBLAS_Complex },
22218919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang{"rsnScriptIntrinsicBLAS_Z",         "(JJJIIIIIIIIIDDJJDDJIIIIZ)V",           (void*)nScriptIntrinsicBLAS_Z },
22228919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
22238919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang{"rsnScriptIntrinsicBLAS_BNNM",      "(JJJIIIJIJIJIIZ)V",                     (void*)nScriptIntrinsicBLAS_BNNM },
22248919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
2225bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnSamplerCreate",                 "(JIIIIIF)J",                            (void*)nSamplerCreate },
2226c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2227bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnSystemGetPointerSize",          "()I",                                   (void*)nSystemGetPointerSize },
22286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
22296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Entry points for Inc libRSSupport
2230e27a340e3a55a3650e1f74bf1d350104596c4d4bMiao Wang{"nIncLoadSO",                       "(I)Z",                                  (bool*)nIncLoadSO },
22316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"nIncDeviceCreate",                 "()J",                                   (void*)nIncDeviceCreate },
22326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"nIncDeviceDestroy",                "(J)V",                                  (void*)nIncDeviceDestroy },
22336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncContextCreate",              "(JIII)J",                               (void*)nIncContextCreate },
22346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncContextFinish",              "(J)V",                                  (void*)nIncContextFinish },
22356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncContextDestroy",             "(J)V",                                  (void*)nIncContextDestroy },
22366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncObjDestroy",                 "(JJ)V",                                 (void*)nIncObjDestroy },
22376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncElementCreate",              "(JJIZI)J",                              (void*)nIncElementCreate },
22386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncTypeCreate",                 "(JJIIIZZI)J",                           (void*)nIncTypeCreate },
223994ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang{"rsnIncAllocationCreateTyped",      "(JJJJI)J",                              (void*)nIncAllocationCreateTyped },
2240c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main};
2241c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2242c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// ---------------------------------------------------------------------------
2243c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2244c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainjint JNI_OnLoad(JavaVM* vm, void* reserved)
2245c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
2246c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    JNIEnv* env = NULL;
2247257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    jclass clazz = NULL;
2248c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint result = -1;
2249c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2250c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
2251184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
2252184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "ERROR: GetEnv failed\n");
2253257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        goto bail;
2254257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
2255257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (env == NULL) {
2256184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "ERROR: env == NULL");
2257257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        goto bail;
2258257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
2259257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines
2260257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    clazz = env->FindClass(classPathName);
2261257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (clazz == NULL) {
2262c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto bail;
2263c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
2264c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2265257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (env->RegisterNatives(clazz, methods, NELEM(methods)) < 0) {
2266184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
2267184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "ERROR: MediaPlayer native registration failed\n");
2268c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto bail;
2269c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
2270c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2271c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    /* success -- return valid version number */
2272c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    result = JNI_VERSION_1_4;
2273c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
2274c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainbail:
2275c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return result;
2276c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
2277