android_renderscript_RenderScript.cpp revision e68c5973af1e80c77cab9aea0b77f46a801aef96
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,
3876be479e2c58a3ee7880f812f9b13970df8f7c529Miao Wang      (int*)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,
4206be479e2c58a3ee7880f812f9b13970df8f7c529Miao Wang      (int*)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
438e68c5973af1e80c77cab9aea0b77f46a801aef96Yang NinScriptGroup2Create(JNIEnv *_env, jobject _this, jlong con, jstring name,
439b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                    jstring cacheDir, jlongArray closureArray) {
440e68c5973af1e80c77cab9aea0b77f46a801aef96Yang Ni  AutoJavaStringToUTF8 nameUTF(_env, name);
441b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
442b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
443936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jlong* jClosures = _env->GetLongArrayElements(closureArray, nullptr);
444936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jsize numClosures = _env->GetArrayLength(closureArray);
445936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  RsClosure* closures = (RsClosure*)alloca(sizeof(RsClosure) * numClosures);
446936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  for (int i = 0; i < numClosures; i++) {
447936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni    closures[i] = (RsClosure)jClosures[i];
448936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
449936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
450b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  return (jlong)(uintptr_t)dispatchTab.ScriptGroup2Create(
451e68c5973af1e80c77cab9aea0b77f46a801aef96Yang Ni      (RsContext)con, nameUTF.c_str(), nameUTF.length(),
452e68c5973af1e80c77cab9aea0b77f46a801aef96Yang Ni      cacheDirUTF.c_str(), cacheDirUTF.length(),
453b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      closures, numClosures);
454b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang}
455b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
456b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wangstatic void
457b1c365bfb0566142c49375f09f2b8289182f1f47Miao WangnScriptGroup2Execute(JNIEnv *_env, jobject _this, jlong con, jlong groupID) {
458b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  dispatchTab.ScriptGroupExecute((RsContext)con, (RsScriptGroup2)groupID);
459936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni}
460936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
461c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
462bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj)
463c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
464bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj);
465bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ObjDestroy((RsContext)con, (void *)obj);
466c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
467c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
468c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// ---------------------------------------------------------------------------
469bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
470c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott MainnDeviceCreate(JNIEnv *_env, jobject _this)
471c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
472c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nDeviceCreate");
473bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)dispatchTab.DeviceCreate();
474c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
475c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
476c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
477bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev)
478c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
479c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nDeviceDestroy");
480470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    return dispatchTab.DeviceDestroy((RsDevice)dev);
481c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
482c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
483c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
484bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnDeviceSetConfig(JNIEnv *_env, jobject _this, jlong dev, jint p, jint value)
485c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
486c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nDeviceSetConfig  dev(%p), param(%i), value(%i)", (void *)dev, p, value);
487470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    return dispatchTab.DeviceSetConfig((RsDevice)dev, (RsDeviceParam)p, value);
488c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
489c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
490bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
491ecccf940f72679f7602c52b0b4bcb245acdad55bMiao WangnContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer,
492ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang               jint ct, jstring nativeLibDirJava)
493c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
494c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nContextCreate");
495ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    // Access the NativeLibDir in the Java Context.
496ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    const char * nativeLibDir = _env->GetStringUTFChars(nativeLibDirJava, JNI_FALSE);
497ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    size_t length = (size_t)_env->GetStringUTFLength(nativeLibDirJava);
498ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang
499ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    jlong id = (jlong)(uintptr_t)dispatchTab.ContextCreate((RsDevice)dev, ver,
500ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang                                                           sdkVer,
501ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang                                                           (RsContextType)ct, 0);
502ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    if (dispatchTab.SetNativeLibDir) {
503ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang        dispatchTab.SetNativeLibDir((RsContext)id, nativeLibDir, length);
504ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    }
505ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang
506ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    _env->ReleaseStringUTFChars(nativeLibDirJava, nativeLibDir);
507ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    return id;
508c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
509c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
510c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
511c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
512bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextSetPriority(JNIEnv *_env, jobject _this, jlong con, jint p)
513c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
514bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("ContextSetPriority, con(%p), priority(%i)", (RsContext)con, p);
515bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextSetPriority((RsContext)con, p);
516c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
517c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
518c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
519c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
520c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
521bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextDestroy(JNIEnv *_env, jobject _this, jlong con)
522c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
523bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextDestroy, con(%p)", (RsContext)con);
524bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextDestroy((RsContext)con);
525c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
526c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
527c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
528bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextDump(JNIEnv *_env, jobject _this, jlong con, jint bits)
529c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
530c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nContextDump, con(%p)  bits(%i)", (RsContext)con, bits);
531470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    dispatchTab.ContextDump((RsContext)con, bits);
532c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
533c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
534c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
535c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic jstring
536bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextGetErrorMessage(JNIEnv *_env, jobject _this, jlong con)
537c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
538bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextGetErrorMessage, con(%p)", (RsContext)con);
539c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    char buf[1024];
540c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
541c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t receiveLen;
542c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t subID;
543bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    int id = dispatchTab.ContextGetMessage((RsContext)con,
5446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           buf, sizeof(buf),
5456f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &receiveLen, sizeof(receiveLen),
5466f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &subID, sizeof(subID));
547c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (!id && receiveLen) {
548184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,
549184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "message receive buffer too small.  %zu", receiveLen);
550c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
551c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return _env->NewStringUTF(buf);
552c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
553c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
554c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic jint
555bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextGetUserMessage(JNIEnv *_env, jobject _this, jlong con, jintArray data)
556c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
557c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
558bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextGetMessage, con(%p), len(%i)", (RsContext)con, len);
559c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *ptr = _env->GetIntArrayElements(data, NULL);
560c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t receiveLen;
561c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t subID;
562bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    int id = dispatchTab.ContextGetMessage((RsContext)con,
5636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           ptr, len * 4,
5646f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &receiveLen, sizeof(receiveLen),
5656f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &subID, sizeof(subID));
566c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (!id && receiveLen) {
567184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,
568184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "message receive buffer too small.  %zu", receiveLen);
569c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
570c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseIntArrayElements(data, ptr, 0);
571bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jint)id;
572c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
573c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
574c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic jint
575bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextPeekMessage(JNIEnv *_env, jobject _this, jlong con, jintArray auxData)
576c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
577bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextPeekMessage, con(%p)", (RsContext)con);
578c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *auxDataPtr = _env->GetIntArrayElements(auxData, NULL);
579c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t receiveLen;
580c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t subID;
581bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    int id = dispatchTab.ContextPeekMessage((RsContext)con, &receiveLen, sizeof(receiveLen),
582c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                                  &subID, sizeof(subID));
583c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    auxDataPtr[0] = (jint)subID;
584c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    auxDataPtr[1] = (jint)receiveLen;
585c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseIntArrayElements(auxData, auxDataPtr, 0);
586bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jint)id;
587c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
588c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
589bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic void nContextInitToClient(JNIEnv *_env, jobject _this, jlong con)
590c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
591bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextInitToClient, con(%p)", (RsContext)con);
592bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextInitToClient((RsContext)con);
593c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
594c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
595bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic void nContextDeinitToClient(JNIEnv *_env, jobject _this, jlong con)
596c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
597bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextDeinitToClient, con(%p)", (RsContext)con);
598bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextDeinitToClient((RsContext)con);
599c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
600c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
601c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
602bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextSendMessage(JNIEnv *_env, jobject _this, jlong con, jint id, jintArray data)
603c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
604c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *ptr = NULL;
605c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = 0;
606c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (data) {
607c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        len = _env->GetArrayLength(data);
608c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        jint *ptr = _env->GetIntArrayElements(data, NULL);
609c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
610bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextSendMessage, con(%p), id(%i), len(%i)", (RsContext)con, id, len);
611bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextSendMessage((RsContext)con, id, (const uint8_t *)ptr, len * sizeof(int));
612c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (data) {
613c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
614c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
615c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
616c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
617c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
618c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
619bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
620086010500c28e2bca57ea583d3f38da9a2f2f414Yang NinElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind,
621086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni               jboolean norm, jint size)
622c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
623bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nElementCreate, con(%p), type(%i), kind(%i), norm(%i), size(%i)", (RsContext)con,
624bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            type, kind, norm, size);
625086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    return (jlong)(uintptr_t)dispatchTab.ElementCreate((RsContext)con,
626086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni                                                       (RsDataType)type,
627086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni                                                       (RsDataKind)kind,
628bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       norm, size);
629c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
630c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
631bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
632bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnElementCreate2(JNIEnv *_env, jobject _this, jlong con,
633bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                jlongArray _ids, jobjectArray _names, jintArray _arraySizes)
634c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
635c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    int fieldCount = _env->GetArrayLength(_ids);
636bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nElementCreate2, con(%p)", (RsContext)con);
637bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
638bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jIds = _env->GetLongArrayElements(_ids, NULL);
639bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint *jArraySizes = _env->GetIntArrayElements(_arraySizes, NULL);
640c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
641bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsElement *ids = (RsElement*)malloc(fieldCount * sizeof(RsElement));
642bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    uint32_t *arraySizes = (uint32_t *)malloc(fieldCount * sizeof(uint32_t));
643bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
644bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < fieldCount; i ++) {
645bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        ids[i] = (RsElement)jIds[i];
646bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        arraySizes[i] = (uint32_t)jArraySizes[i];
647bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
648c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
649c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringArrayToUTF8 names(_env, _names, fieldCount);
650c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
651c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    const char **nameArray = names.c_str();
652c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t *sizeArray = names.c_str_len();
653c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
6546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    jlong id = (jlong)(uintptr_t)dispatchTab.ElementCreate2((RsContext)con, (RsElement *)ids,
6556f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                            fieldCount, nameArray,
6566f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                            fieldCount * sizeof(size_t),  sizeArray,
6576f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                            (const uint32_t *)arraySizes, fieldCount);
658c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
659bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(ids);
660bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(arraySizes);
661bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_ids, jIds, JNI_ABORT);
662bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseIntArrayElements(_arraySizes, jArraySizes, JNI_ABORT);
663bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return id;
664c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
665c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
666c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
667c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
668bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
669c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
670bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnElementGetSubElements(JNIEnv *_env, jobject _this, jlong con, jlong id,
671bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                       jlongArray _IDs,
672c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                       jobjectArray _names,
673c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                       jintArray _arraySizes)
674c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
675bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    uint32_t dataSize = _env->GetArrayLength(_IDs);
676bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nElementGetSubElements, con(%p)", (RsContext)con);
677c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
678bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    uintptr_t *ids = (uintptr_t *)malloc(dataSize * sizeof(uintptr_t));
679c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    const char **names = (const char **)malloc((uint32_t)dataSize * sizeof(const char *));
680c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t *arraySizes = (uint32_t *)malloc((uint32_t)dataSize * sizeof(uint32_t));
681c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
682bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ElementGetSubElements((RsContext)con, (RsElement)id, ids, names, arraySizes,
683bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (uint32_t)dataSize);
684c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
685bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(uint32_t i = 0; i < dataSize; i++) {
686bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        const jlong id = (jlong)(uintptr_t)ids[i];
687bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        const jint arraySize = (jint)arraySizes[i];
688c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i]));
689bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        _env->SetLongArrayRegion(_IDs, i, 1, &id);
690bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        _env->SetIntArrayRegion(_arraySizes, i, 1, &arraySize);
691c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
692c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
693c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    free(ids);
694c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    free(names);
695c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    free(arraySizes);
696c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
697c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
698c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
699c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
700bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
701bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid,
702c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv)
703c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
704c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)",
705bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, eid, dimx, dimy, dimz, mips, faces, yuv);
706c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
707bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)dispatchTab.TypeCreate((RsContext)con, (RsElement)eid, dimx, dimy,
708bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                    dimz, mips, faces, yuv);
709c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
710c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
711c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
712c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
713bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
714bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mips, jint usage,
715bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                       jlong pointer)
716c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
717bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)",
718bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsElement)type, mips, usage, (void *)pointer);
719bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t) dispatchTab.AllocationCreateTyped((RsContext)con, (RsType)type,
720bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                (RsAllocationMipmapControl)mips,
721bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                (uint32_t)usage, (uintptr_t)pointer);
722c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
723c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
724c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
725bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationSyncAll(JNIEnv *_env, jobject _this, jlong con, jlong a, jint bits)
726c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
727bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationSyncAll, con(%p), a(%p), bits(0x%08x)", (RsContext)con, (RsAllocation)a, bits);
728bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationSyncAll((RsContext)con, (RsAllocation)a, (RsAllocationUsageType)bits);
729c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
730c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
731c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
732bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationSetSurface(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject sur)
733dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang{
734bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    ioDispatch.sAllocationSetSurface(_env, _this, (RsContext)con, (RsAllocation)alloc, sur, dispatchTab);
735dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang}
736dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang
737dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wangstatic void
738bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationIoSend(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
739dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang{
740bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationIoSend((RsContext)con, (RsAllocation)alloc);
741dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang}
742dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang
743dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wangstatic void
744bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
745c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
746bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationGenerateMipmaps, con(%p), a(%p)", (RsContext)con, (RsAllocation)alloc);
747bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationGenerateMipmaps((RsContext)con, (RsAllocation)alloc);
748c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
749c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
750c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic size_t GetBitmapSize(JNIEnv *env, jobject jbitmap) {
751c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmapInfo info;
752c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    memset(&info, 0, sizeof(info));
753c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_getInfo(env, jbitmap, &info);
754c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t s = info.width * info.height;
755c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    switch (info.format) {
756c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        case ANDROID_BITMAP_FORMAT_RGBA_8888: s *= 4; break;
757c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        case ANDROID_BITMAP_FORMAT_RGB_565: s *= 2; break;
758c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        case ANDROID_BITMAP_FORMAT_RGBA_4444: s *= 2; break;
759c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
760c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return s;
761c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
762c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
763bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
764bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,
765bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                            jobject jbitmap, jint usage)
766c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
767bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = 0;
768257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    void *pixels = NULL;
769257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
770c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
771257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (pixels != NULL) {
772bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        id = (jlong)(uintptr_t)dispatchTab.AllocationCreateFromBitmap((RsContext)con,
773bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      (RsType)type,
774bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      (RsAllocationMipmapControl)mip,
775bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      pixels,
776bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      GetBitmapSize(_env, jbitmap),
777bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      usage);
778257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        AndroidBitmap_unlockPixels(_env, jbitmap);
779257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
780c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
781c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
782c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
783bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
784bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCreateBitmapBackedAllocation(JNIEnv *_env, jobject _this, jlong con, jlong type,
785bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                        jint mip, jobject jbitmap, jint usage)
786c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
787bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = 0;
788257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    void *pixels = NULL;
789257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
790c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
791257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (pixels != NULL) {
792bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        id = (jlong)(uintptr_t)dispatchTab.AllocationCreateTyped((RsContext)con,
793bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (RsType)type,
794bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (RsAllocationMipmapControl)mip,
795bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (uint32_t)usage,
796bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (uintptr_t)pixels);
797257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        AndroidBitmap_unlockPixels(_env, jbitmap);
798257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
799c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
800c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
801c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
802bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
803bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type,
804bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                jint mip, jobject jbitmap, jint usage)
805c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
806c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    void *pixels = NULL;
807c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
808c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
809bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = 0;
810c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (pixels != NULL) {
811bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        id = (jlong)(uintptr_t)dispatchTab.AllocationCubeCreateFromBitmap((RsContext)con,
812bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          (RsType)type,
813bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          (RsAllocationMipmapControl)mip,
814bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          pixels,
815bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          GetBitmapSize(_env, jbitmap),
816bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          usage);
817c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        AndroidBitmap_unlockPixels(_env, jbitmap);
818c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
819c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
820c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
821c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
822c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
823bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
824c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
825c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmapInfo info;
826c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    memset(&info, 0, sizeof(info));
827c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_getInfo(_env, jbitmap, &info);
828c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
829c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    void *pixels = NULL;
830c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
831c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
832c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (pixels != NULL) {
833bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dispatchTab.Allocation2DData((RsContext)con, (RsAllocation)alloc, 0, 0, 0,
834bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                     RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, info.width,
835bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                     info.height, pixels, GetBitmapSize(_env, jbitmap), 0);
836c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        AndroidBitmap_unlockPixels(_env, jbitmap);
837c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
838c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
839c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
840c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
841bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCopyToBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
842c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
843c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmapInfo info;
844c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    memset(&info, 0, sizeof(info));
845c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_getInfo(_env, jbitmap, &info);
846c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
847c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    void *pixels = NULL;
848c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
849c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
850c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (pixels != NULL) {
851bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dispatchTab.AllocationCopyToBitmap((RsContext)con, (RsAllocation)alloc, pixels,
852bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                           GetBitmapSize(_env, jbitmap));
853c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        AndroidBitmap_unlockPixels(_env, jbitmap);
854c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
855c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    //bitmap.notifyPixelsChanged();
856c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
857c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
8588352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Java object data into the Allocation pointed to by _alloc.
859c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
8608352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
8612e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint count, jobject data, jint sizeBytes, jint dataType, jint mSize,
8622e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jboolean usePadding)
863c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
8648352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
8658352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation1DData, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
8668352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            "dataType(%i)", (RsContext)con, (RsAllocation)alloc, offset, count, sizeBytes,
8678352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            dataType);
8682e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation1DData, true,
8692e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
870c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
871c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
872244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
873c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
874244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationElementData1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint xoff,
875244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                         jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
876c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
877c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
878244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    LOG_API("nAllocationElementData1D, con(%p), alloc(%p), xoff(%i), comp(%i), len(%i), "
879244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, compIdx, len,
880244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            sizeBytes);
881244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
882244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    dispatchTab.Allocation1DElementData((RsContext)con, (RsAllocation)alloc, xoff,
883244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                                        lod, ptr, sizeBytes, compIdx);
884c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
885c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
886c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
887244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang/*
888244b72fe088a6393f37dea49ff89cf9df738a492Miao Wangstatic void
889244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationElementData(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
890244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                       jint xoff, jint yoff, jint zoff,
891244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                       jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
892244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang{
893244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    jint len = _env->GetArrayLength(data);
894244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    LOG_API("nAllocationElementData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
895244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
896244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            sizeBytes);
897244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
898244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    dispatchTab.AllocationElementData((RsContext)con, (RsAllocation)alloc,
899244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                                      xoff, yoff, zoff,
900244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                                      lod, ptr, sizeBytes, compIdx);
901244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
902244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang}
903244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang*/
904244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
9058352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Java object data into the Allocation pointed to by _alloc.
906c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
9078352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
9082e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType, jint mSize,
9092e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jboolean usePadding)
910c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
9118352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
9128352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
9138352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation2DData, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
9148352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
9152e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h;
9162e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation2DData, true,
9172e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
918c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
919c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
920c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
921bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationData2D_alloc(JNIEnv *_env, jobject _this, jlong con,
922bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong dstAlloc, jint dstXoff, jint dstYoff,
923c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint dstMip, jint dstFace,
924c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint width, jint height,
925bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong srcAlloc, jint srcXoff, jint srcYoff,
926c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint srcMip, jint srcFace)
927c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
928c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nAllocation2DData_s, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
929c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " dstMip(%i), dstFace(%i), width(%i), height(%i),"
930c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i), srcFace(%i)",
931bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
932c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
933c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
934bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationCopy2DRange((RsContext)con,
935bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)dstAlloc,
936bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      dstXoff, dstYoff,
937bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      dstMip, dstFace,
938bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      width, height,
939bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)srcAlloc,
940bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      srcXoff, srcYoff,
941bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      srcMip, srcFace);
942c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
943c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
9448352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Java object data into the Allocation pointed to by _alloc.
945c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
9468352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
9472e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jint d, jobject data, jint sizeBytes, jint dataType,
9482e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
949c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
9508352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
9518352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation3DData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
9528352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
9538352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            lod, w, h, d, sizeBytes);
9542e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h * d;
9552e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation3DData, true,
9562e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
957c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
958c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
959c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
960bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationData3D_alloc(JNIEnv *_env, jobject _this, jlong con,
961bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong dstAlloc, jint dstXoff, jint dstYoff, jint dstZoff,
962c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint dstMip,
963c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint width, jint height, jint depth,
964bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong srcAlloc, jint srcXoff, jint srcYoff, jint srcZoff,
965c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint srcMip)
966c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
967c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nAllocationData3D_alloc, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
968c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " dstMip(%i), width(%i), height(%i),"
969c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i)",
970bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
971c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
972c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
973bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationCopy3DRange((RsContext)con,
974bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)dstAlloc,
975bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      dstXoff, dstYoff, dstZoff, dstMip,
976bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      width, height, depth,
977bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)srcAlloc,
978bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      srcXoff, srcYoff, srcZoff, srcMip);
979bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang}
980bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
9818352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
982bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic void
9832e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao WangnAllocationRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jobject data, jint dataType,
9842e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                jint mSize, jboolean usePadding)
985bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{
9868352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
9878352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocationRead, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
9882e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = 0;
9892e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(0, dispatchTab.AllocationRead, false,
9902e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, ptr, len * typeBytes);
991c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
992c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
9938352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
994c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
9958352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationRead1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
9962e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint count, jobject data, jint sizeBytes, jint dataType,
9972e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
998c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
9998352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
10008352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation1DRead, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
10018352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang              "dataType(%i)", (RsContext)con, alloc, offset, count, sizeBytes, dataType);
10022e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(0, dispatchTab.Allocation1DRead, false,
10032e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
1004c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1005c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1006244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang// Copies from the Element in the Allocation pointed to by _alloc into the Java array data.
1007244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang/*
1008244b72fe088a6393f37dea49ff89cf9df738a492Miao Wangstatic void
1009244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationElementRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc,
1010244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                       jint xoff, jint yoff, jint zoff,
10113bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang                       jint lod, jint compIdx, jobject data, jint sizeBytes)
1012244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang{
10133bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    jint len = _env->GetArrayLength(data);
10143bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    LOG_API("nAllocationElementRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
10153bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang            "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
10163bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang            sizeBytes);
10173bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
10183bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    dispatchTab.AllocationElementRead((RsContext)con, (RsAllocation)alloc,
10193bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang                                      xoff, yoff, zoff,
10203bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang                                      lod, ptr, sizeBytes, compIdx);
10213bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1022244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang}
1023244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang*/
1024244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
10258352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1026c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
10278352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
10282e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType,
10292e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
1030c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
10318352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
10328352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
10338352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation2DRead, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
10348352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang              "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
10352e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h;
10362e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(0, dispatchTab.Allocation2DRead, false,
10372e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
1038c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1039c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1040244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1041244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang/*
1042244b72fe088a6393f37dea49ff89cf9df738a492Miao Wangstatic void
1043244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationRead3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
10442e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jint d, jobject data, int sizeBytes, int dataType,
10452e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
1046244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang{
1047244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
1048244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    LOG_API("nAllocation3DRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
1049244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
1050244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            lod, w, h, d, sizeBytes);
10512e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h * d;
10522e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation3DRead, false,
10532e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
1054244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang}
1055244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang*/
1056244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
1057bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1058bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationGetType(JNIEnv *_env, jobject _this, jlong con, jlong a)
1059c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1060bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationGetType, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
1061bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t) dispatchTab.AllocationGetType((RsContext)con, (RsAllocation)a);
1062c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1063c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1064c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1065bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationResize1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint dimX)
1066c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1067bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", (RsContext)con,
1068bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsAllocation)alloc, dimX);
1069bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationResize1D((RsContext)con, (RsAllocation)alloc, dimX);
1070c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1071c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1072c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
1073c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1074c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
10756f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptBindAllocation(JNIEnv *_env, jobject _this, jlong con, jlong script, jlong alloc, jint slot, jboolean mUseInc)
1076c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1077bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)",
1078bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
10796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
10806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
10816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
10826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
10836f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1084c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1085c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1086c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
10876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jint val, jboolean mUseInc)
1088c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1089bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con,
1090bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
10916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
10926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarI((RsContext)con, (RsScript)script, slot, val);
10936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
10946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarI((RsContext)con, (RsScript)script, slot, val);
10956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1096c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1097c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1098c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
10996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarObj(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val, jboolean mUseInc)
1100c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1101bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con,
1102bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
11036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
11046f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val);
11056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
11066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val);
11076f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1108c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1109c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1110c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
11116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val, jboolean mUseInc)
1112c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1113bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%lli)", (RsContext)con,
1114bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
11156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
11166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarJ((RsContext)con, (RsScript)script, slot, val);
11176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
11186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarJ((RsContext)con, (RsScript)script, slot, val);
11196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1120c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1121c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1122c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
11236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, float val, jboolean mUseInc)
1124c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1125bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", (RsContext)con,
1126bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
11276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
11286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarF((RsContext)con, (RsScript)script, slot, val);
11296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
11306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarF((RsContext)con, (RsScript)script, slot, val);
11316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1132c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1133c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1134c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
11356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, double val, jboolean mUseInc)
1136c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1137bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", (RsContext)con,
1138bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
11396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
11406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarD((RsContext)con, (RsScript)script, slot, val);
11416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
11426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarD((RsContext)con, (RsScript)script, slot, val);
11436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1144c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1145c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1146c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
11476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data, jboolean mUseInc)
1148c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1149bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1150c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
1151c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
11526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
11536f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
11546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
11556f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
11566f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1157c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1158c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1159c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1160c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1161bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptSetVarVE(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data,
11626f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                jlong elem, jintArray dims, jboolean mUseInc)
1163c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1164bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarVE, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1165c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
1166c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
1167c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint dimsLen = _env->GetArrayLength(dims) * sizeof(int);
1168c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *dimsPtr = _env->GetIntArrayElements(dims, NULL);
11696f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
11706f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem,
11716f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                      (const uint32_t *)dimsPtr, dimsLen);
11726f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
11736f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem,
11746f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                   (const uint32_t *)dimsPtr, dimsLen);
11756f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1176c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1177c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseIntArrayElements(dims, dimsPtr, JNI_ABORT);
1178c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1179c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1180c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1181c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
11826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetTimeZone(JNIEnv *_env, jobject _this, jlong con, jlong script, jbyteArray timeZone, jboolean mUseInc)
1183c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1184bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptCSetTimeZone, con(%p), s(%p), timeZone(%s)", (RsContext)con,
1185bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, (const char *)timeZone);
1186c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1187c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint length = _env->GetArrayLength(timeZone);
1188c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte* timeZone_ptr;
1189c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0);
11906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
11916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length);
11926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
11936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length);
11946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1195c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1196c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (timeZone_ptr) {
1197c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0);
1198c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1199c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1200c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1201c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptInvoke(JNIEnv *_env, jobject _this, jlong con, jlong obj, jint slot, jboolean mUseInc)
1203c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1204bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptInvoke, con(%p), script(%p)", (RsContext)con, (void *)obj);
12056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
12066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptInvoke((RsContext)con, (RsScript)obj, slot);
12076f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
12086f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptInvoke((RsContext)con, (RsScript)obj, slot);
12096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1210c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1211c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1212c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptInvokeV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data, jboolean mUseInc)
1214c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1215bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptInvokeV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1216c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
1217c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
12186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
12196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len);
12206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
12216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len);
12226f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1223c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1224c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1225c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1226c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEach(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
12286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang               jlong script, jint slot, jlong ain, jlong aout, jboolean mUseInc)
1229c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1230bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
12316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
12326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
12336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
12346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
12356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     NULL, 0, NULL, 0);
12366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
12376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
12386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
12396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  NULL, 0, NULL, 0);
12406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1241c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1242c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEachV(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
12446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                jlong script, jint slot, jlong ain, jlong aout, jbyteArray params, jboolean mUseInc)
1245c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1246bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1247c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(params);
1248c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(params, NULL);
12496f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
12506f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
12516f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
12526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
12536f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     ptr, len, NULL, 0);
12546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
12556f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
12566f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
12576f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  ptr, len, NULL, 0);
12586f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1259c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT);
1260c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1261c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1262c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEachClipped(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
1264bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                      jlong script, jint slot, jlong ain, jlong aout,
1265c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                      jint xstart, jint xend,
12666f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                      jint ystart, jint yend, jint zstart, jint zend, jboolean mUseInc)
1267c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1268bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEachClipped, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1269c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    RsScriptCall sc;
1270c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xStart = xstart;
1271c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xEnd = xend;
1272c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yStart = ystart;
1273c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yEnd = yend;
1274c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zStart = zstart;
1275c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zEnd = zend;
1276c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
1277c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayStart = 0;
1278c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayEnd = 0;
12796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
12806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
12816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
12826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
12836f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     NULL, 0, &sc, sizeof(sc));
12846f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
12856f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
12866f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
12876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  NULL, 0, &sc, sizeof(sc));
12886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1289c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1290c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1291c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEachClippedV(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
1293bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                       jlong script, jint slot, jlong ain, jlong aout,
1294c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                       jbyteArray params, jint xstart, jint xend,
12956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                       jint ystart, jint yend, jint zstart, jint zend, jboolean mUseInc)
1296c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1297bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEachClipped, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1298c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(params);
1299c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(params, NULL);
1300c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    RsScriptCall sc;
1301c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xStart = xstart;
1302c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xEnd = xend;
1303c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yStart = ystart;
1304c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yEnd = yend;
1305c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zStart = zstart;
1306c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zEnd = zend;
1307c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
1308c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayStart = 0;
1309c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayEnd = 0;
13106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
13116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
13126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
13136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
13146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     ptr, len, &sc, sizeof(sc));
13156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
13166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
13176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
13186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  ptr, len, &sc, sizeof(sc));
13196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1320c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT);
1321c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1322c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1323c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
1324c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1325bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1326bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptCCreate(JNIEnv *_env, jobject _this, jlong con,
1327c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main               jstring resName, jstring cacheDir,
1328c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main               jbyteArray scriptRef, jint length)
1329c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1330bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptCCreate, con(%p)", (RsContext)con);
1331c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1332c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringToUTF8 resNameUTF(_env, resName);
1333c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
1334bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong ret = 0;
1335c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte* script_ptr = NULL;
1336c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint _exception = 0;
1337c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint remaining;
1338c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (!scriptRef) {
1339c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _exception = 1;
1340c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null");
1341c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto exit;
1342c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1343c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (length < 0) {
1344c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _exception = 1;
1345c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0");
1346c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto exit;
1347c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1348c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    remaining = _env->GetArrayLength(scriptRef);
1349c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (remaining < length) {
1350c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _exception = 1;
1351c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //jniThrowException(_env, "java/lang/IllegalArgumentException",
1352c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //        "length > script.length - offset");
1353c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto exit;
1354c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1355c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    script_ptr = (jbyte *)
1356c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0);
1357c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1358c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    //rsScriptCSetText(con, (const char *)script_ptr, length);
1359c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1360bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    ret = (jlong)(uintptr_t)dispatchTab.ScriptCCreate((RsContext)con,
1361bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                      resNameUTF.c_str(), resNameUTF.length(),
1362bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                      cacheDirUTF.c_str(), cacheDirUTF.length(),
1363bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                      (const char *)script_ptr, length);
1364c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1365c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainexit:
1366c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (script_ptr) {
1367c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr,
1368c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                _exception ? JNI_ABORT: 0);
1369c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1370c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1371bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)ret;
1372c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1373c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1374bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
13756f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptIntrinsicCreate(JNIEnv *_env, jobject _this, jlong con, jint id, jlong eid, jboolean mUseInc)
1376c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1377bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptIntrinsicCreate, con(%p) id(%i) element(%p)", (RsContext)con, id, (void *)eid);
13786f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
13796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTabInc.ScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
13806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
13816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTab.ScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
13826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1383c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1384c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1385bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
13866f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptKernelIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jint sig, jboolean mUseInc)
1387c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1388bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptKernelIDCreate, con(%p) script(%p), slot(%i), sig(%i)", (RsContext)con,
1389bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)sid, slot, sig);
13906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
13916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTabInc.ScriptKernelIDCreate((RsContext)con, (RsScript)sid,
13926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                                     slot, sig);
13936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
13946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTab.ScriptKernelIDCreate((RsContext)con, (RsScript)sid,
13956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                                  slot, sig);
13966f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1397c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1398c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1399bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1400086010500c28e2bca57ea583d3f38da9a2f2f414Yang NinScriptInvokeIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
1401086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni{
1402086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    LOG_API("nScriptInvokeIDCreate, con(%p) script(%p), slot(%i), sig(%i)", con,
1403086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni            (void *)sid, slot);
1404086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    return (jlong)dispatchTab.ScriptInvokeIDCreate((RsContext)con, (RsScript)sid, slot);
1405086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni}
1406086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni
1407086010500c28e2bca57ea583d3f38da9a2f2f414Yang Nistatic jlong
14086f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptFieldIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jboolean mUseInc)
1409c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1410bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptFieldIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con, (void *)sid, slot);
14116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTabInc.ScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
14136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
14146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTab.ScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
14156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1416c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1417c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1418bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1419bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _kernels, jlongArray _src,
1420bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlongArray _dstk, jlongArray _dstf, jlongArray _types)
1421bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{
1422bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupCreate, con(%p)", (RsContext)con);
1423bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1424bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint kernelsLen = _env->GetArrayLength(_kernels);
1425bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jKernelsPtr = _env->GetLongArrayElements(_kernels, nullptr);
1426bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsScriptKernelID* kernelsPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * kernelsLen);
1427bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < kernelsLen; ++i) {
1428bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        kernelsPtr[i] = (RsScriptKernelID)jKernelsPtr[i];
1429bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1430bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1431bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint srcLen = _env->GetArrayLength(_src);
1432bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jSrcPtr = _env->GetLongArrayElements(_src, nullptr);
1433bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsScriptKernelID* srcPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * srcLen);
1434bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < srcLen; ++i) {
1435bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        srcPtr[i] = (RsScriptKernelID)jSrcPtr[i];
1436bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1437bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1438bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint dstkLen = _env->GetArrayLength(_dstk);
1439bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jDstkPtr = _env->GetLongArrayElements(_dstk, nullptr);
1440bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsScriptKernelID* dstkPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstkLen);
1441bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < dstkLen; ++i) {
1442bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dstkPtr[i] = (RsScriptKernelID)jDstkPtr[i];
1443bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1444bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1445bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint dstfLen = _env->GetArrayLength(_dstf);
1446bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jDstfPtr = _env->GetLongArrayElements(_dstf, nullptr);
1447bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsScriptKernelID* dstfPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstfLen);
1448bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < dstfLen; ++i) {
1449bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dstfPtr[i] = (RsScriptKernelID)jDstfPtr[i];
1450bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1451bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1452bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint typesLen = _env->GetArrayLength(_types);
1453bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jTypesPtr = _env->GetLongArrayElements(_types, nullptr);
1454bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsType* typesPtr = (RsType*) malloc(sizeof(RsType) * typesLen);
1455bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < typesLen; ++i) {
1456bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        typesPtr[i] = (RsType)jTypesPtr[i];
1457bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1458bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1459bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = (jlong)(uintptr_t) dispatchTab.ScriptGroupCreate((RsContext)con,
1460bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptKernelID *)kernelsPtr, kernelsLen * sizeof(RsScriptKernelID),
1461bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptKernelID *)srcPtr, srcLen * sizeof(RsScriptKernelID),
1462bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptKernelID *)dstkPtr, dstkLen * sizeof(RsScriptKernelID),
1463bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptFieldID *)dstfPtr, dstfLen * sizeof(RsScriptKernelID),
1464bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsType *)typesPtr, typesLen * sizeof(RsType));
1465bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1466bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(kernelsPtr);
1467bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(srcPtr);
1468bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(dstkPtr);
1469bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(dstfPtr);
1470bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(typesPtr);
1471bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_kernels, jKernelsPtr, 0);
1472bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_src, jSrcPtr, 0);
1473bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_dstk, jDstkPtr, 0);
1474bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_dstf, jDstfPtr, 0);
1475bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_types, jTypesPtr, 0);
1476c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
1477c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1478c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1479c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1480bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupSetInput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
1481c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1482bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupSetInput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
1483bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)gid, (void *)kid, (void *)alloc);
1484bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ScriptGroupSetInput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid,
1485bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                    (RsAllocation)alloc);
1486c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1487c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1488c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1489bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupSetOutput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
1490c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1491bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupSetOutput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
1492bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)gid, (void *)kid, (void *)alloc);
1493bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ScriptGroupSetOutput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid,
1494bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                     (RsAllocation)alloc);
1495c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1496c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1497c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1498bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupExecute(JNIEnv *_env, jobject _this, jlong con, jlong gid)
1499c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1500bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupSetOutput, con(%p) group(%p)", (RsContext)con, (void *)gid);
1501bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ScriptGroupExecute((RsContext)con, (RsScriptGroup)gid);
1502c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1503c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1504c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// ---------------------------------------------------------------------------
1505c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1506bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1507bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnSamplerCreate(JNIEnv *_env, jobject _this, jlong con, jint magFilter, jint minFilter,
1508c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main               jint wrapS, jint wrapT, jint wrapR, jfloat aniso)
1509c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1510bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nSamplerCreate, con(%p)", (RsContext)con);
1511bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)dispatchTab.SamplerCreate((RsContext)con,
1512bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)magFilter,
1513bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)minFilter,
1514bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)wrapS,
1515bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)wrapT,
1516bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)wrapR,
1517bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       aniso);
1518bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang}
1519bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1520bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jint
1521bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnSystemGetPointerSize(JNIEnv *_env, jobject _this) {
1522bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jint)sizeof(void*);
1523c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1524c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
15256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// ---------------------------------------------------------------------------
15266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// For Incremental Intrinsic Support
15276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic bool nIncLoadSO() {
15286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    void* handle = NULL;
15296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    handle = dlopen("libRSSupport.so", RTLD_LAZY | RTLD_LOCAL);
15306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (handle == NULL) {
15316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        LOG_API("couldn't dlopen %s, %s", filename, dlerror());
15326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return false;
15336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
15346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
15356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (loadSymbols(handle, dispatchTabInc) == false) {
15366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        LOG_API("%s init failed!", filename);
15376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return false;
15386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
15396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("Successfully loaded %s", filename);
15406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return true;
15416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
15426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
15436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
15446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// To create/destroy a dummy context
15456f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
15466f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj)
15476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
15486f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj);
15496f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    dispatchTabInc.ObjDestroy((RsContext)con, (void *)obj);
15506f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
15516f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
15526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
15536f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
15546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncDeviceCreate(JNIEnv *_env, jobject _this)
15556f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
15566f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nDeviceCreate");
15576f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.DeviceCreate();
15586f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
15596f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
15606f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
15616f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev)
15626f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
15636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nDeviceDestroy");
15646f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return dispatchTabInc.DeviceDestroy((RsDevice)dev);
15656f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
15666f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
15676f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
15686f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer, jint ct)
15696f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
15706f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nContextCreate");
15716f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    //The compat context for incremental support will be synchronous.
15726f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.ContextCreate((RsDevice)dev, ver, sdkVer,
15736f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                          (RsContextType)ct,
15746f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                          RS_CONTEXT_SYNCHRONOUS);
15756f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
15766f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
15776f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
15786f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncContextFinish(JNIEnv *_env, jobject _this, jlong con)
15796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
15806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nContextFinish, con(%p)", (RsContext)con);
15816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    dispatchTabInc.ContextFinish((RsContext)con);
15826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
15836f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
15846f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
15856f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncContextDestroy(JNIEnv *_env, jobject _this, jlong con)
15866f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
15876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nContextDestroy, con(%p)", (RsContext)con);
15886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    dispatchTabInc.ContextDestroy((RsContext)con);
15896f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
15906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
15916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
15926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Create dummy Element
15936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
15946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind, jboolean norm, jint size)
15956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
15966f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nElementCreate, con(%p), type(%i), kind(%i), norm(%i), size(%i)", (RsContext)con,
15976f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            type, kind, norm, size);
15986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.ElementCreate((RsContext)con, (RsDataType)type,
15996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                          (RsDataKind)kind, norm, size);
16006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
16016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
16026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Create dummy Type
16036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
16046f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid,
16056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv)
16066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
16076f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)",
16086f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            incCon, eid, dimx, dimy, dimz, mips, faces, yuv);
16096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
16106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.TypeCreate((RsContext)con, (RsElement)eid, dimx, dimy,
16116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                       dimz, mips, faces, yuv);
16126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
16136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
16146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
16156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Create Allocation from pointer
16166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
16176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong alloc, jlong type)
16186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
16196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)",
16206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            incCon, (RsElement)type, mips, usage, (void *)pointer);
16216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    size_t strideIn;
16226f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    void* pIn = NULL;
16236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    RsAllocation ainI = NULL;
16246f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (alloc != 0) {
16256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        pIn = dispatchTab.AllocationGetPointer((RsContext)con, (RsAllocation)alloc, 0,
16266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                               RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 0, 0,
16276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                               &strideIn, sizeof(size_t));
16286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        ainI = dispatchTabInc.AllocationCreateTyped((RsContext)incCon, (RsType)type,
16296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                    RS_ALLOCATION_MIPMAP_NONE,
16306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                    RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_SHARED,
16316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                    (uintptr_t)pIn);
16326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
16336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t) ainI;
16346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
1635c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
16362e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang// ---------------------------------------------------------------------------
1637c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1638bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1639c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic const char *classPathName = "android/support/v8/renderscript/RenderScript";
1640c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1641c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic JNINativeMethod methods[] = {
16427c0de6383be18a1dae1297c54c56f3d9afbeaaadMiao Wang{"nLoadSO",                        "(ZI)Z",                                   (bool*)nLoadSO },
1643dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang{"nLoadIOSO",                      "()Z",                                     (bool*)nLoadIOSO },
1644bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nDeviceCreate",                  "()J",                                     (void*)nDeviceCreate },
1645bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nDeviceDestroy",                 "(J)V",                                    (void*)nDeviceDestroy },
1646bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nDeviceSetConfig",               "(JII)V",                                  (void*)nDeviceSetConfig },
1647bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextGetUserMessage",         "(J[I)I",                                  (void*)nContextGetUserMessage },
1648bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextGetErrorMessage",        "(J)Ljava/lang/String;",                   (void*)nContextGetErrorMessage },
1649bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextPeekMessage",            "(J[I)I",                                  (void*)nContextPeekMessage },
1650bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextInitToClient",           "(J)V",                                    (void*)nContextInitToClient },
1651bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextDeinitToClient",         "(J)V",                                    (void*)nContextDeinitToClient },
1652c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1653c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1654c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// All methods below are thread protected in java.
1655ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang{"rsnContextCreate",                 "(JIIILjava/lang/String;)J",             (void*)nContextCreate },
1656bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextFinish",                 "(J)V",                                  (void*)nContextFinish },
1657bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextSetPriority",            "(JI)V",                                 (void*)nContextSetPriority },
1658bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextDestroy",                "(J)V",                                  (void*)nContextDestroy },
1659bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextDump",                   "(JI)V",                                 (void*)nContextDump },
1660bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextSendMessage",            "(JI[I)V",                               (void*)nContextSendMessage },
1661b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnClosureCreate",                 "(JJJ[J[J[I[J[J)J",                      (void*)nClosureCreate },
1662b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnInvokeClosureCreate",           "(JJ[B[J[J[I)J",                         (void*)nInvokeClosureCreate },
1663b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnClosureSetArg",                 "(JJIJI)V",                              (void*)nClosureSetArg },
1664b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnClosureSetGlobal",              "(JJJJI)V",                              (void*)nClosureSetGlobal },
1665bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnObjDestroy",                    "(JJ)V",                                 (void*)nObjDestroy },
1666bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1667bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnElementCreate",                 "(JJIZI)J",                              (void*)nElementCreate },
1668bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnElementCreate2",                "(J[J[Ljava/lang/String;[I)J",           (void*)nElementCreate2 },
1669bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnElementGetSubElements",         "(JJ[J[Ljava/lang/String;[I)V",          (void*)nElementGetSubElements },
1670bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1671bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnTypeCreate",                    "(JJIIIZZI)J",                           (void*)nTypeCreate },
1672bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1673bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCreateTyped",         "(JJIIJ)J",                              (void*)nAllocationCreateTyped },
1674bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCreateFromBitmap",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateFromBitmap },
1675bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCreateBitmapBackedAllocation",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateBitmapBackedAllocation },
1676bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCubeCreateFromBitmap","(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCubeCreateFromBitmap },
1677bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1678bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCopyFromBitmap",      "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyFromBitmap },
1679bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCopyToBitmap",        "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyToBitmap },
1680bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1681bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationSyncAll",             "(JJI)V",                                (void*)nAllocationSyncAll },
1682bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationSetSurface",          "(JJLandroid/view/Surface;)V",           (void*)nAllocationSetSurface },
1683bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationIoSend",              "(JJ)V",                                 (void*)nAllocationIoSend },
16842e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationData1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationData1D },
1685bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationElementData1D",       "(JJIII[BI)V",                           (void*)nAllocationElementData1D },
1686244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang//{"rsnAllocationElementData",         "(JJIIIII[BI)V",                         (void*)nAllocationElementData },
16872e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationData2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationData2D },
1688bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationData2D",              "(JJIIIIIIJIIII)V",                      (void*)nAllocationData2D_alloc },
16892e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationData3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",    (void*)nAllocationData3D },
1690bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationData3D",              "(JJIIIIIIIJIIII)V",                     (void*)nAllocationData3D_alloc },
16912e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationRead",                "(JJLjava/lang/Object;IIZ)V",            (void*)nAllocationRead },
16922e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationRead1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationRead1D },
16933bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang//{"rsnAllocationElementRead",         "(JJIIIII[BI)V",                         (void*)nAllocationElementRead },
16942e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationRead2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationRead2D },
16952e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang//{"rsnAllocationRead3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",  (void*)nAllocationRead3D },
1696bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationGetType",             "(JJ)J",                                 (void*)nAllocationGetType},
1697bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationResize1D",            "(JJI)V",                                (void*)nAllocationResize1D },
1698bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationGenerateMipmaps",     "(JJ)V",                                 (void*)nAllocationGenerateMipmaps },
1699bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
17006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptBindAllocation",          "(JJJIZ)V",                              (void*)nScriptBindAllocation },
17016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetTimeZone",             "(JJ[BZ)V",                              (void*)nScriptSetTimeZone },
17026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptInvoke",                  "(JJIZ)V",                               (void*)nScriptInvoke },
17036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptInvokeV",                 "(JJI[BZ)V",                             (void*)nScriptInvokeV },
17046f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEach",                 "(JJJIJJZ)V",                            (void*)nScriptForEach },
17056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEach",                 "(JJJIJJ[BZ)V",                          (void*)nScriptForEachV },
17066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEachClipped",          "(JJJIJJIIIIIIZ)V",                      (void*)nScriptForEachClipped },
17076f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEachClipped",          "(JJJIJJ[BIIIIIIZ)V",                    (void*)nScriptForEachClippedV },
17086f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarI",                 "(JJIIZ)V",                              (void*)nScriptSetVarI },
17096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarJ",                 "(JJIJZ)V",                              (void*)nScriptSetVarJ },
17106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarF",                 "(JJIFZ)V",                              (void*)nScriptSetVarF },
17116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarD",                 "(JJIDZ)V",                              (void*)nScriptSetVarD },
17126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarV",                 "(JJI[BZ)V",                             (void*)nScriptSetVarV },
17136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarVE",                "(JJI[BJ[IZ)V",                          (void*)nScriptSetVarVE },
17146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarObj",               "(JJIJZ)V",                              (void*)nScriptSetVarObj },
1715bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1716bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptCCreate",                 "(JLjava/lang/String;Ljava/lang/String;[BI)J",  (void*)nScriptCCreate },
17176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptIntrinsicCreate",         "(JIJZ)J",                               (void*)nScriptIntrinsicCreate },
17186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptKernelIDCreate",          "(JJIIZ)J",                              (void*)nScriptKernelIDCreate },
1719086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni{"rsnScriptInvokeIDCreate",          "(JJI)J",                                (void*)nScriptInvokeIDCreate },
17206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptFieldIDCreate",           "(JJIZ)J",                               (void*)nScriptFieldIDCreate },
1721bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupCreate",             "(J[J[J[J[J[J)J",                        (void*)nScriptGroupCreate },
1722e68c5973af1e80c77cab9aea0b77f46a801aef96Yang Ni{"rsnScriptGroup2Create",            "(JLjava/lang/String;Ljava/lang/String;[J)J", (void*)nScriptGroup2Create },
1723bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupSetInput",           "(JJJJ)V",                               (void*)nScriptGroupSetInput },
1724bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupSetOutput",          "(JJJJ)V",                               (void*)nScriptGroupSetOutput },
1725bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupExecute",            "(JJ)V",                                 (void*)nScriptGroupExecute },
1726b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnScriptGroup2Execute",           "(JJ)V",                                 (void*)nScriptGroup2Execute },
1727bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1728bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnSamplerCreate",                 "(JIIIIIF)J",                            (void*)nSamplerCreate },
1729c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1730bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnSystemGetPointerSize",          "()I",                                   (void*)nSystemGetPointerSize },
17316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
17326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Entry points for Inc libRSSupport
17336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"nIncLoadSO",                       "()Z",                                   (bool*)nIncLoadSO },
17346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"nIncDeviceCreate",                 "()J",                                   (void*)nIncDeviceCreate },
17356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"nIncDeviceDestroy",                "(J)V",                                  (void*)nIncDeviceDestroy },
17366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncContextCreate",              "(JIII)J",                               (void*)nIncContextCreate },
17376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncContextFinish",              "(J)V",                                  (void*)nIncContextFinish },
17386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncContextDestroy",             "(J)V",                                  (void*)nIncContextDestroy },
17396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncObjDestroy",                 "(JJ)V",                                 (void*)nIncObjDestroy },
17406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncElementCreate",              "(JJIZI)J",                              (void*)nIncElementCreate },
17416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncTypeCreate",                 "(JJIIIZZI)J",                           (void*)nIncTypeCreate },
17426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncAllocationCreateTyped",      "(JJJJ)J",                               (void*)nIncAllocationCreateTyped },
1743c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main};
1744c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1745c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// ---------------------------------------------------------------------------
1746c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1747c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainjint JNI_OnLoad(JavaVM* vm, void* reserved)
1748c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1749c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    JNIEnv* env = NULL;
1750257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    jclass clazz = NULL;
1751c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint result = -1;
1752c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1753c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
1754184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
1755184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "ERROR: GetEnv failed\n");
1756257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        goto bail;
1757257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
1758257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (env == NULL) {
1759184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "ERROR: env == NULL");
1760257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        goto bail;
1761257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
1762257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines
1763257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    clazz = env->FindClass(classPathName);
1764257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (clazz == NULL) {
1765c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto bail;
1766c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1767c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1768257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (env->RegisterNatives(clazz, methods, NELEM(methods)) < 0) {
1769184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
1770184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "ERROR: MediaPlayer native registration failed\n");
1771c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto bail;
1772c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1773c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1774c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    /* success -- return valid version number */
1775c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    result = JNI_VERSION_1_4;
1776c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1777c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainbail:
1778c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return result;
1779c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1780