1d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams/*
24cbe25a86b4aa3353c8016a129028671e902611fStephen Hines * Copyright (C) 2011-2012 The Android Open Source Project
3d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *
4d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * you may not use this file except in compliance with the License.
6d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * You may obtain a copy of the License at
7d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *
8d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *
10d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Unless required by applicable law or agreed to in writing, software
11d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * See the License for the specific language governing permissions and
14d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * limitations under the License.
15d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams */
16d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
17d1516dffa8d676fcad092d9736163829e6d0fdceJason Sams#define LOG_TAG "RenderScript_jni"
18f29ca50d80e3dc379de1642e85b7963175b2ca38Jason Sams
19d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include <stdlib.h>
20d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include <stdio.h>
21d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include <fcntl.h>
22d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include <unistd.h>
23d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include <math.h>
24d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include <utils/misc.h>
2509993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer#include <inttypes.h>
26d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
27b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/Asset.h>
28b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/AssetManager.h>
29b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/ResourceTypes.h>
30f29ca50d80e3dc379de1642e85b7963175b2ca38Jason Sams
31d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "jni.h"
32d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "JNIHelp.h"
33d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "android_runtime/AndroidRuntime.h"
34ee956053d6e3f7a7a82e41853b9b251fdc226d7aJim Miller#include "android_runtime/android_view_Surface.h"
35b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk#include "android_runtime/android_util_AssetManager.h"
36f4faeac3525fe1ce3707ab785a1651aec367589dJohn Reck#include "android/graphics/GraphicsJNI.h"
3733287e8a893821be86b395ce9d5d639cc8a535f3Miao Wang#include "android/native_window.h"
3833287e8a893821be86b395ce9d5d639cc8a535f3Miao Wang#include "android/native_window_jni.h"
39d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
401d6983af336b2b1d3a24aece58ce0850aa79e8a0Jason Sams#include <rsEnv.h>
41cbb0206cb478c862cb871a65e85115281ef12e02Miao Wang#include <rsApiStubs.h>
42fb9aa9f3ef11878caaf6fcfb5ea49ffb9f7abf33Jason Sams#include <gui/Surface.h>
43d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden#include <gui/GLConsumer.h>
44faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams#include <android_runtime/android_graphics_SurfaceTexture.h>
45d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
463762c311729fe9f3af085c14c5c1fb471d994c03Steve Block//#define LOG_API ALOGE
4767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampestatic constexpr bool kLogApi = false;
48d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
49d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsusing namespace android;
50d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
51414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines#define PER_ARRAY_TYPE(flag, fnc, readonly, ...) {                                      \
52e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    jint len = 0;                                                                       \
53488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    void *ptr = nullptr;                                                                \
5487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    void *srcPtr = nullptr;                                                             \
5521659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    size_t typeBytes = 0;                                                               \
56414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines    jint relFlag = 0;                                                                   \
57414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines    if (readonly) {                                                                     \
58414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        /* The on-release mode should only be JNI_ABORT for read-only accesses. */      \
5987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        /* readonly = true, also indicates we are copying to the allocation   . */      \
60414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        relFlag = JNI_ABORT;                                                            \
61414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines    }                                                                                   \
62e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    switch(dataType) {                                                                  \
63e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_FLOAT_32:                                                              \
64e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jfloatArray)data);                                  \
65e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetFloatArrayElements((jfloatArray)data, flag);                     \
66ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
67ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
68ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
69ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
7021659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 4;                                                                  \
7187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
7287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
7387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
7487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
7587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
7687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
7787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
7887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
7987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
8087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
8187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
8287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
8387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
8487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
8587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
8687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
8787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
8887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
8987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
90414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseFloatArrayElements((jfloatArray)data, (jfloat *)ptr, relFlag);     \
91e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
92e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_FLOAT_64:                                                              \
93e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jdoubleArray)data);                                 \
94e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetDoubleArrayElements((jdoubleArray)data, flag);                   \
95ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
96ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
97ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
98ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
9921659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 8;                                                                  \
10087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
10187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
10287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
10387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
10487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
10587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
10687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
10787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
10887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
10987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
11087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
11187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
11287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
11387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
11487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
11587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
11687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
11787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
11887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
119414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseDoubleArrayElements((jdoubleArray)data, (jdouble *)ptr, relFlag);  \
120e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
121e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_SIGNED_8:                                                              \
122e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_UNSIGNED_8:                                                            \
123e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jbyteArray)data);                                   \
124e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetByteArrayElements((jbyteArray)data, flag);                       \
125ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
126ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
127ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
128ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
12921659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 1;                                                                  \
13087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
13187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
13287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
13387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
13487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
13587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
13687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
13787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
13887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
13987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
14087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
14187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
14287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
14387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
14487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
14587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
14687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
14787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
14887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
149414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseByteArrayElements((jbyteArray)data, (jbyte*)ptr, relFlag);         \
150e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
151e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_SIGNED_16:                                                             \
152e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_UNSIGNED_16:                                                           \
1531333215d8e61c1cbcabb551ac9a49a801f90ca76Pirama Arumuga Nainar    case RS_TYPE_FLOAT_16:                                                              \
154e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jshortArray)data);                                  \
155e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetShortArrayElements((jshortArray)data, flag);                     \
156ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
157ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
158ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
159ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
16021659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 2;                                                                  \
16187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
16287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
16387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
16487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
16587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
16687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
16787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
16887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
16987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
17087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
17187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
17287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
17387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
17487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
17587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
17687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
17787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
17887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
17987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
180414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseShortArrayElements((jshortArray)data, (jshort *)ptr, relFlag);     \
181e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
182e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_SIGNED_32:                                                             \
183e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_UNSIGNED_32:                                                           \
184e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jintArray)data);                                    \
185e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetIntArrayElements((jintArray)data, flag);                         \
186ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
187ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
188ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
189ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
19021659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 4;                                                                  \
19187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
19287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
19387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
19487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
19587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
19687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
19787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
19887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
19987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
20087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
20187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
20287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
20387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
20487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
20587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
20687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
20787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
20887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
20987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
210414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseIntArrayElements((jintArray)data, (jint *)ptr, relFlag);           \
211e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
212e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_SIGNED_64:                                                             \
213e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_UNSIGNED_64:                                                           \
214e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jlongArray)data);                                   \
215e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetLongArrayElements((jlongArray)data, flag);                       \
216ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
217ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
218ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
219ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
22021659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 8;                                                                  \
22187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
22287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
22387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
22487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
22587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
22687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
22787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
22887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
22987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
23087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
23187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
23287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
23387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
23487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
23587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
23687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
23787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
23887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
23987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
240414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseLongArrayElements((jlongArray)data, (jlong *)ptr, relFlag);        \
241e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
242e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    default:                                                                            \
243e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        break;                                                                          \
244e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    }                                                                                   \
24587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    UNUSED(len, ptr, srcPtr, typeBytes, relFlag);                                       \
246e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams}
247e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams
248e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams
249b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchoukclass AutoJavaStringToUTF8 {
250b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchoukpublic:
2512123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringToUTF8(JNIEnv* env, jstring str) : fEnv(env), fJStr(str) {
252488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        fCStr = env->GetStringUTFChars(str, nullptr);
253b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        fLength = env->GetStringUTFLength(str);
254b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
2552123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    ~AutoJavaStringToUTF8() {
256b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        fEnv->ReleaseStringUTFChars(fJStr, fCStr);
257b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
258b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    const char* c_str() const { return fCStr; }
259b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    jsize length() const { return fLength; }
260b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
261b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchoukprivate:
262b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    JNIEnv*     fEnv;
263b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    jstring     fJStr;
264b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    const char* fCStr;
265b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    jsize       fLength;
266b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk};
267b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
2682123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchoukclass AutoJavaStringArrayToUTF8 {
2692123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchoukpublic:
2702123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8(JNIEnv* env, jobjectArray strings, jsize stringsLength)
2712123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    : mEnv(env), mStrings(strings), mStringsLength(stringsLength) {
272488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        mCStrings = nullptr;
273488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        mSizeArray = nullptr;
2742123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        if (stringsLength > 0) {
2752123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            mCStrings = (const char **)calloc(stringsLength, sizeof(char *));
2762123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            mSizeArray = (size_t*)calloc(stringsLength, sizeof(size_t));
2772123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            for (jsize ct = 0; ct < stringsLength; ct ++) {
2782123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
279488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes                mCStrings[ct] = mEnv->GetStringUTFChars(s, nullptr);
2802123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                mSizeArray[ct] = mEnv->GetStringUTFLength(s);
2812123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            }
2822123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        }
2832123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    }
2842123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    ~AutoJavaStringArrayToUTF8() {
2852123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        for (jsize ct=0; ct < mStringsLength; ct++) {
2862123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
2872123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            mEnv->ReleaseStringUTFChars(s, mCStrings[ct]);
2882123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        }
2892123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        free(mCStrings);
2902123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        free(mSizeArray);
2912123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    }
2922123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char **c_str() const { return mCStrings; }
2932123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t *c_str_len() const { return mSizeArray; }
2942123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    jsize length() const { return mStringsLength; }
2952123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
2962123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchoukprivate:
2972123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    JNIEnv      *mEnv;
2982123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    jobjectArray mStrings;
2992123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char **mCStrings;
3002123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t      *mSizeArray;
3012123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    jsize        mStringsLength;
3022123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk};
3032123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
304d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
305d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
306ffe9f48890dde7173a0845d32887fdf94a49b0a7Jason Samsstatic jfieldID gContextId = 0;
307d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
308d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void _nInit(JNIEnv *_env, jclass _this)
309d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
310eff663f391fa4f119685d5c14489b94661ea126fTim Murray    gContextId             = _env->GetFieldID(_this, "mContext", "J");
311d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
312d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
313d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
314d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
31587e908dfdece91b5f504386d4901fa3342dc8083Miao Wangstatic void copyWithPadding(void* ptr, void* srcPtr, int mSize, int count) {
31687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int sizeBytesPad = mSize * 4;
31787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int sizeBytes = mSize * 3;
31887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    uint8_t *dst = static_cast<uint8_t *>(ptr);
31987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    uint8_t *src = static_cast<uint8_t *>(srcPtr);
32087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    for (int i = 0; i < count; i++) {
32187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        memcpy(dst, src, sizeBytes);
32287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        dst += sizeBytesPad;
32387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        src += sizeBytes;
32487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    }
32587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang}
32687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang
32787e908dfdece91b5f504386d4901fa3342dc8083Miao Wangstatic void copyWithUnPadding(void* ptr, void* srcPtr, int mSize, int count) {
32887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int sizeBytesPad = mSize * 4;
32987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int sizeBytes = mSize * 3;
33087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    uint8_t *dst = static_cast<uint8_t *>(ptr);
33187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    uint8_t *src = static_cast<uint8_t *>(srcPtr);
33287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    for (int i = 0; i < count; i++) {
33387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        memcpy(dst, src, sizeBytes);
33487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        dst += sizeBytes;
33587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        src += sizeBytesPad;
33687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    }
33787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang}
33887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang
33987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang
34087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang// ---------------------------------------------------------------------------
3413eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Samsstatic void
342eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextFinish(JNIEnv *_env, jobject _this, jlong con)
34396ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams{
34467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
34567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextFinish, con(%p)", (RsContext)con);
34667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
347eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextFinish((RsContext)con);
34896ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams}
34996ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams
350281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic jlong
351281c3252510bcf4120d17fa0125f369c2c78f162Yang NinClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong kernelID,
352281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni               jlong returnValue, jlongArray fieldIDArray,
353281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni               jlongArray valueArray, jintArray sizeArray,
354281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni               jlongArray depClosureArray, jlongArray depFieldIDArray) {
35517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong ret = 0;
35617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
357281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
358281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
359ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jFieldIDs == nullptr) {
360ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: fieldIDs.");
361ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
362ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
363ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
36417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
36517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize values_length = _env->GetArrayLength(valueArray);
366ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jValues == nullptr) {
367ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: values.");
368ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
369ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
370ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
37117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
37217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize sizes_length = _env->GetArrayLength(sizeArray);
373ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jSizes == nullptr) {
374ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: sizes.");
375ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
376ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
377ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
37817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong* jDepClosures =
37917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      _env->GetLongArrayElements(depClosureArray, nullptr);
38017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize depClosures_length = _env->GetArrayLength(depClosureArray);
381ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jDepClosures == nullptr) {
382ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: depClosures.");
383ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
384ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
385ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
38617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong* jDepFieldIDs =
38717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      _env->GetLongArrayElements(depFieldIDArray, nullptr);
38817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize depFieldIDs_length = _env->GetArrayLength(depFieldIDArray);
389ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jDepFieldIDs == nullptr) {
390ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: depFieldIDs.");
391ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
392ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
39317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
39417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  size_t numValues, numDependencies;
39517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsScriptFieldID* fieldIDs;
39617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsClosure* depClosures;
39717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsScriptFieldID* depFieldIDs;
39817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
39917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (fieldIDs_length != values_length || values_length != sizes_length) {
40017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Unmatched field IDs, values, and sizes in closure creation.");
40117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
40217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
40317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
40417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  numValues = (size_t)fieldIDs_length;
40517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
40617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (depClosures_length != depFieldIDs_length) {
40717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Unmatched closures and field IDs for dependencies in closure creation.");
40817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
40917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
41017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
41117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  numDependencies = (size_t)depClosures_length;
41217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
41317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (numDependencies > numValues) {
41417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Unexpected number of dependencies in closure creation");
41517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
41617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
41717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
4187b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni  if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
41917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Too many arguments or globals in closure creation");
42017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
42117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
42217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
42386c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni  if (numValues > 0) {
42486c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
42586c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      if (fieldIDs == nullptr) {
42686c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni          goto exit;
42786c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      }
42886c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni  } else {
42986c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      // numValues == 0
43086c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      // alloca(0) implementation is platform-dependent.
43186c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      fieldIDs = nullptr;
43217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
43317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
43417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  for (size_t i = 0; i < numValues; i++) {
435281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni    fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
436281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  }
437281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
43886c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni  if (numDependencies > 0) {
43986c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      depClosures = (RsClosure*)alloca(sizeof(RsClosure) * numDependencies);
44086c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      if (depClosures == nullptr) {
44186c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni          goto exit;
44286c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      }
44386c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni
44486c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      for (size_t i = 0; i < numDependencies; i++) {
44586c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni          depClosures[i] = (RsClosure)jDepClosures[i];
44686c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      }
44786c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni
44886c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      depFieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numDependencies);
44986c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      if (depFieldIDs == nullptr) {
45086c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni          goto exit;
45186c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      }
45286c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni
45386c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      for (size_t i = 0; i < numDependencies; i++) {
45486c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni          depFieldIDs[i] = (RsClosure)jDepFieldIDs[i];
45586c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      }
45686c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni  } else {
45786c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      // alloca(0) implementation is platform-dependent.
45886c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      depClosures = nullptr;
45986c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      depFieldIDs = nullptr;
460281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  }
461281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
46217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  ret = (jlong)(uintptr_t)rsClosureCreate(
463281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni      (RsContext)con, (RsScriptKernelID)kernelID, (RsAllocation)returnValue,
464263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni      fieldIDs, numValues, jValues, numValues,
46517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      (int*)jSizes, numValues,
46617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      depClosures, numDependencies,
46717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      depFieldIDs, numDependencies);
46817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
46917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Niexit:
47017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
47117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(depFieldIDArray, jDepFieldIDs, JNI_ABORT);
47217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(depClosureArray, jDepClosures, JNI_ABORT);
47317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseIntArrayElements (sizeArray,       jSizes,       JNI_ABORT);
47417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(valueArray,      jValues,      JNI_ABORT);
47517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(fieldIDArray,    jFieldIDs,    JNI_ABORT);
47617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
47717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  return ret;
478281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
479281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
480be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Nistatic jlong
481be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang NinInvokeClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong invokeID,
482be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni                     jbyteArray paramArray, jlongArray fieldIDArray, jlongArray valueArray,
483be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni                     jintArray sizeArray) {
48417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong ret = 0;
48517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
486be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jbyte* jParams = _env->GetByteArrayElements(paramArray, nullptr);
487be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jsize jParamLength = _env->GetArrayLength(paramArray);
488ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jParams == nullptr) {
489ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: params.");
490ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
491ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
492ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
493be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
494be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
495ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jFieldIDs == nullptr) {
496ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: fieldIDs.");
497ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
498ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
499ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
50017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
50117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize values_length = _env->GetArrayLength(valueArray);
502ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jValues == nullptr) {
503ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: values.");
504ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
505ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
506ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
50717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
50817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize sizes_length = _env->GetArrayLength(sizeArray);
509ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jSizes == nullptr) {
510ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: sizes.");
511ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
512ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
51317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
51417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  size_t numValues;
51517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsScriptFieldID* fieldIDs;
51617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
51717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (fieldIDs_length != values_length || values_length != sizes_length) {
51817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Unmatched field IDs, values, and sizes in closure creation.");
51917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
52017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
52117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
52217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  numValues = (size_t) fieldIDs_length;
52317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
5247b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni  if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
52517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Too many arguments or globals in closure creation");
52617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
52717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
52817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
52917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
53017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (fieldIDs == nullptr) {
53117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
53217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
53317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
53417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  for (size_t i = 0; i< numValues; i++) {
535be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
536be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  }
537be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
53817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  ret = (jlong)(uintptr_t)rsInvokeClosureCreate(
539be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni      (RsContext)con, (RsScriptInvokeID)invokeID, jParams, jParamLength,
540263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni      fieldIDs, numValues, jValues, numValues,
54117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      (int*)jSizes, numValues);
54217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
54317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Niexit:
54417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
54517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseIntArrayElements (sizeArray,       jSizes,       JNI_ABORT);
54617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(valueArray,      jValues,      JNI_ABORT);
54717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(fieldIDArray,    jFieldIDs,    JNI_ABORT);
54817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseByteArrayElements(paramArray,      jParams,      JNI_ABORT);
54917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
55017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  return ret;
551be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni}
552be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
553281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic void
554281c3252510bcf4120d17fa0125f369c2c78f162Yang NinClosureSetArg(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
555281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni               jint index, jlong value, jint size) {
556263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni  // Size is signed with -1 indicating the value is an Allocation
557281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  rsClosureSetArg((RsContext)con, (RsClosure)closureID, (uint32_t)index,
558263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni                  (uintptr_t)value, size);
559281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
560281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
561281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic void
562281c3252510bcf4120d17fa0125f369c2c78f162Yang NinClosureSetGlobal(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
563281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni                  jlong fieldID, jlong value, jint size) {
564263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni  // Size is signed with -1 indicating the value is an Allocation
565281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  rsClosureSetGlobal((RsContext)con, (RsClosure)closureID,
566263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni                     (RsScriptFieldID)fieldID, (int64_t)value, size);
567281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
568281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
569281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic long
57035be56cce821d86f69026398ff9433e2d173b02fYang NinScriptGroup2Create(JNIEnv *_env, jobject _this, jlong con, jstring name,
571ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni                    jstring cacheDir, jlongArray closureArray) {
57217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong ret = 0;
57317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
57435be56cce821d86f69026398ff9433e2d173b02fYang Ni  AutoJavaStringToUTF8 nameUTF(_env, name);
575ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni  AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
576ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni
577281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  jlong* jClosures = _env->GetLongArrayElements(closureArray, nullptr);
578281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  jsize numClosures = _env->GetArrayLength(closureArray);
579ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jClosures == nullptr) {
580ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: closures.");
581ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
582ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
58317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
58417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsClosure* closures;
58517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
5867b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni  if (numClosures > (jsize) RS_SCRIPT_GROUP_MAX_NUMBER_CLOSURES) {
58717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni    ALOGE("Too many closures in script group");
58817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni    goto exit;
58917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
59017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
59117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  closures = (RsClosure*)alloca(sizeof(RsClosure) * numClosures);
59217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (closures == nullptr) {
59317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
59417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
59517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
596281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  for (int i = 0; i < numClosures; i++) {
597281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni    closures[i] = (RsClosure)jClosures[i];
598281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  }
599281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
60017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  ret = (jlong)(uintptr_t)rsScriptGroup2Create(
60135be56cce821d86f69026398ff9433e2d173b02fYang Ni      (RsContext)con, nameUTF.c_str(), nameUTF.length(),
60235be56cce821d86f69026398ff9433e2d173b02fYang Ni      cacheDirUTF.c_str(), cacheDirUTF.length(),
603ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni      closures, numClosures);
60417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
60517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Niexit:
60617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
60717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(closureArray, jClosures, JNI_ABORT);
60817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
60917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  return ret;
610281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
611281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
612281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic void
613281c3252510bcf4120d17fa0125f369c2c78f162Yang NinScriptGroup2Execute(JNIEnv *_env, jobject _this, jlong con, jlong groupID) {
614281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  rsScriptGroupExecute((RsContext)con, (RsScriptGroup2)groupID);
615281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
616281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
61796ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Samsstatic void
61825207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Single(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
61925207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
62025207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jfloat alpha, jlong A, jlong B, jfloat beta, jlong C, jint incX, jint incY,
62125207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint KL, jint KU) {
62225207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
62325207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
62425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
62525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
62625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
62725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
62825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
62925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
63025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
63125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
63225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
63325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.f = alpha;
63425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.f = beta;
63525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
63625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
63725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
63825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
63925207df658d6a8a3e885c7017fcc25702363583cTim Murray
64025207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
64125207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
64225207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
64325207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
64425207df658d6a8a3e885c7017fcc25702363583cTim Murray
64525207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
646b742fcc808165fbeeb1a48761e7d629f60207de2Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
64725207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
64825207df658d6a8a3e885c7017fcc25702363583cTim Murray}
64925207df658d6a8a3e885c7017fcc25702363583cTim Murray
65025207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
65125207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Double(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
65225207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
65325207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jdouble alpha, jlong A, jlong B, jdouble beta, jlong C, jint incX, jint incY,
65425207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint KL, jint KU) {
65525207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
65625207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
65725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
65825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
65925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
66025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
66125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
66225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
66325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
66425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
66525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
66625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.d = alpha;
66725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.d = beta;
66825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
66925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
67025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
67125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
67225207df658d6a8a3e885c7017fcc25702363583cTim Murray
67325207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
67425207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
67525207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
67625207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
67725207df658d6a8a3e885c7017fcc25702363583cTim Murray
67825207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
6790b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
68025207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
68125207df658d6a8a3e885c7017fcc25702363583cTim Murray}
68225207df658d6a8a3e885c7017fcc25702363583cTim Murray
68325207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
68425207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Complex(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
68525207df658d6a8a3e885c7017fcc25702363583cTim Murray                             jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
68625207df658d6a8a3e885c7017fcc25702363583cTim Murray                             jfloat alphaX, jfloat alphaY, jlong A, jlong B, jfloat betaX,
68725207df658d6a8a3e885c7017fcc25702363583cTim Murray                             jfloat betaY, jlong C, jint incX, jint incY, jint KL, jint KU) {
68825207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
68925207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
69025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
69125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
69225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
69325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
69425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
69525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
69625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
69725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
69825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
69925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.c.r = alphaX;
70025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.c.i = alphaY;
70125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.c.r = betaX;
70282585b3906955e57e199d962b8fe11b2bab87fbaMiao Wang    call.beta.c.i = betaY;
70325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
70425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
70525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
70625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
70725207df658d6a8a3e885c7017fcc25702363583cTim Murray
70825207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
70925207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
71025207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
71125207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
71225207df658d6a8a3e885c7017fcc25702363583cTim Murray
71325207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7140b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
71525207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
71625207df658d6a8a3e885c7017fcc25702363583cTim Murray}
71725207df658d6a8a3e885c7017fcc25702363583cTim Murray
71825207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
71925207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Z(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
72025207df658d6a8a3e885c7017fcc25702363583cTim Murray                       jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
72125207df658d6a8a3e885c7017fcc25702363583cTim Murray                       jdouble alphaX, jdouble alphaY, jlong A, jlong B, jdouble betaX,
72225207df658d6a8a3e885c7017fcc25702363583cTim Murray                       jdouble betaY, jlong C, jint incX, jint incY, jint KL, jint KU) {
72325207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
72425207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
72525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
72625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
72725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
72825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
72925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
73025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
73125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
73225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
73325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
73425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.z.r = alphaX;
73525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.z.i = alphaY;
73625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.z.r = betaX;
73782585b3906955e57e199d962b8fe11b2bab87fbaMiao Wang    call.beta.z.i = betaY;
73825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
73925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
74025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
74125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
74225207df658d6a8a3e885c7017fcc25702363583cTim Murray
74325207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
74425207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
74525207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
74625207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
74725207df658d6a8a3e885c7017fcc25702363583cTim Murray
74825207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7490b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
75025207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
75125207df658d6a8a3e885c7017fcc25702363583cTim Murray}
75225207df658d6a8a3e885c7017fcc25702363583cTim Murray
75325207df658d6a8a3e885c7017fcc25702363583cTim Murray
75425207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
7559cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim MurraynScriptIntrinsicBLAS_BNNM(JNIEnv *_env, jobject _this, jlong con, jlong id, jint M, jint N, jint K,
7569cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray                                             jlong A, jint a_offset, jlong B, jint b_offset, jlong C, jint c_offset,
7579cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray                                             jint c_mult_int) {
7589cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    RsBlasCall call;
7599cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    memset(&call, 0, sizeof(call));
7609cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.func = RsBlas_bnnm;
7619cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.M = M;
7629cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.N = N;
7639cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.K = K;
7642514806817ec394d334595d76e20f3129117da6eMiao Wang    call.a_offset = a_offset & 0xFF;
7652514806817ec394d334595d76e20f3129117da6eMiao Wang    call.b_offset = b_offset & 0xFF;
7669cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.c_offset = c_offset;
7679cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.c_mult_int = c_mult_int;
7689cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7699cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    RsAllocation in_allocs[3];
7709cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    in_allocs[0] = (RsAllocation)A;
7719cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    in_allocs[1] = (RsAllocation)B;
7729cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    in_allocs[2] = (RsAllocation)C;
7739cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7749cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7750b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
7769cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray                         &call, sizeof(call), nullptr, 0);
7779cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray}
7789cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7799cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7809cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murraystatic void
781460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAssignName(JNIEnv *_env, jobject _this, jlong con, jlong obj, jbyteArray str)
7823eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams{
78367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
78467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAssignName, con(%p), obj(%p)", (RsContext)con, (void *)obj);
78567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
7863eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    jint len = _env->GetArrayLength(str);
7873eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    jbyte * cptr = (jbyte *) _env->GetPrimitiveArrayCritical(str, 0);
788ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (cptr == nullptr) {
789ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
790ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
791ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
792ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
793eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAssignName((RsContext)con, (void *)obj, (const char *)cptr, len);
7943eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    _env->ReleasePrimitiveArrayCritical(str, cptr, JNI_ABORT);
7953eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams}
7963eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams
797fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchoukstatic jstring
798460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynGetName(JNIEnv *_env, jobject _this, jlong con, jlong obj)
799fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk{
80067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
80167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nGetName, con(%p), obj(%p)", (RsContext)con, (void *)obj);
80267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
803488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    const char *name = nullptr;
804eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaGetName((RsContext)con, (void *)obj, &name);
805488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if(name == nullptr || strlen(name) == 0) {
806488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        return nullptr;
807581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk    }
808fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk    return _env->NewStringUTF(name);
809fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk}
810fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk
8117ce033d797e5df5e2131e2ed459fba181eaf4658Jason Samsstatic void
812460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj)
8137ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams{
81467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
81567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj);
81667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
817eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsObjDestroy((RsContext)con, (void *)obj);
8187ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams}
8197ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams
8203eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams// ---------------------------------------------------------------------------
8213eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams
822eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic jlong
823d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsnDeviceCreate(JNIEnv *_env, jobject _this)
824d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
82567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
82667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nDeviceCreate");
82767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
8283aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsDeviceCreate();
829d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
830d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
831d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
8325eaf468434e96bc7c8d4cfeb138699a1c7b256caTim MurraynDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev)
833d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
83467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
83567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nDeviceDestroy");
83667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
837d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return rsDeviceDestroy((RsDevice)dev);
838d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
839d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
840ebfb436a49673693b98469683451bd9ede797557Jason Samsstatic void
8415eaf468434e96bc7c8d4cfeb138699a1c7b256caTim MurraynDeviceSetConfig(JNIEnv *_env, jobject _this, jlong dev, jint p, jint value)
842ebfb436a49673693b98469683451bd9ede797557Jason Sams{
84367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
84467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nDeviceSetConfig  dev(%p), param(%i), value(%i)", (void *)dev, p, value);
84567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
846ebfb436a49673693b98469683451bd9ede797557Jason Sams    return rsDeviceSetConfig((RsDevice)dev, (RsDeviceParam)p, value);
847ebfb436a49673693b98469683451bd9ede797557Jason Sams}
848ebfb436a49673693b98469683451bd9ede797557Jason Sams
849eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic jlong
85081cd2b18bd36285d1843f78418282e1dad156fbdJason SamsnContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint flags, jint sdkVer, jint contextType)
851d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
85267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
85367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextCreate");
85467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
85581cd2b18bd36285d1843f78418282e1dad156fbdJason Sams    return (jlong)(uintptr_t)rsContextCreate((RsDevice)dev, 0, sdkVer, (RsContextType)contextType, flags);
856704ff64b099406bb328898a7443921f22dbffd6dJason Sams}
857704ff64b099406bb328898a7443921f22dbffd6dJason Sams
858eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic jlong
8595eaf468434e96bc7c8d4cfeb138699a1c7b256caTim MurraynContextCreateGL(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer,
8600e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint colorMin, jint colorPref,
8610e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint alphaMin, jint alphaPref,
8620e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint depthMin, jint depthPref,
8630e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint stencilMin, jint stencilPref,
8640e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint samplesMin, jint samplesPref, jfloat samplesQ,
8650e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint dpi)
86611c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams{
86786c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni    RsSurfaceConfig sc = {};
86811c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.alphaMin = alphaMin;
86911c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.alphaPref = alphaPref;
87011c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.colorMin = colorMin;
87111c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.colorPref = colorPref;
87211c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.depthMin = depthMin;
87311c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.depthPref = depthPref;
87411c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.samplesMin = samplesMin;
87511c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.samplesPref = samplesPref;
87611c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.samplesQ = samplesQ;
87711c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams
87867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
87967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextCreateGL");
88067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
8813aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsContextCreateGL((RsDevice)dev, ver, sdkVer, sc, dpi);
882d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
883d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
884d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
885eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextSetPriority(JNIEnv *_env, jobject _this, jlong con, jint p)
8867d787b4722eaeb79cab42c36060336e092b77b5fJason Sams{
88767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
88867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("ContextSetPriority, con(%p), priority(%i)", (RsContext)con, p);
88967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
890eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextSetPriority((RsContext)con, p);
8917d787b4722eaeb79cab42c36060336e092b77b5fJason Sams}
8927d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
89347f31582b67f492d9e1523abd0d8b86c38ec007dTim Murraystatic void
89447f31582b67f492d9e1523abd0d8b86c38ec007dTim MurraynContextSetCacheDir(JNIEnv *_env, jobject _this, jlong con, jstring cacheDir)
89547f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray{
89647f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
89747f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray
89847f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    if (kLogApi) {
89947f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray        ALOGD("ContextSetCacheDir, con(%p), cacheDir(%s)", (RsContext)con, cacheDirUTF.c_str());
90047f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    }
90147f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    rsContextSetCacheDir((RsContext)con, cacheDirUTF.c_str(), cacheDirUTF.length());
90247f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray}
90347f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray
9047d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
9057d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
9067d787b4722eaeb79cab42c36060336e092b77b5fJason Samsstatic void
907eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextSetSurface(JNIEnv *_env, jobject _this, jlong con, jint width, jint height, jobject wnd)
908efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams{
90967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
91067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextSetSurface, con(%p), width(%i), height(%i), surface(%p)", (RsContext)con,
91167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              width, height, (Surface *)wnd);
91267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
913efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
914488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    ANativeWindow * window = nullptr;
915488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (wnd == nullptr) {
916efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
917efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams    } else {
91864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        window = android_view_Surface_getNativeWindow(_env, wnd).get();
919efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams    }
920efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
921eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextSetSurface((RsContext)con, width, height, window);
922efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams}
923efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
924efd9b6fb2e0f31b50db089352118e5daeb268879Jason Samsstatic void
925eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextDestroy(JNIEnv *_env, jobject _this, jlong con)
926d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
92767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
92867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextDestroy, con(%p)", (RsContext)con);
92967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
930eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextDestroy((RsContext)con);
931d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
932d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
933715333b832fb448c32165c7d97d408a3fa43f7cbJason Samsstatic void
934eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextDump(JNIEnv *_env, jobject _this, jlong con, jint bits)
935715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams{
93667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
93767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextDump, con(%p)  bits(%i)", (RsContext)con, bits);
93867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
939715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams    rsContextDump((RsContext)con, bits);
940715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams}
941d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
942d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
943eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextPause(JNIEnv *_env, jobject _this, jlong con)
94465e7aa56f56097418d617663683544c25b3988eaJason Sams{
94567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
94667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextPause, con(%p)", (RsContext)con);
94767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
948eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextPause((RsContext)con);
94965e7aa56f56097418d617663683544c25b3988eaJason Sams}
95065e7aa56f56097418d617663683544c25b3988eaJason Sams
95165e7aa56f56097418d617663683544c25b3988eaJason Samsstatic void
952eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextResume(JNIEnv *_env, jobject _this, jlong con)
95365e7aa56f56097418d617663683544c25b3988eaJason Sams{
95467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
95567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextResume, con(%p)", (RsContext)con);
95667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
957eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextResume((RsContext)con);
95865e7aa56f56097418d617663683544c25b3988eaJason Sams}
95965e7aa56f56097418d617663683544c25b3988eaJason Sams
9601c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
9611c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Samsstatic jstring
962eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextGetErrorMessage(JNIEnv *_env, jobject _this, jlong con)
9631c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams{
96467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
96567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextGetErrorMessage, con(%p)", (RsContext)con);
96667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
9671c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    char buf[1024];
9681c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
9691c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    size_t receiveLen;
9701c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    uint32_t subID;
971eff663f391fa4f119685d5c14489b94661ea126fTim Murray    int id = rsContextGetMessage((RsContext)con,
97265bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 buf, sizeof(buf),
97365bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 &receiveLen, sizeof(receiveLen),
974edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                                 &subID, sizeof(subID));
9751c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    if (!id && receiveLen) {
97609993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGV("message receive buffer too small.  %zu", receiveLen);
9771c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    }
9781c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    return _env->NewStringUTF(buf);
9791c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams}
9801c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
981edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Samsstatic jint
982eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextGetUserMessage(JNIEnv *_env, jobject _this, jlong con, jintArray data)
983516c31911578db8ce53529483c3ded918ac7dc6bJason Sams{
984516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    jint len = _env->GetArrayLength(data);
98567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
98667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextGetMessage, con(%p), len(%i)", (RsContext)con, len);
98767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
988488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *ptr = _env->GetIntArrayElements(data, nullptr);
989ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
990ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
991ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
992ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
993516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    size_t receiveLen;
9941c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    uint32_t subID;
995eff663f391fa4f119685d5c14489b94661ea126fTim Murray    int id = rsContextGetMessage((RsContext)con,
99665bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 ptr, len * 4,
99765bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 &receiveLen, sizeof(receiveLen),
998edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                                 &subID, sizeof(subID));
999516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    if (!id && receiveLen) {
100009993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGV("message receive buffer too small.  %zu", receiveLen);
1001516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    }
1002516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    _env->ReleaseIntArrayElements(data, ptr, 0);
10030e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    return (jint)id;
10041c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams}
10051c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
10061c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Samsstatic jint
1007eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextPeekMessage(JNIEnv *_env, jobject _this, jlong con, jintArray auxData)
10081c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams{
100967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
101067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextPeekMessage, con(%p)", (RsContext)con);
101167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1012488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *auxDataPtr = _env->GetIntArrayElements(auxData, nullptr);
1013ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (auxDataPtr == nullptr) {
1014ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1015ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
1016ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
10171c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    size_t receiveLen;
10181c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    uint32_t subID;
1019eff663f391fa4f119685d5c14489b94661ea126fTim Murray    int id = rsContextPeekMessage((RsContext)con, &receiveLen, sizeof(receiveLen),
1020edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                                  &subID, sizeof(subID));
10211c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    auxDataPtr[0] = (jint)subID;
10221c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    auxDataPtr[1] = (jint)receiveLen;
10231c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    _env->ReleaseIntArrayElements(auxData, auxDataPtr, 0);
10240e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    return (jint)id;
1025516c31911578db8ce53529483c3ded918ac7dc6bJason Sams}
1026516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1027eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic void nContextInitToClient(JNIEnv *_env, jobject _this, jlong con)
1028516c31911578db8ce53529483c3ded918ac7dc6bJason Sams{
102967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
103067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextInitToClient, con(%p)", (RsContext)con);
103167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1032eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextInitToClient((RsContext)con);
1033516c31911578db8ce53529483c3ded918ac7dc6bJason Sams}
1034516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1035eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic void nContextDeinitToClient(JNIEnv *_env, jobject _this, jlong con)
1036516c31911578db8ce53529483c3ded918ac7dc6bJason Sams{
103767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
103867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextDeinitToClient, con(%p)", (RsContext)con);
103967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1040eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextDeinitToClient((RsContext)con);
1041516c31911578db8ce53529483c3ded918ac7dc6bJason Sams}
1042516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1043455d64426615e5d269a3bd05cd91b67c3811fcdfJason Samsstatic void
1044eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextSendMessage(JNIEnv *_env, jobject _this, jlong con, jint id, jintArray data)
1045455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams{
1046488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *ptr = nullptr;
1047455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    jint len = 0;
1048455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    if (data) {
1049455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams        len = _env->GetArrayLength(data);
10504a043c1853c117c1b4c4342e76cd16a5abdc1045Stephen Hines        ptr = _env->GetIntArrayElements(data, nullptr);
1051ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {
1052ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
1053ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
1054ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
1055455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    }
105667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
105767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextSendMessage, con(%p), id(%i), len(%i)", (RsContext)con, id, len);
105867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1059eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextSendMessage((RsContext)con, id, (const uint8_t *)ptr, len * sizeof(int));
1060455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    if (data) {
1061455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams        _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
1062455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    }
1063455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams}
1064455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams
1065455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams
1066516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1067460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
106867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind, jboolean norm,
106967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe               jint size)
1070d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
107167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
107209993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nElementCreate, con(%p), type(%" PRId64 "), kind(%i), norm(%i), size(%i)", (RsContext)con,
107367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              type, kind, norm, size);
107467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
107567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    return (jlong)(uintptr_t)rsElementCreate((RsContext)con, (RsDataType)type, (RsDataKind)kind,
10768c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                             norm, size);
1077d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1078d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1079460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1080eff663f391fa4f119685d5c14489b94661ea126fTim MurraynElementCreate2(JNIEnv *_env, jobject _this, jlong con,
10819807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                jlongArray _ids, jobjectArray _names, jintArray _arraySizes)
1082d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
1083718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    int fieldCount = _env->GetArrayLength(_ids);
108467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
108567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nElementCreate2, con(%p)", (RsContext)con);
108667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1087718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
1088488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jIds = _env->GetLongArrayElements(_ids, nullptr);
1089ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jIds == nullptr) {
1090ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: ids");
1091ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
1092ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1093488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *jArraySizes = _env->GetIntArrayElements(_arraySizes, nullptr);
1094ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jArraySizes == nullptr) {
1095ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: arraySizes");
1096ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
1097ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
10989807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
10999807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    RsElement *ids = (RsElement*)malloc(fieldCount * sizeof(RsElement));
11009807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uint32_t *arraySizes = (uint32_t *)malloc(fieldCount * sizeof(uint32_t));
11019807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
11029807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < fieldCount; i ++) {
11039807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        ids[i] = (RsElement)jIds[i];
11049807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        arraySizes[i] = (uint32_t)jArraySizes[i];
11059807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
1106718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
11072123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8 names(_env, _names, fieldCount);
11082123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
11092123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char **nameArray = names.c_str();
11102123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t *sizeArray = names.c_str_len();
11112123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
11123aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsElementCreate2((RsContext)con,
11139807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                                     (const RsElement *)ids, fieldCount,
11147a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                                     nameArray, fieldCount * sizeof(size_t),  sizeArray,
11158c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                     (const uint32_t *)arraySizes, fieldCount);
11162123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
11179807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(ids);
11189807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(arraySizes);
11199807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(_ids, jIds, JNI_ABORT);
11209807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseIntArrayElements(_arraySizes, jArraySizes, JNI_ABORT);
11219807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
11223aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)id;
1123d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1124d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1125dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchoukstatic void
1126460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynElementGetNativeData(JNIEnv *_env, jobject _this, jlong con, jlong id, jintArray _elementData)
1127dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
1128dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    int dataSize = _env->GetArrayLength(_elementData);
112967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
113067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nElementGetNativeData, con(%p)", (RsContext)con);
113167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1132dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1133dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
1134dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    assert(dataSize == 5);
1135dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1136cbb0206cb478c862cb871a65e85115281ef12e02Miao Wang    uint32_t elementData[5];
1137eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaElementGetNativeData((RsContext)con, (RsElement)id, elementData, dataSize);
1138dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1139dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    for(jint i = 0; i < dataSize; i ++) {
11409807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        const jint data = (jint)elementData[i];
11419807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetIntArrayRegion(_elementData, i, 1, &data);
1142dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
1143dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1144dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1145dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1146dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchoukstatic void
1147460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynElementGetSubElements(JNIEnv *_env, jobject _this, jlong con, jlong id,
11489807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                       jlongArray _IDs,
11497d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                       jobjectArray _names,
11507d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                       jintArray _arraySizes)
1151dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
11529807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uint32_t dataSize = _env->GetArrayLength(_IDs);
115367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
115467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nElementGetSubElements, con(%p)", (RsContext)con);
115567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1156dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
11579807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t *ids = (uintptr_t*)malloc(dataSize * sizeof(uintptr_t));
11589807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    const char **names = (const char **)malloc(dataSize * sizeof(const char *));
1159cbb0206cb478c862cb871a65e85115281ef12e02Miao Wang    size_t *arraySizes = (size_t *)malloc(dataSize * sizeof(size_t));
1160dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
116167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    rsaElementGetSubElements((RsContext)con, (RsElement)id, ids, names, arraySizes,
116267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                             (uint32_t)dataSize);
1163dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
11649807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(uint32_t i = 0; i < dataSize; i++) {
11653aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong id = (jlong)(uintptr_t)ids[i];
11669807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        const jint arraySize = (jint)arraySizes[i];
1167dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        _env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i]));
11689807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_IDs, i, 1, &id);
11699807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetIntArrayRegion(_arraySizes, i, 1, &arraySize);
1170dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
1171dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1172dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    free(ids);
1173dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    free(names);
11747d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    free(arraySizes);
1175dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1176dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1177d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// -----------------------------------
1178d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1179460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1180460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid,
1181b109cc78616abee7291eb42094cd156b5db3355dJason Sams            jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv)
1182d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
118367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
118467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)",
118509993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer              (RsContext)con, (void*)eid, dimx, dimy, dimz, mips, faces, yuv);
118667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
11873b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams
118867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    return (jlong)(uintptr_t)rsTypeCreate((RsContext)con, (RsElement)eid, dimx, dimy, dimz, mips,
11898c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                          faces, yuv);
1190d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1191d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1192dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchoukstatic void
11939807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnTypeGetNativeData(JNIEnv *_env, jobject _this, jlong con, jlong id, jlongArray _typeData)
1194dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
1195dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    // We are packing 6 items: mDimX; mDimY; mDimZ;
1196dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    // mDimLOD; mDimFaces; mElement; into typeData
1197dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    int elementCount = _env->GetArrayLength(_typeData);
1198dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1199dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    assert(elementCount == 6);
120067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
120167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nTypeGetNativeData, con(%p)", (RsContext)con);
120267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1203dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
12049807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t typeData[6];
1205eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaTypeGetNativeData((RsContext)con, (RsType)id, typeData, 6);
1206dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1207dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    for(jint i = 0; i < elementCount; i ++) {
12083aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong data = (jlong)(uintptr_t)typeData[i];
12099807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_typeData, i, 1, &data);
1210dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
1211dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1212dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1213d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// -----------------------------------
1214d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1215460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
121667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mips, jint usage,
121767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                       jlong pointer)
1218d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
121967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
122067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)",
122167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsContext)con, (RsElement)type, mips, usage, (void *)pointer);
122267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
122367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    return (jlong)(uintptr_t) rsAllocationCreateTyped((RsContext)con, (RsType)type,
122467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                                      (RsAllocationMipmapControl)mips,
12258c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                                      (uint32_t)usage, (uintptr_t)pointer);
1226d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1227d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1228d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1229460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationSyncAll(JNIEnv *_env, jobject _this, jlong con, jlong a, jint bits)
12305476b450e50939940dcf3f15c92335cee2fc572dJason Sams{
123167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
123267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationSyncAll, con(%p), a(%p), bits(0x%08x)", (RsContext)con, (RsAllocation)a,
123367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              bits);
123467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1235eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationSyncAll((RsContext)con, (RsAllocation)a, (RsAllocationUsageType)bits);
12365476b450e50939940dcf3f15c92335cee2fc572dJason Sams}
12375476b450e50939940dcf3f15c92335cee2fc572dJason Sams
12388c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wangstatic void
12398c1509249c5552270d8accc2c9512f499a8f5e2dMiao WangnAllocationSetupBufferQueue(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint numAlloc)
12408c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{
12418c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    if (kLogApi) {
12428c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang        ALOGD("nAllocationSetupBufferQueue, con(%p), alloc(%p), numAlloc(%d)", (RsContext)con,
12438c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang              (RsAllocation)alloc, numAlloc);
12448c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    }
12458c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    rsAllocationSetupBufferQueue((RsContext)con, (RsAllocation)alloc, (uint32_t)numAlloc);
12468c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang}
12478c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang
12488c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wangstatic void
12498c1509249c5552270d8accc2c9512f499a8f5e2dMiao WangnAllocationShareBufferQueue(JNIEnv *_env, jobject _this, jlong con, jlong alloc1, jlong alloc2)
12508c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{
12518c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    if (kLogApi) {
12528c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang        ALOGD("nAllocationShareBufferQueue, con(%p), alloc1(%p), alloc2(%p)", (RsContext)con,
12538c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang              (RsAllocation)alloc1, (RsAllocation)alloc2);
12548c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    }
12558c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang
12568c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    rsAllocationShareBufferQueue((RsContext)con, (RsAllocation)alloc1, (RsAllocation)alloc2);
12578c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang}
12588c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang
125972226e0543461133b9e177a3e78ae50b0c65e797Jason Samsstatic jobject
1260460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationGetSurface(JNIEnv *_env, jobject _this, jlong con, jlong a)
1261615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams{
126267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
126367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationGetSurface, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
126467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1265615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams
12661e95fc86581514c718fc96367f6d575e87fecffbMiao Wang    ANativeWindow *anw = (ANativeWindow *)rsAllocationGetSurface((RsContext)con, (RsAllocation)a);
12671e95fc86581514c718fc96367f6d575e87fecffbMiao Wang
12681e95fc86581514c718fc96367f6d575e87fecffbMiao Wang    sp<Surface> surface(static_cast<Surface*>(anw));
12691e95fc86581514c718fc96367f6d575e87fecffbMiao Wang    sp<IGraphicBufferProducer> bp = surface->getIGraphicBufferProducer();
1270fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams
127172226e0543461133b9e177a3e78ae50b0c65e797Jason Sams    jobject o = android_view_Surface_createFromIGraphicBufferProducer(_env, bp);
127272226e0543461133b9e177a3e78ae50b0c65e797Jason Sams    return o;
1273fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams}
1274fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams
1275fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Samsstatic void
1276460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationSetSurface(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject sur)
1277163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams{
127867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
127967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationSetSurface, con(%p), alloc(%p), surface(%p)", (RsContext)con,
128067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsAllocation)alloc, (Surface *)sur);
128167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1282163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
128333287e8a893821be86b395ce9d5d639cc8a535f3Miao Wang    ANativeWindow *anw = nullptr;
1284163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams    if (sur != 0) {
1285f35ddc9843af8979944a41237e3ad72248894c26Miao Wang        // Connect the native window handle to buffer queue.
128633287e8a893821be86b395ce9d5d639cc8a535f3Miao Wang        anw = ANativeWindow_fromSurface(_env, sur);
1287f35ddc9843af8979944a41237e3ad72248894c26Miao Wang        native_window_api_connect(anw, NATIVE_WINDOW_API_CPU);
1288163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams    }
1289163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
129033287e8a893821be86b395ce9d5d639cc8a535f3Miao Wang    rsAllocationSetSurface((RsContext)con, (RsAllocation)alloc, anw);
1291163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams}
1292163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
1293163766cbe798baf8e86eb8201bc6c3def931d59aJason Samsstatic void
1294460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationIoSend(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1295163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams{
129667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
129709993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nAllocationIoSend, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
129867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1299460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray    rsAllocationIoSend((RsContext)con, (RsAllocation)alloc);
1300163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams}
1301163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
13028c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wangstatic jlong
1303460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationIoReceive(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1304163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams{
130567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
130609993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nAllocationIoReceive, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
130767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
13088c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    return (jlong) rsAllocationIoReceive((RsContext)con, (RsAllocation)alloc);
1309163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams}
1310163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
1311163766cbe798baf8e86eb8201bc6c3def931d59aJason Samsstatic void
1312460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1313f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams{
131467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
131567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationGenerateMipmaps, con(%p), a(%p)", (RsContext)con, (RsAllocation)alloc);
131667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1317eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationGenerateMipmaps((RsContext)con, (RsAllocation)alloc);
1318f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams}
1319f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams
1320460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
132167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,
132267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                            jobject jbitmap, jint usage)
1323fe08d99725efd0dde7ba67ff1979a04fec2ba99fJason Sams{
1324ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1325ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
1326fe08d99725efd0dde7ba67ff1979a04fec2ba99fJason Sams
13275476b450e50939940dcf3f15c92335cee2fc572dJason Sams    bitmap.lockPixels();
13285476b450e50939940dcf3f15c92335cee2fc572dJason Sams    const void* ptr = bitmap.getPixels();
13293aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsAllocationCreateFromBitmap((RsContext)con,
133065bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                                  (RsType)type, (RsAllocationMipmapControl)mip,
13318c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                                  ptr, bitmap.getSize(), usage);
13325476b450e50939940dcf3f15c92335cee2fc572dJason Sams    bitmap.unlockPixels();
13335476b450e50939940dcf3f15c92335cee2fc572dJason Sams    return id;
1334ffe9f48890dde7173a0845d32887fdf94a49b0a7Jason Sams}
1335fe08d99725efd0dde7ba67ff1979a04fec2ba99fJason Sams
1336460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
133767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCreateBitmapBackedAllocation(JNIEnv *_env, jobject _this, jlong con, jlong type,
133867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                        jint mip, jobject jbitmap, jint usage)
1339a314551d69098537337c970da615a8f8af58e1f1Tim Murray{
1340ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1341ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
1342a314551d69098537337c970da615a8f8af58e1f1Tim Murray
1343a314551d69098537337c970da615a8f8af58e1f1Tim Murray    bitmap.lockPixels();
1344a314551d69098537337c970da615a8f8af58e1f1Tim Murray    const void* ptr = bitmap.getPixels();
13453aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsAllocationCreateTyped((RsContext)con,
1346a314551d69098537337c970da615a8f8af58e1f1Tim Murray                                            (RsType)type, (RsAllocationMipmapControl)mip,
13478c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                            (uint32_t)usage, (uintptr_t)ptr);
1348a314551d69098537337c970da615a8f8af58e1f1Tim Murray    bitmap.unlockPixels();
1349a314551d69098537337c970da615a8f8af58e1f1Tim Murray    return id;
1350a314551d69098537337c970da615a8f8af58e1f1Tim Murray}
1351a314551d69098537337c970da615a8f8af58e1f1Tim Murray
1352460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
135367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,
135467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                jobject jbitmap, jint usage)
135567f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk{
1356ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1357ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
135867f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk
13595476b450e50939940dcf3f15c92335cee2fc572dJason Sams    bitmap.lockPixels();
13605476b450e50939940dcf3f15c92335cee2fc572dJason Sams    const void* ptr = bitmap.getPixels();
13613aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsAllocationCubeCreateFromBitmap((RsContext)con,
136265bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                                      (RsType)type, (RsAllocationMipmapControl)mip,
13638c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                                      ptr, bitmap.getSize(), usage);
13645476b450e50939940dcf3f15c92335cee2fc572dJason Sams    bitmap.unlockPixels();
13655476b450e50939940dcf3f15c92335cee2fc572dJason Sams    return id;
136667f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk}
136767f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk
136826ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchoukstatic void
1369460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
137026ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk{
1371ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1372ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
1373f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams    int w = bitmap.width();
1374f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams    int h = bitmap.height();
137526ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk
13764ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    bitmap.lockPixels();
13774ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    const void* ptr = bitmap.getPixels();
1378eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocation2DData((RsContext)con, (RsAllocation)alloc, 0, 0,
1379304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                       0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X,
138038faea3019b8aa68c25ec7bac3e17964524dad12Tim Murray                       w, h, ptr, bitmap.getSize(), 0);
13814ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    bitmap.unlockPixels();
13828a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams}
13838a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
13844ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Samsstatic void
1385460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationCopyToBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
13868a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams{
1387ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1388ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
13898a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
13904ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    bitmap.lockPixels();
13914ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    void* ptr = bitmap.getPixels();
1392eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationCopyToBitmap((RsContext)con, (RsAllocation)alloc, ptr, bitmap.getSize());
13934ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    bitmap.unlockPixels();
1394835b8544cc333ef87e42b1d71cf8ad3cddccdc19Alex Sakhartchouk    bitmap.notifyPixelsChanged();
13958a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams}
13968a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
1397414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Java object data into the Allocation pointed to by _alloc.
1398d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1399460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
140087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint count, jobject data, jint sizeBytes, jint dataType, jint mSize,
140187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jboolean usePadding)
1402d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
1403e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
140467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
140567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation1DData, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
140667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "dataType(%i)", (RsContext)con, (RsAllocation)alloc, offset, count, sizeBytes,
140767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              dataType);
140867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
140987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation1DData, true,
141087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
1411d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1412d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1413d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1414c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao WangnAllocationElementData(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
1415c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                       jint xoff, jint yoff, jint zoff,
1416c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                       jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
141749bdaf0293408159df18a1d8540360f9623c40f7Jason Sams{
141867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
141986c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni        jint len = _env->GetArrayLength(data);
1420c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang        ALOGD("nAllocationElementData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
1421c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang              "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
142267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              sizeBytes);
142367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1424488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1425ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1426ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1427ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1428ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1429c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    rsAllocationElementData((RsContext)con, (RsAllocation)alloc,
1430c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                            xoff, yoff, zoff,
1431c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                            lod, ptr, sizeBytes, compIdx);
143249bdaf0293408159df18a1d8540360f9623c40f7Jason Sams    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
143349bdaf0293408159df18a1d8540360f9623c40f7Jason Sams}
143449bdaf0293408159df18a1d8540360f9623c40f7Jason Sams
1435c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang
1436414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Java object data into the Allocation pointed to by _alloc.
143749bdaf0293408159df18a1d8540360f9623c40f7Jason Samsstatic void
1438460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
143987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType, jint mSize,
144087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jboolean usePadding)
1441d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
1442e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
1443e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
144467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
144567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation2DData, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
144667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
144767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
144887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h;
144987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation2DData, true,
145087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
1451d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1452d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1453414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by srcAlloc into the Allocation
1454414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// pointed to by dstAlloc.
145540a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Samsstatic void
1456eff663f391fa4f119685d5c14489b94661ea126fTim MurraynAllocationData2D_alloc(JNIEnv *_env, jobject _this, jlong con,
1457460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong dstAlloc, jint dstXoff, jint dstYoff,
1458304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                        jint dstMip, jint dstFace,
1459304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                        jint width, jint height,
1460460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong srcAlloc, jint srcXoff, jint srcYoff,
1461304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                        jint srcMip, jint srcFace)
1462304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk{
146367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
146467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation2DData_s, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
146567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " dstMip(%i), dstFace(%i), width(%i), height(%i),"
146667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i), srcFace(%i)",
146767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
146867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
146967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1470304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk
1471eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationCopy2DRange((RsContext)con,
1472304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            (RsAllocation)dstAlloc,
1473304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            dstXoff, dstYoff,
1474304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            dstMip, dstFace,
1475304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            width, height,
1476304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            (RsAllocation)srcAlloc,
1477304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            srcXoff, srcYoff,
1478304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            srcMip, srcFace);
1479304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk}
1480304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk
1481414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Java object data into the Allocation pointed to by _alloc.
1482304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchoukstatic void
1483460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
148487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jint d, jobject data, jint sizeBytes, jint dataType,
148587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
1486b05d689653b1bc94836f716f29e9578677c29075Jason Sams{
1487e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
148867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
148967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation3DData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
149067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
149167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              lod, w, h, d, sizeBytes);
149267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
149387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h * d;
149487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation3DData, true,
149587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
1496b05d689653b1bc94836f716f29e9578677c29075Jason Sams}
1497b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1498414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by srcAlloc into the Allocation
1499414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// pointed to by dstAlloc.
1500b05d689653b1bc94836f716f29e9578677c29075Jason Samsstatic void
1501eff663f391fa4f119685d5c14489b94661ea126fTim MurraynAllocationData3D_alloc(JNIEnv *_env, jobject _this, jlong con,
1502460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong dstAlloc, jint dstXoff, jint dstYoff, jint dstZoff,
1503b05d689653b1bc94836f716f29e9578677c29075Jason Sams                        jint dstMip,
1504b05d689653b1bc94836f716f29e9578677c29075Jason Sams                        jint width, jint height, jint depth,
1505460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong srcAlloc, jint srcXoff, jint srcYoff, jint srcZoff,
1506b05d689653b1bc94836f716f29e9578677c29075Jason Sams                        jint srcMip)
1507b05d689653b1bc94836f716f29e9578677c29075Jason Sams{
150867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
150967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationData3D_alloc, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
151067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " dstMip(%i), width(%i), height(%i),"
151167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i)",
151267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip,
151367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip);
151467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1515b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1516eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationCopy3DRange((RsContext)con,
1517b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            (RsAllocation)dstAlloc,
1518b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            dstXoff, dstYoff, dstZoff, dstMip,
1519b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            width, height, depth,
1520b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            (RsAllocation)srcAlloc,
1521b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            srcXoff, srcYoff, srcZoff, srcMip);
1522b05d689653b1bc94836f716f29e9578677c29075Jason Sams}
1523b05d689653b1bc94836f716f29e9578677c29075Jason Sams
152440a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams
1525414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by _alloc into the Java object data.
152640a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Samsstatic void
152787e908dfdece91b5f504386d4901fa3342dc8083Miao WangnAllocationRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jobject data, jint dataType,
152887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                jint mSize, jboolean usePadding)
1529fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams{
153021659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
153167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
153267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationRead, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
153367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
153487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = 0;
153587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(0, rsAllocationRead, false,
153687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, ptr, len * typeBytes);
1537fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams}
1538fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams
1539414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by _alloc into the Java object data.
1540fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Samsstatic void
1541460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationRead1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
154287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint count, jobject data, jint sizeBytes, jint dataType,
154387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
1544fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams{
154521659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
154667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
154767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation1DRead, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
154867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "dataType(%i)", (RsContext)con, alloc, offset, count, sizeBytes, dataType);
154967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
155087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(0, rsAllocation1DRead, false,
155187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
1552fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams}
1553fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams
1554c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang// Copies from the Element in the Allocation pointed to by _alloc into the Java array data.
1555c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wangstatic void
155645cec0a9711f736df26fd097c6d74834e350f9bcMiao WangnAllocationElementRead(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
1557c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                       jint xoff, jint yoff, jint zoff,
155845cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang                       jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
1559c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang{
1560c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    if (kLogApi) {
156186c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni        jint len = _env->GetArrayLength(data);
156245cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang        ALOGD("nAllocationElementRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
156345cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang              "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
156445cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang              sizeBytes);
1565c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    }
156645cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1567ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1568ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1569ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1570ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
157145cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang    rsAllocationElementRead((RsContext)con, (RsAllocation)alloc,
157245cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang                            xoff, yoff, zoff,
1573a7e2509d8da69ab1c9e14b4ce6608786c572209aJason Sams                            lod, ptr, sizeBytes, compIdx);
1574bfa5e659e7b4cb49178d0e99712478b29f8301a7Miao Wang    _env->ReleaseByteArrayElements(data, ptr, 0);
1575c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang}
1576c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang
1577414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by _alloc into the Java object data.
1578fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Samsstatic void
1579460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
158087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType,
158187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
158240a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams{
158321659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
158421659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
158567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
158667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation2DRead, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
158767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
158867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
158987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h;
159087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(0, rsAllocation2DRead, false,
159187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
159240a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams}
159387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang
1594c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1595c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wangstatic void
1596c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao WangnAllocationRead3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
159787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jint d, jobject data, int sizeBytes, int dataType,
159887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
1599c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang{
1600c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
1601c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    if (kLogApi) {
1602c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang        ALOGD("nAllocation3DRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
1603c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang              " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
1604c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang              lod, w, h, d, sizeBytes);
1605c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    }
160687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h * d;
160787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation3DRead, false,
160887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
1609c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang}
1610d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1611460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1612460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationGetType(JNIEnv *_env, jobject _this, jlong con, jlong a)
1613dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
161467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
161567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationGetType, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
161667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
16173aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t) rsaAllocationGetType((RsContext)con, (RsAllocation)a);
1618dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1619dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
16205edc608a0749ed4b7074b5c1243043eb722c3c31Jason Samsstatic void
1621460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationResize1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint dimX)
16225edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams{
162367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
162467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", (RsContext)con,
162567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsAllocation)alloc, dimX);
162667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1627eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationResize1D((RsContext)con, (RsAllocation)alloc, dimX);
16285edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams}
16295edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams
163046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
163146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Samsstatic jlong
163246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason SamsnAllocationAdapterCreate(JNIEnv *_env, jobject _this, jlong con, jlong basealloc, jlong type)
163346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{
163446ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    if (kLogApi) {
163546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        ALOGD("nAllocationAdapterCreate, con(%p), base(%p), type(%p)",
163646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams              (RsContext)con, (RsAllocation)basealloc, (RsElement)type);
163746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    }
163846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    return (jlong)(uintptr_t) rsAllocationAdapterCreate((RsContext)con, (RsType)type,
163946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                                                        (RsAllocation)basealloc);
164046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
164146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams}
164246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
164346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Samsstatic void
164446ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason SamsnAllocationAdapterOffset(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
164546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                        jint x, jint y, jint z, jint face, jint lod,
164646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                        jint a1, jint a2, jint a3, jint a4)
164746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{
164846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    uint32_t params[] = {
164946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        (uint32_t)x, (uint32_t)y, (uint32_t)z, (uint32_t)face,
165046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        (uint32_t)lod, (uint32_t)a1, (uint32_t)a2, (uint32_t)a3, (uint32_t)a4
165146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    };
165246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    if (kLogApi) {
165346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        ALOGD("nAllocationAdapterOffset, con(%p), alloc(%p), x(%i), y(%i), z(%i), face(%i), lod(%i), arrays(%i %i %i %i)",
165446ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams              (RsContext)con, (RsAllocation)alloc, x, y, z, face, lod, a1, a2, a3, a4);
165546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    }
165646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    rsAllocationAdapterOffset((RsContext)con, (RsAllocation)alloc,
165746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                              params, sizeof(params));
165846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams}
165946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
166046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
1661aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk// -----------------------------------
1662aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1663460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1664460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DCreateFromAssetStream(JNIEnv *_env, jobject _this, jlong con, jlong native_asset)
1665aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
1666aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    Asset* asset = reinterpret_cast<Asset*>(native_asset);
16670e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    ALOGV("______nFileA3D %p", asset);
1668aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
16693aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromMemory((RsContext)con, asset->getBuffer(false), asset->getLength());
1670b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1671b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1672b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1673460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1674eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFileA3DCreateFromAsset(JNIEnv *_env, jobject _this, jlong con, jobject _assetMgr, jstring _path)
1675b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1676b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr);
1677488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (mgr == nullptr) {
1678b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return 0;
1679b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
1680b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1681b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 str(_env, _path);
1682b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
1683488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (asset == nullptr) {
1684b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return 0;
1685b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
1686b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
16873aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromAsset((RsContext)con, asset);
1688b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1689b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1690b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1691460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1692eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFileA3DCreateFromFile(JNIEnv *_env, jobject _this, jlong con, jstring fileName)
1693b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1694b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
16953aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromFile((RsContext)con, fileNameUTF.c_str());
1696b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1697aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    return id;
1698aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1699aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1700460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jint
1701460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DGetNumIndexEntries(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D)
1702aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
1703aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    int32_t numEntries = 0;
1704eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaFileA3DGetNumIndexEntries((RsContext)con, &numEntries, (RsFile)fileA3D);
17050e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    return (jint)numEntries;
1706aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1707aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1708aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchoukstatic void
1709460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DGetIndexEntries(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D, jint numEntries, jintArray _ids, jobjectArray _entries)
1710aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
17110e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    ALOGV("______nFileA3D %p", (RsFile) fileA3D);
1712aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    RsFileIndexEntry *fileEntries = (RsFileIndexEntry*)malloc((uint32_t)numEntries * sizeof(RsFileIndexEntry));
1713aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1714eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaFileA3DGetIndexEntries((RsContext)con, fileEntries, (uint32_t)numEntries, (RsFile)fileA3D);
1715aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1716aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    for(jint i = 0; i < numEntries; i ++) {
1717aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        _env->SetObjectArrayElement(_entries, i, _env->NewStringUTF(fileEntries[i].objectName));
1718aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        _env->SetIntArrayRegion(_ids, i, 1, (const jint*)&fileEntries[i].classID);
1719aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
1720aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1721aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    free(fileEntries);
1722aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1723aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
17240e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1725460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DGetEntryByIndex(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D, jint index)
1726aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
17270e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    ALOGV("______nFileA3D %p", (RsFile) fileA3D);
17283aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DGetEntryByIndex((RsContext)con, (uint32_t)index, (RsFile)fileA3D);
1729aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    return id;
1730aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1731d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1732d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// -----------------------------------
1733d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
17340e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1735eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFontCreateFromFile(JNIEnv *_env, jobject _this, jlong con,
1736b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                    jstring fileName, jfloat fontSize, jint dpi)
17379b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk{
1738b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
17393aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsFontCreateFromFile((RsContext)con,
1740e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                         fileNameUTF.c_str(), fileNameUTF.length(),
1741e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                         fontSize, dpi);
1742b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1743b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1744b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1745b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
17460e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1747eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFontCreateFromAssetStream(JNIEnv *_env, jobject _this, jlong con,
17480e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                           jstring name, jfloat fontSize, jint dpi, jlong native_asset)
1749b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1750b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    Asset* asset = reinterpret_cast<Asset*>(native_asset);
1751b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 nameUTF(_env, name);
1752b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
17533aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsFontCreateFromMemory((RsContext)con,
1754e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                           nameUTF.c_str(), nameUTF.length(),
1755e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                           fontSize, dpi,
1756b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                                           asset->getBuffer(false), asset->getLength());
1757b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1758b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1759b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
17600e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1761eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFontCreateFromAsset(JNIEnv *_env, jobject _this, jlong con, jobject _assetMgr, jstring _path,
1762b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                     jfloat fontSize, jint dpi)
1763b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1764b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr);
1765488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (mgr == nullptr) {
1766b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return 0;
1767b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
1768b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1769b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 str(_env, _path);
1770b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
1771488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (asset == nullptr) {
1772b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return 0;
1773b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
17749b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk
17753aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsFontCreateFromMemory((RsContext)con,
1776e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                           str.c_str(), str.length(),
1777e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                           fontSize, dpi,
1778b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                                           asset->getBuffer(false), asset->getLength());
1779b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    delete asset;
17809b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    return id;
17819b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk}
17829b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk
1783bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams// -----------------------------------
1784bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams
1785bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Samsstatic void
1786460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptBindAllocation(JNIEnv *_env, jobject _this, jlong con, jlong script, jlong alloc, jint slot)
1787d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
178867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
178967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)", (RsContext)con,
179067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsScript)script, (RsAllocation)alloc, slot);
179167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1792eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
1793d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1794d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1795d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1796460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jint val)
17974d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams{
179867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
179967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con, (void *)script,
180067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
180167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1802eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarI((RsContext)con, (RsScript)script, slot, val);
18034d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams}
18044d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
18057c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jint
1806460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
18077c4caadb939b1563328251c156262c179a685c70Tim Murray{
180867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
180967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarI, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
181067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18117c4caadb939b1563328251c156262c179a685c70Tim Murray    int value = 0;
1812eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18137c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18147c4caadb939b1563328251c156262c179a685c70Tim Murray}
18157c4caadb939b1563328251c156262c179a685c70Tim Murray
18164d3399337d18ef04116bc8a2e5799274655d0c30Jason Samsstatic void
1817460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarObj(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val)
18186f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams{
181967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
182009993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%" PRId64 ")", (RsContext)con, (void *)script,
182167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
182267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1823eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val);
18246f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams}
18256f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams
18266f4cf0b8885403ead157ae00fd43cf1282331c23Jason Samsstatic void
1827460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val)
1828031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines{
182967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
183009993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%" PRId64 ")", (RsContext)con, (void *)script,
183167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
183267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1833eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarJ((RsContext)con, (RsScript)script, slot, val);
1834031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines}
1835031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines
18367c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jlong
1837460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
18387c4caadb939b1563328251c156262c179a685c70Tim Murray{
183967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
184067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarJ, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
184167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18427c4caadb939b1563328251c156262c179a685c70Tim Murray    jlong value = 0;
1843eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18447c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18457c4caadb939b1563328251c156262c179a685c70Tim Murray}
18467c4caadb939b1563328251c156262c179a685c70Tim Murray
1847031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hinesstatic void
1848460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, float val)
18494d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams{
185067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
185167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", (RsContext)con, (void *)script,
185267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
185367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1854eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarF((RsContext)con, (RsScript)script, slot, val);
18554d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams}
18564d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
18577c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jfloat
1858460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
18597c4caadb939b1563328251c156262c179a685c70Tim Murray{
186067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
186167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarF, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
186267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18637c4caadb939b1563328251c156262c179a685c70Tim Murray    jfloat value = 0;
1864eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18657c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18667c4caadb939b1563328251c156262c179a685c70Tim Murray}
18677c4caadb939b1563328251c156262c179a685c70Tim Murray
18684d3399337d18ef04116bc8a2e5799274655d0c30Jason Samsstatic void
1869460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, double val)
1870ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines{
187167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
187267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", (RsContext)con, (void *)script,
187367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
187467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1875eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarD((RsContext)con, (RsScript)script, slot, val);
1876ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines}
1877ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines
18787c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jdouble
1879460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
18807c4caadb939b1563328251c156262c179a685c70Tim Murray{
188167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
188267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarD, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
188367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18847c4caadb939b1563328251c156262c179a685c70Tim Murray    jdouble value = 0;
1885eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18867c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18877c4caadb939b1563328251c156262c179a685c70Tim Murray}
18887c4caadb939b1563328251c156262c179a685c70Tim Murray
1889ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hinesstatic void
1890460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data)
18914d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams{
189267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
189367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
189467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18954d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    jint len = _env->GetArrayLength(data);
1896488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1897ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1898ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1899ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1900ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1901eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
19024d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
19034d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams}
19044d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1905adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hinesstatic void
1906460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data)
19077c4caadb939b1563328251c156262c179a685c70Tim Murray{
190867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
190967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
191067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
19117c4caadb939b1563328251c156262c179a685c70Tim Murray    jint len = _env->GetArrayLength(data);
1912488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1913ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1914ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1915ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1916ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1917eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
1918414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines    _env->ReleaseByteArrayElements(data, ptr, 0);
19197c4caadb939b1563328251c156262c179a685c70Tim Murray}
19207c4caadb939b1563328251c156262c179a685c70Tim Murray
19217c4caadb939b1563328251c156262c179a685c70Tim Murraystatic void
192267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenScriptSetVarVE(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data,
192367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                jlong elem, jintArray dims)
1924adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines{
192567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
192667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarVE, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
192767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1928adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    jint len = _env->GetArrayLength(data);
1929488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1930ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1931ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1932ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1933ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1934adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    jint dimsLen = _env->GetArrayLength(dims) * sizeof(int);
1935488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *dimsPtr = _env->GetIntArrayElements(dims, nullptr);
1936ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (dimsPtr == nullptr) {
1937ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1938ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1939ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1940eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem,
1941bc5d3eeedcbdff2e8331a6792902c6992db9bd31Stephen Hines                     (const uint32_t*) dimsPtr, dimsLen);
1942adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1943adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    _env->ReleaseIntArrayElements(dims, dimsPtr, JNI_ABORT);
1944adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines}
1945adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines
1946d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1947d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1948460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetTimeZone(JNIEnv *_env, jobject _this, jlong con, jlong script, jbyteArray timeZone)
1949584a375df68ed7d62b38389078c6804edf228f9cRomain Guy{
195067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
195167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptCSetTimeZone, con(%p), s(%p)", (RsContext)con, (void *)script);
195267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1953584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
1954584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    jint length = _env->GetArrayLength(timeZone);
1955584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    jbyte* timeZone_ptr;
1956584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0);
1957ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (timeZone_ptr == nullptr) {
1958ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1959ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1960ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1961584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
1962eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length);
1963584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
1964584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    if (timeZone_ptr) {
1965584a375df68ed7d62b38389078c6804edf228f9cRomain Guy        _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0);
1966584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    }
1967584a375df68ed7d62b38389078c6804edf228f9cRomain Guy}
1968584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
196922534176fb5c1257130ef4ee589739ca42766a32Jason Samsstatic void
1970460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptInvoke(JNIEnv *_env, jobject _this, jlong con, jlong obj, jint slot)
197122534176fb5c1257130ef4ee589739ca42766a32Jason Sams{
197267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
197367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptInvoke, con(%p), script(%p)", (RsContext)con, (void *)obj);
197467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1975eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptInvoke((RsContext)con, (RsScript)obj, slot);
197622534176fb5c1257130ef4ee589739ca42766a32Jason Sams}
197722534176fb5c1257130ef4ee589739ca42766a32Jason Sams
1978584a375df68ed7d62b38389078c6804edf228f9cRomain Guystatic void
1979460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptInvokeV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data)
1980be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams{
198167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
198267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptInvokeV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
198367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
19844d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    jint len = _env->GetArrayLength(data);
1985488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1986ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1987ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1988ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1989ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1990eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len);
19914d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1992be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams}
1993be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams
19946e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Samsstatic void
1995be7b1defb6b11920703b241ba5815fb09487bb02Chris WailesnScriptForEach(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
1996be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes               jlongArray ains, jlong aout, jbyteArray params,
1997be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes               jintArray limits)
19986e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Sams{
199967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
20009eb9dd326ae93cd84eb9bbc740f753fe8d8c7a13Chih-Hung Hsieh        ALOGD("nScriptForEach, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
200167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2002949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2003be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    jint   in_len = 0;
2004488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *in_ptr = nullptr;
2005949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2006488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    RsAllocation *in_allocs = nullptr;
2007949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2008488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (ains != nullptr) {
2009be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        in_len = _env->GetArrayLength(ains);
20107b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni        if (in_len > (jint)RS_KERNEL_MAX_ARGUMENTS) {
201117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            ALOGE("Too many arguments in kernel launch.");
201217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            // TODO (b/20758983): Report back to Java and throw an exception
201317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            return;
201417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni        }
2015eb3470219dea322efa93eb4b5457813ce71d0c5dChris Wailes
201617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni        in_ptr = _env->GetLongArrayElements(ains, nullptr);
2017ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (in_ptr == nullptr) {
2018ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
2019ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
2020ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
2021ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
2022be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        if (sizeof(RsAllocation) == sizeof(jlong)) {
2023be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            in_allocs = (RsAllocation*)in_ptr;
2024be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        } else {
2025be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            // Convert from 64-bit jlong types to the native pointer type.
2026eb3470219dea322efa93eb4b5457813ce71d0c5dChris Wailes
2027be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            in_allocs = (RsAllocation*)alloca(in_len * sizeof(RsAllocation));
202817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            if (in_allocs == nullptr) {
202917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni                ALOGE("Failed launching kernel for lack of memory.");
203017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni                _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
203117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni                return;
203217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            }
2033be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2034be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            for (int index = in_len; --index >= 0;) {
2035be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                in_allocs[index] = (RsAllocation)in_ptr[index];
2036be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            }
2037be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        }
2038949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes    }
2039949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2040be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    jint   param_len = 0;
2041488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *param_ptr = nullptr;
2042be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2043488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (params != nullptr) {
2044be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        param_len = _env->GetArrayLength(params);
2045488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        param_ptr = _env->GetByteArrayElements(params, nullptr);
2046ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (param_ptr == nullptr) {
2047ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
2048ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
2049ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
2050c9c7daf69b32c0e72a3b99379cc5116c1647f24eStephen Hines    }
2051949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2052488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    RsScriptCall sc, *sca = nullptr;
2053be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    uint32_t sc_size = 0;
2054949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2055be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    jint  limit_len = 0;
2056488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *limit_ptr = nullptr;
2057949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2058488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (limits != nullptr) {
2059be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        limit_len = _env->GetArrayLength(limits);
2060488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        limit_ptr = _env->GetIntArrayElements(limits, nullptr);
2061ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (limit_ptr == nullptr) {
2062ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
2063ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
2064ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
2065949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2066be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        assert(limit_len == 6);
206767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        UNUSED(limit_len);  // As the assert might not be compiled.
2068949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2069be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.xStart     = limit_ptr[0];
2070be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.xEnd       = limit_ptr[1];
2071be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.yStart     = limit_ptr[2];
2072be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.yEnd       = limit_ptr[3];
2073be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.zStart     = limit_ptr[4];
2074be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.zEnd       = limit_ptr[5];
2075be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.strategy   = RS_FOR_EACH_STRATEGY_DONT_CARE;
207614331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.arrayStart = 0;
207714331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.arrayEnd = 0;
207814331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array2Start = 0;
207914331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array2End = 0;
208014331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array3Start = 0;
208114331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array3End = 0;
208214331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array4Start = 0;
208314331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array4End = 0;
2084949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2085be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sca = &sc;
2086e8f2e445fdb138416043a16659bbf86fbbd3fff8Yang Ni        // sc_size is required, but unused, by the runtime and drivers.
2087e8f2e445fdb138416043a16659bbf86fbbd3fff8Yang Ni        sc_size = sizeof(sc);
2088be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    }
2089949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2090be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    rsScriptForEachMulti((RsContext)con, (RsScript)script, slot,
2091be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                         in_allocs, in_len, (RsAllocation)aout,
2092be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                         param_ptr, param_len, sca, sc_size);
2093949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2094488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (ains != nullptr) {
2095be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
2096949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes    }
2097949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2098488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (params != nullptr) {
2099be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        _env->ReleaseByteArrayElements(params, param_ptr, JNI_ABORT);
2100eb3470219dea322efa93eb4b5457813ce71d0c5dChris Wailes    }
2101c9c7daf69b32c0e72a3b99379cc5116c1647f24eStephen Hines
2102488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (limits != nullptr) {
2103be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
2104be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    }
2105949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes}
2106949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
210736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Walastatic void
210836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt WalanScriptReduce(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
21094a4578530a1a5fb751ea5a7bfbff83f3ab669895David Gross              jlongArray ains, jlong aout, jintArray limits)
211036eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala{
211136eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    if (kLogApi) {
21124a4578530a1a5fb751ea5a7bfbff83f3ab669895David Gross        ALOGD("nScriptReduce, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
211326ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
211426ef7a739b724452f93f850a1c268c42e439317bDavid Gross
211526ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (ains == nullptr) {
211626ef7a739b724452f93f850a1c268c42e439317bDavid Gross        ALOGE("At least one input required.");
211726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        // TODO (b/20758983): Report back to Java and throw an exception
211826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        return;
211926ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
212026ef7a739b724452f93f850a1c268c42e439317bDavid Gross    jint in_len = _env->GetArrayLength(ains);
212126ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (in_len > (jint)RS_KERNEL_MAX_ARGUMENTS) {
212226ef7a739b724452f93f850a1c268c42e439317bDavid Gross        ALOGE("Too many arguments in kernel launch.");
212326ef7a739b724452f93f850a1c268c42e439317bDavid Gross        // TODO (b/20758983): Report back to Java and throw an exception
212426ef7a739b724452f93f850a1c268c42e439317bDavid Gross        return;
212526ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
212626ef7a739b724452f93f850a1c268c42e439317bDavid Gross
212726ef7a739b724452f93f850a1c268c42e439317bDavid Gross    jlong *in_ptr = _env->GetLongArrayElements(ains, nullptr);
212826ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (in_ptr == nullptr) {
212926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        ALOGE("Failed to get Java array elements");
213026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        // TODO (b/20758983): Report back to Java and throw an exception
213126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        return;
213226ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
213326ef7a739b724452f93f850a1c268c42e439317bDavid Gross
213426ef7a739b724452f93f850a1c268c42e439317bDavid Gross    RsAllocation *in_allocs = nullptr;
213526ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (sizeof(RsAllocation) == sizeof(jlong)) {
213626ef7a739b724452f93f850a1c268c42e439317bDavid Gross        in_allocs = (RsAllocation*)in_ptr;
213726ef7a739b724452f93f850a1c268c42e439317bDavid Gross    } else {
213826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        // Convert from 64-bit jlong types to the native pointer type.
213926ef7a739b724452f93f850a1c268c42e439317bDavid Gross
214026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        in_allocs = (RsAllocation*)alloca(in_len * sizeof(RsAllocation));
214126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        if (in_allocs == nullptr) {
214226ef7a739b724452f93f850a1c268c42e439317bDavid Gross            ALOGE("Failed launching kernel for lack of memory.");
214326ef7a739b724452f93f850a1c268c42e439317bDavid Gross            // TODO (b/20758983): Report back to Java and throw an exception
214426ef7a739b724452f93f850a1c268c42e439317bDavid Gross            _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
214526ef7a739b724452f93f850a1c268c42e439317bDavid Gross            return;
214626ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
214726ef7a739b724452f93f850a1c268c42e439317bDavid Gross
214826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        for (int index = in_len; --index >= 0;) {
214926ef7a739b724452f93f850a1c268c42e439317bDavid Gross            in_allocs[index] = (RsAllocation)in_ptr[index];
215026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
215126ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
215226ef7a739b724452f93f850a1c268c42e439317bDavid Gross
215326ef7a739b724452f93f850a1c268c42e439317bDavid Gross    RsScriptCall sc, *sca = nullptr;
215426ef7a739b724452f93f850a1c268c42e439317bDavid Gross    uint32_t sc_size = 0;
215526ef7a739b724452f93f850a1c268c42e439317bDavid Gross
215626ef7a739b724452f93f850a1c268c42e439317bDavid Gross    jint  limit_len = 0;
215726ef7a739b724452f93f850a1c268c42e439317bDavid Gross    jint *limit_ptr = nullptr;
215826ef7a739b724452f93f850a1c268c42e439317bDavid Gross
215926ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (limits != nullptr) {
216026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        limit_len = _env->GetArrayLength(limits);
216126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        limit_ptr = _env->GetIntArrayElements(limits, nullptr);
216226ef7a739b724452f93f850a1c268c42e439317bDavid Gross        if (limit_ptr == nullptr) {
216326ef7a739b724452f93f850a1c268c42e439317bDavid Gross            ALOGE("Failed to get Java array elements");
216426ef7a739b724452f93f850a1c268c42e439317bDavid Gross            // TODO (b/20758983): Report back to Java and throw an exception
216526ef7a739b724452f93f850a1c268c42e439317bDavid Gross            return;
216626ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
216726ef7a739b724452f93f850a1c268c42e439317bDavid Gross
216826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        assert(limit_len == 6);
216926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        UNUSED(limit_len);  // As the assert might not be compiled.
217026ef7a739b724452f93f850a1c268c42e439317bDavid Gross
217126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.xStart     = limit_ptr[0];
217226ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.xEnd       = limit_ptr[1];
217326ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.yStart     = limit_ptr[2];
217426ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.yEnd       = limit_ptr[3];
217526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.zStart     = limit_ptr[4];
217626ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.zEnd       = limit_ptr[5];
217726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.strategy   = RS_FOR_EACH_STRATEGY_DONT_CARE;
217826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.arrayStart = 0;
217926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.arrayEnd = 0;
218026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array2Start = 0;
218126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array2End = 0;
218226ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array3Start = 0;
218326ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array3End = 0;
218426ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array4Start = 0;
218526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array4End = 0;
218626ef7a739b724452f93f850a1c268c42e439317bDavid Gross
218726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sca = &sc;
218826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc_size = sizeof(sc);
218926ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
219026ef7a739b724452f93f850a1c268c42e439317bDavid Gross
21914a4578530a1a5fb751ea5a7bfbff83f3ab669895David Gross    rsScriptReduce((RsContext)con, (RsScript)script, slot,
21924a4578530a1a5fb751ea5a7bfbff83f3ab669895David Gross                   in_allocs, in_len, (RsAllocation)aout,
21934a4578530a1a5fb751ea5a7bfbff83f3ab669895David Gross                   sca, sc_size);
219426ef7a739b724452f93f850a1c268c42e439317bDavid Gross
219526ef7a739b724452f93f850a1c268c42e439317bDavid Gross    _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
219626ef7a739b724452f93f850a1c268c42e439317bDavid Gross
219726ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (limits != nullptr) {
219826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
219926ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
220026ef7a739b724452f93f850a1c268c42e439317bDavid Gross}
220126ef7a739b724452f93f850a1c268c42e439317bDavid Gross
2202fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams// -----------------------------------
2203fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams
22040e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
2205eff663f391fa4f119685d5c14489b94661ea126fTim MurraynScriptCCreate(JNIEnv *_env, jobject _this, jlong con,
2206e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams               jstring resName, jstring cacheDir,
2207e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams               jbyteArray scriptRef, jint length)
2208d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
220967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
221067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptCCreate, con(%p)", (RsContext)con);
221167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2212e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams
2213e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    AutoJavaStringToUTF8 resNameUTF(_env, resName);
2214e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
22150e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    jlong ret = 0;
2216488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte* script_ptr = nullptr;
221743702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    jint _exception = 0;
221843702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    jint remaining;
221943702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    if (!scriptRef) {
222043702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _exception = 1;
22218451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null");
222243702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        goto exit;
222343702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
222443702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    if (length < 0) {
222543702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _exception = 1;
22268451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0");
222743702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        goto exit;
222843702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
2229e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    remaining = _env->GetArrayLength(scriptRef);
223043702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    if (remaining < length) {
223143702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _exception = 1;
22328451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //jniThrowException(_env, "java/lang/IllegalArgumentException",
22338451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //        "length > script.length - offset");
223443702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        goto exit;
223543702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
2236e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    script_ptr = (jbyte *)
223743702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0);
2238ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (script_ptr == nullptr) {
2239ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
2240ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return ret;
2241ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
224243702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich
2243eff663f391fa4f119685d5c14489b94661ea126fTim Murray    //rsScriptCSetText((RsContext)con, (const char *)script_ptr, length);
2244e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams
22453aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    ret = (jlong)(uintptr_t)rsScriptCCreate((RsContext)con,
2246e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                resNameUTF.c_str(), resNameUTF.length(),
2247e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                cacheDirUTF.c_str(), cacheDirUTF.length(),
2248e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams                                (const char *)script_ptr, length);
224939ddc950c9064129ead5de04b200106c0659f937Jason Sams
225043702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevichexit:
2251e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    if (script_ptr) {
2252e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams        _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr,
225343702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich                _exception ? JNI_ABORT: 0);
225443702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
2255d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
22563aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)ret;
2257d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2258d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2259460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2260460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptIntrinsicCreate(JNIEnv *_env, jobject _this, jlong con, jint id, jlong eid)
22616ab97682fd444586ee135912a4210417a1c8781bJason Sams{
226267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
226367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptIntrinsicCreate, con(%p) id(%i) element(%p)", (RsContext)con, id,
226467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)eid);
226567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
22663aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
22676ab97682fd444586ee135912a4210417a1c8781bJason Sams}
22686ab97682fd444586ee135912a4210417a1c8781bJason Sams
2269460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2270460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptKernelIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jint sig)
227108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
227267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
227367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptKernelIDCreate, con(%p) script(%p), slot(%i), sig(%i)", (RsContext)con,
227467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)sid, slot, sig);
227567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
22763aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsScriptKernelIDCreate((RsContext)con, (RsScript)sid, slot, sig);
227708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
227808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2279460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2280be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang NinScriptInvokeIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
2281be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni{
2282be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    if (kLogApi) {
22837ff53fa0d42795da55b65468e07df82029deda79Elliott Hughes        ALOGD("nScriptInvokeIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con,
2284be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni              (void *)sid, slot);
2285be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    }
2286be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    return (jlong)(uintptr_t)rsScriptInvokeIDCreate((RsContext)con, (RsScript)sid, slot);
2287be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni}
2288be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
2289be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Nistatic jlong
2290460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptFieldIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
229108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
229267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
229367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptFieldIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con, (void *)sid,
229467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot);
229567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
22963aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
229708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
229808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2299460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
23009807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnScriptGroupCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _kernels, jlongArray _src,
23019807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    jlongArray _dstk, jlongArray _dstf, jlongArray _types)
230208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
230367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
230467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupCreate, con(%p)", (RsContext)con);
230567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
230608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2307a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong id = 0;
2308a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2309a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsScriptKernelID* kernelsPtr;
23109807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    jint kernelsLen = _env->GetArrayLength(_kernels);
2311488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jKernelsPtr = _env->GetLongArrayElements(_kernels, nullptr);
2312a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2313a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsScriptKernelID* srcPtr;
2314a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint srcLen = _env->GetArrayLength(_src);
2315a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong *jSrcPtr = _env->GetLongArrayElements(_src, nullptr);
2316a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2317a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsScriptKernelID* dstkPtr;
2318a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint dstkLen = _env->GetArrayLength(_dstk);
2319a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong *jDstkPtr = _env->GetLongArrayElements(_dstk, nullptr);
2320a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2321a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsScriptKernelID* dstfPtr;
2322a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint dstfLen = _env->GetArrayLength(_dstf);
2323a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong *jDstfPtr = _env->GetLongArrayElements(_dstf, nullptr);
2324a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2325a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsType* typesPtr;
2326a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint typesLen = _env->GetArrayLength(_types);
2327a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong *jTypesPtr = _env->GetLongArrayElements(_types, nullptr);
2328a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2329ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jKernelsPtr == nullptr) {
2330ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: kernels");
2331a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanup;
2332a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2333a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jSrcPtr == nullptr) {
2334a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        ALOGE("Failed to get Java array elements: src");
2335a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanup;
2336a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2337a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jDstkPtr == nullptr) {
2338a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        ALOGE("Failed to get Java array elements: dstk");
2339a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanup;
2340a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2341a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jDstfPtr == nullptr) {
2342a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        ALOGE("Failed to get Java array elements: dstf");
2343a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanup;
2344ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
2345a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jTypesPtr == nullptr) {
2346a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        ALOGE("Failed to get Java array elements: types");
2347a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanup;
2348a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2349a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2350a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    kernelsPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * kernelsLen);
23519807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < kernelsLen; ++i) {
23529807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        kernelsPtr[i] = (RsScriptKernelID)jKernelsPtr[i];
23539807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
23549807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2355a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    srcPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * srcLen);
23569807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < srcLen; ++i) {
23579807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        srcPtr[i] = (RsScriptKernelID)jSrcPtr[i];
23589807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
23599807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2360a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    dstkPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstkLen);
23619807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < dstkLen; ++i) {
23629807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        dstkPtr[i] = (RsScriptKernelID)jDstkPtr[i];
23639807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
23649807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2365a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    dstfPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstfLen);
23669807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < dstfLen; ++i) {
23679807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        dstfPtr[i] = (RsScriptKernelID)jDstfPtr[i];
23689807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
23699807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2370a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    typesPtr = (RsType*) malloc(sizeof(RsType) * typesLen);
23719807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < typesLen; ++i) {
23729807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        typesPtr[i] = (RsType)jTypesPtr[i];
23739807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
23749807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2375a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    id = (jlong)(uintptr_t)rsScriptGroupCreate((RsContext)con,
23769807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptKernelID *)kernelsPtr, kernelsLen * sizeof(RsScriptKernelID),
23779807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptKernelID *)srcPtr, srcLen * sizeof(RsScriptKernelID),
23789807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptKernelID *)dstkPtr, dstkLen * sizeof(RsScriptKernelID),
23799807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptFieldID *)dstfPtr, dstfLen * sizeof(RsScriptKernelID),
23809807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsType *)typesPtr, typesLen * sizeof(RsType));
23819807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
23829807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(kernelsPtr);
23839807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(srcPtr);
23849807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(dstkPtr);
23859807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(dstfPtr);
23869807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(typesPtr);
2387a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2388a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wangcleanup:
2389a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jKernelsPtr != nullptr) {
2390a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_kernels, jKernelsPtr, 0);
2391a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2392a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jSrcPtr != nullptr) {
2393a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_src, jSrcPtr, 0);
2394a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2395a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jDstkPtr != nullptr) {
2396a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_dstk, jDstkPtr, 0);
2397a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2398a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jDstfPtr != nullptr) {
2399a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_dstf, jDstfPtr, 0);
2400a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2401a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jTypesPtr != nullptr) {
2402a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_types, jTypesPtr, 0);
2403a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2404a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
240508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    return id;
240608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
240708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
240808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Samsstatic void
2409460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGroupSetInput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
241008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
241167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
241267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupSetInput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
241367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)gid, (void *)kid, (void *)alloc);
241467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2415eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGroupSetInput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid, (RsAllocation)alloc);
241608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
241708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
241808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Samsstatic void
2419460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGroupSetOutput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
242008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
242167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
242267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupSetOutput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
242367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)gid, (void *)kid, (void *)alloc);
242467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2425eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGroupSetOutput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid, (RsAllocation)alloc);
242608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
242708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
242808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Samsstatic void
2429460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGroupExecute(JNIEnv *_env, jobject _this, jlong con, jlong gid)
243008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
243167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
243267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupSetOutput, con(%p) group(%p)", (RsContext)con, (void *)gid);
243367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2434eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGroupExecute((RsContext)con, (RsScriptGroup)gid);
243508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
243608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2437d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
2438d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
24390e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
2440eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramStoreCreate(JNIEnv *_env, jobject _this, jlong con,
2441331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jboolean colorMaskR, jboolean colorMaskG, jboolean colorMaskB, jboolean colorMaskA,
2442331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jboolean depthMask, jboolean ditherEnable,
2443331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jint srcFunc, jint destFunc,
2444331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jint depthFunc)
2445d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
244667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
244767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramStoreCreate, con(%p)", (RsContext)con);
244867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
24493aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsProgramStoreCreate((RsContext)con, colorMaskR, colorMaskG, colorMaskB, colorMaskA,
2450331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                                      depthMask, ditherEnable, (RsBlendSrcFunc)srcFunc,
2451331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                                      (RsBlendDstFunc)destFunc, (RsDepthFunc)depthFunc);
2452d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2453d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
24540011bcf57ff711a221a3a4c73f2a79125111647dJason Sams// ---------------------------------------------------------------------------
24550011bcf57ff711a221a3a4c73f2a79125111647dJason Sams
24560011bcf57ff711a221a3a4c73f2a79125111647dJason Samsstatic void
2457460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynProgramBindConstants(JNIEnv *_env, jobject _this, jlong con, jlong vpv, jint slot, jlong a)
24580011bcf57ff711a221a3a4c73f2a79125111647dJason Sams{
245967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
246067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramBindConstants, con(%p), vpf(%p), sloat(%i), a(%p)", (RsContext)con,
246167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramVertex)vpv, slot, (RsAllocation)a);
246267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2463eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsProgramBindConstants((RsContext)con, (RsProgram)vpv, slot, (RsAllocation)a);
24640011bcf57ff711a221a3a4c73f2a79125111647dJason Sams}
246554c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams
2466d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
2467460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynProgramBindTexture(JNIEnv *_env, jobject _this, jlong con, jlong vpf, jint slot, jlong a)
246854c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams{
246967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
247067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramBindTexture, con(%p), vpf(%p), slot(%i), a(%p)", (RsContext)con,
247167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramFragment)vpf, slot, (RsAllocation)a);
247267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2473eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsProgramBindTexture((RsContext)con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
247454c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams}
247554c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams
247654c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Samsstatic void
2477460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynProgramBindSampler(JNIEnv *_env, jobject _this, jlong con, jlong vpf, jint slot, jlong a)
2478d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
247967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
248067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramBindSampler, con(%p), vpf(%p), slot(%i), a(%p)", (RsContext)con,
248167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramFragment)vpf, slot, (RsSampler)a);
248267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2483eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsProgramBindSampler((RsContext)con, (RsProgramFragment)vpf, slot, (RsSampler)a);
2484d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2485d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
248668afd01ec9fd37774d8291192952a25e5605b6fbJason Sams// ---------------------------------------------------------------------------
2487d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2488460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2489eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramFragmentCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader,
24909807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                       jobjectArray texNames, jlongArray params)
24917e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams{
2492b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 shaderUTF(_env, shader);
2493488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jParamPtr = _env->GetLongArrayElements(params, nullptr);
24947e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams    jint paramLen = _env->GetArrayLength(params);
2495ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jParamPtr == nullptr) {
2496ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
2497ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
2498ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
24997e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
25002123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    int texCount = _env->GetArrayLength(texNames);
25012123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8 names(_env, texNames, texCount);
25022123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char ** nameArray = names.c_str();
25032123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t* sizeArray = names.c_str_len();
25042123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
250567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
250667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramFragmentCreate, con(%p), paramLen(%i)", (RsContext)con, paramLen);
250767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
25087e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
25099807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t * paramPtr = (uintptr_t*) malloc(sizeof(uintptr_t) * paramLen);
25109807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < paramLen; ++i) {
25119807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        paramPtr[i] = (uintptr_t)jParamPtr[i];
25129807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
25133aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong ret = (jlong)(uintptr_t)rsProgramFragmentCreate((RsContext)con, shaderUTF.c_str(), shaderUTF.length(),
25142123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                                             nameArray, texCount, sizeArray,
25159807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                                             paramPtr, paramLen);
25162123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
25179807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(paramPtr);
25189807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(params, jParamPtr, JNI_ABORT);
25197e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams    return ret;
25207e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams}
25217e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
25227e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
25231fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams// ---------------------------------------------------------------------------
25241fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams
2525460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2526eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramVertexCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader,
25279807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                     jobjectArray texNames, jlongArray params)
25281fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams{
2529b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 shaderUTF(_env, shader);
2530488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jParamPtr = _env->GetLongArrayElements(params, nullptr);
25310011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    jint paramLen = _env->GetArrayLength(params);
2532ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jParamPtr == nullptr) {
2533ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
2534ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
2535ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
25361fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams
253767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
253867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramVertexCreate, con(%p), paramLen(%i)", (RsContext)con, paramLen);
253967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2540ee41112e1539de95596600fd2c6dada5d275217fJason Sams
25412123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    int texCount = _env->GetArrayLength(texNames);
25422123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8 names(_env, texNames, texCount);
25432123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char ** nameArray = names.c_str();
25442123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t* sizeArray = names.c_str_len();
25452123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
25469807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t * paramPtr = (uintptr_t*) malloc(sizeof(uintptr_t) * paramLen);
25479807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < paramLen; ++i) {
25489807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        paramPtr[i] = (uintptr_t)jParamPtr[i];
25499807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
25509807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
25513aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong ret = (jlong)(uintptr_t)rsProgramVertexCreate((RsContext)con, shaderUTF.c_str(), shaderUTF.length(),
25522123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                                           nameArray, texCount, sizeArray,
25539807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                                           paramPtr, paramLen);
25542123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
25559807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(paramPtr);
25569807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(params, jParamPtr, JNI_ABORT);
25570011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    return ret;
25581fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams}
25591fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams
2560ebfb436a49673693b98469683451bd9ede797557Jason Sams// ---------------------------------------------------------------------------
2561ebfb436a49673693b98469683451bd9ede797557Jason Sams
2562460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2563eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramRasterCreate(JNIEnv *_env, jobject _this, jlong con, jboolean pointSprite, jint cull)
2564ebfb436a49673693b98469683451bd9ede797557Jason Sams{
256567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
256667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramRasterCreate, con(%p), pointSprite(%i), cull(%i)", (RsContext)con,
256767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              pointSprite, cull);
256867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
25693aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsProgramRasterCreate((RsContext)con, pointSprite, (RsCullMode)cull);
2570ebfb436a49673693b98469683451bd9ede797557Jason Sams}
2571ebfb436a49673693b98469683451bd9ede797557Jason Sams
2572d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2573d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
2574d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2575d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
257678c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindRootScript(JNIEnv *_env, jobject _this, jlong con, jlong script)
2577d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
257867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
257967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindRootScript, con(%p), script(%p)", (RsContext)con, (RsScript)script);
258067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2581eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindRootScript((RsContext)con, (RsScript)script);
2582d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2583d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2584d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
258578c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramStore(JNIEnv *_env, jobject _this, jlong con, jlong pfs)
2586d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
258767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
258867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramStore, con(%p), pfs(%p)", (RsContext)con, (RsProgramStore)pfs);
258967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2590eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramStore((RsContext)con, (RsProgramStore)pfs);
2591d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2592d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2593d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
259478c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramFragment(JNIEnv *_env, jobject _this, jlong con, jlong pf)
2595d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
259667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
259767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramFragment, con(%p), pf(%p)", (RsContext)con,
259867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramFragment)pf);
259967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2600eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramFragment((RsContext)con, (RsProgramFragment)pf);
2601d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2602d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
26030826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samsstatic void
260478c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramVertex(JNIEnv *_env, jobject _this, jlong con, jlong pf)
26050826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams{
260667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
260767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramVertex, con(%p), pf(%p)", (RsContext)con, (RsProgramVertex)pf);
260867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2609eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramVertex((RsContext)con, (RsProgramVertex)pf);
26100826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams}
26110826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams
2612d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onoratostatic void
261378c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramRaster(JNIEnv *_env, jobject _this, jlong con, jlong pf)
2614ebfb436a49673693b98469683451bd9ede797557Jason Sams{
261567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
261667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramRaster, con(%p), pf(%p)", (RsContext)con, (RsProgramRaster)pf);
261767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2618eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramRaster((RsContext)con, (RsProgramRaster)pf);
2619ebfb436a49673693b98469683451bd9ede797557Jason Sams}
2620ebfb436a49673693b98469683451bd9ede797557Jason Sams
2621d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onorato
262202fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams// ---------------------------------------------------------------------------
262302fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams
26240e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
2625eff663f391fa4f119685d5c14489b94661ea126fTim MurraynSamplerCreate(JNIEnv *_env, jobject _this, jlong con, jint magFilter, jint minFilter,
2626a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk               jint wrapS, jint wrapT, jint wrapR, jfloat aniso)
262702fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams{
262867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
262967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nSamplerCreate, con(%p)", (RsContext)con);
263067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
26313aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsSamplerCreate((RsContext)con,
2632a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)magFilter,
2633a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)minFilter,
2634a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)wrapS,
2635a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)wrapT,
2636a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)wrapR,
2637a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 aniso);
263802fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams}
263902fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams
2640bba134c8a1dcfe0c8473307a95899a02c9553504Jason Sams// ---------------------------------------------------------------------------
2641bba134c8a1dcfe0c8473307a95899a02c9553504Jason Sams
2642460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
26439807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnMeshCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _vtx, jlongArray _idx, jintArray _prim)
2644164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk{
264567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
264667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshCreate, con(%p)", (RsContext)con);
264767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2648164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2649a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong id = 0;
2650a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2651a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsAllocation* vtxPtr;
265225999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk    jint vtxLen = _env->GetArrayLength(_vtx);
2653488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jVtxPtr = _env->GetLongArrayElements(_vtx, nullptr);
2654a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2655a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsAllocation* idxPtr;
2656a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint idxLen = _env->GetArrayLength(_idx);
2657a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong *jIdxPtr = _env->GetLongArrayElements(_idx, nullptr);
2658a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2659a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint primLen = _env->GetArrayLength(_prim);
2660a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint *primPtr = _env->GetIntArrayElements(_prim, nullptr);
2661a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2662ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jVtxPtr == nullptr) {
2663ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: vtx");
2664a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanupMesh;
2665a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2666a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jIdxPtr == nullptr) {
2667a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        ALOGE("Failed to get Java array elements: idx");
2668a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanupMesh;
2669a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2670a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (primPtr == nullptr) {
2671a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        ALOGE("Failed to get Java array elements: prim");
2672a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanupMesh;
2673ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
2674a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2675a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    vtxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * vtxLen);
26769807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < vtxLen; ++i) {
26779807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        vtxPtr[i] = (RsAllocation)(uintptr_t)jVtxPtr[i];
26789807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
26799807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2680a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    idxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * idxLen);
26819807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < idxLen; ++i) {
26829807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        idxPtr[i] = (RsAllocation)(uintptr_t)jIdxPtr[i];
26839807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
26849807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2685a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    id = (jlong)(uintptr_t)rsMeshCreate((RsContext)con,
2686a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang                                        (RsAllocation *)vtxPtr, vtxLen,
2687a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang                                        (RsAllocation *)idxPtr, idxLen,
2688a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang                                        (uint32_t *)primPtr, primLen);
268980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
26909807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(vtxPtr);
26919807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(idxPtr);
2692a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2693a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao WangcleanupMesh:
2694a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jVtxPtr != nullptr) {
2695a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_vtx, jVtxPtr, 0);
2696a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2697a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jIdxPtr != nullptr) {
2698a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_idx, jIdxPtr, 0);
2699a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2700a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (primPtr != nullptr) {
2701a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseIntArrayElements(_prim, primPtr, 0);
2702a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2703a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
270425999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk    return id;
27059d71e2180062931416092f26276a07e55b318f62Alex Sakhartchouk}
27069d71e2180062931416092f26276a07e55b318f62Alex Sakhartchouk
270780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic jint
2708460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynMeshGetVertexBufferCount(JNIEnv *_env, jobject _this, jlong con, jlong mesh)
270980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
271067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
271167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetVertexBufferCount, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
271267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
271380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    jint vtxCount = 0;
2714eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetVertexBufferCount((RsContext)con, (RsMesh)mesh, &vtxCount);
271580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    return vtxCount;
271680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk}
271780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
271880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic jint
2719460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynMeshGetIndexCount(JNIEnv *_env, jobject _this, jlong con, jlong mesh)
272080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
272167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
272267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetIndexCount, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
272367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
272480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    jint idxCount = 0;
2725eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetIndexCount((RsContext)con, (RsMesh)mesh, &idxCount);
272680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    return idxCount;
272780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk}
272880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
272980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic void
27309807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnMeshGetVertices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jlongArray _ids, jint numVtxIDs)
273180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
273267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
273367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetVertices, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
273467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
273580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
273680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numVtxIDs * sizeof(RsAllocation));
2737eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetVertices((RsContext)con, (RsMesh)mesh, allocs, (uint32_t)numVtxIDs);
273880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
273980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    for(jint i = 0; i < numVtxIDs; i ++) {
27403aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong alloc = (jlong)(uintptr_t)allocs[i];
27419807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_ids, i, 1, &alloc);
274280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    }
274380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
274480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    free(allocs);
274580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk}
274680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
274780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic void
27489807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnMeshGetIndices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jlongArray _idxIds, jintArray _primitives, jint numIndices)
274980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
275067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
275167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetVertices, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
275267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
275380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
275480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numIndices * sizeof(RsAllocation));
275580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    uint32_t *prims= (uint32_t*)malloc((uint32_t)numIndices * sizeof(uint32_t));
275680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
2757eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetIndices((RsContext)con, (RsMesh)mesh, allocs, prims, (uint32_t)numIndices);
275880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
275980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    for(jint i = 0; i < numIndices; i ++) {
27603aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong alloc = (jlong)(uintptr_t)allocs[i];
27619807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        const jint prim = (jint)prims[i];
27629807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_idxIds, i, 1, &alloc);
27639807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetIntArrayRegion(_primitives, i, 1, &prim);
276480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    }
276580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
276680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    free(allocs);
276780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    free(prims);
2768164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk}
2769164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
277056f9e6f8d5436d50530807950661e66ca5efe2bbTim Murraystatic jint
277156f9e6f8d5436d50530807950661e66ca5efe2bbTim MurraynSystemGetPointerSize(JNIEnv *_env, jobject _this) {
277256f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray    return (jint)sizeof(void*);
277356f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray}
277456f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray
27750facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wangstatic jobject
27760facf021ea1a0399d956372b9d3ad9025a9a04d2Miao WangnAllocationGetByteBuffer(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
27770facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang                        jlongArray strideArr, jint xBytesSize,
27780facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang                        jint dimY, jint dimZ) {
27790facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    if (kLogApi) {
27800facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        ALOGD("nAllocationGetByteBuffer, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
27810facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    }
27820facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang
27830facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    jlong *jStridePtr = _env->GetLongArrayElements(strideArr, nullptr);
27840facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    if (jStridePtr == nullptr) {
27850facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        ALOGE("Failed to get Java array elements: strideArr");
27860facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        return 0;
27870facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    }
278856f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray
27890facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    size_t strideIn = xBytesSize;
27900facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    void* ptr = nullptr;
27910facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    if (alloc != 0) {
27920facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        ptr = rsAllocationGetPointer((RsContext)con, (RsAllocation)alloc, 0,
27930facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang                                     RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 0, 0,
27940facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang                                     &strideIn, sizeof(size_t));
27950facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    }
27960facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang
27970facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    jobject byteBuffer = nullptr;
27980facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    if (ptr != nullptr) {
27990facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        size_t bufferSize = strideIn;
28000facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        jStridePtr[0] = strideIn;
28010facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        if (dimY > 0) {
28020facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang            bufferSize *= dimY;
28030facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        }
28040facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        if (dimZ > 0) {
28050facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang            bufferSize *= dimZ;
28060facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        }
28070facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        byteBuffer = _env->NewDirectByteBuffer(ptr, (jlong) bufferSize);
28080facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    }
28090facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    _env->ReleaseLongArrayElements(strideArr, jStridePtr, 0);
28100facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    return byteBuffer;
28110facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang}
2812164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk// ---------------------------------------------------------------------------
2813164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2814d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
281594d8e90ad78ee1dbc0efa315117688abd126ae55Jason Samsstatic const char *classPathName = "android/renderscript/RenderScript";
2816d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
281776f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod methods[] = {
28181c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams{"_nInit",                         "()V",                                     (void*)_nInit },
28191c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
2820eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nDeviceCreate",                  "()J",                                     (void*)nDeviceCreate },
2821eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nDeviceDestroy",                 "(J)V",                                    (void*)nDeviceDestroy },
2822eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nDeviceSetConfig",               "(JII)V",                                  (void*)nDeviceSetConfig },
2823eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextGetUserMessage",         "(J[I)I",                                  (void*)nContextGetUserMessage },
2824eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextGetErrorMessage",        "(J)Ljava/lang/String;",                   (void*)nContextGetErrorMessage },
2825eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextPeekMessage",            "(J[I)I",                                  (void*)nContextPeekMessage },
28261c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
2827eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextInitToClient",           "(J)V",                                    (void*)nContextInitToClient },
2828eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextDeinitToClient",         "(J)V",                                    (void*)nContextDeinitToClient },
28292e1872fe07cf8952812a417985e6e1f61bdeab5dJason Sams
28302e1872fe07cf8952812a417985e6e1f61bdeab5dJason Sams
28312e1872fe07cf8952812a417985e6e1f61bdeab5dJason Sams// All methods below are thread protected in java.
2832eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextCreate",                 "(JIII)J",                               (void*)nContextCreate },
2833eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextCreateGL",               "(JIIIIIIIIIIIIFI)J",                    (void*)nContextCreateGL },
2834eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextFinish",                 "(J)V",                                  (void*)nContextFinish },
2835eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextSetPriority",            "(JI)V",                                 (void*)nContextSetPriority },
283647f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray{"rsnContextSetCacheDir",            "(JLjava/lang/String;)V",                (void*)nContextSetCacheDir },
2837eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextSetSurface",             "(JIILandroid/view/Surface;)V",          (void*)nContextSetSurface },
2838eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextDestroy",                "(J)V",                                  (void*)nContextDestroy },
2839eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextDump",                   "(JI)V",                                 (void*)nContextDump },
2840eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextPause",                  "(J)V",                                  (void*)nContextPause },
2841eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextResume",                 "(J)V",                                  (void*)nContextResume },
2842eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextSendMessage",            "(JI[I)V",                               (void*)nContextSendMessage },
2843281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnClosureCreate",                 "(JJJ[J[J[I[J[J)J",                      (void*)nClosureCreate },
2844be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni{"rsnInvokeClosureCreate",           "(JJ[B[J[J[I)J",                         (void*)nInvokeClosureCreate },
2845281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnClosureSetArg",                 "(JJIJI)V",                              (void*)nClosureSetArg },
2846281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnClosureSetGlobal",              "(JJJJI)V",                              (void*)nClosureSetGlobal },
2847460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAssignName",                    "(JJ[B)V",                               (void*)nAssignName },
2848460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnGetName",                       "(JJ)Ljava/lang/String;",                (void*)nGetName },
2849460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnObjDestroy",                    "(JJ)V",                                 (void*)nObjDestroy },
2850eff663f391fa4f119685d5c14489b94661ea126fTim Murray
2851460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DCreateFromFile",         "(JLjava/lang/String;)J",                (void*)nFileA3DCreateFromFile },
28520e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFileA3DCreateFromAssetStream",  "(JJ)J",                                 (void*)nFileA3DCreateFromAssetStream },
2853460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DCreateFromAsset",        "(JLandroid/content/res/AssetManager;Ljava/lang/String;)J",            (void*)nFileA3DCreateFromAsset },
2854460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DGetNumIndexEntries",     "(JJ)I",                                 (void*)nFileA3DGetNumIndexEntries },
2855460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DGetIndexEntries",        "(JJI[I[Ljava/lang/String;)V",           (void*)nFileA3DGetIndexEntries },
28560e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFileA3DGetEntryByIndex",        "(JJI)J",                                (void*)nFileA3DGetEntryByIndex },
2857eff663f391fa4f119685d5c14489b94661ea126fTim Murray
28580e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFontCreateFromFile",            "(JLjava/lang/String;FI)J",              (void*)nFontCreateFromFile },
28590e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFontCreateFromAssetStream",     "(JLjava/lang/String;FIJ)J",             (void*)nFontCreateFromAssetStream },
28600e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFontCreateFromAsset",        "(JLandroid/content/res/AssetManager;Ljava/lang/String;FI)J",            (void*)nFontCreateFromAsset },
2861eff663f391fa4f119685d5c14489b94661ea126fTim Murray
2862460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnElementCreate",                 "(JJIZI)J",                              (void*)nElementCreate },
28639807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnElementCreate2",                "(J[J[Ljava/lang/String;[I)J",           (void*)nElementCreate2 },
2864460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnElementGetNativeData",          "(JJ[I)V",                               (void*)nElementGetNativeData },
28659807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnElementGetSubElements",         "(JJ[J[Ljava/lang/String;[I)V",          (void*)nElementGetSubElements },
2866460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
2867460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnTypeCreate",                    "(JJIIIZZI)J",                           (void*)nTypeCreate },
28689807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnTypeGetNativeData",             "(JJ[J)V",                               (void*)nTypeGetNativeData },
2869460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
28709807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnAllocationCreateTyped",         "(JJIIJ)J",                               (void*)nAllocationCreateTyped },
2871460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCreateFromBitmap",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateFromBitmap },
2872460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCreateBitmapBackedAllocation",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateBitmapBackedAllocation },
2873460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCubeCreateFromBitmap","(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCubeCreateFromBitmap },
2874460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
2875460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCopyFromBitmap",      "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyFromBitmap },
2876460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCopyToBitmap",        "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyToBitmap },
2877460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
2878460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationSyncAll",             "(JJI)V",                                (void*)nAllocationSyncAll },
28798c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{"rsnAllocationSetupBufferQueue",    "(JJI)V",                                (void*)nAllocationSetupBufferQueue },
28808c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{"rsnAllocationShareBufferQueue",    "(JJJ)V",                                (void*)nAllocationShareBufferQueue },
2881460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationGetSurface",          "(JJ)Landroid/view/Surface;",            (void*)nAllocationGetSurface },
2882460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationSetSurface",          "(JJLandroid/view/Surface;)V",           (void*)nAllocationSetSurface },
2883460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationIoSend",              "(JJ)V",                                 (void*)nAllocationIoSend },
28848c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{"rsnAllocationIoReceive",           "(JJ)J",                                 (void*)nAllocationIoReceive },
288587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationData1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationData1D },
2886c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang{"rsnAllocationElementData",         "(JJIIIII[BI)V",                         (void*)nAllocationElementData },
288787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationData2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationData2D },
2888460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationData2D",              "(JJIIIIIIJIIII)V",                      (void*)nAllocationData2D_alloc },
288987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationData3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",    (void*)nAllocationData3D },
2890460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationData3D",              "(JJIIIIIIIJIIII)V",                     (void*)nAllocationData3D_alloc },
289187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead",                "(JJLjava/lang/Object;IIZ)V",            (void*)nAllocationRead },
289287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationRead1D },
289345cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang{"rsnAllocationElementRead",         "(JJIIIII[BI)V",                         (void*)nAllocationElementRead },
289487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationRead2D },
289587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",    (void*)nAllocationRead3D },
2896460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationGetType",             "(JJ)J",                                 (void*)nAllocationGetType},
2897460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationResize1D",            "(JJI)V",                                (void*)nAllocationResize1D },
2898460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationGenerateMipmaps",     "(JJ)V",                                 (void*)nAllocationGenerateMipmaps },
2899460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
290046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{"rsnAllocationAdapterCreate",       "(JJJ)J",                                (void*)nAllocationAdapterCreate },
290146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{"rsnAllocationAdapterOffset",       "(JJIIIIIIIII)V",                        (void*)nAllocationAdapterOffset },
290246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
2903460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptBindAllocation",          "(JJJI)V",                               (void*)nScriptBindAllocation },
2904460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetTimeZone",             "(JJ[B)V",                               (void*)nScriptSetTimeZone },
2905460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptInvoke",                  "(JJI)V",                                (void*)nScriptInvoke },
2906460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptInvokeV",                 "(JJI[B)V",                              (void*)nScriptInvokeV },
2907be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2908be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes{"rsnScriptForEach",                 "(JJI[JJ[B[I)V",                         (void*)nScriptForEach },
29094a4578530a1a5fb751ea5a7bfbff83f3ab669895David Gross{"rsnScriptReduce",                  "(JJI[JJ[I)V",                           (void*)nScriptReduce },
2910be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2911460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarI",                 "(JJII)V",                               (void*)nScriptSetVarI },
2912460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarI",                 "(JJI)I",                                (void*)nScriptGetVarI },
2913460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarJ",                 "(JJIJ)V",                               (void*)nScriptSetVarJ },
2914460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarJ",                 "(JJI)J",                                (void*)nScriptGetVarJ },
2915460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarF",                 "(JJIF)V",                               (void*)nScriptSetVarF },
2916460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarF",                 "(JJI)F",                                (void*)nScriptGetVarF },
2917460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarD",                 "(JJID)V",                               (void*)nScriptSetVarD },
2918460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarD",                 "(JJI)D",                                (void*)nScriptGetVarD },
2919460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarV",                 "(JJI[B)V",                              (void*)nScriptSetVarV },
2920460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarV",                 "(JJI[B)V",                              (void*)nScriptGetVarV },
2921460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarVE",                "(JJI[BJ[I)V",                           (void*)nScriptSetVarVE },
2922460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarObj",               "(JJIJ)V",                               (void*)nScriptSetVarObj },
2923eff663f391fa4f119685d5c14489b94661ea126fTim Murray
29240e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnScriptCCreate",                 "(JLjava/lang/String;Ljava/lang/String;[BI)J",  (void*)nScriptCCreate },
2925460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptIntrinsicCreate",         "(JIJ)J",                                (void*)nScriptIntrinsicCreate },
2926460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptKernelIDCreate",          "(JJII)J",                               (void*)nScriptKernelIDCreate },
2927be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni{"rsnScriptInvokeIDCreate",          "(JJI)J",                                (void*)nScriptInvokeIDCreate },
2928460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptFieldIDCreate",           "(JJI)J",                                (void*)nScriptFieldIDCreate },
29299807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnScriptGroupCreate",             "(J[J[J[J[J[J)J",                        (void*)nScriptGroupCreate },
293035be56cce821d86f69026398ff9433e2d173b02fYang Ni{"rsnScriptGroup2Create",            "(JLjava/lang/String;Ljava/lang/String;[J)J", (void*)nScriptGroup2Create },
2931460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGroupSetInput",           "(JJJJ)V",                               (void*)nScriptGroupSetInput },
2932460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGroupSetOutput",          "(JJJJ)V",                               (void*)nScriptGroupSetOutput },
2933460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGroupExecute",            "(JJ)V",                                 (void*)nScriptGroupExecute },
2934281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnScriptGroup2Execute",           "(JJ)V",                                 (void*)nScriptGroup2Execute },
2935eff663f391fa4f119685d5c14489b94661ea126fTim Murray
293625207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Single",    "(JJIIIIIIIIIFJJFJIIII)V",               (void*)nScriptIntrinsicBLAS_Single },
293725207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Double",    "(JJIIIIIIIIIDJJDJIIII)V",               (void*)nScriptIntrinsicBLAS_Double },
293825207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Complex",   "(JJIIIIIIIIIFFJJFFJIIII)V",             (void*)nScriptIntrinsicBLAS_Complex },
293925207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Z",         "(JJIIIIIIIIIDDJJDDJIIII)V",             (void*)nScriptIntrinsicBLAS_Z },
294025207df658d6a8a3e885c7017fcc25702363583cTim Murray
29419cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray{"rsnScriptIntrinsicBLAS_BNNM",      "(JJIIIJIJIJII)V",                       (void*)nScriptIntrinsicBLAS_BNNM },
29429cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
29430e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnProgramStoreCreate",            "(JZZZZZZIII)J",                         (void*)nProgramStoreCreate },
2944eff663f391fa4f119685d5c14489b94661ea126fTim Murray
2945460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramBindConstants",          "(JJIJ)V",                               (void*)nProgramBindConstants },
2946460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramBindTexture",            "(JJIJ)V",                               (void*)nProgramBindTexture },
2947460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramBindSampler",            "(JJIJ)V",                               (void*)nProgramBindSampler },
2948eff663f391fa4f119685d5c14489b94661ea126fTim Murray
29499807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnProgramFragmentCreate",         "(JLjava/lang/String;[Ljava/lang/String;[J)J",              (void*)nProgramFragmentCreate },
2950460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramRasterCreate",           "(JZI)J",                                (void*)nProgramRasterCreate },
29519807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnProgramVertexCreate",           "(JLjava/lang/String;[Ljava/lang/String;[J)J",              (void*)nProgramVertexCreate },
2952eff663f391fa4f119685d5c14489b94661ea126fTim Murray
295378c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindRootScript",         "(JJ)V",                                 (void*)nContextBindRootScript },
295478c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramStore",       "(JJ)V",                                 (void*)nContextBindProgramStore },
295578c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramFragment",    "(JJ)V",                                 (void*)nContextBindProgramFragment },
295678c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramVertex",      "(JJ)V",                                 (void*)nContextBindProgramVertex },
295778c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramRaster",      "(JJ)V",                                 (void*)nContextBindProgramRaster },
2958eff663f391fa4f119685d5c14489b94661ea126fTim Murray
29590e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnSamplerCreate",                 "(JIIIIIF)J",                            (void*)nSamplerCreate },
2960eff663f391fa4f119685d5c14489b94661ea126fTim Murray
29619807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnMeshCreate",                    "(J[J[J[I)J",                            (void*)nMeshCreate },
2962eff663f391fa4f119685d5c14489b94661ea126fTim Murray
2963460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnMeshGetVertexBufferCount",      "(JJ)I",                                 (void*)nMeshGetVertexBufferCount },
2964460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnMeshGetIndexCount",             "(JJ)I",                                 (void*)nMeshGetIndexCount },
29659807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnMeshGetVertices",               "(JJ[JI)V",                              (void*)nMeshGetVertices },
29669807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnMeshGetIndices",                "(JJ[J[II)V",                            (void*)nMeshGetIndices },
296780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
296856f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray{"rsnSystemGetPointerSize",          "()I",                                   (void*)nSystemGetPointerSize },
29690facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang{"rsnAllocationGetByteBuffer",       "(JJ[JIII)Ljava/nio/ByteBuffer;",        (void*)nAllocationGetByteBuffer },
2970d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams};
2971d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2972d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic int registerFuncs(JNIEnv *_env)
2973d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
2974d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return android::AndroidRuntime::registerNativeMethods(
2975d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            _env, classPathName, methods, NELEM(methods));
2976d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2977d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2978d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
2979d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2980d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsjint JNI_OnLoad(JavaVM* vm, void* reserved)
2981d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
2982488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    JNIEnv* env = nullptr;
2983d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    jint result = -1;
2984d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2985d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
29863762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: GetEnv failed\n");
2987d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        goto bail;
2988d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
2989488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    assert(env != nullptr);
2990d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2991d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (registerFuncs(env) < 0) {
29920e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat        ALOGE("ERROR: Renderscript native registration failed\n");
2993d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        goto bail;
2994d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
2995d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2996d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    /* success -- return valid version number */
2997d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    result = JNI_VERSION_1_4;
2998d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2999d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsbail:
3000d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return result;
3001d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
3002