android_renderscript_RenderScript.cpp revision d454f4541683a6bddfa1d00424a71f5855675e86
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) {
348d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong ret = 0;
349d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
350936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
351936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
352d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
353d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jsize values_length = _env->GetArrayLength(valueArray);
354d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
355d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jsize sizes_length = _env->GetArrayLength(sizeArray);
356d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong* jDepClosures =
357d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      _env->GetLongArrayElements(depClosureArray, nullptr);
358d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jsize depClosures_length = _env->GetArrayLength(depClosureArray);
359d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong* jDepFieldIDs =
360d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      _env->GetLongArrayElements(depFieldIDArray, nullptr);
361d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jsize depFieldIDs_length = _env->GetArrayLength(depFieldIDArray);
362d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
363d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  size_t numValues, numDependencies;
364d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  RsScriptFieldID* fieldIDs;
365d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  uintptr_t* values;
366d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  RsClosure* depClosures;
367d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  RsScriptFieldID* depFieldIDs;
368d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
369d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (fieldIDs_length != values_length || values_length != sizes_length) {
370d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      LOG_API("Unmatched field IDs, values, and sizes in closure creation.");
371d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
372d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
373d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
374d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  numValues = (size_t)fieldIDs_length;
375d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
376d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (depClosures_length != depFieldIDs_length) {
377d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      LOG_API("Unmatched closures and field IDs for dependencies in closure creation.");
378d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
379d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
380d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
381d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  numDependencies = (size_t)depClosures_length;
382d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
383d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (numDependencies > numValues) {
384d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      LOG_API("Unexpected number of dependencies in closure creation");
385d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
386d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
387d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
388d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
389d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      LOG_API("Too many arguments or globals in closure creation");
390d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
391d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
392d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
393d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
394d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (fieldIDs == nullptr) {
395d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
396d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
397d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
398d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  for (size_t i = 0; i < numValues; i++) {
399936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni    fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
400936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
401936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
402d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  values = (uintptr_t*)alloca(sizeof(uintptr_t) * numValues);
403d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (values == nullptr) {
404d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
405d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
406d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
407d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  for (size_t i = 0; i < numValues; i++) {
408936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni    values[i] = (uintptr_t)jValues[i];
409936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
410936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
411d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  depClosures = (RsClosure*)alloca(sizeof(RsClosure) * numDependencies);
412d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (depClosures == nullptr) {
413d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
414d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
415936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
416d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  for (size_t i = 0; i < numDependencies; i++) {
417936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni    depClosures[i] = (RsClosure)jDepClosures[i];
418936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
419936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
420d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  depFieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numDependencies);
421d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (depFieldIDs == nullptr) {
422d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
423d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
424d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
425d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  for (size_t i = 0; i < numDependencies; i++) {
426936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni    depFieldIDs[i] = (RsClosure)jDepFieldIDs[i];
427936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
428936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
429d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  ret = (jlong)(uintptr_t)dispatchTab.ClosureCreate(
430936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni      (RsContext)con, (RsScriptKernelID)kernelID, (RsAllocation)returnValue,
431d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      fieldIDs, numValues, values, numValues,
432d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      (int*)jSizes, numValues,
433d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      depClosures, numDependencies,
434d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      depFieldIDs, numDependencies);
435d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
436d454f4541683a6bddfa1d00424a71f5855675e86Yang Niexit:
437d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
438d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(depFieldIDArray, jDepFieldIDs, JNI_ABORT);
439d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(depClosureArray, jDepClosures, JNI_ABORT);
440d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseIntArrayElements (sizeArray,       jSizes,       JNI_ABORT);
441d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(valueArray,      jValues,      JNI_ABORT);
442d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(fieldIDArray,    jFieldIDs,    JNI_ABORT);
443d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
444d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  return ret;
445936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni}
446936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
447b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wangstatic jlong
448b1c365bfb0566142c49375f09f2b8289182f1f47Miao WangnInvokeClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong invokeID,
449b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                     jbyteArray paramArray, jlongArray fieldIDArray, jlongArray valueArray,
450b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                     jintArray sizeArray) {
451d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong ret = 0;
452d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
453b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jbyte* jParams = _env->GetByteArrayElements(paramArray, nullptr);
454b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jsize jParamLength = _env->GetArrayLength(paramArray);
455b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
456b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
457d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
458d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jsize values_length = _env->GetArrayLength(valueArray);
459d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
460d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jsize sizes_length = _env->GetArrayLength(sizeArray);
461d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
462d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  size_t numValues;
463d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  RsScriptFieldID* fieldIDs;
464d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  uintptr_t* values;
465d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
466d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (fieldIDs_length != values_length || values_length != sizes_length) {
467d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      LOG_API("Unmatched field IDs, values, and sizes in closure creation.");
468d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
469d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
470d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
471d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  numValues = (size_t) fieldIDs_length;
472d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
473d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
474d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      LOG_API("Too many arguments or globals in closure creation");
475d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
476d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
477d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
478d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
479d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (fieldIDs == nullptr) {
480d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
481d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
482d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
483d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  for (size_t i = 0; i < numValues; i++) {
484b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
485b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  }
486b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
487d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  values = (uintptr_t*)alloca(sizeof(uintptr_t) * numValues);
488d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (values == nullptr) {
489d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
490b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  }
491b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
492d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  for (size_t i = 0; i < numValues; i++) {
493d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni    values[i] = (uintptr_t)jValues[i];
494d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
495b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
496d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  ret = (jlong)(uintptr_t)dispatchTab.InvokeClosureCreate(
497b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      (RsContext)con, (RsScriptInvokeID)invokeID, jParams, jParamLength,
498d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      fieldIDs, numValues, values, numValues,
499d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      (int*)jSizes, numValues);
500d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
501d454f4541683a6bddfa1d00424a71f5855675e86Yang Niexit:
502d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
503d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseIntArrayElements (sizeArray,       jSizes,       JNI_ABORT);
504d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(valueArray,      jValues,      JNI_ABORT);
505d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(fieldIDArray,    jFieldIDs,    JNI_ABORT);
506d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseByteArrayElements(paramArray,      jParams,      JNI_ABORT);
507d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
508d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  return ret;
509b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang}
510b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
511936fbd696aac243a514f74b6fee6efd5959527a4Yang Nistatic void
512936fbd696aac243a514f74b6fee6efd5959527a4Yang NinClosureSetArg(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
513936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni               jint index, jlong value, jint size) {
514b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  dispatchTab.ClosureSetArg((RsContext)con, (RsClosure)closureID, (uint32_t)index,
515b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                  (uintptr_t)value, (size_t)size);
516936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni}
517936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
518936fbd696aac243a514f74b6fee6efd5959527a4Yang Nistatic void
519936fbd696aac243a514f74b6fee6efd5959527a4Yang NinClosureSetGlobal(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
520936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni                  jlong fieldID, jlong value, jint size) {
521936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  dispatchTab.ClosureSetGlobal((RsContext)con, (RsClosure)closureID,
522b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                     (RsScriptFieldID)fieldID, (uintptr_t)value, (size_t)size);
523936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni}
524936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
525936fbd696aac243a514f74b6fee6efd5959527a4Yang Nistatic long
526e68c5973af1e80c77cab9aea0b77f46a801aef96Yang NinScriptGroup2Create(JNIEnv *_env, jobject _this, jlong con, jstring name,
527b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang                    jstring cacheDir, jlongArray closureArray) {
528d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  jlong ret = 0;
529d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
530e68c5973af1e80c77cab9aea0b77f46a801aef96Yang Ni  AutoJavaStringToUTF8 nameUTF(_env, name);
531b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
532b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
533936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jlong* jClosures = _env->GetLongArrayElements(closureArray, nullptr);
534936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  jsize numClosures = _env->GetArrayLength(closureArray);
535d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
536d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  RsClosure* closures;
537d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
538d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (numClosures > (jsize) RS_SCRIPT_GROUP_MAX_NUMBER_CLOSURES) {
539d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni    LOG_API("Too many closures in script group");
540d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni    goto exit;
541d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
542d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
543d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  closures = (RsClosure*)alloca(sizeof(RsClosure) * numClosures);
544d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  if (closures == nullptr) {
545d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni      goto exit;
546d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  }
547d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
548936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  for (int i = 0; i < numClosures; i++) {
549936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni    closures[i] = (RsClosure)jClosures[i];
550936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni  }
551936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
552d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  ret = (jlong)(uintptr_t)dispatchTab.ScriptGroup2Create(
553e68c5973af1e80c77cab9aea0b77f46a801aef96Yang Ni      (RsContext)con, nameUTF.c_str(), nameUTF.length(),
554e68c5973af1e80c77cab9aea0b77f46a801aef96Yang Ni      cacheDirUTF.c_str(), cacheDirUTF.length(),
555b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      closures, numClosures);
556d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
557d454f4541683a6bddfa1d00424a71f5855675e86Yang Niexit:
558d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
559d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  _env->ReleaseLongArrayElements(closureArray, jClosures, JNI_ABORT);
560d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni
561d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni  return ret;
562b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang}
563b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
564b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wangstatic void
565b1c365bfb0566142c49375f09f2b8289182f1f47Miao WangnScriptGroup2Execute(JNIEnv *_env, jobject _this, jlong con, jlong groupID) {
566b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang  dispatchTab.ScriptGroupExecute((RsContext)con, (RsScriptGroup2)groupID);
567936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni}
568936fbd696aac243a514f74b6fee6efd5959527a4Yang Ni
569c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
570bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj)
571c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
572bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj);
573bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ObjDestroy((RsContext)con, (void *)obj);
574c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
575c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
576c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// ---------------------------------------------------------------------------
577bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
578c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott MainnDeviceCreate(JNIEnv *_env, jobject _this)
579c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
580c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nDeviceCreate");
581bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)dispatchTab.DeviceCreate();
582c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
583c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
584c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
585bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev)
586c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
587c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nDeviceDestroy");
588470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    return dispatchTab.DeviceDestroy((RsDevice)dev);
589c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
590c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
591c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
592bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnDeviceSetConfig(JNIEnv *_env, jobject _this, jlong dev, jint p, jint value)
593c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
594c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nDeviceSetConfig  dev(%p), param(%i), value(%i)", (void *)dev, p, value);
595470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    return dispatchTab.DeviceSetConfig((RsDevice)dev, (RsDeviceParam)p, value);
596c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
597c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
598bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
599ecccf940f72679f7602c52b0b4bcb245acdad55bMiao WangnContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer,
600ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang               jint ct, jstring nativeLibDirJava)
601c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
602c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nContextCreate");
603ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    // Access the NativeLibDir in the Java Context.
604ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    const char * nativeLibDir = _env->GetStringUTFChars(nativeLibDirJava, JNI_FALSE);
605ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    size_t length = (size_t)_env->GetStringUTFLength(nativeLibDirJava);
606ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang
607ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    jlong id = (jlong)(uintptr_t)dispatchTab.ContextCreate((RsDevice)dev, ver,
608ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang                                                           sdkVer,
609ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang                                                           (RsContextType)ct, 0);
610ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    if (dispatchTab.SetNativeLibDir) {
611ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang        dispatchTab.SetNativeLibDir((RsContext)id, nativeLibDir, length);
612ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    }
613ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang
614ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    _env->ReleaseStringUTFChars(nativeLibDirJava, nativeLibDir);
615ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    return id;
616c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
617c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
618c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
619c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
620bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextSetPriority(JNIEnv *_env, jobject _this, jlong con, jint p)
621c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
622bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("ContextSetPriority, con(%p), priority(%i)", (RsContext)con, p);
623bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextSetPriority((RsContext)con, p);
624c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
625c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
626c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
627c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
628c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
629bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextDestroy(JNIEnv *_env, jobject _this, jlong con)
630c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
631bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextDestroy, con(%p)", (RsContext)con);
632bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextDestroy((RsContext)con);
633c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
634c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
635c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
636bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextDump(JNIEnv *_env, jobject _this, jlong con, jint bits)
637c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
638c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nContextDump, con(%p)  bits(%i)", (RsContext)con, bits);
639470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    dispatchTab.ContextDump((RsContext)con, bits);
640c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
641c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
642c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
643c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic jstring
644bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextGetErrorMessage(JNIEnv *_env, jobject _this, jlong con)
645c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
646bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextGetErrorMessage, con(%p)", (RsContext)con);
647c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    char buf[1024];
648c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
649c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t receiveLen;
650c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t subID;
651bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    int id = dispatchTab.ContextGetMessage((RsContext)con,
6526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           buf, sizeof(buf),
6536f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &receiveLen, sizeof(receiveLen),
6546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &subID, sizeof(subID));
655c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (!id && receiveLen) {
656184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,
657184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "message receive buffer too small.  %zu", receiveLen);
658c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
659c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return _env->NewStringUTF(buf);
660c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
661c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
662c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic jint
663bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextGetUserMessage(JNIEnv *_env, jobject _this, jlong con, jintArray data)
664c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
665c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
666bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextGetMessage, con(%p), len(%i)", (RsContext)con, len);
667c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *ptr = _env->GetIntArrayElements(data, NULL);
668c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t receiveLen;
669c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t subID;
670bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    int id = dispatchTab.ContextGetMessage((RsContext)con,
6716f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           ptr, len * 4,
6726f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &receiveLen, sizeof(receiveLen),
6736f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                           &subID, sizeof(subID));
674c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (!id && receiveLen) {
675184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,
676184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "message receive buffer too small.  %zu", receiveLen);
677c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
678c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseIntArrayElements(data, ptr, 0);
679bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jint)id;
680c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
681c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
682c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic jint
683bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextPeekMessage(JNIEnv *_env, jobject _this, jlong con, jintArray auxData)
684c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
685bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextPeekMessage, con(%p)", (RsContext)con);
686c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *auxDataPtr = _env->GetIntArrayElements(auxData, NULL);
687c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t receiveLen;
688c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t subID;
689bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    int id = dispatchTab.ContextPeekMessage((RsContext)con, &receiveLen, sizeof(receiveLen),
690c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                                  &subID, sizeof(subID));
691c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    auxDataPtr[0] = (jint)subID;
692c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    auxDataPtr[1] = (jint)receiveLen;
693c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseIntArrayElements(auxData, auxDataPtr, 0);
694bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jint)id;
695c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
696c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
697bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic void nContextInitToClient(JNIEnv *_env, jobject _this, jlong con)
698c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
699bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextInitToClient, con(%p)", (RsContext)con);
700bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextInitToClient((RsContext)con);
701c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
702c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
703bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic void nContextDeinitToClient(JNIEnv *_env, jobject _this, jlong con)
704c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
705bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextDeinitToClient, con(%p)", (RsContext)con);
706bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextDeinitToClient((RsContext)con);
707c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
708c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
709c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
710bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnContextSendMessage(JNIEnv *_env, jobject _this, jlong con, jint id, jintArray data)
711c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
712c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *ptr = NULL;
713c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = 0;
714c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (data) {
715c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        len = _env->GetArrayLength(data);
716c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        jint *ptr = _env->GetIntArrayElements(data, NULL);
717c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
718bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nContextSendMessage, con(%p), id(%i), len(%i)", (RsContext)con, id, len);
719bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ContextSendMessage((RsContext)con, id, (const uint8_t *)ptr, len * sizeof(int));
720c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (data) {
721c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
722c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
723c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
724c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
725c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
726c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
727bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
728086010500c28e2bca57ea583d3f38da9a2f2f414Yang NinElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind,
729086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni               jboolean norm, jint size)
730c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
731bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nElementCreate, con(%p), type(%i), kind(%i), norm(%i), size(%i)", (RsContext)con,
732bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            type, kind, norm, size);
733086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    return (jlong)(uintptr_t)dispatchTab.ElementCreate((RsContext)con,
734086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni                                                       (RsDataType)type,
735086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni                                                       (RsDataKind)kind,
736bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       norm, size);
737c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
738c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
739bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
740bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnElementCreate2(JNIEnv *_env, jobject _this, jlong con,
741bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                jlongArray _ids, jobjectArray _names, jintArray _arraySizes)
742c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
743c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    int fieldCount = _env->GetArrayLength(_ids);
744bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nElementCreate2, con(%p)", (RsContext)con);
745bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
746bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jIds = _env->GetLongArrayElements(_ids, NULL);
747bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint *jArraySizes = _env->GetIntArrayElements(_arraySizes, NULL);
748c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
749bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsElement *ids = (RsElement*)malloc(fieldCount * sizeof(RsElement));
750bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    uint32_t *arraySizes = (uint32_t *)malloc(fieldCount * sizeof(uint32_t));
751bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
752bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < fieldCount; i ++) {
753bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        ids[i] = (RsElement)jIds[i];
754bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        arraySizes[i] = (uint32_t)jArraySizes[i];
755bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
756c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
757c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringArrayToUTF8 names(_env, _names, fieldCount);
758c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
759c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    const char **nameArray = names.c_str();
760c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t *sizeArray = names.c_str_len();
761c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
7626f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    jlong id = (jlong)(uintptr_t)dispatchTab.ElementCreate2((RsContext)con, (RsElement *)ids,
7636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                            fieldCount, nameArray,
7646f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                            fieldCount * sizeof(size_t),  sizeArray,
7656f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                            (const uint32_t *)arraySizes, fieldCount);
766c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
767bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(ids);
768bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(arraySizes);
769bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_ids, jIds, JNI_ABORT);
770bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseIntArrayElements(_arraySizes, jArraySizes, JNI_ABORT);
771bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return id;
772c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
773c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
774c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
775c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
776bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
777c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
778bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnElementGetSubElements(JNIEnv *_env, jobject _this, jlong con, jlong id,
779bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                       jlongArray _IDs,
780c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                       jobjectArray _names,
781c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                       jintArray _arraySizes)
782c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
783bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    uint32_t dataSize = _env->GetArrayLength(_IDs);
784bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nElementGetSubElements, con(%p)", (RsContext)con);
785c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
786bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    uintptr_t *ids = (uintptr_t *)malloc(dataSize * sizeof(uintptr_t));
787c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    const char **names = (const char **)malloc((uint32_t)dataSize * sizeof(const char *));
788c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    uint32_t *arraySizes = (uint32_t *)malloc((uint32_t)dataSize * sizeof(uint32_t));
789c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
790bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ElementGetSubElements((RsContext)con, (RsElement)id, ids, names, arraySizes,
791bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (uint32_t)dataSize);
792c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
793bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(uint32_t i = 0; i < dataSize; i++) {
794bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        const jlong id = (jlong)(uintptr_t)ids[i];
795bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        const jint arraySize = (jint)arraySizes[i];
796c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i]));
797bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        _env->SetLongArrayRegion(_IDs, i, 1, &id);
798bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        _env->SetIntArrayRegion(_arraySizes, i, 1, &arraySize);
799c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
800c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
801c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    free(ids);
802c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    free(names);
803c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    free(arraySizes);
804c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
805c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
806c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
807c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
808bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
809bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid,
810c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv)
811c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
812c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)",
813bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, eid, dimx, dimy, dimz, mips, faces, yuv);
814c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
815bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)dispatchTab.TypeCreate((RsContext)con, (RsElement)eid, dimx, dimy,
816bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                    dimz, mips, faces, yuv);
817c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
818c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
819c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
820c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
821bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
822bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mips, jint usage,
823bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                       jlong pointer)
824c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
825bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)",
826bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsElement)type, mips, usage, (void *)pointer);
827bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t) dispatchTab.AllocationCreateTyped((RsContext)con, (RsType)type,
828bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                (RsAllocationMipmapControl)mips,
829bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                (uint32_t)usage, (uintptr_t)pointer);
830c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
831c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
832c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
833bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationSyncAll(JNIEnv *_env, jobject _this, jlong con, jlong a, jint bits)
834c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
835bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationSyncAll, con(%p), a(%p), bits(0x%08x)", (RsContext)con, (RsAllocation)a, bits);
836bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationSyncAll((RsContext)con, (RsAllocation)a, (RsAllocationUsageType)bits);
837c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
838c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
839c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
840bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationSetSurface(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject sur)
841dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang{
842bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    ioDispatch.sAllocationSetSurface(_env, _this, (RsContext)con, (RsAllocation)alloc, sur, dispatchTab);
843dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang}
844dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang
845dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wangstatic void
846bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationIoSend(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
847dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang{
848bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationIoSend((RsContext)con, (RsAllocation)alloc);
849dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang}
850dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang
851dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wangstatic void
852bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
853c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
854bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationGenerateMipmaps, con(%p), a(%p)", (RsContext)con, (RsAllocation)alloc);
855bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationGenerateMipmaps((RsContext)con, (RsAllocation)alloc);
856c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
857c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
858c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic size_t GetBitmapSize(JNIEnv *env, jobject jbitmap) {
859c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmapInfo info;
860c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    memset(&info, 0, sizeof(info));
861c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_getInfo(env, jbitmap, &info);
862c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    size_t s = info.width * info.height;
863c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    switch (info.format) {
864c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        case ANDROID_BITMAP_FORMAT_RGBA_8888: s *= 4; break;
865c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        case ANDROID_BITMAP_FORMAT_RGB_565: s *= 2; break;
866c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        case ANDROID_BITMAP_FORMAT_RGBA_4444: s *= 2; break;
867c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
868c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return s;
869c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
870c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
871bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
872bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,
873bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                            jobject jbitmap, jint usage)
874c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
875bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = 0;
876257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    void *pixels = NULL;
877257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
878c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
879257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (pixels != NULL) {
880bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        id = (jlong)(uintptr_t)dispatchTab.AllocationCreateFromBitmap((RsContext)con,
881bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      (RsType)type,
882bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      (RsAllocationMipmapControl)mip,
883bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      pixels,
884bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      GetBitmapSize(_env, jbitmap),
885bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                      usage);
886257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        AndroidBitmap_unlockPixels(_env, jbitmap);
887257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
888c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
889c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
890c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
891bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
892bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCreateBitmapBackedAllocation(JNIEnv *_env, jobject _this, jlong con, jlong type,
893bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                        jint mip, jobject jbitmap, jint usage)
894c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
895bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = 0;
896257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    void *pixels = NULL;
897257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
898c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
899257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (pixels != NULL) {
900bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        id = (jlong)(uintptr_t)dispatchTab.AllocationCreateTyped((RsContext)con,
901bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (RsType)type,
902bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (RsAllocationMipmapControl)mip,
903bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (uint32_t)usage,
904bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                 (uintptr_t)pixels);
905257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        AndroidBitmap_unlockPixels(_env, jbitmap);
906257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
907c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
908c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
909c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
910bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
911bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type,
912bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                jint mip, jobject jbitmap, jint usage)
913c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
914c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    void *pixels = NULL;
915c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
916c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
917bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = 0;
918c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (pixels != NULL) {
919bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        id = (jlong)(uintptr_t)dispatchTab.AllocationCubeCreateFromBitmap((RsContext)con,
920bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          (RsType)type,
921bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          (RsAllocationMipmapControl)mip,
922bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          pixels,
923bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          GetBitmapSize(_env, jbitmap),
924bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                                          usage);
925c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        AndroidBitmap_unlockPixels(_env, jbitmap);
926c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
927c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
928c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
929c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
930c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
931bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
932c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
933c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmapInfo info;
934c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    memset(&info, 0, sizeof(info));
935c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_getInfo(_env, jbitmap, &info);
936c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
937c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    void *pixels = NULL;
938c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
939c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
940c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (pixels != NULL) {
941bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dispatchTab.Allocation2DData((RsContext)con, (RsAllocation)alloc, 0, 0, 0,
942bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                     RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, info.width,
943bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                     info.height, pixels, GetBitmapSize(_env, jbitmap), 0);
944c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        AndroidBitmap_unlockPixels(_env, jbitmap);
945c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
946c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
947c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
948c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
949bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationCopyToBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
950c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
951c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmapInfo info;
952c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    memset(&info, 0, sizeof(info));
953c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_getInfo(_env, jbitmap, &info);
954c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
955c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    void *pixels = NULL;
956c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
957c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
958c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (pixels != NULL) {
959bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dispatchTab.AllocationCopyToBitmap((RsContext)con, (RsAllocation)alloc, pixels,
960bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                           GetBitmapSize(_env, jbitmap));
961c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        AndroidBitmap_unlockPixels(_env, jbitmap);
962c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
963c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    //bitmap.notifyPixelsChanged();
964c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
965c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
9668352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Java object data into the Allocation pointed to by _alloc.
967c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
9688352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
9692e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint count, jobject data, jint sizeBytes, jint dataType, jint mSize,
9702e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jboolean usePadding)
971c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
9728352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
9738352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation1DData, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
9748352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            "dataType(%i)", (RsContext)con, (RsAllocation)alloc, offset, count, sizeBytes,
9758352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            dataType);
9762e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation1DData, true,
9772e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
978c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
979c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
980244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
981c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
982244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationElementData1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint xoff,
983244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                         jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
984c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
985c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
986244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    LOG_API("nAllocationElementData1D, con(%p), alloc(%p), xoff(%i), comp(%i), len(%i), "
987244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, compIdx, len,
988244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            sizeBytes);
989244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
990244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    dispatchTab.Allocation1DElementData((RsContext)con, (RsAllocation)alloc, xoff,
991244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                                        lod, ptr, sizeBytes, compIdx);
992c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
993c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
994c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
995244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang/*
996244b72fe088a6393f37dea49ff89cf9df738a492Miao Wangstatic void
997244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationElementData(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
998244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                       jint xoff, jint yoff, jint zoff,
999244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                       jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
1000244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang{
1001244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    jint len = _env->GetArrayLength(data);
1002244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    LOG_API("nAllocationElementData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
1003244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
1004244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            sizeBytes);
1005244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1006244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    dispatchTab.AllocationElementData((RsContext)con, (RsAllocation)alloc,
1007244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                                      xoff, yoff, zoff,
1008244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                                      lod, ptr, sizeBytes, compIdx);
1009244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1010244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang}
1011244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang*/
1012244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
10138352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Java object data into the Allocation pointed to by _alloc.
1014c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
10158352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
10162e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType, jint mSize,
10172e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jboolean usePadding)
1018c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
10198352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
10208352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
10218352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation2DData, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
10228352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
10232e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h;
10242e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation2DData, true,
10252e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
1026c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1027c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1028c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1029bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationData2D_alloc(JNIEnv *_env, jobject _this, jlong con,
1030bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong dstAlloc, jint dstXoff, jint dstYoff,
1031c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint dstMip, jint dstFace,
1032c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint width, jint height,
1033bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong srcAlloc, jint srcXoff, jint srcYoff,
1034c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint srcMip, jint srcFace)
1035c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1036c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nAllocation2DData_s, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
1037c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " dstMip(%i), dstFace(%i), width(%i), height(%i),"
1038c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i), srcFace(%i)",
1039bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
1040c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
1041c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1042bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationCopy2DRange((RsContext)con,
1043bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)dstAlloc,
1044bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      dstXoff, dstYoff,
1045bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      dstMip, dstFace,
1046bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      width, height,
1047bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)srcAlloc,
1048bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      srcXoff, srcYoff,
1049bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      srcMip, srcFace);
1050c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1051c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
10528352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Java object data into the Allocation pointed to by _alloc.
1053c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
10548352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
10552e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jint d, jobject data, jint sizeBytes, jint dataType,
10562e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
1057c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
10588352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
10598352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation3DData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
10608352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
10618352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            lod, w, h, d, sizeBytes);
10622e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h * d;
10632e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation3DData, true,
10642e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
1065c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1066c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1067c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1068bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationData3D_alloc(JNIEnv *_env, jobject _this, jlong con,
1069bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong dstAlloc, jint dstXoff, jint dstYoff, jint dstZoff,
1070c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint dstMip,
1071c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint width, jint height, jint depth,
1072bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                        jlong srcAlloc, jint srcXoff, jint srcYoff, jint srcZoff,
1073c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                        jint srcMip)
1074c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1075c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    LOG_API("nAllocationData3D_alloc, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
1076c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " dstMip(%i), width(%i), height(%i),"
1077c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i)",
1078bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
1079c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main            width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
1080c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1081bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationCopy3DRange((RsContext)con,
1082bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)dstAlloc,
1083bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      dstXoff, dstYoff, dstZoff, dstMip,
1084bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      width, height, depth,
1085bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      (RsAllocation)srcAlloc,
1086bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                      srcXoff, srcYoff, srcZoff, srcMip);
1087bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang}
1088bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
10898352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1090bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic void
10912e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao WangnAllocationRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jobject data, jint dataType,
10922e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                jint mSize, jboolean usePadding)
1093bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{
10948352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
10958352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocationRead, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
10962e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = 0;
10972e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(0, dispatchTab.AllocationRead, false,
10982e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, ptr, len * typeBytes);
1099c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1100c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
11018352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1102c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
11038352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationRead1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
11042e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint count, jobject data, jint sizeBytes, jint dataType,
11052e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
1106c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
11078352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
11088352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation1DRead, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
11098352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang              "dataType(%i)", (RsContext)con, alloc, offset, count, sizeBytes, dataType);
11102e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(0, dispatchTab.Allocation1DRead, false,
11112e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
1112c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1113c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1114244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang// Copies from the Element in the Allocation pointed to by _alloc into the Java array data.
1115244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang/*
1116244b72fe088a6393f37dea49ff89cf9df738a492Miao Wangstatic void
1117244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationElementRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc,
1118244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang                       jint xoff, jint yoff, jint zoff,
11193bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang                       jint lod, jint compIdx, jobject data, jint sizeBytes)
1120244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang{
11213bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    jint len = _env->GetArrayLength(data);
11223bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    LOG_API("nAllocationElementRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
11233bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang            "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
11243bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang            sizeBytes);
11253bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
11263bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    dispatchTab.AllocationElementRead((RsContext)con, (RsAllocation)alloc,
11273bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang                                      xoff, yoff, zoff,
11283bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang                                      lod, ptr, sizeBytes, compIdx);
11293bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1130244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang}
1131244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang*/
1132244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
11338352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1134c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
11358352bdceb7f0030593db04a06ba8caebf81eaeeaMiao WangnAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
11362e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType,
11372e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
1138c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
11398352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
11408352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
11418352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    LOG_API("nAllocation2DRead, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
11428352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang              "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
11432e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h;
11442e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(0, dispatchTab.Allocation2DRead, false,
11452e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
1146c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1147c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1148244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1149244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang/*
1150244b72fe088a6393f37dea49ff89cf9df738a492Miao Wangstatic void
1151244b72fe088a6393f37dea49ff89cf9df738a492Miao WangnAllocationRead3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
11522e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint w, jint h, jint d, jobject data, int sizeBytes, int dataType,
11532e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                  jint mSize, jboolean usePadding)
1154244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang{
1155244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
1156244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    LOG_API("nAllocation3DRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
1157244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
1158244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang            lod, w, h, d, sizeBytes);
11592e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    int count = w * h * d;
11602e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation3DRead, false,
11612e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
1162244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang}
1163244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang*/
1164244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
1165bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1166bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationGetType(JNIEnv *_env, jobject _this, jlong con, jlong a)
1167c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1168bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationGetType, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
1169bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t) dispatchTab.AllocationGetType((RsContext)con, (RsAllocation)a);
1170c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1171c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1172c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1173bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnAllocationResize1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint dimX)
1174c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1175bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", (RsContext)con,
1176bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsAllocation)alloc, dimX);
1177bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.AllocationResize1D((RsContext)con, (RsAllocation)alloc, dimX);
1178c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1179c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1180c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
1181c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1182c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
11836f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptBindAllocation(JNIEnv *_env, jobject _this, jlong con, jlong script, jlong alloc, jint slot, jboolean mUseInc)
1184c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1185bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)",
1186bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
11876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
11886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
11896f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
11906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
11916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1192c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1193c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1194c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
11956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jint val, jboolean mUseInc)
1196c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1197bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con,
1198bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
11996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
12006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarI((RsContext)con, (RsScript)script, slot, val);
12016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
12026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarI((RsContext)con, (RsScript)script, slot, val);
12036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1204c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1205c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1206c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12076f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarObj(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val, jboolean mUseInc)
1208c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1209bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con,
1210bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
12116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
12126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val);
12136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
12146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val);
12156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1216c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1217c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1218c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val, jboolean mUseInc)
1220c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1221bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%lli)", (RsContext)con,
1222bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
12236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
12246f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarJ((RsContext)con, (RsScript)script, slot, val);
12256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
12266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarJ((RsContext)con, (RsScript)script, slot, val);
12276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1228c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1229c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1230c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, float val, jboolean mUseInc)
1232c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1233bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", (RsContext)con,
1234bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
12356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
12366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarF((RsContext)con, (RsScript)script, slot, val);
12376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
12386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarF((RsContext)con, (RsScript)script, slot, val);
12396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1240c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1241c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1242c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, double val, jboolean mUseInc)
1244c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1245bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", (RsContext)con,
1246bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, slot, val);
12476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
12486f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarD((RsContext)con, (RsScript)script, slot, val);
1249d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni    } else {
12506f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarD((RsContext)con, (RsScript)script, slot, val);
12516f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1252c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1253c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1254c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12556f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data, jboolean mUseInc)
1256c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1257bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1258c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
1259c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
12606f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
12616f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
12626f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
12636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
12646f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1265c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1266c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1267c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1268c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1269bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptSetVarVE(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data,
12706f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                jlong elem, jintArray dims, jboolean mUseInc)
1271c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1272bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptSetVarVE, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1273c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
1274c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
1275c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint dimsLen = _env->GetArrayLength(dims) * sizeof(int);
1276c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint *dimsPtr = _env->GetIntArrayElements(dims, NULL);
12776f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
12786f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem,
12796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                      (const uint32_t *)dimsPtr, dimsLen);
12806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
12816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem,
12826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                   (const uint32_t *)dimsPtr, dimsLen);
12836f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1284c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1285c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseIntArrayElements(dims, dimsPtr, JNI_ABORT);
1286c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1287c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1288c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1289c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
12906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptSetTimeZone(JNIEnv *_env, jobject _this, jlong con, jlong script, jbyteArray timeZone, jboolean mUseInc)
1291c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1292bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptCSetTimeZone, con(%p), s(%p), timeZone(%s)", (RsContext)con,
1293bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)script, (const char *)timeZone);
1294c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1295c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint length = _env->GetArrayLength(timeZone);
1296c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte* timeZone_ptr;
1297c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0);
12986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
12996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length);
13006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
13016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length);
13026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1303c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1304c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (timeZone_ptr) {
1305c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0);
1306c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1307c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1308c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1309c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
13106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptInvoke(JNIEnv *_env, jobject _this, jlong con, jlong obj, jint slot, jboolean mUseInc)
1311c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1312bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptInvoke, con(%p), script(%p)", (RsContext)con, (void *)obj);
13136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
13146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptInvoke((RsContext)con, (RsScript)obj, slot);
13156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
13166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptInvoke((RsContext)con, (RsScript)obj, slot);
13176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1318c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1319c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1320c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
13216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptInvokeV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data, jboolean mUseInc)
1322c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1323bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptInvokeV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1324c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(data);
1325c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(data, NULL);
13266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
13276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len);
13286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
13296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len);
13306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1331c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1332c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1333c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1334c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
13356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEach(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
13366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang               jlong script, jint slot, jlong ain, jlong aout, jboolean mUseInc)
1337c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1338bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
13396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
13406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
13416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
13426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
13436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     NULL, 0, NULL, 0);
13446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
13456f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
13466f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
13476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  NULL, 0, NULL, 0);
13486f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1349c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1350c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
13516f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEachV(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
13526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                jlong script, jint slot, jlong ain, jlong aout, jbyteArray params, jboolean mUseInc)
1353c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1354bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1355c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(params);
1356c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(params, NULL);
13576f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
13586f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
13596f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
13606f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
13616f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     ptr, len, NULL, 0);
13626f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
13636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
13646f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
13656f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  ptr, len, NULL, 0);
13666f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1367c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT);
1368c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1369c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1370c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
13716f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEachClipped(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
1372bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                      jlong script, jint slot, jlong ain, jlong aout,
1373c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                      jint xstart, jint xend,
13746f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                      jint ystart, jint yend, jint zstart, jint zend, jboolean mUseInc)
1375c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1376bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEachClipped, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1377c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    RsScriptCall sc;
1378c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xStart = xstart;
1379c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xEnd = xend;
1380c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yStart = ystart;
1381c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yEnd = yend;
1382c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zStart = zstart;
1383c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zEnd = zend;
1384c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
1385c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayStart = 0;
1386c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayEnd = 0;
13876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
13886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
13896f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
13906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
13916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     NULL, 0, &sc, sizeof(sc));
13926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
13936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
13946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
13956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  NULL, 0, &sc, sizeof(sc));
13966f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1397c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1398c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1399c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
14006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptForEachClippedV(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
1401bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                       jlong script, jint slot, jlong ain, jlong aout,
1402c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                       jbyteArray params, jint xstart, jint xend,
14036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                       jint ystart, jint yend, jint zstart, jint zend, jboolean mUseInc)
1404c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1405bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptForEachClipped, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
1406c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint len = _env->GetArrayLength(params);
1407c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte *ptr = _env->GetByteArrayElements(params, NULL);
1408c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    RsScriptCall sc;
1409c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xStart = xstart;
1410c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.xEnd = xend;
1411c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yStart = ystart;
1412c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.yEnd = yend;
1413c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zStart = zstart;
1414c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.zEnd = zend;
1415c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
1416c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayStart = 0;
1417c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    sc.arrayEnd = 0;
14186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ContextFinish((RsContext)con);
14206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
14216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     (RsAllocation)ain, (RsAllocation)aout,
14226f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                     ptr, len, &sc, sizeof(sc));
14236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
14246f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
14256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  (RsAllocation)ain, (RsAllocation)aout,
14266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  ptr, len, &sc, sizeof(sc));
14276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1428c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT);
1429c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1430c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1431c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// -----------------------------------
1432c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1433bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1434bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptCCreate(JNIEnv *_env, jobject _this, jlong con,
1435c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main               jstring resName, jstring cacheDir,
1436c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main               jbyteArray scriptRef, jint length)
1437c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1438bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptCCreate, con(%p)", (RsContext)con);
1439c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1440c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringToUTF8 resNameUTF(_env, resName);
1441c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
1442bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong ret = 0;
1443c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jbyte* script_ptr = NULL;
1444c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint _exception = 0;
1445c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint remaining;
1446c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (!scriptRef) {
1447c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _exception = 1;
1448c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null");
1449c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto exit;
1450c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1451c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (length < 0) {
1452c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _exception = 1;
1453c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0");
1454c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto exit;
1455c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1456c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    remaining = _env->GetArrayLength(scriptRef);
1457c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (remaining < length) {
1458c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _exception = 1;
1459c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //jniThrowException(_env, "java/lang/IllegalArgumentException",
1460c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        //        "length > script.length - offset");
1461c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto exit;
1462c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1463c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    script_ptr = (jbyte *)
1464c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0);
1465c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1466c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    //rsScriptCSetText(con, (const char *)script_ptr, length);
1467c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1468bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    ret = (jlong)(uintptr_t)dispatchTab.ScriptCCreate((RsContext)con,
1469bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                      resNameUTF.c_str(), resNameUTF.length(),
1470bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                      cacheDirUTF.c_str(), cacheDirUTF.length(),
1471bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                      (const char *)script_ptr, length);
1472c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1473c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainexit:
1474c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (script_ptr) {
1475c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr,
1476c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main                _exception ? JNI_ABORT: 0);
1477c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1478c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1479bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)ret;
1480c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1481c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1482bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
14836f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptIntrinsicCreate(JNIEnv *_env, jobject _this, jlong con, jint id, jlong eid, jboolean mUseInc)
1484c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1485bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptIntrinsicCreate, con(%p) id(%i) element(%p)", (RsContext)con, id, (void *)eid);
14866f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTabInc.ScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
14886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
14896f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTab.ScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
14906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1491c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1492c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1493bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
14946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptKernelIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jint sig, jboolean mUseInc)
1495c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1496bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptKernelIDCreate, con(%p) script(%p), slot(%i), sig(%i)", (RsContext)con,
1497bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)sid, slot, sig);
14986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
14996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTabInc.ScriptKernelIDCreate((RsContext)con, (RsScript)sid,
1500d454f4541683a6bddfa1d00424a71f5855675e86Yang Ni                                                                     slot, sig);
15016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
15026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTab.ScriptKernelIDCreate((RsContext)con, (RsScript)sid,
15036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                                  slot, sig);
15046f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1505c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1506c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1507bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1508086010500c28e2bca57ea583d3f38da9a2f2f414Yang NinScriptInvokeIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
1509086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni{
1510086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    LOG_API("nScriptInvokeIDCreate, con(%p) script(%p), slot(%i), sig(%i)", con,
1511086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni            (void *)sid, slot);
1512086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    return (jlong)dispatchTab.ScriptInvokeIDCreate((RsContext)con, (RsScript)sid, slot);
1513086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni}
1514086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni
1515086010500c28e2bca57ea583d3f38da9a2f2f414Yang Nistatic jlong
15166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnScriptFieldIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jboolean mUseInc)
1517c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1518bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptFieldIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con, (void *)sid, slot);
15196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (mUseInc) {
15206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTabInc.ScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
15216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    } else {
15226f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return (jlong)(uintptr_t)dispatchTab.ScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
15236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1524c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1525c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1526bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1527bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _kernels, jlongArray _src,
1528bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlongArray _dstk, jlongArray _dstf, jlongArray _types)
1529bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{
1530bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupCreate, con(%p)", (RsContext)con);
1531bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1532bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint kernelsLen = _env->GetArrayLength(_kernels);
1533bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jKernelsPtr = _env->GetLongArrayElements(_kernels, nullptr);
1534bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsScriptKernelID* kernelsPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * kernelsLen);
1535bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < kernelsLen; ++i) {
1536bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        kernelsPtr[i] = (RsScriptKernelID)jKernelsPtr[i];
1537bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1538bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1539bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint srcLen = _env->GetArrayLength(_src);
1540bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jSrcPtr = _env->GetLongArrayElements(_src, nullptr);
1541bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsScriptKernelID* srcPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * srcLen);
1542bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < srcLen; ++i) {
1543bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        srcPtr[i] = (RsScriptKernelID)jSrcPtr[i];
1544bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1545bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1546bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint dstkLen = _env->GetArrayLength(_dstk);
1547bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jDstkPtr = _env->GetLongArrayElements(_dstk, nullptr);
1548bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsScriptKernelID* dstkPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstkLen);
1549bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < dstkLen; ++i) {
1550bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dstkPtr[i] = (RsScriptKernelID)jDstkPtr[i];
1551bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1552bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1553bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint dstfLen = _env->GetArrayLength(_dstf);
1554bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jDstfPtr = _env->GetLongArrayElements(_dstf, nullptr);
1555bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsScriptKernelID* dstfPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstfLen);
1556bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < dstfLen; ++i) {
1557bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        dstfPtr[i] = (RsScriptKernelID)jDstfPtr[i];
1558bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1559bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1560bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jint typesLen = _env->GetArrayLength(_types);
1561bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong *jTypesPtr = _env->GetLongArrayElements(_types, nullptr);
1562bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    RsType* typesPtr = (RsType*) malloc(sizeof(RsType) * typesLen);
1563bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    for(int i = 0; i < typesLen; ++i) {
1564bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        typesPtr[i] = (RsType)jTypesPtr[i];
1565bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
1566bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1567bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    jlong id = (jlong)(uintptr_t) dispatchTab.ScriptGroupCreate((RsContext)con,
1568bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptKernelID *)kernelsPtr, kernelsLen * sizeof(RsScriptKernelID),
1569bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptKernelID *)srcPtr, srcLen * sizeof(RsScriptKernelID),
1570bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptKernelID *)dstkPtr, dstkLen * sizeof(RsScriptKernelID),
1571bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsScriptFieldID *)dstfPtr, dstfLen * sizeof(RsScriptKernelID),
1572bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                               (RsType *)typesPtr, typesLen * sizeof(RsType));
1573bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1574bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(kernelsPtr);
1575bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(srcPtr);
1576bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(dstkPtr);
1577bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(dstfPtr);
1578bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    free(typesPtr);
1579bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_kernels, jKernelsPtr, 0);
1580bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_src, jSrcPtr, 0);
1581bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_dstk, jDstkPtr, 0);
1582bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_dstf, jDstfPtr, 0);
1583bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    _env->ReleaseLongArrayElements(_types, jTypesPtr, 0);
1584c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return id;
1585c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1586c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1587c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1588bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupSetInput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
1589c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1590bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupSetInput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
1591bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)gid, (void *)kid, (void *)alloc);
1592bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ScriptGroupSetInput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid,
1593bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                    (RsAllocation)alloc);
1594c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1595c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1596c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1597bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupSetOutput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
1598c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1599bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupSetOutput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
1600bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            (void *)gid, (void *)kid, (void *)alloc);
1601bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ScriptGroupSetOutput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid,
1602bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                     (RsAllocation)alloc);
1603c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1604c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1605c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic void
1606bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnScriptGroupExecute(JNIEnv *_env, jobject _this, jlong con, jlong gid)
1607c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1608bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nScriptGroupSetOutput, con(%p) group(%p)", (RsContext)con, (void *)gid);
1609bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    dispatchTab.ScriptGroupExecute((RsContext)con, (RsScriptGroup)gid);
1610c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1611c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1612c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// ---------------------------------------------------------------------------
1613c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1614bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jlong
1615bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnSamplerCreate(JNIEnv *_env, jobject _this, jlong con, jint magFilter, jint minFilter,
1616c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main               jint wrapS, jint wrapT, jint wrapR, jfloat aniso)
1617c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1618bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    LOG_API("nSamplerCreate, con(%p)", (RsContext)con);
1619bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jlong)(uintptr_t)dispatchTab.SamplerCreate((RsContext)con,
1620bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)magFilter,
1621bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)minFilter,
1622bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)wrapS,
1623bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)wrapT,
1624bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       (RsSamplerValue)wrapR,
1625bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                                       aniso);
1626bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang}
1627bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1628bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangstatic jint
1629bec39b6de685a7dddb1925c7e9f83fae20388de3Miao WangnSystemGetPointerSize(JNIEnv *_env, jobject _this) {
1630bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    return (jint)sizeof(void*);
1631c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1632c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
16336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// ---------------------------------------------------------------------------
16346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// For Incremental Intrinsic Support
16356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic bool nIncLoadSO() {
16366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    void* handle = NULL;
16376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    handle = dlopen("libRSSupport.so", RTLD_LAZY | RTLD_LOCAL);
16386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (handle == NULL) {
16396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        LOG_API("couldn't dlopen %s, %s", filename, dlerror());
16406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return false;
16416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
16426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
16436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (loadSymbols(handle, dispatchTabInc) == false) {
16446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        LOG_API("%s init failed!", filename);
16456f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return false;
16466f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
16476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("Successfully loaded %s", filename);
16486f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return true;
16496f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
16506f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
16516f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
16526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// To create/destroy a dummy context
16536f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
16546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj)
16556f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
16566f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj);
16576f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    dispatchTabInc.ObjDestroy((RsContext)con, (void *)obj);
16586f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
16596f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
16606f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
16616f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
16626f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncDeviceCreate(JNIEnv *_env, jobject _this)
16636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
16646f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nDeviceCreate");
16656f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.DeviceCreate();
16666f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
16676f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
16686f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
16696f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev)
16706f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
16716f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nDeviceDestroy");
16726f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return dispatchTabInc.DeviceDestroy((RsDevice)dev);
16736f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
16746f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
16756f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
16766f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer, jint ct)
16776f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
16786f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nContextCreate");
16796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    //The compat context for incremental support will be synchronous.
16806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.ContextCreate((RsDevice)dev, ver, sdkVer,
16816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                          (RsContextType)ct,
16826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                          RS_CONTEXT_SYNCHRONOUS);
16836f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
16846f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
16856f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
16866f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncContextFinish(JNIEnv *_env, jobject _this, jlong con)
16876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
16886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nContextFinish, con(%p)", (RsContext)con);
16896f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    dispatchTabInc.ContextFinish((RsContext)con);
16906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
16916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
16926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic void
16936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncContextDestroy(JNIEnv *_env, jobject _this, jlong con)
16946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
16956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nContextDestroy, con(%p)", (RsContext)con);
16966f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    dispatchTabInc.ContextDestroy((RsContext)con);
16976f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
16986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
16996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
17006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Create dummy Element
17016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
17026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind, jboolean norm, jint size)
17036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
17046f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nElementCreate, con(%p), type(%i), kind(%i), norm(%i), size(%i)", (RsContext)con,
17056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            type, kind, norm, size);
17066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.ElementCreate((RsContext)con, (RsDataType)type,
17076f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                          (RsDataKind)kind, norm, size);
17086f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
17096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
17106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Create dummy Type
17116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
17126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid,
17136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv)
17146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
17156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)",
17166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            incCon, eid, dimx, dimy, dimz, mips, faces, yuv);
17176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
17186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t)dispatchTabInc.TypeCreate((RsContext)con, (RsElement)eid, dimx, dimy,
17196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                       dimz, mips, faces, yuv);
17206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
17216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
17226f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// -----------------------------------
17236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Create Allocation from pointer
17246f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangstatic jlong
17256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao WangnIncAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong alloc, jlong type)
17266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{
17276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)",
17286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            incCon, (RsElement)type, mips, usage, (void *)pointer);
17296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    size_t strideIn;
17306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    void* pIn = NULL;
17316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    RsAllocation ainI = NULL;
17326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    if (alloc != 0) {
17336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        pIn = dispatchTab.AllocationGetPointer((RsContext)con, (RsAllocation)alloc, 0,
17346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                               RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 0, 0,
17356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                               &strideIn, sizeof(size_t));
17366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        ainI = dispatchTabInc.AllocationCreateTyped((RsContext)incCon, (RsType)type,
17376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                    RS_ALLOCATION_MIPMAP_NONE,
17386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                    RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_SHARED,
17396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                                    (uintptr_t)pIn);
17406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
17416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    return (jlong)(uintptr_t) ainI;
17426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang}
1743c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
17442e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang// ---------------------------------------------------------------------------
1745c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1746bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1747c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic const char *classPathName = "android/support/v8/renderscript/RenderScript";
1748c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1749c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainstatic JNINativeMethod methods[] = {
17507c0de6383be18a1dae1297c54c56f3d9afbeaaadMiao Wang{"nLoadSO",                        "(ZI)Z",                                   (bool*)nLoadSO },
1751dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang{"nLoadIOSO",                      "()Z",                                     (bool*)nLoadIOSO },
1752bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nDeviceCreate",                  "()J",                                     (void*)nDeviceCreate },
1753bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nDeviceDestroy",                 "(J)V",                                    (void*)nDeviceDestroy },
1754bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nDeviceSetConfig",               "(JII)V",                                  (void*)nDeviceSetConfig },
1755bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextGetUserMessage",         "(J[I)I",                                  (void*)nContextGetUserMessage },
1756bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextGetErrorMessage",        "(J)Ljava/lang/String;",                   (void*)nContextGetErrorMessage },
1757bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextPeekMessage",            "(J[I)I",                                  (void*)nContextPeekMessage },
1758bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextInitToClient",           "(J)V",                                    (void*)nContextInitToClient },
1759bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"nContextDeinitToClient",         "(J)V",                                    (void*)nContextDeinitToClient },
1760c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1761c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1762c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// All methods below are thread protected in java.
1763ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang{"rsnContextCreate",                 "(JIIILjava/lang/String;)J",             (void*)nContextCreate },
1764bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextFinish",                 "(J)V",                                  (void*)nContextFinish },
1765bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextSetPriority",            "(JI)V",                                 (void*)nContextSetPriority },
1766bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextDestroy",                "(J)V",                                  (void*)nContextDestroy },
1767bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextDump",                   "(JI)V",                                 (void*)nContextDump },
1768bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnContextSendMessage",            "(JI[I)V",                               (void*)nContextSendMessage },
1769b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnClosureCreate",                 "(JJJ[J[J[I[J[J)J",                      (void*)nClosureCreate },
1770b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnInvokeClosureCreate",           "(JJ[B[J[J[I)J",                         (void*)nInvokeClosureCreate },
1771b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnClosureSetArg",                 "(JJIJI)V",                              (void*)nClosureSetArg },
1772b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnClosureSetGlobal",              "(JJJJI)V",                              (void*)nClosureSetGlobal },
1773bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnObjDestroy",                    "(JJ)V",                                 (void*)nObjDestroy },
1774bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1775bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnElementCreate",                 "(JJIZI)J",                              (void*)nElementCreate },
1776bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnElementCreate2",                "(J[J[Ljava/lang/String;[I)J",           (void*)nElementCreate2 },
1777bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnElementGetSubElements",         "(JJ[J[Ljava/lang/String;[I)V",          (void*)nElementGetSubElements },
1778bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1779bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnTypeCreate",                    "(JJIIIZZI)J",                           (void*)nTypeCreate },
1780bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1781bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCreateTyped",         "(JJIIJ)J",                              (void*)nAllocationCreateTyped },
1782bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCreateFromBitmap",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateFromBitmap },
1783bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCreateBitmapBackedAllocation",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateBitmapBackedAllocation },
1784bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCubeCreateFromBitmap","(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCubeCreateFromBitmap },
1785bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1786bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCopyFromBitmap",      "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyFromBitmap },
1787bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationCopyToBitmap",        "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyToBitmap },
1788bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1789bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationSyncAll",             "(JJI)V",                                (void*)nAllocationSyncAll },
1790bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationSetSurface",          "(JJLandroid/view/Surface;)V",           (void*)nAllocationSetSurface },
1791bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationIoSend",              "(JJ)V",                                 (void*)nAllocationIoSend },
17922e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationData1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationData1D },
1793bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationElementData1D",       "(JJIII[BI)V",                           (void*)nAllocationElementData1D },
1794244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang//{"rsnAllocationElementData",         "(JJIIIII[BI)V",                         (void*)nAllocationElementData },
17952e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationData2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationData2D },
1796bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationData2D",              "(JJIIIIIIJIIII)V",                      (void*)nAllocationData2D_alloc },
17972e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationData3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",    (void*)nAllocationData3D },
1798bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationData3D",              "(JJIIIIIIIJIIII)V",                     (void*)nAllocationData3D_alloc },
17992e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationRead",                "(JJLjava/lang/Object;IIZ)V",            (void*)nAllocationRead },
18002e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationRead1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationRead1D },
18013bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang//{"rsnAllocationElementRead",         "(JJIIIII[BI)V",                         (void*)nAllocationElementRead },
18022e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang{"rsnAllocationRead2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationRead2D },
18032e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang//{"rsnAllocationRead3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",  (void*)nAllocationRead3D },
1804bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationGetType",             "(JJ)J",                                 (void*)nAllocationGetType},
1805bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationResize1D",            "(JJI)V",                                (void*)nAllocationResize1D },
1806bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnAllocationGenerateMipmaps",     "(JJ)V",                                 (void*)nAllocationGenerateMipmaps },
1807bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
18086f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptBindAllocation",          "(JJJIZ)V",                              (void*)nScriptBindAllocation },
18096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetTimeZone",             "(JJ[BZ)V",                              (void*)nScriptSetTimeZone },
18106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptInvoke",                  "(JJIZ)V",                               (void*)nScriptInvoke },
18116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptInvokeV",                 "(JJI[BZ)V",                             (void*)nScriptInvokeV },
18126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEach",                 "(JJJIJJZ)V",                            (void*)nScriptForEach },
18136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEach",                 "(JJJIJJ[BZ)V",                          (void*)nScriptForEachV },
18146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEachClipped",          "(JJJIJJIIIIIIZ)V",                      (void*)nScriptForEachClipped },
18156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptForEachClipped",          "(JJJIJJ[BIIIIIIZ)V",                    (void*)nScriptForEachClippedV },
18166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarI",                 "(JJIIZ)V",                              (void*)nScriptSetVarI },
18176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarJ",                 "(JJIJZ)V",                              (void*)nScriptSetVarJ },
18186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarF",                 "(JJIFZ)V",                              (void*)nScriptSetVarF },
18196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarD",                 "(JJIDZ)V",                              (void*)nScriptSetVarD },
18206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarV",                 "(JJI[BZ)V",                             (void*)nScriptSetVarV },
18216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarVE",                "(JJI[BJ[IZ)V",                          (void*)nScriptSetVarVE },
18226f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptSetVarObj",               "(JJIJZ)V",                              (void*)nScriptSetVarObj },
1823bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1824bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptCCreate",                 "(JLjava/lang/String;Ljava/lang/String;[BI)J",  (void*)nScriptCCreate },
18256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptIntrinsicCreate",         "(JIJZ)J",                               (void*)nScriptIntrinsicCreate },
18266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptKernelIDCreate",          "(JJIIZ)J",                              (void*)nScriptKernelIDCreate },
1827086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni{"rsnScriptInvokeIDCreate",          "(JJI)J",                                (void*)nScriptInvokeIDCreate },
18286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnScriptFieldIDCreate",           "(JJIZ)J",                               (void*)nScriptFieldIDCreate },
1829bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupCreate",             "(J[J[J[J[J[J)J",                        (void*)nScriptGroupCreate },
1830e68c5973af1e80c77cab9aea0b77f46a801aef96Yang Ni{"rsnScriptGroup2Create",            "(JLjava/lang/String;Ljava/lang/String;[J)J", (void*)nScriptGroup2Create },
1831bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupSetInput",           "(JJJJ)V",                               (void*)nScriptGroupSetInput },
1832bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupSetOutput",          "(JJJJ)V",                               (void*)nScriptGroupSetOutput },
1833bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnScriptGroupExecute",            "(JJ)V",                                 (void*)nScriptGroupExecute },
1834b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang{"rsnScriptGroup2Execute",           "(JJ)V",                                 (void*)nScriptGroup2Execute },
1835bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
1836bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnSamplerCreate",                 "(JIIIIIF)J",                            (void*)nSamplerCreate },
1837c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1838bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang{"rsnSystemGetPointerSize",          "()I",                                   (void*)nSystemGetPointerSize },
18396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
18406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Entry points for Inc libRSSupport
18416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"nIncLoadSO",                       "()Z",                                   (bool*)nIncLoadSO },
18426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"nIncDeviceCreate",                 "()J",                                   (void*)nIncDeviceCreate },
18436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"nIncDeviceDestroy",                "(J)V",                                  (void*)nIncDeviceDestroy },
18446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncContextCreate",              "(JIII)J",                               (void*)nIncContextCreate },
18456f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncContextFinish",              "(J)V",                                  (void*)nIncContextFinish },
18466f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncContextDestroy",             "(J)V",                                  (void*)nIncContextDestroy },
18476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncObjDestroy",                 "(JJ)V",                                 (void*)nIncObjDestroy },
18486f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncElementCreate",              "(JJIZI)J",                              (void*)nIncElementCreate },
18496f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncTypeCreate",                 "(JJIIIZZI)J",                           (void*)nIncTypeCreate },
18506f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang{"rsnIncAllocationCreateTyped",      "(JJJJ)J",                               (void*)nIncAllocationCreateTyped },
1851c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main};
1852c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1853c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main// ---------------------------------------------------------------------------
1854c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1855c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainjint JNI_OnLoad(JavaVM* vm, void* reserved)
1856c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main{
1857c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    JNIEnv* env = NULL;
1858257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    jclass clazz = NULL;
1859c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    jint result = -1;
1860c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1861c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
1862184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
1863184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "ERROR: GetEnv failed\n");
1864257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        goto bail;
1865257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
1866257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (env == NULL) {
1867184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "ERROR: env == NULL");
1868257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        goto bail;
1869257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
1870257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines
1871257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    clazz = env->FindClass(classPathName);
1872257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (clazz == NULL) {
1873c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto bail;
1874c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1875c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1876257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    if (env->RegisterNatives(clazz, methods, NELEM(methods)) < 0) {
1877184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //        __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
1878184d51999d546d11dd18d2f5f848871f8459a230Tim Murray        //            "ERROR: MediaPlayer native registration failed\n");
1879c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main        goto bail;
1880c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    }
1881c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1882c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    /* success -- return valid version number */
1883c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    result = JNI_VERSION_1_4;
1884c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main
1885c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Mainbail:
1886c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main    return result;
1887c89ad4606ae29e103b85bdfc40c57e36c8877dbaScott Main}
1888