android_renderscript_RenderScript.cpp revision 86c5c2dab70b03bf0823ef4d9167b0a6b69c0742
1d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams/*
24cbe25a86b4aa3353c8016a129028671e902611fStephen Hines * Copyright (C) 2011-2012 The Android Open Source Project
3d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *
4d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * you may not use this file except in compliance with the License.
6d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * You may obtain a copy of the License at
7d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *
8d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *
10d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Unless required by applicable law or agreed to in writing, software
11d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * See the License for the specific language governing permissions and
14d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * limitations under the License.
15d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams */
16d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
17d1516dffa8d676fcad092d9736163829e6d0fdceJason Sams#define LOG_TAG "RenderScript_jni"
18f29ca50d80e3dc379de1642e85b7963175b2ca38Jason Sams
19d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include <stdlib.h>
20d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include <stdio.h>
21d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include <fcntl.h>
22d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include <unistd.h>
23d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include <math.h>
24d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include <utils/misc.h>
2509993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer#include <inttypes.h>
26d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
27b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/Asset.h>
28b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/AssetManager.h>
29b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/ResourceTypes.h>
30f29ca50d80e3dc379de1642e85b7963175b2ca38Jason Sams
31d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "jni.h"
32d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "JNIHelp.h"
33d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "android_runtime/AndroidRuntime.h"
34ee956053d6e3f7a7a82e41853b9b251fdc226d7aJim Miller#include "android_runtime/android_view_Surface.h"
35b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk#include "android_runtime/android_util_AssetManager.h"
36f4faeac3525fe1ce3707ab785a1651aec367589dJohn Reck#include "android/graphics/GraphicsJNI.h"
37d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
381d6983af336b2b1d3a24aece58ce0850aa79e8a0Jason Sams#include <rs.h>
391d6983af336b2b1d3a24aece58ce0850aa79e8a0Jason Sams#include <rsEnv.h>
40fb9aa9f3ef11878caaf6fcfb5ea49ffb9f7abf33Jason Sams#include <gui/Surface.h>
41d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden#include <gui/GLConsumer.h>
42faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams#include <android_runtime/android_graphics_SurfaceTexture.h>
43d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
443762c311729fe9f3af085c14c5c1fb471d994c03Steve Block//#define LOG_API ALOGE
4567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampestatic constexpr bool kLogApi = false;
46d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
47d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsusing namespace android;
48d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
4967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampetemplate <typename... T>
5067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampevoid UNUSED(T... t) {}
5167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe
52414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines#define PER_ARRAY_TYPE(flag, fnc, readonly, ...) {                                      \
53e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    jint len = 0;                                                                       \
54488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    void *ptr = nullptr;                                                                \
5587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    void *srcPtr = nullptr;                                                             \
5621659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    size_t typeBytes = 0;                                                               \
57414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines    jint relFlag = 0;                                                                   \
58414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines    if (readonly) {                                                                     \
59414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        /* The on-release mode should only be JNI_ABORT for read-only accesses. */      \
6087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        /* readonly = true, also indicates we are copying to the allocation   . */      \
61414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        relFlag = JNI_ABORT;                                                            \
62414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines    }                                                                                   \
63e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    switch(dataType) {                                                                  \
64e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_FLOAT_32:                                                              \
65e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jfloatArray)data);                                  \
66e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetFloatArrayElements((jfloatArray)data, flag);                     \
67ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
68ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
69ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
70ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
7121659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 4;                                                                  \
7287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
7387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
7487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
7587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
7687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
7787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
7887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
7987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
8087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
8187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
8287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
8387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
8487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
8587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
8687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
8787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
8887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
8987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
9087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
91414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseFloatArrayElements((jfloatArray)data, (jfloat *)ptr, relFlag);     \
92e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
93e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_FLOAT_64:                                                              \
94e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jdoubleArray)data);                                 \
95e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetDoubleArrayElements((jdoubleArray)data, flag);                   \
96ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
97ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
98ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
99ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
10021659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 8;                                                                  \
10187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
10287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
10387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
10487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
10587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
10687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
10787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
10887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
10987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
11087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
11187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
11287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
11387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
11487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
11587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
11687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
11787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
11887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
11987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
120414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseDoubleArrayElements((jdoubleArray)data, (jdouble *)ptr, relFlag);  \
121e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
122e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_SIGNED_8:                                                              \
123e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_UNSIGNED_8:                                                            \
124e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jbyteArray)data);                                   \
125e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetByteArrayElements((jbyteArray)data, flag);                       \
126ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
127ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
128ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
129ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
13021659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 1;                                                                  \
13187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
13287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
13387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
13487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
13587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
13687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
13787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
13887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
13987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
14087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
14187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
14287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
14387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
14487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
14587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
14687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
14787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
14887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
14987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
150414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseByteArrayElements((jbyteArray)data, (jbyte*)ptr, relFlag);         \
151e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
152e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_SIGNED_16:                                                             \
153e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_UNSIGNED_16:                                                           \
1541333215d8e61c1cbcabb551ac9a49a801f90ca76Pirama Arumuga Nainar    case RS_TYPE_FLOAT_16:                                                              \
155e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jshortArray)data);                                  \
156e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetShortArrayElements((jshortArray)data, flag);                     \
157ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
158ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
159ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
160ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
16121659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 2;                                                                  \
16287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
16387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
16487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
16587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
16687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
16787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
16887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
16987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
17087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
17187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
17287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
17387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
17487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
17587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
17687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
17787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
17887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
17987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
18087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
181414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseShortArrayElements((jshortArray)data, (jshort *)ptr, relFlag);     \
182e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
183e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_SIGNED_32:                                                             \
184e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_UNSIGNED_32:                                                           \
185e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jintArray)data);                                    \
186e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetIntArrayElements((jintArray)data, flag);                         \
187ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
188ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
189ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
190ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
19121659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 4;                                                                  \
19287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
19387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
19487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
19587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
19687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
19787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
19887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
19987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
20087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
20187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
20287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
20387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
20487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
20587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
20687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
20787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
20887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
20987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
21087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
211414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseIntArrayElements((jintArray)data, (jint *)ptr, relFlag);           \
212e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
213e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_SIGNED_64:                                                             \
214e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_UNSIGNED_64:                                                           \
215e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jlongArray)data);                                   \
216e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetLongArrayElements((jlongArray)data, flag);                       \
217ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
218ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
219ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
220ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
22121659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 8;                                                                  \
22287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
22387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
22487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
22587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
22687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
22787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
22887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
22987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
23087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
23187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
23287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
23387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
23487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
23587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
23687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
23787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
23887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
23987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
24087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
241414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseLongArrayElements((jlongArray)data, (jlong *)ptr, relFlag);        \
242e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
243e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    default:                                                                            \
244e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        break;                                                                          \
245e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    }                                                                                   \
24687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    UNUSED(len, ptr, srcPtr, typeBytes, relFlag);                                       \
247e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams}
248e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams
249e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams
250b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchoukclass AutoJavaStringToUTF8 {
251b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchoukpublic:
2522123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringToUTF8(JNIEnv* env, jstring str) : fEnv(env), fJStr(str) {
253488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        fCStr = env->GetStringUTFChars(str, nullptr);
254b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        fLength = env->GetStringUTFLength(str);
255b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
2562123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    ~AutoJavaStringToUTF8() {
257b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        fEnv->ReleaseStringUTFChars(fJStr, fCStr);
258b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
259b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    const char* c_str() const { return fCStr; }
260b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    jsize length() const { return fLength; }
261b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
262b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchoukprivate:
263b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    JNIEnv*     fEnv;
264b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    jstring     fJStr;
265b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    const char* fCStr;
266b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    jsize       fLength;
267b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk};
268b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
2692123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchoukclass AutoJavaStringArrayToUTF8 {
2702123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchoukpublic:
2712123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8(JNIEnv* env, jobjectArray strings, jsize stringsLength)
2722123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    : mEnv(env), mStrings(strings), mStringsLength(stringsLength) {
273488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        mCStrings = nullptr;
274488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        mSizeArray = nullptr;
2752123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        if (stringsLength > 0) {
2762123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            mCStrings = (const char **)calloc(stringsLength, sizeof(char *));
2772123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            mSizeArray = (size_t*)calloc(stringsLength, sizeof(size_t));
2782123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            for (jsize ct = 0; ct < stringsLength; ct ++) {
2792123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
280488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes                mCStrings[ct] = mEnv->GetStringUTFChars(s, nullptr);
2812123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                mSizeArray[ct] = mEnv->GetStringUTFLength(s);
2822123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            }
2832123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        }
2842123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    }
2852123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    ~AutoJavaStringArrayToUTF8() {
2862123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        for (jsize ct=0; ct < mStringsLength; ct++) {
2872123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
2882123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            mEnv->ReleaseStringUTFChars(s, mCStrings[ct]);
2892123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        }
2902123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        free(mCStrings);
2912123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        free(mSizeArray);
2922123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    }
2932123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char **c_str() const { return mCStrings; }
2942123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t *c_str_len() const { return mSizeArray; }
2952123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    jsize length() const { return mStringsLength; }
2962123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
2972123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchoukprivate:
2982123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    JNIEnv      *mEnv;
2992123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    jobjectArray mStrings;
3002123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char **mCStrings;
3012123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t      *mSizeArray;
3022123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    jsize        mStringsLength;
3032123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk};
3042123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
305d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
306d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
307ffe9f48890dde7173a0845d32887fdf94a49b0a7Jason Samsstatic jfieldID gContextId = 0;
308d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
309d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void _nInit(JNIEnv *_env, jclass _this)
310d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
311eff663f391fa4f119685d5c14489b94661ea126fTim Murray    gContextId             = _env->GetFieldID(_this, "mContext", "J");
312d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
313d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
314d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
315d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
31687e908dfdece91b5f504386d4901fa3342dc8083Miao Wangstatic void copyWithPadding(void* ptr, void* srcPtr, int mSize, int count) {
31787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int sizeBytesPad = mSize * 4;
31887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int sizeBytes = mSize * 3;
31987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    uint8_t *dst = static_cast<uint8_t *>(ptr);
32087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    uint8_t *src = static_cast<uint8_t *>(srcPtr);
32187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    for (int i = 0; i < count; i++) {
32287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        memcpy(dst, src, sizeBytes);
32387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        dst += sizeBytesPad;
32487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        src += sizeBytes;
32587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    }
32687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang}
32787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang
32887e908dfdece91b5f504386d4901fa3342dc8083Miao Wangstatic void copyWithUnPadding(void* ptr, void* srcPtr, int mSize, int count) {
32987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int sizeBytesPad = mSize * 4;
33087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int sizeBytes = mSize * 3;
33187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    uint8_t *dst = static_cast<uint8_t *>(ptr);
33287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    uint8_t *src = static_cast<uint8_t *>(srcPtr);
33387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    for (int i = 0; i < count; i++) {
33487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        memcpy(dst, src, sizeBytes);
33587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        dst += sizeBytes;
33687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        src += sizeBytesPad;
33787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    }
33887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang}
33987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang
34087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang
34187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang// ---------------------------------------------------------------------------
3423eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Samsstatic void
343eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextFinish(JNIEnv *_env, jobject _this, jlong con)
34496ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams{
34567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
34667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextFinish, con(%p)", (RsContext)con);
34767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
348eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextFinish((RsContext)con);
34996ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams}
35096ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams
351281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic jlong
352281c3252510bcf4120d17fa0125f369c2c78f162Yang NinClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong kernelID,
353281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni               jlong returnValue, jlongArray fieldIDArray,
354281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni               jlongArray valueArray, jintArray sizeArray,
355281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni               jlongArray depClosureArray, jlongArray depFieldIDArray) {
35617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong ret = 0;
35717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
358281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
359281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
360ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jFieldIDs == nullptr) {
361ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: fieldIDs.");
362ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
363ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
364ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
36517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
36617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize values_length = _env->GetArrayLength(valueArray);
367ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jValues == nullptr) {
368ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: values.");
369ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
370ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
371ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
37217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
37317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize sizes_length = _env->GetArrayLength(sizeArray);
374ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jSizes == nullptr) {
375ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: sizes.");
376ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
377ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
378ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
37917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong* jDepClosures =
38017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      _env->GetLongArrayElements(depClosureArray, nullptr);
38117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize depClosures_length = _env->GetArrayLength(depClosureArray);
382ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jDepClosures == nullptr) {
383ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: depClosures.");
384ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
385ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
386ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
38717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong* jDepFieldIDs =
38817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      _env->GetLongArrayElements(depFieldIDArray, nullptr);
38917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize depFieldIDs_length = _env->GetArrayLength(depFieldIDArray);
390ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jDepFieldIDs == nullptr) {
391ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: depFieldIDs.");
392ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
393ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
39417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
39517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  size_t numValues, numDependencies;
39617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsScriptFieldID* fieldIDs;
39717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsClosure* depClosures;
39817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsScriptFieldID* depFieldIDs;
39917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
40017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (fieldIDs_length != values_length || values_length != sizes_length) {
40117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Unmatched field IDs, values, and sizes in closure creation.");
40217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
40317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
40417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
40517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  numValues = (size_t)fieldIDs_length;
40617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
40717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (depClosures_length != depFieldIDs_length) {
40817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Unmatched closures and field IDs for dependencies in closure creation.");
40917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
41017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
41117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
41217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  numDependencies = (size_t)depClosures_length;
41317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
41417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (numDependencies > numValues) {
41517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Unexpected number of dependencies in closure creation");
41617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
41717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
41817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
4197b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni  if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
42017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Too many arguments or globals in closure creation");
42117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
42217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
42317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
42486c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni  if (numValues > 0) {
42586c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
42686c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      if (fieldIDs == nullptr) {
42786c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni          goto exit;
42886c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      }
42986c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni  } else {
43086c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      // numValues == 0
43186c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      // alloca(0) implementation is platform-dependent.
43286c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      fieldIDs = nullptr;
43317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
43417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
43517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  for (size_t i = 0; i < numValues; i++) {
436281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni    fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
437281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  }
438281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
43986c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni  if (numDependencies > 0) {
44086c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      depClosures = (RsClosure*)alloca(sizeof(RsClosure) * numDependencies);
44186c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      if (depClosures == nullptr) {
44286c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni          goto exit;
44386c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      }
44486c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni
44586c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      for (size_t i = 0; i < numDependencies; i++) {
44686c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni          depClosures[i] = (RsClosure)jDepClosures[i];
44786c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      }
44886c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni
44986c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      depFieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numDependencies);
45086c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      if (depFieldIDs == nullptr) {
45186c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni          goto exit;
45286c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      }
45386c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni
45486c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      for (size_t i = 0; i < numDependencies; i++) {
45586c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni          depFieldIDs[i] = (RsClosure)jDepFieldIDs[i];
45686c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      }
45786c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni  } else {
45886c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      // alloca(0) implementation is platform-dependent.
45986c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      depClosures = nullptr;
46086c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni      depFieldIDs = nullptr;
461281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  }
462281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
46317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  ret = (jlong)(uintptr_t)rsClosureCreate(
464281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni      (RsContext)con, (RsScriptKernelID)kernelID, (RsAllocation)returnValue,
465263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni      fieldIDs, numValues, jValues, numValues,
46617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      (int*)jSizes, numValues,
46717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      depClosures, numDependencies,
46817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      depFieldIDs, numDependencies);
46917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
47017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Niexit:
47117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
47217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(depFieldIDArray, jDepFieldIDs, JNI_ABORT);
47317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(depClosureArray, jDepClosures, JNI_ABORT);
47417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseIntArrayElements (sizeArray,       jSizes,       JNI_ABORT);
47517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(valueArray,      jValues,      JNI_ABORT);
47617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(fieldIDArray,    jFieldIDs,    JNI_ABORT);
47717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
47817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  return ret;
479281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
480281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
481be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Nistatic jlong
482be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang NinInvokeClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong invokeID,
483be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni                     jbyteArray paramArray, jlongArray fieldIDArray, jlongArray valueArray,
484be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni                     jintArray sizeArray) {
48517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong ret = 0;
48617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
487be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jbyte* jParams = _env->GetByteArrayElements(paramArray, nullptr);
488be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jsize jParamLength = _env->GetArrayLength(paramArray);
489ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jParams == nullptr) {
490ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: params.");
491ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
492ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
493ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
494be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
495be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
496ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jFieldIDs == nullptr) {
497ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: fieldIDs.");
498ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
499ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
500ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
50117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
50217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize values_length = _env->GetArrayLength(valueArray);
503ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jValues == nullptr) {
504ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: values.");
505ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
506ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
507ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
50817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
50917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize sizes_length = _env->GetArrayLength(sizeArray);
510ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jSizes == nullptr) {
511ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: sizes.");
512ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
513ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
51417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
51517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  size_t numValues;
51617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsScriptFieldID* fieldIDs;
51717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
51817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (fieldIDs_length != values_length || values_length != sizes_length) {
51917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Unmatched field IDs, values, and sizes in closure creation.");
52017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
52117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
52217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
52317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  numValues = (size_t) fieldIDs_length;
52417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
5257b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni  if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
52617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Too many arguments or globals in closure creation");
52717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
52817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
52917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
53017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
53117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (fieldIDs == nullptr) {
53217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
53317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
53417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
53517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  for (size_t i = 0; i< numValues; i++) {
536be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
537be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  }
538be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
53917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  ret = (jlong)(uintptr_t)rsInvokeClosureCreate(
540be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni      (RsContext)con, (RsScriptInvokeID)invokeID, jParams, jParamLength,
541263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni      fieldIDs, numValues, jValues, numValues,
54217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      (int*)jSizes, numValues);
54317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
54417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Niexit:
54517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
54617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseIntArrayElements (sizeArray,       jSizes,       JNI_ABORT);
54717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(valueArray,      jValues,      JNI_ABORT);
54817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(fieldIDArray,    jFieldIDs,    JNI_ABORT);
54917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseByteArrayElements(paramArray,      jParams,      JNI_ABORT);
55017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
55117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  return ret;
552be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni}
553be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
554281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic void
555281c3252510bcf4120d17fa0125f369c2c78f162Yang NinClosureSetArg(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
556281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni               jint index, jlong value, jint size) {
557263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni  // Size is signed with -1 indicating the value is an Allocation
558281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  rsClosureSetArg((RsContext)con, (RsClosure)closureID, (uint32_t)index,
559263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni                  (uintptr_t)value, size);
560281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
561281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
562281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic void
563281c3252510bcf4120d17fa0125f369c2c78f162Yang NinClosureSetGlobal(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
564281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni                  jlong fieldID, jlong value, jint size) {
565263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni  // Size is signed with -1 indicating the value is an Allocation
566281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  rsClosureSetGlobal((RsContext)con, (RsClosure)closureID,
567263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni                     (RsScriptFieldID)fieldID, (int64_t)value, size);
568281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
569281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
570281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic long
57135be56cce821d86f69026398ff9433e2d173b02fYang NinScriptGroup2Create(JNIEnv *_env, jobject _this, jlong con, jstring name,
572ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni                    jstring cacheDir, jlongArray closureArray) {
57317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong ret = 0;
57417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
57535be56cce821d86f69026398ff9433e2d173b02fYang Ni  AutoJavaStringToUTF8 nameUTF(_env, name);
576ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni  AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
577ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni
578281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  jlong* jClosures = _env->GetLongArrayElements(closureArray, nullptr);
579281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  jsize numClosures = _env->GetArrayLength(closureArray);
580ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jClosures == nullptr) {
581ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: closures.");
582ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
583ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
58417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
58517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsClosure* closures;
58617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
5877b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni  if (numClosures > (jsize) RS_SCRIPT_GROUP_MAX_NUMBER_CLOSURES) {
58817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni    ALOGE("Too many closures in script group");
58917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni    goto exit;
59017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
59117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
59217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  closures = (RsClosure*)alloca(sizeof(RsClosure) * numClosures);
59317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (closures == nullptr) {
59417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
59517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
59617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
597281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  for (int i = 0; i < numClosures; i++) {
598281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni    closures[i] = (RsClosure)jClosures[i];
599281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  }
600281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
60117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  ret = (jlong)(uintptr_t)rsScriptGroup2Create(
60235be56cce821d86f69026398ff9433e2d173b02fYang Ni      (RsContext)con, nameUTF.c_str(), nameUTF.length(),
60335be56cce821d86f69026398ff9433e2d173b02fYang Ni      cacheDirUTF.c_str(), cacheDirUTF.length(),
604ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni      closures, numClosures);
60517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
60617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Niexit:
60717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
60817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(closureArray, jClosures, JNI_ABORT);
60917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
61017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  return ret;
611281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
612281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
613281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic void
614281c3252510bcf4120d17fa0125f369c2c78f162Yang NinScriptGroup2Execute(JNIEnv *_env, jobject _this, jlong con, jlong groupID) {
615281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  rsScriptGroupExecute((RsContext)con, (RsScriptGroup2)groupID);
616281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
617281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
61896ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Samsstatic void
61925207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Single(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
62025207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
62125207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jfloat alpha, jlong A, jlong B, jfloat beta, jlong C, jint incX, jint incY,
62225207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint KL, jint KU) {
62325207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
62425207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
62525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
62625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
62725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
62825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
62925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
63025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
63125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
63225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
63325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
63425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.f = alpha;
63525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.f = beta;
63625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
63725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
63825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
63925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
64025207df658d6a8a3e885c7017fcc25702363583cTim Murray
64125207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
64225207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
64325207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
64425207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
64525207df658d6a8a3e885c7017fcc25702363583cTim Murray
64625207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
64725207df658d6a8a3e885c7017fcc25702363583cTim Murray                         in_allocs, sizeof(in_allocs), nullptr,
64825207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
64925207df658d6a8a3e885c7017fcc25702363583cTim Murray}
65025207df658d6a8a3e885c7017fcc25702363583cTim Murray
65125207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
65225207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Double(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
65325207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
65425207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jdouble alpha, jlong A, jlong B, jdouble beta, jlong C, jint incX, jint incY,
65525207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint KL, jint KU) {
65625207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
65725207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
65825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
65925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
66025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
66125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
66225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
66325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
66425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
66525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
66625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
66725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.d = alpha;
66825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.d = beta;
66925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
67025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
67125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
67225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
67325207df658d6a8a3e885c7017fcc25702363583cTim Murray
67425207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
67525207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
67625207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
67725207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
67825207df658d6a8a3e885c7017fcc25702363583cTim Murray
67925207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
6800b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
68125207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
68225207df658d6a8a3e885c7017fcc25702363583cTim Murray}
68325207df658d6a8a3e885c7017fcc25702363583cTim Murray
68425207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
68525207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Complex(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
68625207df658d6a8a3e885c7017fcc25702363583cTim Murray                             jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
68725207df658d6a8a3e885c7017fcc25702363583cTim Murray                             jfloat alphaX, jfloat alphaY, jlong A, jlong B, jfloat betaX,
68825207df658d6a8a3e885c7017fcc25702363583cTim Murray                             jfloat betaY, jlong C, jint incX, jint incY, jint KL, jint KU) {
68925207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
69025207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
69125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
69225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
69325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
69425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
69525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
69625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
69725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
69825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
69925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
70025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.c.r = alphaX;
70125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.c.i = alphaY;
70225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.c.r = betaX;
70382585b3906955e57e199d962b8fe11b2bab87fbaMiao Wang    call.beta.c.i = betaY;
70425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
70525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
70625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
70725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
70825207df658d6a8a3e885c7017fcc25702363583cTim Murray
70925207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
71025207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
71125207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
71225207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
71325207df658d6a8a3e885c7017fcc25702363583cTim Murray
71425207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7150b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
71625207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
71725207df658d6a8a3e885c7017fcc25702363583cTim Murray}
71825207df658d6a8a3e885c7017fcc25702363583cTim Murray
71925207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
72025207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Z(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
72125207df658d6a8a3e885c7017fcc25702363583cTim Murray                       jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
72225207df658d6a8a3e885c7017fcc25702363583cTim Murray                       jdouble alphaX, jdouble alphaY, jlong A, jlong B, jdouble betaX,
72325207df658d6a8a3e885c7017fcc25702363583cTim Murray                       jdouble betaY, jlong C, jint incX, jint incY, jint KL, jint KU) {
72425207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
72525207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
72625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
72725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
72825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
72925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
73025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
73125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
73225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
73325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
73425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
73525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.z.r = alphaX;
73625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.z.i = alphaY;
73725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.z.r = betaX;
73882585b3906955e57e199d962b8fe11b2bab87fbaMiao Wang    call.beta.z.i = betaY;
73925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
74025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
74125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
74225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
74325207df658d6a8a3e885c7017fcc25702363583cTim Murray
74425207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
74525207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
74625207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
74725207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
74825207df658d6a8a3e885c7017fcc25702363583cTim Murray
74925207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7500b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
75125207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
75225207df658d6a8a3e885c7017fcc25702363583cTim Murray}
75325207df658d6a8a3e885c7017fcc25702363583cTim Murray
75425207df658d6a8a3e885c7017fcc25702363583cTim Murray
75525207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
7569cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim MurraynScriptIntrinsicBLAS_BNNM(JNIEnv *_env, jobject _this, jlong con, jlong id, jint M, jint N, jint K,
7579cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray                                             jlong A, jint a_offset, jlong B, jint b_offset, jlong C, jint c_offset,
7589cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray                                             jint c_mult_int) {
7599cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    RsBlasCall call;
7609cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    memset(&call, 0, sizeof(call));
7619cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.func = RsBlas_bnnm;
7629cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.M = M;
7639cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.N = N;
7649cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.K = K;
7652514806817ec394d334595d76e20f3129117da6eMiao Wang    call.a_offset = a_offset & 0xFF;
7662514806817ec394d334595d76e20f3129117da6eMiao Wang    call.b_offset = b_offset & 0xFF;
7679cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.c_offset = c_offset;
7689cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.c_mult_int = c_mult_int;
7699cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7709cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    RsAllocation in_allocs[3];
7719cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    in_allocs[0] = (RsAllocation)A;
7729cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    in_allocs[1] = (RsAllocation)B;
7739cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    in_allocs[2] = (RsAllocation)C;
7749cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7759cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7760b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
7779cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray                         &call, sizeof(call), nullptr, 0);
7789cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray}
7799cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7809cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7819cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murraystatic void
782460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAssignName(JNIEnv *_env, jobject _this, jlong con, jlong obj, jbyteArray str)
7833eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams{
78467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
78567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAssignName, con(%p), obj(%p)", (RsContext)con, (void *)obj);
78667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
7873eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    jint len = _env->GetArrayLength(str);
7883eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    jbyte * cptr = (jbyte *) _env->GetPrimitiveArrayCritical(str, 0);
789ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (cptr == nullptr) {
790ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
791ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
792ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
793ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
794eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAssignName((RsContext)con, (void *)obj, (const char *)cptr, len);
7953eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    _env->ReleasePrimitiveArrayCritical(str, cptr, JNI_ABORT);
7963eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams}
7973eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams
798fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchoukstatic jstring
799460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynGetName(JNIEnv *_env, jobject _this, jlong con, jlong obj)
800fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk{
80167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
80267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nGetName, con(%p), obj(%p)", (RsContext)con, (void *)obj);
80367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
804488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    const char *name = nullptr;
805eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaGetName((RsContext)con, (void *)obj, &name);
806488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if(name == nullptr || strlen(name) == 0) {
807488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        return nullptr;
808581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk    }
809fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk    return _env->NewStringUTF(name);
810fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk}
811fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk
8127ce033d797e5df5e2131e2ed459fba181eaf4658Jason Samsstatic void
813460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj)
8147ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams{
81567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
81667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj);
81767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
818eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsObjDestroy((RsContext)con, (void *)obj);
8197ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams}
8207ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams
8213eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams// ---------------------------------------------------------------------------
8223eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams
823eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic jlong
824d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsnDeviceCreate(JNIEnv *_env, jobject _this)
825d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
82667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
82767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nDeviceCreate");
82867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
8293aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsDeviceCreate();
830d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
831d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
832d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
8335eaf468434e96bc7c8d4cfeb138699a1c7b256caTim MurraynDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev)
834d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
83567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
83667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nDeviceDestroy");
83767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
838d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return rsDeviceDestroy((RsDevice)dev);
839d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
840d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
841ebfb436a49673693b98469683451bd9ede797557Jason Samsstatic void
8425eaf468434e96bc7c8d4cfeb138699a1c7b256caTim MurraynDeviceSetConfig(JNIEnv *_env, jobject _this, jlong dev, jint p, jint value)
843ebfb436a49673693b98469683451bd9ede797557Jason Sams{
84467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
84567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nDeviceSetConfig  dev(%p), param(%i), value(%i)", (void *)dev, p, value);
84667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
847ebfb436a49673693b98469683451bd9ede797557Jason Sams    return rsDeviceSetConfig((RsDevice)dev, (RsDeviceParam)p, value);
848ebfb436a49673693b98469683451bd9ede797557Jason Sams}
849ebfb436a49673693b98469683451bd9ede797557Jason Sams
850eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic jlong
85181cd2b18bd36285d1843f78418282e1dad156fbdJason SamsnContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint flags, jint sdkVer, jint contextType)
852d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
85367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
85467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextCreate");
85567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
85681cd2b18bd36285d1843f78418282e1dad156fbdJason Sams    return (jlong)(uintptr_t)rsContextCreate((RsDevice)dev, 0, sdkVer, (RsContextType)contextType, flags);
857704ff64b099406bb328898a7443921f22dbffd6dJason Sams}
858704ff64b099406bb328898a7443921f22dbffd6dJason Sams
859eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic jlong
8605eaf468434e96bc7c8d4cfeb138699a1c7b256caTim MurraynContextCreateGL(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer,
8610e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint colorMin, jint colorPref,
8620e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint alphaMin, jint alphaPref,
8630e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint depthMin, jint depthPref,
8640e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint stencilMin, jint stencilPref,
8650e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint samplesMin, jint samplesPref, jfloat samplesQ,
8660e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint dpi)
86711c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams{
86886c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni    RsSurfaceConfig sc = {};
86911c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.alphaMin = alphaMin;
87011c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.alphaPref = alphaPref;
87111c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.colorMin = colorMin;
87211c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.colorPref = colorPref;
87311c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.depthMin = depthMin;
87411c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.depthPref = depthPref;
87511c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.samplesMin = samplesMin;
87611c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.samplesPref = samplesPref;
87711c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.samplesQ = samplesQ;
87811c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams
87967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
88067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextCreateGL");
88167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
8823aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsContextCreateGL((RsDevice)dev, ver, sdkVer, sc, dpi);
883d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
884d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
885d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
886eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextSetPriority(JNIEnv *_env, jobject _this, jlong con, jint p)
8877d787b4722eaeb79cab42c36060336e092b77b5fJason Sams{
88867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
88967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("ContextSetPriority, con(%p), priority(%i)", (RsContext)con, p);
89067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
891eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextSetPriority((RsContext)con, p);
8927d787b4722eaeb79cab42c36060336e092b77b5fJason Sams}
8937d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
89447f31582b67f492d9e1523abd0d8b86c38ec007dTim Murraystatic void
89547f31582b67f492d9e1523abd0d8b86c38ec007dTim MurraynContextSetCacheDir(JNIEnv *_env, jobject _this, jlong con, jstring cacheDir)
89647f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray{
89747f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
89847f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray
89947f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    if (kLogApi) {
90047f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray        ALOGD("ContextSetCacheDir, con(%p), cacheDir(%s)", (RsContext)con, cacheDirUTF.c_str());
90147f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    }
90247f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    rsContextSetCacheDir((RsContext)con, cacheDirUTF.c_str(), cacheDirUTF.length());
90347f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray}
90447f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray
9057d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
9067d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
9077d787b4722eaeb79cab42c36060336e092b77b5fJason Samsstatic void
908eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextSetSurface(JNIEnv *_env, jobject _this, jlong con, jint width, jint height, jobject wnd)
909efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams{
91067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
91167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextSetSurface, con(%p), width(%i), height(%i), surface(%p)", (RsContext)con,
91267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              width, height, (Surface *)wnd);
91367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
914efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
915488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    ANativeWindow * window = nullptr;
916488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (wnd == nullptr) {
917efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
918efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams    } else {
91964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        window = android_view_Surface_getNativeWindow(_env, wnd).get();
920efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams    }
921efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
922eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextSetSurface((RsContext)con, width, height, window);
923efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams}
924efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
925efd9b6fb2e0f31b50db089352118e5daeb268879Jason Samsstatic void
926eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextDestroy(JNIEnv *_env, jobject _this, jlong con)
927d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
92867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
92967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextDestroy, con(%p)", (RsContext)con);
93067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
931eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextDestroy((RsContext)con);
932d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
933d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
934715333b832fb448c32165c7d97d408a3fa43f7cbJason Samsstatic void
935eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextDump(JNIEnv *_env, jobject _this, jlong con, jint bits)
936715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams{
93767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
93867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextDump, con(%p)  bits(%i)", (RsContext)con, bits);
93967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
940715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams    rsContextDump((RsContext)con, bits);
941715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams}
942d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
943d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
944eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextPause(JNIEnv *_env, jobject _this, jlong con)
94565e7aa56f56097418d617663683544c25b3988eaJason Sams{
94667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
94767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextPause, con(%p)", (RsContext)con);
94867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
949eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextPause((RsContext)con);
95065e7aa56f56097418d617663683544c25b3988eaJason Sams}
95165e7aa56f56097418d617663683544c25b3988eaJason Sams
95265e7aa56f56097418d617663683544c25b3988eaJason Samsstatic void
953eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextResume(JNIEnv *_env, jobject _this, jlong con)
95465e7aa56f56097418d617663683544c25b3988eaJason Sams{
95567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
95667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextResume, con(%p)", (RsContext)con);
95767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
958eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextResume((RsContext)con);
95965e7aa56f56097418d617663683544c25b3988eaJason Sams}
96065e7aa56f56097418d617663683544c25b3988eaJason Sams
9611c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
9621c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Samsstatic jstring
963eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextGetErrorMessage(JNIEnv *_env, jobject _this, jlong con)
9641c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams{
96567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
96667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextGetErrorMessage, con(%p)", (RsContext)con);
96767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
9681c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    char buf[1024];
9691c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
9701c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    size_t receiveLen;
9711c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    uint32_t subID;
972eff663f391fa4f119685d5c14489b94661ea126fTim Murray    int id = rsContextGetMessage((RsContext)con,
97365bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 buf, sizeof(buf),
97465bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 &receiveLen, sizeof(receiveLen),
975edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                                 &subID, sizeof(subID));
9761c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    if (!id && receiveLen) {
97709993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGV("message receive buffer too small.  %zu", receiveLen);
9781c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    }
9791c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    return _env->NewStringUTF(buf);
9801c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams}
9811c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
982edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Samsstatic jint
983eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextGetUserMessage(JNIEnv *_env, jobject _this, jlong con, jintArray data)
984516c31911578db8ce53529483c3ded918ac7dc6bJason Sams{
985516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    jint len = _env->GetArrayLength(data);
98667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
98767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextGetMessage, con(%p), len(%i)", (RsContext)con, len);
98867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
989488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *ptr = _env->GetIntArrayElements(data, nullptr);
990ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
991ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
992ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
993ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
994516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    size_t receiveLen;
9951c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    uint32_t subID;
996eff663f391fa4f119685d5c14489b94661ea126fTim Murray    int id = rsContextGetMessage((RsContext)con,
99765bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 ptr, len * 4,
99865bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 &receiveLen, sizeof(receiveLen),
999edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                                 &subID, sizeof(subID));
1000516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    if (!id && receiveLen) {
100109993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGV("message receive buffer too small.  %zu", receiveLen);
1002516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    }
1003516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    _env->ReleaseIntArrayElements(data, ptr, 0);
10040e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    return (jint)id;
10051c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams}
10061c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
10071c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Samsstatic jint
1008eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextPeekMessage(JNIEnv *_env, jobject _this, jlong con, jintArray auxData)
10091c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams{
101067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
101167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextPeekMessage, con(%p)", (RsContext)con);
101267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1013488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *auxDataPtr = _env->GetIntArrayElements(auxData, nullptr);
1014ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (auxDataPtr == nullptr) {
1015ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1016ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
1017ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
10181c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    size_t receiveLen;
10191c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    uint32_t subID;
1020eff663f391fa4f119685d5c14489b94661ea126fTim Murray    int id = rsContextPeekMessage((RsContext)con, &receiveLen, sizeof(receiveLen),
1021edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                                  &subID, sizeof(subID));
10221c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    auxDataPtr[0] = (jint)subID;
10231c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    auxDataPtr[1] = (jint)receiveLen;
10241c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    _env->ReleaseIntArrayElements(auxData, auxDataPtr, 0);
10250e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    return (jint)id;
1026516c31911578db8ce53529483c3ded918ac7dc6bJason Sams}
1027516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1028eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic void nContextInitToClient(JNIEnv *_env, jobject _this, jlong con)
1029516c31911578db8ce53529483c3ded918ac7dc6bJason Sams{
103067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
103167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextInitToClient, con(%p)", (RsContext)con);
103267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1033eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextInitToClient((RsContext)con);
1034516c31911578db8ce53529483c3ded918ac7dc6bJason Sams}
1035516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1036eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic void nContextDeinitToClient(JNIEnv *_env, jobject _this, jlong con)
1037516c31911578db8ce53529483c3ded918ac7dc6bJason Sams{
103867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
103967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextDeinitToClient, con(%p)", (RsContext)con);
104067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1041eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextDeinitToClient((RsContext)con);
1042516c31911578db8ce53529483c3ded918ac7dc6bJason Sams}
1043516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1044455d64426615e5d269a3bd05cd91b67c3811fcdfJason Samsstatic void
1045eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextSendMessage(JNIEnv *_env, jobject _this, jlong con, jint id, jintArray data)
1046455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams{
1047488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *ptr = nullptr;
1048455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    jint len = 0;
1049455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    if (data) {
1050455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams        len = _env->GetArrayLength(data);
10514a043c1853c117c1b4c4342e76cd16a5abdc1045Stephen Hines        ptr = _env->GetIntArrayElements(data, nullptr);
1052ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {
1053ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
1054ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
1055ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
1056455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    }
105767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
105867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextSendMessage, con(%p), id(%i), len(%i)", (RsContext)con, id, len);
105967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1060eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextSendMessage((RsContext)con, id, (const uint8_t *)ptr, len * sizeof(int));
1061455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    if (data) {
1062455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams        _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
1063455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    }
1064455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams}
1065455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams
1066455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams
1067516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1068460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
106967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind, jboolean norm,
107067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe               jint size)
1071d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
107267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
107309993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nElementCreate, con(%p), type(%" PRId64 "), kind(%i), norm(%i), size(%i)", (RsContext)con,
107467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              type, kind, norm, size);
107567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
107667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    return (jlong)(uintptr_t)rsElementCreate((RsContext)con, (RsDataType)type, (RsDataKind)kind,
10778c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                             norm, size);
1078d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1079d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1080460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1081eff663f391fa4f119685d5c14489b94661ea126fTim MurraynElementCreate2(JNIEnv *_env, jobject _this, jlong con,
10829807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                jlongArray _ids, jobjectArray _names, jintArray _arraySizes)
1083d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
1084718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    int fieldCount = _env->GetArrayLength(_ids);
108567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
108667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nElementCreate2, con(%p)", (RsContext)con);
108767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1088718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
1089488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jIds = _env->GetLongArrayElements(_ids, nullptr);
1090ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jIds == nullptr) {
1091ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: ids");
1092ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
1093ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1094488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *jArraySizes = _env->GetIntArrayElements(_arraySizes, nullptr);
1095ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jArraySizes == nullptr) {
1096ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: arraySizes");
1097ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
1098ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
10999807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
11009807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    RsElement *ids = (RsElement*)malloc(fieldCount * sizeof(RsElement));
11019807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uint32_t *arraySizes = (uint32_t *)malloc(fieldCount * sizeof(uint32_t));
11029807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
11039807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < fieldCount; i ++) {
11049807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        ids[i] = (RsElement)jIds[i];
11059807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        arraySizes[i] = (uint32_t)jArraySizes[i];
11069807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
1107718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
11082123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8 names(_env, _names, fieldCount);
11092123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
11102123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char **nameArray = names.c_str();
11112123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t *sizeArray = names.c_str_len();
11122123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
11133aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsElementCreate2((RsContext)con,
11149807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                                     (const RsElement *)ids, fieldCount,
11157a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                                     nameArray, fieldCount * sizeof(size_t),  sizeArray,
11168c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                     (const uint32_t *)arraySizes, fieldCount);
11172123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
11189807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(ids);
11199807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(arraySizes);
11209807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(_ids, jIds, JNI_ABORT);
11219807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseIntArrayElements(_arraySizes, jArraySizes, JNI_ABORT);
11229807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
11233aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)id;
1124d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1125d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1126dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchoukstatic void
1127460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynElementGetNativeData(JNIEnv *_env, jobject _this, jlong con, jlong id, jintArray _elementData)
1128dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
1129dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    int dataSize = _env->GetArrayLength(_elementData);
113067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
113167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nElementGetNativeData, con(%p)", (RsContext)con);
113267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1133dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1134dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
1135dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    assert(dataSize == 5);
1136dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
113778c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath    uintptr_t elementData[5];
1138eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaElementGetNativeData((RsContext)con, (RsElement)id, elementData, dataSize);
1139dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1140dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    for(jint i = 0; i < dataSize; i ++) {
11419807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        const jint data = (jint)elementData[i];
11429807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetIntArrayRegion(_elementData, i, 1, &data);
1143dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
1144dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1145dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1146dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1147dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchoukstatic void
1148460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynElementGetSubElements(JNIEnv *_env, jobject _this, jlong con, jlong id,
11499807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                       jlongArray _IDs,
11507d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                       jobjectArray _names,
11517d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                       jintArray _arraySizes)
1152dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
11539807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uint32_t dataSize = _env->GetArrayLength(_IDs);
115467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
115567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nElementGetSubElements, con(%p)", (RsContext)con);
115667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1157dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
11589807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t *ids = (uintptr_t*)malloc(dataSize * sizeof(uintptr_t));
11599807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    const char **names = (const char **)malloc(dataSize * sizeof(const char *));
116078c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath    uint32_t *arraySizes = (uint32_t *)malloc(dataSize * sizeof(uint32_t));
1161dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
116267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    rsaElementGetSubElements((RsContext)con, (RsElement)id, ids, names, arraySizes,
116367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                             (uint32_t)dataSize);
1164dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
11659807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(uint32_t i = 0; i < dataSize; i++) {
11663aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong id = (jlong)(uintptr_t)ids[i];
11679807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        const jint arraySize = (jint)arraySizes[i];
1168dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        _env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i]));
11699807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_IDs, i, 1, &id);
11709807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetIntArrayRegion(_arraySizes, i, 1, &arraySize);
1171dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
1172dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1173dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    free(ids);
1174dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    free(names);
11757d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    free(arraySizes);
1176dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1177dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1178d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// -----------------------------------
1179d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1180460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1181460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid,
1182b109cc78616abee7291eb42094cd156b5db3355dJason Sams            jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv)
1183d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
118467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
118567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)",
118609993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer              (RsContext)con, (void*)eid, dimx, dimy, dimz, mips, faces, yuv);
118767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
11883b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams
118967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    return (jlong)(uintptr_t)rsTypeCreate((RsContext)con, (RsElement)eid, dimx, dimy, dimz, mips,
11908c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                          faces, yuv);
1191d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1192d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1193dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchoukstatic void
11949807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnTypeGetNativeData(JNIEnv *_env, jobject _this, jlong con, jlong id, jlongArray _typeData)
1195dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
1196dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    // We are packing 6 items: mDimX; mDimY; mDimZ;
1197dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    // mDimLOD; mDimFaces; mElement; into typeData
1198dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    int elementCount = _env->GetArrayLength(_typeData);
1199dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1200dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    assert(elementCount == 6);
120167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
120267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nTypeGetNativeData, con(%p)", (RsContext)con);
120367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1204dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
12059807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t typeData[6];
1206eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaTypeGetNativeData((RsContext)con, (RsType)id, typeData, 6);
1207dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1208dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    for(jint i = 0; i < elementCount; i ++) {
12093aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong data = (jlong)(uintptr_t)typeData[i];
12109807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_typeData, i, 1, &data);
1211dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
1212dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1213dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1214d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// -----------------------------------
1215d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1216460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
121767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mips, jint usage,
121867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                       jlong pointer)
1219d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
122067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
122167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)",
122267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsContext)con, (RsElement)type, mips, usage, (void *)pointer);
122367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
122467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    return (jlong)(uintptr_t) rsAllocationCreateTyped((RsContext)con, (RsType)type,
122567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                                      (RsAllocationMipmapControl)mips,
12268c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                                      (uint32_t)usage, (uintptr_t)pointer);
1227d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1228d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1229d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1230460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationSyncAll(JNIEnv *_env, jobject _this, jlong con, jlong a, jint bits)
12315476b450e50939940dcf3f15c92335cee2fc572dJason Sams{
123267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
123367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationSyncAll, con(%p), a(%p), bits(0x%08x)", (RsContext)con, (RsAllocation)a,
123467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              bits);
123567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1236eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationSyncAll((RsContext)con, (RsAllocation)a, (RsAllocationUsageType)bits);
12375476b450e50939940dcf3f15c92335cee2fc572dJason Sams}
12385476b450e50939940dcf3f15c92335cee2fc572dJason Sams
12398c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wangstatic void
12408c1509249c5552270d8accc2c9512f499a8f5e2dMiao WangnAllocationSetupBufferQueue(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint numAlloc)
12418c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{
12428c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    if (kLogApi) {
12438c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang        ALOGD("nAllocationSetupBufferQueue, con(%p), alloc(%p), numAlloc(%d)", (RsContext)con,
12448c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang              (RsAllocation)alloc, numAlloc);
12458c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    }
12468c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    rsAllocationSetupBufferQueue((RsContext)con, (RsAllocation)alloc, (uint32_t)numAlloc);
12478c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang}
12488c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang
12498c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wangstatic void
12508c1509249c5552270d8accc2c9512f499a8f5e2dMiao WangnAllocationShareBufferQueue(JNIEnv *_env, jobject _this, jlong con, jlong alloc1, jlong alloc2)
12518c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{
12528c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    if (kLogApi) {
12538c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang        ALOGD("nAllocationShareBufferQueue, con(%p), alloc1(%p), alloc2(%p)", (RsContext)con,
12548c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang              (RsAllocation)alloc1, (RsAllocation)alloc2);
12558c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    }
12568c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang
12578c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    rsAllocationShareBufferQueue((RsContext)con, (RsAllocation)alloc1, (RsAllocation)alloc2);
12588c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang}
12598c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang
126072226e0543461133b9e177a3e78ae50b0c65e797Jason Samsstatic jobject
1261460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationGetSurface(JNIEnv *_env, jobject _this, jlong con, jlong a)
1262615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams{
126367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
126467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationGetSurface, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
126567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1266615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams
126767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    IGraphicBufferProducer *v = (IGraphicBufferProducer *)rsAllocationGetSurface((RsContext)con,
126867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                                                                 (RsAllocation)a);
126972226e0543461133b9e177a3e78ae50b0c65e797Jason Sams    sp<IGraphicBufferProducer> bp = v;
1270488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    v->decStrong(nullptr);
1271fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams
127272226e0543461133b9e177a3e78ae50b0c65e797Jason Sams    jobject o = android_view_Surface_createFromIGraphicBufferProducer(_env, bp);
127372226e0543461133b9e177a3e78ae50b0c65e797Jason Sams    return o;
1274fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams}
1275fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams
1276fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Samsstatic void
1277460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationSetSurface(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject sur)
1278163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams{
127967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
128067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationSetSurface, con(%p), alloc(%p), surface(%p)", (RsContext)con,
128167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsAllocation)alloc, (Surface *)sur);
128267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1283163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
1284fb9aa9f3ef11878caaf6fcfb5ea49ffb9f7abf33Jason Sams    sp<Surface> s;
1285163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams    if (sur != 0) {
128664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        s = android_view_Surface_getSurface(_env, sur);
1287163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams    }
1288163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
128967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    rsAllocationSetSurface((RsContext)con, (RsAllocation)alloc,
129067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                           static_cast<ANativeWindow *>(s.get()));
1291163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams}
1292163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
1293163766cbe798baf8e86eb8201bc6c3def931d59aJason Samsstatic void
1294460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationIoSend(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1295163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams{
129667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
129709993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nAllocationIoSend, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
129867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1299460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray    rsAllocationIoSend((RsContext)con, (RsAllocation)alloc);
1300163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams}
1301163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
13028c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wangstatic jlong
1303460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationIoReceive(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1304163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams{
130567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
130609993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nAllocationIoReceive, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
130767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
13088c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    return (jlong) rsAllocationIoReceive((RsContext)con, (RsAllocation)alloc);
1309163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams}
1310163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
1311163766cbe798baf8e86eb8201bc6c3def931d59aJason Samsstatic void
1312460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1313f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams{
131467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
131567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationGenerateMipmaps, con(%p), a(%p)", (RsContext)con, (RsAllocation)alloc);
131667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1317eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationGenerateMipmaps((RsContext)con, (RsAllocation)alloc);
1318f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams}
1319f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams
1320460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
132167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,
132267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                            jobject jbitmap, jint usage)
1323fe08d99725efd0dde7ba67ff1979a04fec2ba99fJason Sams{
1324ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1325ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
1326fe08d99725efd0dde7ba67ff1979a04fec2ba99fJason Sams
13275476b450e50939940dcf3f15c92335cee2fc572dJason Sams    bitmap.lockPixels();
13285476b450e50939940dcf3f15c92335cee2fc572dJason Sams    const void* ptr = bitmap.getPixels();
13293aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsAllocationCreateFromBitmap((RsContext)con,
133065bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                                  (RsType)type, (RsAllocationMipmapControl)mip,
13318c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                                  ptr, bitmap.getSize(), usage);
13325476b450e50939940dcf3f15c92335cee2fc572dJason Sams    bitmap.unlockPixels();
13335476b450e50939940dcf3f15c92335cee2fc572dJason Sams    return id;
1334ffe9f48890dde7173a0845d32887fdf94a49b0a7Jason Sams}
1335fe08d99725efd0dde7ba67ff1979a04fec2ba99fJason Sams
1336460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
133767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCreateBitmapBackedAllocation(JNIEnv *_env, jobject _this, jlong con, jlong type,
133867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                        jint mip, jobject jbitmap, jint usage)
1339a314551d69098537337c970da615a8f8af58e1f1Tim Murray{
1340ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1341ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
1342a314551d69098537337c970da615a8f8af58e1f1Tim Murray
1343a314551d69098537337c970da615a8f8af58e1f1Tim Murray    bitmap.lockPixels();
1344a314551d69098537337c970da615a8f8af58e1f1Tim Murray    const void* ptr = bitmap.getPixels();
13453aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsAllocationCreateTyped((RsContext)con,
1346a314551d69098537337c970da615a8f8af58e1f1Tim Murray                                            (RsType)type, (RsAllocationMipmapControl)mip,
13478c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                            (uint32_t)usage, (uintptr_t)ptr);
1348a314551d69098537337c970da615a8f8af58e1f1Tim Murray    bitmap.unlockPixels();
1349a314551d69098537337c970da615a8f8af58e1f1Tim Murray    return id;
1350a314551d69098537337c970da615a8f8af58e1f1Tim Murray}
1351a314551d69098537337c970da615a8f8af58e1f1Tim Murray
1352460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
135367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,
135467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                jobject jbitmap, jint usage)
135567f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk{
1356ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1357ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
135867f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk
13595476b450e50939940dcf3f15c92335cee2fc572dJason Sams    bitmap.lockPixels();
13605476b450e50939940dcf3f15c92335cee2fc572dJason Sams    const void* ptr = bitmap.getPixels();
13613aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsAllocationCubeCreateFromBitmap((RsContext)con,
136265bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                                      (RsType)type, (RsAllocationMipmapControl)mip,
13638c8daea2efe0f545f570e475250e37a6eb1cb910Yang Ni                                                      ptr, bitmap.getSize(), usage);
13645476b450e50939940dcf3f15c92335cee2fc572dJason Sams    bitmap.unlockPixels();
13655476b450e50939940dcf3f15c92335cee2fc572dJason Sams    return id;
136667f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk}
136767f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk
136826ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchoukstatic void
1369460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
137026ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk{
1371ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1372ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
1373f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams    int w = bitmap.width();
1374f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams    int h = bitmap.height();
137526ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk
13764ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    bitmap.lockPixels();
13774ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    const void* ptr = bitmap.getPixels();
1378eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocation2DData((RsContext)con, (RsAllocation)alloc, 0, 0,
1379304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                       0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X,
138038faea3019b8aa68c25ec7bac3e17964524dad12Tim Murray                       w, h, ptr, bitmap.getSize(), 0);
13814ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    bitmap.unlockPixels();
13828a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams}
13838a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
13844ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Samsstatic void
1385460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationCopyToBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
13868a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams{
1387ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1388ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
13898a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
13904ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    bitmap.lockPixels();
13914ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    void* ptr = bitmap.getPixels();
1392eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationCopyToBitmap((RsContext)con, (RsAllocation)alloc, ptr, bitmap.getSize());
13934ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    bitmap.unlockPixels();
1394835b8544cc333ef87e42b1d71cf8ad3cddccdc19Alex Sakhartchouk    bitmap.notifyPixelsChanged();
13958a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams}
13968a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
1397414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Java object data into the Allocation pointed to by _alloc.
1398d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1399460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
140087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint count, jobject data, jint sizeBytes, jint dataType, jint mSize,
140187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jboolean usePadding)
1402d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
1403e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
140467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
140567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation1DData, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
140667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "dataType(%i)", (RsContext)con, (RsAllocation)alloc, offset, count, sizeBytes,
140767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              dataType);
140867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
140987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation1DData, true,
141087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
1411d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1412d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1413d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1414c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao WangnAllocationElementData(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
1415c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                       jint xoff, jint yoff, jint zoff,
1416c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                       jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
141749bdaf0293408159df18a1d8540360f9623c40f7Jason Sams{
141867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
141986c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni        jint len = _env->GetArrayLength(data);
1420c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang        ALOGD("nAllocationElementData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
1421c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang              "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
142267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              sizeBytes);
142367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1424488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1425ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1426ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1427ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1428ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1429c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    rsAllocationElementData((RsContext)con, (RsAllocation)alloc,
1430c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                            xoff, yoff, zoff,
1431c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                            lod, ptr, sizeBytes, compIdx);
143249bdaf0293408159df18a1d8540360f9623c40f7Jason Sams    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
143349bdaf0293408159df18a1d8540360f9623c40f7Jason Sams}
143449bdaf0293408159df18a1d8540360f9623c40f7Jason Sams
1435c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang
1436414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Java object data into the Allocation pointed to by _alloc.
143749bdaf0293408159df18a1d8540360f9623c40f7Jason Samsstatic void
1438460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
143987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType, jint mSize,
144087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jboolean usePadding)
1441d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
1442e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
1443e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
144467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
144567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation2DData, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
144667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
144767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
144887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h;
144987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation2DData, true,
145087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
1451d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1452d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1453414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by srcAlloc into the Allocation
1454414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// pointed to by dstAlloc.
145540a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Samsstatic void
1456eff663f391fa4f119685d5c14489b94661ea126fTim MurraynAllocationData2D_alloc(JNIEnv *_env, jobject _this, jlong con,
1457460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong dstAlloc, jint dstXoff, jint dstYoff,
1458304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                        jint dstMip, jint dstFace,
1459304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                        jint width, jint height,
1460460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong srcAlloc, jint srcXoff, jint srcYoff,
1461304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                        jint srcMip, jint srcFace)
1462304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk{
146367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
146467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation2DData_s, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
146567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " dstMip(%i), dstFace(%i), width(%i), height(%i),"
146667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i), srcFace(%i)",
146767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
146867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
146967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1470304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk
1471eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationCopy2DRange((RsContext)con,
1472304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            (RsAllocation)dstAlloc,
1473304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            dstXoff, dstYoff,
1474304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            dstMip, dstFace,
1475304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            width, height,
1476304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            (RsAllocation)srcAlloc,
1477304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            srcXoff, srcYoff,
1478304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            srcMip, srcFace);
1479304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk}
1480304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk
1481414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Java object data into the Allocation pointed to by _alloc.
1482304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchoukstatic void
1483460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
148487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jint d, jobject data, jint sizeBytes, jint dataType,
148587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
1486b05d689653b1bc94836f716f29e9578677c29075Jason Sams{
1487e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
148867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
148967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation3DData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
149067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
149167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              lod, w, h, d, sizeBytes);
149267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
149387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h * d;
149487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation3DData, true,
149587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
1496b05d689653b1bc94836f716f29e9578677c29075Jason Sams}
1497b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1498414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by srcAlloc into the Allocation
1499414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// pointed to by dstAlloc.
1500b05d689653b1bc94836f716f29e9578677c29075Jason Samsstatic void
1501eff663f391fa4f119685d5c14489b94661ea126fTim MurraynAllocationData3D_alloc(JNIEnv *_env, jobject _this, jlong con,
1502460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong dstAlloc, jint dstXoff, jint dstYoff, jint dstZoff,
1503b05d689653b1bc94836f716f29e9578677c29075Jason Sams                        jint dstMip,
1504b05d689653b1bc94836f716f29e9578677c29075Jason Sams                        jint width, jint height, jint depth,
1505460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong srcAlloc, jint srcXoff, jint srcYoff, jint srcZoff,
1506b05d689653b1bc94836f716f29e9578677c29075Jason Sams                        jint srcMip)
1507b05d689653b1bc94836f716f29e9578677c29075Jason Sams{
150867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
150967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationData3D_alloc, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
151067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " dstMip(%i), width(%i), height(%i),"
151167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i)",
151267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip,
151367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip);
151467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1515b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1516eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationCopy3DRange((RsContext)con,
1517b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            (RsAllocation)dstAlloc,
1518b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            dstXoff, dstYoff, dstZoff, dstMip,
1519b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            width, height, depth,
1520b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            (RsAllocation)srcAlloc,
1521b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            srcXoff, srcYoff, srcZoff, srcMip);
1522b05d689653b1bc94836f716f29e9578677c29075Jason Sams}
1523b05d689653b1bc94836f716f29e9578677c29075Jason Sams
152440a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams
1525414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by _alloc into the Java object data.
152640a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Samsstatic void
152787e908dfdece91b5f504386d4901fa3342dc8083Miao WangnAllocationRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jobject data, jint dataType,
152887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                jint mSize, jboolean usePadding)
1529fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams{
153021659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
153167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
153267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationRead, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
153367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
153487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = 0;
153587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(0, rsAllocationRead, false,
153687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, ptr, len * typeBytes);
1537fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams}
1538fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams
1539414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by _alloc into the Java object data.
1540fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Samsstatic void
1541460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationRead1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
154287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint count, jobject data, jint sizeBytes, jint dataType,
154387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
1544fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams{
154521659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
154667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
154767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation1DRead, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
154867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "dataType(%i)", (RsContext)con, alloc, offset, count, sizeBytes, dataType);
154967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
155087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(0, rsAllocation1DRead, false,
155187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
1552fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams}
1553fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams
1554c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang// Copies from the Element in the Allocation pointed to by _alloc into the Java array data.
1555c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wangstatic void
155645cec0a9711f736df26fd097c6d74834e350f9bcMiao WangnAllocationElementRead(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
1557c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                       jint xoff, jint yoff, jint zoff,
155845cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang                       jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
1559c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang{
1560c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    if (kLogApi) {
156186c5c2dab70b03bf0823ef4d9167b0a6b69c0742Yang Ni        jint len = _env->GetArrayLength(data);
156245cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang        ALOGD("nAllocationElementRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
156345cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang              "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
156445cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang              sizeBytes);
1565c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    }
156645cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1567ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1568ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1569ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1570ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
157145cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang    rsAllocationElementRead((RsContext)con, (RsAllocation)alloc,
157245cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang                            xoff, yoff, zoff,
1573a7e2509d8da69ab1c9e14b4ce6608786c572209aJason Sams                            lod, ptr, sizeBytes, compIdx);
1574bfa5e659e7b4cb49178d0e99712478b29f8301a7Miao Wang    _env->ReleaseByteArrayElements(data, ptr, 0);
1575c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang}
1576c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang
1577414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by _alloc into the Java object data.
1578fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Samsstatic void
1579460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
158087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType,
158187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
158240a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams{
158321659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
158421659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
158567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
158667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation2DRead, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
158767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
158867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
158987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h;
159087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(0, rsAllocation2DRead, false,
159187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
159240a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams}
159387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang
1594c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1595c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wangstatic void
1596c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao WangnAllocationRead3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
159787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jint d, jobject data, int sizeBytes, int dataType,
159887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
1599c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang{
1600c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
1601c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    if (kLogApi) {
1602c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang        ALOGD("nAllocation3DRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
1603c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang              " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
1604c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang              lod, w, h, d, sizeBytes);
1605c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    }
160687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h * d;
160787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation3DRead, false,
160887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
1609c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang}
1610d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1611460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1612460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationGetType(JNIEnv *_env, jobject _this, jlong con, jlong a)
1613dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
161467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
161567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationGetType, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
161667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
16173aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t) rsaAllocationGetType((RsContext)con, (RsAllocation)a);
1618dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1619dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
16205edc608a0749ed4b7074b5c1243043eb722c3c31Jason Samsstatic void
1621460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationResize1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint dimX)
16225edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams{
162367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
162467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", (RsContext)con,
162567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsAllocation)alloc, dimX);
162667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1627eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationResize1D((RsContext)con, (RsAllocation)alloc, dimX);
16285edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams}
16295edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams
163046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
163146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Samsstatic jlong
163246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason SamsnAllocationAdapterCreate(JNIEnv *_env, jobject _this, jlong con, jlong basealloc, jlong type)
163346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{
163446ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    if (kLogApi) {
163546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        ALOGD("nAllocationAdapterCreate, con(%p), base(%p), type(%p)",
163646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams              (RsContext)con, (RsAllocation)basealloc, (RsElement)type);
163746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    }
163846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    return (jlong)(uintptr_t) rsAllocationAdapterCreate((RsContext)con, (RsType)type,
163946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                                                        (RsAllocation)basealloc);
164046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
164146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams}
164246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
164346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Samsstatic void
164446ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason SamsnAllocationAdapterOffset(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
164546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                        jint x, jint y, jint z, jint face, jint lod,
164646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                        jint a1, jint a2, jint a3, jint a4)
164746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{
164846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    uint32_t params[] = {
164946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        (uint32_t)x, (uint32_t)y, (uint32_t)z, (uint32_t)face,
165046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        (uint32_t)lod, (uint32_t)a1, (uint32_t)a2, (uint32_t)a3, (uint32_t)a4
165146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    };
165246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    if (kLogApi) {
165346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        ALOGD("nAllocationAdapterOffset, con(%p), alloc(%p), x(%i), y(%i), z(%i), face(%i), lod(%i), arrays(%i %i %i %i)",
165446ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams              (RsContext)con, (RsAllocation)alloc, x, y, z, face, lod, a1, a2, a3, a4);
165546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    }
165646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    rsAllocationAdapterOffset((RsContext)con, (RsAllocation)alloc,
165746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                              params, sizeof(params));
165846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams}
165946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
166046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
1661aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk// -----------------------------------
1662aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1663460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1664460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DCreateFromAssetStream(JNIEnv *_env, jobject _this, jlong con, jlong native_asset)
1665aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
1666aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    Asset* asset = reinterpret_cast<Asset*>(native_asset);
16670e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    ALOGV("______nFileA3D %p", asset);
1668aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
16693aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromMemory((RsContext)con, asset->getBuffer(false), asset->getLength());
1670b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1671b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1672b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1673460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1674eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFileA3DCreateFromAsset(JNIEnv *_env, jobject _this, jlong con, jobject _assetMgr, jstring _path)
1675b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1676b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr);
1677488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (mgr == nullptr) {
1678b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return 0;
1679b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
1680b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1681b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 str(_env, _path);
1682b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
1683488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (asset == nullptr) {
1684b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return 0;
1685b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
1686b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
16873aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromAsset((RsContext)con, asset);
1688b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1689b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1690b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1691460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1692eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFileA3DCreateFromFile(JNIEnv *_env, jobject _this, jlong con, jstring fileName)
1693b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1694b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
16953aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromFile((RsContext)con, fileNameUTF.c_str());
1696b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1697aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    return id;
1698aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1699aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1700460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jint
1701460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DGetNumIndexEntries(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D)
1702aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
1703aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    int32_t numEntries = 0;
1704eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaFileA3DGetNumIndexEntries((RsContext)con, &numEntries, (RsFile)fileA3D);
17050e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    return (jint)numEntries;
1706aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1707aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1708aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchoukstatic void
1709460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DGetIndexEntries(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D, jint numEntries, jintArray _ids, jobjectArray _entries)
1710aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
17110e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    ALOGV("______nFileA3D %p", (RsFile) fileA3D);
1712aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    RsFileIndexEntry *fileEntries = (RsFileIndexEntry*)malloc((uint32_t)numEntries * sizeof(RsFileIndexEntry));
1713aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1714eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaFileA3DGetIndexEntries((RsContext)con, fileEntries, (uint32_t)numEntries, (RsFile)fileA3D);
1715aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1716aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    for(jint i = 0; i < numEntries; i ++) {
1717aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        _env->SetObjectArrayElement(_entries, i, _env->NewStringUTF(fileEntries[i].objectName));
1718aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        _env->SetIntArrayRegion(_ids, i, 1, (const jint*)&fileEntries[i].classID);
1719aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
1720aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1721aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    free(fileEntries);
1722aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1723aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
17240e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1725460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DGetEntryByIndex(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D, jint index)
1726aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
17270e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    ALOGV("______nFileA3D %p", (RsFile) fileA3D);
17283aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DGetEntryByIndex((RsContext)con, (uint32_t)index, (RsFile)fileA3D);
1729aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    return id;
1730aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1731d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1732d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// -----------------------------------
1733d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
17340e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1735eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFontCreateFromFile(JNIEnv *_env, jobject _this, jlong con,
1736b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                    jstring fileName, jfloat fontSize, jint dpi)
17379b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk{
1738b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
17393aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsFontCreateFromFile((RsContext)con,
1740e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                         fileNameUTF.c_str(), fileNameUTF.length(),
1741e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                         fontSize, dpi);
1742b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1743b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1744b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1745b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
17460e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1747eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFontCreateFromAssetStream(JNIEnv *_env, jobject _this, jlong con,
17480e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                           jstring name, jfloat fontSize, jint dpi, jlong native_asset)
1749b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1750b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    Asset* asset = reinterpret_cast<Asset*>(native_asset);
1751b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 nameUTF(_env, name);
1752b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
17533aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsFontCreateFromMemory((RsContext)con,
1754e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                           nameUTF.c_str(), nameUTF.length(),
1755e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                           fontSize, dpi,
1756b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                                           asset->getBuffer(false), asset->getLength());
1757b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1758b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1759b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
17600e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1761eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFontCreateFromAsset(JNIEnv *_env, jobject _this, jlong con, jobject _assetMgr, jstring _path,
1762b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                     jfloat fontSize, jint dpi)
1763b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1764b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr);
1765488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (mgr == nullptr) {
1766b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return 0;
1767b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
1768b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1769b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 str(_env, _path);
1770b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
1771488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (asset == nullptr) {
1772b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return 0;
1773b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
17749b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk
17753aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsFontCreateFromMemory((RsContext)con,
1776e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                           str.c_str(), str.length(),
1777e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                           fontSize, dpi,
1778b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                                           asset->getBuffer(false), asset->getLength());
1779b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    delete asset;
17809b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    return id;
17819b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk}
17829b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk
1783bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams// -----------------------------------
1784bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams
1785bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Samsstatic void
1786460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptBindAllocation(JNIEnv *_env, jobject _this, jlong con, jlong script, jlong alloc, jint slot)
1787d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
178867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
178967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)", (RsContext)con,
179067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsScript)script, (RsAllocation)alloc, slot);
179167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1792eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
1793d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1794d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1795d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1796460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jint val)
17974d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams{
179867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
179967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con, (void *)script,
180067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
180167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1802eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarI((RsContext)con, (RsScript)script, slot, val);
18034d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams}
18044d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
18057c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jint
1806460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
18077c4caadb939b1563328251c156262c179a685c70Tim Murray{
180867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
180967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarI, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
181067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18117c4caadb939b1563328251c156262c179a685c70Tim Murray    int value = 0;
1812eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18137c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18147c4caadb939b1563328251c156262c179a685c70Tim Murray}
18157c4caadb939b1563328251c156262c179a685c70Tim Murray
18164d3399337d18ef04116bc8a2e5799274655d0c30Jason Samsstatic void
1817460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarObj(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val)
18186f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams{
181967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
182009993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%" PRId64 ")", (RsContext)con, (void *)script,
182167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
182267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1823eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val);
18246f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams}
18256f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams
18266f4cf0b8885403ead157ae00fd43cf1282331c23Jason Samsstatic void
1827460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val)
1828031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines{
182967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
183009993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%" PRId64 ")", (RsContext)con, (void *)script,
183167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
183267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1833eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarJ((RsContext)con, (RsScript)script, slot, val);
1834031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines}
1835031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines
18367c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jlong
1837460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
18387c4caadb939b1563328251c156262c179a685c70Tim Murray{
183967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
184067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarJ, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
184167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18427c4caadb939b1563328251c156262c179a685c70Tim Murray    jlong value = 0;
1843eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18447c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18457c4caadb939b1563328251c156262c179a685c70Tim Murray}
18467c4caadb939b1563328251c156262c179a685c70Tim Murray
1847031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hinesstatic void
1848460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, float val)
18494d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams{
185067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
185167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", (RsContext)con, (void *)script,
185267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
185367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1854eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarF((RsContext)con, (RsScript)script, slot, val);
18554d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams}
18564d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
18577c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jfloat
1858460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
18597c4caadb939b1563328251c156262c179a685c70Tim Murray{
186067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
186167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarF, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
186267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18637c4caadb939b1563328251c156262c179a685c70Tim Murray    jfloat value = 0;
1864eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18657c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18667c4caadb939b1563328251c156262c179a685c70Tim Murray}
18677c4caadb939b1563328251c156262c179a685c70Tim Murray
18684d3399337d18ef04116bc8a2e5799274655d0c30Jason Samsstatic void
1869460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, double val)
1870ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines{
187167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
187267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", (RsContext)con, (void *)script,
187367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
187467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1875eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarD((RsContext)con, (RsScript)script, slot, val);
1876ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines}
1877ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines
18787c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jdouble
1879460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
18807c4caadb939b1563328251c156262c179a685c70Tim Murray{
188167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
188267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarD, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
188367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18847c4caadb939b1563328251c156262c179a685c70Tim Murray    jdouble value = 0;
1885eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18867c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18877c4caadb939b1563328251c156262c179a685c70Tim Murray}
18887c4caadb939b1563328251c156262c179a685c70Tim Murray
1889ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hinesstatic void
1890460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data)
18914d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams{
189267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
189367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
189467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18954d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    jint len = _env->GetArrayLength(data);
1896488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1897ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1898ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1899ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1900ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1901eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
19024d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
19034d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams}
19044d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1905adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hinesstatic void
1906460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data)
19077c4caadb939b1563328251c156262c179a685c70Tim Murray{
190867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
190967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
191067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
19117c4caadb939b1563328251c156262c179a685c70Tim Murray    jint len = _env->GetArrayLength(data);
1912488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1913ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1914ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1915ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1916ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1917eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
1918414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines    _env->ReleaseByteArrayElements(data, ptr, 0);
19197c4caadb939b1563328251c156262c179a685c70Tim Murray}
19207c4caadb939b1563328251c156262c179a685c70Tim Murray
19217c4caadb939b1563328251c156262c179a685c70Tim Murraystatic void
192267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenScriptSetVarVE(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data,
192367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                jlong elem, jintArray dims)
1924adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines{
192567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
192667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarVE, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
192767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1928adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    jint len = _env->GetArrayLength(data);
1929488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1930ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1931ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1932ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1933ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1934adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    jint dimsLen = _env->GetArrayLength(dims) * sizeof(int);
1935488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *dimsPtr = _env->GetIntArrayElements(dims, nullptr);
1936ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (dimsPtr == nullptr) {
1937ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1938ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1939ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1940eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem,
1941bc5d3eeedcbdff2e8331a6792902c6992db9bd31Stephen Hines                     (const uint32_t*) dimsPtr, dimsLen);
1942adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1943adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    _env->ReleaseIntArrayElements(dims, dimsPtr, JNI_ABORT);
1944adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines}
1945adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines
1946d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1947d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1948460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetTimeZone(JNIEnv *_env, jobject _this, jlong con, jlong script, jbyteArray timeZone)
1949584a375df68ed7d62b38389078c6804edf228f9cRomain Guy{
195067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
195167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptCSetTimeZone, con(%p), s(%p)", (RsContext)con, (void *)script);
195267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1953584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
1954584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    jint length = _env->GetArrayLength(timeZone);
1955584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    jbyte* timeZone_ptr;
1956584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0);
1957ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (timeZone_ptr == nullptr) {
1958ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1959ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1960ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1961584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
1962eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length);
1963584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
1964584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    if (timeZone_ptr) {
1965584a375df68ed7d62b38389078c6804edf228f9cRomain Guy        _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0);
1966584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    }
1967584a375df68ed7d62b38389078c6804edf228f9cRomain Guy}
1968584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
196922534176fb5c1257130ef4ee589739ca42766a32Jason Samsstatic void
1970460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptInvoke(JNIEnv *_env, jobject _this, jlong con, jlong obj, jint slot)
197122534176fb5c1257130ef4ee589739ca42766a32Jason Sams{
197267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
197367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptInvoke, con(%p), script(%p)", (RsContext)con, (void *)obj);
197467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1975eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptInvoke((RsContext)con, (RsScript)obj, slot);
197622534176fb5c1257130ef4ee589739ca42766a32Jason Sams}
197722534176fb5c1257130ef4ee589739ca42766a32Jason Sams
1978584a375df68ed7d62b38389078c6804edf228f9cRomain Guystatic void
1979460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptInvokeV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data)
1980be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams{
198167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
198267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptInvokeV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
198367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
19844d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    jint len = _env->GetArrayLength(data);
1985488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1986ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1987ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1988ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1989ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1990eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len);
19914d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1992be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams}
1993be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams
19946e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Samsstatic void
1995be7b1defb6b11920703b241ba5815fb09487bb02Chris WailesnScriptForEach(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
1996be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes               jlongArray ains, jlong aout, jbyteArray params,
1997be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes               jintArray limits)
19986e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Sams{
199967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
20009eb9dd326ae93cd84eb9bbc740f753fe8d8c7a13Chih-Hung Hsieh        ALOGD("nScriptForEach, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
200167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2002949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2003be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    jint   in_len = 0;
2004488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *in_ptr = nullptr;
2005949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2006488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    RsAllocation *in_allocs = nullptr;
2007949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2008488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (ains != nullptr) {
2009be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        in_len = _env->GetArrayLength(ains);
20107b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni        if (in_len > (jint)RS_KERNEL_MAX_ARGUMENTS) {
201117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            ALOGE("Too many arguments in kernel launch.");
201217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            // TODO (b/20758983): Report back to Java and throw an exception
201317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            return;
201417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni        }
2015eb3470219dea322efa93eb4b5457813ce71d0c5dChris Wailes
201617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni        in_ptr = _env->GetLongArrayElements(ains, nullptr);
2017ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (in_ptr == nullptr) {
2018ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
2019ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
2020ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
2021ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
2022be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        if (sizeof(RsAllocation) == sizeof(jlong)) {
2023be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            in_allocs = (RsAllocation*)in_ptr;
2024be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        } else {
2025be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            // Convert from 64-bit jlong types to the native pointer type.
2026eb3470219dea322efa93eb4b5457813ce71d0c5dChris Wailes
2027be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            in_allocs = (RsAllocation*)alloca(in_len * sizeof(RsAllocation));
202817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            if (in_allocs == nullptr) {
202917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni                ALOGE("Failed launching kernel for lack of memory.");
203017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni                _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
203117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni                return;
203217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            }
2033be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2034be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            for (int index = in_len; --index >= 0;) {
2035be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                in_allocs[index] = (RsAllocation)in_ptr[index];
2036be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            }
2037be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        }
2038949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes    }
2039949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2040be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    jint   param_len = 0;
2041488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *param_ptr = nullptr;
2042be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2043488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (params != nullptr) {
2044be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        param_len = _env->GetArrayLength(params);
2045488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        param_ptr = _env->GetByteArrayElements(params, nullptr);
2046ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (param_ptr == nullptr) {
2047ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
2048ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
2049ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
2050c9c7daf69b32c0e72a3b99379cc5116c1647f24eStephen Hines    }
2051949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2052488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    RsScriptCall sc, *sca = nullptr;
2053be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    uint32_t sc_size = 0;
2054949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2055be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    jint  limit_len = 0;
2056488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *limit_ptr = nullptr;
2057949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2058488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (limits != nullptr) {
2059be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        limit_len = _env->GetArrayLength(limits);
2060488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        limit_ptr = _env->GetIntArrayElements(limits, nullptr);
2061ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (limit_ptr == nullptr) {
2062ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
2063ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
2064ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
2065949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2066be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        assert(limit_len == 6);
206767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        UNUSED(limit_len);  // As the assert might not be compiled.
2068949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2069be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.xStart     = limit_ptr[0];
2070be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.xEnd       = limit_ptr[1];
2071be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.yStart     = limit_ptr[2];
2072be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.yEnd       = limit_ptr[3];
2073be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.zStart     = limit_ptr[4];
2074be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.zEnd       = limit_ptr[5];
2075be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.strategy   = RS_FOR_EACH_STRATEGY_DONT_CARE;
207614331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.arrayStart = 0;
207714331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.arrayEnd = 0;
207814331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array2Start = 0;
207914331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array2End = 0;
208014331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array3Start = 0;
208114331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array3End = 0;
208214331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array4Start = 0;
208314331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array4End = 0;
2084949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2085be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sca = &sc;
2086e8f2e445fdb138416043a16659bbf86fbbd3fff8Yang Ni        // sc_size is required, but unused, by the runtime and drivers.
2087e8f2e445fdb138416043a16659bbf86fbbd3fff8Yang Ni        sc_size = sizeof(sc);
2088be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    }
2089949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2090be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    rsScriptForEachMulti((RsContext)con, (RsScript)script, slot,
2091be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                         in_allocs, in_len, (RsAllocation)aout,
2092be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                         param_ptr, param_len, sca, sc_size);
2093949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2094488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (ains != nullptr) {
2095be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
2096949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes    }
2097949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2098488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (params != nullptr) {
2099be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        _env->ReleaseByteArrayElements(params, param_ptr, JNI_ABORT);
2100eb3470219dea322efa93eb4b5457813ce71d0c5dChris Wailes    }
2101c9c7daf69b32c0e72a3b99379cc5116c1647f24eStephen Hines
2102488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (limits != nullptr) {
2103be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
2104be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    }
2105949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes}
2106949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
210736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Walastatic void
210836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt WalanScriptReduce(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
210936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala              jlong ain, jlong aout, jintArray limits)
211036eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala{
211136eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    if (kLogApi) {
211236eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        ALOGD("nScriptReduce, con(%p), s(%p), slot(%i) ain(%" PRId64 ") aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ain, aout);
211336eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    }
211436eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
211536eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    RsScriptCall sc, *sca = nullptr;
211636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    uint32_t sc_size = 0;
211736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
211836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    jint  limit_len = 0;
211936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    jint *limit_ptr = nullptr;
212036eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
212136eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    // If the caller passed limits, reflect them in the RsScriptCall.
212236eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    if (limits != nullptr) {
212336eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        limit_len = _env->GetArrayLength(limits);
212436eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        limit_ptr = _env->GetIntArrayElements(limits, nullptr);
2125ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (limit_ptr == nullptr) {
2126ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
2127ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
2128ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
212936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
213036eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        // We expect to be passed an array [x1, x2] which specifies
213136eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        // the sub-range for a 1-dimensional reduction.
213236eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        assert(limit_len == 2);
213336eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        UNUSED(limit_len);  // As the assert might not be compiled.
213436eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
213536eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.xStart     = limit_ptr[0];
213636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.xEnd       = limit_ptr[1];
213736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.yStart     = 0;
213836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.yEnd       = 0;
213936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.zStart     = 0;
214036eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.zEnd       = 0;
214136eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.strategy   = RS_FOR_EACH_STRATEGY_DONT_CARE;
214236eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.arrayStart = 0;
214336eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.arrayEnd = 0;
214436eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.array2Start = 0;
214536eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.array2End = 0;
214636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.array3Start = 0;
214736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.array3End = 0;
214836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.array4Start = 0;
214936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.array4End = 0;
215036eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
215136eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sca = &sc;
215236eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc_size = sizeof(sc);
215336eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    }
215436eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
215536eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    rsScriptReduce((RsContext)con, (RsScript)script, slot,
215636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala                   (RsAllocation)ain, (RsAllocation)aout,
215736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala                   sca, sc_size);
215836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
215936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    if (limits != nullptr) {
216036eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
216136eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    }
216236eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala}
216336eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
216426ef7a739b724452f93f850a1c268c42e439317bDavid Grossstatic void
216526ef7a739b724452f93f850a1c268c42e439317bDavid GrossnScriptReduceNew(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
216626ef7a739b724452f93f850a1c268c42e439317bDavid Gross                 jlongArray ains, jlong aout, jintArray limits)
216726ef7a739b724452f93f850a1c268c42e439317bDavid Gross{
216826ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (kLogApi) {
216926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        ALOGD("nScriptReduceNew, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
217026ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
217126ef7a739b724452f93f850a1c268c42e439317bDavid Gross
217226ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (ains == nullptr) {
217326ef7a739b724452f93f850a1c268c42e439317bDavid Gross        ALOGE("At least one input required.");
217426ef7a739b724452f93f850a1c268c42e439317bDavid Gross        // TODO (b/20758983): Report back to Java and throw an exception
217526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        return;
217626ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
217726ef7a739b724452f93f850a1c268c42e439317bDavid Gross    jint in_len = _env->GetArrayLength(ains);
217826ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (in_len > (jint)RS_KERNEL_MAX_ARGUMENTS) {
217926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        ALOGE("Too many arguments in kernel launch.");
218026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        // TODO (b/20758983): Report back to Java and throw an exception
218126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        return;
218226ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
218326ef7a739b724452f93f850a1c268c42e439317bDavid Gross
218426ef7a739b724452f93f850a1c268c42e439317bDavid Gross    jlong *in_ptr = _env->GetLongArrayElements(ains, nullptr);
218526ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (in_ptr == nullptr) {
218626ef7a739b724452f93f850a1c268c42e439317bDavid Gross        ALOGE("Failed to get Java array elements");
218726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        // TODO (b/20758983): Report back to Java and throw an exception
218826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        return;
218926ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
219026ef7a739b724452f93f850a1c268c42e439317bDavid Gross
219126ef7a739b724452f93f850a1c268c42e439317bDavid Gross    RsAllocation *in_allocs = nullptr;
219226ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (sizeof(RsAllocation) == sizeof(jlong)) {
219326ef7a739b724452f93f850a1c268c42e439317bDavid Gross        in_allocs = (RsAllocation*)in_ptr;
219426ef7a739b724452f93f850a1c268c42e439317bDavid Gross    } else {
219526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        // Convert from 64-bit jlong types to the native pointer type.
219626ef7a739b724452f93f850a1c268c42e439317bDavid Gross
219726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        in_allocs = (RsAllocation*)alloca(in_len * sizeof(RsAllocation));
219826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        if (in_allocs == nullptr) {
219926ef7a739b724452f93f850a1c268c42e439317bDavid Gross            ALOGE("Failed launching kernel for lack of memory.");
220026ef7a739b724452f93f850a1c268c42e439317bDavid Gross            // TODO (b/20758983): Report back to Java and throw an exception
220126ef7a739b724452f93f850a1c268c42e439317bDavid Gross            _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
220226ef7a739b724452f93f850a1c268c42e439317bDavid Gross            return;
220326ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
220426ef7a739b724452f93f850a1c268c42e439317bDavid Gross
220526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        for (int index = in_len; --index >= 0;) {
220626ef7a739b724452f93f850a1c268c42e439317bDavid Gross            in_allocs[index] = (RsAllocation)in_ptr[index];
220726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
220826ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
220926ef7a739b724452f93f850a1c268c42e439317bDavid Gross
221026ef7a739b724452f93f850a1c268c42e439317bDavid Gross    RsScriptCall sc, *sca = nullptr;
221126ef7a739b724452f93f850a1c268c42e439317bDavid Gross    uint32_t sc_size = 0;
221226ef7a739b724452f93f850a1c268c42e439317bDavid Gross
221326ef7a739b724452f93f850a1c268c42e439317bDavid Gross    jint  limit_len = 0;
221426ef7a739b724452f93f850a1c268c42e439317bDavid Gross    jint *limit_ptr = nullptr;
221526ef7a739b724452f93f850a1c268c42e439317bDavid Gross
221626ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (limits != nullptr) {
221726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        limit_len = _env->GetArrayLength(limits);
221826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        limit_ptr = _env->GetIntArrayElements(limits, nullptr);
221926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        if (limit_ptr == nullptr) {
222026ef7a739b724452f93f850a1c268c42e439317bDavid Gross            ALOGE("Failed to get Java array elements");
222126ef7a739b724452f93f850a1c268c42e439317bDavid Gross            // TODO (b/20758983): Report back to Java and throw an exception
222226ef7a739b724452f93f850a1c268c42e439317bDavid Gross            return;
222326ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
222426ef7a739b724452f93f850a1c268c42e439317bDavid Gross
222526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        assert(limit_len == 6);
222626ef7a739b724452f93f850a1c268c42e439317bDavid Gross        UNUSED(limit_len);  // As the assert might not be compiled.
222726ef7a739b724452f93f850a1c268c42e439317bDavid Gross
222826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.xStart     = limit_ptr[0];
222926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.xEnd       = limit_ptr[1];
223026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.yStart     = limit_ptr[2];
223126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.yEnd       = limit_ptr[3];
223226ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.zStart     = limit_ptr[4];
223326ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.zEnd       = limit_ptr[5];
223426ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.strategy   = RS_FOR_EACH_STRATEGY_DONT_CARE;
223526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.arrayStart = 0;
223626ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.arrayEnd = 0;
223726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array2Start = 0;
223826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array2End = 0;
223926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array3Start = 0;
224026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array3End = 0;
224126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array4Start = 0;
224226ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array4End = 0;
224326ef7a739b724452f93f850a1c268c42e439317bDavid Gross
224426ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sca = &sc;
224526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc_size = sizeof(sc);
224626ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
224726ef7a739b724452f93f850a1c268c42e439317bDavid Gross
224826ef7a739b724452f93f850a1c268c42e439317bDavid Gross    rsScriptReduceNew((RsContext)con, (RsScript)script, slot,
224926ef7a739b724452f93f850a1c268c42e439317bDavid Gross                      in_allocs, in_len, (RsAllocation)aout,
225026ef7a739b724452f93f850a1c268c42e439317bDavid Gross                      sca, sc_size);
225126ef7a739b724452f93f850a1c268c42e439317bDavid Gross
225226ef7a739b724452f93f850a1c268c42e439317bDavid Gross    _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
225326ef7a739b724452f93f850a1c268c42e439317bDavid Gross
225426ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (limits != nullptr) {
225526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
225626ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
225726ef7a739b724452f93f850a1c268c42e439317bDavid Gross}
225826ef7a739b724452f93f850a1c268c42e439317bDavid Gross
2259fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams// -----------------------------------
2260fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams
22610e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
2262eff663f391fa4f119685d5c14489b94661ea126fTim MurraynScriptCCreate(JNIEnv *_env, jobject _this, jlong con,
2263e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams               jstring resName, jstring cacheDir,
2264e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams               jbyteArray scriptRef, jint length)
2265d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
226667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
226767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptCCreate, con(%p)", (RsContext)con);
226867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2269e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams
2270e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    AutoJavaStringToUTF8 resNameUTF(_env, resName);
2271e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
22720e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    jlong ret = 0;
2273488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte* script_ptr = nullptr;
227443702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    jint _exception = 0;
227543702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    jint remaining;
227643702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    if (!scriptRef) {
227743702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _exception = 1;
22788451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null");
227943702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        goto exit;
228043702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
228143702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    if (length < 0) {
228243702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _exception = 1;
22838451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0");
228443702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        goto exit;
228543702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
2286e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    remaining = _env->GetArrayLength(scriptRef);
228743702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    if (remaining < length) {
228843702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _exception = 1;
22898451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //jniThrowException(_env, "java/lang/IllegalArgumentException",
22908451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //        "length > script.length - offset");
229143702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        goto exit;
229243702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
2293e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    script_ptr = (jbyte *)
229443702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0);
2295ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (script_ptr == nullptr) {
2296ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
2297ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return ret;
2298ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
229943702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich
2300eff663f391fa4f119685d5c14489b94661ea126fTim Murray    //rsScriptCSetText((RsContext)con, (const char *)script_ptr, length);
2301e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams
23023aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    ret = (jlong)(uintptr_t)rsScriptCCreate((RsContext)con,
2303e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                resNameUTF.c_str(), resNameUTF.length(),
2304e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                cacheDirUTF.c_str(), cacheDirUTF.length(),
2305e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams                                (const char *)script_ptr, length);
230639ddc950c9064129ead5de04b200106c0659f937Jason Sams
230743702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevichexit:
2308e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    if (script_ptr) {
2309e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams        _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr,
231043702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich                _exception ? JNI_ABORT: 0);
231143702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
2312d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
23133aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)ret;
2314d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2315d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2316460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2317460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptIntrinsicCreate(JNIEnv *_env, jobject _this, jlong con, jint id, jlong eid)
23186ab97682fd444586ee135912a4210417a1c8781bJason Sams{
231967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
232067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptIntrinsicCreate, con(%p) id(%i) element(%p)", (RsContext)con, id,
232167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)eid);
232267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
23233aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
23246ab97682fd444586ee135912a4210417a1c8781bJason Sams}
23256ab97682fd444586ee135912a4210417a1c8781bJason Sams
2326460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2327460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptKernelIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jint sig)
232808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
232967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
233067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptKernelIDCreate, con(%p) script(%p), slot(%i), sig(%i)", (RsContext)con,
233167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)sid, slot, sig);
233267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
23333aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsScriptKernelIDCreate((RsContext)con, (RsScript)sid, slot, sig);
233408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
233508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2336460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2337be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang NinScriptInvokeIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
2338be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni{
2339be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    if (kLogApi) {
23407ff53fa0d42795da55b65468e07df82029deda79Elliott Hughes        ALOGD("nScriptInvokeIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con,
2341be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni              (void *)sid, slot);
2342be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    }
2343be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    return (jlong)(uintptr_t)rsScriptInvokeIDCreate((RsContext)con, (RsScript)sid, slot);
2344be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni}
2345be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
2346be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Nistatic jlong
2347460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptFieldIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
234808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
234967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
235067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptFieldIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con, (void *)sid,
235167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot);
235267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
23533aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
235408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
235508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2356460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
23579807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnScriptGroupCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _kernels, jlongArray _src,
23589807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    jlongArray _dstk, jlongArray _dstf, jlongArray _types)
235908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
236067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
236167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupCreate, con(%p)", (RsContext)con);
236267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
236308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2364a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong id = 0;
2365a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2366a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsScriptKernelID* kernelsPtr;
23679807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    jint kernelsLen = _env->GetArrayLength(_kernels);
2368488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jKernelsPtr = _env->GetLongArrayElements(_kernels, nullptr);
2369a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2370a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsScriptKernelID* srcPtr;
2371a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint srcLen = _env->GetArrayLength(_src);
2372a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong *jSrcPtr = _env->GetLongArrayElements(_src, nullptr);
2373a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2374a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsScriptKernelID* dstkPtr;
2375a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint dstkLen = _env->GetArrayLength(_dstk);
2376a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong *jDstkPtr = _env->GetLongArrayElements(_dstk, nullptr);
2377a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2378a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsScriptKernelID* dstfPtr;
2379a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint dstfLen = _env->GetArrayLength(_dstf);
2380a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong *jDstfPtr = _env->GetLongArrayElements(_dstf, nullptr);
2381a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2382a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsType* typesPtr;
2383a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint typesLen = _env->GetArrayLength(_types);
2384a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong *jTypesPtr = _env->GetLongArrayElements(_types, nullptr);
2385a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2386ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jKernelsPtr == nullptr) {
2387ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: kernels");
2388a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanup;
2389a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2390a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jSrcPtr == nullptr) {
2391a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        ALOGE("Failed to get Java array elements: src");
2392a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanup;
2393a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2394a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jDstkPtr == nullptr) {
2395a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        ALOGE("Failed to get Java array elements: dstk");
2396a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanup;
2397a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2398a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jDstfPtr == nullptr) {
2399a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        ALOGE("Failed to get Java array elements: dstf");
2400a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanup;
2401ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
2402a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jTypesPtr == nullptr) {
2403a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        ALOGE("Failed to get Java array elements: types");
2404a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanup;
2405a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2406a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2407a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    kernelsPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * kernelsLen);
24089807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < kernelsLen; ++i) {
24099807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        kernelsPtr[i] = (RsScriptKernelID)jKernelsPtr[i];
24109807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
24119807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2412a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    srcPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * srcLen);
24139807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < srcLen; ++i) {
24149807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        srcPtr[i] = (RsScriptKernelID)jSrcPtr[i];
24159807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
24169807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2417a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    dstkPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstkLen);
24189807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < dstkLen; ++i) {
24199807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        dstkPtr[i] = (RsScriptKernelID)jDstkPtr[i];
24209807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
24219807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2422a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    dstfPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstfLen);
24239807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < dstfLen; ++i) {
24249807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        dstfPtr[i] = (RsScriptKernelID)jDstfPtr[i];
24259807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
24269807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2427a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    typesPtr = (RsType*) malloc(sizeof(RsType) * typesLen);
24289807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < typesLen; ++i) {
24299807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        typesPtr[i] = (RsType)jTypesPtr[i];
24309807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
24319807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2432a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    id = (jlong)(uintptr_t)rsScriptGroupCreate((RsContext)con,
24339807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptKernelID *)kernelsPtr, kernelsLen * sizeof(RsScriptKernelID),
24349807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptKernelID *)srcPtr, srcLen * sizeof(RsScriptKernelID),
24359807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptKernelID *)dstkPtr, dstkLen * sizeof(RsScriptKernelID),
24369807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptFieldID *)dstfPtr, dstfLen * sizeof(RsScriptKernelID),
24379807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsType *)typesPtr, typesLen * sizeof(RsType));
24389807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
24399807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(kernelsPtr);
24409807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(srcPtr);
24419807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(dstkPtr);
24429807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(dstfPtr);
24439807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(typesPtr);
2444a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2445a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wangcleanup:
2446a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jKernelsPtr != nullptr) {
2447a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_kernels, jKernelsPtr, 0);
2448a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2449a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jSrcPtr != nullptr) {
2450a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_src, jSrcPtr, 0);
2451a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2452a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jDstkPtr != nullptr) {
2453a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_dstk, jDstkPtr, 0);
2454a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2455a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jDstfPtr != nullptr) {
2456a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_dstf, jDstfPtr, 0);
2457a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2458a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jTypesPtr != nullptr) {
2459a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_types, jTypesPtr, 0);
2460a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2461a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
246208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    return id;
246308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
246408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
246508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Samsstatic void
2466460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGroupSetInput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
246708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
246867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
246967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupSetInput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
247067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)gid, (void *)kid, (void *)alloc);
247167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2472eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGroupSetInput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid, (RsAllocation)alloc);
247308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
247408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
247508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Samsstatic void
2476460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGroupSetOutput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
247708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
247867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
247967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupSetOutput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
248067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)gid, (void *)kid, (void *)alloc);
248167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2482eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGroupSetOutput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid, (RsAllocation)alloc);
248308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
248408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
248508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Samsstatic void
2486460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGroupExecute(JNIEnv *_env, jobject _this, jlong con, jlong gid)
248708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
248867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
248967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupSetOutput, con(%p) group(%p)", (RsContext)con, (void *)gid);
249067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2491eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGroupExecute((RsContext)con, (RsScriptGroup)gid);
249208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
249308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2494d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
2495d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
24960e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
2497eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramStoreCreate(JNIEnv *_env, jobject _this, jlong con,
2498331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jboolean colorMaskR, jboolean colorMaskG, jboolean colorMaskB, jboolean colorMaskA,
2499331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jboolean depthMask, jboolean ditherEnable,
2500331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jint srcFunc, jint destFunc,
2501331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jint depthFunc)
2502d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
250367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
250467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramStoreCreate, con(%p)", (RsContext)con);
250567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
25063aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsProgramStoreCreate((RsContext)con, colorMaskR, colorMaskG, colorMaskB, colorMaskA,
2507331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                                      depthMask, ditherEnable, (RsBlendSrcFunc)srcFunc,
2508331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                                      (RsBlendDstFunc)destFunc, (RsDepthFunc)depthFunc);
2509d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2510d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
25110011bcf57ff711a221a3a4c73f2a79125111647dJason Sams// ---------------------------------------------------------------------------
25120011bcf57ff711a221a3a4c73f2a79125111647dJason Sams
25130011bcf57ff711a221a3a4c73f2a79125111647dJason Samsstatic void
2514460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynProgramBindConstants(JNIEnv *_env, jobject _this, jlong con, jlong vpv, jint slot, jlong a)
25150011bcf57ff711a221a3a4c73f2a79125111647dJason Sams{
251667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
251767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramBindConstants, con(%p), vpf(%p), sloat(%i), a(%p)", (RsContext)con,
251867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramVertex)vpv, slot, (RsAllocation)a);
251967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2520eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsProgramBindConstants((RsContext)con, (RsProgram)vpv, slot, (RsAllocation)a);
25210011bcf57ff711a221a3a4c73f2a79125111647dJason Sams}
252254c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams
2523d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
2524460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynProgramBindTexture(JNIEnv *_env, jobject _this, jlong con, jlong vpf, jint slot, jlong a)
252554c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams{
252667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
252767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramBindTexture, con(%p), vpf(%p), slot(%i), a(%p)", (RsContext)con,
252867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramFragment)vpf, slot, (RsAllocation)a);
252967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2530eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsProgramBindTexture((RsContext)con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
253154c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams}
253254c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams
253354c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Samsstatic void
2534460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynProgramBindSampler(JNIEnv *_env, jobject _this, jlong con, jlong vpf, jint slot, jlong a)
2535d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
253667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
253767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramBindSampler, con(%p), vpf(%p), slot(%i), a(%p)", (RsContext)con,
253867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramFragment)vpf, slot, (RsSampler)a);
253967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2540eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsProgramBindSampler((RsContext)con, (RsProgramFragment)vpf, slot, (RsSampler)a);
2541d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2542d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
254368afd01ec9fd37774d8291192952a25e5605b6fbJason Sams// ---------------------------------------------------------------------------
2544d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2545460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2546eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramFragmentCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader,
25479807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                       jobjectArray texNames, jlongArray params)
25487e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams{
2549b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 shaderUTF(_env, shader);
2550488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jParamPtr = _env->GetLongArrayElements(params, nullptr);
25517e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams    jint paramLen = _env->GetArrayLength(params);
2552ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jParamPtr == nullptr) {
2553ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
2554ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
2555ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
25567e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
25572123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    int texCount = _env->GetArrayLength(texNames);
25582123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8 names(_env, texNames, texCount);
25592123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char ** nameArray = names.c_str();
25602123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t* sizeArray = names.c_str_len();
25612123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
256267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
256367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramFragmentCreate, con(%p), paramLen(%i)", (RsContext)con, paramLen);
256467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
25657e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
25669807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t * paramPtr = (uintptr_t*) malloc(sizeof(uintptr_t) * paramLen);
25679807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < paramLen; ++i) {
25689807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        paramPtr[i] = (uintptr_t)jParamPtr[i];
25699807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
25703aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong ret = (jlong)(uintptr_t)rsProgramFragmentCreate((RsContext)con, shaderUTF.c_str(), shaderUTF.length(),
25712123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                                             nameArray, texCount, sizeArray,
25729807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                                             paramPtr, paramLen);
25732123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
25749807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(paramPtr);
25759807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(params, jParamPtr, JNI_ABORT);
25767e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams    return ret;
25777e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams}
25787e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
25797e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
25801fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams// ---------------------------------------------------------------------------
25811fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams
2582460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2583eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramVertexCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader,
25849807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                     jobjectArray texNames, jlongArray params)
25851fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams{
2586b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 shaderUTF(_env, shader);
2587488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jParamPtr = _env->GetLongArrayElements(params, nullptr);
25880011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    jint paramLen = _env->GetArrayLength(params);
2589ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jParamPtr == nullptr) {
2590ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
2591ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
2592ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
25931fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams
259467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
259567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramVertexCreate, con(%p), paramLen(%i)", (RsContext)con, paramLen);
259667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2597ee41112e1539de95596600fd2c6dada5d275217fJason Sams
25982123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    int texCount = _env->GetArrayLength(texNames);
25992123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8 names(_env, texNames, texCount);
26002123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char ** nameArray = names.c_str();
26012123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t* sizeArray = names.c_str_len();
26022123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
26039807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t * paramPtr = (uintptr_t*) malloc(sizeof(uintptr_t) * paramLen);
26049807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < paramLen; ++i) {
26059807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        paramPtr[i] = (uintptr_t)jParamPtr[i];
26069807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
26079807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
26083aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong ret = (jlong)(uintptr_t)rsProgramVertexCreate((RsContext)con, shaderUTF.c_str(), shaderUTF.length(),
26092123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                                           nameArray, texCount, sizeArray,
26109807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                                           paramPtr, paramLen);
26112123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
26129807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(paramPtr);
26139807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(params, jParamPtr, JNI_ABORT);
26140011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    return ret;
26151fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams}
26161fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams
2617ebfb436a49673693b98469683451bd9ede797557Jason Sams// ---------------------------------------------------------------------------
2618ebfb436a49673693b98469683451bd9ede797557Jason Sams
2619460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2620eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramRasterCreate(JNIEnv *_env, jobject _this, jlong con, jboolean pointSprite, jint cull)
2621ebfb436a49673693b98469683451bd9ede797557Jason Sams{
262267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
262367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramRasterCreate, con(%p), pointSprite(%i), cull(%i)", (RsContext)con,
262467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              pointSprite, cull);
262567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
26263aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsProgramRasterCreate((RsContext)con, pointSprite, (RsCullMode)cull);
2627ebfb436a49673693b98469683451bd9ede797557Jason Sams}
2628ebfb436a49673693b98469683451bd9ede797557Jason Sams
2629d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2630d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
2631d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2632d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
263378c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindRootScript(JNIEnv *_env, jobject _this, jlong con, jlong script)
2634d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
263567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
263667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindRootScript, con(%p), script(%p)", (RsContext)con, (RsScript)script);
263767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2638eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindRootScript((RsContext)con, (RsScript)script);
2639d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2640d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2641d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
264278c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramStore(JNIEnv *_env, jobject _this, jlong con, jlong pfs)
2643d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
264467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
264567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramStore, con(%p), pfs(%p)", (RsContext)con, (RsProgramStore)pfs);
264667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2647eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramStore((RsContext)con, (RsProgramStore)pfs);
2648d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2649d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2650d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
265178c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramFragment(JNIEnv *_env, jobject _this, jlong con, jlong pf)
2652d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
265367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
265467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramFragment, con(%p), pf(%p)", (RsContext)con,
265567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramFragment)pf);
265667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2657eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramFragment((RsContext)con, (RsProgramFragment)pf);
2658d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2659d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
26600826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samsstatic void
266178c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramVertex(JNIEnv *_env, jobject _this, jlong con, jlong pf)
26620826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams{
266367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
266467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramVertex, con(%p), pf(%p)", (RsContext)con, (RsProgramVertex)pf);
266567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2666eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramVertex((RsContext)con, (RsProgramVertex)pf);
26670826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams}
26680826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams
2669d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onoratostatic void
267078c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramRaster(JNIEnv *_env, jobject _this, jlong con, jlong pf)
2671ebfb436a49673693b98469683451bd9ede797557Jason Sams{
267267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
267367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramRaster, con(%p), pf(%p)", (RsContext)con, (RsProgramRaster)pf);
267467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2675eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramRaster((RsContext)con, (RsProgramRaster)pf);
2676ebfb436a49673693b98469683451bd9ede797557Jason Sams}
2677ebfb436a49673693b98469683451bd9ede797557Jason Sams
2678d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onorato
267902fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams// ---------------------------------------------------------------------------
268002fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams
26810e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
2682eff663f391fa4f119685d5c14489b94661ea126fTim MurraynSamplerCreate(JNIEnv *_env, jobject _this, jlong con, jint magFilter, jint minFilter,
2683a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk               jint wrapS, jint wrapT, jint wrapR, jfloat aniso)
268402fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams{
268567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
268667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nSamplerCreate, con(%p)", (RsContext)con);
268767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
26883aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsSamplerCreate((RsContext)con,
2689a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)magFilter,
2690a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)minFilter,
2691a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)wrapS,
2692a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)wrapT,
2693a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)wrapR,
2694a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 aniso);
269502fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams}
269602fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams
2697bba134c8a1dcfe0c8473307a95899a02c9553504Jason Sams// ---------------------------------------------------------------------------
2698bba134c8a1dcfe0c8473307a95899a02c9553504Jason Sams
2699460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
27009807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnMeshCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _vtx, jlongArray _idx, jintArray _prim)
2701164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk{
270267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
270367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshCreate, con(%p)", (RsContext)con);
270467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2705164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2706a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong id = 0;
2707a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2708a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsAllocation* vtxPtr;
270925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk    jint vtxLen = _env->GetArrayLength(_vtx);
2710488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jVtxPtr = _env->GetLongArrayElements(_vtx, nullptr);
2711a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2712a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    RsAllocation* idxPtr;
2713a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint idxLen = _env->GetArrayLength(_idx);
2714a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jlong *jIdxPtr = _env->GetLongArrayElements(_idx, nullptr);
2715a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2716a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint primLen = _env->GetArrayLength(_prim);
2717a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    jint *primPtr = _env->GetIntArrayElements(_prim, nullptr);
2718a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2719ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jVtxPtr == nullptr) {
2720ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: vtx");
2721a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanupMesh;
2722a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2723a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jIdxPtr == nullptr) {
2724a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        ALOGE("Failed to get Java array elements: idx");
2725a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanupMesh;
2726a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2727a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (primPtr == nullptr) {
2728a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        ALOGE("Failed to get Java array elements: prim");
2729a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        goto cleanupMesh;
2730ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
2731a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2732a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    vtxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * vtxLen);
27339807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < vtxLen; ++i) {
27349807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        vtxPtr[i] = (RsAllocation)(uintptr_t)jVtxPtr[i];
27359807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
27369807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2737a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    idxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * idxLen);
27389807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < idxLen; ++i) {
27399807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        idxPtr[i] = (RsAllocation)(uintptr_t)jIdxPtr[i];
27409807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
27419807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2742a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    id = (jlong)(uintptr_t)rsMeshCreate((RsContext)con,
2743a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang                                        (RsAllocation *)vtxPtr, vtxLen,
2744a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang                                        (RsAllocation *)idxPtr, idxLen,
2745a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang                                        (uint32_t *)primPtr, primLen);
274680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
27479807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(vtxPtr);
27489807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(idxPtr);
2749a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
2750a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao WangcleanupMesh:
2751a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jVtxPtr != nullptr) {
2752a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_vtx, jVtxPtr, 0);
2753a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2754a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (jIdxPtr != nullptr) {
2755a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseLongArrayElements(_idx, jIdxPtr, 0);
2756a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2757a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    if (primPtr != nullptr) {
2758a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang        _env->ReleaseIntArrayElements(_prim, primPtr, 0);
2759a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang    }
2760a4ad5f840173ecbfb679153a4f9460d2b06538e7Miao Wang
276125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk    return id;
27629d71e2180062931416092f26276a07e55b318f62Alex Sakhartchouk}
27639d71e2180062931416092f26276a07e55b318f62Alex Sakhartchouk
276480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic jint
2765460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynMeshGetVertexBufferCount(JNIEnv *_env, jobject _this, jlong con, jlong mesh)
276680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
276767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
276867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetVertexBufferCount, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
276967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
277080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    jint vtxCount = 0;
2771eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetVertexBufferCount((RsContext)con, (RsMesh)mesh, &vtxCount);
277280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    return vtxCount;
277380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk}
277480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
277580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic jint
2776460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynMeshGetIndexCount(JNIEnv *_env, jobject _this, jlong con, jlong mesh)
277780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
277867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
277967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetIndexCount, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
278067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
278180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    jint idxCount = 0;
2782eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetIndexCount((RsContext)con, (RsMesh)mesh, &idxCount);
278380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    return idxCount;
278480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk}
278580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
278680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic void
27879807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnMeshGetVertices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jlongArray _ids, jint numVtxIDs)
278880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
278967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
279067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetVertices, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
279167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
279280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
279380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numVtxIDs * sizeof(RsAllocation));
2794eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetVertices((RsContext)con, (RsMesh)mesh, allocs, (uint32_t)numVtxIDs);
279580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
279680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    for(jint i = 0; i < numVtxIDs; i ++) {
27973aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong alloc = (jlong)(uintptr_t)allocs[i];
27989807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_ids, i, 1, &alloc);
279980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    }
280080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
280180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    free(allocs);
280280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk}
280380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
280480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic void
28059807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnMeshGetIndices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jlongArray _idxIds, jintArray _primitives, jint numIndices)
280680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
280767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
280867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetVertices, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
280967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
281080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
281180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numIndices * sizeof(RsAllocation));
281280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    uint32_t *prims= (uint32_t*)malloc((uint32_t)numIndices * sizeof(uint32_t));
281380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
2814eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetIndices((RsContext)con, (RsMesh)mesh, allocs, prims, (uint32_t)numIndices);
281580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
281680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    for(jint i = 0; i < numIndices; i ++) {
28173aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong alloc = (jlong)(uintptr_t)allocs[i];
28189807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        const jint prim = (jint)prims[i];
28199807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_idxIds, i, 1, &alloc);
28209807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetIntArrayRegion(_primitives, i, 1, &prim);
282180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    }
282280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
282380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    free(allocs);
282480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    free(prims);
2825164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk}
2826164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
282756f9e6f8d5436d50530807950661e66ca5efe2bbTim Murraystatic jint
282856f9e6f8d5436d50530807950661e66ca5efe2bbTim MurraynSystemGetPointerSize(JNIEnv *_env, jobject _this) {
282956f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray    return (jint)sizeof(void*);
283056f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray}
283156f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray
28320facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wangstatic jobject
28330facf021ea1a0399d956372b9d3ad9025a9a04d2Miao WangnAllocationGetByteBuffer(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
28340facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang                        jlongArray strideArr, jint xBytesSize,
28350facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang                        jint dimY, jint dimZ) {
28360facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    if (kLogApi) {
28370facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        ALOGD("nAllocationGetByteBuffer, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
28380facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    }
28390facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang
28400facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    jlong *jStridePtr = _env->GetLongArrayElements(strideArr, nullptr);
28410facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    if (jStridePtr == nullptr) {
28420facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        ALOGE("Failed to get Java array elements: strideArr");
28430facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        return 0;
28440facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    }
284556f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray
28460facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    size_t strideIn = xBytesSize;
28470facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    void* ptr = nullptr;
28480facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    if (alloc != 0) {
28490facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        ptr = rsAllocationGetPointer((RsContext)con, (RsAllocation)alloc, 0,
28500facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang                                     RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 0, 0,
28510facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang                                     &strideIn, sizeof(size_t));
28520facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    }
28530facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang
28540facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    jobject byteBuffer = nullptr;
28550facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    if (ptr != nullptr) {
28560facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        size_t bufferSize = strideIn;
28570facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        jStridePtr[0] = strideIn;
28580facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        if (dimY > 0) {
28590facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang            bufferSize *= dimY;
28600facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        }
28610facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        if (dimZ > 0) {
28620facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang            bufferSize *= dimZ;
28630facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        }
28640facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        byteBuffer = _env->NewDirectByteBuffer(ptr, (jlong) bufferSize);
28650facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    }
28660facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    _env->ReleaseLongArrayElements(strideArr, jStridePtr, 0);
28670facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    return byteBuffer;
28680facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang}
2869164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk// ---------------------------------------------------------------------------
2870164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2871d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
287294d8e90ad78ee1dbc0efa315117688abd126ae55Jason Samsstatic const char *classPathName = "android/renderscript/RenderScript";
2873d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
287476f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod methods[] = {
28751c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams{"_nInit",                         "()V",                                     (void*)_nInit },
28761c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
2877eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nDeviceCreate",                  "()J",                                     (void*)nDeviceCreate },
2878eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nDeviceDestroy",                 "(J)V",                                    (void*)nDeviceDestroy },
2879eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nDeviceSetConfig",               "(JII)V",                                  (void*)nDeviceSetConfig },
2880eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextGetUserMessage",         "(J[I)I",                                  (void*)nContextGetUserMessage },
2881eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextGetErrorMessage",        "(J)Ljava/lang/String;",                   (void*)nContextGetErrorMessage },
2882eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextPeekMessage",            "(J[I)I",                                  (void*)nContextPeekMessage },
28831c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
2884eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextInitToClient",           "(J)V",                                    (void*)nContextInitToClient },
2885eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextDeinitToClient",         "(J)V",                                    (void*)nContextDeinitToClient },
28862e1872fe07cf8952812a417985e6e1f61bdeab5dJason Sams
28872e1872fe07cf8952812a417985e6e1f61bdeab5dJason Sams
28882e1872fe07cf8952812a417985e6e1f61bdeab5dJason Sams// All methods below are thread protected in java.
2889eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextCreate",                 "(JIII)J",                               (void*)nContextCreate },
2890eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextCreateGL",               "(JIIIIIIIIIIIIFI)J",                    (void*)nContextCreateGL },
2891eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextFinish",                 "(J)V",                                  (void*)nContextFinish },
2892eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextSetPriority",            "(JI)V",                                 (void*)nContextSetPriority },
289347f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray{"rsnContextSetCacheDir",            "(JLjava/lang/String;)V",                (void*)nContextSetCacheDir },
2894eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextSetSurface",             "(JIILandroid/view/Surface;)V",          (void*)nContextSetSurface },
2895eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextDestroy",                "(J)V",                                  (void*)nContextDestroy },
2896eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextDump",                   "(JI)V",                                 (void*)nContextDump },
2897eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextPause",                  "(J)V",                                  (void*)nContextPause },
2898eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextResume",                 "(J)V",                                  (void*)nContextResume },
2899eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextSendMessage",            "(JI[I)V",                               (void*)nContextSendMessage },
2900281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnClosureCreate",                 "(JJJ[J[J[I[J[J)J",                      (void*)nClosureCreate },
2901be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni{"rsnInvokeClosureCreate",           "(JJ[B[J[J[I)J",                         (void*)nInvokeClosureCreate },
2902281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnClosureSetArg",                 "(JJIJI)V",                              (void*)nClosureSetArg },
2903281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnClosureSetGlobal",              "(JJJJI)V",                              (void*)nClosureSetGlobal },
2904460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAssignName",                    "(JJ[B)V",                               (void*)nAssignName },
2905460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnGetName",                       "(JJ)Ljava/lang/String;",                (void*)nGetName },
2906460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnObjDestroy",                    "(JJ)V",                                 (void*)nObjDestroy },
2907eff663f391fa4f119685d5c14489b94661ea126fTim Murray
2908460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DCreateFromFile",         "(JLjava/lang/String;)J",                (void*)nFileA3DCreateFromFile },
29090e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFileA3DCreateFromAssetStream",  "(JJ)J",                                 (void*)nFileA3DCreateFromAssetStream },
2910460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DCreateFromAsset",        "(JLandroid/content/res/AssetManager;Ljava/lang/String;)J",            (void*)nFileA3DCreateFromAsset },
2911460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DGetNumIndexEntries",     "(JJ)I",                                 (void*)nFileA3DGetNumIndexEntries },
2912460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DGetIndexEntries",        "(JJI[I[Ljava/lang/String;)V",           (void*)nFileA3DGetIndexEntries },
29130e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFileA3DGetEntryByIndex",        "(JJI)J",                                (void*)nFileA3DGetEntryByIndex },
2914eff663f391fa4f119685d5c14489b94661ea126fTim Murray
29150e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFontCreateFromFile",            "(JLjava/lang/String;FI)J",              (void*)nFontCreateFromFile },
29160e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFontCreateFromAssetStream",     "(JLjava/lang/String;FIJ)J",             (void*)nFontCreateFromAssetStream },
29170e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFontCreateFromAsset",        "(JLandroid/content/res/AssetManager;Ljava/lang/String;FI)J",            (void*)nFontCreateFromAsset },
2918eff663f391fa4f119685d5c14489b94661ea126fTim Murray
2919460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnElementCreate",                 "(JJIZI)J",                              (void*)nElementCreate },
29209807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnElementCreate2",                "(J[J[Ljava/lang/String;[I)J",           (void*)nElementCreate2 },
2921460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnElementGetNativeData",          "(JJ[I)V",                               (void*)nElementGetNativeData },
29229807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnElementGetSubElements",         "(JJ[J[Ljava/lang/String;[I)V",          (void*)nElementGetSubElements },
2923460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
2924460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnTypeCreate",                    "(JJIIIZZI)J",                           (void*)nTypeCreate },
29259807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnTypeGetNativeData",             "(JJ[J)V",                               (void*)nTypeGetNativeData },
2926460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
29279807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnAllocationCreateTyped",         "(JJIIJ)J",                               (void*)nAllocationCreateTyped },
2928460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCreateFromBitmap",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateFromBitmap },
2929460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCreateBitmapBackedAllocation",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateBitmapBackedAllocation },
2930460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCubeCreateFromBitmap","(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCubeCreateFromBitmap },
2931460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
2932460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCopyFromBitmap",      "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyFromBitmap },
2933460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCopyToBitmap",        "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyToBitmap },
2934460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
2935460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationSyncAll",             "(JJI)V",                                (void*)nAllocationSyncAll },
29368c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{"rsnAllocationSetupBufferQueue",    "(JJI)V",                                (void*)nAllocationSetupBufferQueue },
29378c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{"rsnAllocationShareBufferQueue",    "(JJJ)V",                                (void*)nAllocationShareBufferQueue },
2938460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationGetSurface",          "(JJ)Landroid/view/Surface;",            (void*)nAllocationGetSurface },
2939460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationSetSurface",          "(JJLandroid/view/Surface;)V",           (void*)nAllocationSetSurface },
2940460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationIoSend",              "(JJ)V",                                 (void*)nAllocationIoSend },
29418c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{"rsnAllocationIoReceive",           "(JJ)J",                                 (void*)nAllocationIoReceive },
294287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationData1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationData1D },
2943c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang{"rsnAllocationElementData",         "(JJIIIII[BI)V",                         (void*)nAllocationElementData },
294487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationData2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationData2D },
2945460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationData2D",              "(JJIIIIIIJIIII)V",                      (void*)nAllocationData2D_alloc },
294687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationData3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",    (void*)nAllocationData3D },
2947460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationData3D",              "(JJIIIIIIIJIIII)V",                     (void*)nAllocationData3D_alloc },
294887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead",                "(JJLjava/lang/Object;IIZ)V",            (void*)nAllocationRead },
294987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationRead1D },
295045cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang{"rsnAllocationElementRead",         "(JJIIIII[BI)V",                         (void*)nAllocationElementRead },
295187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationRead2D },
295287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",    (void*)nAllocationRead3D },
2953460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationGetType",             "(JJ)J",                                 (void*)nAllocationGetType},
2954460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationResize1D",            "(JJI)V",                                (void*)nAllocationResize1D },
2955460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationGenerateMipmaps",     "(JJ)V",                                 (void*)nAllocationGenerateMipmaps },
2956460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
295746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{"rsnAllocationAdapterCreate",       "(JJJ)J",                                (void*)nAllocationAdapterCreate },
295846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{"rsnAllocationAdapterOffset",       "(JJIIIIIIIII)V",                        (void*)nAllocationAdapterOffset },
295946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
2960460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptBindAllocation",          "(JJJI)V",                               (void*)nScriptBindAllocation },
2961460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetTimeZone",             "(JJ[B)V",                               (void*)nScriptSetTimeZone },
2962460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptInvoke",                  "(JJI)V",                                (void*)nScriptInvoke },
2963460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptInvokeV",                 "(JJI[B)V",                              (void*)nScriptInvokeV },
2964be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2965be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes{"rsnScriptForEach",                 "(JJI[JJ[B[I)V",                         (void*)nScriptForEach },
296636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala{"rsnScriptReduce",                  "(JJIJJ[I)V",                            (void*)nScriptReduce },
296726ef7a739b724452f93f850a1c268c42e439317bDavid Gross{"rsnScriptReduceNew",               "(JJI[JJ[I)V",                           (void*)nScriptReduceNew },
2968be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2969460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarI",                 "(JJII)V",                               (void*)nScriptSetVarI },
2970460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarI",                 "(JJI)I",                                (void*)nScriptGetVarI },
2971460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarJ",                 "(JJIJ)V",                               (void*)nScriptSetVarJ },
2972460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarJ",                 "(JJI)J",                                (void*)nScriptGetVarJ },
2973460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarF",                 "(JJIF)V",                               (void*)nScriptSetVarF },
2974460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarF",                 "(JJI)F",                                (void*)nScriptGetVarF },
2975460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarD",                 "(JJID)V",                               (void*)nScriptSetVarD },
2976460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarD",                 "(JJI)D",                                (void*)nScriptGetVarD },
2977460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarV",                 "(JJI[B)V",                              (void*)nScriptSetVarV },
2978460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarV",                 "(JJI[B)V",                              (void*)nScriptGetVarV },
2979460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarVE",                "(JJI[BJ[I)V",                           (void*)nScriptSetVarVE },
2980460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarObj",               "(JJIJ)V",                               (void*)nScriptSetVarObj },
2981eff663f391fa4f119685d5c14489b94661ea126fTim Murray
29820e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnScriptCCreate",                 "(JLjava/lang/String;Ljava/lang/String;[BI)J",  (void*)nScriptCCreate },
2983460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptIntrinsicCreate",         "(JIJ)J",                                (void*)nScriptIntrinsicCreate },
2984460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptKernelIDCreate",          "(JJII)J",                               (void*)nScriptKernelIDCreate },
2985be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni{"rsnScriptInvokeIDCreate",          "(JJI)J",                                (void*)nScriptInvokeIDCreate },
2986460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptFieldIDCreate",           "(JJI)J",                                (void*)nScriptFieldIDCreate },
29879807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnScriptGroupCreate",             "(J[J[J[J[J[J)J",                        (void*)nScriptGroupCreate },
298835be56cce821d86f69026398ff9433e2d173b02fYang Ni{"rsnScriptGroup2Create",            "(JLjava/lang/String;Ljava/lang/String;[J)J", (void*)nScriptGroup2Create },
2989460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGroupSetInput",           "(JJJJ)V",                               (void*)nScriptGroupSetInput },
2990460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGroupSetOutput",          "(JJJJ)V",                               (void*)nScriptGroupSetOutput },
2991460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGroupExecute",            "(JJ)V",                                 (void*)nScriptGroupExecute },
2992281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnScriptGroup2Execute",           "(JJ)V",                                 (void*)nScriptGroup2Execute },
2993eff663f391fa4f119685d5c14489b94661ea126fTim Murray
299425207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Single",    "(JJIIIIIIIIIFJJFJIIII)V",               (void*)nScriptIntrinsicBLAS_Single },
299525207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Double",    "(JJIIIIIIIIIDJJDJIIII)V",               (void*)nScriptIntrinsicBLAS_Double },
299625207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Complex",   "(JJIIIIIIIIIFFJJFFJIIII)V",             (void*)nScriptIntrinsicBLAS_Complex },
299725207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Z",         "(JJIIIIIIIIIDDJJDDJIIII)V",             (void*)nScriptIntrinsicBLAS_Z },
299825207df658d6a8a3e885c7017fcc25702363583cTim Murray
29999cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray{"rsnScriptIntrinsicBLAS_BNNM",      "(JJIIIJIJIJII)V",                       (void*)nScriptIntrinsicBLAS_BNNM },
30009cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
30010e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnProgramStoreCreate",            "(JZZZZZZIII)J",                         (void*)nProgramStoreCreate },
3002eff663f391fa4f119685d5c14489b94661ea126fTim Murray
3003460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramBindConstants",          "(JJIJ)V",                               (void*)nProgramBindConstants },
3004460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramBindTexture",            "(JJIJ)V",                               (void*)nProgramBindTexture },
3005460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramBindSampler",            "(JJIJ)V",                               (void*)nProgramBindSampler },
3006eff663f391fa4f119685d5c14489b94661ea126fTim Murray
30079807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnProgramFragmentCreate",         "(JLjava/lang/String;[Ljava/lang/String;[J)J",              (void*)nProgramFragmentCreate },
3008460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramRasterCreate",           "(JZI)J",                                (void*)nProgramRasterCreate },
30099807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnProgramVertexCreate",           "(JLjava/lang/String;[Ljava/lang/String;[J)J",              (void*)nProgramVertexCreate },
3010eff663f391fa4f119685d5c14489b94661ea126fTim Murray
301178c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindRootScript",         "(JJ)V",                                 (void*)nContextBindRootScript },
301278c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramStore",       "(JJ)V",                                 (void*)nContextBindProgramStore },
301378c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramFragment",    "(JJ)V",                                 (void*)nContextBindProgramFragment },
301478c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramVertex",      "(JJ)V",                                 (void*)nContextBindProgramVertex },
301578c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramRaster",      "(JJ)V",                                 (void*)nContextBindProgramRaster },
3016eff663f391fa4f119685d5c14489b94661ea126fTim Murray
30170e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnSamplerCreate",                 "(JIIIIIF)J",                            (void*)nSamplerCreate },
3018eff663f391fa4f119685d5c14489b94661ea126fTim Murray
30199807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnMeshCreate",                    "(J[J[J[I)J",                            (void*)nMeshCreate },
3020eff663f391fa4f119685d5c14489b94661ea126fTim Murray
3021460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnMeshGetVertexBufferCount",      "(JJ)I",                                 (void*)nMeshGetVertexBufferCount },
3022460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnMeshGetIndexCount",             "(JJ)I",                                 (void*)nMeshGetIndexCount },
30239807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnMeshGetVertices",               "(JJ[JI)V",                              (void*)nMeshGetVertices },
30249807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnMeshGetIndices",                "(JJ[J[II)V",                            (void*)nMeshGetIndices },
302580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
302656f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray{"rsnSystemGetPointerSize",          "()I",                                   (void*)nSystemGetPointerSize },
30270facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang{"rsnAllocationGetByteBuffer",       "(JJ[JIII)Ljava/nio/ByteBuffer;",        (void*)nAllocationGetByteBuffer },
3028d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams};
3029d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
3030d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic int registerFuncs(JNIEnv *_env)
3031d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
3032d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return android::AndroidRuntime::registerNativeMethods(
3033d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            _env, classPathName, methods, NELEM(methods));
3034d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
3035d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
3036d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
3037d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
3038d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsjint JNI_OnLoad(JavaVM* vm, void* reserved)
3039d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
3040488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    JNIEnv* env = nullptr;
3041d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    jint result = -1;
3042d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
3043d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
30443762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: GetEnv failed\n");
3045d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        goto bail;
3046d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
3047488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    assert(env != nullptr);
3048d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
3049d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (registerFuncs(env) < 0) {
30500e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat        ALOGE("ERROR: Renderscript native registration failed\n");
3051d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        goto bail;
3052d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
3053d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
3054d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    /* success -- return valid version number */
3055d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    result = JNI_VERSION_1_4;
3056d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
3057d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsbail:
3058d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return result;
3059d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
3060