android_renderscript_RenderScript.cpp revision 85e8c51dbf8dc774ecfd09981ac6a8bf1b75f464
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:                                                           \
15485e8c51dbf8dc774ecfd09981ac6a8bf1b75f464Pirama 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
42417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
42517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (fieldIDs == nullptr) {
42617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
42717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
42817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
42917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  for (size_t i = 0; i < numValues; i++) {
430281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni    fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
431281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  }
432281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
43317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  depClosures = (RsClosure*)alloca(sizeof(RsClosure) * numDependencies);
43417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (depClosures == nullptr) {
43517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
43617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
437281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
43817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  for (size_t i = 0; i < numDependencies; i++) {
439281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni    depClosures[i] = (RsClosure)jDepClosures[i];
440281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  }
441281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
44217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  depFieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numDependencies);
44317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (depFieldIDs == nullptr) {
44417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
44517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
44617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
44717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  for (size_t i = 0; i < numDependencies; i++) {
448281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni    depFieldIDs[i] = (RsClosure)jDepFieldIDs[i];
449281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  }
450281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
45117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  ret = (jlong)(uintptr_t)rsClosureCreate(
452281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni      (RsContext)con, (RsScriptKernelID)kernelID, (RsAllocation)returnValue,
453263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni      fieldIDs, numValues, jValues, numValues,
45417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      (int*)jSizes, numValues,
45517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      depClosures, numDependencies,
45617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      depFieldIDs, numDependencies);
45717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
45817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Niexit:
45917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
46017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(depFieldIDArray, jDepFieldIDs, JNI_ABORT);
46117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(depClosureArray, jDepClosures, JNI_ABORT);
46217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseIntArrayElements (sizeArray,       jSizes,       JNI_ABORT);
46317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(valueArray,      jValues,      JNI_ABORT);
46417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(fieldIDArray,    jFieldIDs,    JNI_ABORT);
46517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
46617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  return ret;
467281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
468281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
469be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Nistatic jlong
470be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang NinInvokeClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong invokeID,
471be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni                     jbyteArray paramArray, jlongArray fieldIDArray, jlongArray valueArray,
472be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni                     jintArray sizeArray) {
47317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong ret = 0;
47417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
475be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jbyte* jParams = _env->GetByteArrayElements(paramArray, nullptr);
476be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jsize jParamLength = _env->GetArrayLength(paramArray);
477ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jParams == nullptr) {
478ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: params.");
479ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
480ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
481ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
482be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
483be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
484ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jFieldIDs == nullptr) {
485ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: fieldIDs.");
486ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
487ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
488ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
48917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
49017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize values_length = _env->GetArrayLength(valueArray);
491ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jValues == nullptr) {
492ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: values.");
493ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
494ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
495ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
49617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
49717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize sizes_length = _env->GetArrayLength(sizeArray);
498ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jSizes == nullptr) {
499ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: sizes.");
500ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
501ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
50217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
50317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  size_t numValues;
50417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsScriptFieldID* fieldIDs;
50517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
50617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (fieldIDs_length != values_length || values_length != sizes_length) {
50717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Unmatched field IDs, values, and sizes in closure creation.");
50817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
50917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
51017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
51117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  numValues = (size_t) fieldIDs_length;
51217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
5137b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni  if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
51417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Too many arguments or globals in closure creation");
51517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
51617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
51717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
51817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
51917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (fieldIDs == nullptr) {
52017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
52117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
52217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
52317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  for (size_t i = 0; i< numValues; i++) {
524be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
525be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  }
526be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
52717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  ret = (jlong)(uintptr_t)rsInvokeClosureCreate(
528be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni      (RsContext)con, (RsScriptInvokeID)invokeID, jParams, jParamLength,
529263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni      fieldIDs, numValues, jValues, numValues,
53017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      (int*)jSizes, numValues);
53117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
53217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Niexit:
53317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
53417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseIntArrayElements (sizeArray,       jSizes,       JNI_ABORT);
53517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(valueArray,      jValues,      JNI_ABORT);
53617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(fieldIDArray,    jFieldIDs,    JNI_ABORT);
53717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseByteArrayElements(paramArray,      jParams,      JNI_ABORT);
53817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
53917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  return ret;
540be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni}
541be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
542281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic void
543281c3252510bcf4120d17fa0125f369c2c78f162Yang NinClosureSetArg(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
544281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni               jint index, jlong value, jint size) {
545263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni  // Size is signed with -1 indicating the value is an Allocation
546281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  rsClosureSetArg((RsContext)con, (RsClosure)closureID, (uint32_t)index,
547263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni                  (uintptr_t)value, size);
548281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
549281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
550281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic void
551281c3252510bcf4120d17fa0125f369c2c78f162Yang NinClosureSetGlobal(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
552281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni                  jlong fieldID, jlong value, jint size) {
553263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni  // Size is signed with -1 indicating the value is an Allocation
554281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  rsClosureSetGlobal((RsContext)con, (RsClosure)closureID,
555263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni                     (RsScriptFieldID)fieldID, (int64_t)value, size);
556281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
557281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
558281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic long
55935be56cce821d86f69026398ff9433e2d173b02fYang NinScriptGroup2Create(JNIEnv *_env, jobject _this, jlong con, jstring name,
560ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni                    jstring cacheDir, jlongArray closureArray) {
56117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong ret = 0;
56217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
56335be56cce821d86f69026398ff9433e2d173b02fYang Ni  AutoJavaStringToUTF8 nameUTF(_env, name);
564ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni  AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
565ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni
566281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  jlong* jClosures = _env->GetLongArrayElements(closureArray, nullptr);
567281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  jsize numClosures = _env->GetArrayLength(closureArray);
568ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jClosures == nullptr) {
569ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: closures.");
570ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
571ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
57217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
57317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsClosure* closures;
57417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
5757b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni  if (numClosures > (jsize) RS_SCRIPT_GROUP_MAX_NUMBER_CLOSURES) {
57617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni    ALOGE("Too many closures in script group");
57717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni    goto exit;
57817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
57917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
58017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  closures = (RsClosure*)alloca(sizeof(RsClosure) * numClosures);
58117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (closures == nullptr) {
58217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
58317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
58417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
585281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  for (int i = 0; i < numClosures; i++) {
586281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni    closures[i] = (RsClosure)jClosures[i];
587281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  }
588281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
58917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  ret = (jlong)(uintptr_t)rsScriptGroup2Create(
59035be56cce821d86f69026398ff9433e2d173b02fYang Ni      (RsContext)con, nameUTF.c_str(), nameUTF.length(),
59135be56cce821d86f69026398ff9433e2d173b02fYang Ni      cacheDirUTF.c_str(), cacheDirUTF.length(),
592ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni      closures, numClosures);
59317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
59417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Niexit:
59517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
59617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(closureArray, jClosures, JNI_ABORT);
59717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
59817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  return ret;
599281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
600281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
601281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic void
602281c3252510bcf4120d17fa0125f369c2c78f162Yang NinScriptGroup2Execute(JNIEnv *_env, jobject _this, jlong con, jlong groupID) {
603281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  rsScriptGroupExecute((RsContext)con, (RsScriptGroup2)groupID);
604281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
605281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
60696ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Samsstatic void
60725207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Single(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
60825207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
60925207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jfloat alpha, jlong A, jlong B, jfloat beta, jlong C, jint incX, jint incY,
61025207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint KL, jint KU) {
61125207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
61225207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
61325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
61425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
61525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
61625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
61725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
61825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
61925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
62025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
62125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
62225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.f = alpha;
62325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.f = beta;
62425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
62525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
62625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
62725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
62825207df658d6a8a3e885c7017fcc25702363583cTim Murray
62925207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
63025207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
63125207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
63225207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
63325207df658d6a8a3e885c7017fcc25702363583cTim Murray
63425207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
63525207df658d6a8a3e885c7017fcc25702363583cTim Murray                         in_allocs, sizeof(in_allocs), nullptr,
63625207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
63725207df658d6a8a3e885c7017fcc25702363583cTim Murray}
63825207df658d6a8a3e885c7017fcc25702363583cTim Murray
63925207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
64025207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Double(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
64125207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
64225207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jdouble alpha, jlong A, jlong B, jdouble beta, jlong C, jint incX, jint incY,
64325207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint KL, jint KU) {
64425207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
64525207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
64625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
64725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
64825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
64925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
65025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
65125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
65225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
65325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
65425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
65525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.d = alpha;
65625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.d = beta;
65725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
65825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
65925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
66025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
66125207df658d6a8a3e885c7017fcc25702363583cTim Murray
66225207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
66325207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
66425207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
66525207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
66625207df658d6a8a3e885c7017fcc25702363583cTim Murray
66725207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
6680b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
66925207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
67025207df658d6a8a3e885c7017fcc25702363583cTim Murray}
67125207df658d6a8a3e885c7017fcc25702363583cTim Murray
67225207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
67325207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Complex(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
67425207df658d6a8a3e885c7017fcc25702363583cTim Murray                             jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
67525207df658d6a8a3e885c7017fcc25702363583cTim Murray                             jfloat alphaX, jfloat alphaY, jlong A, jlong B, jfloat betaX,
67625207df658d6a8a3e885c7017fcc25702363583cTim Murray                             jfloat betaY, jlong C, jint incX, jint incY, jint KL, jint KU) {
67725207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
67825207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
67925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
68025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
68125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
68225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
68325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
68425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
68525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
68625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
68725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
68825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.c.r = alphaX;
68925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.c.i = alphaY;
69025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.c.r = betaX;
69182585b3906955e57e199d962b8fe11b2bab87fbaMiao Wang    call.beta.c.i = betaY;
69225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
69325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
69425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
69525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
69625207df658d6a8a3e885c7017fcc25702363583cTim Murray
69725207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
69825207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
69925207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
70025207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
70125207df658d6a8a3e885c7017fcc25702363583cTim Murray
70225207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7030b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
70425207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
70525207df658d6a8a3e885c7017fcc25702363583cTim Murray}
70625207df658d6a8a3e885c7017fcc25702363583cTim Murray
70725207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
70825207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Z(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
70925207df658d6a8a3e885c7017fcc25702363583cTim Murray                       jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
71025207df658d6a8a3e885c7017fcc25702363583cTim Murray                       jdouble alphaX, jdouble alphaY, jlong A, jlong B, jdouble betaX,
71125207df658d6a8a3e885c7017fcc25702363583cTim Murray                       jdouble betaY, jlong C, jint incX, jint incY, jint KL, jint KU) {
71225207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
71325207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
71425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
71525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
71625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
71725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
71825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
71925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
72025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
72125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
72225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
72325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.z.r = alphaX;
72425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.z.i = alphaY;
72525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.z.r = betaX;
72682585b3906955e57e199d962b8fe11b2bab87fbaMiao Wang    call.beta.z.i = betaY;
72725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
72825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
72925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
73025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
73125207df658d6a8a3e885c7017fcc25702363583cTim Murray
73225207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
73325207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
73425207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
73525207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
73625207df658d6a8a3e885c7017fcc25702363583cTim Murray
73725207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7380b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
73925207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
74025207df658d6a8a3e885c7017fcc25702363583cTim Murray}
74125207df658d6a8a3e885c7017fcc25702363583cTim Murray
74225207df658d6a8a3e885c7017fcc25702363583cTim Murray
74325207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
7449cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim MurraynScriptIntrinsicBLAS_BNNM(JNIEnv *_env, jobject _this, jlong con, jlong id, jint M, jint N, jint K,
7459cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray                                             jlong A, jint a_offset, jlong B, jint b_offset, jlong C, jint c_offset,
7469cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray                                             jint c_mult_int) {
7479cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    RsBlasCall call;
7489cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    memset(&call, 0, sizeof(call));
7499cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.func = RsBlas_bnnm;
7509cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.M = M;
7519cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.N = N;
7529cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.K = K;
7532514806817ec394d334595d76e20f3129117da6eMiao Wang    call.a_offset = a_offset & 0xFF;
7542514806817ec394d334595d76e20f3129117da6eMiao Wang    call.b_offset = b_offset & 0xFF;
7559cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.c_offset = c_offset;
7569cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.c_mult_int = c_mult_int;
7579cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7589cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    RsAllocation in_allocs[3];
7599cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    in_allocs[0] = (RsAllocation)A;
7609cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    in_allocs[1] = (RsAllocation)B;
7619cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    in_allocs[2] = (RsAllocation)C;
7629cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7639cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7640b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
7659cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray                         &call, sizeof(call), nullptr, 0);
7669cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray}
7679cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7689cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7699cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murraystatic void
770460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAssignName(JNIEnv *_env, jobject _this, jlong con, jlong obj, jbyteArray str)
7713eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams{
77267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
77367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAssignName, con(%p), obj(%p)", (RsContext)con, (void *)obj);
77467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
7753eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    jint len = _env->GetArrayLength(str);
7763eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    jbyte * cptr = (jbyte *) _env->GetPrimitiveArrayCritical(str, 0);
777ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (cptr == nullptr) {
778ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
779ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
780ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
781ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
782eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAssignName((RsContext)con, (void *)obj, (const char *)cptr, len);
7833eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    _env->ReleasePrimitiveArrayCritical(str, cptr, JNI_ABORT);
7843eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams}
7853eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams
786fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchoukstatic jstring
787460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynGetName(JNIEnv *_env, jobject _this, jlong con, jlong obj)
788fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk{
78967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
79067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nGetName, con(%p), obj(%p)", (RsContext)con, (void *)obj);
79167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
792488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    const char *name = nullptr;
793eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaGetName((RsContext)con, (void *)obj, &name);
794488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if(name == nullptr || strlen(name) == 0) {
795488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        return nullptr;
796581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk    }
797fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk    return _env->NewStringUTF(name);
798fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk}
799fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk
8007ce033d797e5df5e2131e2ed459fba181eaf4658Jason Samsstatic void
801460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj)
8027ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams{
80367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
80467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj);
80567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
806eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsObjDestroy((RsContext)con, (void *)obj);
8077ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams}
8087ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams
8093eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams// ---------------------------------------------------------------------------
8103eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams
811eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic jlong
812d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsnDeviceCreate(JNIEnv *_env, jobject _this)
813d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
81467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
81567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nDeviceCreate");
81667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
8173aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsDeviceCreate();
818d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
819d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
820d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
8215eaf468434e96bc7c8d4cfeb138699a1c7b256caTim MurraynDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev)
822d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
82367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
82467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nDeviceDestroy");
82567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
826d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return rsDeviceDestroy((RsDevice)dev);
827d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
828d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
829ebfb436a49673693b98469683451bd9ede797557Jason Samsstatic void
8305eaf468434e96bc7c8d4cfeb138699a1c7b256caTim MurraynDeviceSetConfig(JNIEnv *_env, jobject _this, jlong dev, jint p, jint value)
831ebfb436a49673693b98469683451bd9ede797557Jason Sams{
83267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
83367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nDeviceSetConfig  dev(%p), param(%i), value(%i)", (void *)dev, p, value);
83467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
835ebfb436a49673693b98469683451bd9ede797557Jason Sams    return rsDeviceSetConfig((RsDevice)dev, (RsDeviceParam)p, value);
836ebfb436a49673693b98469683451bd9ede797557Jason Sams}
837ebfb436a49673693b98469683451bd9ede797557Jason Sams
838eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic jlong
83981cd2b18bd36285d1843f78418282e1dad156fbdJason SamsnContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint flags, jint sdkVer, jint contextType)
840d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
84167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
84267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextCreate");
84367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
84481cd2b18bd36285d1843f78418282e1dad156fbdJason Sams    return (jlong)(uintptr_t)rsContextCreate((RsDevice)dev, 0, sdkVer, (RsContextType)contextType, flags);
845704ff64b099406bb328898a7443921f22dbffd6dJason Sams}
846704ff64b099406bb328898a7443921f22dbffd6dJason Sams
847eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic jlong
8485eaf468434e96bc7c8d4cfeb138699a1c7b256caTim MurraynContextCreateGL(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer,
8490e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint colorMin, jint colorPref,
8500e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint alphaMin, jint alphaPref,
8510e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint depthMin, jint depthPref,
8520e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint stencilMin, jint stencilPref,
8530e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint samplesMin, jint samplesPref, jfloat samplesQ,
8540e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint dpi)
85511c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams{
85611c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    RsSurfaceConfig sc;
85711c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.alphaMin = alphaMin;
85811c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.alphaPref = alphaPref;
85911c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.colorMin = colorMin;
86011c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.colorPref = colorPref;
86111c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.depthMin = depthMin;
86211c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.depthPref = depthPref;
86311c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.samplesMin = samplesMin;
86411c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.samplesPref = samplesPref;
86511c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.samplesQ = samplesQ;
86611c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams
86767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
86867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextCreateGL");
86967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
8703aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsContextCreateGL((RsDevice)dev, ver, sdkVer, sc, dpi);
871d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
872d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
873d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
874eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextSetPriority(JNIEnv *_env, jobject _this, jlong con, jint p)
8757d787b4722eaeb79cab42c36060336e092b77b5fJason Sams{
87667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
87767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("ContextSetPriority, con(%p), priority(%i)", (RsContext)con, p);
87867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
879eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextSetPriority((RsContext)con, p);
8807d787b4722eaeb79cab42c36060336e092b77b5fJason Sams}
8817d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
88247f31582b67f492d9e1523abd0d8b86c38ec007dTim Murraystatic void
88347f31582b67f492d9e1523abd0d8b86c38ec007dTim MurraynContextSetCacheDir(JNIEnv *_env, jobject _this, jlong con, jstring cacheDir)
88447f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray{
88547f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
88647f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray
88747f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    if (kLogApi) {
88847f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray        ALOGD("ContextSetCacheDir, con(%p), cacheDir(%s)", (RsContext)con, cacheDirUTF.c_str());
88947f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    }
89047f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    rsContextSetCacheDir((RsContext)con, cacheDirUTF.c_str(), cacheDirUTF.length());
89147f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray}
89247f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray
8937d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
8947d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
8957d787b4722eaeb79cab42c36060336e092b77b5fJason Samsstatic void
896eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextSetSurface(JNIEnv *_env, jobject _this, jlong con, jint width, jint height, jobject wnd)
897efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams{
89867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
89967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextSetSurface, con(%p), width(%i), height(%i), surface(%p)", (RsContext)con,
90067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              width, height, (Surface *)wnd);
90167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
902efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
903488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    ANativeWindow * window = nullptr;
904488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (wnd == nullptr) {
905efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
906efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams    } else {
90764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        window = android_view_Surface_getNativeWindow(_env, wnd).get();
908efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams    }
909efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
910eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextSetSurface((RsContext)con, width, height, window);
911efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams}
912efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
913efd9b6fb2e0f31b50db089352118e5daeb268879Jason Samsstatic void
914eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextDestroy(JNIEnv *_env, jobject _this, jlong con)
915d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
91667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
91767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextDestroy, con(%p)", (RsContext)con);
91867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
919eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextDestroy((RsContext)con);
920d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
921d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
922715333b832fb448c32165c7d97d408a3fa43f7cbJason Samsstatic void
923eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextDump(JNIEnv *_env, jobject _this, jlong con, jint bits)
924715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams{
92567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
92667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextDump, con(%p)  bits(%i)", (RsContext)con, bits);
92767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
928715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams    rsContextDump((RsContext)con, bits);
929715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams}
930d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
931d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
932eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextPause(JNIEnv *_env, jobject _this, jlong con)
93365e7aa56f56097418d617663683544c25b3988eaJason Sams{
93467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
93567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextPause, con(%p)", (RsContext)con);
93667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
937eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextPause((RsContext)con);
93865e7aa56f56097418d617663683544c25b3988eaJason Sams}
93965e7aa56f56097418d617663683544c25b3988eaJason Sams
94065e7aa56f56097418d617663683544c25b3988eaJason Samsstatic void
941eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextResume(JNIEnv *_env, jobject _this, jlong con)
94265e7aa56f56097418d617663683544c25b3988eaJason Sams{
94367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
94467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextResume, con(%p)", (RsContext)con);
94567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
946eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextResume((RsContext)con);
94765e7aa56f56097418d617663683544c25b3988eaJason Sams}
94865e7aa56f56097418d617663683544c25b3988eaJason Sams
9491c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
9501c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Samsstatic jstring
951eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextGetErrorMessage(JNIEnv *_env, jobject _this, jlong con)
9521c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams{
95367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
95467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextGetErrorMessage, con(%p)", (RsContext)con);
95567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
9561c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    char buf[1024];
9571c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
9581c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    size_t receiveLen;
9591c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    uint32_t subID;
960eff663f391fa4f119685d5c14489b94661ea126fTim Murray    int id = rsContextGetMessage((RsContext)con,
96165bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 buf, sizeof(buf),
96265bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 &receiveLen, sizeof(receiveLen),
963edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                                 &subID, sizeof(subID));
9641c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    if (!id && receiveLen) {
96509993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGV("message receive buffer too small.  %zu", receiveLen);
9661c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    }
9671c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    return _env->NewStringUTF(buf);
9681c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams}
9691c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
970edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Samsstatic jint
971eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextGetUserMessage(JNIEnv *_env, jobject _this, jlong con, jintArray data)
972516c31911578db8ce53529483c3ded918ac7dc6bJason Sams{
973516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    jint len = _env->GetArrayLength(data);
97467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
97567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextGetMessage, con(%p), len(%i)", (RsContext)con, len);
97667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
977488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *ptr = _env->GetIntArrayElements(data, nullptr);
978ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
979ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
980ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
981ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
982516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    size_t receiveLen;
9831c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    uint32_t subID;
984eff663f391fa4f119685d5c14489b94661ea126fTim Murray    int id = rsContextGetMessage((RsContext)con,
98565bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 ptr, len * 4,
98665bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 &receiveLen, sizeof(receiveLen),
987edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                                 &subID, sizeof(subID));
988516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    if (!id && receiveLen) {
98909993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGV("message receive buffer too small.  %zu", receiveLen);
990516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    }
991516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    _env->ReleaseIntArrayElements(data, ptr, 0);
9920e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    return (jint)id;
9931c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams}
9941c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
9951c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Samsstatic jint
996eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextPeekMessage(JNIEnv *_env, jobject _this, jlong con, jintArray auxData)
9971c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams{
99867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
99967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextPeekMessage, con(%p)", (RsContext)con);
100067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1001488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *auxDataPtr = _env->GetIntArrayElements(auxData, nullptr);
1002ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (auxDataPtr == nullptr) {
1003ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1004ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
1005ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
10061c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    size_t receiveLen;
10071c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    uint32_t subID;
1008eff663f391fa4f119685d5c14489b94661ea126fTim Murray    int id = rsContextPeekMessage((RsContext)con, &receiveLen, sizeof(receiveLen),
1009edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                                  &subID, sizeof(subID));
10101c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    auxDataPtr[0] = (jint)subID;
10111c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    auxDataPtr[1] = (jint)receiveLen;
10121c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    _env->ReleaseIntArrayElements(auxData, auxDataPtr, 0);
10130e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    return (jint)id;
1014516c31911578db8ce53529483c3ded918ac7dc6bJason Sams}
1015516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1016eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic void nContextInitToClient(JNIEnv *_env, jobject _this, jlong con)
1017516c31911578db8ce53529483c3ded918ac7dc6bJason Sams{
101867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
101967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextInitToClient, con(%p)", (RsContext)con);
102067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1021eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextInitToClient((RsContext)con);
1022516c31911578db8ce53529483c3ded918ac7dc6bJason Sams}
1023516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1024eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic void nContextDeinitToClient(JNIEnv *_env, jobject _this, jlong con)
1025516c31911578db8ce53529483c3ded918ac7dc6bJason Sams{
102667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
102767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextDeinitToClient, con(%p)", (RsContext)con);
102867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1029eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextDeinitToClient((RsContext)con);
1030516c31911578db8ce53529483c3ded918ac7dc6bJason Sams}
1031516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1032455d64426615e5d269a3bd05cd91b67c3811fcdfJason Samsstatic void
1033eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextSendMessage(JNIEnv *_env, jobject _this, jlong con, jint id, jintArray data)
1034455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams{
1035488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *ptr = nullptr;
1036455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    jint len = 0;
1037455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    if (data) {
1038455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams        len = _env->GetArrayLength(data);
10394a043c1853c117c1b4c4342e76cd16a5abdc1045Stephen Hines        ptr = _env->GetIntArrayElements(data, nullptr);
1040ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {
1041ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
1042ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
1043ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
1044455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    }
104567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
104667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextSendMessage, con(%p), id(%i), len(%i)", (RsContext)con, id, len);
104767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1048eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextSendMessage((RsContext)con, id, (const uint8_t *)ptr, len * sizeof(int));
1049455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    if (data) {
1050455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams        _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
1051455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    }
1052455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams}
1053455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams
1054455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams
1055516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1056460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
105767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind, jboolean norm,
105867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe               jint size)
1059d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
106067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
106109993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nElementCreate, con(%p), type(%" PRId64 "), kind(%i), norm(%i), size(%i)", (RsContext)con,
106267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              type, kind, norm, size);
106367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
106467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    return (jlong)(uintptr_t)rsElementCreate((RsContext)con, (RsDataType)type, (RsDataKind)kind,
106567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                             norm, size);
1066d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1067d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1068460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1069eff663f391fa4f119685d5c14489b94661ea126fTim MurraynElementCreate2(JNIEnv *_env, jobject _this, jlong con,
10709807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                jlongArray _ids, jobjectArray _names, jintArray _arraySizes)
1071d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
1072718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    int fieldCount = _env->GetArrayLength(_ids);
107367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
107467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nElementCreate2, con(%p)", (RsContext)con);
107567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1076718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
1077488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jIds = _env->GetLongArrayElements(_ids, nullptr);
1078ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jIds == nullptr) {
1079ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: ids");
1080ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
1081ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1082488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *jArraySizes = _env->GetIntArrayElements(_arraySizes, nullptr);
1083ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jArraySizes == nullptr) {
1084ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: arraySizes");
1085ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
1086ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
10879807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
10889807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    RsElement *ids = (RsElement*)malloc(fieldCount * sizeof(RsElement));
10899807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uint32_t *arraySizes = (uint32_t *)malloc(fieldCount * sizeof(uint32_t));
10909807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
10919807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < fieldCount; i ++) {
10929807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        ids[i] = (RsElement)jIds[i];
10939807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        arraySizes[i] = (uint32_t)jArraySizes[i];
10949807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
1095718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
10962123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8 names(_env, _names, fieldCount);
10972123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
10982123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char **nameArray = names.c_str();
10992123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t *sizeArray = names.c_str_len();
11002123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
11013aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsElementCreate2((RsContext)con,
11029807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                                     (const RsElement *)ids, fieldCount,
11037a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                                     nameArray, fieldCount * sizeof(size_t),  sizeArray,
1104e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                     (const uint32_t *)arraySizes, fieldCount);
11052123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
11069807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(ids);
11079807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(arraySizes);
11089807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(_ids, jIds, JNI_ABORT);
11099807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseIntArrayElements(_arraySizes, jArraySizes, JNI_ABORT);
11109807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
11113aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)id;
1112d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1113d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1114dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchoukstatic void
1115460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynElementGetNativeData(JNIEnv *_env, jobject _this, jlong con, jlong id, jintArray _elementData)
1116dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
1117dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    int dataSize = _env->GetArrayLength(_elementData);
111867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
111967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nElementGetNativeData, con(%p)", (RsContext)con);
112067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1121dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1122dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
1123dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    assert(dataSize == 5);
1124dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
112578c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath    uintptr_t elementData[5];
1126eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaElementGetNativeData((RsContext)con, (RsElement)id, elementData, dataSize);
1127dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1128dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    for(jint i = 0; i < dataSize; i ++) {
11299807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        const jint data = (jint)elementData[i];
11309807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetIntArrayRegion(_elementData, i, 1, &data);
1131dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
1132dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1133dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1134dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1135dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchoukstatic void
1136460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynElementGetSubElements(JNIEnv *_env, jobject _this, jlong con, jlong id,
11379807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                       jlongArray _IDs,
11387d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                       jobjectArray _names,
11397d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                       jintArray _arraySizes)
1140dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
11419807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uint32_t dataSize = _env->GetArrayLength(_IDs);
114267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
114367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nElementGetSubElements, con(%p)", (RsContext)con);
114467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1145dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
11469807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t *ids = (uintptr_t*)malloc(dataSize * sizeof(uintptr_t));
11479807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    const char **names = (const char **)malloc(dataSize * sizeof(const char *));
114878c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath    uint32_t *arraySizes = (uint32_t *)malloc(dataSize * sizeof(uint32_t));
1149dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
115067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    rsaElementGetSubElements((RsContext)con, (RsElement)id, ids, names, arraySizes,
115167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                             (uint32_t)dataSize);
1152dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
11539807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(uint32_t i = 0; i < dataSize; i++) {
11543aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong id = (jlong)(uintptr_t)ids[i];
11559807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        const jint arraySize = (jint)arraySizes[i];
1156dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        _env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i]));
11579807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_IDs, i, 1, &id);
11589807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetIntArrayRegion(_arraySizes, i, 1, &arraySize);
1159dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
1160dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1161dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    free(ids);
1162dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    free(names);
11637d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    free(arraySizes);
1164dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1165dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1166d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// -----------------------------------
1167d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1168460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1169460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid,
1170b109cc78616abee7291eb42094cd156b5db3355dJason Sams            jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv)
1171d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
117267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
117367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)",
117409993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer              (RsContext)con, (void*)eid, dimx, dimy, dimz, mips, faces, yuv);
117567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
11763b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams
117767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    return (jlong)(uintptr_t)rsTypeCreate((RsContext)con, (RsElement)eid, dimx, dimy, dimz, mips,
117867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                          faces, yuv);
1179d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1180d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1181dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchoukstatic void
11829807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnTypeGetNativeData(JNIEnv *_env, jobject _this, jlong con, jlong id, jlongArray _typeData)
1183dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
1184dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    // We are packing 6 items: mDimX; mDimY; mDimZ;
1185dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    // mDimLOD; mDimFaces; mElement; into typeData
1186dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    int elementCount = _env->GetArrayLength(_typeData);
1187dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1188dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    assert(elementCount == 6);
118967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
119067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nTypeGetNativeData, con(%p)", (RsContext)con);
119167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1192dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
11939807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t typeData[6];
1194eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaTypeGetNativeData((RsContext)con, (RsType)id, typeData, 6);
1195dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1196dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    for(jint i = 0; i < elementCount; i ++) {
11973aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong data = (jlong)(uintptr_t)typeData[i];
11989807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_typeData, i, 1, &data);
1199dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
1200dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1201dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1202d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// -----------------------------------
1203d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1204460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
120567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mips, jint usage,
120667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                       jlong pointer)
1207d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
120867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
120967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)",
121067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsContext)con, (RsElement)type, mips, usage, (void *)pointer);
121167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
121267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    return (jlong)(uintptr_t) rsAllocationCreateTyped((RsContext)con, (RsType)type,
121367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                                      (RsAllocationMipmapControl)mips,
121467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                                      (uint32_t)usage, (uintptr_t)pointer);
1215d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1216d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1217d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1218460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationSyncAll(JNIEnv *_env, jobject _this, jlong con, jlong a, jint bits)
12195476b450e50939940dcf3f15c92335cee2fc572dJason Sams{
122067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
122167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationSyncAll, con(%p), a(%p), bits(0x%08x)", (RsContext)con, (RsAllocation)a,
122267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              bits);
122367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1224eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationSyncAll((RsContext)con, (RsAllocation)a, (RsAllocationUsageType)bits);
12255476b450e50939940dcf3f15c92335cee2fc572dJason Sams}
12265476b450e50939940dcf3f15c92335cee2fc572dJason Sams
12278c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wangstatic void
12288c1509249c5552270d8accc2c9512f499a8f5e2dMiao WangnAllocationSetupBufferQueue(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint numAlloc)
12298c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{
12308c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    if (kLogApi) {
12318c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang        ALOGD("nAllocationSetupBufferQueue, con(%p), alloc(%p), numAlloc(%d)", (RsContext)con,
12328c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang              (RsAllocation)alloc, numAlloc);
12338c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    }
12348c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    rsAllocationSetupBufferQueue((RsContext)con, (RsAllocation)alloc, (uint32_t)numAlloc);
12358c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang}
12368c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang
12378c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wangstatic void
12388c1509249c5552270d8accc2c9512f499a8f5e2dMiao WangnAllocationShareBufferQueue(JNIEnv *_env, jobject _this, jlong con, jlong alloc1, jlong alloc2)
12398c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{
12408c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    if (kLogApi) {
12418c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang        ALOGD("nAllocationShareBufferQueue, con(%p), alloc1(%p), alloc2(%p)", (RsContext)con,
12428c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang              (RsAllocation)alloc1, (RsAllocation)alloc2);
12438c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    }
12448c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang
12458c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    rsAllocationShareBufferQueue((RsContext)con, (RsAllocation)alloc1, (RsAllocation)alloc2);
12468c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang}
12478c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang
124872226e0543461133b9e177a3e78ae50b0c65e797Jason Samsstatic jobject
1249460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationGetSurface(JNIEnv *_env, jobject _this, jlong con, jlong a)
1250615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams{
125167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
125267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationGetSurface, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
125367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1254615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams
125567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    IGraphicBufferProducer *v = (IGraphicBufferProducer *)rsAllocationGetSurface((RsContext)con,
125667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                                                                 (RsAllocation)a);
125772226e0543461133b9e177a3e78ae50b0c65e797Jason Sams    sp<IGraphicBufferProducer> bp = v;
1258488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    v->decStrong(nullptr);
1259fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams
126072226e0543461133b9e177a3e78ae50b0c65e797Jason Sams    jobject o = android_view_Surface_createFromIGraphicBufferProducer(_env, bp);
126172226e0543461133b9e177a3e78ae50b0c65e797Jason Sams    return o;
1262fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams}
1263fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams
1264fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Samsstatic void
1265460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationSetSurface(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject sur)
1266163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams{
126767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
126867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationSetSurface, con(%p), alloc(%p), surface(%p)", (RsContext)con,
126967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsAllocation)alloc, (Surface *)sur);
127067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1271163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
1272fb9aa9f3ef11878caaf6fcfb5ea49ffb9f7abf33Jason Sams    sp<Surface> s;
1273163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams    if (sur != 0) {
127464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        s = android_view_Surface_getSurface(_env, sur);
1275163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams    }
1276163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
127767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    rsAllocationSetSurface((RsContext)con, (RsAllocation)alloc,
127867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                           static_cast<ANativeWindow *>(s.get()));
1279163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams}
1280163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
1281163766cbe798baf8e86eb8201bc6c3def931d59aJason Samsstatic void
1282460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationIoSend(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1283163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams{
128467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
128509993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nAllocationIoSend, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
128667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1287460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray    rsAllocationIoSend((RsContext)con, (RsAllocation)alloc);
1288163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams}
1289163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
12908c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wangstatic jlong
1291460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationIoReceive(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1292163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams{
129367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
129409993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nAllocationIoReceive, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
129567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
12968c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang    return (jlong) rsAllocationIoReceive((RsContext)con, (RsAllocation)alloc);
1297163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams}
1298163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
1299163766cbe798baf8e86eb8201bc6c3def931d59aJason Samsstatic void
1300460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1301f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams{
130267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
130367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationGenerateMipmaps, con(%p), a(%p)", (RsContext)con, (RsAllocation)alloc);
130467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1305eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationGenerateMipmaps((RsContext)con, (RsAllocation)alloc);
1306f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams}
1307f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams
1308460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
130967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,
131067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                            jobject jbitmap, jint usage)
1311fe08d99725efd0dde7ba67ff1979a04fec2ba99fJason Sams{
1312ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1313ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
1314fe08d99725efd0dde7ba67ff1979a04fec2ba99fJason Sams
13155476b450e50939940dcf3f15c92335cee2fc572dJason Sams    bitmap.lockPixels();
13165476b450e50939940dcf3f15c92335cee2fc572dJason Sams    const void* ptr = bitmap.getPixels();
13173aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsAllocationCreateFromBitmap((RsContext)con,
131865bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                                  (RsType)type, (RsAllocationMipmapControl)mip,
131965bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                                  ptr, bitmap.getSize(), usage);
13205476b450e50939940dcf3f15c92335cee2fc572dJason Sams    bitmap.unlockPixels();
13215476b450e50939940dcf3f15c92335cee2fc572dJason Sams    return id;
1322ffe9f48890dde7173a0845d32887fdf94a49b0a7Jason Sams}
1323fe08d99725efd0dde7ba67ff1979a04fec2ba99fJason Sams
1324460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
132567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCreateBitmapBackedAllocation(JNIEnv *_env, jobject _this, jlong con, jlong type,
132667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                        jint mip, jobject jbitmap, jint usage)
1327a314551d69098537337c970da615a8f8af58e1f1Tim Murray{
1328ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1329ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
1330a314551d69098537337c970da615a8f8af58e1f1Tim Murray
1331a314551d69098537337c970da615a8f8af58e1f1Tim Murray    bitmap.lockPixels();
1332a314551d69098537337c970da615a8f8af58e1f1Tim Murray    const void* ptr = bitmap.getPixels();
13333aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsAllocationCreateTyped((RsContext)con,
1334a314551d69098537337c970da615a8f8af58e1f1Tim Murray                                            (RsType)type, (RsAllocationMipmapControl)mip,
13359807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                                            (uint32_t)usage, (uintptr_t)ptr);
1336a314551d69098537337c970da615a8f8af58e1f1Tim Murray    bitmap.unlockPixels();
1337a314551d69098537337c970da615a8f8af58e1f1Tim Murray    return id;
1338a314551d69098537337c970da615a8f8af58e1f1Tim Murray}
1339a314551d69098537337c970da615a8f8af58e1f1Tim Murray
1340460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
134167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,
134267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                jobject jbitmap, jint usage)
134367f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk{
1344ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1345ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
134667f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk
13475476b450e50939940dcf3f15c92335cee2fc572dJason Sams    bitmap.lockPixels();
13485476b450e50939940dcf3f15c92335cee2fc572dJason Sams    const void* ptr = bitmap.getPixels();
13493aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsAllocationCubeCreateFromBitmap((RsContext)con,
135065bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                                      (RsType)type, (RsAllocationMipmapControl)mip,
135165bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                                      ptr, bitmap.getSize(), usage);
13525476b450e50939940dcf3f15c92335cee2fc572dJason Sams    bitmap.unlockPixels();
13535476b450e50939940dcf3f15c92335cee2fc572dJason Sams    return id;
135467f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk}
135567f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk
135626ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchoukstatic void
1357460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
135826ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk{
1359ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1360ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
1361f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams    int w = bitmap.width();
1362f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams    int h = bitmap.height();
136326ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk
13644ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    bitmap.lockPixels();
13654ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    const void* ptr = bitmap.getPixels();
1366eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocation2DData((RsContext)con, (RsAllocation)alloc, 0, 0,
1367304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                       0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X,
136838faea3019b8aa68c25ec7bac3e17964524dad12Tim Murray                       w, h, ptr, bitmap.getSize(), 0);
13694ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    bitmap.unlockPixels();
13708a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams}
13718a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
13724ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Samsstatic void
1373460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationCopyToBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
13748a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams{
1375ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1376ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
13778a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
13784ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    bitmap.lockPixels();
13794ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    void* ptr = bitmap.getPixels();
1380eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationCopyToBitmap((RsContext)con, (RsAllocation)alloc, ptr, bitmap.getSize());
13814ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    bitmap.unlockPixels();
1382835b8544cc333ef87e42b1d71cf8ad3cddccdc19Alex Sakhartchouk    bitmap.notifyPixelsChanged();
13838a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams}
13848a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
1385414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Java object data into the Allocation pointed to by _alloc.
1386d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1387460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
138887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint count, jobject data, jint sizeBytes, jint dataType, jint mSize,
138987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jboolean usePadding)
1390d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
1391e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
139267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
139367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation1DData, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
139467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "dataType(%i)", (RsContext)con, (RsAllocation)alloc, offset, count, sizeBytes,
139567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              dataType);
139667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
139787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation1DData, true,
139887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
1399d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1400d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1401d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1402c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao WangnAllocationElementData(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
1403c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                       jint xoff, jint yoff, jint zoff,
1404c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                       jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
140549bdaf0293408159df18a1d8540360f9623c40f7Jason Sams{
140649bdaf0293408159df18a1d8540360f9623c40f7Jason Sams    jint len = _env->GetArrayLength(data);
140767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
1408c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang        ALOGD("nAllocationElementData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
1409c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang              "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
141067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              sizeBytes);
141167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1412488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1413ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1414ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1415ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1416ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1417c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    rsAllocationElementData((RsContext)con, (RsAllocation)alloc,
1418c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                            xoff, yoff, zoff,
1419c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                            lod, ptr, sizeBytes, compIdx);
142049bdaf0293408159df18a1d8540360f9623c40f7Jason Sams    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
142149bdaf0293408159df18a1d8540360f9623c40f7Jason Sams}
142249bdaf0293408159df18a1d8540360f9623c40f7Jason Sams
1423c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang
1424414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Java object data into the Allocation pointed to by _alloc.
142549bdaf0293408159df18a1d8540360f9623c40f7Jason Samsstatic void
1426460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
142787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType, jint mSize,
142887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jboolean usePadding)
1429d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
1430e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
1431e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
143267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
143367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation2DData, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
143467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
143567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
143687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h;
143787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation2DData, true,
143887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
1439d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1440d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1441414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by srcAlloc into the Allocation
1442414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// pointed to by dstAlloc.
144340a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Samsstatic void
1444eff663f391fa4f119685d5c14489b94661ea126fTim MurraynAllocationData2D_alloc(JNIEnv *_env, jobject _this, jlong con,
1445460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong dstAlloc, jint dstXoff, jint dstYoff,
1446304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                        jint dstMip, jint dstFace,
1447304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                        jint width, jint height,
1448460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong srcAlloc, jint srcXoff, jint srcYoff,
1449304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                        jint srcMip, jint srcFace)
1450304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk{
145167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
145267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation2DData_s, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
145367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " dstMip(%i), dstFace(%i), width(%i), height(%i),"
145467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i), srcFace(%i)",
145567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
145667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
145767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1458304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk
1459eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationCopy2DRange((RsContext)con,
1460304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            (RsAllocation)dstAlloc,
1461304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            dstXoff, dstYoff,
1462304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            dstMip, dstFace,
1463304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            width, height,
1464304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            (RsAllocation)srcAlloc,
1465304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            srcXoff, srcYoff,
1466304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            srcMip, srcFace);
1467304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk}
1468304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk
1469414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Java object data into the Allocation pointed to by _alloc.
1470304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchoukstatic void
1471460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
147287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jint d, jobject data, jint sizeBytes, jint dataType,
147387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
1474b05d689653b1bc94836f716f29e9578677c29075Jason Sams{
1475e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
147667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
147767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation3DData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
147867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
147967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              lod, w, h, d, sizeBytes);
148067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
148187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h * d;
148287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation3DData, true,
148387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
1484b05d689653b1bc94836f716f29e9578677c29075Jason Sams}
1485b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1486414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by srcAlloc into the Allocation
1487414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// pointed to by dstAlloc.
1488b05d689653b1bc94836f716f29e9578677c29075Jason Samsstatic void
1489eff663f391fa4f119685d5c14489b94661ea126fTim MurraynAllocationData3D_alloc(JNIEnv *_env, jobject _this, jlong con,
1490460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong dstAlloc, jint dstXoff, jint dstYoff, jint dstZoff,
1491b05d689653b1bc94836f716f29e9578677c29075Jason Sams                        jint dstMip,
1492b05d689653b1bc94836f716f29e9578677c29075Jason Sams                        jint width, jint height, jint depth,
1493460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong srcAlloc, jint srcXoff, jint srcYoff, jint srcZoff,
1494b05d689653b1bc94836f716f29e9578677c29075Jason Sams                        jint srcMip)
1495b05d689653b1bc94836f716f29e9578677c29075Jason Sams{
149667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
149767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationData3D_alloc, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
149867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " dstMip(%i), width(%i), height(%i),"
149967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i)",
150067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip,
150167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip);
150267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1503b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1504eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationCopy3DRange((RsContext)con,
1505b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            (RsAllocation)dstAlloc,
1506b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            dstXoff, dstYoff, dstZoff, dstMip,
1507b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            width, height, depth,
1508b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            (RsAllocation)srcAlloc,
1509b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            srcXoff, srcYoff, srcZoff, srcMip);
1510b05d689653b1bc94836f716f29e9578677c29075Jason Sams}
1511b05d689653b1bc94836f716f29e9578677c29075Jason Sams
151240a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams
1513414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by _alloc into the Java object data.
151440a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Samsstatic void
151587e908dfdece91b5f504386d4901fa3342dc8083Miao WangnAllocationRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jobject data, jint dataType,
151687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                jint mSize, jboolean usePadding)
1517fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams{
151821659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
151967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
152067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationRead, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
152167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
152287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = 0;
152387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(0, rsAllocationRead, false,
152487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, ptr, len * typeBytes);
1525fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams}
1526fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams
1527414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by _alloc into the Java object data.
1528fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Samsstatic void
1529460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationRead1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
153087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint count, jobject data, jint sizeBytes, jint dataType,
153187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
1532fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams{
153321659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
153467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
153567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation1DRead, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
153667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "dataType(%i)", (RsContext)con, alloc, offset, count, sizeBytes, dataType);
153767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
153887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(0, rsAllocation1DRead, false,
153987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
1540fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams}
1541fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams
1542c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang// Copies from the Element in the Allocation pointed to by _alloc into the Java array data.
1543c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wangstatic void
154445cec0a9711f736df26fd097c6d74834e350f9bcMiao WangnAllocationElementRead(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
1545c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                       jint xoff, jint yoff, jint zoff,
154645cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang                       jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
1547c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang{
154845cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang    jint len = _env->GetArrayLength(data);
1549c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    if (kLogApi) {
155045cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang        ALOGD("nAllocationElementRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
155145cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang              "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
155245cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang              sizeBytes);
1553c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    }
155445cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1555ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1556ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1557ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1558ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
155945cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang    rsAllocationElementRead((RsContext)con, (RsAllocation)alloc,
156045cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang                            xoff, yoff, zoff,
1561a7e2509d8da69ab1c9e14b4ce6608786c572209aJason Sams                            lod, ptr, sizeBytes, compIdx);
1562bfa5e659e7b4cb49178d0e99712478b29f8301a7Miao Wang    _env->ReleaseByteArrayElements(data, ptr, 0);
1563c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang}
1564c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang
1565414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by _alloc into the Java object data.
1566fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Samsstatic void
1567460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
156887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType,
156987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
157040a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams{
157121659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
157221659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
157367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
157467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation2DRead, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
157567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
157667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
157787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h;
157887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(0, rsAllocation2DRead, false,
157987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
158040a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams}
158187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang
1582c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1583c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wangstatic void
1584c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao WangnAllocationRead3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
158587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jint d, jobject data, int sizeBytes, int dataType,
158687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
1587c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang{
1588c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
1589c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    if (kLogApi) {
1590c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang        ALOGD("nAllocation3DRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
1591c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang              " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
1592c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang              lod, w, h, d, sizeBytes);
1593c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    }
159487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h * d;
159587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation3DRead, false,
159687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
1597c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang}
1598d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1599460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1600460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationGetType(JNIEnv *_env, jobject _this, jlong con, jlong a)
1601dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
160267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
160367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationGetType, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
160467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
16053aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t) rsaAllocationGetType((RsContext)con, (RsAllocation)a);
1606dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1607dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
16085edc608a0749ed4b7074b5c1243043eb722c3c31Jason Samsstatic void
1609460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationResize1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint dimX)
16105edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams{
161167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
161267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", (RsContext)con,
161367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsAllocation)alloc, dimX);
161467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1615eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationResize1D((RsContext)con, (RsAllocation)alloc, dimX);
16165edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams}
16175edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams
161846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
161946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Samsstatic jlong
162046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason SamsnAllocationAdapterCreate(JNIEnv *_env, jobject _this, jlong con, jlong basealloc, jlong type)
162146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{
162246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    if (kLogApi) {
162346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        ALOGD("nAllocationAdapterCreate, con(%p), base(%p), type(%p)",
162446ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams              (RsContext)con, (RsAllocation)basealloc, (RsElement)type);
162546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    }
162646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    return (jlong)(uintptr_t) rsAllocationAdapterCreate((RsContext)con, (RsType)type,
162746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                                                        (RsAllocation)basealloc);
162846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
162946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams}
163046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
163146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Samsstatic void
163246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason SamsnAllocationAdapterOffset(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
163346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                        jint x, jint y, jint z, jint face, jint lod,
163446ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                        jint a1, jint a2, jint a3, jint a4)
163546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{
163646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    uint32_t params[] = {
163746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        (uint32_t)x, (uint32_t)y, (uint32_t)z, (uint32_t)face,
163846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        (uint32_t)lod, (uint32_t)a1, (uint32_t)a2, (uint32_t)a3, (uint32_t)a4
163946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    };
164046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    if (kLogApi) {
164146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        ALOGD("nAllocationAdapterOffset, con(%p), alloc(%p), x(%i), y(%i), z(%i), face(%i), lod(%i), arrays(%i %i %i %i)",
164246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams              (RsContext)con, (RsAllocation)alloc, x, y, z, face, lod, a1, a2, a3, a4);
164346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    }
164446ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    rsAllocationAdapterOffset((RsContext)con, (RsAllocation)alloc,
164546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                              params, sizeof(params));
164646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams}
164746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
164846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
1649aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk// -----------------------------------
1650aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1651460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1652460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DCreateFromAssetStream(JNIEnv *_env, jobject _this, jlong con, jlong native_asset)
1653aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
1654aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    Asset* asset = reinterpret_cast<Asset*>(native_asset);
16550e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    ALOGV("______nFileA3D %p", asset);
1656aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
16573aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromMemory((RsContext)con, asset->getBuffer(false), asset->getLength());
1658b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1659b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1660b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1661460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1662eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFileA3DCreateFromAsset(JNIEnv *_env, jobject _this, jlong con, jobject _assetMgr, jstring _path)
1663b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1664b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr);
1665488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (mgr == nullptr) {
1666b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return 0;
1667b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
1668b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1669b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 str(_env, _path);
1670b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
1671488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (asset == nullptr) {
1672b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return 0;
1673b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
1674b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
16753aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromAsset((RsContext)con, asset);
1676b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1677b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1678b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1679460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1680eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFileA3DCreateFromFile(JNIEnv *_env, jobject _this, jlong con, jstring fileName)
1681b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1682b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
16833aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromFile((RsContext)con, fileNameUTF.c_str());
1684b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1685aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    return id;
1686aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1687aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1688460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jint
1689460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DGetNumIndexEntries(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D)
1690aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
1691aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    int32_t numEntries = 0;
1692eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaFileA3DGetNumIndexEntries((RsContext)con, &numEntries, (RsFile)fileA3D);
16930e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    return (jint)numEntries;
1694aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1695aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1696aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchoukstatic void
1697460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DGetIndexEntries(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D, jint numEntries, jintArray _ids, jobjectArray _entries)
1698aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
16990e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    ALOGV("______nFileA3D %p", (RsFile) fileA3D);
1700aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    RsFileIndexEntry *fileEntries = (RsFileIndexEntry*)malloc((uint32_t)numEntries * sizeof(RsFileIndexEntry));
1701aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1702eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaFileA3DGetIndexEntries((RsContext)con, fileEntries, (uint32_t)numEntries, (RsFile)fileA3D);
1703aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1704aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    for(jint i = 0; i < numEntries; i ++) {
1705aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        _env->SetObjectArrayElement(_entries, i, _env->NewStringUTF(fileEntries[i].objectName));
1706aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        _env->SetIntArrayRegion(_ids, i, 1, (const jint*)&fileEntries[i].classID);
1707aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
1708aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1709aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    free(fileEntries);
1710aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1711aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
17120e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1713460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DGetEntryByIndex(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D, jint index)
1714aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
17150e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    ALOGV("______nFileA3D %p", (RsFile) fileA3D);
17163aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DGetEntryByIndex((RsContext)con, (uint32_t)index, (RsFile)fileA3D);
1717aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    return id;
1718aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1719d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1720d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// -----------------------------------
1721d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
17220e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1723eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFontCreateFromFile(JNIEnv *_env, jobject _this, jlong con,
1724b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                    jstring fileName, jfloat fontSize, jint dpi)
17259b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk{
1726b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
17273aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsFontCreateFromFile((RsContext)con,
1728e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                         fileNameUTF.c_str(), fileNameUTF.length(),
1729e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                         fontSize, dpi);
1730b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1731b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1732b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1733b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
17340e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1735eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFontCreateFromAssetStream(JNIEnv *_env, jobject _this, jlong con,
17360e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                           jstring name, jfloat fontSize, jint dpi, jlong native_asset)
1737b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1738b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    Asset* asset = reinterpret_cast<Asset*>(native_asset);
1739b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 nameUTF(_env, name);
1740b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
17413aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsFontCreateFromMemory((RsContext)con,
1742e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                           nameUTF.c_str(), nameUTF.length(),
1743e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                           fontSize, dpi,
1744b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                                           asset->getBuffer(false), asset->getLength());
1745b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1746b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1747b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
17480e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1749eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFontCreateFromAsset(JNIEnv *_env, jobject _this, jlong con, jobject _assetMgr, jstring _path,
1750b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                     jfloat fontSize, jint dpi)
1751b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1752b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr);
1753488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (mgr == nullptr) {
1754b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return 0;
1755b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
1756b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1757b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 str(_env, _path);
1758b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
1759488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (asset == nullptr) {
1760b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return 0;
1761b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
17629b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk
17633aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsFontCreateFromMemory((RsContext)con,
1764e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                           str.c_str(), str.length(),
1765e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                           fontSize, dpi,
1766b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                                           asset->getBuffer(false), asset->getLength());
1767b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    delete asset;
17689b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    return id;
17699b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk}
17709b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk
1771bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams// -----------------------------------
1772bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams
1773bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Samsstatic void
1774460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptBindAllocation(JNIEnv *_env, jobject _this, jlong con, jlong script, jlong alloc, jint slot)
1775d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
177667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
177767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)", (RsContext)con,
177867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsScript)script, (RsAllocation)alloc, slot);
177967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1780eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
1781d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1782d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1783d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1784460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jint val)
17854d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams{
178667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
178767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con, (void *)script,
178867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
178967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1790eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarI((RsContext)con, (RsScript)script, slot, val);
17914d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams}
17924d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
17937c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jint
1794460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
17957c4caadb939b1563328251c156262c179a685c70Tim Murray{
179667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
179767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarI, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
179867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
17997c4caadb939b1563328251c156262c179a685c70Tim Murray    int value = 0;
1800eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18017c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18027c4caadb939b1563328251c156262c179a685c70Tim Murray}
18037c4caadb939b1563328251c156262c179a685c70Tim Murray
18044d3399337d18ef04116bc8a2e5799274655d0c30Jason Samsstatic void
1805460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarObj(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val)
18066f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams{
180767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
180809993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%" PRId64 ")", (RsContext)con, (void *)script,
180967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
181067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1811eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val);
18126f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams}
18136f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams
18146f4cf0b8885403ead157ae00fd43cf1282331c23Jason Samsstatic void
1815460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val)
1816031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines{
181767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
181809993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%" PRId64 ")", (RsContext)con, (void *)script,
181967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
182067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1821eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarJ((RsContext)con, (RsScript)script, slot, val);
1822031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines}
1823031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines
18247c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jlong
1825460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
18267c4caadb939b1563328251c156262c179a685c70Tim Murray{
182767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
182867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarJ, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
182967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18307c4caadb939b1563328251c156262c179a685c70Tim Murray    jlong value = 0;
1831eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18327c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18337c4caadb939b1563328251c156262c179a685c70Tim Murray}
18347c4caadb939b1563328251c156262c179a685c70Tim Murray
1835031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hinesstatic void
1836460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, float val)
18374d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams{
183867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
183967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", (RsContext)con, (void *)script,
184067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
184167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1842eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarF((RsContext)con, (RsScript)script, slot, val);
18434d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams}
18444d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
18457c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jfloat
1846460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
18477c4caadb939b1563328251c156262c179a685c70Tim Murray{
184867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
184967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarF, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
185067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18517c4caadb939b1563328251c156262c179a685c70Tim Murray    jfloat value = 0;
1852eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18537c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18547c4caadb939b1563328251c156262c179a685c70Tim Murray}
18557c4caadb939b1563328251c156262c179a685c70Tim Murray
18564d3399337d18ef04116bc8a2e5799274655d0c30Jason Samsstatic void
1857460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, double val)
1858ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines{
185967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
186067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", (RsContext)con, (void *)script,
186167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
186267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1863eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarD((RsContext)con, (RsScript)script, slot, val);
1864ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines}
1865ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines
18667c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jdouble
1867460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
18687c4caadb939b1563328251c156262c179a685c70Tim Murray{
186967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
187067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarD, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
187167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18727c4caadb939b1563328251c156262c179a685c70Tim Murray    jdouble value = 0;
1873eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18747c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18757c4caadb939b1563328251c156262c179a685c70Tim Murray}
18767c4caadb939b1563328251c156262c179a685c70Tim Murray
1877ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hinesstatic void
1878460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data)
18794d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams{
188067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
188167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
188267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18834d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    jint len = _env->GetArrayLength(data);
1884488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1885ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1886ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1887ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1888ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1889eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
18904d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
18914d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams}
18924d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1893adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hinesstatic void
1894460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data)
18957c4caadb939b1563328251c156262c179a685c70Tim Murray{
189667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
189767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
189867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18997c4caadb939b1563328251c156262c179a685c70Tim Murray    jint len = _env->GetArrayLength(data);
1900488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1901ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1902ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1903ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1904ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1905eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
1906414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines    _env->ReleaseByteArrayElements(data, ptr, 0);
19077c4caadb939b1563328251c156262c179a685c70Tim Murray}
19087c4caadb939b1563328251c156262c179a685c70Tim Murray
19097c4caadb939b1563328251c156262c179a685c70Tim Murraystatic void
191067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenScriptSetVarVE(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data,
191167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                jlong elem, jintArray dims)
1912adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines{
191367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
191467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarVE, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
191567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1916adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    jint len = _env->GetArrayLength(data);
1917488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1918ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1919ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1920ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1921ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1922adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    jint dimsLen = _env->GetArrayLength(dims) * sizeof(int);
1923488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *dimsPtr = _env->GetIntArrayElements(dims, nullptr);
1924ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (dimsPtr == nullptr) {
1925ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1926ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1927ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1928eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem,
1929bc5d3eeedcbdff2e8331a6792902c6992db9bd31Stephen Hines                     (const uint32_t*) dimsPtr, dimsLen);
1930adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1931adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    _env->ReleaseIntArrayElements(dims, dimsPtr, JNI_ABORT);
1932adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines}
1933adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines
1934d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1935d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1936460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetTimeZone(JNIEnv *_env, jobject _this, jlong con, jlong script, jbyteArray timeZone)
1937584a375df68ed7d62b38389078c6804edf228f9cRomain Guy{
193867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
193967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptCSetTimeZone, con(%p), s(%p)", (RsContext)con, (void *)script);
194067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1941584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
1942584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    jint length = _env->GetArrayLength(timeZone);
1943584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    jbyte* timeZone_ptr;
1944584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0);
1945ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (timeZone_ptr == nullptr) {
1946ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1947ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1948ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1949584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
1950eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length);
1951584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
1952584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    if (timeZone_ptr) {
1953584a375df68ed7d62b38389078c6804edf228f9cRomain Guy        _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0);
1954584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    }
1955584a375df68ed7d62b38389078c6804edf228f9cRomain Guy}
1956584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
195722534176fb5c1257130ef4ee589739ca42766a32Jason Samsstatic void
1958460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptInvoke(JNIEnv *_env, jobject _this, jlong con, jlong obj, jint slot)
195922534176fb5c1257130ef4ee589739ca42766a32Jason Sams{
196067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
196167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptInvoke, con(%p), script(%p)", (RsContext)con, (void *)obj);
196267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1963eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptInvoke((RsContext)con, (RsScript)obj, slot);
196422534176fb5c1257130ef4ee589739ca42766a32Jason Sams}
196522534176fb5c1257130ef4ee589739ca42766a32Jason Sams
1966584a375df68ed7d62b38389078c6804edf228f9cRomain Guystatic void
1967460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptInvokeV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data)
1968be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams{
196967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
197067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptInvokeV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
197167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
19724d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    jint len = _env->GetArrayLength(data);
1973488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1974ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1975ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1976ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1977ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1978eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len);
19794d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1980be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams}
1981be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams
19826e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Samsstatic void
1983be7b1defb6b11920703b241ba5815fb09487bb02Chris WailesnScriptForEach(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
1984be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes               jlongArray ains, jlong aout, jbyteArray params,
1985be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes               jintArray limits)
19866e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Sams{
198767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
19889eb9dd326ae93cd84eb9bbc740f753fe8d8c7a13Chih-Hung Hsieh        ALOGD("nScriptForEach, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
198967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1990949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
1991be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    jint   in_len = 0;
1992488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *in_ptr = nullptr;
1993949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
1994488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    RsAllocation *in_allocs = nullptr;
1995949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
1996488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (ains != nullptr) {
1997be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        in_len = _env->GetArrayLength(ains);
19987b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni        if (in_len > (jint)RS_KERNEL_MAX_ARGUMENTS) {
199917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            ALOGE("Too many arguments in kernel launch.");
200017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            // TODO (b/20758983): Report back to Java and throw an exception
200117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            return;
200217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni        }
2003eb3470219dea322efa93eb4b5457813ce71d0c5dChris Wailes
200417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni        in_ptr = _env->GetLongArrayElements(ains, nullptr);
2005ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (in_ptr == nullptr) {
2006ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
2007ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
2008ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
2009ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
2010be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        if (sizeof(RsAllocation) == sizeof(jlong)) {
2011be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            in_allocs = (RsAllocation*)in_ptr;
2012be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        } else {
2013be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            // Convert from 64-bit jlong types to the native pointer type.
2014eb3470219dea322efa93eb4b5457813ce71d0c5dChris Wailes
2015be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            in_allocs = (RsAllocation*)alloca(in_len * sizeof(RsAllocation));
201617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            if (in_allocs == nullptr) {
201717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni                ALOGE("Failed launching kernel for lack of memory.");
201817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni                _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
201917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni                return;
202017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            }
2021be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2022be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            for (int index = in_len; --index >= 0;) {
2023be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                in_allocs[index] = (RsAllocation)in_ptr[index];
2024be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            }
2025be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        }
2026949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes    }
2027949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2028be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    jint   param_len = 0;
2029488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *param_ptr = nullptr;
2030be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2031488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (params != nullptr) {
2032be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        param_len = _env->GetArrayLength(params);
2033488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        param_ptr = _env->GetByteArrayElements(params, nullptr);
2034ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (param_ptr == nullptr) {
2035ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
2036ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
2037ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
2038c9c7daf69b32c0e72a3b99379cc5116c1647f24eStephen Hines    }
2039949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2040488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    RsScriptCall sc, *sca = nullptr;
2041be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    uint32_t sc_size = 0;
2042949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2043be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    jint  limit_len = 0;
2044488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *limit_ptr = nullptr;
2045949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2046488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (limits != nullptr) {
2047be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        limit_len = _env->GetArrayLength(limits);
2048488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        limit_ptr = _env->GetIntArrayElements(limits, nullptr);
2049ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (limit_ptr == nullptr) {
2050ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
2051ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
2052ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
2053949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2054be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        assert(limit_len == 6);
205567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        UNUSED(limit_len);  // As the assert might not be compiled.
2056949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2057be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.xStart     = limit_ptr[0];
2058be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.xEnd       = limit_ptr[1];
2059be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.yStart     = limit_ptr[2];
2060be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.yEnd       = limit_ptr[3];
2061be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.zStart     = limit_ptr[4];
2062be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.zEnd       = limit_ptr[5];
2063be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.strategy   = RS_FOR_EACH_STRATEGY_DONT_CARE;
206414331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.arrayStart = 0;
206514331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.arrayEnd = 0;
206614331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array2Start = 0;
206714331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array2End = 0;
206814331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array3Start = 0;
206914331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array3End = 0;
207014331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array4Start = 0;
207114331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array4End = 0;
2072949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2073be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sca = &sc;
2074be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    }
2075949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2076be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    rsScriptForEachMulti((RsContext)con, (RsScript)script, slot,
2077be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                         in_allocs, in_len, (RsAllocation)aout,
2078be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                         param_ptr, param_len, sca, sc_size);
2079949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2080488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (ains != nullptr) {
2081be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
2082949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes    }
2083949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2084488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (params != nullptr) {
2085be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        _env->ReleaseByteArrayElements(params, param_ptr, JNI_ABORT);
2086eb3470219dea322efa93eb4b5457813ce71d0c5dChris Wailes    }
2087c9c7daf69b32c0e72a3b99379cc5116c1647f24eStephen Hines
2088488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (limits != nullptr) {
2089be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
2090be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    }
2091949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes}
2092949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
209336eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Walastatic void
209436eb1f74b3d19d9dbae0803f3bc271683be811ceMatt WalanScriptReduce(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
209536eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala              jlong ain, jlong aout, jintArray limits)
209636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala{
209736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    if (kLogApi) {
209836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        ALOGD("nScriptReduce, con(%p), s(%p), slot(%i) ain(%" PRId64 ") aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ain, aout);
209936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    }
210036eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
210136eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    RsScriptCall sc, *sca = nullptr;
210236eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    uint32_t sc_size = 0;
210336eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
210436eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    jint  limit_len = 0;
210536eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    jint *limit_ptr = nullptr;
210636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
210736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    // If the caller passed limits, reflect them in the RsScriptCall.
210836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    if (limits != nullptr) {
210936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        limit_len = _env->GetArrayLength(limits);
211036eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        limit_ptr = _env->GetIntArrayElements(limits, nullptr);
2111ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (limit_ptr == nullptr) {
2112ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
2113ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
2114ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
211536eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
211636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        // We expect to be passed an array [x1, x2] which specifies
211736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        // the sub-range for a 1-dimensional reduction.
211836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        assert(limit_len == 2);
211936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        UNUSED(limit_len);  // As the assert might not be compiled.
212036eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
212136eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.xStart     = limit_ptr[0];
212236eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.xEnd       = limit_ptr[1];
212336eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.yStart     = 0;
212436eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.yEnd       = 0;
212536eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.zStart     = 0;
212636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.zEnd       = 0;
212736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.strategy   = RS_FOR_EACH_STRATEGY_DONT_CARE;
212836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.arrayStart = 0;
212936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.arrayEnd = 0;
213036eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.array2Start = 0;
213136eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.array2End = 0;
213236eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.array3Start = 0;
213336eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.array3End = 0;
213436eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.array4Start = 0;
213536eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.array4End = 0;
213636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
213736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sca = &sc;
213836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc_size = sizeof(sc);
213936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    }
214036eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
214136eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    rsScriptReduce((RsContext)con, (RsScript)script, slot,
214236eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala                   (RsAllocation)ain, (RsAllocation)aout,
214336eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala                   sca, sc_size);
214436eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
214536eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    if (limits != nullptr) {
214636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
214736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    }
214836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala}
214936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
215026ef7a739b724452f93f850a1c268c42e439317bDavid Grossstatic void
215126ef7a739b724452f93f850a1c268c42e439317bDavid GrossnScriptReduceNew(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
215226ef7a739b724452f93f850a1c268c42e439317bDavid Gross                 jlongArray ains, jlong aout, jintArray limits)
215326ef7a739b724452f93f850a1c268c42e439317bDavid Gross{
215426ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (kLogApi) {
215526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        ALOGD("nScriptReduceNew, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
215626ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
215726ef7a739b724452f93f850a1c268c42e439317bDavid Gross
215826ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (ains == nullptr) {
215926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        ALOGE("At least one input required.");
216026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        // TODO (b/20758983): Report back to Java and throw an exception
216126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        return;
216226ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
216326ef7a739b724452f93f850a1c268c42e439317bDavid Gross    jint in_len = _env->GetArrayLength(ains);
216426ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (in_len > (jint)RS_KERNEL_MAX_ARGUMENTS) {
216526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        ALOGE("Too many arguments in kernel launch.");
216626ef7a739b724452f93f850a1c268c42e439317bDavid Gross        // TODO (b/20758983): Report back to Java and throw an exception
216726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        return;
216826ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
216926ef7a739b724452f93f850a1c268c42e439317bDavid Gross
217026ef7a739b724452f93f850a1c268c42e439317bDavid Gross    jlong *in_ptr = _env->GetLongArrayElements(ains, nullptr);
217126ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (in_ptr == nullptr) {
217226ef7a739b724452f93f850a1c268c42e439317bDavid Gross        ALOGE("Failed to get Java array elements");
217326ef7a739b724452f93f850a1c268c42e439317bDavid Gross        // TODO (b/20758983): Report back to Java and throw an exception
217426ef7a739b724452f93f850a1c268c42e439317bDavid Gross        return;
217526ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
217626ef7a739b724452f93f850a1c268c42e439317bDavid Gross
217726ef7a739b724452f93f850a1c268c42e439317bDavid Gross    RsAllocation *in_allocs = nullptr;
217826ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (sizeof(RsAllocation) == sizeof(jlong)) {
217926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        in_allocs = (RsAllocation*)in_ptr;
218026ef7a739b724452f93f850a1c268c42e439317bDavid Gross    } else {
218126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        // Convert from 64-bit jlong types to the native pointer type.
218226ef7a739b724452f93f850a1c268c42e439317bDavid Gross
218326ef7a739b724452f93f850a1c268c42e439317bDavid Gross        in_allocs = (RsAllocation*)alloca(in_len * sizeof(RsAllocation));
218426ef7a739b724452f93f850a1c268c42e439317bDavid Gross        if (in_allocs == nullptr) {
218526ef7a739b724452f93f850a1c268c42e439317bDavid Gross            ALOGE("Failed launching kernel for lack of memory.");
218626ef7a739b724452f93f850a1c268c42e439317bDavid Gross            // TODO (b/20758983): Report back to Java and throw an exception
218726ef7a739b724452f93f850a1c268c42e439317bDavid Gross            _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
218826ef7a739b724452f93f850a1c268c42e439317bDavid Gross            return;
218926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
219026ef7a739b724452f93f850a1c268c42e439317bDavid Gross
219126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        for (int index = in_len; --index >= 0;) {
219226ef7a739b724452f93f850a1c268c42e439317bDavid Gross            in_allocs[index] = (RsAllocation)in_ptr[index];
219326ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
219426ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
219526ef7a739b724452f93f850a1c268c42e439317bDavid Gross
219626ef7a739b724452f93f850a1c268c42e439317bDavid Gross    RsScriptCall sc, *sca = nullptr;
219726ef7a739b724452f93f850a1c268c42e439317bDavid Gross    uint32_t sc_size = 0;
219826ef7a739b724452f93f850a1c268c42e439317bDavid Gross
219926ef7a739b724452f93f850a1c268c42e439317bDavid Gross    jint  limit_len = 0;
220026ef7a739b724452f93f850a1c268c42e439317bDavid Gross    jint *limit_ptr = nullptr;
220126ef7a739b724452f93f850a1c268c42e439317bDavid Gross
220226ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (limits != nullptr) {
220326ef7a739b724452f93f850a1c268c42e439317bDavid Gross        limit_len = _env->GetArrayLength(limits);
220426ef7a739b724452f93f850a1c268c42e439317bDavid Gross        limit_ptr = _env->GetIntArrayElements(limits, nullptr);
220526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        if (limit_ptr == nullptr) {
220626ef7a739b724452f93f850a1c268c42e439317bDavid Gross            ALOGE("Failed to get Java array elements");
220726ef7a739b724452f93f850a1c268c42e439317bDavid Gross            // TODO (b/20758983): Report back to Java and throw an exception
220826ef7a739b724452f93f850a1c268c42e439317bDavid Gross            return;
220926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
221026ef7a739b724452f93f850a1c268c42e439317bDavid Gross
221126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        assert(limit_len == 6);
221226ef7a739b724452f93f850a1c268c42e439317bDavid Gross        UNUSED(limit_len);  // As the assert might not be compiled.
221326ef7a739b724452f93f850a1c268c42e439317bDavid Gross
221426ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.xStart     = limit_ptr[0];
221526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.xEnd       = limit_ptr[1];
221626ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.yStart     = limit_ptr[2];
221726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.yEnd       = limit_ptr[3];
221826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.zStart     = limit_ptr[4];
221926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.zEnd       = limit_ptr[5];
222026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.strategy   = RS_FOR_EACH_STRATEGY_DONT_CARE;
222126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.arrayStart = 0;
222226ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.arrayEnd = 0;
222326ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array2Start = 0;
222426ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array2End = 0;
222526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array3Start = 0;
222626ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array3End = 0;
222726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array4Start = 0;
222826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc.array4End = 0;
222926ef7a739b724452f93f850a1c268c42e439317bDavid Gross
223026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sca = &sc;
223126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        sc_size = sizeof(sc);
223226ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
223326ef7a739b724452f93f850a1c268c42e439317bDavid Gross
223426ef7a739b724452f93f850a1c268c42e439317bDavid Gross    rsScriptReduceNew((RsContext)con, (RsScript)script, slot,
223526ef7a739b724452f93f850a1c268c42e439317bDavid Gross                      in_allocs, in_len, (RsAllocation)aout,
223626ef7a739b724452f93f850a1c268c42e439317bDavid Gross                      sca, sc_size);
223726ef7a739b724452f93f850a1c268c42e439317bDavid Gross
223826ef7a739b724452f93f850a1c268c42e439317bDavid Gross    _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
223926ef7a739b724452f93f850a1c268c42e439317bDavid Gross
224026ef7a739b724452f93f850a1c268c42e439317bDavid Gross    if (limits != nullptr) {
224126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
224226ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
224326ef7a739b724452f93f850a1c268c42e439317bDavid Gross}
224426ef7a739b724452f93f850a1c268c42e439317bDavid Gross
2245fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams// -----------------------------------
2246fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams
22470e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
2248eff663f391fa4f119685d5c14489b94661ea126fTim MurraynScriptCCreate(JNIEnv *_env, jobject _this, jlong con,
2249e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams               jstring resName, jstring cacheDir,
2250e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams               jbyteArray scriptRef, jint length)
2251d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
225267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
225367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptCCreate, con(%p)", (RsContext)con);
225467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2255e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams
2256e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    AutoJavaStringToUTF8 resNameUTF(_env, resName);
2257e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
22580e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    jlong ret = 0;
2259488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte* script_ptr = nullptr;
226043702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    jint _exception = 0;
226143702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    jint remaining;
226243702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    if (!scriptRef) {
226343702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _exception = 1;
22648451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null");
226543702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        goto exit;
226643702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
226743702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    if (length < 0) {
226843702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _exception = 1;
22698451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0");
227043702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        goto exit;
227143702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
2272e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    remaining = _env->GetArrayLength(scriptRef);
227343702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    if (remaining < length) {
227443702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _exception = 1;
22758451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //jniThrowException(_env, "java/lang/IllegalArgumentException",
22768451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //        "length > script.length - offset");
227743702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        goto exit;
227843702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
2279e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    script_ptr = (jbyte *)
228043702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0);
2281ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (script_ptr == nullptr) {
2282ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
2283ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return ret;
2284ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
228543702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich
2286eff663f391fa4f119685d5c14489b94661ea126fTim Murray    //rsScriptCSetText((RsContext)con, (const char *)script_ptr, length);
2287e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams
22883aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    ret = (jlong)(uintptr_t)rsScriptCCreate((RsContext)con,
2289e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                resNameUTF.c_str(), resNameUTF.length(),
2290e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                cacheDirUTF.c_str(), cacheDirUTF.length(),
2291e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams                                (const char *)script_ptr, length);
229239ddc950c9064129ead5de04b200106c0659f937Jason Sams
229343702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevichexit:
2294e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    if (script_ptr) {
2295e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams        _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr,
229643702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich                _exception ? JNI_ABORT: 0);
229743702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
2298d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
22993aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)ret;
2300d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2301d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2302460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2303460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptIntrinsicCreate(JNIEnv *_env, jobject _this, jlong con, jint id, jlong eid)
23046ab97682fd444586ee135912a4210417a1c8781bJason Sams{
230567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
230667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptIntrinsicCreate, con(%p) id(%i) element(%p)", (RsContext)con, id,
230767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)eid);
230867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
23093aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
23106ab97682fd444586ee135912a4210417a1c8781bJason Sams}
23116ab97682fd444586ee135912a4210417a1c8781bJason Sams
2312460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2313460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptKernelIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jint sig)
231408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
231567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
231667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptKernelIDCreate, con(%p) script(%p), slot(%i), sig(%i)", (RsContext)con,
231767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)sid, slot, sig);
231867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
23193aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsScriptKernelIDCreate((RsContext)con, (RsScript)sid, slot, sig);
232008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
232108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2322460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2323be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang NinScriptInvokeIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
2324be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni{
2325be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    if (kLogApi) {
23267ff53fa0d42795da55b65468e07df82029deda79Elliott Hughes        ALOGD("nScriptInvokeIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con,
2327be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni              (void *)sid, slot);
2328be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    }
2329be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    return (jlong)(uintptr_t)rsScriptInvokeIDCreate((RsContext)con, (RsScript)sid, slot);
2330be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni}
2331be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
2332be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Nistatic jlong
2333460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptFieldIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
233408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
233567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
233667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptFieldIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con, (void *)sid,
233767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot);
233867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
23393aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
234008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
234108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2342460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
23439807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnScriptGroupCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _kernels, jlongArray _src,
23449807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    jlongArray _dstk, jlongArray _dstf, jlongArray _types)
234508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
234667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
234767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupCreate, con(%p)", (RsContext)con);
234867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
234908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2350f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    jlong id = 0;
2351f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang
2352f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    RsScriptKernelID* kernelsPtr;
23539807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    jint kernelsLen = _env->GetArrayLength(_kernels);
2354488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jKernelsPtr = _env->GetLongArrayElements(_kernels, nullptr);
2355f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang
2356f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    RsScriptKernelID* srcPtr;
2357f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    jint srcLen = _env->GetArrayLength(_src);
2358f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    jlong *jSrcPtr = _env->GetLongArrayElements(_src, nullptr);
2359f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang
2360f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    RsScriptKernelID* dstkPtr;
2361f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    jint dstkLen = _env->GetArrayLength(_dstk);
2362f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    jlong *jDstkPtr = _env->GetLongArrayElements(_dstk, nullptr);
2363f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang
2364f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    RsScriptKernelID* dstfPtr;
2365f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    jint dstfLen = _env->GetArrayLength(_dstf);
2366f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    jlong *jDstfPtr = _env->GetLongArrayElements(_dstf, nullptr);
2367f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang
2368f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    RsType* typesPtr;
2369f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    jint typesLen = _env->GetArrayLength(_types);
2370f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    jlong *jTypesPtr = _env->GetLongArrayElements(_types, nullptr);
2371f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang
2372ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jKernelsPtr == nullptr) {
2373ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: kernels");
2374f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        goto cleanup;
2375f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    }
2376f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    if (jSrcPtr == nullptr) {
2377f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        ALOGE("Failed to get Java array elements: src");
2378f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        goto cleanup;
2379f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    }
2380f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    if (jDstkPtr == nullptr) {
2381f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        ALOGE("Failed to get Java array elements: dstk");
2382f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        goto cleanup;
2383f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    }
2384f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    if (jDstfPtr == nullptr) {
2385f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        ALOGE("Failed to get Java array elements: dstf");
2386f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        goto cleanup;
2387ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
2388f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    if (jTypesPtr == nullptr) {
2389f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        ALOGE("Failed to get Java array elements: types");
2390f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        goto cleanup;
2391f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    }
2392f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang
2393f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    kernelsPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * kernelsLen);
23949807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < kernelsLen; ++i) {
23959807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        kernelsPtr[i] = (RsScriptKernelID)jKernelsPtr[i];
23969807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
23979807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2398f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    srcPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * srcLen);
23999807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < srcLen; ++i) {
24009807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        srcPtr[i] = (RsScriptKernelID)jSrcPtr[i];
24019807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
24029807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2403f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    dstkPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstkLen);
24049807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < dstkLen; ++i) {
24059807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        dstkPtr[i] = (RsScriptKernelID)jDstkPtr[i];
24069807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
24079807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2408f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    dstfPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstfLen);
24099807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < dstfLen; ++i) {
24109807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        dstfPtr[i] = (RsScriptKernelID)jDstfPtr[i];
24119807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
24129807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2413f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    typesPtr = (RsType*) malloc(sizeof(RsType) * typesLen);
24149807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < typesLen; ++i) {
24159807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        typesPtr[i] = (RsType)jTypesPtr[i];
24169807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
24179807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2418f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    id = (jlong)(uintptr_t)rsScriptGroupCreate((RsContext)con,
24199807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptKernelID *)kernelsPtr, kernelsLen * sizeof(RsScriptKernelID),
24209807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptKernelID *)srcPtr, srcLen * sizeof(RsScriptKernelID),
24219807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptKernelID *)dstkPtr, dstkLen * sizeof(RsScriptKernelID),
24229807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptFieldID *)dstfPtr, dstfLen * sizeof(RsScriptKernelID),
24239807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsType *)typesPtr, typesLen * sizeof(RsType));
24249807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
24259807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(kernelsPtr);
24269807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(srcPtr);
24279807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(dstkPtr);
24289807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(dstfPtr);
24299807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(typesPtr);
2430f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang
2431f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wangcleanup:
2432f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    if (jKernelsPtr != nullptr) {
2433f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        _env->ReleaseLongArrayElements(_kernels, jKernelsPtr, 0);
2434f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    }
2435f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    if (jSrcPtr != nullptr) {
2436f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        _env->ReleaseLongArrayElements(_src, jSrcPtr, 0);
2437f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    }
2438f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    if (jDstkPtr != nullptr) {
2439f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        _env->ReleaseLongArrayElements(_dstk, jDstkPtr, 0);
2440f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    }
2441f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    if (jDstfPtr != nullptr) {
2442f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        _env->ReleaseLongArrayElements(_dstf, jDstfPtr, 0);
2443f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    }
2444f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    if (jTypesPtr != nullptr) {
2445f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        _env->ReleaseLongArrayElements(_types, jTypesPtr, 0);
2446f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    }
2447f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang
244808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    return id;
244908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
245008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
245108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Samsstatic void
2452460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGroupSetInput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
245308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
245467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
245567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupSetInput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
245667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)gid, (void *)kid, (void *)alloc);
245767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2458eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGroupSetInput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid, (RsAllocation)alloc);
245908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
246008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
246108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Samsstatic void
2462460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGroupSetOutput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
246308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
246467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
246567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupSetOutput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
246667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)gid, (void *)kid, (void *)alloc);
246767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2468eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGroupSetOutput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid, (RsAllocation)alloc);
246908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
247008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
247108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Samsstatic void
2472460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGroupExecute(JNIEnv *_env, jobject _this, jlong con, jlong gid)
247308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
247467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
247567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupSetOutput, con(%p) group(%p)", (RsContext)con, (void *)gid);
247667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2477eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGroupExecute((RsContext)con, (RsScriptGroup)gid);
247808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
247908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2480d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
2481d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
24820e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
2483eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramStoreCreate(JNIEnv *_env, jobject _this, jlong con,
2484331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jboolean colorMaskR, jboolean colorMaskG, jboolean colorMaskB, jboolean colorMaskA,
2485331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jboolean depthMask, jboolean ditherEnable,
2486331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jint srcFunc, jint destFunc,
2487331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jint depthFunc)
2488d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
248967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
249067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramStoreCreate, con(%p)", (RsContext)con);
249167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
24923aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsProgramStoreCreate((RsContext)con, colorMaskR, colorMaskG, colorMaskB, colorMaskA,
2493331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                                      depthMask, ditherEnable, (RsBlendSrcFunc)srcFunc,
2494331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                                      (RsBlendDstFunc)destFunc, (RsDepthFunc)depthFunc);
2495d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2496d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
24970011bcf57ff711a221a3a4c73f2a79125111647dJason Sams// ---------------------------------------------------------------------------
24980011bcf57ff711a221a3a4c73f2a79125111647dJason Sams
24990011bcf57ff711a221a3a4c73f2a79125111647dJason Samsstatic void
2500460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynProgramBindConstants(JNIEnv *_env, jobject _this, jlong con, jlong vpv, jint slot, jlong a)
25010011bcf57ff711a221a3a4c73f2a79125111647dJason Sams{
250267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
250367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramBindConstants, con(%p), vpf(%p), sloat(%i), a(%p)", (RsContext)con,
250467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramVertex)vpv, slot, (RsAllocation)a);
250567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2506eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsProgramBindConstants((RsContext)con, (RsProgram)vpv, slot, (RsAllocation)a);
25070011bcf57ff711a221a3a4c73f2a79125111647dJason Sams}
250854c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams
2509d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
2510460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynProgramBindTexture(JNIEnv *_env, jobject _this, jlong con, jlong vpf, jint slot, jlong a)
251154c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams{
251267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
251367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramBindTexture, con(%p), vpf(%p), slot(%i), a(%p)", (RsContext)con,
251467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramFragment)vpf, slot, (RsAllocation)a);
251567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2516eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsProgramBindTexture((RsContext)con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
251754c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams}
251854c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams
251954c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Samsstatic void
2520460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynProgramBindSampler(JNIEnv *_env, jobject _this, jlong con, jlong vpf, jint slot, jlong a)
2521d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
252267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
252367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramBindSampler, con(%p), vpf(%p), slot(%i), a(%p)", (RsContext)con,
252467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramFragment)vpf, slot, (RsSampler)a);
252567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2526eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsProgramBindSampler((RsContext)con, (RsProgramFragment)vpf, slot, (RsSampler)a);
2527d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2528d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
252968afd01ec9fd37774d8291192952a25e5605b6fbJason Sams// ---------------------------------------------------------------------------
2530d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2531460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2532eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramFragmentCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader,
25339807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                       jobjectArray texNames, jlongArray params)
25347e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams{
2535b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 shaderUTF(_env, shader);
2536488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jParamPtr = _env->GetLongArrayElements(params, nullptr);
25377e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams    jint paramLen = _env->GetArrayLength(params);
2538ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jParamPtr == nullptr) {
2539ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
2540ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
2541ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
25427e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
25432123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    int texCount = _env->GetArrayLength(texNames);
25442123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8 names(_env, texNames, texCount);
25452123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char ** nameArray = names.c_str();
25462123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t* sizeArray = names.c_str_len();
25472123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
254867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
254967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramFragmentCreate, con(%p), paramLen(%i)", (RsContext)con, paramLen);
255067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
25517e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
25529807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t * paramPtr = (uintptr_t*) malloc(sizeof(uintptr_t) * paramLen);
25539807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < paramLen; ++i) {
25549807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        paramPtr[i] = (uintptr_t)jParamPtr[i];
25559807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
25563aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong ret = (jlong)(uintptr_t)rsProgramFragmentCreate((RsContext)con, shaderUTF.c_str(), shaderUTF.length(),
25572123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                                             nameArray, texCount, sizeArray,
25589807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                                             paramPtr, paramLen);
25592123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
25609807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(paramPtr);
25619807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(params, jParamPtr, JNI_ABORT);
25627e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams    return ret;
25637e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams}
25647e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
25657e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
25661fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams// ---------------------------------------------------------------------------
25671fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams
2568460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2569eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramVertexCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader,
25709807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                     jobjectArray texNames, jlongArray params)
25711fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams{
2572b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 shaderUTF(_env, shader);
2573488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jParamPtr = _env->GetLongArrayElements(params, nullptr);
25740011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    jint paramLen = _env->GetArrayLength(params);
2575ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jParamPtr == nullptr) {
2576ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
2577ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
2578ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
25791fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams
258067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
258167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramVertexCreate, con(%p), paramLen(%i)", (RsContext)con, paramLen);
258267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2583ee41112e1539de95596600fd2c6dada5d275217fJason Sams
25842123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    int texCount = _env->GetArrayLength(texNames);
25852123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8 names(_env, texNames, texCount);
25862123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char ** nameArray = names.c_str();
25872123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t* sizeArray = names.c_str_len();
25882123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
25899807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t * paramPtr = (uintptr_t*) malloc(sizeof(uintptr_t) * paramLen);
25909807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < paramLen; ++i) {
25919807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        paramPtr[i] = (uintptr_t)jParamPtr[i];
25929807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
25939807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
25943aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong ret = (jlong)(uintptr_t)rsProgramVertexCreate((RsContext)con, shaderUTF.c_str(), shaderUTF.length(),
25952123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                                           nameArray, texCount, sizeArray,
25969807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                                           paramPtr, paramLen);
25972123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
25989807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(paramPtr);
25999807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(params, jParamPtr, JNI_ABORT);
26000011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    return ret;
26011fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams}
26021fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams
2603ebfb436a49673693b98469683451bd9ede797557Jason Sams// ---------------------------------------------------------------------------
2604ebfb436a49673693b98469683451bd9ede797557Jason Sams
2605460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2606eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramRasterCreate(JNIEnv *_env, jobject _this, jlong con, jboolean pointSprite, jint cull)
2607ebfb436a49673693b98469683451bd9ede797557Jason Sams{
260867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
260967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramRasterCreate, con(%p), pointSprite(%i), cull(%i)", (RsContext)con,
261067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              pointSprite, cull);
261167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
26123aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsProgramRasterCreate((RsContext)con, pointSprite, (RsCullMode)cull);
2613ebfb436a49673693b98469683451bd9ede797557Jason Sams}
2614ebfb436a49673693b98469683451bd9ede797557Jason Sams
2615d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2616d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
2617d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2618d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
261978c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindRootScript(JNIEnv *_env, jobject _this, jlong con, jlong script)
2620d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
262167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
262267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindRootScript, con(%p), script(%p)", (RsContext)con, (RsScript)script);
262367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2624eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindRootScript((RsContext)con, (RsScript)script);
2625d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2626d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2627d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
262878c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramStore(JNIEnv *_env, jobject _this, jlong con, jlong pfs)
2629d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
263067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
263167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramStore, con(%p), pfs(%p)", (RsContext)con, (RsProgramStore)pfs);
263267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2633eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramStore((RsContext)con, (RsProgramStore)pfs);
2634d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2635d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2636d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
263778c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramFragment(JNIEnv *_env, jobject _this, jlong con, jlong pf)
2638d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
263967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
264067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramFragment, con(%p), pf(%p)", (RsContext)con,
264167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramFragment)pf);
264267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2643eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramFragment((RsContext)con, (RsProgramFragment)pf);
2644d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2645d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
26460826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samsstatic void
264778c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramVertex(JNIEnv *_env, jobject _this, jlong con, jlong pf)
26480826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams{
264967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
265067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramVertex, con(%p), pf(%p)", (RsContext)con, (RsProgramVertex)pf);
265167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2652eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramVertex((RsContext)con, (RsProgramVertex)pf);
26530826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams}
26540826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams
2655d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onoratostatic void
265678c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramRaster(JNIEnv *_env, jobject _this, jlong con, jlong pf)
2657ebfb436a49673693b98469683451bd9ede797557Jason Sams{
265867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
265967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramRaster, con(%p), pf(%p)", (RsContext)con, (RsProgramRaster)pf);
266067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2661eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramRaster((RsContext)con, (RsProgramRaster)pf);
2662ebfb436a49673693b98469683451bd9ede797557Jason Sams}
2663ebfb436a49673693b98469683451bd9ede797557Jason Sams
2664d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onorato
266502fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams// ---------------------------------------------------------------------------
266602fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams
26670e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
2668eff663f391fa4f119685d5c14489b94661ea126fTim MurraynSamplerCreate(JNIEnv *_env, jobject _this, jlong con, jint magFilter, jint minFilter,
2669a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk               jint wrapS, jint wrapT, jint wrapR, jfloat aniso)
267002fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams{
267167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
267267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nSamplerCreate, con(%p)", (RsContext)con);
267367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
26743aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsSamplerCreate((RsContext)con,
2675a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)magFilter,
2676a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)minFilter,
2677a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)wrapS,
2678a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)wrapT,
2679a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)wrapR,
2680a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 aniso);
268102fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams}
268202fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams
2683bba134c8a1dcfe0c8473307a95899a02c9553504Jason Sams// ---------------------------------------------------------------------------
2684bba134c8a1dcfe0c8473307a95899a02c9553504Jason Sams
2685460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
26869807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnMeshCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _vtx, jlongArray _idx, jintArray _prim)
2687164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk{
268867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
268967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshCreate, con(%p)", (RsContext)con);
269067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2691164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2692f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    jlong id = 0;
2693f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang
2694f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    RsAllocation* vtxPtr;
269525999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk    jint vtxLen = _env->GetArrayLength(_vtx);
2696488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jVtxPtr = _env->GetLongArrayElements(_vtx, nullptr);
2697f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang
2698f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    RsAllocation* idxPtr;
2699f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    jint idxLen = _env->GetArrayLength(_idx);
2700f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    jlong *jIdxPtr = _env->GetLongArrayElements(_idx, nullptr);
2701f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang
2702f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    jint primLen = _env->GetArrayLength(_prim);
2703f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    jint *primPtr = _env->GetIntArrayElements(_prim, nullptr);
2704f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang
2705ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jVtxPtr == nullptr) {
2706ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: vtx");
2707f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        goto cleanupMesh;
2708f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    }
2709f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    if (jIdxPtr == nullptr) {
2710f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        ALOGE("Failed to get Java array elements: idx");
2711f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        goto cleanupMesh;
2712f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    }
2713f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    if (primPtr == nullptr) {
2714f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        ALOGE("Failed to get Java array elements: prim");
2715f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        goto cleanupMesh;
2716ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
2717f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang
2718f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    vtxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * vtxLen);
27199807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < vtxLen; ++i) {
27209807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        vtxPtr[i] = (RsAllocation)(uintptr_t)jVtxPtr[i];
27219807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
27229807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2723f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    idxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * idxLen);
27249807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < idxLen; ++i) {
27259807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        idxPtr[i] = (RsAllocation)(uintptr_t)jIdxPtr[i];
27269807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
27279807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
2728f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    id = (jlong)(uintptr_t)rsMeshCreate((RsContext)con,
2729f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang                                        (RsAllocation *)vtxPtr, vtxLen,
2730f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang                                        (RsAllocation *)idxPtr, idxLen,
2731f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang                                        (uint32_t *)primPtr, primLen);
273280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
27339807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(vtxPtr);
27349807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(idxPtr);
2735f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang
2736f94e77da7e6634937d65a9a608c504de91b53f1cMiao WangcleanupMesh:
2737f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    if (jVtxPtr != nullptr) {
2738f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        _env->ReleaseLongArrayElements(_vtx, jVtxPtr, 0);
2739f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    }
2740f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    if (jIdxPtr != nullptr) {
2741f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        _env->ReleaseLongArrayElements(_idx, jIdxPtr, 0);
2742f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    }
2743f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    if (primPtr != nullptr) {
2744f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang        _env->ReleaseIntArrayElements(_prim, primPtr, 0);
2745f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang    }
2746f94e77da7e6634937d65a9a608c504de91b53f1cMiao Wang
274725999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk    return id;
27489d71e2180062931416092f26276a07e55b318f62Alex Sakhartchouk}
27499d71e2180062931416092f26276a07e55b318f62Alex Sakhartchouk
275080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic jint
2751460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynMeshGetVertexBufferCount(JNIEnv *_env, jobject _this, jlong con, jlong mesh)
275280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
275367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
275467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetVertexBufferCount, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
275567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
275680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    jint vtxCount = 0;
2757eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetVertexBufferCount((RsContext)con, (RsMesh)mesh, &vtxCount);
275880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    return vtxCount;
275980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk}
276080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
276180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic jint
2762460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynMeshGetIndexCount(JNIEnv *_env, jobject _this, jlong con, jlong mesh)
276380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
276467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
276567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetIndexCount, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
276667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
276780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    jint idxCount = 0;
2768eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetIndexCount((RsContext)con, (RsMesh)mesh, &idxCount);
276980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    return idxCount;
277080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk}
277180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
277280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic void
27739807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnMeshGetVertices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jlongArray _ids, jint numVtxIDs)
277480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
277567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
277667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetVertices, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
277767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
277880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
277980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numVtxIDs * sizeof(RsAllocation));
2780eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetVertices((RsContext)con, (RsMesh)mesh, allocs, (uint32_t)numVtxIDs);
278180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
278280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    for(jint i = 0; i < numVtxIDs; i ++) {
27833aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong alloc = (jlong)(uintptr_t)allocs[i];
27849807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_ids, i, 1, &alloc);
278580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    }
278680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
278780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    free(allocs);
278880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk}
278980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
279080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic void
27919807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnMeshGetIndices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jlongArray _idxIds, jintArray _primitives, jint numIndices)
279280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
279367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
279467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetVertices, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
279567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
279680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
279780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numIndices * sizeof(RsAllocation));
279880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    uint32_t *prims= (uint32_t*)malloc((uint32_t)numIndices * sizeof(uint32_t));
279980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
2800eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetIndices((RsContext)con, (RsMesh)mesh, allocs, prims, (uint32_t)numIndices);
280180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
280280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    for(jint i = 0; i < numIndices; i ++) {
28033aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong alloc = (jlong)(uintptr_t)allocs[i];
28049807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        const jint prim = (jint)prims[i];
28059807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_idxIds, i, 1, &alloc);
28069807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetIntArrayRegion(_primitives, i, 1, &prim);
280780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    }
280880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
280980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    free(allocs);
281080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    free(prims);
2811164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk}
2812164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
281356f9e6f8d5436d50530807950661e66ca5efe2bbTim Murraystatic jint
281456f9e6f8d5436d50530807950661e66ca5efe2bbTim MurraynSystemGetPointerSize(JNIEnv *_env, jobject _this) {
281556f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray    return (jint)sizeof(void*);
281656f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray}
281756f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray
28180facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wangstatic jobject
28190facf021ea1a0399d956372b9d3ad9025a9a04d2Miao WangnAllocationGetByteBuffer(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
28200facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang                        jlongArray strideArr, jint xBytesSize,
28210facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang                        jint dimY, jint dimZ) {
28220facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    if (kLogApi) {
28230facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        ALOGD("nAllocationGetByteBuffer, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
28240facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    }
28250facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang
28260facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    jlong *jStridePtr = _env->GetLongArrayElements(strideArr, nullptr);
28270facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    if (jStridePtr == nullptr) {
28280facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        ALOGE("Failed to get Java array elements: strideArr");
28290facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        return 0;
28300facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    }
283156f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray
28320facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    size_t strideIn = xBytesSize;
28330facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    void* ptr = nullptr;
28340facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    if (alloc != 0) {
28350facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        ptr = rsAllocationGetPointer((RsContext)con, (RsAllocation)alloc, 0,
28360facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang                                     RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 0, 0,
28370facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang                                     &strideIn, sizeof(size_t));
28380facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    }
28390facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang
28400facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    jobject byteBuffer = nullptr;
28410facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    if (ptr != nullptr) {
28420facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        size_t bufferSize = strideIn;
28430facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        jStridePtr[0] = strideIn;
28440facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        if (dimY > 0) {
28450facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang            bufferSize *= dimY;
28460facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        }
28470facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        if (dimZ > 0) {
28480facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang            bufferSize *= dimZ;
28490facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        }
28500facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang        byteBuffer = _env->NewDirectByteBuffer(ptr, (jlong) bufferSize);
28510facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    }
28520facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    _env->ReleaseLongArrayElements(strideArr, jStridePtr, 0);
28530facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang    return byteBuffer;
28540facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang}
2855164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk// ---------------------------------------------------------------------------
2856164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2857d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
285894d8e90ad78ee1dbc0efa315117688abd126ae55Jason Samsstatic const char *classPathName = "android/renderscript/RenderScript";
2859d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
286076f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod methods[] = {
28611c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams{"_nInit",                         "()V",                                     (void*)_nInit },
28621c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
2863eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nDeviceCreate",                  "()J",                                     (void*)nDeviceCreate },
2864eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nDeviceDestroy",                 "(J)V",                                    (void*)nDeviceDestroy },
2865eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nDeviceSetConfig",               "(JII)V",                                  (void*)nDeviceSetConfig },
2866eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextGetUserMessage",         "(J[I)I",                                  (void*)nContextGetUserMessage },
2867eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextGetErrorMessage",        "(J)Ljava/lang/String;",                   (void*)nContextGetErrorMessage },
2868eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextPeekMessage",            "(J[I)I",                                  (void*)nContextPeekMessage },
28691c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
2870eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextInitToClient",           "(J)V",                                    (void*)nContextInitToClient },
2871eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextDeinitToClient",         "(J)V",                                    (void*)nContextDeinitToClient },
28722e1872fe07cf8952812a417985e6e1f61bdeab5dJason Sams
28732e1872fe07cf8952812a417985e6e1f61bdeab5dJason Sams
28742e1872fe07cf8952812a417985e6e1f61bdeab5dJason Sams// All methods below are thread protected in java.
2875eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextCreate",                 "(JIII)J",                               (void*)nContextCreate },
2876eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextCreateGL",               "(JIIIIIIIIIIIIFI)J",                    (void*)nContextCreateGL },
2877eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextFinish",                 "(J)V",                                  (void*)nContextFinish },
2878eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextSetPriority",            "(JI)V",                                 (void*)nContextSetPriority },
287947f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray{"rsnContextSetCacheDir",            "(JLjava/lang/String;)V",                (void*)nContextSetCacheDir },
2880eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextSetSurface",             "(JIILandroid/view/Surface;)V",          (void*)nContextSetSurface },
2881eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextDestroy",                "(J)V",                                  (void*)nContextDestroy },
2882eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextDump",                   "(JI)V",                                 (void*)nContextDump },
2883eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextPause",                  "(J)V",                                  (void*)nContextPause },
2884eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextResume",                 "(J)V",                                  (void*)nContextResume },
2885eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextSendMessage",            "(JI[I)V",                               (void*)nContextSendMessage },
2886281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnClosureCreate",                 "(JJJ[J[J[I[J[J)J",                      (void*)nClosureCreate },
2887be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni{"rsnInvokeClosureCreate",           "(JJ[B[J[J[I)J",                         (void*)nInvokeClosureCreate },
2888281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnClosureSetArg",                 "(JJIJI)V",                              (void*)nClosureSetArg },
2889281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnClosureSetGlobal",              "(JJJJI)V",                              (void*)nClosureSetGlobal },
2890460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAssignName",                    "(JJ[B)V",                               (void*)nAssignName },
2891460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnGetName",                       "(JJ)Ljava/lang/String;",                (void*)nGetName },
2892460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnObjDestroy",                    "(JJ)V",                                 (void*)nObjDestroy },
2893eff663f391fa4f119685d5c14489b94661ea126fTim Murray
2894460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DCreateFromFile",         "(JLjava/lang/String;)J",                (void*)nFileA3DCreateFromFile },
28950e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFileA3DCreateFromAssetStream",  "(JJ)J",                                 (void*)nFileA3DCreateFromAssetStream },
2896460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DCreateFromAsset",        "(JLandroid/content/res/AssetManager;Ljava/lang/String;)J",            (void*)nFileA3DCreateFromAsset },
2897460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DGetNumIndexEntries",     "(JJ)I",                                 (void*)nFileA3DGetNumIndexEntries },
2898460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DGetIndexEntries",        "(JJI[I[Ljava/lang/String;)V",           (void*)nFileA3DGetIndexEntries },
28990e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFileA3DGetEntryByIndex",        "(JJI)J",                                (void*)nFileA3DGetEntryByIndex },
2900eff663f391fa4f119685d5c14489b94661ea126fTim Murray
29010e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFontCreateFromFile",            "(JLjava/lang/String;FI)J",              (void*)nFontCreateFromFile },
29020e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFontCreateFromAssetStream",     "(JLjava/lang/String;FIJ)J",             (void*)nFontCreateFromAssetStream },
29030e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFontCreateFromAsset",        "(JLandroid/content/res/AssetManager;Ljava/lang/String;FI)J",            (void*)nFontCreateFromAsset },
2904eff663f391fa4f119685d5c14489b94661ea126fTim Murray
2905460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnElementCreate",                 "(JJIZI)J",                              (void*)nElementCreate },
29069807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnElementCreate2",                "(J[J[Ljava/lang/String;[I)J",           (void*)nElementCreate2 },
2907460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnElementGetNativeData",          "(JJ[I)V",                               (void*)nElementGetNativeData },
29089807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnElementGetSubElements",         "(JJ[J[Ljava/lang/String;[I)V",          (void*)nElementGetSubElements },
2909460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
2910460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnTypeCreate",                    "(JJIIIZZI)J",                           (void*)nTypeCreate },
29119807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnTypeGetNativeData",             "(JJ[J)V",                               (void*)nTypeGetNativeData },
2912460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
29139807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnAllocationCreateTyped",         "(JJIIJ)J",                               (void*)nAllocationCreateTyped },
2914460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCreateFromBitmap",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateFromBitmap },
2915460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCreateBitmapBackedAllocation",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateBitmapBackedAllocation },
2916460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCubeCreateFromBitmap","(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCubeCreateFromBitmap },
2917460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
2918460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCopyFromBitmap",      "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyFromBitmap },
2919460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCopyToBitmap",        "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyToBitmap },
2920460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
2921460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationSyncAll",             "(JJI)V",                                (void*)nAllocationSyncAll },
29228c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{"rsnAllocationSetupBufferQueue",    "(JJI)V",                                (void*)nAllocationSetupBufferQueue },
29238c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{"rsnAllocationShareBufferQueue",    "(JJJ)V",                                (void*)nAllocationShareBufferQueue },
2924460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationGetSurface",          "(JJ)Landroid/view/Surface;",            (void*)nAllocationGetSurface },
2925460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationSetSurface",          "(JJLandroid/view/Surface;)V",           (void*)nAllocationSetSurface },
2926460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationIoSend",              "(JJ)V",                                 (void*)nAllocationIoSend },
29278c1509249c5552270d8accc2c9512f499a8f5e2dMiao Wang{"rsnAllocationIoReceive",           "(JJ)J",                                 (void*)nAllocationIoReceive },
292887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationData1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationData1D },
2929c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang{"rsnAllocationElementData",         "(JJIIIII[BI)V",                         (void*)nAllocationElementData },
293087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationData2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationData2D },
2931460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationData2D",              "(JJIIIIIIJIIII)V",                      (void*)nAllocationData2D_alloc },
293287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationData3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",    (void*)nAllocationData3D },
2933460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationData3D",              "(JJIIIIIIIJIIII)V",                     (void*)nAllocationData3D_alloc },
293487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead",                "(JJLjava/lang/Object;IIZ)V",            (void*)nAllocationRead },
293587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationRead1D },
293645cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang{"rsnAllocationElementRead",         "(JJIIIII[BI)V",                         (void*)nAllocationElementRead },
293787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationRead2D },
293887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",    (void*)nAllocationRead3D },
2939460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationGetType",             "(JJ)J",                                 (void*)nAllocationGetType},
2940460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationResize1D",            "(JJI)V",                                (void*)nAllocationResize1D },
2941460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationGenerateMipmaps",     "(JJ)V",                                 (void*)nAllocationGenerateMipmaps },
2942460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
294346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{"rsnAllocationAdapterCreate",       "(JJJ)J",                                (void*)nAllocationAdapterCreate },
294446ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{"rsnAllocationAdapterOffset",       "(JJIIIIIIIII)V",                        (void*)nAllocationAdapterOffset },
294546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
2946460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptBindAllocation",          "(JJJI)V",                               (void*)nScriptBindAllocation },
2947460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetTimeZone",             "(JJ[B)V",                               (void*)nScriptSetTimeZone },
2948460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptInvoke",                  "(JJI)V",                                (void*)nScriptInvoke },
2949460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptInvokeV",                 "(JJI[B)V",                              (void*)nScriptInvokeV },
2950be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2951be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes{"rsnScriptForEach",                 "(JJI[JJ[B[I)V",                         (void*)nScriptForEach },
295236eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala{"rsnScriptReduce",                  "(JJIJJ[I)V",                            (void*)nScriptReduce },
295326ef7a739b724452f93f850a1c268c42e439317bDavid Gross{"rsnScriptReduceNew",               "(JJI[JJ[I)V",                           (void*)nScriptReduceNew },
2954be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2955460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarI",                 "(JJII)V",                               (void*)nScriptSetVarI },
2956460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarI",                 "(JJI)I",                                (void*)nScriptGetVarI },
2957460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarJ",                 "(JJIJ)V",                               (void*)nScriptSetVarJ },
2958460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarJ",                 "(JJI)J",                                (void*)nScriptGetVarJ },
2959460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarF",                 "(JJIF)V",                               (void*)nScriptSetVarF },
2960460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarF",                 "(JJI)F",                                (void*)nScriptGetVarF },
2961460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarD",                 "(JJID)V",                               (void*)nScriptSetVarD },
2962460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarD",                 "(JJI)D",                                (void*)nScriptGetVarD },
2963460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarV",                 "(JJI[B)V",                              (void*)nScriptSetVarV },
2964460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarV",                 "(JJI[B)V",                              (void*)nScriptGetVarV },
2965460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarVE",                "(JJI[BJ[I)V",                           (void*)nScriptSetVarVE },
2966460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarObj",               "(JJIJ)V",                               (void*)nScriptSetVarObj },
2967eff663f391fa4f119685d5c14489b94661ea126fTim Murray
29680e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnScriptCCreate",                 "(JLjava/lang/String;Ljava/lang/String;[BI)J",  (void*)nScriptCCreate },
2969460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptIntrinsicCreate",         "(JIJ)J",                                (void*)nScriptIntrinsicCreate },
2970460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptKernelIDCreate",          "(JJII)J",                               (void*)nScriptKernelIDCreate },
2971be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni{"rsnScriptInvokeIDCreate",          "(JJI)J",                                (void*)nScriptInvokeIDCreate },
2972460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptFieldIDCreate",           "(JJI)J",                                (void*)nScriptFieldIDCreate },
29739807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnScriptGroupCreate",             "(J[J[J[J[J[J)J",                        (void*)nScriptGroupCreate },
297435be56cce821d86f69026398ff9433e2d173b02fYang Ni{"rsnScriptGroup2Create",            "(JLjava/lang/String;Ljava/lang/String;[J)J", (void*)nScriptGroup2Create },
2975460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGroupSetInput",           "(JJJJ)V",                               (void*)nScriptGroupSetInput },
2976460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGroupSetOutput",          "(JJJJ)V",                               (void*)nScriptGroupSetOutput },
2977460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGroupExecute",            "(JJ)V",                                 (void*)nScriptGroupExecute },
2978281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnScriptGroup2Execute",           "(JJ)V",                                 (void*)nScriptGroup2Execute },
2979eff663f391fa4f119685d5c14489b94661ea126fTim Murray
298025207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Single",    "(JJIIIIIIIIIFJJFJIIII)V",               (void*)nScriptIntrinsicBLAS_Single },
298125207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Double",    "(JJIIIIIIIIIDJJDJIIII)V",               (void*)nScriptIntrinsicBLAS_Double },
298225207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Complex",   "(JJIIIIIIIIIFFJJFFJIIII)V",             (void*)nScriptIntrinsicBLAS_Complex },
298325207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Z",         "(JJIIIIIIIIIDDJJDDJIIII)V",             (void*)nScriptIntrinsicBLAS_Z },
298425207df658d6a8a3e885c7017fcc25702363583cTim Murray
29859cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray{"rsnScriptIntrinsicBLAS_BNNM",      "(JJIIIJIJIJII)V",                       (void*)nScriptIntrinsicBLAS_BNNM },
29869cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
29870e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnProgramStoreCreate",            "(JZZZZZZIII)J",                         (void*)nProgramStoreCreate },
2988eff663f391fa4f119685d5c14489b94661ea126fTim Murray
2989460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramBindConstants",          "(JJIJ)V",                               (void*)nProgramBindConstants },
2990460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramBindTexture",            "(JJIJ)V",                               (void*)nProgramBindTexture },
2991460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramBindSampler",            "(JJIJ)V",                               (void*)nProgramBindSampler },
2992eff663f391fa4f119685d5c14489b94661ea126fTim Murray
29939807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnProgramFragmentCreate",         "(JLjava/lang/String;[Ljava/lang/String;[J)J",              (void*)nProgramFragmentCreate },
2994460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramRasterCreate",           "(JZI)J",                                (void*)nProgramRasterCreate },
29959807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnProgramVertexCreate",           "(JLjava/lang/String;[Ljava/lang/String;[J)J",              (void*)nProgramVertexCreate },
2996eff663f391fa4f119685d5c14489b94661ea126fTim Murray
299778c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindRootScript",         "(JJ)V",                                 (void*)nContextBindRootScript },
299878c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramStore",       "(JJ)V",                                 (void*)nContextBindProgramStore },
299978c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramFragment",    "(JJ)V",                                 (void*)nContextBindProgramFragment },
300078c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramVertex",      "(JJ)V",                                 (void*)nContextBindProgramVertex },
300178c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramRaster",      "(JJ)V",                                 (void*)nContextBindProgramRaster },
3002eff663f391fa4f119685d5c14489b94661ea126fTim Murray
30030e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnSamplerCreate",                 "(JIIIIIF)J",                            (void*)nSamplerCreate },
3004eff663f391fa4f119685d5c14489b94661ea126fTim Murray
30059807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnMeshCreate",                    "(J[J[J[I)J",                            (void*)nMeshCreate },
3006eff663f391fa4f119685d5c14489b94661ea126fTim Murray
3007460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnMeshGetVertexBufferCount",      "(JJ)I",                                 (void*)nMeshGetVertexBufferCount },
3008460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnMeshGetIndexCount",             "(JJ)I",                                 (void*)nMeshGetIndexCount },
30099807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnMeshGetVertices",               "(JJ[JI)V",                              (void*)nMeshGetVertices },
30109807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnMeshGetIndices",                "(JJ[J[II)V",                            (void*)nMeshGetIndices },
301180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
301256f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray{"rsnSystemGetPointerSize",          "()I",                                   (void*)nSystemGetPointerSize },
30130facf021ea1a0399d956372b9d3ad9025a9a04d2Miao Wang{"rsnAllocationGetByteBuffer",       "(JJ[JIII)Ljava/nio/ByteBuffer;",        (void*)nAllocationGetByteBuffer },
3014d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams};
3015d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
3016d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic int registerFuncs(JNIEnv *_env)
3017d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
3018d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return android::AndroidRuntime::registerNativeMethods(
3019d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            _env, classPathName, methods, NELEM(methods));
3020d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
3021d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
3022d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
3023d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
3024d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsjint JNI_OnLoad(JavaVM* vm, void* reserved)
3025d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
3026488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    JNIEnv* env = nullptr;
3027d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    jint result = -1;
3028d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
3029d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
30303762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: GetEnv failed\n");
3031d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        goto bail;
3032d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
3033488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    assert(env != nullptr);
3034d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
3035d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (registerFuncs(env) < 0) {
30360e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat        ALOGE("ERROR: Renderscript native registration failed\n");
3037d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        goto bail;
3038d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
3039d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
3040d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    /* success -- return valid version number */
3041d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    result = JNI_VERSION_1_4;
3042d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
3043d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsbail:
3044d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return result;
3045d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
3046