android_renderscript_RenderScript.cpp revision b1c365bfb0566142c49375f09f2b8289182f1f47
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
2727c0de6383be18a1dae1297c54c56f3d9afbeaaadMiao Wangstatic jboolean nLoadSO(JNIEnv *_env, jobject _this, jboolean useNative, jint deviceApi) {
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
2847c0de6383be18a1dae1297c54c56f3d9afbeaaadMiao Wang    if (loadSymbols(handle, dispatchTab, deviceApi) == 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) {
348936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
349936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
350936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  RsScriptFieldID* fieldIDs =
351936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni      (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * fieldIDs_length);
352936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  for (int i = 0; i< fieldIDs_length; i++) {
353936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni    fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
354936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
355936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
356936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
357936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jsize values_length = _env->GetArrayLength(valueArray);
358936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  uintptr_t* values = (uintptr_t*)alloca(sizeof(uintptr_t) * values_length);
359936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  for (int i = 0; i < values_length; i++) {
360936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni    values[i] = (uintptr_t)jValues[i];
361936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
362936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
363936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jint* sizes = _env->GetIntArrayElements(sizeArray, nullptr);
364936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jsize sizes_length = _env->GetArrayLength(sizeArray);
365936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
366936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jlong* jDepClosures =
367936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni      _env->GetLongArrayElements(depClosureArray, nullptr);
368936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jsize depClosures_length = _env->GetArrayLength(depClosureArray);
369936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  RsClosure* depClosures =
370936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni      (RsClosure*)alloca(sizeof(RsClosure) * depClosures_length);
371936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  for (int i = 0; i < depClosures_length; i++) {
372936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni    depClosures[i] = (RsClosure)jDepClosures[i];
373936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
374936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
375936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jlong* jDepFieldIDs =
376936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni      _env->GetLongArrayElements(depFieldIDArray, nullptr);
377936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jsize depFieldIDs_length = _env->GetArrayLength(depFieldIDArray);
378936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  RsScriptFieldID* depFieldIDs =
379936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni      (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * depFieldIDs_length);
380936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  for (int i = 0; i < depClosures_length; i++) {
381936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni    depFieldIDs[i] = (RsClosure)jDepFieldIDs[i];
382936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
383936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
384936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  return (jlong)(uintptr_t)dispatchTab.ClosureCreate(
385936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni      (RsContext)con, (RsScriptKernelID)kernelID, (RsAllocation)returnValue,
386936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni      fieldIDs, (size_t)fieldIDs_length, values, (size_t)values_length,
387936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni      (size_t*)sizes, (size_t)sizes_length,
388936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni      depClosures, (size_t)depClosures_length,
389936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni      depFieldIDs, (size_t)depFieldIDs_length);
390936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni}
391936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
392b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wangstatic jlong
393b1c365bfb0566142c49375f09f2b8289182f1f47Miao WangnInvokeClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong invokeID,
394b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                     jbyteArray paramArray, jlongArray fieldIDArray, jlongArray valueArray,
395b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                     jintArray sizeArray) {
396b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jbyte* jParams = _env->GetByteArrayElements(paramArray, nullptr);
397b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jsize jParamLength = _env->GetArrayLength(paramArray);
398b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
399b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
400b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
401b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  RsScriptFieldID* fieldIDs =
402b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * fieldIDs_length);
403b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  for (int i = 0; i< fieldIDs_length; i++) {
404b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
405b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  }
406b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
407b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
408b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jsize values_length = _env->GetArrayLength(valueArray);
409b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  uintptr_t* values = (uintptr_t*)alloca(sizeof(uintptr_t) * values_length);
410b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  for (int i = 0; i < values_length; i++) {
411b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    values[i] = (uintptr_t)jValues[i];
412b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  }
413b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
414b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jint* sizes = _env->GetIntArrayElements(sizeArray, nullptr);
415b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jsize sizes_length = _env->GetArrayLength(sizeArray);
416b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
417b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  return (jlong)(uintptr_t)dispatchTab.InvokeClosureCreate(
418b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      (RsContext)con, (RsScriptInvokeID)invokeID, jParams, jParamLength,
419b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      fieldIDs, (size_t)fieldIDs_length, values, (size_t)values_length,
420b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      (size_t*)sizes, (size_t)sizes_length);
421b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang}
422b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
423936fbd696aac243a514f74b6fee6efd5959527a4Yang Nistatic void
424936fbd696aac243a514f74b6fee6efd5959527a4Yang NinClosureSetArg(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
425936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni               jint index, jlong value, jint size) {
426b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  dispatchTab.ClosureSetArg((RsContext)con, (RsClosure)closureID, (uint32_t)index,
427b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                  (uintptr_t)value, (size_t)size);
428936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni}
429936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
430936fbd696aac243a514f74b6fee6efd5959527a4Yang Nistatic void
431936fbd696aac243a514f74b6fee6efd5959527a4Yang NinClosureSetGlobal(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
432936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni                  jlong fieldID, jlong value, jint size) {
433936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  dispatchTab.ClosureSetGlobal((RsContext)con, (RsClosure)closureID,
434b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                     (RsScriptFieldID)fieldID, (uintptr_t)value, (size_t)size);
435936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni}
436936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
437936fbd696aac243a514f74b6fee6efd5959527a4Yang Nistatic long
438936fbd696aac243a514f74b6fee6efd5959527a4Yang NinScriptGroup2Create(JNIEnv *_env, jobject _this, jlong con,
439b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                    jstring cacheDir, jlongArray closureArray) {
440b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
441b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
442936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jlong* jClosures = _env->GetLongArrayElements(closureArray, nullptr);
443936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jsize numClosures = _env->GetArrayLength(closureArray);
444936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  RsClosure* closures = (RsClosure*)alloca(sizeof(RsClosure) * numClosures);
445936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  for (int i = 0; i < numClosures; i++) {
446936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni    closures[i] = (RsClosure)jClosures[i];
447936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
448936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
449b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  return (jlong)(uintptr_t)dispatchTab.ScriptGroup2Create(
450b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      (RsContext)con, cacheDirUTF.c_str(), cacheDirUTF.length(),
451b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      closures, numClosures);
452b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang}
453b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
454b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wangstatic void
455b1c365bfb0566142c49375f09f2b8289182f1f47Miao WangnScriptGroup2Execute(JNIEnv *_env, jobject _this, jlong con, jlong groupID) {
456b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  dispatchTab.ScriptGroupExecute((RsContext)con, (RsScriptGroup2)groupID);
457936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni}
458936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
459c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
460bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj)
461c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
462bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj);
463bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ObjDestroy((RsContext)con, (void *)obj);
464c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
465c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
466c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// ---------------------------------------------------------------------------
467bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
468c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott MainnDeviceCreate(JNIEnv *_env, jobject _this)
469c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
470c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nDeviceCreate");
471bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)dispatchTab.DeviceCreate();
472c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
473c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
474c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
475bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev)
476c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
477c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nDeviceDestroy");
478470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    return dispatchTab.DeviceDestroy((RsDevice)dev);
479c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
480c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
481c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
482bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnDeviceSetConfig(JNIEnv *_env, jobject _this, jlong dev, jint p, jint value)
483c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
484c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nDeviceSetConfig  dev(%p), param(%i), value(%i)", (void *)dev, p, value);
485470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    return dispatchTab.DeviceSetConfig((RsDevice)dev, (RsDeviceParam)p, value);
486c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
487c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
488bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
489ecccf940f72679f7602c52b0b4bcb245acdad55bMiao WangnContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer,
490ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang               jint ct, jstring nativeLibDirJava)
491c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
492c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nContextCreate");
493ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    // Access the NativeLibDir in the Java Context.
494ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    const char * nativeLibDir = _env->GetStringUTFChars(nativeLibDirJava, JNI_FALSE);
495ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    size_t length = (size_t)_env->GetStringUTFLength(nativeLibDirJava);
496ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang
497ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    jlong id = (jlong)(uintptr_t)dispatchTab.ContextCreate((RsDevice)dev, ver,
498ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang                                                           sdkVer,
499ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang                                                           (RsContextType)ct, 0);
500ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    if (dispatchTab.SetNativeLibDir) {
501ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang        dispatchTab.SetNativeLibDir((RsContext)id, nativeLibDir, length);
502ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    }
503ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang
504ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    _env->ReleaseStringUTFChars(nativeLibDirJava, nativeLibDir);
505ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    return id;
506c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
507c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
508c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
509c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
510bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextSetPriority(JNIEnv *_env, jobject _this, jlong con, jint p)
511c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
512bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("ContextSetPriority, con(%p), priority(%i)", (RsContext)con, p);
513bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextSetPriority((RsContext)con, p);
514c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
515c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
516c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
517c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
518c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
519bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextDestroy(JNIEnv *_env, jobject _this, jlong con)
520c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
521bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextDestroy, con(%p)", (RsContext)con);
522bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextDestroy((RsContext)con);
523c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
524c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
525c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
526bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextDump(JNIEnv *_env, jobject _this, jlong con, jint bits)
527c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
528c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nContextDump, con(%p)  bits(%i)", (RsContext)con, bits);
529470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    dispatchTab.ContextDump((RsContext)con, bits);
530c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
531c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
532c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
533c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic jstring
534bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextGetErrorMessage(JNIEnv *_env, jobject _this, jlong con)
535c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
536bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextGetErrorMessage, con(%p)", (RsContext)con);
537c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    char buf[1024];
538c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
539c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t receiveLen;
540c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t subID;
541bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    int id = dispatchTab.ContextGetMessage((RsContext)con,
5426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           buf, sizeof(buf),
5436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &receiveLen, sizeof(receiveLen),
5446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &subID, sizeof(subID));
545c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (!id && receiveLen) {
546184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,
547184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "message receive buffer too small.  %zu", receiveLen);
548c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
549c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return _env->NewStringUTF(buf);
550c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
551c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
552c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic jint
553bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextGetUserMessage(JNIEnv *_env, jobject _this, jlong con, jintArray data)
554c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
555c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
556bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextGetMessage, con(%p), len(%i)", (RsContext)con, len);
557c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *ptr = _env->GetIntArrayElements(data, NULL);
558c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t receiveLen;
559c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t subID;
560bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    int id = dispatchTab.ContextGetMessage((RsContext)con,
5616f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           ptr, len * 4,
5626f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &receiveLen, sizeof(receiveLen),
5636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &subID, sizeof(subID));
564c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (!id && receiveLen) {
565184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,
566184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "message receive buffer too small.  %zu", receiveLen);
567c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
568c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseIntArrayElements(data, ptr, 0);
569bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jint)id;
570c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
571c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
572c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic jint
573bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextPeekMessage(JNIEnv *_env, jobject _this, jlong con, jintArray auxData)
574c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
575bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextPeekMessage, con(%p)", (RsContext)con);
576c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *auxDataPtr = _env->GetIntArrayElements(auxData, NULL);
577c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t receiveLen;
578c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t subID;
579bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    int id = dispatchTab.ContextPeekMessage((RsContext)con, &receiveLen, sizeof(receiveLen),
580c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                                  &subID, sizeof(subID));
581c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    auxDataPtr[0] = (jint)subID;
582c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    auxDataPtr[1] = (jint)receiveLen;
583c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseIntArrayElements(auxData, auxDataPtr, 0);
584bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jint)id;
585c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
586c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
587bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic void nContextInitToClient(JNIEnv *_env, jobject _this, jlong con)
588c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
589bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextInitToClient, con(%p)", (RsContext)con);
590bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextInitToClient((RsContext)con);
591c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
592c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
593bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic void nContextDeinitToClient(JNIEnv *_env, jobject _this, jlong con)
594c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
595bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextDeinitToClient, con(%p)", (RsContext)con);
596bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextDeinitToClient((RsContext)con);
597c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
598c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
599c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
600bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextSendMessage(JNIEnv *_env, jobject _this, jlong con, jint id, jintArray data)
601c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
602c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *ptr = NULL;
603c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = 0;
604c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (data) {
605c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        len = _env->GetArrayLength(data);
606c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        jint *ptr = _env->GetIntArrayElements(data, NULL);
607c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
608bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextSendMessage, con(%p), id(%i), len(%i)", (RsContext)con, id, len);
609bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextSendMessage((RsContext)con, id, (const uint8_t *)ptr, len * sizeof(int));
610c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (data) {
611c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
612c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
613c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
614c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
615c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
616c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
617bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
618086010500c28e2bca57ea583d3f38da9a2f2f414Yang NinElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind,
619086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni               jboolean norm, jint size)
620c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
621bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nElementCreate, con(%p), type(%i), kind(%i), norm(%i), size(%i)", (RsContext)con,
622bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            type, kind, norm, size);
623086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    return (jlong)(uintptr_t)dispatchTab.ElementCreate((RsContext)con,
624086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni                                                       (RsDataType)type,
625086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni                                                       (RsDataKind)kind,
626bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       norm, size);
627c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
628c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
629bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
630bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnElementCreate2(JNIEnv *_env, jobject _this, jlong con,
631bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                jlongArray _ids, jobjectArray _names, jintArray _arraySizes)
632c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
633c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    int fieldCount = _env->GetArrayLength(_ids);
634bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nElementCreate2, con(%p)", (RsContext)con);
635bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
636bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jIds = _env->GetLongArrayElements(_ids, NULL);
637bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint *jArraySizes = _env->GetIntArrayElements(_arraySizes, NULL);
638c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
639bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsElement *ids = (RsElement*)malloc(fieldCount * sizeof(RsElement));
640bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    uint32_t *arraySizes = (uint32_t *)malloc(fieldCount * sizeof(uint32_t));
641bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
642bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < fieldCount; i ++) {
643bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        ids[i] = (RsElement)jIds[i];
644bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        arraySizes[i] = (uint32_t)jArraySizes[i];
645bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
646c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
647c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringArrayToUTF8 names(_env, _names, fieldCount);
648c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
649c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    const char **nameArray = names.c_str();
650c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t *sizeArray = names.c_str_len();
651c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
6526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    jlong id = (jlong)(uintptr_t)dispatchTab.ElementCreate2((RsContext)con, (RsElement *)ids,
6536f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                            fieldCount, nameArray,
6546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                            fieldCount * sizeof(size_t),  sizeArray,
6556f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                            (const uint32_t *)arraySizes, fieldCount);
656c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
657bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(ids);
658bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(arraySizes);
659bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_ids, jIds, JNI_ABORT);
660bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseIntArrayElements(_arraySizes, jArraySizes, JNI_ABORT);
661bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return id;
662c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
663c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
664c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
665c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
666bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
667c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
668bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnElementGetSubElements(JNIEnv *_env, jobject _this, jlong con, jlong id,
669bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                       jlongArray _IDs,
670c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                       jobjectArray _names,
671c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                       jintArray _arraySizes)
672c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
673bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    uint32_t dataSize = _env->GetArrayLength(_IDs);
674bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nElementGetSubElements, con(%p)", (RsContext)con);
675c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
676bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    uintptr_t *ids = (uintptr_t *)malloc(dataSize * sizeof(uintptr_t));
677c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    const char **names = (const char **)malloc((uint32_t)dataSize * sizeof(const char *));
678c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t *arraySizes = (uint32_t *)malloc((uint32_t)dataSize * sizeof(uint32_t));
679c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
680bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ElementGetSubElements((RsContext)con, (RsElement)id, ids, names, arraySizes,
681bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (uint32_t)dataSize);
682c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
683bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(uint32_t i = 0; i < dataSize; i++) {
684bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        const jlong id = (jlong)(uintptr_t)ids[i];
685bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        const jint arraySize = (jint)arraySizes[i];
686c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i]));
687bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        _env->SetLongArrayRegion(_IDs, i, 1, &id);
688bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        _env->SetIntArrayRegion(_arraySizes, i, 1, &arraySize);
689c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
690c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
691c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    free(ids);
692c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    free(names);
693c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    free(arraySizes);
694c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
695c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
696c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
697c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
698bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
699bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid,
700c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv)
701c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
702c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)",
703bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, eid, dimx, dimy, dimz, mips, faces, yuv);
704c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
705bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)dispatchTab.TypeCreate((RsContext)con, (RsElement)eid, dimx, dimy,
706bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                    dimz, mips, faces, yuv);
707c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
708c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
709c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
710c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
711bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
712bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mips, jint usage,
713bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                       jlong pointer)
714c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
715bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)",
716bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsElement)type, mips, usage, (void *)pointer);
717bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t) dispatchTab.AllocationCreateTyped((RsContext)con, (RsType)type,
718bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                (RsAllocationMipmapControl)mips,
719bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                (uint32_t)usage, (uintptr_t)pointer);
720c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
721c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
722c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
723bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationSyncAll(JNIEnv *_env, jobject _this, jlong con, jlong a, jint bits)
724c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
725bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationSyncAll, con(%p), a(%p), bits(0x%08x)", (RsContext)con, (RsAllocation)a, bits);
726bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationSyncAll((RsContext)con, (RsAllocation)a, (RsAllocationUsageType)bits);
727c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
728c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
729c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
730bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationSetSurface(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject sur)
731dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang{
732bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    ioDispatch.sAllocationSetSurface(_env, _this, (RsContext)con, (RsAllocation)alloc, sur, dispatchTab);
733dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang}
734dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang
735dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wangstatic void
736bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationIoSend(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
737dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang{
738bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationIoSend((RsContext)con, (RsAllocation)alloc);
739dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang}
740dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang
741dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wangstatic void
742bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
743c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
744bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationGenerateMipmaps, con(%p), a(%p)", (RsContext)con, (RsAllocation)alloc);
745bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationGenerateMipmaps((RsContext)con, (RsAllocation)alloc);
746c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
747c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
748c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic size_t GetBitmapSize(JNIEnv *env, jobject jbitmap) {
749c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmapInfo info;
750c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    memset(&info, 0, sizeof(info));
751c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_getInfo(env, jbitmap, &info);
752c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t s = info.width * info.height;
753c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    switch (info.format) {
754c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        case ANDROID_BITMAP_FORMAT_RGBA_8888: s *= 4; break;
755c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        case ANDROID_BITMAP_FORMAT_RGB_565: s *= 2; break;
756c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        case ANDROID_BITMAP_FORMAT_RGBA_4444: s *= 2; break;
757c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
758c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return s;
759c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
760c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
761bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
762bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,
763bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                            jobject jbitmap, jint usage)
764c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
765bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = 0;
766257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    void *pixels = NULL;
767257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
768c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
769257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (pixels != NULL) {
770bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        id = (jlong)(uintptr_t)dispatchTab.AllocationCreateFromBitmap((RsContext)con,
771bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      (RsType)type,
772bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      (RsAllocationMipmapControl)mip,
773bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      pixels,
774bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      GetBitmapSize(_env, jbitmap),
775bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      usage);
776257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        AndroidBitmap_unlockPixels(_env, jbitmap);
777257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
778c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
779c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
780c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
781bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
782bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCreateBitmapBackedAllocation(JNIEnv *_env, jobject _this, jlong con, jlong type,
783bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                        jint mip, jobject jbitmap, jint usage)
784c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
785bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = 0;
786257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    void *pixels = NULL;
787257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
788c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
789257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (pixels != NULL) {
790bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        id = (jlong)(uintptr_t)dispatchTab.AllocationCreateTyped((RsContext)con,
791bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (RsType)type,
792bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (RsAllocationMipmapControl)mip,
793bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (uint32_t)usage,
794bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (uintptr_t)pixels);
795257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        AndroidBitmap_unlockPixels(_env, jbitmap);
796257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
797c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
798c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
799c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
800bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
801bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type,
802bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                jint mip, jobject jbitmap, jint usage)
803c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
804c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    void *pixels = NULL;
805c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
806c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
807bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = 0;
808c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (pixels != NULL) {
809bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        id = (jlong)(uintptr_t)dispatchTab.AllocationCubeCreateFromBitmap((RsContext)con,
810bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          (RsType)type,
811bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          (RsAllocationMipmapControl)mip,
812bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          pixels,
813bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          GetBitmapSize(_env, jbitmap),
814bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          usage);
815c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        AndroidBitmap_unlockPixels(_env, jbitmap);
816c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
817c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
818c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
819c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
820c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
821bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
822c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
823c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmapInfo info;
824c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    memset(&info, 0, sizeof(info));
825c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_getInfo(_env, jbitmap, &info);
826c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
827c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    void *pixels = NULL;
828c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
829c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
830c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (pixels != NULL) {
831bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dispatchTab.Allocation2DData((RsContext)con, (RsAllocation)alloc, 0, 0, 0,
832bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                     RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, info.width,
833bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                     info.height, pixels, GetBitmapSize(_env, jbitmap), 0);
834c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        AndroidBitmap_unlockPixels(_env, jbitmap);
835c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
836c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
837c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
838c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
839bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCopyToBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
840c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
841c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmapInfo info;
842c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    memset(&info, 0, sizeof(info));
843c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_getInfo(_env, jbitmap, &info);
844c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
845c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    void *pixels = NULL;
846c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
847c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
848c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (pixels != NULL) {
849bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dispatchTab.AllocationCopyToBitmap((RsContext)con, (RsAllocation)alloc, pixels,
850bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                           GetBitmapSize(_env, jbitmap));
851c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        AndroidBitmap_unlockPixels(_env, jbitmap);
852c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
853c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    //bitmap.notifyPixelsChanged();
854c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
855c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
8568352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Java object data into the Allocation pointed to by _alloc.
857c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
8588352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
8592e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint count, jobject data, jint sizeBytes, jint dataType, jint mSize,
8602e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jboolean usePadding)
861c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
8628352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
8638352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation1DData, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
8648352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            "dataType(%i)", (RsContext)con, (RsAllocation)alloc, offset, count, sizeBytes,
8658352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            dataType);
8662e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation1DData, true,
8672e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
868c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
869c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
870244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
871c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
872244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationElementData1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint xoff,
873244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                         jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
874c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
875c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
876244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    LOG_API("nAllocationElementData1D, con(%p), alloc(%p), xoff(%i), comp(%i), len(%i), "
877244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, compIdx, len,
878244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            sizeBytes);
879244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
880244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    dispatchTab.Allocation1DElementData((RsContext)con, (RsAllocation)alloc, xoff,
881244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                                        lod, ptr, sizeBytes, compIdx);
882c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
883c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
884c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
885244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang/*
886244b72fe088a6393f37dea49ff89cf9df738a492Miao Wangstatic void
887244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationElementData(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
888244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                       jint xoff, jint yoff, jint zoff,
889244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                       jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
890244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang{
891244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    jint len = _env->GetArrayLength(data);
892244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    LOG_API("nAllocationElementData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
893244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
894244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            sizeBytes);
895244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
896244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    dispatchTab.AllocationElementData((RsContext)con, (RsAllocation)alloc,
897244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                                      xoff, yoff, zoff,
898244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                                      lod, ptr, sizeBytes, compIdx);
899244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
900244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang}
901244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang*/
902244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
9038352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Java object data into the Allocation pointed to by _alloc.
904c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
9058352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
9062e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType, jint mSize,
9072e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jboolean usePadding)
908c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
9098352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
9108352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
9118352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation2DData, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
9128352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
9132e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h;
9142e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation2DData, true,
9152e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
916c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
917c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
918c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
919bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationData2D_alloc(JNIEnv *_env, jobject _this, jlong con,
920bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong dstAlloc, jint dstXoff, jint dstYoff,
921c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint dstMip, jint dstFace,
922c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint width, jint height,
923bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong srcAlloc, jint srcXoff, jint srcYoff,
924c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint srcMip, jint srcFace)
925c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
926c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nAllocation2DData_s, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
927c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " dstMip(%i), dstFace(%i), width(%i), height(%i),"
928c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i), srcFace(%i)",
929bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
930c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
931c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
932bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationCopy2DRange((RsContext)con,
933bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)dstAlloc,
934bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      dstXoff, dstYoff,
935bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      dstMip, dstFace,
936bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      width, height,
937bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)srcAlloc,
938bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      srcXoff, srcYoff,
939bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      srcMip, srcFace);
940c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
941c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
9428352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Java object data into the Allocation pointed to by _alloc.
943c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
9448352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
9452e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jint d, jobject data, jint sizeBytes, jint dataType,
9462e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
947c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
9488352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
9498352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation3DData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
9508352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
9518352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            lod, w, h, d, sizeBytes);
9522e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h * d;
9532e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation3DData, true,
9542e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
955c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
956c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
957c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
958bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationData3D_alloc(JNIEnv *_env, jobject _this, jlong con,
959bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong dstAlloc, jint dstXoff, jint dstYoff, jint dstZoff,
960c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint dstMip,
961c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint width, jint height, jint depth,
962bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong srcAlloc, jint srcXoff, jint srcYoff, jint srcZoff,
963c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint srcMip)
964c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
965c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nAllocationData3D_alloc, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
966c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " dstMip(%i), width(%i), height(%i),"
967c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i)",
968bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
969c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
970c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
971bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationCopy3DRange((RsContext)con,
972bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)dstAlloc,
973bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      dstXoff, dstYoff, dstZoff, dstMip,
974bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      width, height, depth,
975bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)srcAlloc,
976bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      srcXoff, srcYoff, srcZoff, srcMip);
977bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang}
978bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
9798352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
980bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic void
9812e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao WangnAllocationRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jobject data, jint dataType,
9822e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                jint mSize, jboolean usePadding)
983bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{
9848352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
9858352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocationRead, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
9862e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = 0;
9872e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(0, dispatchTab.AllocationRead, false,
9882e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, ptr, len * typeBytes);
989c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
990c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
9918352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
992c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
9938352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationRead1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
9942e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint count, jobject data, jint sizeBytes, jint dataType,
9952e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
996c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
9978352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
9988352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation1DRead, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
9998352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang              "dataType(%i)", (RsContext)con, alloc, offset, count, sizeBytes, dataType);
10002e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(0, dispatchTab.Allocation1DRead, false,
10012e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
1002c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1003c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1004244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang// Copies from the Element in the Allocation pointed to by _alloc into the Java array data.
1005244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang/*
1006244b72fe088a6393f37dea49ff89cf9df738a492Miao Wangstatic void
1007244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationElementRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc,
1008244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                       jint xoff, jint yoff, jint zoff,
10093bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang                       jint lod, jint compIdx, jobject data, jint sizeBytes)
1010244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang{
10113bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    jint len = _env->GetArrayLength(data);
10123bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    LOG_API("nAllocationElementRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
10133bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang            "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
10143bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang            sizeBytes);
10153bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
10163bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    dispatchTab.AllocationElementRead((RsContext)con, (RsAllocation)alloc,
10173bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang                                      xoff, yoff, zoff,
10183bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang                                      lod, ptr, sizeBytes, compIdx);
10193bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1020244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang}
1021244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang*/
1022244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
10238352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1024c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
10258352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
10262e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType,
10272e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
1028c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
10298352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
10308352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
10318352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation2DRead, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
10328352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang              "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
10332e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h;
10342e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(0, dispatchTab.Allocation2DRead, false,
10352e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
1036c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1037c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1038244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1039244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang/*
1040244b72fe088a6393f37dea49ff89cf9df738a492Miao Wangstatic void
1041244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationRead3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
10422e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jint d, jobject data, int sizeBytes, int dataType,
10432e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
1044244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang{
1045244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
1046244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    LOG_API("nAllocation3DRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
1047244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
1048244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            lod, w, h, d, sizeBytes);
10492e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h * d;
10502e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation3DRead, false,
10512e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
1052244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang}
1053244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang*/
1054244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
1055bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1056bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationGetType(JNIEnv *_env, jobject _this, jlong con, jlong a)
1057c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1058bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationGetType, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
1059bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t) dispatchTab.AllocationGetType((RsContext)con, (RsAllocation)a);
1060c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1061c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1062c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1063bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationResize1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint dimX)
1064c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1065bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", (RsContext)con,
1066bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsAllocation)alloc, dimX);
1067bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationResize1D((RsContext)con, (RsAllocation)alloc, dimX);
1068c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1069c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1070c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
1071c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1072c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
10736f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptBindAllocation(JNIEnv *_env, jobject _this, jlong con, jlong script, jlong alloc, jint slot, jboolean mUseInc)
1074c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1075bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)",
1076bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
10776f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
10786f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
10796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
10806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
10816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1082c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1083c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1084c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
10856f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jint val, jboolean mUseInc)
1086c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1087bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con,
1088bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
10896f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
10906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarI((RsContext)con, (RsScript)script, slot, val);
10916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
10926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarI((RsContext)con, (RsScript)script, slot, val);
10936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1094c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1095c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1096c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
10976f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarObj(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val, jboolean mUseInc)
1098c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1099bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con,
1100bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
11016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
11026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val);
11036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
11046f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val);
11056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1106c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1107c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1108c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
11096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val, jboolean mUseInc)
1110c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1111bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%lli)", (RsContext)con,
1112bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
11136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
11146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarJ((RsContext)con, (RsScript)script, slot, val);
11156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
11166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarJ((RsContext)con, (RsScript)script, slot, val);
11176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1118c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1119c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1120c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
11216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, float val, jboolean mUseInc)
1122c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1123bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", (RsContext)con,
1124bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
11256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
11266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarF((RsContext)con, (RsScript)script, slot, val);
11276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
11286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarF((RsContext)con, (RsScript)script, slot, val);
11296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1130c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1131c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1132c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
11336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, double val, jboolean mUseInc)
1134c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1135bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", (RsContext)con,
1136bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
11376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
11386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarD((RsContext)con, (RsScript)script, slot, val);
11396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
11406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarD((RsContext)con, (RsScript)script, slot, val);
11416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1142c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1143c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1144c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
11456f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data, jboolean mUseInc)
1146c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1147bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1148c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
1149c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
11506f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
11516f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
11526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
11536f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
11546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1155c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1156c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1157c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1158c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1159bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptSetVarVE(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data,
11606f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                jlong elem, jintArray dims, jboolean mUseInc)
1161c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1162bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarVE, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1163c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
1164c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
1165c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint dimsLen = _env->GetArrayLength(dims) * sizeof(int);
1166c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *dimsPtr = _env->GetIntArrayElements(dims, NULL);
11676f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
11686f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem,
11696f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                      (const uint32_t *)dimsPtr, dimsLen);
11706f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
11716f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem,
11726f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                   (const uint32_t *)dimsPtr, dimsLen);
11736f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1174c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1175c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseIntArrayElements(dims, dimsPtr, JNI_ABORT);
1176c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1177c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1178c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1179c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
11806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetTimeZone(JNIEnv *_env, jobject _this, jlong con, jlong script, jbyteArray timeZone, jboolean mUseInc)
1181c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1182bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptCSetTimeZone, con(%p), s(%p), timeZone(%s)", (RsContext)con,
1183bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, (const char *)timeZone);
1184c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1185c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint length = _env->GetArrayLength(timeZone);
1186c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte* timeZone_ptr;
1187c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0);
11886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
11896f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length);
11906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
11916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length);
11926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1193c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1194c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (timeZone_ptr) {
1195c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0);
1196c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1197c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1198c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1199c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptInvoke(JNIEnv *_env, jobject _this, jlong con, jlong obj, jint slot, jboolean mUseInc)
1201c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1202bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptInvoke, con(%p), script(%p)", (RsContext)con, (void *)obj);
12036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
12046f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptInvoke((RsContext)con, (RsScript)obj, slot);
12056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
12066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptInvoke((RsContext)con, (RsScript)obj, slot);
12076f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1208c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1209c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1210c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptInvokeV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data, jboolean mUseInc)
1212c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1213bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptInvokeV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1214c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
1215c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
12166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
12176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len);
12186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
12196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len);
12206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1221c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1222c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1223c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1224c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEach(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
12266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang               jlong script, jint slot, jlong ain, jlong aout, jboolean mUseInc)
1227c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1228bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
12296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
12306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
12316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
12326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
12336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     NULL, 0, NULL, 0);
12346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
12356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
12366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
12376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  NULL, 0, NULL, 0);
12386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1239c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1240c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEachV(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
12426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                jlong script, jint slot, jlong ain, jlong aout, jbyteArray params, jboolean mUseInc)
1243c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1244bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1245c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(params);
1246c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(params, NULL);
12476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
12486f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
12496f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
12506f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
12516f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     ptr, len, NULL, 0);
12526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
12536f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
12546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
12556f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  ptr, len, NULL, 0);
12566f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1257c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT);
1258c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1259c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1260c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12616f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEachClipped(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
1262bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                      jlong script, jint slot, jlong ain, jlong aout,
1263c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                      jint xstart, jint xend,
12646f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                      jint ystart, jint yend, jint zstart, jint zend, jboolean mUseInc)
1265c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1266bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEachClipped, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1267c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    RsScriptCall sc;
1268c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xStart = xstart;
1269c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xEnd = xend;
1270c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yStart = ystart;
1271c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yEnd = yend;
1272c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zStart = zstart;
1273c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zEnd = zend;
1274c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
1275c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayStart = 0;
1276c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayEnd = 0;
12776f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
12786f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
12796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
12806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
12816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     NULL, 0, &sc, sizeof(sc));
12826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
12836f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
12846f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
12856f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  NULL, 0, &sc, sizeof(sc));
12866f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1287c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1288c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1289c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEachClippedV(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
1291bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                       jlong script, jint slot, jlong ain, jlong aout,
1292c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                       jbyteArray params, jint xstart, jint xend,
12936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                       jint ystart, jint yend, jint zstart, jint zend, jboolean mUseInc)
1294c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1295bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEachClipped, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1296c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(params);
1297c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(params, NULL);
1298c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    RsScriptCall sc;
1299c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xStart = xstart;
1300c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xEnd = xend;
1301c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yStart = ystart;
1302c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yEnd = yend;
1303c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zStart = zstart;
1304c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zEnd = zend;
1305c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
1306c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayStart = 0;
1307c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayEnd = 0;
13086f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
13096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
13106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
13116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
13126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     ptr, len, &sc, sizeof(sc));
13136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
13146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
13156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
13166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  ptr, len, &sc, sizeof(sc));
13176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1318c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT);
1319c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1320c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1321c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
1322c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1323bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1324bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptCCreate(JNIEnv *_env, jobject _this, jlong con,
1325c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main               jstring resName, jstring cacheDir,
1326c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main               jbyteArray scriptRef, jint length)
1327c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1328bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptCCreate, con(%p)", (RsContext)con);
1329c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1330c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringToUTF8 resNameUTF(_env, resName);
1331c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
1332bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong ret = 0;
1333c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte* script_ptr = NULL;
1334c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint _exception = 0;
1335c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint remaining;
1336c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (!scriptRef) {
1337c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _exception = 1;
1338c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null");
1339c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto exit;
1340c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1341c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (length < 0) {
1342c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _exception = 1;
1343c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0");
1344c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto exit;
1345c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1346c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    remaining = _env->GetArrayLength(scriptRef);
1347c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (remaining < length) {
1348c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _exception = 1;
1349c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //jniThrowException(_env, "java/lang/IllegalArgumentException",
1350c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //        "length > script.length - offset");
1351c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto exit;
1352c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1353c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    script_ptr = (jbyte *)
1354c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0);
1355c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1356c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    //rsScriptCSetText(con, (const char *)script_ptr, length);
1357c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1358bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    ret = (jlong)(uintptr_t)dispatchTab.ScriptCCreate((RsContext)con,
1359bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                      resNameUTF.c_str(), resNameUTF.length(),
1360bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                      cacheDirUTF.c_str(), cacheDirUTF.length(),
1361bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                      (const char *)script_ptr, length);
1362c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1363c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainexit:
1364c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (script_ptr) {
1365c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr,
1366c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                _exception ? JNI_ABORT: 0);
1367c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1368c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1369bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)ret;
1370c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1371c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1372bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
13736f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptIntrinsicCreate(JNIEnv *_env, jobject _this, jlong con, jint id, jlong eid, jboolean mUseInc)
1374c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1375bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptIntrinsicCreate, con(%p) id(%i) element(%p)", (RsContext)con, id, (void *)eid);
13766f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
13776f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTabInc.ScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
13786f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
13796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTab.ScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
13806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1381c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1382c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1383bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
13846f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptKernelIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jint sig, jboolean mUseInc)
1385c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1386bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptKernelIDCreate, con(%p) script(%p), slot(%i), sig(%i)", (RsContext)con,
1387bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)sid, slot, sig);
13886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
13896f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTabInc.ScriptKernelIDCreate((RsContext)con, (RsScript)sid,
13906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                                     slot, sig);
13916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
13926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTab.ScriptKernelIDCreate((RsContext)con, (RsScript)sid,
13936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                                  slot, sig);
13946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1395c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1396c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1397bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1398086010500c28e2bca57ea583d3f38da9a2f2f414Yang NinScriptInvokeIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
1399086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni{
1400086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    LOG_API("nScriptInvokeIDCreate, con(%p) script(%p), slot(%i), sig(%i)", con,
1401086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni            (void *)sid, slot);
1402086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    return (jlong)dispatchTab.ScriptInvokeIDCreate((RsContext)con, (RsScript)sid, slot);
1403086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni}
1404086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni
1405086010500c28e2bca57ea583d3f38da9a2f2f414Yang Nistatic jlong
14066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptFieldIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jboolean mUseInc)
1407c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1408bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptFieldIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con, (void *)sid, slot);
14096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTabInc.ScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
14116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
14126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTab.ScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
14136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1414c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1415c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1416bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1417bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _kernels, jlongArray _src,
1418bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlongArray _dstk, jlongArray _dstf, jlongArray _types)
1419bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{
1420bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupCreate, con(%p)", (RsContext)con);
1421bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1422bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint kernelsLen = _env->GetArrayLength(_kernels);
1423bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jKernelsPtr = _env->GetLongArrayElements(_kernels, nullptr);
1424bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsScriptKernelID* kernelsPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * kernelsLen);
1425bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < kernelsLen; ++i) {
1426bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        kernelsPtr[i] = (RsScriptKernelID)jKernelsPtr[i];
1427bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1428bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1429bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint srcLen = _env->GetArrayLength(_src);
1430bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jSrcPtr = _env->GetLongArrayElements(_src, nullptr);
1431bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsScriptKernelID* srcPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * srcLen);
1432bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < srcLen; ++i) {
1433bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        srcPtr[i] = (RsScriptKernelID)jSrcPtr[i];
1434bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1435bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1436bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint dstkLen = _env->GetArrayLength(_dstk);
1437bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jDstkPtr = _env->GetLongArrayElements(_dstk, nullptr);
1438bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsScriptKernelID* dstkPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstkLen);
1439bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < dstkLen; ++i) {
1440bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dstkPtr[i] = (RsScriptKernelID)jDstkPtr[i];
1441bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1442bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1443bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint dstfLen = _env->GetArrayLength(_dstf);
1444bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jDstfPtr = _env->GetLongArrayElements(_dstf, nullptr);
1445bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsScriptKernelID* dstfPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstfLen);
1446bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < dstfLen; ++i) {
1447bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dstfPtr[i] = (RsScriptKernelID)jDstfPtr[i];
1448bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1449bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1450bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint typesLen = _env->GetArrayLength(_types);
1451bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jTypesPtr = _env->GetLongArrayElements(_types, nullptr);
1452bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsType* typesPtr = (RsType*) malloc(sizeof(RsType) * typesLen);
1453bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < typesLen; ++i) {
1454bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        typesPtr[i] = (RsType)jTypesPtr[i];
1455bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1456bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1457bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = (jlong)(uintptr_t) dispatchTab.ScriptGroupCreate((RsContext)con,
1458bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptKernelID *)kernelsPtr, kernelsLen * sizeof(RsScriptKernelID),
1459bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptKernelID *)srcPtr, srcLen * sizeof(RsScriptKernelID),
1460bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptKernelID *)dstkPtr, dstkLen * sizeof(RsScriptKernelID),
1461bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptFieldID *)dstfPtr, dstfLen * sizeof(RsScriptKernelID),
1462bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsType *)typesPtr, typesLen * sizeof(RsType));
1463bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1464bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(kernelsPtr);
1465bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(srcPtr);
1466bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(dstkPtr);
1467bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(dstfPtr);
1468bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(typesPtr);
1469bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_kernels, jKernelsPtr, 0);
1470bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_src, jSrcPtr, 0);
1471bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_dstk, jDstkPtr, 0);
1472bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_dstf, jDstfPtr, 0);
1473bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_types, jTypesPtr, 0);
1474c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
1475c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1476c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1477c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1478bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupSetInput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
1479c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1480bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupSetInput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
1481bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)gid, (void *)kid, (void *)alloc);
1482bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ScriptGroupSetInput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid,
1483bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                    (RsAllocation)alloc);
1484c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1485c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1486c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1487bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupSetOutput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
1488c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1489bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupSetOutput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
1490bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)gid, (void *)kid, (void *)alloc);
1491bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ScriptGroupSetOutput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid,
1492bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                     (RsAllocation)alloc);
1493c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1494c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1495c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1496bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupExecute(JNIEnv *_env, jobject _this, jlong con, jlong gid)
1497c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1498bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupSetOutput, con(%p) group(%p)", (RsContext)con, (void *)gid);
1499bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ScriptGroupExecute((RsContext)con, (RsScriptGroup)gid);
1500c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1501c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1502c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// ---------------------------------------------------------------------------
1503c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1504bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1505bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnSamplerCreate(JNIEnv *_env, jobject _this, jlong con, jint magFilter, jint minFilter,
1506c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main               jint wrapS, jint wrapT, jint wrapR, jfloat aniso)
1507c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1508bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nSamplerCreate, con(%p)", (RsContext)con);
1509bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)dispatchTab.SamplerCreate((RsContext)con,
1510bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)magFilter,
1511bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)minFilter,
1512bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)wrapS,
1513bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)wrapT,
1514bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)wrapR,
1515bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       aniso);
1516bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang}
1517bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1518bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jint
1519bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnSystemGetPointerSize(JNIEnv *_env, jobject _this) {
1520bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jint)sizeof(void*);
1521c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1522c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
15236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// ---------------------------------------------------------------------------
15246f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// For Incremental Intrinsic Support
15256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic bool nIncLoadSO() {
15266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    void* handle = NULL;
15276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    handle = dlopen("libRSSupport.so", RTLD_LAZY | RTLD_LOCAL);
15286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (handle == NULL) {
15296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        LOG_API("couldn't dlopen %s, %s", filename, dlerror());
15306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return false;
15316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
15326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
15336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (loadSymbols(handle, dispatchTabInc) == false) {
15346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        LOG_API("%s init failed!", filename);
15356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return false;
15366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
15376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("Successfully loaded %s", filename);
15386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return true;
15396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
15406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
15416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
15426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// To create/destroy a dummy context
15436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
15446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj)
15456f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
15466f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj);
15476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    dispatchTabInc.ObjDestroy((RsContext)con, (void *)obj);
15486f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
15496f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
15506f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
15516f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
15526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncDeviceCreate(JNIEnv *_env, jobject _this)
15536f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
15546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nDeviceCreate");
15556f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.DeviceCreate();
15566f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
15576f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
15586f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
15596f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev)
15606f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
15616f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nDeviceDestroy");
15626f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return dispatchTabInc.DeviceDestroy((RsDevice)dev);
15636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
15646f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
15656f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
15666f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer, jint ct)
15676f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
15686f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nContextCreate");
15696f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    //The compat context for incremental support will be synchronous.
15706f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.ContextCreate((RsDevice)dev, ver, sdkVer,
15716f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                          (RsContextType)ct,
15726f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                          RS_CONTEXT_SYNCHRONOUS);
15736f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
15746f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
15756f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
15766f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncContextFinish(JNIEnv *_env, jobject _this, jlong con)
15776f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
15786f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nContextFinish, con(%p)", (RsContext)con);
15796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    dispatchTabInc.ContextFinish((RsContext)con);
15806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
15816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
15826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
15836f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncContextDestroy(JNIEnv *_env, jobject _this, jlong con)
15846f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
15856f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nContextDestroy, con(%p)", (RsContext)con);
15866f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    dispatchTabInc.ContextDestroy((RsContext)con);
15876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
15886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
15896f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
15906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Create dummy Element
15916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
15926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind, jboolean norm, jint size)
15936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
15946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nElementCreate, con(%p), type(%i), kind(%i), norm(%i), size(%i)", (RsContext)con,
15956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            type, kind, norm, size);
15966f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.ElementCreate((RsContext)con, (RsDataType)type,
15976f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                          (RsDataKind)kind, norm, size);
15986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
15996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
16006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Create dummy Type
16016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
16026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid,
16036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv)
16046f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
16056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)",
16066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            incCon, eid, dimx, dimy, dimz, mips, faces, yuv);
16076f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
16086f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.TypeCreate((RsContext)con, (RsElement)eid, dimx, dimy,
16096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                       dimz, mips, faces, yuv);
16106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
16116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
16126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
16136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Create Allocation from pointer
16146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
16156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong alloc, jlong type)
16166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
16176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)",
16186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            incCon, (RsElement)type, mips, usage, (void *)pointer);
16196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    size_t strideIn;
16206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    void* pIn = NULL;
16216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    RsAllocation ainI = NULL;
16226f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (alloc != 0) {
16236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        pIn = dispatchTab.AllocationGetPointer((RsContext)con, (RsAllocation)alloc, 0,
16246f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                               RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 0, 0,
16256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                               &strideIn, sizeof(size_t));
16266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        ainI = dispatchTabInc.AllocationCreateTyped((RsContext)incCon, (RsType)type,
16276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                    RS_ALLOCATION_MIPMAP_NONE,
16286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                    RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_SHARED,
16296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                    (uintptr_t)pIn);
16306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
16316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t) ainI;
16326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
1633c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
16342e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang// ---------------------------------------------------------------------------
1635c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1636bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1637c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic const char *classPathName = "android/support/v8/renderscript/RenderScript";
1638c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1639c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic JNINativeMethod methods[] = {
16407c0de6383be18a1dae1297c54c56f3d9afbeaaadMiao Wang{"nLoadSO",                        "(ZI)Z",                                   (bool*)nLoadSO },
1641dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang{"nLoadIOSO",                      "()Z",                                     (bool*)nLoadIOSO },
1642bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nDeviceCreate",                  "()J",                                     (void*)nDeviceCreate },
1643bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nDeviceDestroy",                 "(J)V",                                    (void*)nDeviceDestroy },
1644bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nDeviceSetConfig",               "(JII)V",                                  (void*)nDeviceSetConfig },
1645bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextGetUserMessage",         "(J[I)I",                                  (void*)nContextGetUserMessage },
1646bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextGetErrorMessage",        "(J)Ljava/lang/String;",                   (void*)nContextGetErrorMessage },
1647bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextPeekMessage",            "(J[I)I",                                  (void*)nContextPeekMessage },
1648bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextInitToClient",           "(J)V",                                    (void*)nContextInitToClient },
1649bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextDeinitToClient",         "(J)V",                                    (void*)nContextDeinitToClient },
1650c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1651c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1652c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// All methods below are thread protected in java.
1653ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang{"rsnContextCreate",                 "(JIIILjava/lang/String;)J",             (void*)nContextCreate },
1654bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextFinish",                 "(J)V",                                  (void*)nContextFinish },
1655bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextSetPriority",            "(JI)V",                                 (void*)nContextSetPriority },
1656bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextDestroy",                "(J)V",                                  (void*)nContextDestroy },
1657bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextDump",                   "(JI)V",                                 (void*)nContextDump },
1658bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextSendMessage",            "(JI[I)V",                               (void*)nContextSendMessage },
1659b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnClosureCreate",                 "(JJJ[J[J[I[J[J)J",                      (void*)nClosureCreate },
1660b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnInvokeClosureCreate",           "(JJ[B[J[J[I)J",                         (void*)nInvokeClosureCreate },
1661b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnClosureSetArg",                 "(JJIJI)V",                              (void*)nClosureSetArg },
1662b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnClosureSetGlobal",              "(JJJJI)V",                              (void*)nClosureSetGlobal },
1663bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnObjDestroy",                    "(JJ)V",                                 (void*)nObjDestroy },
1664bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1665bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnElementCreate",                 "(JJIZI)J",                              (void*)nElementCreate },
1666bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnElementCreate2",                "(J[J[Ljava/lang/String;[I)J",           (void*)nElementCreate2 },
1667bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnElementGetSubElements",         "(JJ[J[Ljava/lang/String;[I)V",          (void*)nElementGetSubElements },
1668bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1669bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnTypeCreate",                    "(JJIIIZZI)J",                           (void*)nTypeCreate },
1670bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1671bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCreateTyped",         "(JJIIJ)J",                              (void*)nAllocationCreateTyped },
1672bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCreateFromBitmap",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateFromBitmap },
1673bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCreateBitmapBackedAllocation",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateBitmapBackedAllocation },
1674bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCubeCreateFromBitmap","(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCubeCreateFromBitmap },
1675bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1676bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCopyFromBitmap",      "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyFromBitmap },
1677bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCopyToBitmap",        "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyToBitmap },
1678bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1679bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationSyncAll",             "(JJI)V",                                (void*)nAllocationSyncAll },
1680bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationSetSurface",          "(JJLandroid/view/Surface;)V",           (void*)nAllocationSetSurface },
1681bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationIoSend",              "(JJ)V",                                 (void*)nAllocationIoSend },
16822e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationData1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationData1D },
1683bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationElementData1D",       "(JJIII[BI)V",                           (void*)nAllocationElementData1D },
1684244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang//{"rsnAllocationElementData",         "(JJIIIII[BI)V",                         (void*)nAllocationElementData },
16852e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationData2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationData2D },
1686bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationData2D",              "(JJIIIIIIJIIII)V",                      (void*)nAllocationData2D_alloc },
16872e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationData3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",    (void*)nAllocationData3D },
1688bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationData3D",              "(JJIIIIIIIJIIII)V",                     (void*)nAllocationData3D_alloc },
16892e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationRead",                "(JJLjava/lang/Object;IIZ)V",            (void*)nAllocationRead },
16902e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationRead1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationRead1D },
16913bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang//{"rsnAllocationElementRead",         "(JJIIIII[BI)V",                         (void*)nAllocationElementRead },
16922e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationRead2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationRead2D },
16932e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang//{"rsnAllocationRead3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",  (void*)nAllocationRead3D },
1694bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationGetType",             "(JJ)J",                                 (void*)nAllocationGetType},
1695bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationResize1D",            "(JJI)V",                                (void*)nAllocationResize1D },
1696bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationGenerateMipmaps",     "(JJ)V",                                 (void*)nAllocationGenerateMipmaps },
1697bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
16986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptBindAllocation",          "(JJJIZ)V",                              (void*)nScriptBindAllocation },
16996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetTimeZone",             "(JJ[BZ)V",                              (void*)nScriptSetTimeZone },
17006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptInvoke",                  "(JJIZ)V",                               (void*)nScriptInvoke },
17016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptInvokeV",                 "(JJI[BZ)V",                             (void*)nScriptInvokeV },
17026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEach",                 "(JJJIJJZ)V",                            (void*)nScriptForEach },
17036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEach",                 "(JJJIJJ[BZ)V",                          (void*)nScriptForEachV },
17046f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEachClipped",          "(JJJIJJIIIIIIZ)V",                      (void*)nScriptForEachClipped },
17056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEachClipped",          "(JJJIJJ[BIIIIIIZ)V",                    (void*)nScriptForEachClippedV },
17066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarI",                 "(JJIIZ)V",                              (void*)nScriptSetVarI },
17076f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarJ",                 "(JJIJZ)V",                              (void*)nScriptSetVarJ },
17086f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarF",                 "(JJIFZ)V",                              (void*)nScriptSetVarF },
17096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarD",                 "(JJIDZ)V",                              (void*)nScriptSetVarD },
17106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarV",                 "(JJI[BZ)V",                             (void*)nScriptSetVarV },
17116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarVE",                "(JJI[BJ[IZ)V",                          (void*)nScriptSetVarVE },
17126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarObj",               "(JJIJZ)V",                              (void*)nScriptSetVarObj },
1713bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1714bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptCCreate",                 "(JLjava/lang/String;Ljava/lang/String;[BI)J",  (void*)nScriptCCreate },
17156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptIntrinsicCreate",         "(JIJZ)J",                               (void*)nScriptIntrinsicCreate },
17166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptKernelIDCreate",          "(JJIIZ)J",                              (void*)nScriptKernelIDCreate },
1717086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni{"rsnScriptInvokeIDCreate",          "(JJI)J",                                (void*)nScriptInvokeIDCreate },
17186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptFieldIDCreate",           "(JJIZ)J",                               (void*)nScriptFieldIDCreate },
1719bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupCreate",             "(J[J[J[J[J[J)J",                        (void*)nScriptGroupCreate },
1720b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnScriptGroup2Create",            "(JLjava/lang/String;[J)J",              (void*)nScriptGroup2Create },
1721bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupSetInput",           "(JJJJ)V",                               (void*)nScriptGroupSetInput },
1722bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupSetOutput",          "(JJJJ)V",                               (void*)nScriptGroupSetOutput },
1723bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupExecute",            "(JJ)V",                                 (void*)nScriptGroupExecute },
1724b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnScriptGroup2Execute",           "(JJ)V",                                 (void*)nScriptGroup2Execute },
1725bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1726bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnSamplerCreate",                 "(JIIIIIF)J",                            (void*)nSamplerCreate },
1727c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1728bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnSystemGetPointerSize",          "()I",                                   (void*)nSystemGetPointerSize },
17296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
17306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Entry points for Inc libRSSupport
17316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"nIncLoadSO",                       "()Z",                                   (bool*)nIncLoadSO },
17326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"nIncDeviceCreate",                 "()J",                                   (void*)nIncDeviceCreate },
17336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"nIncDeviceDestroy",                "(J)V",                                  (void*)nIncDeviceDestroy },
17346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncContextCreate",              "(JIII)J",                               (void*)nIncContextCreate },
17356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncContextFinish",              "(J)V",                                  (void*)nIncContextFinish },
17366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncContextDestroy",             "(J)V",                                  (void*)nIncContextDestroy },
17376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncObjDestroy",                 "(JJ)V",                                 (void*)nIncObjDestroy },
17386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncElementCreate",              "(JJIZI)J",                              (void*)nIncElementCreate },
17396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncTypeCreate",                 "(JJIIIZZI)J",                           (void*)nIncTypeCreate },
17406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncAllocationCreateTyped",      "(JJJJ)J",                               (void*)nIncAllocationCreateTyped },
1741c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main};
1742c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1743c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// ---------------------------------------------------------------------------
1744c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1745c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainjint JNI_OnLoad(JavaVM* vm, void* reserved)
1746c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1747c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    JNIEnv* env = NULL;
1748257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    jclass clazz = NULL;
1749c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint result = -1;
1750c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1751c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
1752184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
1753184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "ERROR: GetEnv failed\n");
1754257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        goto bail;
1755257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
1756257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (env == NULL) {
1757184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "ERROR: env == NULL");
1758257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        goto bail;
1759257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
1760257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines
1761257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    clazz = env->FindClass(classPathName);
1762257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (clazz == NULL) {
1763c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto bail;
1764c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1765c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1766257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (env->RegisterNatives(clazz, methods, NELEM(methods)) < 0) {
1767184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
1768184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "ERROR: MediaPlayer native registration failed\n");
1769c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto bail;
1770c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1771c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1772c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    /* success -- return valid version number */
1773c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    result = JNI_VERSION_1_4;
1774c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1775c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainbail:
1776c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return result;
1777c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1778