android_renderscript_RenderScript.cpp revision 263cc90345784c3f60bf57c0de91afc4d6c3d5db
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:                                                           \
154e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jshortArray)data);                                  \
155e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetShortArrayElements((jshortArray)data, flag);                     \
156ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
157ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
158ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
159ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
16021659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 2;                                                                  \
16187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
16287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
16387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
16487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
16587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
16687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
16787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
16887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
16987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
17087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
17187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
17287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
17387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
17487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
17587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
17687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
17787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
17887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
17987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
180414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseShortArrayElements((jshortArray)data, (jshort *)ptr, relFlag);     \
181e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
182e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_SIGNED_32:                                                             \
183e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_UNSIGNED_32:                                                           \
184e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jintArray)data);                                    \
185e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetIntArrayElements((jintArray)data, flag);                         \
186ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
187ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
188ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
189ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
19021659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 4;                                                                  \
19187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
19287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
19387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
19487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
19587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
19687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
19787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
19887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
19987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
20087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
20187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
20287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
20387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
20487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
20587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
20687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
20787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
20887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
20987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
210414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseIntArrayElements((jintArray)data, (jint *)ptr, relFlag);           \
211e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
212e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_SIGNED_64:                                                             \
213e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    case RS_TYPE_UNSIGNED_64:                                                           \
214e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        len = _env->GetArrayLength((jlongArray)data);                                   \
215e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        ptr = _env->GetLongArrayElements((jlongArray)data, flag);                       \
216ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {                                                           \
217ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements.");                                \
218ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;                                                                     \
219ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }                                                                               \
22021659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams        typeBytes = 8;                                                                  \
22187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        if (usePadding) {                                                               \
22287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            srcPtr = ptr;                                                               \
22387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            len = len / 3 * 4;                                                          \
22487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (count == 0) {                                                           \
22587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                count = len / 4;                                                        \
22687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
22787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = malloc (len * typeBytes);                                             \
22887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            if (readonly) {                                                             \
22987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithPadding(ptr, srcPtr, mSize, count);                             \
23087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
23187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            } else {                                                                    \
23287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                fnc(__VA_ARGS__);                                                       \
23387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                copyWithUnPadding(srcPtr, ptr, mSize, count);                           \
23487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            }                                                                           \
23587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            free(ptr);                                                                  \
23687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            ptr = srcPtr;                                                               \
23787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        } else {                                                                        \
23887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang            fnc(__VA_ARGS__);                                                           \
23987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        }                                                                               \
240414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines        _env->ReleaseLongArrayElements((jlongArray)data, (jlong *)ptr, relFlag);        \
241e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        return;                                                                         \
242e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    default:                                                                            \
243e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams        break;                                                                          \
244e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    }                                                                                   \
24587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    UNUSED(len, ptr, srcPtr, typeBytes, relFlag);                                       \
246e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams}
247e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams
248e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams
249b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchoukclass AutoJavaStringToUTF8 {
250b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchoukpublic:
2512123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringToUTF8(JNIEnv* env, jstring str) : fEnv(env), fJStr(str) {
252488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        fCStr = env->GetStringUTFChars(str, nullptr);
253b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        fLength = env->GetStringUTFLength(str);
254b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
2552123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    ~AutoJavaStringToUTF8() {
256b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        fEnv->ReleaseStringUTFChars(fJStr, fCStr);
257b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
258b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    const char* c_str() const { return fCStr; }
259b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    jsize length() const { return fLength; }
260b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
261b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchoukprivate:
262b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    JNIEnv*     fEnv;
263b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    jstring     fJStr;
264b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    const char* fCStr;
265b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    jsize       fLength;
266b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk};
267b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
2682123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchoukclass AutoJavaStringArrayToUTF8 {
2692123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchoukpublic:
2702123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8(JNIEnv* env, jobjectArray strings, jsize stringsLength)
2712123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    : mEnv(env), mStrings(strings), mStringsLength(stringsLength) {
272488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        mCStrings = nullptr;
273488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        mSizeArray = nullptr;
2742123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        if (stringsLength > 0) {
2752123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            mCStrings = (const char **)calloc(stringsLength, sizeof(char *));
2762123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            mSizeArray = (size_t*)calloc(stringsLength, sizeof(size_t));
2772123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            for (jsize ct = 0; ct < stringsLength; ct ++) {
2782123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
279488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes                mCStrings[ct] = mEnv->GetStringUTFChars(s, nullptr);
2802123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                mSizeArray[ct] = mEnv->GetStringUTFLength(s);
2812123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            }
2822123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        }
2832123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    }
2842123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    ~AutoJavaStringArrayToUTF8() {
2852123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        for (jsize ct=0; ct < mStringsLength; ct++) {
2862123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
2872123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            mEnv->ReleaseStringUTFChars(s, mCStrings[ct]);
2882123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        }
2892123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        free(mCStrings);
2902123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk        free(mSizeArray);
2912123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    }
2922123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char **c_str() const { return mCStrings; }
2932123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t *c_str_len() const { return mSizeArray; }
2942123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    jsize length() const { return mStringsLength; }
2952123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
2962123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchoukprivate:
2972123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    JNIEnv      *mEnv;
2982123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    jobjectArray mStrings;
2992123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char **mCStrings;
3002123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t      *mSizeArray;
3012123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    jsize        mStringsLength;
3022123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk};
3032123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
304d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
305d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
306ffe9f48890dde7173a0845d32887fdf94a49b0a7Jason Samsstatic jfieldID gContextId = 0;
307d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
308d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void _nInit(JNIEnv *_env, jclass _this)
309d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
310eff663f391fa4f119685d5c14489b94661ea126fTim Murray    gContextId             = _env->GetFieldID(_this, "mContext", "J");
311d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
312d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
313d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
314d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
31587e908dfdece91b5f504386d4901fa3342dc8083Miao Wangstatic void copyWithPadding(void* ptr, void* srcPtr, int mSize, int count) {
31687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int sizeBytesPad = mSize * 4;
31787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int sizeBytes = mSize * 3;
31887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    uint8_t *dst = static_cast<uint8_t *>(ptr);
31987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    uint8_t *src = static_cast<uint8_t *>(srcPtr);
32087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    for (int i = 0; i < count; i++) {
32187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        memcpy(dst, src, sizeBytes);
32287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        dst += sizeBytesPad;
32387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        src += sizeBytes;
32487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    }
32587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang}
32687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang
32787e908dfdece91b5f504386d4901fa3342dc8083Miao Wangstatic void copyWithUnPadding(void* ptr, void* srcPtr, int mSize, int count) {
32887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int sizeBytesPad = mSize * 4;
32987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int sizeBytes = mSize * 3;
33087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    uint8_t *dst = static_cast<uint8_t *>(ptr);
33187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    uint8_t *src = static_cast<uint8_t *>(srcPtr);
33287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    for (int i = 0; i < count; i++) {
33387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        memcpy(dst, src, sizeBytes);
33487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        dst += sizeBytes;
33587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang        src += sizeBytesPad;
33687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    }
33787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang}
33887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang
33987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang
34087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang// ---------------------------------------------------------------------------
3413eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Samsstatic void
342eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextFinish(JNIEnv *_env, jobject _this, jlong con)
34396ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams{
34467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
34567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextFinish, con(%p)", (RsContext)con);
34667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
347eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextFinish((RsContext)con);
34896ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams}
34996ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams
350281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic jlong
351281c3252510bcf4120d17fa0125f369c2c78f162Yang NinClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong kernelID,
352281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni               jlong returnValue, jlongArray fieldIDArray,
353281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni               jlongArray valueArray, jintArray sizeArray,
354281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni               jlongArray depClosureArray, jlongArray depFieldIDArray) {
35517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong ret = 0;
35617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
357281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
358281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
359ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jFieldIDs == nullptr) {
360ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: fieldIDs.");
361ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
362ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
363ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
36417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
36517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize values_length = _env->GetArrayLength(valueArray);
366ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jValues == nullptr) {
367ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: values.");
368ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
369ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
370ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
37117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
37217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize sizes_length = _env->GetArrayLength(sizeArray);
373ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jSizes == nullptr) {
374ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: sizes.");
375ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
376ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
377ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
37817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong* jDepClosures =
37917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      _env->GetLongArrayElements(depClosureArray, nullptr);
38017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize depClosures_length = _env->GetArrayLength(depClosureArray);
381ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jDepClosures == nullptr) {
382ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: depClosures.");
383ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
384ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
385ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
38617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong* jDepFieldIDs =
38717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      _env->GetLongArrayElements(depFieldIDArray, nullptr);
38817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize depFieldIDs_length = _env->GetArrayLength(depFieldIDArray);
389ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jDepFieldIDs == nullptr) {
390ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: depFieldIDs.");
391ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
392ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
39317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
39417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  size_t numValues, numDependencies;
39517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsScriptFieldID* fieldIDs;
39617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsClosure* depClosures;
39717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsScriptFieldID* depFieldIDs;
39817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
39917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (fieldIDs_length != values_length || values_length != sizes_length) {
40017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Unmatched field IDs, values, and sizes in closure creation.");
40117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
40217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
40317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
40417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  numValues = (size_t)fieldIDs_length;
40517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
40617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (depClosures_length != depFieldIDs_length) {
40717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Unmatched closures and field IDs for dependencies in closure creation.");
40817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
40917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
41017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
41117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  numDependencies = (size_t)depClosures_length;
41217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
41317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (numDependencies > numValues) {
41417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Unexpected number of dependencies in closure creation");
41517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
41617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
41717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
4187b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni  if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
41917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Too many arguments or globals in closure creation");
42017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
42117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
42217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
42317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
42417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (fieldIDs == nullptr) {
42517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
42617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
42717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
42817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  for (size_t i = 0; i < numValues; i++) {
429281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni    fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
430281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  }
431281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
43217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  depClosures = (RsClosure*)alloca(sizeof(RsClosure) * numDependencies);
43317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (depClosures == nullptr) {
43417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
43517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
436281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
43717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  for (size_t i = 0; i < numDependencies; i++) {
438281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni    depClosures[i] = (RsClosure)jDepClosures[i];
439281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  }
440281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
44117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  depFieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numDependencies);
44217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (depFieldIDs == nullptr) {
44317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
44417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
44517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
44617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  for (size_t i = 0; i < numDependencies; i++) {
447281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni    depFieldIDs[i] = (RsClosure)jDepFieldIDs[i];
448281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  }
449281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
45017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  ret = (jlong)(uintptr_t)rsClosureCreate(
451281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni      (RsContext)con, (RsScriptKernelID)kernelID, (RsAllocation)returnValue,
452263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni      fieldIDs, numValues, jValues, numValues,
45317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      (int*)jSizes, numValues,
45417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      depClosures, numDependencies,
45517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      depFieldIDs, numDependencies);
45617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
45717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Niexit:
45817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
45917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(depFieldIDArray, jDepFieldIDs, JNI_ABORT);
46017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(depClosureArray, jDepClosures, JNI_ABORT);
46117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseIntArrayElements (sizeArray,       jSizes,       JNI_ABORT);
46217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(valueArray,      jValues,      JNI_ABORT);
46317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(fieldIDArray,    jFieldIDs,    JNI_ABORT);
46417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
46517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  return ret;
466281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
467281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
468be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Nistatic jlong
469be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang NinInvokeClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong invokeID,
470be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni                     jbyteArray paramArray, jlongArray fieldIDArray, jlongArray valueArray,
471be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni                     jintArray sizeArray) {
47217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong ret = 0;
47317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
474be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jbyte* jParams = _env->GetByteArrayElements(paramArray, nullptr);
475be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jsize jParamLength = _env->GetArrayLength(paramArray);
476ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jParams == nullptr) {
477ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: params.");
478ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
479ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
480ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
481be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
482be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
483ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jFieldIDs == nullptr) {
484ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: fieldIDs.");
485ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
486ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
487ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
48817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
48917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize values_length = _env->GetArrayLength(valueArray);
490ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jValues == nullptr) {
491ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: values.");
492ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
493ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
494ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
49517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
49617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jsize sizes_length = _env->GetArrayLength(sizeArray);
497ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jSizes == nullptr) {
498ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: sizes.");
499ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
500ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
50117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
50217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  size_t numValues;
50317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsScriptFieldID* fieldIDs;
50417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
50517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (fieldIDs_length != values_length || values_length != sizes_length) {
50617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Unmatched field IDs, values, and sizes in closure creation.");
50717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
50817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
50917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
51017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  numValues = (size_t) fieldIDs_length;
51117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
5127b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni  if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
51317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      ALOGE("Too many arguments or globals in closure creation");
51417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
51517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
51617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
51717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
51817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (fieldIDs == nullptr) {
51917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
52017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
52117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
52217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  for (size_t i = 0; i< numValues; i++) {
523be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
524be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni  }
525be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
52617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  ret = (jlong)(uintptr_t)rsInvokeClosureCreate(
527be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni      (RsContext)con, (RsScriptInvokeID)invokeID, jParams, jParamLength,
528263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni      fieldIDs, numValues, jValues, numValues,
52917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      (int*)jSizes, numValues);
53017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
53117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Niexit:
53217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
53317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseIntArrayElements (sizeArray,       jSizes,       JNI_ABORT);
53417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(valueArray,      jValues,      JNI_ABORT);
53517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(fieldIDArray,    jFieldIDs,    JNI_ABORT);
53617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseByteArrayElements(paramArray,      jParams,      JNI_ABORT);
53717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
53817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  return ret;
539be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni}
540be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
541281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic void
542281c3252510bcf4120d17fa0125f369c2c78f162Yang NinClosureSetArg(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
543281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni               jint index, jlong value, jint size) {
544263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni  // Size is signed with -1 indicating the value is an Allocation
545281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  rsClosureSetArg((RsContext)con, (RsClosure)closureID, (uint32_t)index,
546263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni                  (uintptr_t)value, size);
547281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
548281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
549281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic void
550281c3252510bcf4120d17fa0125f369c2c78f162Yang NinClosureSetGlobal(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
551281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni                  jlong fieldID, jlong value, jint size) {
552263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni  // Size is signed with -1 indicating the value is an Allocation
553281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  rsClosureSetGlobal((RsContext)con, (RsClosure)closureID,
554263cc90345784c3f60bf57c0de91afc4d6c3d5dbYang Ni                     (RsScriptFieldID)fieldID, (int64_t)value, size);
555281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
556281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
557281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic long
55835be56cce821d86f69026398ff9433e2d173b02fYang NinScriptGroup2Create(JNIEnv *_env, jobject _this, jlong con, jstring name,
559ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni                    jstring cacheDir, jlongArray closureArray) {
56017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  jlong ret = 0;
56117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
56235be56cce821d86f69026398ff9433e2d173b02fYang Ni  AutoJavaStringToUTF8 nameUTF(_env, name);
563ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni  AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
564ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni
565281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  jlong* jClosures = _env->GetLongArrayElements(closureArray, nullptr);
566281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  jsize numClosures = _env->GetArrayLength(closureArray);
567ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  if (jClosures == nullptr) {
568ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      ALOGE("Failed to get Java array elements: closures.");
569ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang      return ret;
570ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang  }
57117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
57217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  RsClosure* closures;
57317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
5747b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni  if (numClosures > (jsize) RS_SCRIPT_GROUP_MAX_NUMBER_CLOSURES) {
57517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni    ALOGE("Too many closures in script group");
57617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni    goto exit;
57717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
57817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
57917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  closures = (RsClosure*)alloca(sizeof(RsClosure) * numClosures);
58017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  if (closures == nullptr) {
58117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni      goto exit;
58217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  }
58317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
584281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  for (int i = 0; i < numClosures; i++) {
585281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni    closures[i] = (RsClosure)jClosures[i];
586281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  }
587281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
58817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  ret = (jlong)(uintptr_t)rsScriptGroup2Create(
58935be56cce821d86f69026398ff9433e2d173b02fYang Ni      (RsContext)con, nameUTF.c_str(), nameUTF.length(),
59035be56cce821d86f69026398ff9433e2d173b02fYang Ni      cacheDirUTF.c_str(), cacheDirUTF.length(),
591ebf63408d2b5181aeb7d83adf0f7ab95946a16d4Yang Ni      closures, numClosures);
59217c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
59317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Niexit:
59417c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
59517c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  _env->ReleaseLongArrayElements(closureArray, jClosures, JNI_ABORT);
59617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni
59717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni  return ret;
598281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
599281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
600281c3252510bcf4120d17fa0125f369c2c78f162Yang Nistatic void
601281c3252510bcf4120d17fa0125f369c2c78f162Yang NinScriptGroup2Execute(JNIEnv *_env, jobject _this, jlong con, jlong groupID) {
602281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni  rsScriptGroupExecute((RsContext)con, (RsScriptGroup2)groupID);
603281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni}
604281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni
60596ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Samsstatic void
60625207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Single(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
60725207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
60825207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jfloat alpha, jlong A, jlong B, jfloat beta, jlong C, jint incX, jint incY,
60925207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint KL, jint KU) {
61025207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
61125207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
61225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
61325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
61425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
61525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
61625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
61725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
61825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
61925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
62025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
62125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.f = alpha;
62225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.f = beta;
62325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
62425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
62525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
62625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
62725207df658d6a8a3e885c7017fcc25702363583cTim Murray
62825207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
62925207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
63025207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
63125207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
63225207df658d6a8a3e885c7017fcc25702363583cTim Murray
63325207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
63425207df658d6a8a3e885c7017fcc25702363583cTim Murray                         in_allocs, sizeof(in_allocs), nullptr,
63525207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
63625207df658d6a8a3e885c7017fcc25702363583cTim Murray}
63725207df658d6a8a3e885c7017fcc25702363583cTim Murray
63825207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
63925207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Double(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
64025207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
64125207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jdouble alpha, jlong A, jlong B, jdouble beta, jlong C, jint incX, jint incY,
64225207df658d6a8a3e885c7017fcc25702363583cTim Murray                            jint KL, jint KU) {
64325207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
64425207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
64525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
64625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
64725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
64825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
64925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
65025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
65125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
65225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
65325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
65425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.d = alpha;
65525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.d = beta;
65625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
65725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
65825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
65925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
66025207df658d6a8a3e885c7017fcc25702363583cTim Murray
66125207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
66225207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
66325207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
66425207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
66525207df658d6a8a3e885c7017fcc25702363583cTim Murray
66625207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
6670b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
66825207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
66925207df658d6a8a3e885c7017fcc25702363583cTim Murray}
67025207df658d6a8a3e885c7017fcc25702363583cTim Murray
67125207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
67225207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Complex(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
67325207df658d6a8a3e885c7017fcc25702363583cTim Murray                             jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
67425207df658d6a8a3e885c7017fcc25702363583cTim Murray                             jfloat alphaX, jfloat alphaY, jlong A, jlong B, jfloat betaX,
67525207df658d6a8a3e885c7017fcc25702363583cTim Murray                             jfloat betaY, jlong C, jint incX, jint incY, jint KL, jint KU) {
67625207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
67725207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
67825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
67925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
68025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
68125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
68225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
68325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
68425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
68525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
68625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
68725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.c.r = alphaX;
68825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.c.i = alphaY;
68925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.c.r = betaX;
69082585b3906955e57e199d962b8fe11b2bab87fbaMiao Wang    call.beta.c.i = betaY;
69125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
69225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
69325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
69425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
69525207df658d6a8a3e885c7017fcc25702363583cTim Murray
69625207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
69725207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
69825207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
69925207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
70025207df658d6a8a3e885c7017fcc25702363583cTim Murray
70125207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7020b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
70325207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
70425207df658d6a8a3e885c7017fcc25702363583cTim Murray}
70525207df658d6a8a3e885c7017fcc25702363583cTim Murray
70625207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
70725207df658d6a8a3e885c7017fcc25702363583cTim MurraynScriptIntrinsicBLAS_Z(JNIEnv *_env, jobject _this, jlong con, jlong id, jint func, jint TransA,
70825207df658d6a8a3e885c7017fcc25702363583cTim Murray                       jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
70925207df658d6a8a3e885c7017fcc25702363583cTim Murray                       jdouble alphaX, jdouble alphaY, jlong A, jlong B, jdouble betaX,
71025207df658d6a8a3e885c7017fcc25702363583cTim Murray                       jdouble betaY, jlong C, jint incX, jint incY, jint KL, jint KU) {
71125207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsBlasCall call;
71225207df658d6a8a3e885c7017fcc25702363583cTim Murray    memset(&call, 0, sizeof(call));
71325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.func = (RsBlasFunction)func;
71425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transA = (RsBlasTranspose)TransA;
71525207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.transB = (RsBlasTranspose)TransB;
71625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.side = (RsBlasSide)Side;
71725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.uplo = (RsBlasUplo)Uplo;
71825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.diag = (RsBlasDiag)Diag;
71925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.M = M;
72025207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.N = N;
72125207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.K = K;
72225207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.z.r = alphaX;
72325207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.alpha.z.i = alphaY;
72425207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.beta.z.r = betaX;
72582585b3906955e57e199d962b8fe11b2bab87fbaMiao Wang    call.beta.z.i = betaY;
72625207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incX = incX;
72725207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.incY = incY;
72825207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KL = KL;
72925207df658d6a8a3e885c7017fcc25702363583cTim Murray    call.KU = KU;
73025207df658d6a8a3e885c7017fcc25702363583cTim Murray
73125207df658d6a8a3e885c7017fcc25702363583cTim Murray    RsAllocation in_allocs[3];
73225207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[0] = (RsAllocation)A;
73325207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[1] = (RsAllocation)B;
73425207df658d6a8a3e885c7017fcc25702363583cTim Murray    in_allocs[2] = (RsAllocation)C;
73525207df658d6a8a3e885c7017fcc25702363583cTim Murray
73625207df658d6a8a3e885c7017fcc25702363583cTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7370b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
73825207df658d6a8a3e885c7017fcc25702363583cTim Murray                         &call, sizeof(call), nullptr, 0);
73925207df658d6a8a3e885c7017fcc25702363583cTim Murray}
74025207df658d6a8a3e885c7017fcc25702363583cTim Murray
74125207df658d6a8a3e885c7017fcc25702363583cTim Murray
74225207df658d6a8a3e885c7017fcc25702363583cTim Murraystatic void
7439cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim MurraynScriptIntrinsicBLAS_BNNM(JNIEnv *_env, jobject _this, jlong con, jlong id, jint M, jint N, jint K,
7449cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray                                             jlong A, jint a_offset, jlong B, jint b_offset, jlong C, jint c_offset,
7459cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray                                             jint c_mult_int) {
7469cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    RsBlasCall call;
7479cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    memset(&call, 0, sizeof(call));
7489cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.func = RsBlas_bnnm;
7499cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.M = M;
7509cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.N = N;
7519cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.K = K;
7522514806817ec394d334595d76e20f3129117da6eMiao Wang    call.a_offset = a_offset & 0xFF;
7532514806817ec394d334595d76e20f3129117da6eMiao Wang    call.b_offset = b_offset & 0xFF;
7549cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.c_offset = c_offset;
7559cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    call.c_mult_int = c_mult_int;
7569cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7579cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    RsAllocation in_allocs[3];
7589cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    in_allocs[0] = (RsAllocation)A;
7599cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    in_allocs[1] = (RsAllocation)B;
7609cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    in_allocs[2] = (RsAllocation)C;
7619cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7629cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray    rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
7630b34f2a3c545cb112a23072c92214e359a8df8c6Miao Wang                         in_allocs, NELEM(in_allocs), nullptr,
7649cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray                         &call, sizeof(call), nullptr, 0);
7659cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray}
7669cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7679cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
7689cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murraystatic void
769460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAssignName(JNIEnv *_env, jobject _this, jlong con, jlong obj, jbyteArray str)
7703eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams{
77167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
77267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAssignName, con(%p), obj(%p)", (RsContext)con, (void *)obj);
77367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
7743eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    jint len = _env->GetArrayLength(str);
7753eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    jbyte * cptr = (jbyte *) _env->GetPrimitiveArrayCritical(str, 0);
776ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (cptr == nullptr) {
777ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
778ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
779ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
780ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
781eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAssignName((RsContext)con, (void *)obj, (const char *)cptr, len);
7823eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    _env->ReleasePrimitiveArrayCritical(str, cptr, JNI_ABORT);
7833eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams}
7843eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams
785fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchoukstatic jstring
786460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynGetName(JNIEnv *_env, jobject _this, jlong con, jlong obj)
787fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk{
78867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
78967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nGetName, con(%p), obj(%p)", (RsContext)con, (void *)obj);
79067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
791488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    const char *name = nullptr;
792eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaGetName((RsContext)con, (void *)obj, &name);
793488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if(name == nullptr || strlen(name) == 0) {
794488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        return nullptr;
795581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk    }
796fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk    return _env->NewStringUTF(name);
797fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk}
798fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk
7997ce033d797e5df5e2131e2ed459fba181eaf4658Jason Samsstatic void
800460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj)
8017ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams{
80267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
80367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj);
80467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
805eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsObjDestroy((RsContext)con, (void *)obj);
8067ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams}
8077ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams
8083eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams// ---------------------------------------------------------------------------
8093eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams
810eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic jlong
811d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsnDeviceCreate(JNIEnv *_env, jobject _this)
812d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
81367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
81467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nDeviceCreate");
81567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
8163aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsDeviceCreate();
817d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
818d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
819d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
8205eaf468434e96bc7c8d4cfeb138699a1c7b256caTim MurraynDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev)
821d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
82267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
82367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nDeviceDestroy");
82467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
825d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return rsDeviceDestroy((RsDevice)dev);
826d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
827d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
828ebfb436a49673693b98469683451bd9ede797557Jason Samsstatic void
8295eaf468434e96bc7c8d4cfeb138699a1c7b256caTim MurraynDeviceSetConfig(JNIEnv *_env, jobject _this, jlong dev, jint p, jint value)
830ebfb436a49673693b98469683451bd9ede797557Jason Sams{
83167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
83267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nDeviceSetConfig  dev(%p), param(%i), value(%i)", (void *)dev, p, value);
83367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
834ebfb436a49673693b98469683451bd9ede797557Jason Sams    return rsDeviceSetConfig((RsDevice)dev, (RsDeviceParam)p, value);
835ebfb436a49673693b98469683451bd9ede797557Jason Sams}
836ebfb436a49673693b98469683451bd9ede797557Jason Sams
837eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic jlong
83881cd2b18bd36285d1843f78418282e1dad156fbdJason SamsnContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint flags, jint sdkVer, jint contextType)
839d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
84067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
84167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextCreate");
84267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
84381cd2b18bd36285d1843f78418282e1dad156fbdJason Sams    return (jlong)(uintptr_t)rsContextCreate((RsDevice)dev, 0, sdkVer, (RsContextType)contextType, flags);
844704ff64b099406bb328898a7443921f22dbffd6dJason Sams}
845704ff64b099406bb328898a7443921f22dbffd6dJason Sams
846eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic jlong
8475eaf468434e96bc7c8d4cfeb138699a1c7b256caTim MurraynContextCreateGL(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer,
8480e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint colorMin, jint colorPref,
8490e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint alphaMin, jint alphaPref,
8500e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint depthMin, jint depthPref,
8510e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint stencilMin, jint stencilPref,
8520e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint samplesMin, jint samplesPref, jfloat samplesQ,
8530e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                 jint dpi)
85411c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams{
85511c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    RsSurfaceConfig sc;
85611c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.alphaMin = alphaMin;
85711c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.alphaPref = alphaPref;
85811c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.colorMin = colorMin;
85911c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.colorPref = colorPref;
86011c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.depthMin = depthMin;
86111c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.depthPref = depthPref;
86211c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.samplesMin = samplesMin;
86311c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.samplesPref = samplesPref;
86411c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    sc.samplesQ = samplesQ;
86511c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams
86667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
86767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextCreateGL");
86867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
8693aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsContextCreateGL((RsDevice)dev, ver, sdkVer, sc, dpi);
870d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
871d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
872d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
873eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextSetPriority(JNIEnv *_env, jobject _this, jlong con, jint p)
8747d787b4722eaeb79cab42c36060336e092b77b5fJason Sams{
87567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
87667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("ContextSetPriority, con(%p), priority(%i)", (RsContext)con, p);
87767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
878eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextSetPriority((RsContext)con, p);
8797d787b4722eaeb79cab42c36060336e092b77b5fJason Sams}
8807d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
88147f31582b67f492d9e1523abd0d8b86c38ec007dTim Murraystatic void
88247f31582b67f492d9e1523abd0d8b86c38ec007dTim MurraynContextSetCacheDir(JNIEnv *_env, jobject _this, jlong con, jstring cacheDir)
88347f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray{
88447f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
88547f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray
88647f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    if (kLogApi) {
88747f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray        ALOGD("ContextSetCacheDir, con(%p), cacheDir(%s)", (RsContext)con, cacheDirUTF.c_str());
88847f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    }
88947f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray    rsContextSetCacheDir((RsContext)con, cacheDirUTF.c_str(), cacheDirUTF.length());
89047f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray}
89147f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray
8927d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
8937d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
8947d787b4722eaeb79cab42c36060336e092b77b5fJason Samsstatic void
895eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextSetSurface(JNIEnv *_env, jobject _this, jlong con, jint width, jint height, jobject wnd)
896efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams{
89767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
89867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextSetSurface, con(%p), width(%i), height(%i), surface(%p)", (RsContext)con,
89967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              width, height, (Surface *)wnd);
90067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
901efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
902488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    ANativeWindow * window = nullptr;
903488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (wnd == nullptr) {
904efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
905efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams    } else {
90664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        window = android_view_Surface_getNativeWindow(_env, wnd).get();
907efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams    }
908efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
909eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextSetSurface((RsContext)con, width, height, window);
910efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams}
911efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
912efd9b6fb2e0f31b50db089352118e5daeb268879Jason Samsstatic void
913eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextDestroy(JNIEnv *_env, jobject _this, jlong con)
914d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
91567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
91667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextDestroy, con(%p)", (RsContext)con);
91767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
918eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextDestroy((RsContext)con);
919d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
920d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
921715333b832fb448c32165c7d97d408a3fa43f7cbJason Samsstatic void
922eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextDump(JNIEnv *_env, jobject _this, jlong con, jint bits)
923715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams{
92467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
92567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextDump, con(%p)  bits(%i)", (RsContext)con, bits);
92667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
927715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams    rsContextDump((RsContext)con, bits);
928715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams}
929d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
930d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
931eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextPause(JNIEnv *_env, jobject _this, jlong con)
93265e7aa56f56097418d617663683544c25b3988eaJason Sams{
93367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
93467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextPause, con(%p)", (RsContext)con);
93567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
936eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextPause((RsContext)con);
93765e7aa56f56097418d617663683544c25b3988eaJason Sams}
93865e7aa56f56097418d617663683544c25b3988eaJason Sams
93965e7aa56f56097418d617663683544c25b3988eaJason Samsstatic void
940eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextResume(JNIEnv *_env, jobject _this, jlong con)
94165e7aa56f56097418d617663683544c25b3988eaJason Sams{
94267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
94367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextResume, con(%p)", (RsContext)con);
94467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
945eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextResume((RsContext)con);
94665e7aa56f56097418d617663683544c25b3988eaJason Sams}
94765e7aa56f56097418d617663683544c25b3988eaJason Sams
9481c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
9491c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Samsstatic jstring
950eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextGetErrorMessage(JNIEnv *_env, jobject _this, jlong con)
9511c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams{
95267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
95367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextGetErrorMessage, con(%p)", (RsContext)con);
95467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
9551c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    char buf[1024];
9561c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
9571c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    size_t receiveLen;
9581c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    uint32_t subID;
959eff663f391fa4f119685d5c14489b94661ea126fTim Murray    int id = rsContextGetMessage((RsContext)con,
96065bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 buf, sizeof(buf),
96165bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 &receiveLen, sizeof(receiveLen),
962edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                                 &subID, sizeof(subID));
9631c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    if (!id && receiveLen) {
96409993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGV("message receive buffer too small.  %zu", receiveLen);
9651c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    }
9661c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    return _env->NewStringUTF(buf);
9671c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams}
9681c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
969edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Samsstatic jint
970eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextGetUserMessage(JNIEnv *_env, jobject _this, jlong con, jintArray data)
971516c31911578db8ce53529483c3ded918ac7dc6bJason Sams{
972516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    jint len = _env->GetArrayLength(data);
97367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
97467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextGetMessage, con(%p), len(%i)", (RsContext)con, len);
97567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
976488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *ptr = _env->GetIntArrayElements(data, nullptr);
977ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
978ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
979ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
980ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
981516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    size_t receiveLen;
9821c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    uint32_t subID;
983eff663f391fa4f119685d5c14489b94661ea126fTim Murray    int id = rsContextGetMessage((RsContext)con,
98465bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 ptr, len * 4,
98565bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                 &receiveLen, sizeof(receiveLen),
986edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                                 &subID, sizeof(subID));
987516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    if (!id && receiveLen) {
98809993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGV("message receive buffer too small.  %zu", receiveLen);
989516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    }
990516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    _env->ReleaseIntArrayElements(data, ptr, 0);
9910e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    return (jint)id;
9921c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams}
9931c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
9941c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Samsstatic jint
995eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextPeekMessage(JNIEnv *_env, jobject _this, jlong con, jintArray auxData)
9961c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams{
99767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
99867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextPeekMessage, con(%p)", (RsContext)con);
99967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1000488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *auxDataPtr = _env->GetIntArrayElements(auxData, nullptr);
1001ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (auxDataPtr == nullptr) {
1002ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1003ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
1004ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
10051c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    size_t receiveLen;
10061c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    uint32_t subID;
1007eff663f391fa4f119685d5c14489b94661ea126fTim Murray    int id = rsContextPeekMessage((RsContext)con, &receiveLen, sizeof(receiveLen),
1008edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                                  &subID, sizeof(subID));
10091c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    auxDataPtr[0] = (jint)subID;
10101c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    auxDataPtr[1] = (jint)receiveLen;
10111c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    _env->ReleaseIntArrayElements(auxData, auxDataPtr, 0);
10120e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    return (jint)id;
1013516c31911578db8ce53529483c3ded918ac7dc6bJason Sams}
1014516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1015eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic void nContextInitToClient(JNIEnv *_env, jobject _this, jlong con)
1016516c31911578db8ce53529483c3ded918ac7dc6bJason Sams{
101767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
101867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextInitToClient, con(%p)", (RsContext)con);
101967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1020eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextInitToClient((RsContext)con);
1021516c31911578db8ce53529483c3ded918ac7dc6bJason Sams}
1022516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1023eff663f391fa4f119685d5c14489b94661ea126fTim Murraystatic void nContextDeinitToClient(JNIEnv *_env, jobject _this, jlong con)
1024516c31911578db8ce53529483c3ded918ac7dc6bJason Sams{
102567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
102667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextDeinitToClient, con(%p)", (RsContext)con);
102767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1028eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextDeinitToClient((RsContext)con);
1029516c31911578db8ce53529483c3ded918ac7dc6bJason Sams}
1030516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1031455d64426615e5d269a3bd05cd91b67c3811fcdfJason Samsstatic void
1032eff663f391fa4f119685d5c14489b94661ea126fTim MurraynContextSendMessage(JNIEnv *_env, jobject _this, jlong con, jint id, jintArray data)
1033455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams{
1034488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *ptr = nullptr;
1035455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    jint len = 0;
1036455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    if (data) {
1037455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams        len = _env->GetArrayLength(data);
10384a043c1853c117c1b4c4342e76cd16a5abdc1045Stephen Hines        ptr = _env->GetIntArrayElements(data, nullptr);
1039ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (ptr == nullptr) {
1040ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
1041ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
1042ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
1043455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    }
104467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
104567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextSendMessage, con(%p), id(%i), len(%i)", (RsContext)con, id, len);
104667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1047eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextSendMessage((RsContext)con, id, (const uint8_t *)ptr, len * sizeof(int));
1048455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    if (data) {
1049455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams        _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
1050455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams    }
1051455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams}
1052455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams
1053455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams
1054516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1055460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
105667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind, jboolean norm,
105767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe               jint size)
1058d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
105967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
106009993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nElementCreate, con(%p), type(%" PRId64 "), kind(%i), norm(%i), size(%i)", (RsContext)con,
106167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              type, kind, norm, size);
106267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
106367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    return (jlong)(uintptr_t)rsElementCreate((RsContext)con, (RsDataType)type, (RsDataKind)kind,
106467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                             norm, size);
1065d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1066d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1067460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1068eff663f391fa4f119685d5c14489b94661ea126fTim MurraynElementCreate2(JNIEnv *_env, jobject _this, jlong con,
10699807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                jlongArray _ids, jobjectArray _names, jintArray _arraySizes)
1070d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
1071718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    int fieldCount = _env->GetArrayLength(_ids);
107267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
107367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nElementCreate2, con(%p)", (RsContext)con);
107467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1075718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
1076488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jIds = _env->GetLongArrayElements(_ids, nullptr);
1077ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jIds == nullptr) {
1078ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: ids");
1079ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
1080ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1081488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *jArraySizes = _env->GetIntArrayElements(_arraySizes, nullptr);
1082ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jArraySizes == nullptr) {
1083ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: arraySizes");
1084ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
1085ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
10869807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
10879807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    RsElement *ids = (RsElement*)malloc(fieldCount * sizeof(RsElement));
10889807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uint32_t *arraySizes = (uint32_t *)malloc(fieldCount * sizeof(uint32_t));
10899807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
10909807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < fieldCount; i ++) {
10919807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        ids[i] = (RsElement)jIds[i];
10929807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        arraySizes[i] = (uint32_t)jArraySizes[i];
10939807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
1094718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
10952123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8 names(_env, _names, fieldCount);
10962123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
10972123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char **nameArray = names.c_str();
10982123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t *sizeArray = names.c_str_len();
10992123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
11003aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsElementCreate2((RsContext)con,
11019807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                                     (const RsElement *)ids, fieldCount,
11027a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                                     nameArray, fieldCount * sizeof(size_t),  sizeArray,
1103e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                     (const uint32_t *)arraySizes, fieldCount);
11042123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
11059807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(ids);
11069807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(arraySizes);
11079807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(_ids, jIds, JNI_ABORT);
11089807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseIntArrayElements(_arraySizes, jArraySizes, JNI_ABORT);
11099807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
11103aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)id;
1111d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1112d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1113dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchoukstatic void
1114460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynElementGetNativeData(JNIEnv *_env, jobject _this, jlong con, jlong id, jintArray _elementData)
1115dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
1116dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    int dataSize = _env->GetArrayLength(_elementData);
111767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
111867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nElementGetNativeData, con(%p)", (RsContext)con);
111967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1120dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1121dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
1122dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    assert(dataSize == 5);
1123dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
112478c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath    uintptr_t elementData[5];
1125eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaElementGetNativeData((RsContext)con, (RsElement)id, elementData, dataSize);
1126dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1127dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    for(jint i = 0; i < dataSize; i ++) {
11289807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        const jint data = (jint)elementData[i];
11299807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetIntArrayRegion(_elementData, i, 1, &data);
1130dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
1131dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1132dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1133dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1134dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchoukstatic void
1135460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynElementGetSubElements(JNIEnv *_env, jobject _this, jlong con, jlong id,
11369807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                       jlongArray _IDs,
11377d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                       jobjectArray _names,
11387d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                       jintArray _arraySizes)
1139dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
11409807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uint32_t dataSize = _env->GetArrayLength(_IDs);
114167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
114267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nElementGetSubElements, con(%p)", (RsContext)con);
114367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1144dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
11459807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t *ids = (uintptr_t*)malloc(dataSize * sizeof(uintptr_t));
11469807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    const char **names = (const char **)malloc(dataSize * sizeof(const char *));
114778c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath    uint32_t *arraySizes = (uint32_t *)malloc(dataSize * sizeof(uint32_t));
1148dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
114967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    rsaElementGetSubElements((RsContext)con, (RsElement)id, ids, names, arraySizes,
115067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                             (uint32_t)dataSize);
1151dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
11529807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(uint32_t i = 0; i < dataSize; i++) {
11533aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong id = (jlong)(uintptr_t)ids[i];
11549807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        const jint arraySize = (jint)arraySizes[i];
1155dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        _env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i]));
11569807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_IDs, i, 1, &id);
11579807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetIntArrayRegion(_arraySizes, i, 1, &arraySize);
1158dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
1159dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1160dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    free(ids);
1161dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    free(names);
11627d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    free(arraySizes);
1163dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1164dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1165d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// -----------------------------------
1166d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1167460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1168460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid,
1169b109cc78616abee7291eb42094cd156b5db3355dJason Sams            jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv)
1170d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
117167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
117267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)",
117309993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer              (RsContext)con, (void*)eid, dimx, dimy, dimz, mips, faces, yuv);
117467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
11753b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams
117667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    return (jlong)(uintptr_t)rsTypeCreate((RsContext)con, (RsElement)eid, dimx, dimy, dimz, mips,
117767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                          faces, yuv);
1178d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1179d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1180dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchoukstatic void
11819807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnTypeGetNativeData(JNIEnv *_env, jobject _this, jlong con, jlong id, jlongArray _typeData)
1182dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
1183dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    // We are packing 6 items: mDimX; mDimY; mDimZ;
1184dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    // mDimLOD; mDimFaces; mElement; into typeData
1185dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    int elementCount = _env->GetArrayLength(_typeData);
1186dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1187dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    assert(elementCount == 6);
118867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
118967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nTypeGetNativeData, con(%p)", (RsContext)con);
119067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1191dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
11929807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t typeData[6];
1193eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaTypeGetNativeData((RsContext)con, (RsType)id, typeData, 6);
1194dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1195dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    for(jint i = 0; i < elementCount; i ++) {
11963aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong data = (jlong)(uintptr_t)typeData[i];
11979807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_typeData, i, 1, &data);
1198dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
1199dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1200dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1201d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// -----------------------------------
1202d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1203460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
120467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mips, jint usage,
120567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                       jlong pointer)
1206d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
120767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
120867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)",
120967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsContext)con, (RsElement)type, mips, usage, (void *)pointer);
121067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
121167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    return (jlong)(uintptr_t) rsAllocationCreateTyped((RsContext)con, (RsType)type,
121267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                                      (RsAllocationMipmapControl)mips,
121367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                                      (uint32_t)usage, (uintptr_t)pointer);
1214d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1215d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1216d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1217460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationSyncAll(JNIEnv *_env, jobject _this, jlong con, jlong a, jint bits)
12185476b450e50939940dcf3f15c92335cee2fc572dJason Sams{
121967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
122067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationSyncAll, con(%p), a(%p), bits(0x%08x)", (RsContext)con, (RsAllocation)a,
122167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              bits);
122267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1223eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationSyncAll((RsContext)con, (RsAllocation)a, (RsAllocationUsageType)bits);
12245476b450e50939940dcf3f15c92335cee2fc572dJason Sams}
12255476b450e50939940dcf3f15c92335cee2fc572dJason Sams
122672226e0543461133b9e177a3e78ae50b0c65e797Jason Samsstatic jobject
1227460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationGetSurface(JNIEnv *_env, jobject _this, jlong con, jlong a)
1228615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams{
122967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
123067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationGetSurface, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
123167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1232615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams
123367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    IGraphicBufferProducer *v = (IGraphicBufferProducer *)rsAllocationGetSurface((RsContext)con,
123467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                                                                 (RsAllocation)a);
123572226e0543461133b9e177a3e78ae50b0c65e797Jason Sams    sp<IGraphicBufferProducer> bp = v;
1236488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    v->decStrong(nullptr);
1237fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams
123872226e0543461133b9e177a3e78ae50b0c65e797Jason Sams    jobject o = android_view_Surface_createFromIGraphicBufferProducer(_env, bp);
123972226e0543461133b9e177a3e78ae50b0c65e797Jason Sams    return o;
1240fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams}
1241fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams
1242fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Samsstatic void
1243460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationSetSurface(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject sur)
1244163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams{
124567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
124667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationSetSurface, con(%p), alloc(%p), surface(%p)", (RsContext)con,
124767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsAllocation)alloc, (Surface *)sur);
124867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1249163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
1250fb9aa9f3ef11878caaf6fcfb5ea49ffb9f7abf33Jason Sams    sp<Surface> s;
1251163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams    if (sur != 0) {
125264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        s = android_view_Surface_getSurface(_env, sur);
1253163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams    }
1254163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
125567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    rsAllocationSetSurface((RsContext)con, (RsAllocation)alloc,
125667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                           static_cast<ANativeWindow *>(s.get()));
1257163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams}
1258163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
1259163766cbe798baf8e86eb8201bc6c3def931d59aJason Samsstatic void
1260460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationIoSend(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1261163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams{
126267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
126309993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nAllocationIoSend, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
126467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1265460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray    rsAllocationIoSend((RsContext)con, (RsAllocation)alloc);
1266163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams}
1267163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
1268163766cbe798baf8e86eb8201bc6c3def931d59aJason Samsstatic void
1269460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationIoReceive(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1270163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams{
127167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
127209993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nAllocationIoReceive, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
127367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1274460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray    rsAllocationIoReceive((RsContext)con, (RsAllocation)alloc);
1275163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams}
1276163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
1277163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
1278163766cbe798baf8e86eb8201bc6c3def931d59aJason Samsstatic void
1279460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
1280f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams{
128167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
128267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationGenerateMipmaps, con(%p), a(%p)", (RsContext)con, (RsAllocation)alloc);
128367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1284eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationGenerateMipmaps((RsContext)con, (RsAllocation)alloc);
1285f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams}
1286f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams
1287460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
128867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,
128967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                            jobject jbitmap, jint usage)
1290fe08d99725efd0dde7ba67ff1979a04fec2ba99fJason Sams{
1291ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1292ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
1293fe08d99725efd0dde7ba67ff1979a04fec2ba99fJason Sams
12945476b450e50939940dcf3f15c92335cee2fc572dJason Sams    bitmap.lockPixels();
12955476b450e50939940dcf3f15c92335cee2fc572dJason Sams    const void* ptr = bitmap.getPixels();
12963aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsAllocationCreateFromBitmap((RsContext)con,
129765bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                                  (RsType)type, (RsAllocationMipmapControl)mip,
129865bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                                  ptr, bitmap.getSize(), usage);
12995476b450e50939940dcf3f15c92335cee2fc572dJason Sams    bitmap.unlockPixels();
13005476b450e50939940dcf3f15c92335cee2fc572dJason Sams    return id;
1301ffe9f48890dde7173a0845d32887fdf94a49b0a7Jason Sams}
1302fe08d99725efd0dde7ba67ff1979a04fec2ba99fJason Sams
1303460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
130467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCreateBitmapBackedAllocation(JNIEnv *_env, jobject _this, jlong con, jlong type,
130567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                        jint mip, jobject jbitmap, jint usage)
1306a314551d69098537337c970da615a8f8af58e1f1Tim Murray{
1307ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1308ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
1309a314551d69098537337c970da615a8f8af58e1f1Tim Murray
1310a314551d69098537337c970da615a8f8af58e1f1Tim Murray    bitmap.lockPixels();
1311a314551d69098537337c970da615a8f8af58e1f1Tim Murray    const void* ptr = bitmap.getPixels();
13123aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsAllocationCreateTyped((RsContext)con,
1313a314551d69098537337c970da615a8f8af58e1f1Tim Murray                                            (RsType)type, (RsAllocationMipmapControl)mip,
13149807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                                            (uint32_t)usage, (uintptr_t)ptr);
1315a314551d69098537337c970da615a8f8af58e1f1Tim Murray    bitmap.unlockPixels();
1316a314551d69098537337c970da615a8f8af58e1f1Tim Murray    return id;
1317a314551d69098537337c970da615a8f8af58e1f1Tim Murray}
1318a314551d69098537337c970da615a8f8af58e1f1Tim Murray
1319460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
132067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,
132167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                                jobject jbitmap, jint usage)
132267f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk{
1323ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1324ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
132567f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk
13265476b450e50939940dcf3f15c92335cee2fc572dJason Sams    bitmap.lockPixels();
13275476b450e50939940dcf3f15c92335cee2fc572dJason Sams    const void* ptr = bitmap.getPixels();
13283aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsAllocationCubeCreateFromBitmap((RsContext)con,
132965bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                                      (RsType)type, (RsAllocationMipmapControl)mip,
133065bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams                                                      ptr, bitmap.getSize(), usage);
13315476b450e50939940dcf3f15c92335cee2fc572dJason Sams    bitmap.unlockPixels();
13325476b450e50939940dcf3f15c92335cee2fc572dJason Sams    return id;
133367f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk}
133467f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk
133526ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchoukstatic void
1336460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
133726ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk{
1338ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1339ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
1340f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams    int w = bitmap.width();
1341f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams    int h = bitmap.height();
134226ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk
13434ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    bitmap.lockPixels();
13444ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    const void* ptr = bitmap.getPixels();
1345eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocation2DData((RsContext)con, (RsAllocation)alloc, 0, 0,
1346304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                       0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X,
134738faea3019b8aa68c25ec7bac3e17964524dad12Tim Murray                       w, h, ptr, bitmap.getSize(), 0);
13484ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    bitmap.unlockPixels();
13498a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams}
13508a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
13514ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Samsstatic void
1352460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationCopyToBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
13538a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams{
1354ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    SkBitmap bitmap;
1355ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);
13568a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
13574ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    bitmap.lockPixels();
13584ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    void* ptr = bitmap.getPixels();
1359eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationCopyToBitmap((RsContext)con, (RsAllocation)alloc, ptr, bitmap.getSize());
13604ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    bitmap.unlockPixels();
1361835b8544cc333ef87e42b1d71cf8ad3cddccdc19Alex Sakhartchouk    bitmap.notifyPixelsChanged();
13628a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams}
13638a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
1364414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Java object data into the Allocation pointed to by _alloc.
1365d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1366460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
136787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint count, jobject data, jint sizeBytes, jint dataType, jint mSize,
136887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jboolean usePadding)
1369d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
1370e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
137167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
137267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation1DData, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
137367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "dataType(%i)", (RsContext)con, (RsAllocation)alloc, offset, count, sizeBytes,
137467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              dataType);
137567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
137687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation1DData, true,
137787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
1378d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1379d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1380d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1381c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao WangnAllocationElementData(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
1382c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                       jint xoff, jint yoff, jint zoff,
1383c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                       jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
138449bdaf0293408159df18a1d8540360f9623c40f7Jason Sams{
138549bdaf0293408159df18a1d8540360f9623c40f7Jason Sams    jint len = _env->GetArrayLength(data);
138667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
1387c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang        ALOGD("nAllocationElementData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
1388c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang              "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
138967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              sizeBytes);
139067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1391488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1392ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1393ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1394ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1395ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1396c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    rsAllocationElementData((RsContext)con, (RsAllocation)alloc,
1397c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                            xoff, yoff, zoff,
1398c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                            lod, ptr, sizeBytes, compIdx);
139949bdaf0293408159df18a1d8540360f9623c40f7Jason Sams    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
140049bdaf0293408159df18a1d8540360f9623c40f7Jason Sams}
140149bdaf0293408159df18a1d8540360f9623c40f7Jason Sams
1402c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang
1403414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Java object data into the Allocation pointed to by _alloc.
140449bdaf0293408159df18a1d8540360f9623c40f7Jason Samsstatic void
1405460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
140687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType, jint mSize,
140787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jboolean usePadding)
1408d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
1409e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
1410e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
141167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
141267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation2DData, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
141367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
141467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
141587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h;
141687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation2DData, true,
141787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
1418d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1419d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1420414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by srcAlloc into the Allocation
1421414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// pointed to by dstAlloc.
142240a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Samsstatic void
1423eff663f391fa4f119685d5c14489b94661ea126fTim MurraynAllocationData2D_alloc(JNIEnv *_env, jobject _this, jlong con,
1424460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong dstAlloc, jint dstXoff, jint dstYoff,
1425304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                        jint dstMip, jint dstFace,
1426304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                        jint width, jint height,
1427460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong srcAlloc, jint srcXoff, jint srcYoff,
1428304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                        jint srcMip, jint srcFace)
1429304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk{
143067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
143167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation2DData_s, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
143267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " dstMip(%i), dstFace(%i), width(%i), height(%i),"
143367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i), srcFace(%i)",
143467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
143567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
143667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1437304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk
1438eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationCopy2DRange((RsContext)con,
1439304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            (RsAllocation)dstAlloc,
1440304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            dstXoff, dstYoff,
1441304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            dstMip, dstFace,
1442304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            width, height,
1443304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            (RsAllocation)srcAlloc,
1444304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            srcXoff, srcYoff,
1445304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                            srcMip, srcFace);
1446304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk}
1447304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk
1448414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Java object data into the Allocation pointed to by _alloc.
1449304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchoukstatic void
1450460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
145187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jint d, jobject data, jint sizeBytes, jint dataType,
145287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
1453b05d689653b1bc94836f716f29e9578677c29075Jason Sams{
1454e729a9400f3ed2234a95a53aadb3420b76436d63Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
145567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
145667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation3DData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
145767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
145867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              lod, w, h, d, sizeBytes);
145967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
146087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h * d;
146187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation3DData, true,
146287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
1463b05d689653b1bc94836f716f29e9578677c29075Jason Sams}
1464b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1465414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by srcAlloc into the Allocation
1466414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// pointed to by dstAlloc.
1467b05d689653b1bc94836f716f29e9578677c29075Jason Samsstatic void
1468eff663f391fa4f119685d5c14489b94661ea126fTim MurraynAllocationData3D_alloc(JNIEnv *_env, jobject _this, jlong con,
1469460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong dstAlloc, jint dstXoff, jint dstYoff, jint dstZoff,
1470b05d689653b1bc94836f716f29e9578677c29075Jason Sams                        jint dstMip,
1471b05d689653b1bc94836f716f29e9578677c29075Jason Sams                        jint width, jint height, jint depth,
1472460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray                        jlong srcAlloc, jint srcXoff, jint srcYoff, jint srcZoff,
1473b05d689653b1bc94836f716f29e9578677c29075Jason Sams                        jint srcMip)
1474b05d689653b1bc94836f716f29e9578677c29075Jason Sams{
147567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
147667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationData3D_alloc, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
147767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " dstMip(%i), width(%i), height(%i),"
147867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i)",
147967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip,
148067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip);
148167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1482b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1483eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationCopy3DRange((RsContext)con,
1484b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            (RsAllocation)dstAlloc,
1485b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            dstXoff, dstYoff, dstZoff, dstMip,
1486b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            width, height, depth,
1487b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            (RsAllocation)srcAlloc,
1488b05d689653b1bc94836f716f29e9578677c29075Jason Sams                            srcXoff, srcYoff, srcZoff, srcMip);
1489b05d689653b1bc94836f716f29e9578677c29075Jason Sams}
1490b05d689653b1bc94836f716f29e9578677c29075Jason Sams
149140a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams
1492414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by _alloc into the Java object data.
149340a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Samsstatic void
149487e908dfdece91b5f504386d4901fa3342dc8083Miao WangnAllocationRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jobject data, jint dataType,
149587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                jint mSize, jboolean usePadding)
1496fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams{
149721659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
149867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
149967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationRead, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
150067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
150187e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = 0;
150287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(0, rsAllocationRead, false,
150387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, ptr, len * typeBytes);
1504fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams}
1505fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams
1506414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by _alloc into the Java object data.
1507fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Samsstatic void
1508460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationRead1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
150987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint count, jobject data, jint sizeBytes, jint dataType,
151087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
1511fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams{
151221659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
151367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
151467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation1DRead, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
151567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "dataType(%i)", (RsContext)con, alloc, offset, count, sizeBytes, dataType);
151667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
151787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(0, rsAllocation1DRead, false,
151887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
1519fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams}
1520fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams
1521c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang// Copies from the Element in the Allocation pointed to by _alloc into the Java array data.
1522c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wangstatic void
152345cec0a9711f736df26fd097c6d74834e350f9bcMiao WangnAllocationElementRead(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
1524c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang                       jint xoff, jint yoff, jint zoff,
152545cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang                       jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
1526c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang{
152745cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang    jint len = _env->GetArrayLength(data);
1528c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    if (kLogApi) {
152945cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang        ALOGD("nAllocationElementRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
153045cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang              "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
153145cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang              sizeBytes);
1532c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    }
153345cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1534ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1535ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1536ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1537ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
153845cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang    rsAllocationElementRead((RsContext)con, (RsAllocation)alloc,
153945cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang                            xoff, yoff, zoff,
1540a7e2509d8da69ab1c9e14b4ce6608786c572209aJason Sams                            lod, ptr, sizeBytes, compIdx);
1541bfa5e659e7b4cb49178d0e99712478b29f8301a7Miao Wang    _env->ReleaseByteArrayElements(data, ptr, 0);
1542c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang}
1543c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang
1544414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines// Copies from the Allocation pointed to by _alloc into the Java object data.
1545fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Samsstatic void
1546460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
154787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jobject data, jint sizeBytes, jint dataType,
154887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
154940a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams{
155021659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocation *alloc = (RsAllocation *)_alloc;
155121659ac4c83d272f3ffd2f9b6333acbe5f0b02a1Jason Sams    RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
155267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
155367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocation2DRead, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
155467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
155567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
155687e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h;
155787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(0, rsAllocation2DRead, false,
155887e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
155940a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams}
156087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang
1561c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang// Copies from the Allocation pointed to by _alloc into the Java object data.
1562c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wangstatic void
1563c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao WangnAllocationRead3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
156487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint w, jint h, jint d, jobject data, int sizeBytes, int dataType,
156587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                  jint mSize, jboolean usePadding)
1566c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang{
1567c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    RsAllocation *alloc = (RsAllocation *)_alloc;
1568c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    if (kLogApi) {
1569c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang        ALOGD("nAllocation3DRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
1570c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang              " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
1571c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang              lod, w, h, d, sizeBytes);
1572c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang    }
157387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    int count = w * h * d;
157487e908dfdece91b5f504386d4901fa3342dc8083Miao Wang    PER_ARRAY_TYPE(nullptr, rsAllocation3DRead, false,
157587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang                   (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
1576c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang}
1577d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1578460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1579460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationGetType(JNIEnv *_env, jobject _this, jlong con, jlong a)
1580dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk{
158167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
158267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationGetType, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
158367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
15843aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t) rsaAllocationGetType((RsContext)con, (RsAllocation)a);
1585dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk}
1586dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
15875edc608a0749ed4b7074b5c1243043eb722c3c31Jason Samsstatic void
1588460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynAllocationResize1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint dimX)
15895edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams{
159067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
159167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", (RsContext)con,
159267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsAllocation)alloc, dimX);
159367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1594eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsAllocationResize1D((RsContext)con, (RsAllocation)alloc, dimX);
15955edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams}
15965edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams
159746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
159846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Samsstatic jlong
159946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason SamsnAllocationAdapterCreate(JNIEnv *_env, jobject _this, jlong con, jlong basealloc, jlong type)
160046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{
160146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    if (kLogApi) {
160246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        ALOGD("nAllocationAdapterCreate, con(%p), base(%p), type(%p)",
160346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams              (RsContext)con, (RsAllocation)basealloc, (RsElement)type);
160446ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    }
160546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    return (jlong)(uintptr_t) rsAllocationAdapterCreate((RsContext)con, (RsType)type,
160646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                                                        (RsAllocation)basealloc);
160746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
160846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams}
160946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
161046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Samsstatic void
161146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason SamsnAllocationAdapterOffset(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
161246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                        jint x, jint y, jint z, jint face, jint lod,
161346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                        jint a1, jint a2, jint a3, jint a4)
161446ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{
161546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    uint32_t params[] = {
161646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        (uint32_t)x, (uint32_t)y, (uint32_t)z, (uint32_t)face,
161746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        (uint32_t)lod, (uint32_t)a1, (uint32_t)a2, (uint32_t)a3, (uint32_t)a4
161846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    };
161946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    if (kLogApi) {
162046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        ALOGD("nAllocationAdapterOffset, con(%p), alloc(%p), x(%i), y(%i), z(%i), face(%i), lod(%i), arrays(%i %i %i %i)",
162146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams              (RsContext)con, (RsAllocation)alloc, x, y, z, face, lod, a1, a2, a3, a4);
162246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    }
162346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    rsAllocationAdapterOffset((RsContext)con, (RsAllocation)alloc,
162446ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                              params, sizeof(params));
162546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams}
162646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
162746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
1628aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk// -----------------------------------
1629aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1630460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1631460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DCreateFromAssetStream(JNIEnv *_env, jobject _this, jlong con, jlong native_asset)
1632aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
1633aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    Asset* asset = reinterpret_cast<Asset*>(native_asset);
16340e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    ALOGV("______nFileA3D %p", asset);
1635aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
16363aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromMemory((RsContext)con, asset->getBuffer(false), asset->getLength());
1637b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1638b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1639b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1640460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1641eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFileA3DCreateFromAsset(JNIEnv *_env, jobject _this, jlong con, jobject _assetMgr, jstring _path)
1642b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1643b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr);
1644488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (mgr == nullptr) {
1645b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return 0;
1646b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
1647b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1648b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 str(_env, _path);
1649b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
1650488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (asset == nullptr) {
1651b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return 0;
1652b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
1653b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
16543aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromAsset((RsContext)con, asset);
1655b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1656b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1657b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1658460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
1659eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFileA3DCreateFromFile(JNIEnv *_env, jobject _this, jlong con, jstring fileName)
1660b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1661b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
16623aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DCreateFromFile((RsContext)con, fileNameUTF.c_str());
1663b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1664aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    return id;
1665aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1666aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1667460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jint
1668460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DGetNumIndexEntries(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D)
1669aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
1670aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    int32_t numEntries = 0;
1671eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaFileA3DGetNumIndexEntries((RsContext)con, &numEntries, (RsFile)fileA3D);
16720e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    return (jint)numEntries;
1673aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1674aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1675aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchoukstatic void
1676460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DGetIndexEntries(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D, jint numEntries, jintArray _ids, jobjectArray _entries)
1677aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
16780e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    ALOGV("______nFileA3D %p", (RsFile) fileA3D);
1679aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    RsFileIndexEntry *fileEntries = (RsFileIndexEntry*)malloc((uint32_t)numEntries * sizeof(RsFileIndexEntry));
1680aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1681eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaFileA3DGetIndexEntries((RsContext)con, fileEntries, (uint32_t)numEntries, (RsFile)fileA3D);
1682aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1683aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    for(jint i = 0; i < numEntries; i ++) {
1684aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        _env->SetObjectArrayElement(_entries, i, _env->NewStringUTF(fileEntries[i].objectName));
1685aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        _env->SetIntArrayRegion(_ids, i, 1, (const jint*)&fileEntries[i].classID);
1686aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
1687aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1688aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    free(fileEntries);
1689aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1690aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
16910e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1692460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynFileA3DGetEntryByIndex(JNIEnv *_env, jobject _this, jlong con, jlong fileA3D, jint index)
1693aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk{
16940e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    ALOGV("______nFileA3D %p", (RsFile) fileA3D);
16953aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsaFileA3DGetEntryByIndex((RsContext)con, (uint32_t)index, (RsFile)fileA3D);
1696aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    return id;
1697aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
1698d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1699d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// -----------------------------------
1700d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
17010e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1702eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFontCreateFromFile(JNIEnv *_env, jobject _this, jlong con,
1703b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                    jstring fileName, jfloat fontSize, jint dpi)
17049b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk{
1705b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
17063aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsFontCreateFromFile((RsContext)con,
1707e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                         fileNameUTF.c_str(), fileNameUTF.length(),
1708e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                         fontSize, dpi);
1709b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1710b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1711b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1712b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
17130e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1714eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFontCreateFromAssetStream(JNIEnv *_env, jobject _this, jlong con,
17150e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat                           jstring name, jfloat fontSize, jint dpi, jlong native_asset)
1716b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1717b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    Asset* asset = reinterpret_cast<Asset*>(native_asset);
1718b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 nameUTF(_env, name);
1719b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
17203aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsFontCreateFromMemory((RsContext)con,
1721e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                           nameUTF.c_str(), nameUTF.length(),
1722e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                           fontSize, dpi,
1723b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                                           asset->getBuffer(false), asset->getLength());
1724b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    return id;
1725b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk}
1726b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
17270e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
1728eff663f391fa4f119685d5c14489b94661ea126fTim MurraynFontCreateFromAsset(JNIEnv *_env, jobject _this, jlong con, jobject _assetMgr, jstring _path,
1729b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                     jfloat fontSize, jint dpi)
1730b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk{
1731b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr);
1732488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (mgr == nullptr) {
1733b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return 0;
1734b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
1735b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
1736b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 str(_env, _path);
1737b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
1738488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (asset == nullptr) {
1739b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return 0;
1740b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    }
17419b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk
17423aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsFontCreateFromMemory((RsContext)con,
1743e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                           str.c_str(), str.length(),
1744e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                           fontSize, dpi,
1745b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk                                           asset->getBuffer(false), asset->getLength());
1746b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    delete asset;
17479b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    return id;
17489b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk}
17499b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk
1750bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams// -----------------------------------
1751bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams
1752bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Samsstatic void
1753460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptBindAllocation(JNIEnv *_env, jobject _this, jlong con, jlong script, jlong alloc, jint slot)
1754d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
175567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
175667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)", (RsContext)con,
175767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsScript)script, (RsAllocation)alloc, slot);
175867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1759eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
1760d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
1761d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1762d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1763460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jint val)
17644d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams{
176567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
176667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con, (void *)script,
176767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
176867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1769eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarI((RsContext)con, (RsScript)script, slot, val);
17704d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams}
17714d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
17727c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jint
1773460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
17747c4caadb939b1563328251c156262c179a685c70Tim Murray{
177567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
177667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarI, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
177767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
17787c4caadb939b1563328251c156262c179a685c70Tim Murray    int value = 0;
1779eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
17807c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
17817c4caadb939b1563328251c156262c179a685c70Tim Murray}
17827c4caadb939b1563328251c156262c179a685c70Tim Murray
17834d3399337d18ef04116bc8a2e5799274655d0c30Jason Samsstatic void
1784460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarObj(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val)
17856f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams{
178667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
178709993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%" PRId64 ")", (RsContext)con, (void *)script,
178867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
178967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1790eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val);
17916f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams}
17926f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams
17936f4cf0b8885403ead157ae00fd43cf1282331c23Jason Samsstatic void
1794460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val)
1795031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines{
179667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
179709993f768bcb6dd9ed76b5c655da2ad9d0ad8396Bernhard Rosenkränzer        ALOGD("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%" PRId64 ")", (RsContext)con, (void *)script,
179867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
179967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1800eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarJ((RsContext)con, (RsScript)script, slot, val);
1801031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines}
1802031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines
18037c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jlong
1804460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
18057c4caadb939b1563328251c156262c179a685c70Tim Murray{
180667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
180767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarJ, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
180867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18097c4caadb939b1563328251c156262c179a685c70Tim Murray    jlong value = 0;
1810eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18117c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18127c4caadb939b1563328251c156262c179a685c70Tim Murray}
18137c4caadb939b1563328251c156262c179a685c70Tim Murray
1814031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hinesstatic void
1815460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, float val)
18164d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams{
181767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
181867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", (RsContext)con, (void *)script,
181967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
182067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1821eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarF((RsContext)con, (RsScript)script, slot, val);
18224d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams}
18234d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
18247c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jfloat
1825460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
18267c4caadb939b1563328251c156262c179a685c70Tim Murray{
182767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
182867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarF, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
182967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18307c4caadb939b1563328251c156262c179a685c70Tim Murray    jfloat value = 0;
1831eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18327c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18337c4caadb939b1563328251c156262c179a685c70Tim Murray}
18347c4caadb939b1563328251c156262c179a685c70Tim Murray
18354d3399337d18ef04116bc8a2e5799274655d0c30Jason Samsstatic void
1836460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, double val)
1837ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines{
183867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
183967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", (RsContext)con, (void *)script,
184067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot, val);
184167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1842eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarD((RsContext)con, (RsScript)script, slot, val);
1843ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines}
1844ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines
18457c4caadb939b1563328251c156262c179a685c70Tim Murraystatic jdouble
1846460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot)
18477c4caadb939b1563328251c156262c179a685c70Tim Murray{
184867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
184967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGetVarD, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
185067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18517c4caadb939b1563328251c156262c179a685c70Tim Murray    jdouble value = 0;
1852eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, &value, sizeof(value));
18537c4caadb939b1563328251c156262c179a685c70Tim Murray    return value;
18547c4caadb939b1563328251c156262c179a685c70Tim Murray}
18557c4caadb939b1563328251c156262c179a685c70Tim Murray
1856ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hinesstatic void
1857460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data)
18584d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams{
185967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
186067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
186167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18624d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    jint len = _env->GetArrayLength(data);
1863488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1864ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1865ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1866ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1867ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1868eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
18694d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
18704d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams}
18714d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1872adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hinesstatic void
1873460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data)
18747c4caadb939b1563328251c156262c179a685c70Tim Murray{
187567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
187667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
187767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
18787c4caadb939b1563328251c156262c179a685c70Tim Murray    jint len = _env->GetArrayLength(data);
1879488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1880ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1881ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1882ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1883ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1884eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
1885414fa2c93a763dce6b3adf898fbc68cf13667c07Stephen Hines    _env->ReleaseByteArrayElements(data, ptr, 0);
18867c4caadb939b1563328251c156262c179a685c70Tim Murray}
18877c4caadb939b1563328251c156262c179a685c70Tim Murray
18887c4caadb939b1563328251c156262c179a685c70Tim Murraystatic void
188967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas GampenScriptSetVarVE(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data,
189067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe                jlong elem, jintArray dims)
1891adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines{
189267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
189367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptSetVarVE, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
189467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1895adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    jint len = _env->GetArrayLength(data);
1896488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1897ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1898ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1899ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1900ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1901adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    jint dimsLen = _env->GetArrayLength(dims) * sizeof(int);
1902488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *dimsPtr = _env->GetIntArrayElements(dims, nullptr);
1903ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (dimsPtr == nullptr) {
1904ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1905ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1906ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1907eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem,
1908bc5d3eeedcbdff2e8331a6792902c6992db9bd31Stephen Hines                     (const uint32_t*) dimsPtr, dimsLen);
1909adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1910adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    _env->ReleaseIntArrayElements(dims, dimsPtr, JNI_ABORT);
1911adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines}
1912adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines
1913d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1914d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
1915460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptSetTimeZone(JNIEnv *_env, jobject _this, jlong con, jlong script, jbyteArray timeZone)
1916584a375df68ed7d62b38389078c6804edf228f9cRomain Guy{
191767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
191867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptCSetTimeZone, con(%p), s(%p)", (RsContext)con, (void *)script);
191967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1920584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
1921584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    jint length = _env->GetArrayLength(timeZone);
1922584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    jbyte* timeZone_ptr;
1923584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0);
1924ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (timeZone_ptr == nullptr) {
1925ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1926ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1927ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1928584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
1929eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length);
1930584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
1931584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    if (timeZone_ptr) {
1932584a375df68ed7d62b38389078c6804edf228f9cRomain Guy        _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0);
1933584a375df68ed7d62b38389078c6804edf228f9cRomain Guy    }
1934584a375df68ed7d62b38389078c6804edf228f9cRomain Guy}
1935584a375df68ed7d62b38389078c6804edf228f9cRomain Guy
193622534176fb5c1257130ef4ee589739ca42766a32Jason Samsstatic void
1937460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptInvoke(JNIEnv *_env, jobject _this, jlong con, jlong obj, jint slot)
193822534176fb5c1257130ef4ee589739ca42766a32Jason Sams{
193967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
194067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptInvoke, con(%p), script(%p)", (RsContext)con, (void *)obj);
194167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1942eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptInvoke((RsContext)con, (RsScript)obj, slot);
194322534176fb5c1257130ef4ee589739ca42766a32Jason Sams}
194422534176fb5c1257130ef4ee589739ca42766a32Jason Sams
1945584a375df68ed7d62b38389078c6804edf228f9cRomain Guystatic void
1946460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptInvokeV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data)
1947be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams{
194867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
194967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptInvokeV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
195067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
19514d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    jint len = _env->GetArrayLength(data);
1952488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
1953ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (ptr == nullptr) {
1954ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
1955ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return;
1956ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
1957eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len);
19584d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
1959be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams}
1960be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams
19616e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Samsstatic void
1962be7b1defb6b11920703b241ba5815fb09487bb02Chris WailesnScriptForEach(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
1963be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes               jlongArray ains, jlong aout, jbyteArray params,
1964be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes               jintArray limits)
19656e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Sams{
196667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
19679eb9dd326ae93cd84eb9bbc740f753fe8d8c7a13Chih-Hung Hsieh        ALOGD("nScriptForEach, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
196867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
1969949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
1970be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    jint   in_len = 0;
1971488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *in_ptr = nullptr;
1972949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
1973488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    RsAllocation *in_allocs = nullptr;
1974949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
1975488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (ains != nullptr) {
1976be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        in_len = _env->GetArrayLength(ains);
19777b2a46fee0f95b9ae2485db36e0d279730623c4aYang Ni        if (in_len > (jint)RS_KERNEL_MAX_ARGUMENTS) {
197817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            ALOGE("Too many arguments in kernel launch.");
197917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            // TODO (b/20758983): Report back to Java and throw an exception
198017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            return;
198117c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni        }
1982eb3470219dea322efa93eb4b5457813ce71d0c5dChris Wailes
198317c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni        in_ptr = _env->GetLongArrayElements(ains, nullptr);
1984ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (in_ptr == nullptr) {
1985ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
1986ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
1987ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
1988ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang
1989be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        if (sizeof(RsAllocation) == sizeof(jlong)) {
1990be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            in_allocs = (RsAllocation*)in_ptr;
1991949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
1992be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        } else {
1993be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            // Convert from 64-bit jlong types to the native pointer type.
1994eb3470219dea322efa93eb4b5457813ce71d0c5dChris Wailes
1995be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            in_allocs = (RsAllocation*)alloca(in_len * sizeof(RsAllocation));
199617c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            if (in_allocs == nullptr) {
199717c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni                ALOGE("Failed launching kernel for lack of memory.");
199817c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni                _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
199917c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni                return;
200017c2d7a3e1fac8d8876262255eb24f2f81c8fbacYang Ni            }
2001be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2002be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            for (int index = in_len; --index >= 0;) {
2003be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                in_allocs[index] = (RsAllocation)in_ptr[index];
2004be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            }
2005be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        }
2006949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes    }
2007949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2008be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    jint   param_len = 0;
2009488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte *param_ptr = nullptr;
2010be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2011488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (params != nullptr) {
2012be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        param_len = _env->GetArrayLength(params);
2013488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        param_ptr = _env->GetByteArrayElements(params, nullptr);
2014ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (param_ptr == nullptr) {
2015ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
2016ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
2017ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
2018c9c7daf69b32c0e72a3b99379cc5116c1647f24eStephen Hines    }
2019949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2020488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    RsScriptCall sc, *sca = nullptr;
2021be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    uint32_t sc_size = 0;
2022949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2023be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    jint  limit_len = 0;
2024488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *limit_ptr = nullptr;
2025949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2026488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (limits != nullptr) {
2027be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        limit_len = _env->GetArrayLength(limits);
2028488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes        limit_ptr = _env->GetIntArrayElements(limits, nullptr);
2029ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (limit_ptr == nullptr) {
2030ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
2031ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
2032ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
2033949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2034be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        assert(limit_len == 6);
203567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        UNUSED(limit_len);  // As the assert might not be compiled.
2036949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2037be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.xStart     = limit_ptr[0];
2038be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.xEnd       = limit_ptr[1];
2039be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.yStart     = limit_ptr[2];
2040be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.yEnd       = limit_ptr[3];
2041be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.zStart     = limit_ptr[4];
2042be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.zEnd       = limit_ptr[5];
2043be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sc.strategy   = RS_FOR_EACH_STRATEGY_DONT_CARE;
204414331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.arrayStart = 0;
204514331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.arrayEnd = 0;
204614331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array2Start = 0;
204714331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array2End = 0;
204814331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array3Start = 0;
204914331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array3End = 0;
205014331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array4Start = 0;
205114331ab1c3fd78c1204b41f27d62deb5c1b4acf2Jason Sams        sc.array4End = 0;
2052949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2053be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        sca = &sc;
2054be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    }
2055949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2056be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    rsScriptForEachMulti((RsContext)con, (RsScript)script, slot,
2057be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                         in_allocs, in_len, (RsAllocation)aout,
2058be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                         param_ptr, param_len, sca, sc_size);
2059949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2060488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (ains != nullptr) {
2061be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
2062949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes    }
2063949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
2064488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (params != nullptr) {
2065be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        _env->ReleaseByteArrayElements(params, param_ptr, JNI_ABORT);
2066eb3470219dea322efa93eb4b5457813ce71d0c5dChris Wailes    }
2067c9c7daf69b32c0e72a3b99379cc5116c1647f24eStephen Hines
2068488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    if (limits != nullptr) {
2069be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
2070be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    }
2071949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes}
2072949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
207336eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Walastatic void
207436eb1f74b3d19d9dbae0803f3bc271683be811ceMatt WalanScriptReduce(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
207536eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala              jlong ain, jlong aout, jintArray limits)
207636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala{
207736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    if (kLogApi) {
207836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        ALOGD("nScriptReduce, con(%p), s(%p), slot(%i) ain(%" PRId64 ") aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ain, aout);
207936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    }
208036eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
208136eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    RsScriptCall sc, *sca = nullptr;
208236eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    uint32_t sc_size = 0;
208336eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
208436eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    jint  limit_len = 0;
208536eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    jint *limit_ptr = nullptr;
208636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
208736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    // If the caller passed limits, reflect them in the RsScriptCall.
208836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    if (limits != nullptr) {
208936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        limit_len = _env->GetArrayLength(limits);
209036eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        limit_ptr = _env->GetIntArrayElements(limits, nullptr);
2091ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        if (limit_ptr == nullptr) {
2092ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            ALOGE("Failed to get Java array elements");
2093ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang            return;
2094ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        }
209536eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
209636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        // We expect to be passed an array [x1, x2] which specifies
209736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        // the sub-range for a 1-dimensional reduction.
209836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        assert(limit_len == 2);
209936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        UNUSED(limit_len);  // As the assert might not be compiled.
210036eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
210136eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.xStart     = limit_ptr[0];
210236eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.xEnd       = limit_ptr[1];
210336eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.yStart     = 0;
210436eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.yEnd       = 0;
210536eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.zStart     = 0;
210636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.zEnd       = 0;
210736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.strategy   = RS_FOR_EACH_STRATEGY_DONT_CARE;
210836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.arrayStart = 0;
210936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.arrayEnd = 0;
211036eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.array2Start = 0;
211136eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.array2End = 0;
211236eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.array3Start = 0;
211336eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.array3End = 0;
211436eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.array4Start = 0;
211536eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc.array4End = 0;
211636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
211736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sca = &sc;
211836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        sc_size = sizeof(sc);
211936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    }
212036eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
212136eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    rsScriptReduce((RsContext)con, (RsScript)script, slot,
212236eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala                   (RsAllocation)ain, (RsAllocation)aout,
212336eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala                   sca, sc_size);
212436eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
212536eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    if (limits != nullptr) {
212636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala        _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
212736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    }
212836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala}
212936eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala
2130fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams// -----------------------------------
2131fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams
21320e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
2133eff663f391fa4f119685d5c14489b94661ea126fTim MurraynScriptCCreate(JNIEnv *_env, jobject _this, jlong con,
2134e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams               jstring resName, jstring cacheDir,
2135e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams               jbyteArray scriptRef, jint length)
2136d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
213767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
213867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptCCreate, con(%p)", (RsContext)con);
213967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2140e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams
2141e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    AutoJavaStringToUTF8 resNameUTF(_env, resName);
2142e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
21430e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    jlong ret = 0;
2144488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jbyte* script_ptr = nullptr;
214543702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    jint _exception = 0;
214643702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    jint remaining;
214743702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    if (!scriptRef) {
214843702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _exception = 1;
21498451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null");
215043702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        goto exit;
215143702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
215243702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    if (length < 0) {
215343702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _exception = 1;
21548451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0");
215543702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        goto exit;
215643702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
2157e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    remaining = _env->GetArrayLength(scriptRef);
215843702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    if (remaining < length) {
215943702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _exception = 1;
21608451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //jniThrowException(_env, "java/lang/IllegalArgumentException",
21618451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        //        "length > script.length - offset");
216243702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        goto exit;
216343702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
2164e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    script_ptr = (jbyte *)
216543702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich        _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0);
2166ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (script_ptr == nullptr) {
2167ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
2168ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return ret;
2169ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
217043702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich
2171eff663f391fa4f119685d5c14489b94661ea126fTim Murray    //rsScriptCSetText((RsContext)con, (const char *)script_ptr, length);
2172e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams
21733aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    ret = (jlong)(uintptr_t)rsScriptCCreate((RsContext)con,
2174e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                resNameUTF.c_str(), resNameUTF.length(),
2175e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk                                cacheDirUTF.c_str(), cacheDirUTF.length(),
2176e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams                                (const char *)script_ptr, length);
217739ddc950c9064129ead5de04b200106c0659f937Jason Sams
217843702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevichexit:
2179e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    if (script_ptr) {
2180e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams        _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr,
218143702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich                _exception ? JNI_ABORT: 0);
218243702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    }
2183d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
21843aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)ret;
2185d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2186d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2187460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2188460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptIntrinsicCreate(JNIEnv *_env, jobject _this, jlong con, jint id, jlong eid)
21896ab97682fd444586ee135912a4210417a1c8781bJason Sams{
219067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
219167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptIntrinsicCreate, con(%p) id(%i) element(%p)", (RsContext)con, id,
219267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)eid);
219367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
21943aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
21956ab97682fd444586ee135912a4210417a1c8781bJason Sams}
21966ab97682fd444586ee135912a4210417a1c8781bJason Sams
2197460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2198460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptKernelIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jint sig)
219908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
220067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
220167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptKernelIDCreate, con(%p) script(%p), slot(%i), sig(%i)", (RsContext)con,
220267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)sid, slot, sig);
220367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
22043aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsScriptKernelIDCreate((RsContext)con, (RsScript)sid, slot, sig);
220508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
220608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2207460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2208be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang NinScriptInvokeIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
2209be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni{
2210be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    if (kLogApi) {
22117ff53fa0d42795da55b65468e07df82029deda79Elliott Hughes        ALOGD("nScriptInvokeIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con,
2212be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni              (void *)sid, slot);
2213be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    }
2214be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    return (jlong)(uintptr_t)rsScriptInvokeIDCreate((RsContext)con, (RsScript)sid, slot);
2215be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni}
2216be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
2217be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Nistatic jlong
2218460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptFieldIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
221908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
222067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
222167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptFieldIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con, (void *)sid,
222267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              slot);
222367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
22243aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
222508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
222608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2227460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
22289807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnScriptGroupCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _kernels, jlongArray _src,
22299807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    jlongArray _dstk, jlongArray _dstf, jlongArray _types)
223008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
223167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
223267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupCreate, con(%p)", (RsContext)con);
223367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
223408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
22359807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    jint kernelsLen = _env->GetArrayLength(_kernels);
2236488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jKernelsPtr = _env->GetLongArrayElements(_kernels, nullptr);
2237ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jKernelsPtr == nullptr) {
2238ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: kernels");
2239ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
2240ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
22419807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    RsScriptKernelID* kernelsPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * kernelsLen);
22429807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < kernelsLen; ++i) {
22439807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        kernelsPtr[i] = (RsScriptKernelID)jKernelsPtr[i];
22449807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
22459807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
22469807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    jint srcLen = _env->GetArrayLength(_src);
2247488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jSrcPtr = _env->GetLongArrayElements(_src, nullptr);
2248ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jSrcPtr == nullptr) {
2249ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: src");
2250ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
2251ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
22529807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    RsScriptKernelID* srcPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * srcLen);
22539807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < srcLen; ++i) {
22549807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        srcPtr[i] = (RsScriptKernelID)jSrcPtr[i];
22559807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
22569807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
22579807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    jint dstkLen = _env->GetArrayLength(_dstk);
2258488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jDstkPtr = _env->GetLongArrayElements(_dstk, nullptr);
2259ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jDstkPtr == nullptr) {
2260ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: dstk");
2261ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
2262ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
22639807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    RsScriptKernelID* dstkPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstkLen);
22649807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < dstkLen; ++i) {
22659807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        dstkPtr[i] = (RsScriptKernelID)jDstkPtr[i];
22669807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
22679807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
22689807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    jint dstfLen = _env->GetArrayLength(_dstf);
2269488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jDstfPtr = _env->GetLongArrayElements(_dstf, nullptr);
2270ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jDstfPtr == nullptr) {
2271ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: dstf");
2272ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
2273ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
22749807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    RsScriptKernelID* dstfPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstfLen);
22759807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < dstfLen; ++i) {
22769807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        dstfPtr[i] = (RsScriptKernelID)jDstfPtr[i];
22779807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
22789807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
22799807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    jint typesLen = _env->GetArrayLength(_types);
2280488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jTypesPtr = _env->GetLongArrayElements(_types, nullptr);
2281ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jTypesPtr == nullptr) {
2282ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: types");
2283ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
2284ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
22859807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    RsType* typesPtr = (RsType*) malloc(sizeof(RsType) * typesLen);
22869807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < typesLen; ++i) {
22879807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        typesPtr[i] = (RsType)jTypesPtr[i];
22889807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
22899807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
22903aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsScriptGroupCreate((RsContext)con,
22919807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptKernelID *)kernelsPtr, kernelsLen * sizeof(RsScriptKernelID),
22929807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptKernelID *)srcPtr, srcLen * sizeof(RsScriptKernelID),
22939807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptKernelID *)dstkPtr, dstkLen * sizeof(RsScriptKernelID),
22949807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsScriptFieldID *)dstfPtr, dstfLen * sizeof(RsScriptKernelID),
22959807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                               (RsType *)typesPtr, typesLen * sizeof(RsType));
22969807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
22979807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(kernelsPtr);
22989807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(srcPtr);
22999807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(dstkPtr);
23009807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(dstfPtr);
23019807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(typesPtr);
23029807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(_kernels, jKernelsPtr, 0);
23039807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(_src, jSrcPtr, 0);
23049807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(_dstk, jDstkPtr, 0);
23059807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(_dstf, jDstfPtr, 0);
23069807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(_types, jTypesPtr, 0);
230708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    return id;
230808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
230908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
231008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Samsstatic void
2311460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGroupSetInput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
231208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
231367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
231467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupSetInput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
231567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)gid, (void *)kid, (void *)alloc);
231667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2317eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGroupSetInput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid, (RsAllocation)alloc);
231808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
231908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
232008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Samsstatic void
2321460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGroupSetOutput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
232208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
232367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
232467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupSetOutput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
232567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (void *)gid, (void *)kid, (void *)alloc);
232667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2327eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGroupSetOutput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid, (RsAllocation)alloc);
232808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
232908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
233008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Samsstatic void
2331460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynScriptGroupExecute(JNIEnv *_env, jobject _this, jlong con, jlong gid)
233208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams{
233367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
233467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nScriptGroupSetOutput, con(%p) group(%p)", (RsContext)con, (void *)gid);
233567333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2336eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsScriptGroupExecute((RsContext)con, (RsScriptGroup)gid);
233708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams}
233808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2339d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
2340d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
23410e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
2342eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramStoreCreate(JNIEnv *_env, jobject _this, jlong con,
2343331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jboolean colorMaskR, jboolean colorMaskG, jboolean colorMaskB, jboolean colorMaskA,
2344331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jboolean depthMask, jboolean ditherEnable,
2345331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jint srcFunc, jint destFunc,
2346331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                    jint depthFunc)
2347d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
234867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
234967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramStoreCreate, con(%p)", (RsContext)con);
235067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
23513aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsProgramStoreCreate((RsContext)con, colorMaskR, colorMaskG, colorMaskB, colorMaskA,
2352331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                                      depthMask, ditherEnable, (RsBlendSrcFunc)srcFunc,
2353331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams                                      (RsBlendDstFunc)destFunc, (RsDepthFunc)depthFunc);
2354d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2355d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
23560011bcf57ff711a221a3a4c73f2a79125111647dJason Sams// ---------------------------------------------------------------------------
23570011bcf57ff711a221a3a4c73f2a79125111647dJason Sams
23580011bcf57ff711a221a3a4c73f2a79125111647dJason Samsstatic void
2359460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynProgramBindConstants(JNIEnv *_env, jobject _this, jlong con, jlong vpv, jint slot, jlong a)
23600011bcf57ff711a221a3a4c73f2a79125111647dJason Sams{
236167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
236267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramBindConstants, con(%p), vpf(%p), sloat(%i), a(%p)", (RsContext)con,
236367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramVertex)vpv, slot, (RsAllocation)a);
236467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2365eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsProgramBindConstants((RsContext)con, (RsProgram)vpv, slot, (RsAllocation)a);
23660011bcf57ff711a221a3a4c73f2a79125111647dJason Sams}
236754c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams
2368d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
2369460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynProgramBindTexture(JNIEnv *_env, jobject _this, jlong con, jlong vpf, jint slot, jlong a)
237054c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams{
237167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
237267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramBindTexture, con(%p), vpf(%p), slot(%i), a(%p)", (RsContext)con,
237367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramFragment)vpf, slot, (RsAllocation)a);
237467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2375eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsProgramBindTexture((RsContext)con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
237654c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams}
237754c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams
237854c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Samsstatic void
2379460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynProgramBindSampler(JNIEnv *_env, jobject _this, jlong con, jlong vpf, jint slot, jlong a)
2380d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
238167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
238267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramBindSampler, con(%p), vpf(%p), slot(%i), a(%p)", (RsContext)con,
238367333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramFragment)vpf, slot, (RsSampler)a);
238467333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2385eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsProgramBindSampler((RsContext)con, (RsProgramFragment)vpf, slot, (RsSampler)a);
2386d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2387d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
238868afd01ec9fd37774d8291192952a25e5605b6fbJason Sams// ---------------------------------------------------------------------------
2389d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2390460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2391eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramFragmentCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader,
23929807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                       jobjectArray texNames, jlongArray params)
23937e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams{
2394b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 shaderUTF(_env, shader);
2395488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jParamPtr = _env->GetLongArrayElements(params, nullptr);
23967e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams    jint paramLen = _env->GetArrayLength(params);
2397ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jParamPtr == nullptr) {
2398ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
2399ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
2400ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
24017e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
24022123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    int texCount = _env->GetArrayLength(texNames);
24032123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8 names(_env, texNames, texCount);
24042123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char ** nameArray = names.c_str();
24052123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t* sizeArray = names.c_str_len();
24062123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
240767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
240867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramFragmentCreate, con(%p), paramLen(%i)", (RsContext)con, paramLen);
240967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
24107e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
24119807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t * paramPtr = (uintptr_t*) malloc(sizeof(uintptr_t) * paramLen);
24129807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < paramLen; ++i) {
24139807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        paramPtr[i] = (uintptr_t)jParamPtr[i];
24149807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
24153aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong ret = (jlong)(uintptr_t)rsProgramFragmentCreate((RsContext)con, shaderUTF.c_str(), shaderUTF.length(),
24162123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                                             nameArray, texCount, sizeArray,
24179807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                                             paramPtr, paramLen);
24182123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
24199807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(paramPtr);
24209807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(params, jParamPtr, JNI_ABORT);
24217e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams    return ret;
24227e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams}
24237e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
24247e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
24251fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams// ---------------------------------------------------------------------------
24261fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams
2427460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2428eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramVertexCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader,
24299807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                     jobjectArray texNames, jlongArray params)
24301fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams{
2431b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    AutoJavaStringToUTF8 shaderUTF(_env, shader);
2432488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jParamPtr = _env->GetLongArrayElements(params, nullptr);
24330011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    jint paramLen = _env->GetArrayLength(params);
2434ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jParamPtr == nullptr) {
2435ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements");
2436ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
2437ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
24381fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams
243967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
244067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramVertexCreate, con(%p), paramLen(%i)", (RsContext)con, paramLen);
244167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2442ee41112e1539de95596600fd2c6dada5d275217fJason Sams
24432123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    int texCount = _env->GetArrayLength(texNames);
24442123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    AutoJavaStringArrayToUTF8 names(_env, texNames, texCount);
24452123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    const char ** nameArray = names.c_str();
24462123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk    size_t* sizeArray = names.c_str_len();
24472123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
24489807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    uintptr_t * paramPtr = (uintptr_t*) malloc(sizeof(uintptr_t) * paramLen);
24499807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < paramLen; ++i) {
24509807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        paramPtr[i] = (uintptr_t)jParamPtr[i];
24519807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
24529807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
24533aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong ret = (jlong)(uintptr_t)rsProgramVertexCreate((RsContext)con, shaderUTF.c_str(), shaderUTF.length(),
24542123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                                           nameArray, texCount, sizeArray,
24559807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                                           paramPtr, paramLen);
24562123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk
24579807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(paramPtr);
24589807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(params, jParamPtr, JNI_ABORT);
24590011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    return ret;
24601fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams}
24611fe9b8c3bdc55e624edc1a69c3f3f0b9e90af1e4Jason Sams
2462ebfb436a49673693b98469683451bd9ede797557Jason Sams// ---------------------------------------------------------------------------
2463ebfb436a49673693b98469683451bd9ede797557Jason Sams
2464460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
2465eff663f391fa4f119685d5c14489b94661ea126fTim MurraynProgramRasterCreate(JNIEnv *_env, jobject _this, jlong con, jboolean pointSprite, jint cull)
2466ebfb436a49673693b98469683451bd9ede797557Jason Sams{
246767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
246867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nProgramRasterCreate, con(%p), pointSprite(%i), cull(%i)", (RsContext)con,
246967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              pointSprite, cull);
247067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
24713aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsProgramRasterCreate((RsContext)con, pointSprite, (RsCullMode)cull);
2472ebfb436a49673693b98469683451bd9ede797557Jason Sams}
2473ebfb436a49673693b98469683451bd9ede797557Jason Sams
2474d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2475d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
2476d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2477d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
247878c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindRootScript(JNIEnv *_env, jobject _this, jlong con, jlong script)
2479d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
248067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
248167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindRootScript, con(%p), script(%p)", (RsContext)con, (RsScript)script);
248267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2483eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindRootScript((RsContext)con, (RsScript)script);
2484d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2485d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2486d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
248778c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramStore(JNIEnv *_env, jobject _this, jlong con, jlong pfs)
2488d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
248967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
249067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramStore, con(%p), pfs(%p)", (RsContext)con, (RsProgramStore)pfs);
249167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2492eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramStore((RsContext)con, (RsProgramStore)pfs);
2493d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2494d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2495d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic void
249678c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramFragment(JNIEnv *_env, jobject _this, jlong con, jlong pf)
2497d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
249867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
249967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramFragment, con(%p), pf(%p)", (RsContext)con,
250067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe              (RsProgramFragment)pf);
250167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2502eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramFragment((RsContext)con, (RsProgramFragment)pf);
2503d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2504d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
25050826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samsstatic void
250678c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramVertex(JNIEnv *_env, jobject _this, jlong con, jlong pf)
25070826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams{
250867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
250967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramVertex, con(%p), pf(%p)", (RsContext)con, (RsProgramVertex)pf);
251067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2511eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramVertex((RsContext)con, (RsProgramVertex)pf);
25120826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams}
25130826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams
2514d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onoratostatic void
251578c0ce56129d8109fa2427de769f4d25a971d162Narayan KamathnContextBindProgramRaster(JNIEnv *_env, jobject _this, jlong con, jlong pf)
2516ebfb436a49673693b98469683451bd9ede797557Jason Sams{
251767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
251867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nContextBindProgramRaster, con(%p), pf(%p)", (RsContext)con, (RsProgramRaster)pf);
251967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2520eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsContextBindProgramRaster((RsContext)con, (RsProgramRaster)pf);
2521ebfb436a49673693b98469683451bd9ede797557Jason Sams}
2522ebfb436a49673693b98469683451bd9ede797557Jason Sams
2523d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onorato
252402fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams// ---------------------------------------------------------------------------
252502fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams
25260e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhatstatic jlong
2527eff663f391fa4f119685d5c14489b94661ea126fTim MurraynSamplerCreate(JNIEnv *_env, jobject _this, jlong con, jint magFilter, jint minFilter,
2528a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk               jint wrapS, jint wrapT, jint wrapR, jfloat aniso)
252902fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams{
253067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
253167333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nSamplerCreate, con(%p)", (RsContext)con);
253267333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
25333aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    return (jlong)(uintptr_t)rsSamplerCreate((RsContext)con,
2534a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)magFilter,
2535a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)minFilter,
2536a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)wrapS,
2537a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)wrapT,
2538a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 (RsSamplerValue)wrapR,
2539a89094aa3bc059c6e03b20b4c5b1ede4582f3da9Alex Sakhartchouk                                 aniso);
254002fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams}
254102fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams
2542bba134c8a1dcfe0c8473307a95899a02c9553504Jason Sams// ---------------------------------------------------------------------------
2543bba134c8a1dcfe0c8473307a95899a02c9553504Jason Sams
2544460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murraystatic jlong
25459807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnMeshCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _vtx, jlongArray _idx, jintArray _prim)
2546164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk{
254767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
254867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshCreate, con(%p)", (RsContext)con);
254967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
2550164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
255125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk    jint vtxLen = _env->GetArrayLength(_vtx);
2552488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jVtxPtr = _env->GetLongArrayElements(_vtx, nullptr);
2553ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jVtxPtr == nullptr) {
2554ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: vtx");
2555ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
2556ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
25579807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    RsAllocation* vtxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * vtxLen);
25589807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < vtxLen; ++i) {
25599807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        vtxPtr[i] = (RsAllocation)(uintptr_t)jVtxPtr[i];
25609807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
25619807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
256225999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk    jint idxLen = _env->GetArrayLength(_idx);
2563488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jlong *jIdxPtr = _env->GetLongArrayElements(_idx, nullptr);
2564ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (jIdxPtr == nullptr) {
2565ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: idx");
2566ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
2567ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
25689807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    RsAllocation* idxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * idxLen);
25699807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    for(int i = 0; i < idxLen; ++i) {
25709807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        idxPtr[i] = (RsAllocation)(uintptr_t)jIdxPtr[i];
25719807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    }
25729807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat
257325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk    jint primLen = _env->GetArrayLength(_prim);
2574488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    jint *primPtr = _env->GetIntArrayElements(_prim, nullptr);
2575ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    if (primPtr == nullptr) {
2576ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        ALOGE("Failed to get Java array elements: prim");
2577ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang        return 0;
2578ba8766c5db4b2c35f3461abf221e723e3bbbfa99Miao Wang    }
2579164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
25803aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray    jlong id = (jlong)(uintptr_t)rsMeshCreate((RsContext)con,
258125999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                               (RsAllocation *)vtxPtr, vtxLen,
258225999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                               (RsAllocation *)idxPtr, idxLen,
258325999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk                               (uint32_t *)primPtr, primLen);
258480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
25859807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(vtxPtr);
25869807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    free(idxPtr);
25879807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(_vtx, jVtxPtr, 0);
25889807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat    _env->ReleaseLongArrayElements(_idx, jIdxPtr, 0);
258925999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk    _env->ReleaseIntArrayElements(_prim, primPtr, 0);
259025999a08a6652ff5d7d0973f279f1e92e04b3506Alex Sakhartchouk    return id;
25919d71e2180062931416092f26276a07e55b318f62Alex Sakhartchouk}
25929d71e2180062931416092f26276a07e55b318f62Alex Sakhartchouk
259380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic jint
2594460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynMeshGetVertexBufferCount(JNIEnv *_env, jobject _this, jlong con, jlong mesh)
259580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
259667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
259767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetVertexBufferCount, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
259867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
259980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    jint vtxCount = 0;
2600eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetVertexBufferCount((RsContext)con, (RsMesh)mesh, &vtxCount);
260180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    return vtxCount;
260280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk}
260380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
260480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic jint
2605460a04971c494fec39ffcb38e873bb8fdd82d113Tim MurraynMeshGetIndexCount(JNIEnv *_env, jobject _this, jlong con, jlong mesh)
260680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
260767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
260867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetIndexCount, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
260967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
261080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    jint idxCount = 0;
2611eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetIndexCount((RsContext)con, (RsMesh)mesh, &idxCount);
261280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    return idxCount;
261380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk}
261480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
261580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic void
26169807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnMeshGetVertices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jlongArray _ids, jint numVtxIDs)
261780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
261867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
261967333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetVertices, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
262067333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
262180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
262280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numVtxIDs * sizeof(RsAllocation));
2623eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetVertices((RsContext)con, (RsMesh)mesh, allocs, (uint32_t)numVtxIDs);
262480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
262580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    for(jint i = 0; i < numVtxIDs; i ++) {
26263aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong alloc = (jlong)(uintptr_t)allocs[i];
26279807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_ids, i, 1, &alloc);
262880a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    }
262980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
263080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    free(allocs);
263180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk}
263280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
263380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchoukstatic void
26349807155b11a25fb6068edc9b1cd82928ac2f05deAshok BhatnMeshGetIndices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jlongArray _idxIds, jintArray _primitives, jint numIndices)
263580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk{
263667333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    if (kLogApi) {
263767333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe        ALOGD("nMeshGetVertices, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh);
263867333928bfea7d53d8bc1b83599532f6fe5e2b2cAndreas Gampe    }
263980a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
264080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numIndices * sizeof(RsAllocation));
264180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    uint32_t *prims= (uint32_t*)malloc((uint32_t)numIndices * sizeof(uint32_t));
264280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
2643eff663f391fa4f119685d5c14489b94661ea126fTim Murray    rsaMeshGetIndices((RsContext)con, (RsMesh)mesh, allocs, prims, (uint32_t)numIndices);
264480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
264580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    for(jint i = 0; i < numIndices; i ++) {
26463aa89c1e243a2fae2b9d98fdbad574227c5b5bfaTim Murray        const jlong alloc = (jlong)(uintptr_t)allocs[i];
26479807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        const jint prim = (jint)prims[i];
26489807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetLongArrayRegion(_idxIds, i, 1, &alloc);
26499807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        _env->SetIntArrayRegion(_primitives, i, 1, &prim);
265080a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    }
265180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
265280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    free(allocs);
265380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    free(prims);
2654164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk}
2655164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
265656f9e6f8d5436d50530807950661e66ca5efe2bbTim Murraystatic jint
265756f9e6f8d5436d50530807950661e66ca5efe2bbTim MurraynSystemGetPointerSize(JNIEnv *_env, jobject _this) {
265856f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray    return (jint)sizeof(void*);
265956f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray}
266056f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray
266156f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray
2662164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk// ---------------------------------------------------------------------------
2663164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
2664d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
266594d8e90ad78ee1dbc0efa315117688abd126ae55Jason Samsstatic const char *classPathName = "android/renderscript/RenderScript";
2666d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
266776f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod methods[] = {
26681c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams{"_nInit",                         "()V",                                     (void*)_nInit },
26691c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
2670eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nDeviceCreate",                  "()J",                                     (void*)nDeviceCreate },
2671eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nDeviceDestroy",                 "(J)V",                                    (void*)nDeviceDestroy },
2672eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nDeviceSetConfig",               "(JII)V",                                  (void*)nDeviceSetConfig },
2673eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextGetUserMessage",         "(J[I)I",                                  (void*)nContextGetUserMessage },
2674eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextGetErrorMessage",        "(J)Ljava/lang/String;",                   (void*)nContextGetErrorMessage },
2675eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextPeekMessage",            "(J[I)I",                                  (void*)nContextPeekMessage },
26761c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams
2677eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextInitToClient",           "(J)V",                                    (void*)nContextInitToClient },
2678eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"nContextDeinitToClient",         "(J)V",                                    (void*)nContextDeinitToClient },
26792e1872fe07cf8952812a417985e6e1f61bdeab5dJason Sams
26802e1872fe07cf8952812a417985e6e1f61bdeab5dJason Sams
26812e1872fe07cf8952812a417985e6e1f61bdeab5dJason Sams// All methods below are thread protected in java.
2682eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextCreate",                 "(JIII)J",                               (void*)nContextCreate },
2683eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextCreateGL",               "(JIIIIIIIIIIIIFI)J",                    (void*)nContextCreateGL },
2684eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextFinish",                 "(J)V",                                  (void*)nContextFinish },
2685eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextSetPriority",            "(JI)V",                                 (void*)nContextSetPriority },
268647f31582b67f492d9e1523abd0d8b86c38ec007dTim Murray{"rsnContextSetCacheDir",            "(JLjava/lang/String;)V",                (void*)nContextSetCacheDir },
2687eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextSetSurface",             "(JIILandroid/view/Surface;)V",          (void*)nContextSetSurface },
2688eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextDestroy",                "(J)V",                                  (void*)nContextDestroy },
2689eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextDump",                   "(JI)V",                                 (void*)nContextDump },
2690eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextPause",                  "(J)V",                                  (void*)nContextPause },
2691eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextResume",                 "(J)V",                                  (void*)nContextResume },
2692eff663f391fa4f119685d5c14489b94661ea126fTim Murray{"rsnContextSendMessage",            "(JI[I)V",                               (void*)nContextSendMessage },
2693281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnClosureCreate",                 "(JJJ[J[J[I[J[J)J",                      (void*)nClosureCreate },
2694be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni{"rsnInvokeClosureCreate",           "(JJ[B[J[J[I)J",                         (void*)nInvokeClosureCreate },
2695281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnClosureSetArg",                 "(JJIJI)V",                              (void*)nClosureSetArg },
2696281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnClosureSetGlobal",              "(JJJJI)V",                              (void*)nClosureSetGlobal },
2697460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAssignName",                    "(JJ[B)V",                               (void*)nAssignName },
2698460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnGetName",                       "(JJ)Ljava/lang/String;",                (void*)nGetName },
2699460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnObjDestroy",                    "(JJ)V",                                 (void*)nObjDestroy },
2700eff663f391fa4f119685d5c14489b94661ea126fTim Murray
2701460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DCreateFromFile",         "(JLjava/lang/String;)J",                (void*)nFileA3DCreateFromFile },
27020e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFileA3DCreateFromAssetStream",  "(JJ)J",                                 (void*)nFileA3DCreateFromAssetStream },
2703460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DCreateFromAsset",        "(JLandroid/content/res/AssetManager;Ljava/lang/String;)J",            (void*)nFileA3DCreateFromAsset },
2704460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DGetNumIndexEntries",     "(JJ)I",                                 (void*)nFileA3DGetNumIndexEntries },
2705460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnFileA3DGetIndexEntries",        "(JJI[I[Ljava/lang/String;)V",           (void*)nFileA3DGetIndexEntries },
27060e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFileA3DGetEntryByIndex",        "(JJI)J",                                (void*)nFileA3DGetEntryByIndex },
2707eff663f391fa4f119685d5c14489b94661ea126fTim Murray
27080e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFontCreateFromFile",            "(JLjava/lang/String;FI)J",              (void*)nFontCreateFromFile },
27090e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFontCreateFromAssetStream",     "(JLjava/lang/String;FIJ)J",             (void*)nFontCreateFromAssetStream },
27100e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnFontCreateFromAsset",        "(JLandroid/content/res/AssetManager;Ljava/lang/String;FI)J",            (void*)nFontCreateFromAsset },
2711eff663f391fa4f119685d5c14489b94661ea126fTim Murray
2712460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnElementCreate",                 "(JJIZI)J",                              (void*)nElementCreate },
27139807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnElementCreate2",                "(J[J[Ljava/lang/String;[I)J",           (void*)nElementCreate2 },
2714460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnElementGetNativeData",          "(JJ[I)V",                               (void*)nElementGetNativeData },
27159807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnElementGetSubElements",         "(JJ[J[Ljava/lang/String;[I)V",          (void*)nElementGetSubElements },
2716460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
2717460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnTypeCreate",                    "(JJIIIZZI)J",                           (void*)nTypeCreate },
27189807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnTypeGetNativeData",             "(JJ[J)V",                               (void*)nTypeGetNativeData },
2719460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
27209807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnAllocationCreateTyped",         "(JJIIJ)J",                               (void*)nAllocationCreateTyped },
2721460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCreateFromBitmap",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateFromBitmap },
2722460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCreateBitmapBackedAllocation",    "(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCreateBitmapBackedAllocation },
2723460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCubeCreateFromBitmap","(JJILandroid/graphics/Bitmap;I)J",      (void*)nAllocationCubeCreateFromBitmap },
2724460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
2725460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCopyFromBitmap",      "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyFromBitmap },
2726460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationCopyToBitmap",        "(JJLandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyToBitmap },
2727460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
2728460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationSyncAll",             "(JJI)V",                                (void*)nAllocationSyncAll },
2729460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationGetSurface",          "(JJ)Landroid/view/Surface;",            (void*)nAllocationGetSurface },
2730460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationSetSurface",          "(JJLandroid/view/Surface;)V",           (void*)nAllocationSetSurface },
2731460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationIoSend",              "(JJ)V",                                 (void*)nAllocationIoSend },
2732460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationIoReceive",           "(JJ)V",                                 (void*)nAllocationIoReceive },
273387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationData1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationData1D },
2734c8e237e27165c7f7855ed0b077cfe5f1e54908efMiao Wang{"rsnAllocationElementData",         "(JJIIIII[BI)V",                         (void*)nAllocationElementData },
273587e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationData2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationData2D },
2736460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationData2D",              "(JJIIIIIIJIIII)V",                      (void*)nAllocationData2D_alloc },
273787e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationData3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",    (void*)nAllocationData3D },
2738460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationData3D",              "(JJIIIIIIIJIIII)V",                     (void*)nAllocationData3D_alloc },
273987e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead",                "(JJLjava/lang/Object;IIZ)V",            (void*)nAllocationRead },
274087e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead1D",              "(JJIIILjava/lang/Object;IIIZ)V",        (void*)nAllocationRead1D },
274145cec0a9711f736df26fd097c6d74834e350f9bcMiao Wang{"rsnAllocationElementRead",         "(JJIIIII[BI)V",                         (void*)nAllocationElementRead },
274287e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead2D",              "(JJIIIIIILjava/lang/Object;IIIZ)V",     (void*)nAllocationRead2D },
274387e908dfdece91b5f504386d4901fa3342dc8083Miao Wang{"rsnAllocationRead3D",              "(JJIIIIIIILjava/lang/Object;IIIZ)V",    (void*)nAllocationRead3D },
2744460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationGetType",             "(JJ)J",                                 (void*)nAllocationGetType},
2745460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationResize1D",            "(JJI)V",                                (void*)nAllocationResize1D },
2746460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnAllocationGenerateMipmaps",     "(JJ)V",                                 (void*)nAllocationGenerateMipmaps },
2747460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray
274846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{"rsnAllocationAdapterCreate",       "(JJJ)J",                                (void*)nAllocationAdapterCreate },
274946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams{"rsnAllocationAdapterOffset",       "(JJIIIIIIIII)V",                        (void*)nAllocationAdapterOffset },
275046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
2751460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptBindAllocation",          "(JJJI)V",                               (void*)nScriptBindAllocation },
2752460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetTimeZone",             "(JJ[B)V",                               (void*)nScriptSetTimeZone },
2753460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptInvoke",                  "(JJI)V",                                (void*)nScriptInvoke },
2754460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptInvokeV",                 "(JJI[B)V",                              (void*)nScriptInvokeV },
2755be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2756be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes{"rsnScriptForEach",                 "(JJI[JJ[B[I)V",                         (void*)nScriptForEach },
275736eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala{"rsnScriptReduce",                  "(JJIJJ[I)V",                            (void*)nScriptReduce },
2758be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
2759460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarI",                 "(JJII)V",                               (void*)nScriptSetVarI },
2760460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarI",                 "(JJI)I",                                (void*)nScriptGetVarI },
2761460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarJ",                 "(JJIJ)V",                               (void*)nScriptSetVarJ },
2762460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarJ",                 "(JJI)J",                                (void*)nScriptGetVarJ },
2763460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarF",                 "(JJIF)V",                               (void*)nScriptSetVarF },
2764460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarF",                 "(JJI)F",                                (void*)nScriptGetVarF },
2765460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarD",                 "(JJID)V",                               (void*)nScriptSetVarD },
2766460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarD",                 "(JJI)D",                                (void*)nScriptGetVarD },
2767460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarV",                 "(JJI[B)V",                              (void*)nScriptSetVarV },
2768460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGetVarV",                 "(JJI[B)V",                              (void*)nScriptGetVarV },
2769460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarVE",                "(JJI[BJ[I)V",                           (void*)nScriptSetVarVE },
2770460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptSetVarObj",               "(JJIJ)V",                               (void*)nScriptSetVarObj },
2771eff663f391fa4f119685d5c14489b94661ea126fTim Murray
27720e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnScriptCCreate",                 "(JLjava/lang/String;Ljava/lang/String;[BI)J",  (void*)nScriptCCreate },
2773460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptIntrinsicCreate",         "(JIJ)J",                                (void*)nScriptIntrinsicCreate },
2774460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptKernelIDCreate",          "(JJII)J",                               (void*)nScriptKernelIDCreate },
2775be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni{"rsnScriptInvokeIDCreate",          "(JJI)J",                                (void*)nScriptInvokeIDCreate },
2776460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptFieldIDCreate",           "(JJI)J",                                (void*)nScriptFieldIDCreate },
27779807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnScriptGroupCreate",             "(J[J[J[J[J[J)J",                        (void*)nScriptGroupCreate },
277835be56cce821d86f69026398ff9433e2d173b02fYang Ni{"rsnScriptGroup2Create",            "(JLjava/lang/String;Ljava/lang/String;[J)J", (void*)nScriptGroup2Create },
2779460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGroupSetInput",           "(JJJJ)V",                               (void*)nScriptGroupSetInput },
2780460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGroupSetOutput",          "(JJJJ)V",                               (void*)nScriptGroupSetOutput },
2781460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnScriptGroupExecute",            "(JJ)V",                                 (void*)nScriptGroupExecute },
2782281c3252510bcf4120d17fa0125f369c2c78f162Yang Ni{"rsnScriptGroup2Execute",           "(JJ)V",                                 (void*)nScriptGroup2Execute },
2783eff663f391fa4f119685d5c14489b94661ea126fTim Murray
278425207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Single",    "(JJIIIIIIIIIFJJFJIIII)V",               (void*)nScriptIntrinsicBLAS_Single },
278525207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Double",    "(JJIIIIIIIIIDJJDJIIII)V",               (void*)nScriptIntrinsicBLAS_Double },
278625207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Complex",   "(JJIIIIIIIIIFFJJFFJIIII)V",             (void*)nScriptIntrinsicBLAS_Complex },
278725207df658d6a8a3e885c7017fcc25702363583cTim Murray{"rsnScriptIntrinsicBLAS_Z",         "(JJIIIIIIIIIDDJJDDJIIII)V",             (void*)nScriptIntrinsicBLAS_Z },
278825207df658d6a8a3e885c7017fcc25702363583cTim Murray
27899cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray{"rsnScriptIntrinsicBLAS_BNNM",      "(JJIIIJIJIJII)V",                       (void*)nScriptIntrinsicBLAS_BNNM },
27909cb16a2f91c79845e5425fbf55f3b679fb18a4ddTim Murray
27910e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnProgramStoreCreate",            "(JZZZZZZIII)J",                         (void*)nProgramStoreCreate },
2792eff663f391fa4f119685d5c14489b94661ea126fTim Murray
2793460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramBindConstants",          "(JJIJ)V",                               (void*)nProgramBindConstants },
2794460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramBindTexture",            "(JJIJ)V",                               (void*)nProgramBindTexture },
2795460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramBindSampler",            "(JJIJ)V",                               (void*)nProgramBindSampler },
2796eff663f391fa4f119685d5c14489b94661ea126fTim Murray
27979807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnProgramFragmentCreate",         "(JLjava/lang/String;[Ljava/lang/String;[J)J",              (void*)nProgramFragmentCreate },
2798460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnProgramRasterCreate",           "(JZI)J",                                (void*)nProgramRasterCreate },
27999807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnProgramVertexCreate",           "(JLjava/lang/String;[Ljava/lang/String;[J)J",              (void*)nProgramVertexCreate },
2800eff663f391fa4f119685d5c14489b94661ea126fTim Murray
280178c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindRootScript",         "(JJ)V",                                 (void*)nContextBindRootScript },
280278c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramStore",       "(JJ)V",                                 (void*)nContextBindProgramStore },
280378c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramFragment",    "(JJ)V",                                 (void*)nContextBindProgramFragment },
280478c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramVertex",      "(JJ)V",                                 (void*)nContextBindProgramVertex },
280578c0ce56129d8109fa2427de769f4d25a971d162Narayan Kamath{"rsnContextBindProgramRaster",      "(JJ)V",                                 (void*)nContextBindProgramRaster },
2806eff663f391fa4f119685d5c14489b94661ea126fTim Murray
28070e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat{"rsnSamplerCreate",                 "(JIIIIIF)J",                            (void*)nSamplerCreate },
2808eff663f391fa4f119685d5c14489b94661ea126fTim Murray
28099807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnMeshCreate",                    "(J[J[J[I)J",                            (void*)nMeshCreate },
2810eff663f391fa4f119685d5c14489b94661ea126fTim Murray
2811460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnMeshGetVertexBufferCount",      "(JJ)I",                                 (void*)nMeshGetVertexBufferCount },
2812460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray{"rsnMeshGetIndexCount",             "(JJ)I",                                 (void*)nMeshGetIndexCount },
28139807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnMeshGetVertices",               "(JJ[JI)V",                              (void*)nMeshGetVertices },
28149807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat{"rsnMeshGetIndices",                "(JJ[J[II)V",                            (void*)nMeshGetIndices },
281580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
281656f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray{"rsnSystemGetPointerSize",          "()I",                                   (void*)nSystemGetPointerSize },
2817d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams};
2818d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2819d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsstatic int registerFuncs(JNIEnv *_env)
2820d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
2821d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return android::AndroidRuntime::registerNativeMethods(
2822d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            _env, classPathName, methods, NELEM(methods));
2823d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2824d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2825d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
2826d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2827d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsjint JNI_OnLoad(JavaVM* vm, void* reserved)
2828d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
2829488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    JNIEnv* env = nullptr;
2830d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    jint result = -1;
2831d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2832d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
28333762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: GetEnv failed\n");
2834d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        goto bail;
2835d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
2836488230c3fec4fc55abc2ee1de7b8b51a4e89f9a5Chris Wailes    assert(env != nullptr);
2837d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2838d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (registerFuncs(env) < 0) {
28390e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat        ALOGE("ERROR: Renderscript native registration failed\n");
2840d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        goto bail;
2841d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
2842d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2843d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    /* success -- return valid version number */
2844d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    result = JNI_VERSION_1_4;
2845d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2846d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsbail:
2847d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return result;
2848d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
2849