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
27bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski#include <android-base/macros.h>
28b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/Asset.h>
29bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski#include <androidfw/AssetManager2.h>
30b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/ResourceTypes.h>
31dc01e938c2550390a540311b22e3e6c7603ed975Steven Moreland#include <android-base/macros.h>
32f29ca50d80e3dc379de1642e85b7963175b2ca38Jason Sams
33d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "jni.h"
342279b2534272282a5b5152723235da397e49195cSteven Moreland#include <nativehelper/JNIHelp.h>
35d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "android_runtime/AndroidRuntime.h"
36ee956053d6e3f7a7a82e41853b9b251fdc226d7aJim Miller#include "android_runtime/android_view_Surface.h"
37b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk#include "android_runtime/android_util_AssetManager.h"
38f4faeac3525fe1ce3707ab785a1651aec367589dJohn Reck#include "android/graphics/GraphicsJNI.h"
3933287e8a893821be86b395ce9d5d639cc8a535f3Miao Wang#include "android/native_window.h"
4033287e8a893821be86b395ce9d5d639cc8a535f3Miao Wang#include "android/native_window_jni.h"
41d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
421d6983af336b2b1d3a24aece58ce0850aa79e8a0Jason Sams#include <rsEnv.h>
43cbb0206cb478c862cb871a65e85115281ef12e02Miao Wang#include <rsApiStubs.h>
44fb9aa9f3ef11878caaf6fcfb5ea49ffb9f7abf33Jason Sams#include <gui/Surface.h>
45d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden#include <gui/GLConsumer.h>
46faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams#include <android_runtime/android_graphics_SurfaceTexture.h>
47d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
483762c311729fe9f3af085c14c5c1fb471d994c03Steve Block//#define LOG_API ALOGE
4967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampestatic constexpr bool kLogApi = false;
50d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
51d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsusing namespace android;
52d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
53414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines#define PER_ARRAY_TYPE(flag, fnc, readonly, ...) {                                      \
54e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    jint len = 0;                                                                       \
55488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    void *ptr = nullptr;                                                                \
5687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    void *srcPtr = nullptr;                                                             \
5721659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    size_t typeBytes = 0;                                                               \
58414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines    jint relFlag = 0;                                                                   \
59414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines    if (readonly) {                                                                     \
60414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        /* The on-release mode should only be JNI_ABORT for read-only accesses. */      \
6187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        /* readonly = true, also indicates we are copying to the allocation   . */      \
62414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        relFlag = JNI_ABORT;                                                            \
63414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines    }                                                                                   \
64e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    switch(dataType) {                                                                  \
65e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_FLOAT_32:                                                              \
66e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jfloatArray)data);                                  \
67e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetFloatArrayElements((jfloatArray)data, flag);                     \
68ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
69ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
70ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
71ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
7221659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 4;                                                                  \
7387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
7487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
7587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
7687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
7787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
7887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
7987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
8087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
8187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
8287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
8387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
8487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
8587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
8687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
8787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
8887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
8987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
9087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
9187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
92414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseFloatArrayElements((jfloatArray)data, (jfloat *)ptr, relFlag);     \
93e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
94e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_FLOAT_64:                                                              \
95e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jdoubleArray)data);                                 \
96e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetDoubleArrayElements((jdoubleArray)data, flag);                   \
97ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
98ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
99ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
100ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
10121659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 8;                                                                  \
10287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
10387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
10487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
10587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
10687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
10787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
10887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
10987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
11087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
11187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
11287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
11387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
11487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
11587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
11687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
11787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
11887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
11987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
12087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
121414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseDoubleArrayElements((jdoubleArray)data, (jdouble *)ptr, relFlag);  \
122e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
123e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_SIGNED_8:                                                              \
124e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_UNSIGNED_8:                                                            \
125e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jbyteArray)data);                                   \
126e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetByteArrayElements((jbyteArray)data, flag);                       \
127ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
128ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
129ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
130ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
13121659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 1;                                                                  \
13287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
13387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
13487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
13587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
13687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
13787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
13887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
13987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
14087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
14187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
14287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
14387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
14487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
14587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
14687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
14787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
14887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
14987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
15087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
151414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseByteArrayElements((jbyteArray)data, (jbyte*)ptr, relFlag);         \
152e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
153e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_SIGNED_16:                                                             \
154e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_UNSIGNED_16:                                                           \
1551333215d8e61c1cbcabb551ac9a49a801f90ca76Pirama Arumuga Nainar    case RS_TYPE_FLOAT_16:                                                              \
156e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jshortArray)data);                                  \
157e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetShortArrayElements((jshortArray)data, flag);                     \
158ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
159ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
160ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
161ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
16221659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 2;                                                                  \
16387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
16487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
16587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
16687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
16787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
16887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
16987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
17087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
17187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
17287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
17387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
17487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
17587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
17687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
17787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
17887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
17987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
18087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
18187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
182414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseShortArrayElements((jshortArray)data, (jshort *)ptr, relFlag);     \
183e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
184e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_SIGNED_32:                                                             \
185e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_UNSIGNED_32:                                                           \
186e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jintArray)data);                                    \
187e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetIntArrayElements((jintArray)data, flag);                         \
188ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
189ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
190ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
191ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
19221659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 4;                                                                  \
19387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
19487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
19587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
19687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
19787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
19887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
19987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
20087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
20187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
20287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
20387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
20487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
20587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
20687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
20787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
20887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
20987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
21087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
21187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
212414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseIntArrayElements((jintArray)data, (jint *)ptr, relFlag);           \
213e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
214e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_SIGNED_64:                                                             \
215e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_UNSIGNED_64:                                                           \
216e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jlongArray)data);                                   \
217e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetLongArrayElements((jlongArray)data, flag);                       \
218ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
219ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
220ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
221ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
22221659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 8;                                                                  \
22387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
22487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
22587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
22687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
22787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
22887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
22987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
23087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
23187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
23287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
23387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
23487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
23587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
23687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
23787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
23887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
23987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
24087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
24187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
242414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseLongArrayElements((jlongArray)data, (jlong *)ptr, relFlag);        \
243e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
244e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    default:                                                                            \
245e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        break;                                                                          \
246e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    }                                                                                   \
24787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    UNUSED(len, ptr, srcPtr, typeBytes, relFlag);                                       \
248e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams}
249e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams
250e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams
251b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchoukclass AutoJavaStringToUTF8 {
252b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchoukpublic:
2532123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringToUTF8(JNIEnv* env, jstring str) : fEnv(env), fJStr(str) {
254488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        fCStr = env->GetStringUTFChars(str, nullptr);
255b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        fLength = env->GetStringUTFLength(str);
256b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
2572123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    ~AutoJavaStringToUTF8() {
258b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        fEnv->ReleaseStringUTFChars(fJStr, fCStr);
259b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
260b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    const char* c_str() const { return fCStr; }
261b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    jsize length() const { return fLength; }
262b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
263b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchoukprivate:
264b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    JNIEnv*     fEnv;
265b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    jstring     fJStr;
266b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    const char* fCStr;
267b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    jsize       fLength;
268b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk};
269b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
2702123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchoukclass AutoJavaStringArrayToUTF8 {
2712123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchoukpublic:
2722123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8(JNIEnv* env, jobjectArray strings, jsize stringsLength)
2732123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    : mEnv(env), mStrings(strings), mStringsLength(stringsLength) {
274488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        mCStrings = nullptr;
275488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        mSizeArray = nullptr;
2762123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        if (stringsLength > 0) {
2772123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            mCStrings = (const char **)calloc(stringsLength, sizeof(char *));
2782123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            mSizeArray = (size_t*)calloc(stringsLength, sizeof(size_t));
2792123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            for (jsize ct = 0; ct < stringsLength; ct ++) {
2802123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
281488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes                mCStrings[ct] = mEnv->GetStringUTFChars(s, nullptr);
2822123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                mSizeArray[ct] = mEnv->GetStringUTFLength(s);
2832123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            }
2842123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        }
2852123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    }
2862123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    ~AutoJavaStringArrayToUTF8() {
2872123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        for (jsize ct=0; ct < mStringsLength; ct++) {
2882123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
2892123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            mEnv->ReleaseStringUTFChars(s, mCStrings[ct]);
2902123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        }
2912123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        free(mCStrings);
2922123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        free(mSizeArray);
2932123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    }
2942123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char **c_str() const { return mCStrings; }
2952123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t *c_str_len() const { return mSizeArray; }
2962123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    jsize length() const { return mStringsLength; }
2972123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
2982123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchoukprivate:
2992123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    JNIEnv      *mEnv;
3002123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    jobjectArray mStrings;
3012123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char **mCStrings;
3022123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t      *mSizeArray;
3032123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    jsize        mStringsLength;
3042123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk};
3052123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
306d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
307d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
308ffe9f48890dde7173a0845d32887fdf94a49b0a7Jason Samsstatic jfieldID gContextId = 0;
309d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
310d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void _nInit(JNIEnv *_env, jclass _this)
311d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
312eff663f391fa4f119685d5c14489b94661ea126fTim Murray    gContextId             = _env->GetFieldID(_this, "mContext", "J");
313d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
314d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
315d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
316d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
31787e908dfdece91b5f504386d4901fa3342dc8083Miao Wangstatic void copyWithPadding(void* ptr, void* srcPtr, int mSize, int count) {
31887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int sizeBytesPad = mSize * 4;
31987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int sizeBytes = mSize * 3;
32087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    uint8_t *dst = static_cast<uint8_t *>(ptr);
32187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    uint8_t *src = static_cast<uint8_t *>(srcPtr);
32287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    for (int i = 0; i < count; i++) {
32387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        memcpy(dst, src, sizeBytes);
32487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        dst += sizeBytesPad;
32587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        src += sizeBytes;
32687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    }
32787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang}
32887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang
32987e908dfdece91b5f504386d4901fa3342dc8083Miao Wangstatic void copyWithUnPadding(void* ptr, void* srcPtr, int mSize, int count) {
33087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int sizeBytesPad = mSize * 4;
33187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int sizeBytes = mSize * 3;
33287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    uint8_t *dst = static_cast<uint8_t *>(ptr);
33387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    uint8_t *src = static_cast<uint8_t *>(srcPtr);
33487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    for (int i = 0; i < count; i++) {
33587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        memcpy(dst, src, sizeBytes);
33687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        dst += sizeBytes;
33787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        src += sizeBytesPad;
33887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    }
33987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang}
34087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang
34187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang
34287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang// ---------------------------------------------------------------------------
3433eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Samsstatic void
344eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextFinish(JNIEnv *_env, jobject _this, jlong con)
34596ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams{
34667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
34767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextFinish, con(%p)", (RsContext)con);
34867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
349eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextFinish((RsContext)con);
35096ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams}
35196ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams
352281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic jlong
353281c3252510bcf4120d17fa0125f369c2c78f162Yang NinClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong kernelID,
354281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni               jlong returnValue, jlongArray fieldIDArray,
355281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni               jlongArray valueArray, jintArray sizeArray,
356281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni               jlongArray depClosureArray, jlongArray depFieldIDArray) {
35717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong ret = 0;
35817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
359281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
360281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
361ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jFieldIDs == nullptr) {
362ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: fieldIDs.");
363ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
364ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
365ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
36617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
36717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize values_length = _env->GetArrayLength(valueArray);
368ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jValues == nullptr) {
369ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: values.");
370ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
371ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
372ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
37317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
37417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize sizes_length = _env->GetArrayLength(sizeArray);
375ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jSizes == nullptr) {
376ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: sizes.");
377ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
378ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
379ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
38017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong* jDepClosures =
38117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      _env->GetLongArrayElements(depClosureArray, nullptr);
38217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize depClosures_length = _env->GetArrayLength(depClosureArray);
383ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jDepClosures == nullptr) {
384ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: depClosures.");
385ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
386ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
387ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
38817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong* jDepFieldIDs =
38917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      _env->GetLongArrayElements(depFieldIDArray, nullptr);
39017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize depFieldIDs_length = _env->GetArrayLength(depFieldIDArray);
391ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jDepFieldIDs == nullptr) {
392ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: depFieldIDs.");
393ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
394ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
39517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
39617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  size_t numValues, numDependencies;
39717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsScriptFieldID* fieldIDs;
39817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsClosure* depClosures;
39917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsScriptFieldID* depFieldIDs;
40017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
40117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (fieldIDs_length != values_length || values_length != sizes_length) {
40217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Unmatched field IDs, values, and sizes in closure creation.");
40317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
40417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
40517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
40617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  numValues = (size_t)fieldIDs_length;
40717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
40817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (depClosures_length != depFieldIDs_length) {
40917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Unmatched closures and field IDs for dependencies in closure creation.");
41017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
41117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
41217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
41317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  numDependencies = (size_t)depClosures_length;
41417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
41517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (numDependencies > numValues) {
41617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Unexpected number of dependencies in closure creation");
41717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
41817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
41917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
4207b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni  if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
42117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Too many arguments or globals in closure creation");
42217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
42317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
42417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
42586c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni  if (numValues > 0) {
42686c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
42786c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      if (fieldIDs == nullptr) {
42886c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni          goto exit;
42986c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      }
43086c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni  } else {
43186c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      // numValues == 0
43286c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      // alloca(0) implementation is platform-dependent.
43386c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      fieldIDs = nullptr;
43417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
43517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
43617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  for (size_t i = 0; i < numValues; i++) {
437281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni    fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
438281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  }
439281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
44086c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni  if (numDependencies > 0) {
44186c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      depClosures = (RsClosure*)alloca(sizeof(RsClosure) * numDependencies);
44286c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      if (depClosures == nullptr) {
44386c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni          goto exit;
44486c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      }
44586c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni
44686c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      for (size_t i = 0; i < numDependencies; i++) {
44786c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni          depClosures[i] = (RsClosure)jDepClosures[i];
44886c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      }
44986c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni
45086c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      depFieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numDependencies);
45186c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      if (depFieldIDs == nullptr) {
45286c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni          goto exit;
45386c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      }
45486c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni
45586c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      for (size_t i = 0; i < numDependencies; i++) {
45686c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni          depFieldIDs[i] = (RsClosure)jDepFieldIDs[i];
45786c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      }
45886c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni  } else {
45986c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      // alloca(0) implementation is platform-dependent.
46086c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      depClosures = nullptr;
46186c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      depFieldIDs = nullptr;
462281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  }
463281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
46417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  ret = (jlong)(uintptr_t)rsClosureCreate(
465281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni      (RsContext)con, (RsScriptKernelID)kernelID, (RsAllocation)returnValue,
466263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni      fieldIDs, numValues, jValues, numValues,
46717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      (int*)jSizes, numValues,
46817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      depClosures, numDependencies,
46917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      depFieldIDs, numDependencies);
47017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
47117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Niexit:
47217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
47317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(depFieldIDArray, jDepFieldIDs, JNI_ABORT);
47417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(depClosureArray, jDepClosures, JNI_ABORT);
47517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseIntArrayElements (sizeArray,       jSizes,       JNI_ABORT);
47617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(valueArray,      jValues,      JNI_ABORT);
47717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(fieldIDArray,    jFieldIDs,    JNI_ABORT);
47817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
47917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  return ret;
480281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
481281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
482be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Nistatic jlong
483be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang NinInvokeClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong invokeID,
484be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni                     jbyteArray paramArray, jlongArray fieldIDArray, jlongArray valueArray,
485be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni                     jintArray sizeArray) {
48617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong ret = 0;
48717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
488be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jbyte* jParams = _env->GetByteArrayElements(paramArray, nullptr);
489be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jsize jParamLength = _env->GetArrayLength(paramArray);
490ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jParams == nullptr) {
491ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: params.");
492ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
493ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
494ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
495be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
496be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
497ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jFieldIDs == nullptr) {
498ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: fieldIDs.");
499ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
500ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
501ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
50217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
50317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize values_length = _env->GetArrayLength(valueArray);
504ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jValues == nullptr) {
505ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: values.");
506ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
507ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
508ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
50917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
51017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize sizes_length = _env->GetArrayLength(sizeArray);
511ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jSizes == nullptr) {
512ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: sizes.");
513ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
514ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
51517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
51617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  size_t numValues;
51717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsScriptFieldID* fieldIDs;
51817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
51917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (fieldIDs_length != values_length || values_length != sizes_length) {
52017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Unmatched field IDs, values, and sizes in closure creation.");
52117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
52217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
52317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
52417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  numValues = (size_t) fieldIDs_length;
52517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
5267b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni  if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
52717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Too many arguments or globals in closure creation");
52817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
52917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
53017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
53117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
53217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (fieldIDs == nullptr) {
53317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
53417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
53517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
53617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  for (size_t i = 0; i< numValues; i++) {
537be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
538be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  }
539be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
54017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  ret = (jlong)(uintptr_t)rsInvokeClosureCreate(
541be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni      (RsContext)con, (RsScriptInvokeID)invokeID, jParams, jParamLength,
542263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni      fieldIDs, numValues, jValues, numValues,
54317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      (int*)jSizes, numValues);
54417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
54517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Niexit:
54617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
54717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseIntArrayElements (sizeArray,       jSizes,       JNI_ABORT);
54817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(valueArray,      jValues,      JNI_ABORT);
54917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(fieldIDArray,    jFieldIDs,    JNI_ABORT);
55017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseByteArrayElements(paramArray,      jParams,      JNI_ABORT);
55117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
55217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  return ret;
553be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni}
554be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
555281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic void
556281c3252510bcf4120d17fa0125f369c2c78f162Yang NinClosureSetArg(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
557281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni               jint index, jlong value, jint size) {
558263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni  // Size is signed with -1 indicating the value is an Allocation
559281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  rsClosureSetArg((RsContext)con, (RsClosure)closureID, (uint32_t)index,
560263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni                  (uintptr_t)value, size);
561281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
562281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
563281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic void
564281c3252510bcf4120d17fa0125f369c2c78f162Yang NinClosureSetGlobal(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
565281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni                  jlong fieldID, jlong value, jint size) {
566263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni  // Size is signed with -1 indicating the value is an Allocation
567281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  rsClosureSetGlobal((RsContext)con, (RsClosure)closureID,
568263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni                     (RsScriptFieldID)fieldID, (int64_t)value, size);
569281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
570281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
571281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic long
57235be56cce821d86f69026398ff9433e2d173b02fYang NinScriptGroup2Create(JNIEnv *_env, jobject _this, jlong con, jstring name,
573ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni                    jstring cacheDir, jlongArray closureArray) {
57417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong ret = 0;
57517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
57635be56cce821d86f69026398ff9433e2d173b02fYang Ni  AutoJavaStringToUTF8 nameUTF(_env, name);
577ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni  AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
578ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni
579281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  jlong* jClosures = _env->GetLongArrayElements(closureArray, nullptr);
580281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  jsize numClosures = _env->GetArrayLength(closureArray);
581ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jClosures == nullptr) {
582ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: closures.");
583ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
584ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
58517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
58617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsClosure* closures;
58717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
5887b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni  if (numClosures > (jsize) RS_SCRIPT_GROUP_MAX_NUMBER_CLOSURES) {
58917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni    ALOGE("Too many closures in script group");
59017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni    goto exit;
59117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
59217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
59317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  closures = (RsClosure*)alloca(sizeof(RsClosure) * numClosures);
59417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (closures == nullptr) {
59517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
59617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
59717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
598281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  for (int i = 0; i < numClosures; i++) {
599281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni    closures[i] = (RsClosure)jClosures[i];
600281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  }
601281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
60217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  ret = (jlong)(uintptr_t)rsScriptGroup2Create(
60335be56cce821d86f69026398ff9433e2d173b02fYang Ni      (RsContext)con, nameUTF.c_str(), nameUTF.length(),
60435be56cce821d86f69026398ff9433e2d173b02fYang Ni      cacheDirUTF.c_str(), cacheDirUTF.length(),
605ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni      closures, numClosures);
60617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
60717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Niexit:
60817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
60917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(closureArray, jClosures, JNI_ABORT);
61017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
61117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  return ret;
612281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
613281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
614281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic void
615281c3252510bcf4120d17fa0125f369c2c78f162Yang NinScriptGroup2Execute(JNIEnv *_env, jobject _this, jlong con, jlong groupID) {
616281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  rsScriptGroupExecute((RsContext)con, (RsScriptGroup2)groupID);
617281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
618281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
61996ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Samsstatic void
62025207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Single(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
62125207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
62225207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jfloat alpha, jlong A, jlong B, jfloat beta, jlong C, jint incX, jint incY,
62325207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint KL, jint KU) {
62425207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
62525207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
62625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
62725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
62825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
62925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
63025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
63125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
63225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
63325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
63425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
63525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.f = alpha;
63625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.f = beta;
63725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
63825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
63925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
64025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
64125207df658d6a8a3e885c7017fcc25702363583cTim Murray
64225207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
64325207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
64425207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
64525207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
64625207df658d6a8a3e885c7017fcc25702363583cTim Murray
64725207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
648b742fcc808165fbeeb1a48761e7d629f60207de2Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
64925207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
65025207df658d6a8a3e885c7017fcc25702363583cTim Murray}
65125207df658d6a8a3e885c7017fcc25702363583cTim Murray
65225207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
65325207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Double(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
65425207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
65525207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jdouble alpha, jlong A, jlong B, jdouble beta, jlong C, jint incX, jint incY,
65625207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint KL, jint KU) {
65725207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
65825207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
65925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
66025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
66125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
66225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
66325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
66425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
66525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
66625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
66725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
66825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.d = alpha;
66925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.d = beta;
67025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
67125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
67225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
67325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
67425207df658d6a8a3e885c7017fcc25702363583cTim Murray
67525207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
67625207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
67725207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
67825207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
67925207df658d6a8a3e885c7017fcc25702363583cTim Murray
68025207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
6810b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
68225207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
68325207df658d6a8a3e885c7017fcc25702363583cTim Murray}
68425207df658d6a8a3e885c7017fcc25702363583cTim Murray
68525207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
68625207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Complex(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
68725207df658d6a8a3e885c7017fcc25702363583cTim Murray                             jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
68825207df658d6a8a3e885c7017fcc25702363583cTim Murray                             jfloat alphaX, jfloat alphaY, jlong A, jlong B, jfloat betaX,
68925207df658d6a8a3e885c7017fcc25702363583cTim Murray                             jfloat betaY, jlong C, jint incX, jint incY, jint KL, jint KU) {
69025207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
69125207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
69225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
69325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
69425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
69525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
69625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
69725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
69825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
69925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
70025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
70125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.c.r = alphaX;
70225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.c.i = alphaY;
70325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.c.r = betaX;
70482585b3906955e57e199d962b8fe11b2bab87fbaMiao Wang    call.beta.c.i = betaY;
70525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
70625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
70725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
70825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
70925207df658d6a8a3e885c7017fcc25702363583cTim Murray
71025207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
71125207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
71225207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
71325207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
71425207df658d6a8a3e885c7017fcc25702363583cTim Murray
71525207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7160b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
71725207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
71825207df658d6a8a3e885c7017fcc25702363583cTim Murray}
71925207df658d6a8a3e885c7017fcc25702363583cTim Murray
72025207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
72125207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Z(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
72225207df658d6a8a3e885c7017fcc25702363583cTim Murray                       jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
72325207df658d6a8a3e885c7017fcc25702363583cTim Murray                       jdouble alphaX, jdouble alphaY, jlong A, jlong B, jdouble betaX,
72425207df658d6a8a3e885c7017fcc25702363583cTim Murray                       jdouble betaY, jlong C, jint incX, jint incY, jint KL, jint KU) {
72525207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
72625207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
72725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
72825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
72925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
73025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
73125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
73225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
73325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
73425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
73525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
73625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.z.r = alphaX;
73725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.z.i = alphaY;
73825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.z.r = betaX;
73982585b3906955e57e199d962b8fe11b2bab87fbaMiao Wang    call.beta.z.i = betaY;
74025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
74125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
74225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
74325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
74425207df658d6a8a3e885c7017fcc25702363583cTim Murray
74525207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
74625207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
74725207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
74825207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
74925207df658d6a8a3e885c7017fcc25702363583cTim Murray
75025207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7510b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
75225207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
75325207df658d6a8a3e885c7017fcc25702363583cTim Murray}
75425207df658d6a8a3e885c7017fcc25702363583cTim Murray
75525207df658d6a8a3e885c7017fcc25702363583cTim Murray
75625207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
7579cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim MurraynScriptIntrinsicBLAS_BNNM(JNIEnv *_env, jobject _this, jlong con, jlong id, jint M, jint N, jint K,
7589cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray                                             jlong A, jint a_offset, jlong B, jint b_offset, jlong C, jint c_offset,
7599cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray                                             jint c_mult_int) {
7609cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    RsBlasCall call;
7619cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    memset(&call, 0, sizeof(call));
7629cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.func = RsBlas_bnnm;
7639cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.M = M;
7649cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.N = N;
7659cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.K = K;
7662514806817ec394d334595d76e20f3129117da6eMiao Wang    call.a_offset = a_offset & 0xFF;
7672514806817ec394d334595d76e20f3129117da6eMiao Wang    call.b_offset = b_offset & 0xFF;
7689cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.c_offset = c_offset;
7699cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.c_mult_int = c_mult_int;
7709cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7719cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    RsAllocation in_allocs[3];
7729cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    in_allocs[0] = (RsAllocation)A;
7739cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    in_allocs[1] = (RsAllocation)B;
7749cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    in_allocs[2] = (RsAllocation)C;
7759cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7769cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7770b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
7789cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray                         &call, sizeof(call), nullptr, 0);
7799cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray}
7809cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7819cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7829cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murraystatic void
783460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAssignName(JNIEnv *_env, jobject _this, jlong con, jlong obj, jbyteArray str)
7843eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams{
78567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
78667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAssignName, con(%p), obj(%p)", (RsContext)con, (void *)obj);
78767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
7883eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    jint len = _env->GetArrayLength(str);
7893eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    jbyte * cptr = (jbyte *) _env->GetPrimitiveArrayCritical(str, 0);
790ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (cptr == nullptr) {
791ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
792ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
793ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
794ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
795eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAssignName((RsContext)con, (void *)obj, (const char *)cptr, len);
7963eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    _env->ReleasePrimitiveArrayCritical(str, cptr, JNI_ABORT);
7973eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams}
7983eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams
799fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchoukstatic jstring
800460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynGetName(JNIEnv *_env, jobject _this, jlong con, jlong obj)
801fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk{
80267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
80367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nGetName, con(%p), obj(%p)", (RsContext)con, (void *)obj);
80467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
805488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    const char *name = nullptr;
806eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaGetName((RsContext)con, (void *)obj, &name);
807488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if(name == nullptr || strlen(name) == 0) {
808488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        return nullptr;
809581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk    }
810fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk    return _env->NewStringUTF(name);
811fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk}
812fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk
8137ce033d797e5df5e2131e2ed459fba181eaf4658Jason Samsstatic void
814460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj)
8157ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams{
81667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
81767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj);
81867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
819eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsObjDestroy((RsContext)con, (void *)obj);
8207ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams}
8217ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams
8223eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams// ---------------------------------------------------------------------------
8233eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams
824eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic jlong
825d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsnDeviceCreate(JNIEnv *_env, jobject _this)
826d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
82767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
82867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nDeviceCreate");
82967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
8303aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsDeviceCreate();
831d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
832d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
833d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
8345eaf468434e96bc7c8d4cfeb138699a1c7b256caTim MurraynDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev)
835d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
83667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
83767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nDeviceDestroy");
83867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
839d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return rsDeviceDestroy((RsDevice)dev);
840d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
841d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
842ebfb436a49673693b98469683451bd9ede797557Jason Samsstatic void
8435eaf468434e96bc7c8d4cfeb138699a1c7b256caTim MurraynDeviceSetConfig(JNIEnv *_env, jobject _this, jlong dev, jint p, jint value)
844ebfb436a49673693b98469683451bd9ede797557Jason Sams{
84567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
84667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nDeviceSetConfig  dev(%p), param(%i), value(%i)", (void *)dev, p, value);
84767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
848ebfb436a49673693b98469683451bd9ede797557Jason Sams    return rsDeviceSetConfig((RsDevice)dev, (RsDeviceParam)p, value);
849ebfb436a49673693b98469683451bd9ede797557Jason Sams}
850ebfb436a49673693b98469683451bd9ede797557Jason Sams
851eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic jlong
85281cd2b18bd36285d1843f78418282e1dad156fbdJason SamsnContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint flags, jint sdkVer, jint contextType)
853d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
85467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
85567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextCreate");
85667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
85781cd2b18bd36285d1843f78418282e1dad156fbdJason Sams    return (jlong)(uintptr_t)rsContextCreate((RsDevice)dev, 0, sdkVer, (RsContextType)contextType, flags);
858704ff64b099406bb328898a7443921f22dbffd6dJason Sams}
859704ff64b099406bb328898a7443921f22dbffd6dJason Sams
860eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic jlong
8615eaf468434e96bc7c8d4cfeb138699a1c7b256caTim MurraynContextCreateGL(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer,
8620e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint colorMin, jint colorPref,
8630e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint alphaMin, jint alphaPref,
8640e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint depthMin, jint depthPref,
8650e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint stencilMin, jint stencilPref,
8660e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint samplesMin, jint samplesPref, jfloat samplesQ,
8670e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint dpi)
86811c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams{
86986c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni    RsSurfaceConfig sc = {};
87011c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.alphaMin = alphaMin;
87111c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.alphaPref = alphaPref;
87211c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.colorMin = colorMin;
87311c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.colorPref = colorPref;
87411c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.depthMin = depthMin;
87511c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.depthPref = depthPref;
87611c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.samplesMin = samplesMin;
87711c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.samplesPref = samplesPref;
87811c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.samplesQ = samplesQ;
87911c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams
88067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
88167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextCreateGL");
88267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
8833aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsContextCreateGL((RsDevice)dev, ver, sdkVer, sc, dpi);
884d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
885d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
886d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
887eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextSetPriority(JNIEnv *_env, jobject _this, jlong con, jint p)
8887d787b4722eaeb79cab42c36060336e092b77b5fJason Sams{
88967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
89067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("ContextSetPriority, con(%p), priority(%i)", (RsContext)con, p);
89167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
892eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextSetPriority((RsContext)con, p);
8937d787b4722eaeb79cab42c36060336e092b77b5fJason Sams}
8947d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
89547f31582b67f492d9e1523abd0d8b86c38ec007dTim Murraystatic void
89647f31582b67f492d9e1523abd0d8b86c38ec007dTim MurraynContextSetCacheDir(JNIEnv *_env, jobject _this, jlong con, jstring cacheDir)
89747f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray{
89847f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
89947f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray
90047f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    if (kLogApi) {
90147f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray        ALOGD("ContextSetCacheDir, con(%p), cacheDir(%s)", (RsContext)con, cacheDirUTF.c_str());
90247f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    }
90347f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    rsContextSetCacheDir((RsContext)con, cacheDirUTF.c_str(), cacheDirUTF.length());
90447f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray}
90547f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray
9067d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
9077d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
9087d787b4722eaeb79cab42c36060336e092b77b5fJason Samsstatic void
909eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextSetSurface(JNIEnv *_env, jobject _this, jlong con, jint width, jint height, jobject wnd)
910efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams{
91167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
91267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextSetSurface, con(%p), width(%i), height(%i), surface(%p)", (RsContext)con,
91367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              width, height, (Surface *)wnd);
91467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
915efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
916488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    ANativeWindow * window = nullptr;
917488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (wnd == nullptr) {
918efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
919efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams    } else {
92064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        window = android_view_Surface_getNativeWindow(_env, wnd).get();
921efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams    }
922efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
923eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextSetSurface((RsContext)con, width, height, window);
924efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams}
925efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
926efd9b6fb2e0f31b50db089352118e5daeb268879Jason Samsstatic void
927eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextDestroy(JNIEnv *_env, jobject _this, jlong con)
928d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
92967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
93067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextDestroy, con(%p)", (RsContext)con);
93167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
932eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextDestroy((RsContext)con);
933d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
934d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
935715333b832fb448c32165c7d97d408a3fa43f7cbJason Samsstatic void
936eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextDump(JNIEnv *_env, jobject _this, jlong con, jint bits)
937715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams{
93867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
93967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextDump, con(%p)  bits(%i)", (RsContext)con, bits);
94067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
941715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams    rsContextDump((RsContext)con, bits);
942715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams}
943d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
944d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
945eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextPause(JNIEnv *_env, jobject _this, jlong con)
94665e7aa56f56097418d617663683544c25b3988eaJason Sams{
94767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
94867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextPause, con(%p)", (RsContext)con);
94967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
950eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextPause((RsContext)con);
95165e7aa56f56097418d617663683544c25b3988eaJason Sams}
95265e7aa56f56097418d617663683544c25b3988eaJason Sams
95365e7aa56f56097418d617663683544c25b3988eaJason Samsstatic void
954eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextResume(JNIEnv *_env, jobject _this, jlong con)
95565e7aa56f56097418d617663683544c25b3988eaJason Sams{
95667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
95767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextResume, con(%p)", (RsContext)con);
95867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
959eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextResume((RsContext)con);
96065e7aa56f56097418d617663683544c25b3988eaJason Sams}
96165e7aa56f56097418d617663683544c25b3988eaJason Sams
9621c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
9631c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Samsstatic jstring
964eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextGetErrorMessage(JNIEnv *_env, jobject _this, jlong con)
9651c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams{
96667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
96767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextGetErrorMessage, con(%p)", (RsContext)con);
96867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
9691c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    char buf[1024];
9701c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
9711c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    size_t receiveLen;
9721c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    uint32_t subID;
973eff663f391fa4f119685d5c14489b94661ea126fTim Murray    int id = rsContextGetMessage((RsContext)con,
97465bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 buf, sizeof(buf),
97565bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 &receiveLen, sizeof(receiveLen),
976edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                                 &subID, sizeof(subID));
9771c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    if (!id && receiveLen) {
97809993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGV("message receive buffer too small.  %zu", receiveLen);
9791c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    }
9801c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    return _env->NewStringUTF(buf);
9811c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams}
9821c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
983edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Samsstatic jint
984eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextGetUserMessage(JNIEnv *_env, jobject _this, jlong con, jintArray data)
985516c31911578db8ce53529483c3ded918ac7dc6bJason Sams{
986516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    jint len = _env->GetArrayLength(data);
98767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
98867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextGetMessage, con(%p), len(%i)", (RsContext)con, len);
98967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
990488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *ptr = _env->GetIntArrayElements(data, nullptr);
991ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
992ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
993ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
994ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
995516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    size_t receiveLen;
9961c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    uint32_t subID;
997eff663f391fa4f119685d5c14489b94661ea126fTim Murray    int id = rsContextGetMessage((RsContext)con,
99865bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 ptr, len * 4,
99965bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 &receiveLen, sizeof(receiveLen),
1000edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                                 &subID, sizeof(subID));
1001516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    if (!id && receiveLen) {
100209993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGV("message receive buffer too small.  %zu", receiveLen);
1003516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    }
1004516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    _env->ReleaseIntArrayElements(data, ptr, 0);
10050e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    return (jint)id;
10061c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams}
10071c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
10081c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Samsstatic jint
1009eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextPeekMessage(JNIEnv *_env, jobject _this, jlong con, jintArray auxData)
10101c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams{
101167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
101267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextPeekMessage, con(%p)", (RsContext)con);
101367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1014488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *auxDataPtr = _env->GetIntArrayElements(auxData, nullptr);
1015ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (auxDataPtr == nullptr) {
1016ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1017ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
1018ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
10191c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    size_t receiveLen;
10201c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    uint32_t subID;
1021eff663f391fa4f119685d5c14489b94661ea126fTim Murray    int id = rsContextPeekMessage((RsContext)con, &receiveLen, sizeof(receiveLen),
1022edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                                  &subID, sizeof(subID));
10231c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    auxDataPtr[0] = (jint)subID;
10241c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    auxDataPtr[1] = (jint)receiveLen;
10251c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    _env->ReleaseIntArrayElements(auxData, auxDataPtr, 0);
10260e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    return (jint)id;
1027516c31911578db8ce53529483c3ded918ac7dc6bJason Sams}
1028516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1029eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic void nContextInitToClient(JNIEnv *_env, jobject _this, jlong con)
1030516c31911578db8ce53529483c3ded918ac7dc6bJason Sams{
103167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
103267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextInitToClient, con(%p)", (RsContext)con);
103367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1034eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextInitToClient((RsContext)con);
1035516c31911578db8ce53529483c3ded918ac7dc6bJason Sams}
1036516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1037eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic void nContextDeinitToClient(JNIEnv *_env, jobject _this, jlong con)
1038516c31911578db8ce53529483c3ded918ac7dc6bJason Sams{
103967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
104067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextDeinitToClient, con(%p)", (RsContext)con);
104167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1042eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextDeinitToClient((RsContext)con);
1043516c31911578db8ce53529483c3ded918ac7dc6bJason Sams}
1044516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1045455d64426615e5d269a3bd05cd91b67c3811fcdfJason Samsstatic void
1046eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextSendMessage(JNIEnv *_env, jobject _this, jlong con, jint id, jintArray data)
1047455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams{
1048488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *ptr = nullptr;
1049455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    jint len = 0;
1050455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    if (data) {
1051455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams        len = _env->GetArrayLength(data);
10524a043c1853c117c1b4c4342e76cd16a5abdc1045Stephen Hines        ptr = _env->GetIntArrayElements(data, nullptr);
1053ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {
1054ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
1055ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
1056ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
1057455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    }
105867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
105967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextSendMessage, con(%p), id(%i), len(%i)", (RsContext)con, id, len);
106067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1061eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextSendMessage((RsContext)con, id, (const uint8_t *)ptr, len * sizeof(int));
1062455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    if (data) {
1063455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams        _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
1064455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    }
1065455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams}
1066455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams
1067455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams
1068516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1069460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
107067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind, jboolean norm,
107167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe               jint size)
1072d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
107367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
107409993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nElementCreate, con(%p), type(%" PRId64 "), kind(%i), norm(%i), size(%i)", (RsContext)con,
107567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              type, kind, norm, size);
107667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
107767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    return (jlong)(uintptr_t)rsElementCreate((RsContext)con, (RsDataType)type, (RsDataKind)kind,
10788c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                             norm, size);
1079d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1080d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1081460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1082eff663f391fa4f119685d5c14489b94661ea126fTim MurraynElementCreate2(JNIEnv *_env, jobject _this, jlong con,
10839807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                jlongArray _ids, jobjectArray _names, jintArray _arraySizes)
1084d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
1085718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    int fieldCount = _env->GetArrayLength(_ids);
108667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
108767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nElementCreate2, con(%p)", (RsContext)con);
108867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1089718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
1090488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jIds = _env->GetLongArrayElements(_ids, nullptr);
1091ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jIds == nullptr) {
1092ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: ids");
1093ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
1094ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1095488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *jArraySizes = _env->GetIntArrayElements(_arraySizes, nullptr);
1096ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jArraySizes == nullptr) {
1097ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: arraySizes");
1098ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
1099ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
11009807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
11019807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    RsElement *ids = (RsElement*)malloc(fieldCount * sizeof(RsElement));
11029807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uint32_t *arraySizes = (uint32_t *)malloc(fieldCount * sizeof(uint32_t));
11039807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
11049807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < fieldCount; i ++) {
11059807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        ids[i] = (RsElement)jIds[i];
11069807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        arraySizes[i] = (uint32_t)jArraySizes[i];
11079807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
1108718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
11092123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8 names(_env, _names, fieldCount);
11102123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
11112123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char **nameArray = names.c_str();
11122123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t *sizeArray = names.c_str_len();
11132123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
11143aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsElementCreate2((RsContext)con,
11159807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                                     (const RsElement *)ids, fieldCount,
11167a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                                     nameArray, fieldCount * sizeof(size_t),  sizeArray,
11178c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                     (const uint32_t *)arraySizes, fieldCount);
11182123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
11199807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(ids);
11209807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(arraySizes);
11219807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(_ids, jIds, JNI_ABORT);
11229807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseIntArrayElements(_arraySizes, jArraySizes, JNI_ABORT);
11239807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
11243aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)id;
1125d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1126d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1127dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchoukstatic void
1128460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynElementGetNativeData(JNIEnv *_env, jobject _this, jlong con, jlong id, jintArray _elementData)
1129dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
1130dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    int dataSize = _env->GetArrayLength(_elementData);
113167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
113267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nElementGetNativeData, con(%p)", (RsContext)con);
113367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1134dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1135dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
1136dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    assert(dataSize == 5);
1137dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1138cbb0206cb478c862cb871a65e85115281ef12e02Miao Wang    uint32_t elementData[5];
1139eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaElementGetNativeData((RsContext)con, (RsElement)id, elementData, dataSize);
1140dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1141dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    for(jint i = 0; i < dataSize; i ++) {
11429807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        const jint data = (jint)elementData[i];
11439807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetIntArrayRegion(_elementData, i, 1, &data);
1144dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
1145dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1146dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1147dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1148dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchoukstatic void
1149460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynElementGetSubElements(JNIEnv *_env, jobject _this, jlong con, jlong id,
11509807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                       jlongArray _IDs,
11517d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                       jobjectArray _names,
11527d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                       jintArray _arraySizes)
1153dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
11549807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uint32_t dataSize = _env->GetArrayLength(_IDs);
115567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
115667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nElementGetSubElements, con(%p)", (RsContext)con);
115767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1158dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
11599807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t *ids = (uintptr_t*)malloc(dataSize * sizeof(uintptr_t));
11609807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    const char **names = (const char **)malloc(dataSize * sizeof(const char *));
1161cbb0206cb478c862cb871a65e85115281ef12e02Miao Wang    size_t *arraySizes = (size_t *)malloc(dataSize * sizeof(size_t));
1162dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
116367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    rsaElementGetSubElements((RsContext)con, (RsElement)id, ids, names, arraySizes,
116467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                             (uint32_t)dataSize);
1165dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
11669807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(uint32_t i = 0; i < dataSize; i++) {
11673aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong id = (jlong)(uintptr_t)ids[i];
11689807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        const jint arraySize = (jint)arraySizes[i];
1169dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        _env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i]));
11709807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_IDs, i, 1, &id);
11719807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetIntArrayRegion(_arraySizes, i, 1, &arraySize);
1172dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
1173dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1174dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    free(ids);
1175dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    free(names);
11767d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    free(arraySizes);
1177dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1178dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1179d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// -----------------------------------
1180d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1181460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1182460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid,
1183b109cc78616abee7291eb42094cd156b5db3355dJason Sams            jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv)
1184d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
118567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
118667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)",
118709993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer              (RsContext)con, (void*)eid, dimx, dimy, dimz, mips, faces, yuv);
118867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
11893b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams
119067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    return (jlong)(uintptr_t)rsTypeCreate((RsContext)con, (RsElement)eid, dimx, dimy, dimz, mips,
11918c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                          faces, yuv);
1192d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1193d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1194dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchoukstatic void
11959807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnTypeGetNativeData(JNIEnv *_env, jobject _this, jlong con, jlong id, jlongArray _typeData)
1196dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
1197dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    // We are packing 6 items: mDimX; mDimY; mDimZ;
1198dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    // mDimLOD; mDimFaces; mElement; into typeData
1199dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    int elementCount = _env->GetArrayLength(_typeData);
1200dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1201dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    assert(elementCount == 6);
120267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
120367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nTypeGetNativeData, con(%p)", (RsContext)con);
120467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1205dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
12069807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t typeData[6];
1207eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaTypeGetNativeData((RsContext)con, (RsType)id, typeData, 6);
1208dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1209dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    for(jint i = 0; i < elementCount; i ++) {
12103aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong data = (jlong)(uintptr_t)typeData[i];
12119807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_typeData, i, 1, &data);
1212dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
1213dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1214dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1215d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// -----------------------------------
1216d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1217460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
121867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mips, jint usage,
121967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                       jlong pointer)
1220d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
122167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
122267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)",
122367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsContext)con, (RsElement)type, mips, usage, (void *)pointer);
122467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
122567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    return (jlong)(uintptr_t) rsAllocationCreateTyped((RsContext)con, (RsType)type,
122667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                                      (RsAllocationMipmapControl)mips,
12278c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                                      (uint32_t)usage, (uintptr_t)pointer);
1228d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1229d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1230d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1231460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationSyncAll(JNIEnv *_env, jobject _this, jlong con, jlong a, jint bits)
12325476b450e50939940dcf3f15c92335cee2fc572dJason Sams{
123367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
123467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationSyncAll, con(%p), a(%p), bits(0x%08x)", (RsContext)con, (RsAllocation)a,
123567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              bits);
123667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1237eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationSyncAll((RsContext)con, (RsAllocation)a, (RsAllocationUsageType)bits);
12385476b450e50939940dcf3f15c92335cee2fc572dJason Sams}
12395476b450e50939940dcf3f15c92335cee2fc572dJason Sams
12408c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wangstatic void
12418c1509249c5552270d8accc2c9512f499a8f5e2dMiao WangnAllocationSetupBufferQueue(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint numAlloc)
12428c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{
12438c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    if (kLogApi) {
12448c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang        ALOGD("nAllocationSetupBufferQueue, con(%p), alloc(%p), numAlloc(%d)", (RsContext)con,
12458c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang              (RsAllocation)alloc, numAlloc);
12468c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    }
12478c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    rsAllocationSetupBufferQueue((RsContext)con, (RsAllocation)alloc, (uint32_t)numAlloc);
12488c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang}
12498c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang
12508c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wangstatic void
12518c1509249c5552270d8accc2c9512f499a8f5e2dMiao WangnAllocationShareBufferQueue(JNIEnv *_env, jobject _this, jlong con, jlong alloc1, jlong alloc2)
12528c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{
12538c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    if (kLogApi) {
12548c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang        ALOGD("nAllocationShareBufferQueue, con(%p), alloc1(%p), alloc2(%p)", (RsContext)con,
12558c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang              (RsAllocation)alloc1, (RsAllocation)alloc2);
12568c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    }
12578c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang
12588c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    rsAllocationShareBufferQueue((RsContext)con, (RsAllocation)alloc1, (RsAllocation)alloc2);
12598c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang}
12608c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang
126172226e0543461133b9e177a3e78ae50b0c65e797Jason Samsstatic jobject
1262460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationGetSurface(JNIEnv *_env, jobject _this, jlong con, jlong a)
1263615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams{
126467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
126567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationGetSurface, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
126667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1267615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams
12681e95fc86581514c718fc96367f6d575e87fecffbMiao Wang    ANativeWindow *anw = (ANativeWindow *)rsAllocationGetSurface((RsContext)con, (RsAllocation)a);
12691e95fc86581514c718fc96367f6d575e87fecffbMiao Wang
12701e95fc86581514c718fc96367f6d575e87fecffbMiao Wang    sp<Surface> surface(static_cast<Surface*>(anw));
12711e95fc86581514c718fc96367f6d575e87fecffbMiao Wang    sp<IGraphicBufferProducer> bp = surface->getIGraphicBufferProducer();
1272fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams
127372226e0543461133b9e177a3e78ae50b0c65e797Jason Sams    jobject o = android_view_Surface_createFromIGraphicBufferProducer(_env, bp);
127472226e0543461133b9e177a3e78ae50b0c65e797Jason Sams    return o;
1275fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams}
1276fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams
1277fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Samsstatic void
1278460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationSetSurface(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject sur)
1279163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams{
128067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
128167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationSetSurface, con(%p), alloc(%p), surface(%p)", (RsContext)con,
128267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsAllocation)alloc, (Surface *)sur);
128367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1284163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
128533287e8a893821be86b395ce9d5d639cc8a535f3Miao Wang    ANativeWindow *anw = nullptr;
1286163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams    if (sur != 0) {
1287f35ddc9843af8979944a41237e3ad72248894c26Miao Wang        // Connect the native window handle to buffer queue.
128833287e8a893821be86b395ce9d5d639cc8a535f3Miao Wang        anw = ANativeWindow_fromSurface(_env, sur);
1289f35ddc9843af8979944a41237e3ad72248894c26Miao Wang        native_window_api_connect(anw, NATIVE_WINDOW_API_CPU);
1290163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams    }
1291163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
129233287e8a893821be86b395ce9d5d639cc8a535f3Miao Wang    rsAllocationSetSurface((RsContext)con, (RsAllocation)alloc, anw);
1293163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams}
1294163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
1295163766cbe798baf8e86eb8201bc6c3def931d59aJason Samsstatic void
1296460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationIoSend(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1297163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams{
129867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
129909993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nAllocationIoSend, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
130067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1301460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray    rsAllocationIoSend((RsContext)con, (RsAllocation)alloc);
1302163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams}
1303163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
13048c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wangstatic jlong
1305460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationIoReceive(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1306163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams{
130767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
130809993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nAllocationIoReceive, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
130967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
13108c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    return (jlong) rsAllocationIoReceive((RsContext)con, (RsAllocation)alloc);
1311163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams}
1312163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
1313163766cbe798baf8e86eb8201bc6c3def931d59aJason Samsstatic void
1314460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1315f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams{
131667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
131767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationGenerateMipmaps, con(%p), a(%p)", (RsContext)con, (RsAllocation)alloc);
131867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1319eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationGenerateMipmaps((RsContext)con, (RsAllocation)alloc);
1320f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams}
1321f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams
1322460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
132367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,
132467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                            jobject jbitmap, jint usage)
1325fe08d99725efd0dde7ba67ff1979a04fec2ba99fJason Sams{
1326ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1327ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
1328fe08d99725efd0dde7ba67ff1979a04fec2ba99fJason Sams
13295476b450e50939940dcf3f15c92335cee2fc572dJason Sams    const void* ptr = bitmap.getPixels();
13303aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsAllocationCreateFromBitmap((RsContext)con,
133165bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                                  (RsType)type, (RsAllocationMipmapControl)mip,
13327569de0f90959b7eb9b432cc349425ab6d27f6ccMike Reed                                                  ptr, bitmap.computeByteSize(), usage);
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    const void* ptr = bitmap.getPixels();
13443aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsAllocationCreateTyped((RsContext)con,
1345a314551d69098537337c970da615a8f8af58e1f1Tim Murray                                            (RsType)type, (RsAllocationMipmapControl)mip,
13468c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                            (uint32_t)usage, (uintptr_t)ptr);
1347a314551d69098537337c970da615a8f8af58e1f1Tim Murray    return id;
1348a314551d69098537337c970da615a8f8af58e1f1Tim Murray}
1349a314551d69098537337c970da615a8f8af58e1f1Tim Murray
1350460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
135167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,
135267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                jobject jbitmap, jint usage)
135367f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk{
1354ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1355ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
135667f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk
13575476b450e50939940dcf3f15c92335cee2fc572dJason Sams    const void* ptr = bitmap.getPixels();
13583aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsAllocationCubeCreateFromBitmap((RsContext)con,
135965bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                                      (RsType)type, (RsAllocationMipmapControl)mip,
13607569de0f90959b7eb9b432cc349425ab6d27f6ccMike Reed                                                      ptr, bitmap.computeByteSize(), usage);
13615476b450e50939940dcf3f15c92335cee2fc572dJason Sams    return id;
136267f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk}
136367f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk
136426ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchoukstatic void
1365460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
136626ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk{
1367ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1368ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
1369f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams    int w = bitmap.width();
1370f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams    int h = bitmap.height();
137126ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk
13724ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    const void* ptr = bitmap.getPixels();
1373eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocation2DData((RsContext)con, (RsAllocation)alloc, 0, 0,
1374304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                       0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X,
13757569de0f90959b7eb9b432cc349425ab6d27f6ccMike Reed                       w, h, ptr, bitmap.computeByteSize(), 0);
13768a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams}
13778a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
13784ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Samsstatic void
1379460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationCopyToBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
13808a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams{
1381ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1382ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
13838a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
13844ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    void* ptr = bitmap.getPixels();
13857569de0f90959b7eb9b432cc349425ab6d27f6ccMike Reed    rsAllocationCopyToBitmap((RsContext)con, (RsAllocation)alloc, ptr, bitmap.computeByteSize());
1386835b8544cc333ef87e42b1d71cf8ad3cddccdc19Alex Sakhartchouk    bitmap.notifyPixelsChanged();
13878a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams}
13888a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
1389414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Java object data into the Allocation pointed to by _alloc.
1390d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1391460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
139287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint count, jobject data, jint sizeBytes, jint dataType, jint mSize,
139387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jboolean usePadding)
1394d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
1395e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
139667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
139767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation1DData, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
139867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "dataType(%i)", (RsContext)con, (RsAllocation)alloc, offset, count, sizeBytes,
139967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              dataType);
140067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
140187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation1DData, true,
140287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
1403d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1404d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1405d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1406c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao WangnAllocationElementData(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
1407c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                       jint xoff, jint yoff, jint zoff,
1408c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                       jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
140949bdaf0293408159df18a1d8540360f9623c40f7Jason Sams{
141067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
141186c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni        jint len = _env->GetArrayLength(data);
1412c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang        ALOGD("nAllocationElementData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
1413c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang              "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
141467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              sizeBytes);
141567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1416488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1417ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1418ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1419ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1420ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1421c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    rsAllocationElementData((RsContext)con, (RsAllocation)alloc,
1422c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                            xoff, yoff, zoff,
1423c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                            lod, ptr, sizeBytes, compIdx);
142449bdaf0293408159df18a1d8540360f9623c40f7Jason Sams    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
142549bdaf0293408159df18a1d8540360f9623c40f7Jason Sams}
142649bdaf0293408159df18a1d8540360f9623c40f7Jason Sams
1427c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang
1428414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Java object data into the Allocation pointed to by _alloc.
142949bdaf0293408159df18a1d8540360f9623c40f7Jason Samsstatic void
1430460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
143187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType, jint mSize,
143287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jboolean usePadding)
1433d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
1434e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
1435e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
143667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
143767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation2DData, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
143867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
143967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
144087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h;
144187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation2DData, true,
144287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
1443d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1444d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1445414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by srcAlloc into the Allocation
1446414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// pointed to by dstAlloc.
144740a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Samsstatic void
1448eff663f391fa4f119685d5c14489b94661ea126fTim MurraynAllocationData2D_alloc(JNIEnv *_env, jobject _this, jlong con,
1449460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong dstAlloc, jint dstXoff, jint dstYoff,
1450304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                        jint dstMip, jint dstFace,
1451304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                        jint width, jint height,
1452460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong srcAlloc, jint srcXoff, jint srcYoff,
1453304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                        jint srcMip, jint srcFace)
1454304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk{
145567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
145667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation2DData_s, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
145767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " dstMip(%i), dstFace(%i), width(%i), height(%i),"
145867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i), srcFace(%i)",
145967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
146067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
146167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1462304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk
1463eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationCopy2DRange((RsContext)con,
1464304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            (RsAllocation)dstAlloc,
1465304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            dstXoff, dstYoff,
1466304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            dstMip, dstFace,
1467304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            width, height,
1468304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            (RsAllocation)srcAlloc,
1469304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            srcXoff, srcYoff,
1470304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            srcMip, srcFace);
1471304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk}
1472304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk
1473414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Java object data into the Allocation pointed to by _alloc.
1474304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchoukstatic void
1475460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
147687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jint d, jobject data, jint sizeBytes, jint dataType,
147787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
1478b05d689653b1bc94836f716f29e9578677c29075Jason Sams{
1479e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
148067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
148167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation3DData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
148267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
148367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              lod, w, h, d, sizeBytes);
148467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
148587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h * d;
148687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation3DData, true,
148787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
1488b05d689653b1bc94836f716f29e9578677c29075Jason Sams}
1489b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1490414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by srcAlloc into the Allocation
1491414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// pointed to by dstAlloc.
1492b05d689653b1bc94836f716f29e9578677c29075Jason Samsstatic void
1493eff663f391fa4f119685d5c14489b94661ea126fTim MurraynAllocationData3D_alloc(JNIEnv *_env, jobject _this, jlong con,
1494460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong dstAlloc, jint dstXoff, jint dstYoff, jint dstZoff,
1495b05d689653b1bc94836f716f29e9578677c29075Jason Sams                        jint dstMip,
1496b05d689653b1bc94836f716f29e9578677c29075Jason Sams                        jint width, jint height, jint depth,
1497460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong srcAlloc, jint srcXoff, jint srcYoff, jint srcZoff,
1498b05d689653b1bc94836f716f29e9578677c29075Jason Sams                        jint srcMip)
1499b05d689653b1bc94836f716f29e9578677c29075Jason Sams{
150067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
150167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationData3D_alloc, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
150267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " dstMip(%i), width(%i), height(%i),"
150367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i)",
150467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip,
150567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip);
150667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1507b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1508eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationCopy3DRange((RsContext)con,
1509b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            (RsAllocation)dstAlloc,
1510b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            dstXoff, dstYoff, dstZoff, dstMip,
1511b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            width, height, depth,
1512b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            (RsAllocation)srcAlloc,
1513b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            srcXoff, srcYoff, srcZoff, srcMip);
1514b05d689653b1bc94836f716f29e9578677c29075Jason Sams}
1515b05d689653b1bc94836f716f29e9578677c29075Jason Sams
151640a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams
1517414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by _alloc into the Java object data.
151840a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Samsstatic void
151987e908dfdece91b5f504386d4901fa3342dc8083Miao WangnAllocationRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jobject data, jint dataType,
152087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                jint mSize, jboolean usePadding)
1521fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams{
152221659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
152367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
152467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationRead, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
152567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
152687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = 0;
152787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(0, rsAllocationRead, false,
152887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, ptr, len * typeBytes);
1529fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams}
1530fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams
1531414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by _alloc into the Java object data.
1532fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Samsstatic void
1533460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationRead1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
153487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint count, jobject data, jint sizeBytes, jint dataType,
153587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
1536fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams{
153721659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
153867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
153967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation1DRead, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
154067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "dataType(%i)", (RsContext)con, alloc, offset, count, sizeBytes, dataType);
154167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
154287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(0, rsAllocation1DRead, false,
154387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
1544fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams}
1545fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams
1546c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang// Copies from the Element in the Allocation pointed to by _alloc into the Java array data.
1547c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wangstatic void
154845cec0a9711f736df26fd097c6d74834e350f9bcMiao WangnAllocationElementRead(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
1549c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                       jint xoff, jint yoff, jint zoff,
155045cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang                       jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
1551c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang{
1552c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    if (kLogApi) {
155386c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni        jint len = _env->GetArrayLength(data);
155445cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang        ALOGD("nAllocationElementRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
155545cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang              "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
155645cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang              sizeBytes);
1557c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    }
155845cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1559ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1560ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1561ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1562ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
156345cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang    rsAllocationElementRead((RsContext)con, (RsAllocation)alloc,
156445cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang                            xoff, yoff, zoff,
1565a7e2509d8da69ab1c9e14b4ce6608786c572209aJason Sams                            lod, ptr, sizeBytes, compIdx);
1566bfa5e659e7b4cb49178d0e99712478b29f8301a7Miao Wang    _env->ReleaseByteArrayElements(data, ptr, 0);
1567c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang}
1568c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang
1569414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by _alloc into the Java object data.
1570fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Samsstatic void
1571460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
157287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType,
157387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
157440a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams{
157521659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
157621659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
157767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
157867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation2DRead, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
157967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
158067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
158187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h;
158287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(0, rsAllocation2DRead, false,
158387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
158440a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams}
158587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang
1586c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1587c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wangstatic void
1588c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao WangnAllocationRead3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
158987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jint d, jobject data, int sizeBytes, int dataType,
159087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
1591c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang{
1592c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
1593c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    if (kLogApi) {
1594c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang        ALOGD("nAllocation3DRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
1595c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang              " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
1596c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang              lod, w, h, d, sizeBytes);
1597c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    }
159887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h * d;
159987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation3DRead, false,
160087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
1601c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang}
1602d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1603460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1604460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationGetType(JNIEnv *_env, jobject _this, jlong con, jlong a)
1605dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
160667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
160767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationGetType, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
160867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
16093aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t) rsaAllocationGetType((RsContext)con, (RsAllocation)a);
1610dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1611dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
16125edc608a0749ed4b7074b5c1243043eb722c3c31Jason Samsstatic void
1613460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationResize1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint dimX)
16145edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams{
161567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
161667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", (RsContext)con,
161767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsAllocation)alloc, dimX);
161867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1619eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationResize1D((RsContext)con, (RsAllocation)alloc, dimX);
16205edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams}
16215edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams
162246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
162346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Samsstatic jlong
162446ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason SamsnAllocationAdapterCreate(JNIEnv *_env, jobject _this, jlong con, jlong basealloc, jlong type)
162546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{
162646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    if (kLogApi) {
162746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        ALOGD("nAllocationAdapterCreate, con(%p), base(%p), type(%p)",
162846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams              (RsContext)con, (RsAllocation)basealloc, (RsElement)type);
162946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    }
163046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    return (jlong)(uintptr_t) rsAllocationAdapterCreate((RsContext)con, (RsType)type,
163146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                                                        (RsAllocation)basealloc);
163246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
163346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams}
163446ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
163546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Samsstatic void
163646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason SamsnAllocationAdapterOffset(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
163746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                        jint x, jint y, jint z, jint face, jint lod,
163846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                        jint a1, jint a2, jint a3, jint a4)
163946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{
164046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    uint32_t params[] = {
164146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        (uint32_t)x, (uint32_t)y, (uint32_t)z, (uint32_t)face,
164246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        (uint32_t)lod, (uint32_t)a1, (uint32_t)a2, (uint32_t)a3, (uint32_t)a4
164346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    };
164446ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    if (kLogApi) {
164546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        ALOGD("nAllocationAdapterOffset, con(%p), alloc(%p), x(%i), y(%i), z(%i), face(%i), lod(%i), arrays(%i %i %i %i)",
164646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams              (RsContext)con, (RsAllocation)alloc, x, y, z, face, lod, a1, a2, a3, a4);
164746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    }
164846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    rsAllocationAdapterOffset((RsContext)con, (RsAllocation)alloc,
164946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                              params, sizeof(params));
165046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams}
165146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
165246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
1653aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk// -----------------------------------
1654aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1655460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1656460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DCreateFromAssetStream(JNIEnv *_env, jobject _this, jlong con, jlong native_asset)
1657aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
1658aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    Asset* asset = reinterpret_cast<Asset*>(native_asset);
16590e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    ALOGV("______nFileA3D %p", asset);
1660aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
16613aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromMemory((RsContext)con, asset->getBuffer(false), asset->getLength());
1662b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1663b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1664b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1665460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1666eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFileA3DCreateFromAsset(JNIEnv *_env, jobject _this, jlong con, jobject _assetMgr, jstring _path)
1667b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1668bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski    Guarded<AssetManager2>* mgr = AssetManagerForJavaObject(_env, _assetMgr);
1669488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (mgr == nullptr) {
1670b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return 0;
1671b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
1672b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1673b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 str(_env, _path);
1674bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski    std::unique_ptr<Asset> asset;
1675bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski    {
1676bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski        ScopedLock<AssetManager2> locked_mgr(*mgr);
1677bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski        asset = locked_mgr->Open(str.c_str(), Asset::ACCESS_BUFFER);
1678bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski        if (asset == nullptr) {
1679bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski            return 0;
1680bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski        }
1681b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
1682b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1683bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski    jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromAsset((RsContext)con, asset.release());
1684b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1685b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1686b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1687460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1688eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFileA3DCreateFromFile(JNIEnv *_env, jobject _this, jlong con, jstring fileName)
1689b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1690b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
16913aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromFile((RsContext)con, fileNameUTF.c_str());
1692b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1693aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    return id;
1694aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1695aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1696460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jint
1697460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DGetNumIndexEntries(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D)
1698aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
1699aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    int32_t numEntries = 0;
1700eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaFileA3DGetNumIndexEntries((RsContext)con, &numEntries, (RsFile)fileA3D);
17010e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    return (jint)numEntries;
1702aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1703aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1704aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchoukstatic void
1705460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DGetIndexEntries(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D, jint numEntries, jintArray _ids, jobjectArray _entries)
1706aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
17070e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    ALOGV("______nFileA3D %p", (RsFile) fileA3D);
1708aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    RsFileIndexEntry *fileEntries = (RsFileIndexEntry*)malloc((uint32_t)numEntries * sizeof(RsFileIndexEntry));
1709aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1710eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaFileA3DGetIndexEntries((RsContext)con, fileEntries, (uint32_t)numEntries, (RsFile)fileA3D);
1711aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1712aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    for(jint i = 0; i < numEntries; i ++) {
1713aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        _env->SetObjectArrayElement(_entries, i, _env->NewStringUTF(fileEntries[i].objectName));
1714aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        _env->SetIntArrayRegion(_ids, i, 1, (const jint*)&fileEntries[i].classID);
1715aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
1716aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1717aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    free(fileEntries);
1718aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1719aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
17200e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1721460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DGetEntryByIndex(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D, jint index)
1722aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
17230e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    ALOGV("______nFileA3D %p", (RsFile) fileA3D);
17243aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DGetEntryByIndex((RsContext)con, (uint32_t)index, (RsFile)fileA3D);
1725aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    return id;
1726aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1727d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1728d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// -----------------------------------
1729d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
17300e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1731eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFontCreateFromFile(JNIEnv *_env, jobject _this, jlong con,
1732b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                    jstring fileName, jfloat fontSize, jint dpi)
17339b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk{
1734b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
17353aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsFontCreateFromFile((RsContext)con,
1736e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                         fileNameUTF.c_str(), fileNameUTF.length(),
1737e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                         fontSize, dpi);
1738b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1739b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1740b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1741b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
17420e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1743eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFontCreateFromAssetStream(JNIEnv *_env, jobject _this, jlong con,
17440e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                           jstring name, jfloat fontSize, jint dpi, jlong native_asset)
1745b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1746b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    Asset* asset = reinterpret_cast<Asset*>(native_asset);
1747b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 nameUTF(_env, name);
1748b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
17493aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsFontCreateFromMemory((RsContext)con,
1750e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                           nameUTF.c_str(), nameUTF.length(),
1751e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                           fontSize, dpi,
1752b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                                           asset->getBuffer(false), asset->getLength());
1753b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1754b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1755b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
17560e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1757eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFontCreateFromAsset(JNIEnv *_env, jobject _this, jlong con, jobject _assetMgr, jstring _path,
1758b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                     jfloat fontSize, jint dpi)
1759b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1760bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski    Guarded<AssetManager2>* mgr = AssetManagerForJavaObject(_env, _assetMgr);
1761488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (mgr == nullptr) {
1762b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return 0;
1763b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
1764b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1765b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 str(_env, _path);
1766bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski    std::unique_ptr<Asset> asset;
1767bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski    {
1768bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski        ScopedLock<AssetManager2> locked_mgr(*mgr);
1769bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski        asset = locked_mgr->Open(str.c_str(), Asset::ACCESS_BUFFER);
1770bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski        if (asset == nullptr) {
1771bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski            return 0;
1772bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski        }
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());
17799b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    return id;
17809b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk}
17819b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk
1782bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams// -----------------------------------
1783bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams
1784bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Samsstatic void
1785460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptBindAllocation(JNIEnv *_env, jobject _this, jlong con, jlong script, jlong alloc, jint slot)
1786d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
178767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
178867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)", (RsContext)con,
178967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsScript)script, (RsAllocation)alloc, slot);
179067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1791eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
1792d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1793d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1794d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1795460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jint val)
17964d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams{
179767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
179867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con, (void *)script,
179967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
180067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1801eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarI((RsContext)con, (RsScript)script, slot, val);
18024d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams}
18034d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
18047c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jint
1805460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
18067c4caadb939b1563328251c156262c179a685c70Tim Murray{
180767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
180867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarI, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
180967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18107c4caadb939b1563328251c156262c179a685c70Tim Murray    int value = 0;
1811eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18127c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18137c4caadb939b1563328251c156262c179a685c70Tim Murray}
18147c4caadb939b1563328251c156262c179a685c70Tim Murray
18154d3399337d18ef04116bc8a2e5799274655d0c30Jason Samsstatic void
1816460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarObj(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val)
18176f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams{
181867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
181909993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%" PRId64 ")", (RsContext)con, (void *)script,
182067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
182167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1822eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val);
18236f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams}
18246f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams
18256f4cf0b8885403ead157ae00fd43cf1282331c23Jason Samsstatic void
1826460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val)
1827031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines{
182867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
182909993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%" PRId64 ")", (RsContext)con, (void *)script,
183067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
183167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1832eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarJ((RsContext)con, (RsScript)script, slot, val);
1833031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines}
1834031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines
18357c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jlong
1836460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
18377c4caadb939b1563328251c156262c179a685c70Tim Murray{
183867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
183967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarJ, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
184067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18417c4caadb939b1563328251c156262c179a685c70Tim Murray    jlong value = 0;
1842eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18437c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18447c4caadb939b1563328251c156262c179a685c70Tim Murray}
18457c4caadb939b1563328251c156262c179a685c70Tim Murray
1846031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hinesstatic void
1847460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, float val)
18484d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams{
184967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
185067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", (RsContext)con, (void *)script,
185167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
185267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1853eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarF((RsContext)con, (RsScript)script, slot, val);
18544d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams}
18554d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
18567c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jfloat
1857460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
18587c4caadb939b1563328251c156262c179a685c70Tim Murray{
185967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
186067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarF, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
186167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18627c4caadb939b1563328251c156262c179a685c70Tim Murray    jfloat value = 0;
1863eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18647c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18657c4caadb939b1563328251c156262c179a685c70Tim Murray}
18667c4caadb939b1563328251c156262c179a685c70Tim Murray
18674d3399337d18ef04116bc8a2e5799274655d0c30Jason Samsstatic void
1868460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, double val)
1869ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines{
187067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
187167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", (RsContext)con, (void *)script,
187267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
187367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1874eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarD((RsContext)con, (RsScript)script, slot, val);
1875ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines}
1876ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines
18777c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jdouble
1878460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
18797c4caadb939b1563328251c156262c179a685c70Tim Murray{
188067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
188167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarD, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
188267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18837c4caadb939b1563328251c156262c179a685c70Tim Murray    jdouble value = 0;
1884eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18857c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18867c4caadb939b1563328251c156262c179a685c70Tim Murray}
18877c4caadb939b1563328251c156262c179a685c70Tim Murray
1888ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hinesstatic void
1889460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data)
18904d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams{
189167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
189267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
189367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18944d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    jint len = _env->GetArrayLength(data);
1895488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1896ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1897ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1898ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1899ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1900eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
19014d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
19024d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams}
19034d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1904adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hinesstatic void
1905460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data)
19067c4caadb939b1563328251c156262c179a685c70Tim Murray{
190767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
190867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
190967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
19107c4caadb939b1563328251c156262c179a685c70Tim Murray    jint len = _env->GetArrayLength(data);
1911488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1912ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1913ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1914ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1915ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1916eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
1917414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines    _env->ReleaseByteArrayElements(data, ptr, 0);
19187c4caadb939b1563328251c156262c179a685c70Tim Murray}
19197c4caadb939b1563328251c156262c179a685c70Tim Murray
19207c4caadb939b1563328251c156262c179a685c70Tim Murraystatic void
192167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenScriptSetVarVE(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data,
192267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                jlong elem, jintArray dims)
1923adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines{
192467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
192567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarVE, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
192667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1927adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    jint len = _env->GetArrayLength(data);
1928488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1929ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1930ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1931ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1932ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1933adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    jint dimsLen = _env->GetArrayLength(dims) * sizeof(int);
1934488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *dimsPtr = _env->GetIntArrayElements(dims, nullptr);
1935ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (dimsPtr == nullptr) {
1936ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1937ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1938ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1939eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem,
1940bc5d3eeedcbdff2e8331a6792902c6992db9bd31Stephen Hines                     (const uint32_t*) dimsPtr, dimsLen);
1941adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1942adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    _env->ReleaseIntArrayElements(dims, dimsPtr, JNI_ABORT);
1943adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines}
1944adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines
1945d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1946d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1947460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetTimeZone(JNIEnv *_env, jobject _this, jlong con, jlong script, jbyteArray timeZone)
1948584a375df68ed7d62b38389078c6804edf228f9cRomain Guy{
194967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
195067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptCSetTimeZone, con(%p), s(%p)", (RsContext)con, (void *)script);
195167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1952584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
1953584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    jint length = _env->GetArrayLength(timeZone);
1954584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    jbyte* timeZone_ptr;
1955584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0);
1956ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (timeZone_ptr == nullptr) {
1957ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1958ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1959ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1960584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
1961eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length);
1962584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
1963584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    if (timeZone_ptr) {
1964584a375df68ed7d62b38389078c6804edf228f9cRomain Guy        _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0);
1965584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    }
1966584a375df68ed7d62b38389078c6804edf228f9cRomain Guy}
1967584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
196822534176fb5c1257130ef4ee589739ca42766a32Jason Samsstatic void
1969460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptInvoke(JNIEnv *_env, jobject _this, jlong con, jlong obj, jint slot)
197022534176fb5c1257130ef4ee589739ca42766a32Jason Sams{
197167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
197267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptInvoke, con(%p), script(%p)", (RsContext)con, (void *)obj);
197367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1974eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptInvoke((RsContext)con, (RsScript)obj, slot);
197522534176fb5c1257130ef4ee589739ca42766a32Jason Sams}
197622534176fb5c1257130ef4ee589739ca42766a32Jason Sams
1977584a375df68ed7d62b38389078c6804edf228f9cRomain Guystatic void
1978460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptInvokeV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data)
1979be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams{
198067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
198167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptInvokeV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
198267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
19834d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    jint len = _env->GetArrayLength(data);
1984488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1985ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1986ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1987ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1988ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1989eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len);
19904d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1991be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams}
1992be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams
19936e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Samsstatic void
1994be7b1defb6b11920703b241ba5815fb09487bb02Chris WailesnScriptForEach(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
1995be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes               jlongArray ains, jlong aout, jbyteArray params,
1996be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes               jintArray limits)
19976e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Sams{
199867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
19999eb9dd326ae93cd84eb9bbc740f753fe8d8c7a13Chih-Hung Hsieh        ALOGD("nScriptForEach, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
200067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2001949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2002be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    jint   in_len = 0;
2003488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *in_ptr = nullptr;
2004949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2005488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    RsAllocation *in_allocs = nullptr;
2006949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2007488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (ains != nullptr) {
2008be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        in_len = _env->GetArrayLength(ains);
20097b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni        if (in_len > (jint)RS_KERNEL_MAX_ARGUMENTS) {
201017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            ALOGE("Too many arguments in kernel launch.");
201117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            // TODO (b/20758983): Report back to Java and throw an exception
201217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            return;
201317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni        }
2014eb3470219dea322efa93eb4b5457813ce71d0c5dChris Wailes
201517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni        in_ptr = _env->GetLongArrayElements(ains, nullptr);
2016ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (in_ptr == nullptr) {
2017ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
2018ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
2019ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
2020ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
2021be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        if (sizeof(RsAllocation) == sizeof(jlong)) {
2022be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            in_allocs = (RsAllocation*)in_ptr;
2023be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        } else {
2024be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            // Convert from 64-bit jlong types to the native pointer type.
2025eb3470219dea322efa93eb4b5457813ce71d0c5dChris Wailes
2026be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            in_allocs = (RsAllocation*)alloca(in_len * sizeof(RsAllocation));
202717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            if (in_allocs == nullptr) {
202817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni                ALOGE("Failed launching kernel for lack of memory.");
202917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni                _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
203017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni                return;
203117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            }
2032be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2033be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            for (int index = in_len; --index >= 0;) {
2034be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                in_allocs[index] = (RsAllocation)in_ptr[index];
2035be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            }
2036be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        }
2037949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes    }
2038949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2039be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    jint   param_len = 0;
2040488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *param_ptr = nullptr;
2041be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2042488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (params != nullptr) {
2043be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        param_len = _env->GetArrayLength(params);
2044488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        param_ptr = _env->GetByteArrayElements(params, nullptr);
2045ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (param_ptr == nullptr) {
2046ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
2047ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
2048ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
2049c9c7daf69b32c0e72a3b99379cc5116c1647f24eStephen Hines    }
2050949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2051488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    RsScriptCall sc, *sca = nullptr;
2052be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    uint32_t sc_size = 0;
2053949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2054be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    jint  limit_len = 0;
2055488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *limit_ptr = nullptr;
2056949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2057488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (limits != nullptr) {
2058be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        limit_len = _env->GetArrayLength(limits);
2059488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        limit_ptr = _env->GetIntArrayElements(limits, nullptr);
2060ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (limit_ptr == nullptr) {
2061ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
2062ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
2063ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
2064949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2065be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        assert(limit_len == 6);
206667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        UNUSED(limit_len);  // As the assert might not be compiled.
2067949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2068be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.xStart     = limit_ptr[0];
2069be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.xEnd       = limit_ptr[1];
2070be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.yStart     = limit_ptr[2];
2071be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.yEnd       = limit_ptr[3];
2072be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.zStart     = limit_ptr[4];
2073be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.zEnd       = limit_ptr[5];
2074be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.strategy   = RS_FOR_EACH_STRATEGY_DONT_CARE;
207514331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.arrayStart = 0;
207614331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.arrayEnd = 0;
207714331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array2Start = 0;
207814331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array2End = 0;
207914331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array3Start = 0;
208014331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array3End = 0;
208114331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array4Start = 0;
208214331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array4End = 0;
2083949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2084be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sca = &sc;
2085e8f2e445fdb138416043a16659bbf86fbbd3fff8Yang Ni        // sc_size is required, but unused, by the runtime and drivers.
2086e8f2e445fdb138416043a16659bbf86fbbd3fff8Yang Ni        sc_size = sizeof(sc);
2087be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    }
2088949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2089be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    rsScriptForEachMulti((RsContext)con, (RsScript)script, slot,
2090be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                         in_allocs, in_len, (RsAllocation)aout,
2091be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                         param_ptr, param_len, sca, sc_size);
2092949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2093488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (ains != nullptr) {
2094be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
2095949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes    }
2096949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2097488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (params != nullptr) {
2098be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        _env->ReleaseByteArrayElements(params, param_ptr, JNI_ABORT);
2099eb3470219dea322efa93eb4b5457813ce71d0c5dChris Wailes    }
2100c9c7daf69b32c0e72a3b99379cc5116c1647f24eStephen Hines
2101488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (limits != nullptr) {
2102be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
2103be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    }
2104949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes}
2105949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
210636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Walastatic void
210736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt WalanScriptReduce(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
21084a4578530a1a5fb751ea5a7bfbff83f3ab669895David Gross              jlongArray ains, jlong aout, jintArray limits)
210936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala{
211036eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    if (kLogApi) {
21114a4578530a1a5fb751ea5a7bfbff83f3ab669895David Gross        ALOGD("nScriptReduce, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
211226ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
211326ef7a739b724452f93f850a1c268c42e439317bDavid Gross
211426ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (ains == nullptr) {
211526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        ALOGE("At least one input required.");
211626ef7a739b724452f93f850a1c268c42e439317bDavid Gross        // TODO (b/20758983): Report back to Java and throw an exception
211726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        return;
211826ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
211926ef7a739b724452f93f850a1c268c42e439317bDavid Gross    jint in_len = _env->GetArrayLength(ains);
212026ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (in_len > (jint)RS_KERNEL_MAX_ARGUMENTS) {
212126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        ALOGE("Too many arguments in kernel launch.");
212226ef7a739b724452f93f850a1c268c42e439317bDavid Gross        // TODO (b/20758983): Report back to Java and throw an exception
212326ef7a739b724452f93f850a1c268c42e439317bDavid Gross        return;
212426ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
212526ef7a739b724452f93f850a1c268c42e439317bDavid Gross
212626ef7a739b724452f93f850a1c268c42e439317bDavid Gross    jlong *in_ptr = _env->GetLongArrayElements(ains, nullptr);
212726ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (in_ptr == nullptr) {
212826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        ALOGE("Failed to get Java array elements");
212926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        // TODO (b/20758983): Report back to Java and throw an exception
213026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        return;
213126ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
213226ef7a739b724452f93f850a1c268c42e439317bDavid Gross
213326ef7a739b724452f93f850a1c268c42e439317bDavid Gross    RsAllocation *in_allocs = nullptr;
213426ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (sizeof(RsAllocation) == sizeof(jlong)) {
213526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        in_allocs = (RsAllocation*)in_ptr;
213626ef7a739b724452f93f850a1c268c42e439317bDavid Gross    } else {
213726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        // Convert from 64-bit jlong types to the native pointer type.
213826ef7a739b724452f93f850a1c268c42e439317bDavid Gross
213926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        in_allocs = (RsAllocation*)alloca(in_len * sizeof(RsAllocation));
214026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        if (in_allocs == nullptr) {
214126ef7a739b724452f93f850a1c268c42e439317bDavid Gross            ALOGE("Failed launching kernel for lack of memory.");
214226ef7a739b724452f93f850a1c268c42e439317bDavid Gross            // TODO (b/20758983): Report back to Java and throw an exception
214326ef7a739b724452f93f850a1c268c42e439317bDavid Gross            _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
214426ef7a739b724452f93f850a1c268c42e439317bDavid Gross            return;
214526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
214626ef7a739b724452f93f850a1c268c42e439317bDavid Gross
214726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        for (int index = in_len; --index >= 0;) {
214826ef7a739b724452f93f850a1c268c42e439317bDavid Gross            in_allocs[index] = (RsAllocation)in_ptr[index];
214926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
215026ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
215126ef7a739b724452f93f850a1c268c42e439317bDavid Gross
215226ef7a739b724452f93f850a1c268c42e439317bDavid Gross    RsScriptCall sc, *sca = nullptr;
215326ef7a739b724452f93f850a1c268c42e439317bDavid Gross    uint32_t sc_size = 0;
215426ef7a739b724452f93f850a1c268c42e439317bDavid Gross
215526ef7a739b724452f93f850a1c268c42e439317bDavid Gross    jint  limit_len = 0;
215626ef7a739b724452f93f850a1c268c42e439317bDavid Gross    jint *limit_ptr = nullptr;
215726ef7a739b724452f93f850a1c268c42e439317bDavid Gross
215826ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (limits != nullptr) {
215926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        limit_len = _env->GetArrayLength(limits);
216026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        limit_ptr = _env->GetIntArrayElements(limits, nullptr);
216126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        if (limit_ptr == nullptr) {
216226ef7a739b724452f93f850a1c268c42e439317bDavid Gross            ALOGE("Failed to get Java array elements");
216326ef7a739b724452f93f850a1c268c42e439317bDavid Gross            // TODO (b/20758983): Report back to Java and throw an exception
216426ef7a739b724452f93f850a1c268c42e439317bDavid Gross            return;
216526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
216626ef7a739b724452f93f850a1c268c42e439317bDavid Gross
216726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        assert(limit_len == 6);
216826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        UNUSED(limit_len);  // As the assert might not be compiled.
216926ef7a739b724452f93f850a1c268c42e439317bDavid Gross
217026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.xStart     = limit_ptr[0];
217126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.xEnd       = limit_ptr[1];
217226ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.yStart     = limit_ptr[2];
217326ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.yEnd       = limit_ptr[3];
217426ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.zStart     = limit_ptr[4];
217526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.zEnd       = limit_ptr[5];
217626ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.strategy   = RS_FOR_EACH_STRATEGY_DONT_CARE;
217726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.arrayStart = 0;
217826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.arrayEnd = 0;
217926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array2Start = 0;
218026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array2End = 0;
218126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array3Start = 0;
218226ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array3End = 0;
218326ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array4Start = 0;
218426ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array4End = 0;
218526ef7a739b724452f93f850a1c268c42e439317bDavid Gross
218626ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sca = &sc;
218726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc_size = sizeof(sc);
218826ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
218926ef7a739b724452f93f850a1c268c42e439317bDavid Gross
21904a4578530a1a5fb751ea5a7bfbff83f3ab669895David Gross    rsScriptReduce((RsContext)con, (RsScript)script, slot,
21914a4578530a1a5fb751ea5a7bfbff83f3ab669895David Gross                   in_allocs, in_len, (RsAllocation)aout,
21924a4578530a1a5fb751ea5a7bfbff83f3ab669895David Gross                   sca, sc_size);
219326ef7a739b724452f93f850a1c268c42e439317bDavid Gross
219426ef7a739b724452f93f850a1c268c42e439317bDavid Gross    _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
219526ef7a739b724452f93f850a1c268c42e439317bDavid Gross
219626ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (limits != nullptr) {
219726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
219826ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
219926ef7a739b724452f93f850a1c268c42e439317bDavid Gross}
220026ef7a739b724452f93f850a1c268c42e439317bDavid Gross
2201fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams// -----------------------------------
2202fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams
22030e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
2204eff663f391fa4f119685d5c14489b94661ea126fTim MurraynScriptCCreate(JNIEnv *_env, jobject _this, jlong con,
2205e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams               jstring resName, jstring cacheDir,
2206e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams               jbyteArray scriptRef, jint length)
2207d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
220867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
220967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptCCreate, con(%p)", (RsContext)con);
221067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2211e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams
2212e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    AutoJavaStringToUTF8 resNameUTF(_env, resName);
2213e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
22140e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    jlong ret = 0;
2215488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte* script_ptr = nullptr;
221643702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    jint _exception = 0;
221743702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    jint remaining;
221843702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    if (!scriptRef) {
221943702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _exception = 1;
22208451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null");
222143702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        goto exit;
222243702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
222343702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    if (length < 0) {
222443702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _exception = 1;
22258451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0");
222643702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        goto exit;
222743702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
2228e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    remaining = _env->GetArrayLength(scriptRef);
222943702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    if (remaining < length) {
223043702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _exception = 1;
22318451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //jniThrowException(_env, "java/lang/IllegalArgumentException",
22328451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //        "length > script.length - offset");
223343702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        goto exit;
223443702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
2235e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    script_ptr = (jbyte *)
223643702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0);
2237ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (script_ptr == nullptr) {
2238ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
2239ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return ret;
2240ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
224143702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich
2242eff663f391fa4f119685d5c14489b94661ea126fTim Murray    //rsScriptCSetText((RsContext)con, (const char *)script_ptr, length);
2243e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams
22443aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    ret = (jlong)(uintptr_t)rsScriptCCreate((RsContext)con,
2245e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                resNameUTF.c_str(), resNameUTF.length(),
2246e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                cacheDirUTF.c_str(), cacheDirUTF.length(),
2247e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams                                (const char *)script_ptr, length);
224839ddc950c9064129ead5de04b200106c0659f937Jason Sams
224943702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevichexit:
2250e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    if (script_ptr) {
2251e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams        _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr,
225243702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich                _exception ? JNI_ABORT: 0);
225343702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
2254d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
22553aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)ret;
2256d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2257d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2258460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2259460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptIntrinsicCreate(JNIEnv *_env, jobject _this, jlong con, jint id, jlong eid)
22606ab97682fd444586ee135912a4210417a1c8781bJason Sams{
226167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
226267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptIntrinsicCreate, con(%p) id(%i) element(%p)", (RsContext)con, id,
226367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)eid);
226467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
22653aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
22666ab97682fd444586ee135912a4210417a1c8781bJason Sams}
22676ab97682fd444586ee135912a4210417a1c8781bJason Sams
2268460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2269460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptKernelIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jint sig)
227008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
227167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
227267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptKernelIDCreate, con(%p) script(%p), slot(%i), sig(%i)", (RsContext)con,
227367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)sid, slot, sig);
227467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
22753aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsScriptKernelIDCreate((RsContext)con, (RsScript)sid, slot, sig);
227608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
227708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2278460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2279be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang NinScriptInvokeIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
2280be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni{
2281be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    if (kLogApi) {
22827ff53fa0d42795da55b65468e07df82029deda79Elliott Hughes        ALOGD("nScriptInvokeIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con,
2283be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni              (void *)sid, slot);
2284be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    }
2285be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    return (jlong)(uintptr_t)rsScriptInvokeIDCreate((RsContext)con, (RsScript)sid, slot);
2286be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni}
2287be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
2288be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Nistatic jlong
2289460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptFieldIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
229008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
229167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
229267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptFieldIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con, (void *)sid,
229367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot);
229467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
22953aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
229608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
229708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2298460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
22999807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnScriptGroupCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _kernels, jlongArray _src,
23009807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    jlongArray _dstk, jlongArray _dstf, jlongArray _types)
230108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
230267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
230367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupCreate, con(%p)", (RsContext)con);
230467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
230508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2306a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong id = 0;
2307a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2308a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsScriptKernelID* kernelsPtr;
23099807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    jint kernelsLen = _env->GetArrayLength(_kernels);
2310488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jKernelsPtr = _env->GetLongArrayElements(_kernels, nullptr);
2311a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2312a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsScriptKernelID* srcPtr;
2313a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint srcLen = _env->GetArrayLength(_src);
2314a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong *jSrcPtr = _env->GetLongArrayElements(_src, nullptr);
2315a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2316a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsScriptKernelID* dstkPtr;
2317a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint dstkLen = _env->GetArrayLength(_dstk);
2318a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong *jDstkPtr = _env->GetLongArrayElements(_dstk, nullptr);
2319a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2320a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsScriptKernelID* dstfPtr;
2321a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint dstfLen = _env->GetArrayLength(_dstf);
2322a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong *jDstfPtr = _env->GetLongArrayElements(_dstf, nullptr);
2323a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2324a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsType* typesPtr;
2325a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint typesLen = _env->GetArrayLength(_types);
2326a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong *jTypesPtr = _env->GetLongArrayElements(_types, nullptr);
2327a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2328ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jKernelsPtr == nullptr) {
2329ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: kernels");
2330a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanup;
2331a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2332a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jSrcPtr == nullptr) {
2333a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        ALOGE("Failed to get Java array elements: src");
2334a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanup;
2335a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2336a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jDstkPtr == nullptr) {
2337a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        ALOGE("Failed to get Java array elements: dstk");
2338a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanup;
2339a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2340a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jDstfPtr == nullptr) {
2341a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        ALOGE("Failed to get Java array elements: dstf");
2342a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanup;
2343ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
2344a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jTypesPtr == nullptr) {
2345a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        ALOGE("Failed to get Java array elements: types");
2346a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanup;
2347a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2348a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2349a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    kernelsPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * kernelsLen);
23509807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < kernelsLen; ++i) {
23519807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        kernelsPtr[i] = (RsScriptKernelID)jKernelsPtr[i];
23529807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
23539807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2354a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    srcPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * srcLen);
23559807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < srcLen; ++i) {
23569807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        srcPtr[i] = (RsScriptKernelID)jSrcPtr[i];
23579807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
23589807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2359a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    dstkPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstkLen);
23609807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < dstkLen; ++i) {
23619807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        dstkPtr[i] = (RsScriptKernelID)jDstkPtr[i];
23629807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
23639807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2364a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    dstfPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstfLen);
23659807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < dstfLen; ++i) {
23669807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        dstfPtr[i] = (RsScriptKernelID)jDstfPtr[i];
23679807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
23689807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2369a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    typesPtr = (RsType*) malloc(sizeof(RsType) * typesLen);
23709807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < typesLen; ++i) {
23719807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        typesPtr[i] = (RsType)jTypesPtr[i];
23729807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
23739807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2374a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    id = (jlong)(uintptr_t)rsScriptGroupCreate((RsContext)con,
23759807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptKernelID *)kernelsPtr, kernelsLen * sizeof(RsScriptKernelID),
23769807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptKernelID *)srcPtr, srcLen * sizeof(RsScriptKernelID),
23779807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptKernelID *)dstkPtr, dstkLen * sizeof(RsScriptKernelID),
23789807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptFieldID *)dstfPtr, dstfLen * sizeof(RsScriptKernelID),
23799807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsType *)typesPtr, typesLen * sizeof(RsType));
23809807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
23819807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(kernelsPtr);
23829807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(srcPtr);
23839807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(dstkPtr);
23849807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(dstfPtr);
23859807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(typesPtr);
2386a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2387a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wangcleanup:
2388a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jKernelsPtr != nullptr) {
2389a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_kernels, jKernelsPtr, 0);
2390a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2391a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jSrcPtr != nullptr) {
2392a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_src, jSrcPtr, 0);
2393a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2394a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jDstkPtr != nullptr) {
2395a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_dstk, jDstkPtr, 0);
2396a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2397a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jDstfPtr != nullptr) {
2398a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_dstf, jDstfPtr, 0);
2399a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2400a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jTypesPtr != nullptr) {
2401a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_types, jTypesPtr, 0);
2402a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2403a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
240408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    return id;
240508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
240608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
240708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Samsstatic void
2408460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGroupSetInput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
240908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
241067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
241167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupSetInput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
241267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)gid, (void *)kid, (void *)alloc);
241367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2414eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGroupSetInput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid, (RsAllocation)alloc);
241508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
241608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
241708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Samsstatic void
2418460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGroupSetOutput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
241908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
242067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
242167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupSetOutput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
242267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)gid, (void *)kid, (void *)alloc);
242367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2424eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGroupSetOutput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid, (RsAllocation)alloc);
242508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
242608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
242708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Samsstatic void
2428460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGroupExecute(JNIEnv *_env, jobject _this, jlong con, jlong gid)
242908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
243067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
243167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupSetOutput, con(%p) group(%p)", (RsContext)con, (void *)gid);
243267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2433eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGroupExecute((RsContext)con, (RsScriptGroup)gid);
243408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
243508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2436d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
2437d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
24380e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
2439eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramStoreCreate(JNIEnv *_env, jobject _this, jlong con,
2440331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jboolean colorMaskR, jboolean colorMaskG, jboolean colorMaskB, jboolean colorMaskA,
2441331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jboolean depthMask, jboolean ditherEnable,
2442331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jint srcFunc, jint destFunc,
2443331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jint depthFunc)
2444d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
244567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
244667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramStoreCreate, con(%p)", (RsContext)con);
244767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
24483aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsProgramStoreCreate((RsContext)con, colorMaskR, colorMaskG, colorMaskB, colorMaskA,
2449331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                                      depthMask, ditherEnable, (RsBlendSrcFunc)srcFunc,
2450331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                                      (RsBlendDstFunc)destFunc, (RsDepthFunc)depthFunc);
2451d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2452d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
24530011bcf57ff711a221a3a4c73f2a79125111647dJason Sams// ---------------------------------------------------------------------------
24540011bcf57ff711a221a3a4c73f2a79125111647dJason Sams
24550011bcf57ff711a221a3a4c73f2a79125111647dJason Samsstatic void
2456460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynProgramBindConstants(JNIEnv *_env, jobject _this, jlong con, jlong vpv, jint slot, jlong a)
24570011bcf57ff711a221a3a4c73f2a79125111647dJason Sams{
245867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
245967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramBindConstants, con(%p), vpf(%p), sloat(%i), a(%p)", (RsContext)con,
246067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramVertex)vpv, slot, (RsAllocation)a);
246167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2462eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsProgramBindConstants((RsContext)con, (RsProgram)vpv, slot, (RsAllocation)a);
24630011bcf57ff711a221a3a4c73f2a79125111647dJason Sams}
246454c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams
2465d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
2466460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynProgramBindTexture(JNIEnv *_env, jobject _this, jlong con, jlong vpf, jint slot, jlong a)
246754c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams{
246867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
246967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramBindTexture, con(%p), vpf(%p), slot(%i), a(%p)", (RsContext)con,
247067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramFragment)vpf, slot, (RsAllocation)a);
247167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2472eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsProgramBindTexture((RsContext)con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
247354c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams}
247454c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams
247554c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Samsstatic void
2476460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynProgramBindSampler(JNIEnv *_env, jobject _this, jlong con, jlong vpf, jint slot, jlong a)
2477d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
247867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
247967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramBindSampler, con(%p), vpf(%p), slot(%i), a(%p)", (RsContext)con,
248067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramFragment)vpf, slot, (RsSampler)a);
248167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2482eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsProgramBindSampler((RsContext)con, (RsProgramFragment)vpf, slot, (RsSampler)a);
2483d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2484d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
248568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams// ---------------------------------------------------------------------------
2486d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2487460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2488eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramFragmentCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader,
24899807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                       jobjectArray texNames, jlongArray params)
24907e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams{
2491b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 shaderUTF(_env, shader);
2492488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jParamPtr = _env->GetLongArrayElements(params, nullptr);
24937e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams    jint paramLen = _env->GetArrayLength(params);
2494ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jParamPtr == nullptr) {
2495ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
2496ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
2497ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
24987e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
24992123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    int texCount = _env->GetArrayLength(texNames);
25002123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8 names(_env, texNames, texCount);
25012123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char ** nameArray = names.c_str();
25022123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t* sizeArray = names.c_str_len();
25032123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
250467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
250567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramFragmentCreate, con(%p), paramLen(%i)", (RsContext)con, paramLen);
250667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
25077e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
25089807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t * paramPtr = (uintptr_t*) malloc(sizeof(uintptr_t) * paramLen);
25099807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < paramLen; ++i) {
25109807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        paramPtr[i] = (uintptr_t)jParamPtr[i];
25119807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
25123aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong ret = (jlong)(uintptr_t)rsProgramFragmentCreate((RsContext)con, shaderUTF.c_str(), shaderUTF.length(),
25132123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                                             nameArray, texCount, sizeArray,
25149807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                                             paramPtr, paramLen);
25152123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
25169807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(paramPtr);
25179807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(params, jParamPtr, JNI_ABORT);
25187e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams    return ret;
25197e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams}
25207e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
25217e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
25221fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams// ---------------------------------------------------------------------------
25231fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams
2524460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2525eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramVertexCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader,
25269807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                     jobjectArray texNames, jlongArray params)
25271fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams{
2528b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 shaderUTF(_env, shader);
2529488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jParamPtr = _env->GetLongArrayElements(params, nullptr);
25300011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    jint paramLen = _env->GetArrayLength(params);
2531ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jParamPtr == nullptr) {
2532ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
2533ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
2534ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
25351fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams
253667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
253767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramVertexCreate, con(%p), paramLen(%i)", (RsContext)con, paramLen);
253867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2539ee41112e1539de95596600fd2c6dada5d275217fJason Sams
25402123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    int texCount = _env->GetArrayLength(texNames);
25412123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8 names(_env, texNames, texCount);
25422123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char ** nameArray = names.c_str();
25432123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t* sizeArray = names.c_str_len();
25442123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
25459807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t * paramPtr = (uintptr_t*) malloc(sizeof(uintptr_t) * paramLen);
25469807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < paramLen; ++i) {
25479807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        paramPtr[i] = (uintptr_t)jParamPtr[i];
25489807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
25499807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
25503aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong ret = (jlong)(uintptr_t)rsProgramVertexCreate((RsContext)con, shaderUTF.c_str(), shaderUTF.length(),
25512123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                                           nameArray, texCount, sizeArray,
25529807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                                           paramPtr, paramLen);
25532123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
25549807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(paramPtr);
25559807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(params, jParamPtr, JNI_ABORT);
25560011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    return ret;
25571fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams}
25581fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams
2559ebfb436a49673693b98469683451bd9ede797557Jason Sams// ---------------------------------------------------------------------------
2560ebfb436a49673693b98469683451bd9ede797557Jason Sams
2561460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2562eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramRasterCreate(JNIEnv *_env, jobject _this, jlong con, jboolean pointSprite, jint cull)
2563ebfb436a49673693b98469683451bd9ede797557Jason Sams{
256467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
256567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramRasterCreate, con(%p), pointSprite(%i), cull(%i)", (RsContext)con,
256667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              pointSprite, cull);
256767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
25683aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsProgramRasterCreate((RsContext)con, pointSprite, (RsCullMode)cull);
2569ebfb436a49673693b98469683451bd9ede797557Jason Sams}
2570ebfb436a49673693b98469683451bd9ede797557Jason Sams
2571d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2572d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
2573d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2574d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
257578c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindRootScript(JNIEnv *_env, jobject _this, jlong con, jlong script)
2576d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
257767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
257867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindRootScript, con(%p), script(%p)", (RsContext)con, (RsScript)script);
257967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2580eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindRootScript((RsContext)con, (RsScript)script);
2581d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2582d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2583d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
258478c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramStore(JNIEnv *_env, jobject _this, jlong con, jlong pfs)
2585d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
258667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
258767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramStore, con(%p), pfs(%p)", (RsContext)con, (RsProgramStore)pfs);
258867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2589eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramStore((RsContext)con, (RsProgramStore)pfs);
2590d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2591d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2592d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
259378c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramFragment(JNIEnv *_env, jobject _this, jlong con, jlong pf)
2594d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
259567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
259667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramFragment, con(%p), pf(%p)", (RsContext)con,
259767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramFragment)pf);
259867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2599eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramFragment((RsContext)con, (RsProgramFragment)pf);
2600d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2601d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
26020826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samsstatic void
260378c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramVertex(JNIEnv *_env, jobject _this, jlong con, jlong pf)
26040826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams{
260567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
260667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramVertex, con(%p), pf(%p)", (RsContext)con, (RsProgramVertex)pf);
260767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2608eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramVertex((RsContext)con, (RsProgramVertex)pf);
26090826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams}
26100826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams
2611d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onoratostatic void
261278c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramRaster(JNIEnv *_env, jobject _this, jlong con, jlong pf)
2613ebfb436a49673693b98469683451bd9ede797557Jason Sams{
261467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
261567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramRaster, con(%p), pf(%p)", (RsContext)con, (RsProgramRaster)pf);
261667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2617eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramRaster((RsContext)con, (RsProgramRaster)pf);
2618ebfb436a49673693b98469683451bd9ede797557Jason Sams}
2619ebfb436a49673693b98469683451bd9ede797557Jason Sams
2620d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onorato
262102fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams// ---------------------------------------------------------------------------
262202fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams
26230e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
2624eff663f391fa4f119685d5c14489b94661ea126fTim MurraynSamplerCreate(JNIEnv *_env, jobject _this, jlong con, jint magFilter, jint minFilter,
2625a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk               jint wrapS, jint wrapT, jint wrapR, jfloat aniso)
262602fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams{
262767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
262867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nSamplerCreate, con(%p)", (RsContext)con);
262967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
26303aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsSamplerCreate((RsContext)con,
2631a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)magFilter,
2632a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)minFilter,
2633a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)wrapS,
2634a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)wrapT,
2635a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)wrapR,
2636a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 aniso);
263702fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams}
263802fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams
2639bba134c8a1dcfe0c8473307a95899a02c9553504Jason Sams// ---------------------------------------------------------------------------
2640bba134c8a1dcfe0c8473307a95899a02c9553504Jason Sams
2641460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
26429807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnMeshCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _vtx, jlongArray _idx, jintArray _prim)
2643164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk{
264467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
264567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshCreate, con(%p)", (RsContext)con);
264667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2647164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2648a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong id = 0;
2649a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2650a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsAllocation* vtxPtr;
265125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk    jint vtxLen = _env->GetArrayLength(_vtx);
2652488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jVtxPtr = _env->GetLongArrayElements(_vtx, nullptr);
2653a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2654a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsAllocation* idxPtr;
2655a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint idxLen = _env->GetArrayLength(_idx);
2656a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong *jIdxPtr = _env->GetLongArrayElements(_idx, nullptr);
2657a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2658a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint primLen = _env->GetArrayLength(_prim);
2659a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint *primPtr = _env->GetIntArrayElements(_prim, nullptr);
2660a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2661ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jVtxPtr == nullptr) {
2662ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: vtx");
2663a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanupMesh;
2664a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2665a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jIdxPtr == nullptr) {
2666a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        ALOGE("Failed to get Java array elements: idx");
2667a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanupMesh;
2668a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2669a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (primPtr == nullptr) {
2670a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        ALOGE("Failed to get Java array elements: prim");
2671a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanupMesh;
2672ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
2673a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2674a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    vtxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * vtxLen);
26759807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < vtxLen; ++i) {
26769807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        vtxPtr[i] = (RsAllocation)(uintptr_t)jVtxPtr[i];
26779807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
26789807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2679a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    idxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * idxLen);
26809807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < idxLen; ++i) {
26819807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        idxPtr[i] = (RsAllocation)(uintptr_t)jIdxPtr[i];
26829807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
26839807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2684a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    id = (jlong)(uintptr_t)rsMeshCreate((RsContext)con,
2685a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang                                        (RsAllocation *)vtxPtr, vtxLen,
2686a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang                                        (RsAllocation *)idxPtr, idxLen,
2687a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang                                        (uint32_t *)primPtr, primLen);
268880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
26899807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(vtxPtr);
26909807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(idxPtr);
2691a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2692a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao WangcleanupMesh:
2693a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jVtxPtr != nullptr) {
2694a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_vtx, jVtxPtr, 0);
2695a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2696a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jIdxPtr != nullptr) {
2697a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_idx, jIdxPtr, 0);
2698a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2699a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (primPtr != nullptr) {
2700a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseIntArrayElements(_prim, primPtr, 0);
2701a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2702a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
270325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk    return id;
27049d71e2180062931416092f26276a07e55b318f62Alex Sakhartchouk}
27059d71e2180062931416092f26276a07e55b318f62Alex Sakhartchouk
270680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic jint
2707460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynMeshGetVertexBufferCount(JNIEnv *_env, jobject _this, jlong con, jlong mesh)
270880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
270967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
271067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetVertexBufferCount, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
271167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
271280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    jint vtxCount = 0;
2713eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetVertexBufferCount((RsContext)con, (RsMesh)mesh, &vtxCount);
271480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    return vtxCount;
271580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk}
271680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
271780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic jint
2718460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynMeshGetIndexCount(JNIEnv *_env, jobject _this, jlong con, jlong mesh)
271980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
272067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
272167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetIndexCount, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
272267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
272380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    jint idxCount = 0;
2724eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetIndexCount((RsContext)con, (RsMesh)mesh, &idxCount);
272580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    return idxCount;
272680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk}
272780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
272880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic void
27299807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnMeshGetVertices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jlongArray _ids, jint numVtxIDs)
273080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
273167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
273267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetVertices, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
273367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
273480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
273580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numVtxIDs * sizeof(RsAllocation));
2736eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetVertices((RsContext)con, (RsMesh)mesh, allocs, (uint32_t)numVtxIDs);
273780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
273880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    for(jint i = 0; i < numVtxIDs; i ++) {
27393aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong alloc = (jlong)(uintptr_t)allocs[i];
27409807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_ids, i, 1, &alloc);
274180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    }
274280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
274380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    free(allocs);
274480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk}
274580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
274680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic void
27479807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnMeshGetIndices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jlongArray _idxIds, jintArray _primitives, jint numIndices)
274880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
274967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
275067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetVertices, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
275167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
275280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
275380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numIndices * sizeof(RsAllocation));
275480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    uint32_t *prims= (uint32_t*)malloc((uint32_t)numIndices * sizeof(uint32_t));
275580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
2756eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetIndices((RsContext)con, (RsMesh)mesh, allocs, prims, (uint32_t)numIndices);
275780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
275880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    for(jint i = 0; i < numIndices; i ++) {
27593aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong alloc = (jlong)(uintptr_t)allocs[i];
27609807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        const jint prim = (jint)prims[i];
27619807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_idxIds, i, 1, &alloc);
27629807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetIntArrayRegion(_primitives, i, 1, &prim);
276380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    }
276480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
276580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    free(allocs);
276680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    free(prims);
2767164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk}
2768164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
276956f9e6f8d5436d50530807950661e66ca5efe2bbTim Murraystatic jint
277056f9e6f8d5436d50530807950661e66ca5efe2bbTim MurraynSystemGetPointerSize(JNIEnv *_env, jobject _this) {
277156f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray    return (jint)sizeof(void*);
277256f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray}
277356f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray
27740facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wangstatic jobject
27750facf021ea1a0399d956372b9d3ad9025a9a04d2Miao WangnAllocationGetByteBuffer(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
27760facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang                        jlongArray strideArr, jint xBytesSize,
27770facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang                        jint dimY, jint dimZ) {
27780facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    if (kLogApi) {
27790facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        ALOGD("nAllocationGetByteBuffer, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
27800facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    }
27810facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang
27820facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    jlong *jStridePtr = _env->GetLongArrayElements(strideArr, nullptr);
27830facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    if (jStridePtr == nullptr) {
27840facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        ALOGE("Failed to get Java array elements: strideArr");
27850facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        return 0;
27860facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    }
278756f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray
27880facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    size_t strideIn = xBytesSize;
27890facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    void* ptr = nullptr;
27900facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    if (alloc != 0) {
27910facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        ptr = rsAllocationGetPointer((RsContext)con, (RsAllocation)alloc, 0,
27920facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang                                     RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 0, 0,
27930facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang                                     &strideIn, sizeof(size_t));
27940facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    }
27950facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang
27960facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    jobject byteBuffer = nullptr;
27970facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    if (ptr != nullptr) {
27980facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        size_t bufferSize = strideIn;
27990facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        jStridePtr[0] = strideIn;
28000facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        if (dimY > 0) {
28010facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang            bufferSize *= dimY;
28020facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        }
28030facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        if (dimZ > 0) {
28040facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang            bufferSize *= dimZ;
28050facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        }
28060facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        byteBuffer = _env->NewDirectByteBuffer(ptr, (jlong) bufferSize);
28070facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    }
28080facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    _env->ReleaseLongArrayElements(strideArr, jStridePtr, 0);
28090facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    return byteBuffer;
28100facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang}
2811164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk// ---------------------------------------------------------------------------
2812164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2813d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
281494d8e90ad78ee1dbc0efa315117688abd126ae55Jason Samsstatic const char *classPathName = "android/renderscript/RenderScript";
2815d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
281676f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod methods[] = {
28171c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams{"_nInit",                         "()V",                                     (void*)_nInit },
28181c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
2819eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nDeviceCreate",                  "()J",                                     (void*)nDeviceCreate },
2820eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nDeviceDestroy",                 "(J)V",                                    (void*)nDeviceDestroy },
2821eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nDeviceSetConfig",               "(JII)V",                                  (void*)nDeviceSetConfig },
2822eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextGetUserMessage",         "(J[I)I",                                  (void*)nContextGetUserMessage },
2823eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextGetErrorMessage",        "(J)Ljava/lang/String;",                   (void*)nContextGetErrorMessage },
2824eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextPeekMessage",            "(J[I)I",                                  (void*)nContextPeekMessage },
28251c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
2826eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextInitToClient",           "(J)V",                                    (void*)nContextInitToClient },
2827eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextDeinitToClient",         "(J)V",                                    (void*)nContextDeinitToClient },
28282e1872fe07cf8952812a417985e6e1f61bdeab5dJason Sams
28292e1872fe07cf8952812a417985e6e1f61bdeab5dJason Sams
28302e1872fe07cf8952812a417985e6e1f61bdeab5dJason Sams// All methods below are thread protected in java.
2831eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextCreate",                 "(JIII)J",                               (void*)nContextCreate },
2832eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextCreateGL",               "(JIIIIIIIIIIIIFI)J",                    (void*)nContextCreateGL },
2833eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextFinish",                 "(J)V",                                  (void*)nContextFinish },
2834eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextSetPriority",            "(JI)V",                                 (void*)nContextSetPriority },
283547f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray{"rsnContextSetCacheDir",            "(JLjava/lang/String;)V",                (void*)nContextSetCacheDir },
2836eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextSetSurface",             "(JIILandroid/view/Surface;)V",          (void*)nContextSetSurface },
2837eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextDestroy",                "(J)V",                                  (void*)nContextDestroy },
2838eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextDump",                   "(JI)V",                                 (void*)nContextDump },
2839eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextPause",                  "(J)V",                                  (void*)nContextPause },
2840eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextResume",                 "(J)V",                                  (void*)nContextResume },
2841eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextSendMessage",            "(JI[I)V",                               (void*)nContextSendMessage },
2842281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnClosureCreate",                 "(JJJ[J[J[I[J[J)J",                      (void*)nClosureCreate },
2843be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni{"rsnInvokeClosureCreate",           "(JJ[B[J[J[I)J",                         (void*)nInvokeClosureCreate },
2844281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnClosureSetArg",                 "(JJIJI)V",                              (void*)nClosureSetArg },
2845281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnClosureSetGlobal",              "(JJJJI)V",                              (void*)nClosureSetGlobal },
2846460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAssignName",                    "(JJ[B)V",                               (void*)nAssignName },
2847460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnGetName",                       "(JJ)Ljava/lang/String;",                (void*)nGetName },
2848460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnObjDestroy",                    "(JJ)V",                                 (void*)nObjDestroy },
2849eff663f391fa4f119685d5c14489b94661ea126fTim Murray
2850460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DCreateFromFile",         "(JLjava/lang/String;)J",                (void*)nFileA3DCreateFromFile },
28510e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFileA3DCreateFromAssetStream",  "(JJ)J",                                 (void*)nFileA3DCreateFromAssetStream },
2852460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DCreateFromAsset",        "(JLandroid/content/res/AssetManager;Ljava/lang/String;)J",            (void*)nFileA3DCreateFromAsset },
2853460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DGetNumIndexEntries",     "(JJ)I",                                 (void*)nFileA3DGetNumIndexEntries },
2854460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DGetIndexEntries",        "(JJI[I[Ljava/lang/String;)V",           (void*)nFileA3DGetIndexEntries },
28550e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFileA3DGetEntryByIndex",        "(JJI)J",                                (void*)nFileA3DGetEntryByIndex },
2856eff663f391fa4f119685d5c14489b94661ea126fTim Murray
28570e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFontCreateFromFile",            "(JLjava/lang/String;FI)J",              (void*)nFontCreateFromFile },
28580e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFontCreateFromAssetStream",     "(JLjava/lang/String;FIJ)J",             (void*)nFontCreateFromAssetStream },
28590e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFontCreateFromAsset",        "(JLandroid/content/res/AssetManager;Ljava/lang/String;FI)J",            (void*)nFontCreateFromAsset },
2860eff663f391fa4f119685d5c14489b94661ea126fTim Murray
2861460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnElementCreate",                 "(JJIZI)J",                              (void*)nElementCreate },
28629807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnElementCreate2",                "(J[J[Ljava/lang/String;[I)J",           (void*)nElementCreate2 },
2863460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnElementGetNativeData",          "(JJ[I)V",                               (void*)nElementGetNativeData },
28649807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnElementGetSubElements",         "(JJ[J[Ljava/lang/String;[I)V",          (void*)nElementGetSubElements },
2865460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
2866460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnTypeCreate",                    "(JJIIIZZI)J",                           (void*)nTypeCreate },
28679807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnTypeGetNativeData",             "(JJ[J)V",                               (void*)nTypeGetNativeData },
2868460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
28699807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnAllocationCreateTyped",         "(JJIIJ)J",                               (void*)nAllocationCreateTyped },
2870460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCreateFromBitmap",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateFromBitmap },
2871460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCreateBitmapBackedAllocation",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateBitmapBackedAllocation },
2872460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCubeCreateFromBitmap","(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCubeCreateFromBitmap },
2873460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
2874460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCopyFromBitmap",      "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyFromBitmap },
2875460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCopyToBitmap",        "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyToBitmap },
2876460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
2877460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationSyncAll",             "(JJI)V",                                (void*)nAllocationSyncAll },
28788c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{"rsnAllocationSetupBufferQueue",    "(JJI)V",                                (void*)nAllocationSetupBufferQueue },
28798c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{"rsnAllocationShareBufferQueue",    "(JJJ)V",                                (void*)nAllocationShareBufferQueue },
2880460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationGetSurface",          "(JJ)Landroid/view/Surface;",            (void*)nAllocationGetSurface },
2881460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationSetSurface",          "(JJLandroid/view/Surface;)V",           (void*)nAllocationSetSurface },
2882460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationIoSend",              "(JJ)V",                                 (void*)nAllocationIoSend },
28838c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{"rsnAllocationIoReceive",           "(JJ)J",                                 (void*)nAllocationIoReceive },
288487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationData1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationData1D },
2885c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang{"rsnAllocationElementData",         "(JJIIIII[BI)V",                         (void*)nAllocationElementData },
288687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationData2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationData2D },
2887460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationData2D",              "(JJIIIIIIJIIII)V",                      (void*)nAllocationData2D_alloc },
288887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationData3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",    (void*)nAllocationData3D },
2889460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationData3D",              "(JJIIIIIIIJIIII)V",                     (void*)nAllocationData3D_alloc },
289087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead",                "(JJLjava/lang/Object;IIZ)V",            (void*)nAllocationRead },
289187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationRead1D },
289245cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang{"rsnAllocationElementRead",         "(JJIIIII[BI)V",                         (void*)nAllocationElementRead },
289387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationRead2D },
289487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",    (void*)nAllocationRead3D },
2895460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationGetType",             "(JJ)J",                                 (void*)nAllocationGetType},
2896460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationResize1D",            "(JJI)V",                                (void*)nAllocationResize1D },
2897460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationGenerateMipmaps",     "(JJ)V",                                 (void*)nAllocationGenerateMipmaps },
2898460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
289946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{"rsnAllocationAdapterCreate",       "(JJJ)J",                                (void*)nAllocationAdapterCreate },
290046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{"rsnAllocationAdapterOffset",       "(JJIIIIIIIII)V",                        (void*)nAllocationAdapterOffset },
290146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
2902460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptBindAllocation",          "(JJJI)V",                               (void*)nScriptBindAllocation },
2903460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetTimeZone",             "(JJ[B)V",                               (void*)nScriptSetTimeZone },
2904460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptInvoke",                  "(JJI)V",                                (void*)nScriptInvoke },
2905460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptInvokeV",                 "(JJI[B)V",                              (void*)nScriptInvokeV },
2906be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2907be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes{"rsnScriptForEach",                 "(JJI[JJ[B[I)V",                         (void*)nScriptForEach },
29084a4578530a1a5fb751ea5a7bfbff83f3ab669895David Gross{"rsnScriptReduce",                  "(JJI[JJ[I)V",                           (void*)nScriptReduce },
2909be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2910460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarI",                 "(JJII)V",                               (void*)nScriptSetVarI },
2911460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarI",                 "(JJI)I",                                (void*)nScriptGetVarI },
2912460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarJ",                 "(JJIJ)V",                               (void*)nScriptSetVarJ },
2913460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarJ",                 "(JJI)J",                                (void*)nScriptGetVarJ },
2914460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarF",                 "(JJIF)V",                               (void*)nScriptSetVarF },
2915460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarF",                 "(JJI)F",                                (void*)nScriptGetVarF },
2916460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarD",                 "(JJID)V",                               (void*)nScriptSetVarD },
2917460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarD",                 "(JJI)D",                                (void*)nScriptGetVarD },
2918460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarV",                 "(JJI[B)V",                              (void*)nScriptSetVarV },
2919460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarV",                 "(JJI[B)V",                              (void*)nScriptGetVarV },
2920460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarVE",                "(JJI[BJ[I)V",                           (void*)nScriptSetVarVE },
2921460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarObj",               "(JJIJ)V",                               (void*)nScriptSetVarObj },
2922eff663f391fa4f119685d5c14489b94661ea126fTim Murray
29230e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnScriptCCreate",                 "(JLjava/lang/String;Ljava/lang/String;[BI)J",  (void*)nScriptCCreate },
2924460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptIntrinsicCreate",         "(JIJ)J",                                (void*)nScriptIntrinsicCreate },
2925460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptKernelIDCreate",          "(JJII)J",                               (void*)nScriptKernelIDCreate },
2926be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni{"rsnScriptInvokeIDCreate",          "(JJI)J",                                (void*)nScriptInvokeIDCreate },
2927460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptFieldIDCreate",           "(JJI)J",                                (void*)nScriptFieldIDCreate },
29289807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnScriptGroupCreate",             "(J[J[J[J[J[J)J",                        (void*)nScriptGroupCreate },
292935be56cce821d86f69026398ff9433e2d173b02fYang Ni{"rsnScriptGroup2Create",            "(JLjava/lang/String;Ljava/lang/String;[J)J", (void*)nScriptGroup2Create },
2930460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGroupSetInput",           "(JJJJ)V",                               (void*)nScriptGroupSetInput },
2931460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGroupSetOutput",          "(JJJJ)V",                               (void*)nScriptGroupSetOutput },
2932460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGroupExecute",            "(JJ)V",                                 (void*)nScriptGroupExecute },
2933281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnScriptGroup2Execute",           "(JJ)V",                                 (void*)nScriptGroup2Execute },
2934eff663f391fa4f119685d5c14489b94661ea126fTim Murray
293525207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Single",    "(JJIIIIIIIIIFJJFJIIII)V",               (void*)nScriptIntrinsicBLAS_Single },
293625207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Double",    "(JJIIIIIIIIIDJJDJIIII)V",               (void*)nScriptIntrinsicBLAS_Double },
293725207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Complex",   "(JJIIIIIIIIIFFJJFFJIIII)V",             (void*)nScriptIntrinsicBLAS_Complex },
293825207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Z",         "(JJIIIIIIIIIDDJJDDJIIII)V",             (void*)nScriptIntrinsicBLAS_Z },
293925207df658d6a8a3e885c7017fcc25702363583cTim Murray
29409cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray{"rsnScriptIntrinsicBLAS_BNNM",      "(JJIIIJIJIJII)V",                       (void*)nScriptIntrinsicBLAS_BNNM },
29419cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
29420e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnProgramStoreCreate",            "(JZZZZZZIII)J",                         (void*)nProgramStoreCreate },
2943eff663f391fa4f119685d5c14489b94661ea126fTim Murray
2944460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramBindConstants",          "(JJIJ)V",                               (void*)nProgramBindConstants },
2945460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramBindTexture",            "(JJIJ)V",                               (void*)nProgramBindTexture },
2946460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramBindSampler",            "(JJIJ)V",                               (void*)nProgramBindSampler },
2947eff663f391fa4f119685d5c14489b94661ea126fTim Murray
29489807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnProgramFragmentCreate",         "(JLjava/lang/String;[Ljava/lang/String;[J)J",              (void*)nProgramFragmentCreate },
2949460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramRasterCreate",           "(JZI)J",                                (void*)nProgramRasterCreate },
29509807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnProgramVertexCreate",           "(JLjava/lang/String;[Ljava/lang/String;[J)J",              (void*)nProgramVertexCreate },
2951eff663f391fa4f119685d5c14489b94661ea126fTim Murray
295278c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindRootScript",         "(JJ)V",                                 (void*)nContextBindRootScript },
295378c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramStore",       "(JJ)V",                                 (void*)nContextBindProgramStore },
295478c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramFragment",    "(JJ)V",                                 (void*)nContextBindProgramFragment },
295578c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramVertex",      "(JJ)V",                                 (void*)nContextBindProgramVertex },
295678c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramRaster",      "(JJ)V",                                 (void*)nContextBindProgramRaster },
2957eff663f391fa4f119685d5c14489b94661ea126fTim Murray
29580e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnSamplerCreate",                 "(JIIIIIF)J",                            (void*)nSamplerCreate },
2959eff663f391fa4f119685d5c14489b94661ea126fTim Murray
29609807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnMeshCreate",                    "(J[J[J[I)J",                            (void*)nMeshCreate },
2961eff663f391fa4f119685d5c14489b94661ea126fTim Murray
2962460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnMeshGetVertexBufferCount",      "(JJ)I",                                 (void*)nMeshGetVertexBufferCount },
2963460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnMeshGetIndexCount",             "(JJ)I",                                 (void*)nMeshGetIndexCount },
29649807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnMeshGetVertices",               "(JJ[JI)V",                              (void*)nMeshGetVertices },
29659807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnMeshGetIndices",                "(JJ[J[II)V",                            (void*)nMeshGetIndices },
296680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
296756f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray{"rsnSystemGetPointerSize",          "()I",                                   (void*)nSystemGetPointerSize },
29680facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang{"rsnAllocationGetByteBuffer",       "(JJ[JIII)Ljava/nio/ByteBuffer;",        (void*)nAllocationGetByteBuffer },
2969d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams};
2970d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2971d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic int registerFuncs(JNIEnv *_env)
2972d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
2973d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return android::AndroidRuntime::registerNativeMethods(
2974d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            _env, classPathName, methods, NELEM(methods));
2975d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2976d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2977d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
2978d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2979d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsjint JNI_OnLoad(JavaVM* vm, void* reserved)
2980d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
2981488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    JNIEnv* env = nullptr;
2982d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    jint result = -1;
2983d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2984d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
29853762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: GetEnv failed\n");
2986d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        goto bail;
2987d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
2988488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    assert(env != nullptr);
2989d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2990d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (registerFuncs(env) < 0) {
29910e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat        ALOGE("ERROR: Renderscript native registration failed\n");
2992d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        goto bail;
2993d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
2994d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2995d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    /* success -- return valid version number */
2996d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    result = JNI_VERSION_1_4;
2997d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2998d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsbail:
2999d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return result;
3000d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
3001