blob: 64d38d3a5d459d3af6496e39d0d4690c273e82b4 [file] [log] [blame]
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001/*
Stephen Hinesbe74bdd2012-02-03 15:29:36 -08002 * Copyright (C) 2008-2012 The Android Open Source Project
Jack Palevich60aa3ea2009-05-26 13:45:08 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Jason Sams94d8e90a2009-06-10 16:09:05 -070017package android.renderscript;
Jack Palevich60aa3ea2009-05-26 13:45:08 -070018
Artur Satayev2ebb31c2020-01-08 12:24:36 +000019import android.compat.annotation.UnsupportedAppUsage;
Shih-wei Liao6b32fab2010-12-10 01:03:59 -080020import android.content.Context;
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -080021import android.content.res.AssetManager;
Jason Samsb8c5a842009-07-31 20:40:47 -070022import android.graphics.Bitmap;
Jason Samsfaa32b32011-06-20 16:58:04 -070023import android.graphics.SurfaceTexture;
Dan Morrille4d9a012013-03-28 18:10:43 -070024import android.os.SystemProperties;
Tim Murray6d7a53c2013-05-23 16:59:23 -070025import android.os.Trace;
Miao Wang0facf022015-11-25 11:21:13 -080026import android.util.Log;
27import android.view.Surface;
Stephen Hines4382467a2011-08-01 15:02:34 -070028
Hans Boehmda3cee62019-02-11 11:01:03 -080029import java.io.File;
30import java.lang.reflect.Method;
31import java.nio.ByteBuffer;
32import java.util.ArrayList;
33import java.util.concurrent.locks.ReentrantReadWriteLock;
34
Matt Wala36eb1f72015-07-20 15:35:27 -070035// TODO: Clean up the whitespace that separates methods in this class.
36
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070037/**
Tim Murrayc11e25c2013-04-09 11:01:01 -070038 * This class provides access to a RenderScript context, which controls RenderScript
39 * initialization, resource management, and teardown. An instance of the RenderScript
40 * class must be created before any other RS objects can be created.
Jason Sams27676fe2010-11-10 17:00:59 -080041 *
Joe Fernandez3aef8e1d2011-12-20 10:38:34 -080042 * <div class="special reference">
43 * <h3>Developer Guides</h3>
Tim Murrayc11e25c2013-04-09 11:01:01 -070044 * <p>For more information about creating an application that uses RenderScript, read the
45 * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer guide.</p>
Joe Fernandez3aef8e1d2011-12-20 10:38:34 -080046 * </div>
Xusong Wang8b4548c2021-01-05 10:09:52 -080047 *
48 * @deprecated Renderscript has been deprecated in API level 31. Please refer to the <a
49 * href="https://developer.android.com/guide/topics/renderscript/migration-guide">migration
50 * guide</a> for the proposed alternatives.
Jason Samse29d4712009-07-23 15:19:03 -070051 **/
Xusong Wang8b4548c2021-01-05 10:09:52 -080052@Deprecated
Jack Palevich60aa3ea2009-05-26 13:45:08 -070053public class RenderScript {
Tim Murray6d7a53c2013-05-23 16:59:23 -070054 static final long TRACE_TAG = Trace.TRACE_TAG_RS;
55
Jason Sams3bc47d42009-11-12 15:10:25 -080056 static final String LOG_TAG = "RenderScript_jni";
Jason Samsbf6ef8d72010-12-06 15:59:59 -080057 static final boolean DEBUG = false;
Romain Guy650a3eb2009-08-31 14:06:43 -070058 @SuppressWarnings({"UnusedDeclaration", "deprecation"})
Joe Onorato43a17652011-04-06 19:22:23 -070059 static final boolean LOG_ENABLED = false;
Jack Palevich60aa3ea2009-05-26 13:45:08 -070060
Jason Samse16da122015-03-18 17:04:18 -070061 static private ArrayList<RenderScript> mProcessContextList = new ArrayList<RenderScript>();
62 private boolean mIsProcessContext = false;
63 private int mContextFlags = 0;
64 private int mContextSdkVersion = 0;
65
66
Shih-wei Liao6b32fab2010-12-10 01:03:59 -080067 private Context mApplicationContext;
Jack Palevich60aa3ea2009-05-26 13:45:08 -070068
Shih-wei Liao6b32fab2010-12-10 01:03:59 -080069 /*
Jack Palevich60aa3ea2009-05-26 13:45:08 -070070 * We use a class initializer to allow the native code to cache some
71 * field offsets.
72 */
Dan Morrille4d9a012013-03-28 18:10:43 -070073 @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"}) // TODO: now used locally; remove?
Jason Samsbf6ef8d72010-12-06 15:59:59 -080074 static boolean sInitialized;
75 native static void _nInit();
Jack Palevich60aa3ea2009-05-26 13:45:08 -070076
Tim Murray2f2472c2013-08-22 14:55:26 -070077 static Object sRuntime;
78 static Method registerNativeAllocation;
79 static Method registerNativeFree;
Jason Samsdba3ba52009-07-30 14:56:12 -070080
Jason Sams26e90512014-05-07 14:23:27 -070081 /*
Tim Murrayfd710e72014-06-06 11:10:45 -070082 * Context creation flag that specifies a normal context.
Jason Sams26e90512014-05-07 14:23:27 -070083 */
Tim Murrayfd710e72014-06-06 11:10:45 -070084 public static final int CREATE_FLAG_NONE = 0x0000;
Jason Sams26e90512014-05-07 14:23:27 -070085
86 /*
87 * Context creation flag which specifies a context optimized for low
88 * latency over peak performance. This is a hint and may have no effect
89 * on some implementations.
90 */
Tim Murrayfd710e72014-06-06 11:10:45 -070091 public static final int CREATE_FLAG_LOW_LATENCY = 0x0002;
Jason Sams26e90512014-05-07 14:23:27 -070092
93 /*
94 * Context creation flag which specifies a context optimized for long
95 * battery life over peak performance. This is a hint and may have no effect
96 * on some implementations.
97 */
Tim Murrayfd710e72014-06-06 11:10:45 -070098 public static final int CREATE_FLAG_LOW_POWER = 0x0004;
Jason Sams26e90512014-05-07 14:23:27 -070099
Stephen McGroarty62cb9bd2015-05-08 15:56:58 +0100100 /**
101 * @hide
102 * Context creation flag which instructs the implementation to wait for
103 * a debugger to be attached before continuing execution.
104 */
105 public static final int CREATE_FLAG_WAIT_FOR_ATTACH = 0x0008;
106
verena beckhamc9659ea2015-05-22 16:47:53 +0100107
Tim Murray56f9e6f2014-05-16 11:47:26 -0700108 /*
109 * Detect the bitness of the VM to allow FieldPacker to do the right thing.
110 */
111 static native int rsnSystemGetPointerSize();
Mathew Inwood15324472018-08-06 11:18:49 +0100112 @UnsupportedAppUsage
Tim Murray56f9e6f2014-05-16 11:47:26 -0700113 static int sPointerSize;
114
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700115 static {
116 sInitialized = false;
Dan Morrille4d9a012013-03-28 18:10:43 -0700117 if (!SystemProperties.getBoolean("config.disable_renderscript", false)) {
118 try {
Tim Murray2f2472c2013-08-22 14:55:26 -0700119 Class<?> vm_runtime = Class.forName("dalvik.system.VMRuntime");
120 Method get_runtime = vm_runtime.getDeclaredMethod("getRuntime");
121 sRuntime = get_runtime.invoke(null);
Hans Boehmda3cee62019-02-11 11:01:03 -0800122 registerNativeAllocation =
123 vm_runtime.getDeclaredMethod("registerNativeAllocation", Long.TYPE);
124 registerNativeFree = vm_runtime.getDeclaredMethod("registerNativeFree", Long.TYPE);
Tim Murray2f2472c2013-08-22 14:55:26 -0700125 } catch (Exception e) {
126 Log.e(LOG_TAG, "Error loading GC methods: " + e);
127 throw new RSRuntimeException("Error loading GC methods: " + e);
128 }
129 try {
Dan Morrille4d9a012013-03-28 18:10:43 -0700130 System.loadLibrary("rs_jni");
131 _nInit();
132 sInitialized = true;
Tim Murray56f9e6f2014-05-16 11:47:26 -0700133 sPointerSize = rsnSystemGetPointerSize();
Dan Morrille4d9a012013-03-28 18:10:43 -0700134 } catch (UnsatisfiedLinkError e) {
135 Log.e(LOG_TAG, "Error loading RS jni library: " + e);
136 throw new RSRuntimeException("Error loading RS jni library: " + e);
137 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700138 }
139 }
140
Jason Sams2e1872f2010-08-17 16:25:41 -0700141 // Non-threadsafe functions.
Tim Murrayeff663f2013-11-15 13:08:30 -0800142 native long nDeviceCreate();
143 native void nDeviceDestroy(long dev);
144 native void nDeviceSetConfig(long dev, int param, int value);
145 native int nContextGetUserMessage(long con, int[] data);
146 native String nContextGetErrorMessage(long con);
147 native int nContextPeekMessage(long con, int[] subID);
148 native void nContextInitToClient(long con);
149 native void nContextDeinitToClient(long con);
Jason Sams3eaa3382009-06-10 15:04:38 -0700150
Tim Murray67cc2d02014-02-06 16:39:38 -0800151 // this should be a monotonically increasing ID
152 // used in conjunction with the API version of a device
Jason Samsf7642302015-05-12 14:06:56 -0700153 static final long sMinorVersion = 1;
Tim Murray67cc2d02014-02-06 16:39:38 -0800154
155 /**
Miao Wangf9d518a2015-05-14 14:53:30 -0700156 * @hide
157 *
158 * Only exist to be compatible with old version RenderScript Support lib.
159 * Will eventually be removed.
160 *
161 * @return Always return 1
162 *
163 */
Mathew Inwood15324472018-08-06 11:18:49 +0100164 @UnsupportedAppUsage
Miao Wangf9d518a2015-05-14 14:53:30 -0700165 public static long getMinorID() {
166 return 1;
167 }
168
169
170 /**
Tim Murray67cc2d02014-02-06 16:39:38 -0800171 * Returns an identifier that can be used to identify a particular
172 * minor version of RS.
173 *
Jason Sams6a420b52015-03-30 15:31:26 -0700174 * @return The minor RenderScript version number
175 *
Tim Murray67cc2d02014-02-06 16:39:38 -0800176 */
Jason Samsf7642302015-05-12 14:06:56 -0700177 public static long getMinorVersion() {
178 return sMinorVersion;
Tim Murray67cc2d02014-02-06 16:39:38 -0800179 }
180
Jason Sams02d56d92013-04-12 16:40:50 -0700181 /**
182 * ContextType specifies the specific type of context to be created.
183 *
184 */
Jason Samsadd26dc2013-02-22 18:43:45 -0800185 public enum ContextType {
Jason Sams02d56d92013-04-12 16:40:50 -0700186 /**
187 * NORMAL context, this is the default and what shipping apps should
188 * use.
189 */
Jason Samsadd26dc2013-02-22 18:43:45 -0800190 NORMAL (0),
Jason Sams02d56d92013-04-12 16:40:50 -0700191
192 /**
193 * DEBUG context, perform extra runtime checks to validate the
194 * kernels and APIs are being used as intended. Get and SetElementAt
195 * will be bounds checked in this mode.
196 */
Jason Samsadd26dc2013-02-22 18:43:45 -0800197 DEBUG (1),
Jason Sams02d56d92013-04-12 16:40:50 -0700198
199 /**
200 * PROFILE context, Intended to be used once the first time an
201 * application is run on a new device. This mode allows the runtime to
202 * do additional testing and performance tuning.
203 */
Jason Samsadd26dc2013-02-22 18:43:45 -0800204 PROFILE (2);
205
206 int mID;
207 ContextType(int id) {
208 mID = id;
209 }
210 }
Jason Sams718cd1f2009-12-23 14:35:29 -0800211
Stephen Hines42028a82013-04-17 19:22:01 -0700212 ContextType mContextType;
Tim Murray06b45672014-01-07 11:13:56 -0800213 ReentrantReadWriteLock mRWLock;
Stephen Hines42028a82013-04-17 19:22:01 -0700214
Jason Sams2e1872f2010-08-17 16:25:41 -0700215 // Methods below are wrapped to protect the non-threadsafe
216 // lockless fifo.
Tim Murrayeff663f2013-11-15 13:08:30 -0800217 native long rsnContextCreateGL(long dev, int ver, int sdkVer,
Jason Sams11c8af92010-10-13 15:31:10 -0700218 int colorMin, int colorPref,
219 int alphaMin, int alphaPref,
220 int depthMin, int depthPref,
221 int stencilMin, int stencilPref,
Alex Sakhartchouk2c74ad92011-03-16 19:28:25 -0700222 int samplesMin, int samplesPref, float samplesQ, int dpi);
Tim Murrayeff663f2013-11-15 13:08:30 -0800223 synchronized long nContextCreateGL(long dev, int ver, int sdkVer,
Jason Sams11c8af92010-10-13 15:31:10 -0700224 int colorMin, int colorPref,
225 int alphaMin, int alphaPref,
226 int depthMin, int depthPref,
227 int stencilMin, int stencilPref,
Alex Sakhartchouk2c74ad92011-03-16 19:28:25 -0700228 int samplesMin, int samplesPref, float samplesQ, int dpi) {
Stephen Hines4382467a2011-08-01 15:02:34 -0700229 return rsnContextCreateGL(dev, ver, sdkVer, colorMin, colorPref,
Jason Sams11c8af92010-10-13 15:31:10 -0700230 alphaMin, alphaPref, depthMin, depthPref,
231 stencilMin, stencilPref,
Alex Sakhartchouk2c74ad92011-03-16 19:28:25 -0700232 samplesMin, samplesPref, samplesQ, dpi);
Jason Sams2e1872f2010-08-17 16:25:41 -0700233 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800234 native long rsnContextCreate(long dev, int ver, int sdkVer, int contextType);
235 synchronized long nContextCreate(long dev, int ver, int sdkVer, int contextType) {
Jason Samsadd26dc2013-02-22 18:43:45 -0800236 return rsnContextCreate(dev, ver, sdkVer, contextType);
Jason Sams2e1872f2010-08-17 16:25:41 -0700237 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800238 native void rsnContextDestroy(long con);
Jason Sams2e1872f2010-08-17 16:25:41 -0700239 synchronized void nContextDestroy() {
Jason Samsd1ac9812011-01-18 18:12:26 -0800240 validate();
Tim Murray06b45672014-01-07 11:13:56 -0800241
242 // take teardown lock
243 // teardown lock can only be taken when no objects are being destroyed
244 ReentrantReadWriteLock.WriteLock wlock = mRWLock.writeLock();
245 wlock.lock();
246
247 long curCon = mContext;
248 // context is considered dead as of this point
249 mContext = 0;
250
251 wlock.unlock();
252 rsnContextDestroy(curCon);
Jason Sams2e1872f2010-08-17 16:25:41 -0700253 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800254 native void rsnContextSetSurface(long con, int w, int h, Surface sur);
Jason Sams2e1872f2010-08-17 16:25:41 -0700255 synchronized void nContextSetSurface(int w, int h, Surface sur) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800256 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700257 rsnContextSetSurface(mContext, w, h, sur);
258 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800259 native void rsnContextSetSurfaceTexture(long con, int w, int h, SurfaceTexture sur);
Jason Samsfaa32b32011-06-20 16:58:04 -0700260 synchronized void nContextSetSurfaceTexture(int w, int h, SurfaceTexture sur) {
261 validate();
262 rsnContextSetSurfaceTexture(mContext, w, h, sur);
263 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800264 native void rsnContextSetPriority(long con, int p);
Jason Sams2e1872f2010-08-17 16:25:41 -0700265 synchronized void nContextSetPriority(int p) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800266 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700267 rsnContextSetPriority(mContext, p);
268 }
Tim Murray47f31582015-04-07 15:43:24 -0700269 native void rsnContextSetCacheDir(long con, String cacheDir);
270 synchronized void nContextSetCacheDir(String cacheDir) {
271 validate();
272 rsnContextSetCacheDir(mContext, cacheDir);
273 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800274 native void rsnContextDump(long con, int bits);
Jason Sams2e1872f2010-08-17 16:25:41 -0700275 synchronized void nContextDump(int bits) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800276 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700277 rsnContextDump(mContext, bits);
278 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800279 native void rsnContextFinish(long con);
Jason Sams2e1872f2010-08-17 16:25:41 -0700280 synchronized void nContextFinish() {
Jason Samsd1ac9812011-01-18 18:12:26 -0800281 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700282 rsnContextFinish(mContext);
283 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700284
Tim Murrayeff663f2013-11-15 13:08:30 -0800285 native void rsnContextSendMessage(long con, int id, int[] data);
Jason Sams455d6442013-02-05 19:20:18 -0800286 synchronized void nContextSendMessage(int id, int[] data) {
287 validate();
288 rsnContextSendMessage(mContext, id, data);
289 }
290
Narayan Kamath78c0ce52014-03-19 10:15:51 +0000291 native void rsnContextBindRootScript(long con, long script);
292 synchronized void nContextBindRootScript(long script) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800293 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700294 rsnContextBindRootScript(mContext, script);
295 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800296 native void rsnContextBindSampler(long con, int sampler, int slot);
Jason Sams2e1872f2010-08-17 16:25:41 -0700297 synchronized void nContextBindSampler(int sampler, int slot) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800298 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700299 rsnContextBindSampler(mContext, sampler, slot);
300 }
Narayan Kamath78c0ce52014-03-19 10:15:51 +0000301 native void rsnContextBindProgramStore(long con, long pfs);
302 synchronized void nContextBindProgramStore(long pfs) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800303 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700304 rsnContextBindProgramStore(mContext, pfs);
305 }
Narayan Kamath78c0ce52014-03-19 10:15:51 +0000306 native void rsnContextBindProgramFragment(long con, long pf);
307 synchronized void nContextBindProgramFragment(long pf) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800308 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700309 rsnContextBindProgramFragment(mContext, pf);
310 }
Narayan Kamath78c0ce52014-03-19 10:15:51 +0000311 native void rsnContextBindProgramVertex(long con, long pv);
312 synchronized void nContextBindProgramVertex(long pv) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800313 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700314 rsnContextBindProgramVertex(mContext, pv);
315 }
Narayan Kamath78c0ce52014-03-19 10:15:51 +0000316 native void rsnContextBindProgramRaster(long con, long pr);
317 synchronized void nContextBindProgramRaster(long pr) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800318 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700319 rsnContextBindProgramRaster(mContext, pr);
320 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800321 native void rsnContextPause(long con);
Jason Sams2e1872f2010-08-17 16:25:41 -0700322 synchronized void nContextPause() {
Jason Samsd1ac9812011-01-18 18:12:26 -0800323 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700324 rsnContextPause(mContext);
325 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800326 native void rsnContextResume(long con);
Jason Sams2e1872f2010-08-17 16:25:41 -0700327 synchronized void nContextResume() {
Jason Samsd1ac9812011-01-18 18:12:26 -0800328 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700329 rsnContextResume(mContext);
330 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700331
Yang Ni281c3252014-10-24 08:52:24 -0700332 native long rsnClosureCreate(long con, long kernelID, long returnValue,
333 long[] fieldIDs, long[] values, int[] sizes, long[] depClosures,
334 long[] depFieldIDs);
335 synchronized long nClosureCreate(long kernelID, long returnValue,
336 long[] fieldIDs, long[] values, int[] sizes, long[] depClosures,
337 long[] depFieldIDs) {
338 validate();
Yang Ni17c2d7a2015-04-30 16:13:54 -0700339 long c = rsnClosureCreate(mContext, kernelID, returnValue, fieldIDs, values,
Yang Ni281c3252014-10-24 08:52:24 -0700340 sizes, depClosures, depFieldIDs);
Yang Ni17c2d7a2015-04-30 16:13:54 -0700341 if (c == 0) {
342 throw new RSRuntimeException("Failed creating closure.");
343 }
344 return c;
Yang Ni281c3252014-10-24 08:52:24 -0700345 }
346
Yang Nibe392ad2015-01-23 17:16:02 -0800347 native long rsnInvokeClosureCreate(long con, long invokeID, byte[] params,
348 long[] fieldIDs, long[] values, int[] sizes);
349 synchronized long nInvokeClosureCreate(long invokeID, byte[] params,
350 long[] fieldIDs, long[] values, int[] sizes) {
351 validate();
Yang Ni17c2d7a2015-04-30 16:13:54 -0700352 long c = rsnInvokeClosureCreate(mContext, invokeID, params, fieldIDs,
Yang Nibe392ad2015-01-23 17:16:02 -0800353 values, sizes);
Yang Ni17c2d7a2015-04-30 16:13:54 -0700354 if (c == 0) {
355 throw new RSRuntimeException("Failed creating closure.");
356 }
357 return c;
Yang Nibe392ad2015-01-23 17:16:02 -0800358 }
359
Yang Ni281c3252014-10-24 08:52:24 -0700360 native void rsnClosureSetArg(long con, long closureID, int index,
361 long value, int size);
362 synchronized void nClosureSetArg(long closureID, int index, long value,
363 int size) {
364 validate();
365 rsnClosureSetArg(mContext, closureID, index, value, size);
366 }
367
368 native void rsnClosureSetGlobal(long con, long closureID, long fieldID,
369 long value, int size);
370 // Does this have to be synchronized?
371 synchronized void nClosureSetGlobal(long closureID, long fieldID,
372 long value, int size) {
373 validate(); // TODO: is this necessary?
374 rsnClosureSetGlobal(mContext, closureID, fieldID, value, size);
375 }
376
Yang Ni35be56c2015-04-02 17:47:56 -0700377 native long rsnScriptGroup2Create(long con, String name, String cachePath,
378 long[] closures);
379 synchronized long nScriptGroup2Create(String name, String cachePath,
380 long[] closures) {
Yang Ni281c3252014-10-24 08:52:24 -0700381 validate();
Yang Ni17c2d7a2015-04-30 16:13:54 -0700382 long g = rsnScriptGroup2Create(mContext, name, cachePath, closures);
383 if (g == 0) {
384 throw new RSRuntimeException("Failed creating script group.");
385 }
386 return g;
Yang Ni281c3252014-10-24 08:52:24 -0700387 }
388
389 native void rsnScriptGroup2Execute(long con, long groupID);
390 synchronized void nScriptGroup2Execute(long groupID) {
391 validate();
392 rsnScriptGroup2Execute(mContext, groupID);
393 }
394
Tim Murray460a0492013-11-19 12:45:54 -0800395 native void rsnAssignName(long con, long obj, byte[] name);
396 synchronized void nAssignName(long obj, byte[] name) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800397 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700398 rsnAssignName(mContext, obj, name);
399 }
Tim Murray460a0492013-11-19 12:45:54 -0800400 native String rsnGetName(long con, long obj);
401 synchronized String nGetName(long obj) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800402 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700403 return rsnGetName(mContext, obj);
404 }
Tim Murray06b45672014-01-07 11:13:56 -0800405
406 // nObjDestroy is explicitly _not_ synchronous to prevent crashes in finalizers
Tim Murray460a0492013-11-19 12:45:54 -0800407 native void rsnObjDestroy(long con, long id);
Tim Murray06b45672014-01-07 11:13:56 -0800408 void nObjDestroy(long id) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800409 // There is a race condition here. The calling code may be run
410 // by the gc while teardown is occuring. This protects againts
411 // deleting dead objects.
412 if (mContext != 0) {
413 rsnObjDestroy(mContext, id);
414 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700415 }
Jason Samsfe08d992009-05-27 14:45:32 -0700416
Tim Murray460a0492013-11-19 12:45:54 -0800417 native long rsnElementCreate(long con, long type, int kind, boolean norm, int vecSize);
418 synchronized long nElementCreate(long type, int kind, boolean norm, int vecSize) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800419 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700420 return rsnElementCreate(mContext, type, kind, norm, vecSize);
421 }
Ashok Bhat98071552014-02-12 09:54:43 +0000422 native long rsnElementCreate2(long con, long[] elements, String[] names, int[] arraySizes);
423 synchronized long nElementCreate2(long[] elements, String[] names, int[] arraySizes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800424 validate();
Jason Sams70d4e502010-09-02 17:35:23 -0700425 return rsnElementCreate2(mContext, elements, names, arraySizes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700426 }
Tim Murray460a0492013-11-19 12:45:54 -0800427 native void rsnElementGetNativeData(long con, long id, int[] elementData);
428 synchronized void nElementGetNativeData(long id, int[] elementData) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800429 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700430 rsnElementGetNativeData(mContext, id, elementData);
431 }
Tim Murray460a0492013-11-19 12:45:54 -0800432 native void rsnElementGetSubElements(long con, long id,
Ashok Bhat98071552014-02-12 09:54:43 +0000433 long[] IDs, String[] names, int[] arraySizes);
434 synchronized void nElementGetSubElements(long id, long[] IDs, String[] names, int[] arraySizes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800435 validate();
Alex Sakhartchouk7d5f5e72011-10-18 11:08:31 -0700436 rsnElementGetSubElements(mContext, id, IDs, names, arraySizes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700437 }
Jason Sams768bc022009-09-21 19:41:04 -0700438
Tim Murray460a0492013-11-19 12:45:54 -0800439 native long rsnTypeCreate(long con, long eid, int x, int y, int z, boolean mips, boolean faces, int yuv);
440 synchronized long nTypeCreate(long eid, int x, int y, int z, boolean mips, boolean faces, int yuv) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800441 validate();
Jason Samsb109cc72013-01-07 18:20:12 -0800442 return rsnTypeCreate(mContext, eid, x, y, z, mips, faces, yuv);
Jason Sams2e1872f2010-08-17 16:25:41 -0700443 }
Ashok Bhat98071552014-02-12 09:54:43 +0000444 native void rsnTypeGetNativeData(long con, long id, long[] typeData);
445 synchronized void nTypeGetNativeData(long id, long[] typeData) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800446 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700447 rsnTypeGetNativeData(mContext, id, typeData);
448 }
Jason Sams768bc022009-09-21 19:41:04 -0700449
Ashok Bhat98071552014-02-12 09:54:43 +0000450 native long rsnAllocationCreateTyped(long con, long type, int mip, int usage, long pointer);
451 synchronized long nAllocationCreateTyped(long type, int mip, int usage, long pointer) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800452 validate();
Jason Sams857d0c72011-11-23 15:02:15 -0800453 return rsnAllocationCreateTyped(mContext, type, mip, usage, pointer);
Jason Sams2e1872f2010-08-17 16:25:41 -0700454 }
Derek Sollenbergerdb98b522019-12-27 15:10:50 -0500455
456 native long rsnAllocationCreateFromBitmap(long con, long type, int mip, Bitmap bmp,
Leon Scroggins III71fae622019-03-26 16:28:41 -0400457 int usage);
Tim Murray460a0492013-11-19 12:45:54 -0800458 synchronized long nAllocationCreateFromBitmap(long type, int mip, Bitmap bmp, int usage) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800459 validate();
Derek Sollenbergerdb98b522019-12-27 15:10:50 -0500460 return rsnAllocationCreateFromBitmap(mContext, type, mip, bmp, usage);
Alex Sakhartchouk26ae3902010-10-11 12:35:15 -0700461 }
Tim Murraya3145512012-12-04 17:59:29 -0800462
Derek Sollenbergerdb98b522019-12-27 15:10:50 -0500463 native long rsnAllocationCreateBitmapBackedAllocation(long con, long type, int mip, Bitmap bmp,
Leon Scroggins III71fae622019-03-26 16:28:41 -0400464 int usage);
465 synchronized long nAllocationCreateBitmapBackedAllocation(long type, int mip, Bitmap bmp,
466 int usage) {
Tim Murraya3145512012-12-04 17:59:29 -0800467 validate();
Derek Sollenbergerdb98b522019-12-27 15:10:50 -0500468 return rsnAllocationCreateBitmapBackedAllocation(mContext, type, mip, bmp, usage);
Tim Murraya3145512012-12-04 17:59:29 -0800469 }
470
Derek Sollenbergerdb98b522019-12-27 15:10:50 -0500471 native long rsnAllocationCubeCreateFromBitmap(long con, long type, int mip, Bitmap bmp,
Leon Scroggins III71fae622019-03-26 16:28:41 -0400472 int usage);
Tim Murray460a0492013-11-19 12:45:54 -0800473 synchronized long nAllocationCubeCreateFromBitmap(long type, int mip, Bitmap bmp, int usage) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800474 validate();
Derek Sollenbergerdb98b522019-12-27 15:10:50 -0500475 return rsnAllocationCubeCreateFromBitmap(mContext, type, mip, bmp, usage);
Jason Sams5476b452010-12-08 16:14:36 -0800476 }
477
Derek Sollenbergerdb98b522019-12-27 15:10:50 -0500478 native void rsnAllocationCopyToBitmap(long con, long alloc, Bitmap bmp);
Tim Murray460a0492013-11-19 12:45:54 -0800479 synchronized void nAllocationCopyToBitmap(long alloc, Bitmap bmp) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800480 validate();
Derek Sollenbergerdb98b522019-12-27 15:10:50 -0500481 rsnAllocationCopyToBitmap(mContext, alloc, bmp);
Jason Sams4ef66502010-12-10 16:03:15 -0800482 }
483
Tim Murray460a0492013-11-19 12:45:54 -0800484 native void rsnAllocationSyncAll(long con, long alloc, int src);
485 synchronized void nAllocationSyncAll(long alloc, int src) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800486 validate();
Jason Sams5476b452010-12-08 16:14:36 -0800487 rsnAllocationSyncAll(mContext, alloc, src);
488 }
Miao Wang0facf022015-11-25 11:21:13 -0800489
Leon Scroggins III71fae622019-03-26 16:28:41 -0400490 native ByteBuffer rsnAllocationGetByteBuffer(long con, long alloc, long[] stride,
491 int xBytesSize, int dimY, int dimZ);
492 synchronized ByteBuffer nAllocationGetByteBuffer(long alloc, long[] stride, int xBytesSize,
493 int dimY, int dimZ) {
Miao Wang0facf022015-11-25 11:21:13 -0800494 validate();
495 return rsnAllocationGetByteBuffer(mContext, alloc, stride, xBytesSize, dimY, dimZ);
496 }
497
Miao Wang8c150922015-10-26 17:44:10 -0700498 native void rsnAllocationSetupBufferQueue(long con, long alloc, int numAlloc);
499 synchronized void nAllocationSetupBufferQueue(long alloc, int numAlloc) {
500 validate();
501 rsnAllocationSetupBufferQueue(mContext, alloc, numAlloc);
502 }
503 native void rsnAllocationShareBufferQueue(long con, long alloc1, long alloc2);
504 synchronized void nAllocationShareBufferQueue(long alloc1, long alloc2) {
505 validate();
506 rsnAllocationShareBufferQueue(mContext, alloc1, alloc2);
507 }
Tim Murray460a0492013-11-19 12:45:54 -0800508 native Surface rsnAllocationGetSurface(long con, long alloc);
509 synchronized Surface nAllocationGetSurface(long alloc) {
Jason Sams615e7ce2012-01-13 14:01:20 -0800510 validate();
Jason Sams72226e02013-02-22 12:45:54 -0800511 return rsnAllocationGetSurface(mContext, alloc);
Jason Samsfe1d5ff2012-03-23 11:47:26 -0700512 }
Tim Murray460a0492013-11-19 12:45:54 -0800513 native void rsnAllocationSetSurface(long con, long alloc, Surface sur);
514 synchronized void nAllocationSetSurface(long alloc, Surface sur) {
Jason Sams163766c2012-02-15 12:04:24 -0800515 validate();
Jason Samsfb9aa9f2012-03-28 15:30:07 -0700516 rsnAllocationSetSurface(mContext, alloc, sur);
Jason Sams163766c2012-02-15 12:04:24 -0800517 }
Tim Murray460a0492013-11-19 12:45:54 -0800518 native void rsnAllocationIoSend(long con, long alloc);
519 synchronized void nAllocationIoSend(long alloc) {
Jason Sams163766c2012-02-15 12:04:24 -0800520 validate();
521 rsnAllocationIoSend(mContext, alloc);
522 }
Miao Wang8c150922015-10-26 17:44:10 -0700523 native long rsnAllocationIoReceive(long con, long alloc);
524 synchronized long nAllocationIoReceive(long alloc) {
Jason Sams163766c2012-02-15 12:04:24 -0800525 validate();
Miao Wang8c150922015-10-26 17:44:10 -0700526 return rsnAllocationIoReceive(mContext, alloc);
Jason Sams163766c2012-02-15 12:04:24 -0800527 }
528
Tim Murray460a0492013-11-19 12:45:54 -0800529 native void rsnAllocationGenerateMipmaps(long con, long alloc);
530 synchronized void nAllocationGenerateMipmaps(long alloc) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800531 validate();
Jason Samsf7086092011-01-12 13:28:37 -0800532 rsnAllocationGenerateMipmaps(mContext, alloc);
533 }
Derek Sollenbergerdb98b522019-12-27 15:10:50 -0500534 native void rsnAllocationCopyFromBitmap(long con, long alloc, Bitmap bmp);
Tim Murray460a0492013-11-19 12:45:54 -0800535 synchronized void nAllocationCopyFromBitmap(long alloc, Bitmap bmp) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800536 validate();
Derek Sollenbergerdb98b522019-12-27 15:10:50 -0500537 rsnAllocationCopyFromBitmap(mContext, alloc, bmp);
Jason Sams2e1872f2010-08-17 16:25:41 -0700538 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700539
Jason Sams49a05d72010-12-29 14:31:29 -0800540
Miao Wang87e908d2015-03-02 15:15:15 -0800541 native void rsnAllocationData1D(long con, long id, int off, int mip, int count, Object d, int sizeBytes, int dt,
542 int mSize, boolean usePadding);
543 synchronized void nAllocationData1D(long id, int off, int mip, int count, Object d, int sizeBytes, Element.DataType dt,
544 int mSize, boolean usePadding) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800545 validate();
Miao Wang87e908d2015-03-02 15:15:15 -0800546 rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes, dt.mID, mSize, usePadding);
Jason Sams2e1872f2010-08-17 16:25:41 -0700547 }
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -0700548
Miao Wangc8e237e2015-02-20 18:36:32 -0800549 native void rsnAllocationElementData(long con,long id, int xoff, int yoff, int zoff, int mip, int compIdx, byte[] d, int sizeBytes);
550 synchronized void nAllocationElementData(long id, int xoff, int yoff, int zoff, int mip, int compIdx, byte[] d, int sizeBytes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800551 validate();
Miao Wangc8e237e2015-02-20 18:36:32 -0800552 rsnAllocationElementData(mContext, id, xoff, yoff, zoff, mip, compIdx, d, sizeBytes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700553 }
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700554
Tim Murrayeff663f2013-11-15 13:08:30 -0800555 native void rsnAllocationData2D(long con,
Tim Murray460a0492013-11-19 12:45:54 -0800556 long dstAlloc, int dstXoff, int dstYoff,
Alex Sakhartchouk304b1f52011-06-14 11:13:19 -0700557 int dstMip, int dstFace,
558 int width, int height,
Tim Murray460a0492013-11-19 12:45:54 -0800559 long srcAlloc, int srcXoff, int srcYoff,
Alex Sakhartchouk304b1f52011-06-14 11:13:19 -0700560 int srcMip, int srcFace);
Tim Murray460a0492013-11-19 12:45:54 -0800561 synchronized void nAllocationData2D(long dstAlloc, int dstXoff, int dstYoff,
Alex Sakhartchouk304b1f52011-06-14 11:13:19 -0700562 int dstMip, int dstFace,
563 int width, int height,
Tim Murray460a0492013-11-19 12:45:54 -0800564 long srcAlloc, int srcXoff, int srcYoff,
Alex Sakhartchouk304b1f52011-06-14 11:13:19 -0700565 int srcMip, int srcFace) {
566 validate();
567 rsnAllocationData2D(mContext,
568 dstAlloc, dstXoff, dstYoff,
569 dstMip, dstFace,
570 width, height,
571 srcAlloc, srcXoff, srcYoff,
572 srcMip, srcFace);
573 }
574
Tim Murray460a0492013-11-19 12:45:54 -0800575 native void rsnAllocationData2D(long con, long id, int xoff, int yoff, int mip, int face,
Miao Wang87e908d2015-03-02 15:15:15 -0800576 int w, int h, Object d, int sizeBytes, int dt,
577 int mSize, boolean usePadding);
Tim Murray460a0492013-11-19 12:45:54 -0800578 synchronized void nAllocationData2D(long id, int xoff, int yoff, int mip, int face,
Miao Wang87e908d2015-03-02 15:15:15 -0800579 int w, int h, Object d, int sizeBytes, Element.DataType dt,
580 int mSize, boolean usePadding) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800581 validate();
Miao Wang87e908d2015-03-02 15:15:15 -0800582 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes, dt.mID, mSize, usePadding);
Jason Sams2e1872f2010-08-17 16:25:41 -0700583 }
Jason Sams21659ac2013-11-06 15:08:07 -0800584
Tim Murray460a0492013-11-19 12:45:54 -0800585 native void rsnAllocationData2D(long con, long id, int xoff, int yoff, int mip, int face, Bitmap b);
586 synchronized void nAllocationData2D(long id, int xoff, int yoff, int mip, int face, Bitmap b) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800587 validate();
Jason Samsfa445b92011-01-07 17:00:07 -0800588 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, b);
589 }
Jason Sams49a05d72010-12-29 14:31:29 -0800590
Tim Murrayeff663f2013-11-15 13:08:30 -0800591 native void rsnAllocationData3D(long con,
Tim Murray460a0492013-11-19 12:45:54 -0800592 long dstAlloc, int dstXoff, int dstYoff, int dstZoff,
Jason Samsb05d6892013-04-09 15:59:24 -0700593 int dstMip,
594 int width, int height, int depth,
Tim Murray460a0492013-11-19 12:45:54 -0800595 long srcAlloc, int srcXoff, int srcYoff, int srcZoff,
Jason Samsb05d6892013-04-09 15:59:24 -0700596 int srcMip);
Tim Murray460a0492013-11-19 12:45:54 -0800597 synchronized void nAllocationData3D(long dstAlloc, int dstXoff, int dstYoff, int dstZoff,
Jason Samsb05d6892013-04-09 15:59:24 -0700598 int dstMip,
599 int width, int height, int depth,
Tim Murray460a0492013-11-19 12:45:54 -0800600 long srcAlloc, int srcXoff, int srcYoff, int srcZoff,
Jason Samsb05d6892013-04-09 15:59:24 -0700601 int srcMip) {
602 validate();
603 rsnAllocationData3D(mContext,
604 dstAlloc, dstXoff, dstYoff, dstZoff,
605 dstMip, width, height, depth,
606 srcAlloc, srcXoff, srcYoff, srcZoff, srcMip);
607 }
608
Tim Murray460a0492013-11-19 12:45:54 -0800609 native void rsnAllocationData3D(long con, long id, int xoff, int yoff, int zoff, int mip,
Miao Wang87e908d2015-03-02 15:15:15 -0800610 int w, int h, int depth, Object d, int sizeBytes, int dt,
611 int mSize, boolean usePadding);
Tim Murray460a0492013-11-19 12:45:54 -0800612 synchronized void nAllocationData3D(long id, int xoff, int yoff, int zoff, int mip,
Miao Wang87e908d2015-03-02 15:15:15 -0800613 int w, int h, int depth, Object d, int sizeBytes, Element.DataType dt,
614 int mSize, boolean usePadding) {
Jason Samsb05d6892013-04-09 15:59:24 -0700615 validate();
Miao Wang87e908d2015-03-02 15:15:15 -0800616 rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes,
617 dt.mID, mSize, usePadding);
Jason Samsb05d6892013-04-09 15:59:24 -0700618 }
Jason Samsb05d6892013-04-09 15:59:24 -0700619
Miao Wang87e908d2015-03-02 15:15:15 -0800620 native void rsnAllocationRead(long con, long id, Object d, int dt, int mSize, boolean usePadding);
621 synchronized void nAllocationRead(long id, Object d, Element.DataType dt, int mSize, boolean usePadding) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800622 validate();
Miao Wang87e908d2015-03-02 15:15:15 -0800623 rsnAllocationRead(mContext, id, d, dt.mID, mSize, usePadding);
Jason Samsfa445b92011-01-07 17:00:07 -0800624 }
Jason Sams21659ac2013-11-06 15:08:07 -0800625
Tim Murray460a0492013-11-19 12:45:54 -0800626 native void rsnAllocationRead1D(long con, long id, int off, int mip, int count, Object d,
Miao Wang87e908d2015-03-02 15:15:15 -0800627 int sizeBytes, int dt, int mSize, boolean usePadding);
Tim Murray460a0492013-11-19 12:45:54 -0800628 synchronized void nAllocationRead1D(long id, int off, int mip, int count, Object d,
Miao Wang87e908d2015-03-02 15:15:15 -0800629 int sizeBytes, Element.DataType dt, int mSize, boolean usePadding) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800630 validate();
Miao Wang87e908d2015-03-02 15:15:15 -0800631 rsnAllocationRead1D(mContext, id, off, mip, count, d, sizeBytes, dt.mID, mSize, usePadding);
Jason Samsfa445b92011-01-07 17:00:07 -0800632 }
Jason Sams21659ac2013-11-06 15:08:07 -0800633
Miao Wangc8e237e2015-02-20 18:36:32 -0800634 native void rsnAllocationElementRead(long con,long id, int xoff, int yoff, int zoff,
Miao Wang45cec0a2015-03-04 16:40:21 -0800635 int mip, int compIdx, byte[] d, int sizeBytes);
Miao Wangc8e237e2015-02-20 18:36:32 -0800636 synchronized void nAllocationElementRead(long id, int xoff, int yoff, int zoff,
Miao Wang45cec0a2015-03-04 16:40:21 -0800637 int mip, int compIdx, byte[] d, int sizeBytes) {
Miao Wangc8e237e2015-02-20 18:36:32 -0800638 validate();
Miao Wang45cec0a2015-03-04 16:40:21 -0800639 rsnAllocationElementRead(mContext, id, xoff, yoff, zoff, mip, compIdx, d, sizeBytes);
Miao Wangc8e237e2015-02-20 18:36:32 -0800640 }
641
Tim Murray460a0492013-11-19 12:45:54 -0800642 native void rsnAllocationRead2D(long con, long id, int xoff, int yoff, int mip, int face,
Miao Wang87e908d2015-03-02 15:15:15 -0800643 int w, int h, Object d, int sizeBytes, int dt,
644 int mSize, boolean usePadding);
Tim Murray460a0492013-11-19 12:45:54 -0800645 synchronized void nAllocationRead2D(long id, int xoff, int yoff, int mip, int face,
Miao Wang87e908d2015-03-02 15:15:15 -0800646 int w, int h, Object d, int sizeBytes, Element.DataType dt,
647 int mSize, boolean usePadding) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800648 validate();
Miao Wang87e908d2015-03-02 15:15:15 -0800649 rsnAllocationRead2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes, dt.mID, mSize, usePadding);
Jason Sams2e1872f2010-08-17 16:25:41 -0700650 }
Jason Sams21659ac2013-11-06 15:08:07 -0800651
Miao Wangc8e237e2015-02-20 18:36:32 -0800652 native void rsnAllocationRead3D(long con, long id, int xoff, int yoff, int zoff, int mip,
Miao Wang87e908d2015-03-02 15:15:15 -0800653 int w, int h, int depth, Object d, int sizeBytes, int dt,
654 int mSize, boolean usePadding);
Miao Wangc8e237e2015-02-20 18:36:32 -0800655 synchronized void nAllocationRead3D(long id, int xoff, int yoff, int zoff, int mip,
Miao Wang87e908d2015-03-02 15:15:15 -0800656 int w, int h, int depth, Object d, int sizeBytes, Element.DataType dt,
657 int mSize, boolean usePadding) {
Miao Wangc8e237e2015-02-20 18:36:32 -0800658 validate();
Miao Wang87e908d2015-03-02 15:15:15 -0800659 rsnAllocationRead3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes, dt.mID, mSize, usePadding);
Miao Wangc8e237e2015-02-20 18:36:32 -0800660 }
661
Tim Murray460a0492013-11-19 12:45:54 -0800662 native long rsnAllocationGetType(long con, long id);
663 synchronized long nAllocationGetType(long id) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800664 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700665 return rsnAllocationGetType(mContext, id);
666 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700667
Tim Murray460a0492013-11-19 12:45:54 -0800668 native void rsnAllocationResize1D(long con, long id, int dimX);
669 synchronized void nAllocationResize1D(long id, int dimX) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800670 validate();
Jason Sams5edc6082010-10-05 13:32:49 -0700671 rsnAllocationResize1D(mContext, id, dimX);
672 }
Jason Sams5edc6082010-10-05 13:32:49 -0700673
Jason Sams46ba27e32015-02-06 17:45:15 -0800674 native long rsnAllocationAdapterCreate(long con, long allocId, long typeId);
675 synchronized long nAllocationAdapterCreate(long allocId, long typeId) {
676 validate();
677 return rsnAllocationAdapterCreate(mContext, allocId, typeId);
678 }
679
680 native void rsnAllocationAdapterOffset(long con, long id, int x, int y, int z,
681 int mip, int face, int a1, int a2, int a3, int a4);
682 synchronized void nAllocationAdapterOffset(long id, int x, int y, int z,
683 int mip, int face, int a1, int a2, int a3, int a4) {
684 validate();
685 rsnAllocationAdapterOffset(mContext, id, x, y, z, mip, face, a1, a2, a3, a4);
686 }
687
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000688 native long rsnFileA3DCreateFromAssetStream(long con, long assetStream);
689 synchronized long nFileA3DCreateFromAssetStream(long assetStream) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800690 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700691 return rsnFileA3DCreateFromAssetStream(mContext, assetStream);
692 }
Tim Murray460a0492013-11-19 12:45:54 -0800693 native long rsnFileA3DCreateFromFile(long con, String path);
694 synchronized long nFileA3DCreateFromFile(String path) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800695 validate();
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800696 return rsnFileA3DCreateFromFile(mContext, path);
697 }
Tim Murray460a0492013-11-19 12:45:54 -0800698 native long rsnFileA3DCreateFromAsset(long con, AssetManager mgr, String path);
699 synchronized long nFileA3DCreateFromAsset(AssetManager mgr, String path) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800700 validate();
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800701 return rsnFileA3DCreateFromAsset(mContext, mgr, path);
702 }
Tim Murray460a0492013-11-19 12:45:54 -0800703 native int rsnFileA3DGetNumIndexEntries(long con, long fileA3D);
704 synchronized int nFileA3DGetNumIndexEntries(long fileA3D) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800705 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700706 return rsnFileA3DGetNumIndexEntries(mContext, fileA3D);
707 }
Tim Murray460a0492013-11-19 12:45:54 -0800708 native void rsnFileA3DGetIndexEntries(long con, long fileA3D, int numEntries, int[] IDs, String[] names);
709 synchronized void nFileA3DGetIndexEntries(long fileA3D, int numEntries, int[] IDs, String[] names) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800710 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700711 rsnFileA3DGetIndexEntries(mContext, fileA3D, numEntries, IDs, names);
712 }
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000713 native long rsnFileA3DGetEntryByIndex(long con, long fileA3D, int index);
714 synchronized long nFileA3DGetEntryByIndex(long fileA3D, int index) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800715 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700716 return rsnFileA3DGetEntryByIndex(mContext, fileA3D, index);
717 }
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700718
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000719 native long rsnFontCreateFromFile(long con, String fileName, float size, int dpi);
720 synchronized long nFontCreateFromFile(String fileName, float size, int dpi) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800721 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700722 return rsnFontCreateFromFile(mContext, fileName, size, dpi);
723 }
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000724 native long rsnFontCreateFromAssetStream(long con, String name, float size, int dpi, long assetStream);
725 synchronized long nFontCreateFromAssetStream(String name, float size, int dpi, long assetStream) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800726 validate();
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800727 return rsnFontCreateFromAssetStream(mContext, name, size, dpi, assetStream);
728 }
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000729 native long rsnFontCreateFromAsset(long con, AssetManager mgr, String path, float size, int dpi);
730 synchronized long nFontCreateFromAsset(AssetManager mgr, String path, float size, int dpi) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800731 validate();
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800732 return rsnFontCreateFromAsset(mContext, mgr, path, size, dpi);
733 }
Jason Sams22534172009-08-04 16:58:20 -0700734
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700735
Tim Murray460a0492013-11-19 12:45:54 -0800736 native void rsnScriptBindAllocation(long con, long script, long alloc, int slot);
737 synchronized void nScriptBindAllocation(long script, long alloc, int slot) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800738 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700739 rsnScriptBindAllocation(mContext, script, alloc, slot);
740 }
Tim Murray460a0492013-11-19 12:45:54 -0800741 native void rsnScriptSetTimeZone(long con, long script, byte[] timeZone);
742 synchronized void nScriptSetTimeZone(long script, byte[] timeZone) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800743 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700744 rsnScriptSetTimeZone(mContext, script, timeZone);
745 }
Tim Murray460a0492013-11-19 12:45:54 -0800746 native void rsnScriptInvoke(long con, long id, int slot);
747 synchronized void nScriptInvoke(long id, int slot) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800748 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700749 rsnScriptInvoke(mContext, id, slot);
750 }
Chris Wailesbe7b1de2014-07-15 10:56:14 -0700751
752 native void rsnScriptForEach(long con, long id, int slot, long[] ains,
753 long aout, byte[] params, int[] limits);
754
755 synchronized void nScriptForEach(long id, int slot, long[] ains, long aout,
756 byte[] params, int[] limits) {
Jason Sams6e494d32011-04-27 16:33:11 -0700757 validate();
Chris Wailesbe7b1de2014-07-15 10:56:14 -0700758 rsnScriptForEach(mContext, id, slot, ains, aout, params, limits);
Chris Wailes94961062014-06-11 12:01:28 -0700759 }
760
David Gross4a457852016-06-02 14:46:55 -0700761 native void rsnScriptReduce(long con, long id, int slot, long[] ains,
Matt Wala36eb1f72015-07-20 15:35:27 -0700762 long aout, int[] limits);
David Gross4a457852016-06-02 14:46:55 -0700763 synchronized void nScriptReduce(long id, int slot, long ains[], long aout,
Matt Wala36eb1f72015-07-20 15:35:27 -0700764 int[] limits) {
765 validate();
David Gross4a457852016-06-02 14:46:55 -0700766 rsnScriptReduce(mContext, id, slot, ains, aout, limits);
David Gross26ef7a732016-01-12 12:19:15 -0800767 }
768
Tim Murray460a0492013-11-19 12:45:54 -0800769 native void rsnScriptInvokeV(long con, long id, int slot, byte[] params);
770 synchronized void nScriptInvokeV(long id, int slot, byte[] params) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800771 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700772 rsnScriptInvokeV(mContext, id, slot, params);
773 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700774
Tim Murray460a0492013-11-19 12:45:54 -0800775 native void rsnScriptSetVarI(long con, long id, int slot, int val);
776 synchronized void nScriptSetVarI(long id, int slot, int val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800777 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700778 rsnScriptSetVarI(mContext, id, slot, val);
779 }
Tim Murray460a0492013-11-19 12:45:54 -0800780 native int rsnScriptGetVarI(long con, long id, int slot);
781 synchronized int nScriptGetVarI(long id, int slot) {
Tim Murray7c4caad2013-04-10 16:21:40 -0700782 validate();
783 return rsnScriptGetVarI(mContext, id, slot);
784 }
785
Tim Murray460a0492013-11-19 12:45:54 -0800786 native void rsnScriptSetVarJ(long con, long id, int slot, long val);
787 synchronized void nScriptSetVarJ(long id, int slot, long val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800788 validate();
Stephen Hines031ec58c2010-10-11 10:54:21 -0700789 rsnScriptSetVarJ(mContext, id, slot, val);
790 }
Tim Murray460a0492013-11-19 12:45:54 -0800791 native long rsnScriptGetVarJ(long con, long id, int slot);
792 synchronized long nScriptGetVarJ(long id, int slot) {
Tim Murray7c4caad2013-04-10 16:21:40 -0700793 validate();
794 return rsnScriptGetVarJ(mContext, id, slot);
795 }
796
Tim Murray460a0492013-11-19 12:45:54 -0800797 native void rsnScriptSetVarF(long con, long id, int slot, float val);
798 synchronized void nScriptSetVarF(long id, int slot, float val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800799 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700800 rsnScriptSetVarF(mContext, id, slot, val);
801 }
Tim Murray460a0492013-11-19 12:45:54 -0800802 native float rsnScriptGetVarF(long con, long id, int slot);
803 synchronized float nScriptGetVarF(long id, int slot) {
Tim Murray7c4caad2013-04-10 16:21:40 -0700804 validate();
805 return rsnScriptGetVarF(mContext, id, slot);
806 }
Tim Murray460a0492013-11-19 12:45:54 -0800807 native void rsnScriptSetVarD(long con, long id, int slot, double val);
808 synchronized void nScriptSetVarD(long id, int slot, double val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800809 validate();
Stephen Hinesca54ec32010-09-20 17:20:30 -0700810 rsnScriptSetVarD(mContext, id, slot, val);
811 }
Tim Murray460a0492013-11-19 12:45:54 -0800812 native double rsnScriptGetVarD(long con, long id, int slot);
813 synchronized double nScriptGetVarD(long id, int slot) {
Tim Murray7c4caad2013-04-10 16:21:40 -0700814 validate();
815 return rsnScriptGetVarD(mContext, id, slot);
816 }
Tim Murray460a0492013-11-19 12:45:54 -0800817 native void rsnScriptSetVarV(long con, long id, int slot, byte[] val);
818 synchronized void nScriptSetVarV(long id, int slot, byte[] val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800819 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700820 rsnScriptSetVarV(mContext, id, slot, val);
821 }
Tim Murray460a0492013-11-19 12:45:54 -0800822 native void rsnScriptGetVarV(long con, long id, int slot, byte[] val);
823 synchronized void nScriptGetVarV(long id, int slot, byte[] val) {
Tim Murray7c4caad2013-04-10 16:21:40 -0700824 validate();
825 rsnScriptGetVarV(mContext, id, slot, val);
826 }
Tim Murray460a0492013-11-19 12:45:54 -0800827 native void rsnScriptSetVarVE(long con, long id, int slot, byte[] val,
828 long e, int[] dims);
829 synchronized void nScriptSetVarVE(long id, int slot, byte[] val,
830 long e, int[] dims) {
Stephen Hinesadeb8092012-04-20 14:26:06 -0700831 validate();
832 rsnScriptSetVarVE(mContext, id, slot, val, e, dims);
833 }
Tim Murray460a0492013-11-19 12:45:54 -0800834 native void rsnScriptSetVarObj(long con, long id, int slot, long val);
835 synchronized void nScriptSetVarObj(long id, int slot, long val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800836 validate();
Jason Sams6f4cf0b2010-11-16 17:37:02 -0800837 rsnScriptSetVarObj(mContext, id, slot, val);
838 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700839
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000840 native long rsnScriptCCreate(long con, String resName, String cacheDir,
Jason Samse4a06c52011-03-16 16:29:28 -0700841 byte[] script, int length);
Mathew Inwood15324472018-08-06 11:18:49 +0100842 @UnsupportedAppUsage
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000843 synchronized long nScriptCCreate(String resName, String cacheDir, byte[] script, int length) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800844 validate();
Jason Samse4a06c52011-03-16 16:29:28 -0700845 return rsnScriptCCreate(mContext, resName, cacheDir, script, length);
Jason Sams2e1872f2010-08-17 16:25:41 -0700846 }
Jason Samsebfb4362009-09-23 13:57:02 -0700847
Tim Murray460a0492013-11-19 12:45:54 -0800848 native long rsnScriptIntrinsicCreate(long con, int id, long eid);
849 synchronized long nScriptIntrinsicCreate(int id, long eid) {
Jason Sams6ab97682012-08-10 12:09:43 -0700850 validate();
851 return rsnScriptIntrinsicCreate(mContext, id, eid);
852 }
853
Tim Murray460a0492013-11-19 12:45:54 -0800854 native long rsnScriptKernelIDCreate(long con, long sid, int slot, int sig);
855 synchronized long nScriptKernelIDCreate(long sid, int slot, int sig) {
Jason Sams08a81582012-09-18 12:32:10 -0700856 validate();
857 return rsnScriptKernelIDCreate(mContext, sid, slot, sig);
858 }
859
Yang Nibe392ad2015-01-23 17:16:02 -0800860 native long rsnScriptInvokeIDCreate(long con, long sid, int slot);
861 synchronized long nScriptInvokeIDCreate(long sid, int slot) {
862 validate();
863 return rsnScriptInvokeIDCreate(mContext, sid, slot);
864 }
865
Tim Murray460a0492013-11-19 12:45:54 -0800866 native long rsnScriptFieldIDCreate(long con, long sid, int slot);
867 synchronized long nScriptFieldIDCreate(long sid, int slot) {
Jason Sams08a81582012-09-18 12:32:10 -0700868 validate();
869 return rsnScriptFieldIDCreate(mContext, sid, slot);
870 }
871
Ashok Bhat98071552014-02-12 09:54:43 +0000872 native long rsnScriptGroupCreate(long con, long[] kernels, long[] src, long[] dstk, long[] dstf, long[] types);
873 synchronized long nScriptGroupCreate(long[] kernels, long[] src, long[] dstk, long[] dstf, long[] types) {
Jason Sams08a81582012-09-18 12:32:10 -0700874 validate();
875 return rsnScriptGroupCreate(mContext, kernels, src, dstk, dstf, types);
876 }
877
Tim Murray460a0492013-11-19 12:45:54 -0800878 native void rsnScriptGroupSetInput(long con, long group, long kernel, long alloc);
879 synchronized void nScriptGroupSetInput(long group, long kernel, long alloc) {
Jason Sams08a81582012-09-18 12:32:10 -0700880 validate();
881 rsnScriptGroupSetInput(mContext, group, kernel, alloc);
882 }
883
Tim Murray460a0492013-11-19 12:45:54 -0800884 native void rsnScriptGroupSetOutput(long con, long group, long kernel, long alloc);
885 synchronized void nScriptGroupSetOutput(long group, long kernel, long alloc) {
Jason Sams08a81582012-09-18 12:32:10 -0700886 validate();
887 rsnScriptGroupSetOutput(mContext, group, kernel, alloc);
888 }
889
Tim Murray460a0492013-11-19 12:45:54 -0800890 native void rsnScriptGroupExecute(long con, long group);
891 synchronized void nScriptGroupExecute(long group) {
Jason Sams08a81582012-09-18 12:32:10 -0700892 validate();
893 rsnScriptGroupExecute(mContext, group);
894 }
895
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000896 native long rsnSamplerCreate(long con, int magFilter, int minFilter,
Alex Sakhartchouka89094a2011-05-04 17:45:36 -0700897 int wrapS, int wrapT, int wrapR, float aniso);
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000898 synchronized long nSamplerCreate(int magFilter, int minFilter,
Alex Sakhartchouka89094a2011-05-04 17:45:36 -0700899 int wrapS, int wrapT, int wrapR, float aniso) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800900 validate();
Alex Sakhartchouka89094a2011-05-04 17:45:36 -0700901 return rsnSamplerCreate(mContext, magFilter, minFilter, wrapS, wrapT, wrapR, aniso);
Jason Sams2e1872f2010-08-17 16:25:41 -0700902 }
Jason Sams0011bcf2009-12-15 12:58:36 -0800903
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000904 native long rsnProgramStoreCreate(long con, boolean r, boolean g, boolean b, boolean a,
Jason Sams331bf9b2011-04-06 11:23:54 -0700905 boolean depthMask, boolean dither,
906 int srcMode, int dstMode, int depthFunc);
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000907 synchronized long nProgramStoreCreate(boolean r, boolean g, boolean b, boolean a,
Jason Sams331bf9b2011-04-06 11:23:54 -0700908 boolean depthMask, boolean dither,
909 int srcMode, int dstMode, int depthFunc) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800910 validate();
Jason Samsbd184c52011-04-06 11:44:47 -0700911 return rsnProgramStoreCreate(mContext, r, g, b, a, depthMask, dither, srcMode,
912 dstMode, depthFunc);
Jason Sams2e1872f2010-08-17 16:25:41 -0700913 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700914
Tim Murray460a0492013-11-19 12:45:54 -0800915 native long rsnProgramRasterCreate(long con, boolean pointSprite, int cullMode);
916 synchronized long nProgramRasterCreate(boolean pointSprite, int cullMode) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800917 validate();
Jason Sams94aaed32011-09-23 14:18:53 -0700918 return rsnProgramRasterCreate(mContext, pointSprite, cullMode);
Jason Sams2e1872f2010-08-17 16:25:41 -0700919 }
Jason Sams1fe9b8c2009-06-11 14:46:10 -0700920
Tim Murray460a0492013-11-19 12:45:54 -0800921 native void rsnProgramBindConstants(long con, long pv, int slot, long mID);
922 synchronized void nProgramBindConstants(long pv, int slot, long mID) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800923 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700924 rsnProgramBindConstants(mContext, pv, slot, mID);
925 }
Tim Murray460a0492013-11-19 12:45:54 -0800926 native void rsnProgramBindTexture(long con, long vpf, int slot, long a);
927 synchronized void nProgramBindTexture(long vpf, int slot, long a) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800928 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700929 rsnProgramBindTexture(mContext, vpf, slot, a);
930 }
Tim Murray460a0492013-11-19 12:45:54 -0800931 native void rsnProgramBindSampler(long con, long vpf, int slot, long s);
932 synchronized void nProgramBindSampler(long vpf, int slot, long s) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800933 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700934 rsnProgramBindSampler(mContext, vpf, slot, s);
935 }
Ashok Bhat98071552014-02-12 09:54:43 +0000936 native long rsnProgramFragmentCreate(long con, String shader, String[] texNames, long[] params);
937 synchronized long nProgramFragmentCreate(String shader, String[] texNames, long[] params) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800938 validate();
Alex Sakhartchouk2123b462012-02-15 16:21:46 -0800939 return rsnProgramFragmentCreate(mContext, shader, texNames, params);
Jason Sams2e1872f2010-08-17 16:25:41 -0700940 }
Ashok Bhat98071552014-02-12 09:54:43 +0000941 native long rsnProgramVertexCreate(long con, String shader, String[] texNames, long[] params);
942 synchronized long nProgramVertexCreate(String shader, String[] texNames, long[] params) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800943 validate();
Alex Sakhartchouk2123b462012-02-15 16:21:46 -0800944 return rsnProgramVertexCreate(mContext, shader, texNames, params);
Jason Sams2e1872f2010-08-17 16:25:41 -0700945 }
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700946
Ashok Bhat98071552014-02-12 09:54:43 +0000947 native long rsnMeshCreate(long con, long[] vtx, long[] idx, int[] prim);
948 synchronized long nMeshCreate(long[] vtx, long[] idx, int[] prim) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800949 validate();
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700950 return rsnMeshCreate(mContext, vtx, idx, prim);
Alex Sakhartchouk9d71e212010-11-08 15:10:52 -0800951 }
Tim Murray460a0492013-11-19 12:45:54 -0800952 native int rsnMeshGetVertexBufferCount(long con, long id);
953 synchronized int nMeshGetVertexBufferCount(long id) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800954 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700955 return rsnMeshGetVertexBufferCount(mContext, id);
956 }
Tim Murray460a0492013-11-19 12:45:54 -0800957 native int rsnMeshGetIndexCount(long con, long id);
958 synchronized int nMeshGetIndexCount(long id) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800959 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700960 return rsnMeshGetIndexCount(mContext, id);
961 }
Ashok Bhat98071552014-02-12 09:54:43 +0000962 native void rsnMeshGetVertices(long con, long id, long[] vtxIds, int vtxIdCount);
963 synchronized void nMeshGetVertices(long id, long[] vtxIds, int vtxIdCount) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800964 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700965 rsnMeshGetVertices(mContext, id, vtxIds, vtxIdCount);
966 }
Ashok Bhat98071552014-02-12 09:54:43 +0000967 native void rsnMeshGetIndices(long con, long id, long[] idxIds, int[] primitives, int vtxIdCount);
968 synchronized void nMeshGetIndices(long id, long[] idxIds, int[] primitives, int vtxIdCount) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800969 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700970 rsnMeshGetIndices(mContext, id, idxIds, primitives, vtxIdCount);
971 }
972
Tim Murray25207df2015-01-12 16:47:56 -0800973 native void rsnScriptIntrinsicBLAS_Single(long con, long id, int func, int TransA,
974 int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
975 float alpha, long A, long B, float beta, long C, int incX, int incY,
976 int KL, int KU);
977 synchronized void nScriptIntrinsicBLAS_Single(long id, int func, int TransA,
978 int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
979 float alpha, long A, long B, float beta, long C, int incX, int incY,
980 int KL, int KU) {
981 validate();
982 rsnScriptIntrinsicBLAS_Single(mContext, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alpha, A, B, beta, C, incX, incY, KL, KU);
983 }
984
985 native void rsnScriptIntrinsicBLAS_Double(long con, long id, int func, int TransA,
986 int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
987 double alpha, long A, long B, double beta, long C, int incX, int incY,
988 int KL, int KU);
989 synchronized void nScriptIntrinsicBLAS_Double(long id, int func, int TransA,
990 int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
991 double alpha, long A, long B, double beta, long C, int incX, int incY,
992 int KL, int KU) {
993 validate();
994 rsnScriptIntrinsicBLAS_Double(mContext, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alpha, A, B, beta, C, incX, incY, KL, KU);
995 }
996
997 native void rsnScriptIntrinsicBLAS_Complex(long con, long id, int func, int TransA,
998 int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
999 float alphaX, float alphaY, long A, long B, float betaX, float betaY, long C, int incX, int incY,
1000 int KL, int KU);
1001 synchronized void nScriptIntrinsicBLAS_Complex(long id, int func, int TransA,
1002 int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
1003 float alphaX, float alphaY, long A, long B, float betaX, float betaY, long C, int incX, int incY,
1004 int KL, int KU) {
1005 validate();
1006 rsnScriptIntrinsicBLAS_Complex(mContext, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alphaX, alphaY, A, B, betaX, betaY, C, incX, incY, KL, KU);
1007 }
1008
1009 native void rsnScriptIntrinsicBLAS_Z(long con, long id, int func, int TransA,
1010 int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
1011 double alphaX, double alphaY, long A, long B, double betaX, double betaY, long C, int incX, int incY,
1012 int KL, int KU);
1013 synchronized void nScriptIntrinsicBLAS_Z(long id, int func, int TransA,
1014 int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
1015 double alphaX, double alphaY, long A, long B, double betaX, double betaY, long C, int incX, int incY,
1016 int KL, int KU) {
1017 validate();
1018 rsnScriptIntrinsicBLAS_Z(mContext, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alphaX, alphaY, A, B, betaX, betaY, C, incX, incY, KL, KU);
1019 }
1020
Tim Murray9cb16a22015-04-01 11:07:16 -07001021 native void rsnScriptIntrinsicBLAS_BNNM(long con, long id, int M, int N, int K,
1022 long A, int a_offset, long B, int b_offset, long C, int c_offset,
1023 int c_mult_int);
1024 synchronized void nScriptIntrinsicBLAS_BNNM(long id, int M, int N, int K,
1025 long A, int a_offset, long B, int b_offset, long C, int c_offset,
1026 int c_mult_int) {
1027 validate();
1028 rsnScriptIntrinsicBLAS_BNNM(mContext, id, M, N, K, A, a_offset, B, b_offset, C, c_offset, c_mult_int);
1029 }
1030
1031
Tim Murray25207df2015-01-12 16:47:56 -08001032
Tim Murrayeff663f2013-11-15 13:08:30 -08001033 long mContext;
Jason Samsd22a6f02015-02-19 17:19:52 -08001034 private boolean mDestroyed = false;
1035
Romain Guy650a3eb2009-08-31 14:06:43 -07001036 @SuppressWarnings({"FieldCanBeLocal"})
Jason Samsbf6ef8d72010-12-06 15:59:59 -08001037 MessageThread mMessageThread;
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001038
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001039 volatile Element mElement_U8;
1040 volatile Element mElement_I8;
1041 volatile Element mElement_U16;
1042 volatile Element mElement_I16;
1043 volatile Element mElement_U32;
1044 volatile Element mElement_I32;
1045 volatile Element mElement_U64;
1046 volatile Element mElement_I64;
1047 volatile Element mElement_F16;
1048 volatile Element mElement_F32;
1049 volatile Element mElement_F64;
1050 volatile Element mElement_BOOLEAN;
Jason Sams3c0dfba2009-09-27 17:50:38 -07001051
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001052 volatile Element mElement_ELEMENT;
1053 volatile Element mElement_TYPE;
1054 volatile Element mElement_ALLOCATION;
1055 volatile Element mElement_SAMPLER;
1056 volatile Element mElement_SCRIPT;
1057 volatile Element mElement_MESH;
1058 volatile Element mElement_PROGRAM_FRAGMENT;
1059 volatile Element mElement_PROGRAM_VERTEX;
1060 volatile Element mElement_PROGRAM_RASTER;
1061 volatile Element mElement_PROGRAM_STORE;
1062 volatile Element mElement_FONT;
Jason Samsa70f4162010-03-26 15:33:42 -07001063
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001064 volatile Element mElement_A_8;
1065 volatile Element mElement_RGB_565;
1066 volatile Element mElement_RGB_888;
1067 volatile Element mElement_RGBA_5551;
1068 volatile Element mElement_RGBA_4444;
1069 volatile Element mElement_RGBA_8888;
Jason Sams3c0dfba2009-09-27 17:50:38 -07001070
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001071 volatile Element mElement_HALF_2;
1072 volatile Element mElement_HALF_3;
1073 volatile Element mElement_HALF_4;
Jason Samsa5835a22014-11-05 15:16:26 -08001074
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001075 volatile Element mElement_FLOAT_2;
1076 volatile Element mElement_FLOAT_3;
1077 volatile Element mElement_FLOAT_4;
Stephen Hines836c4a52011-06-01 14:38:10 -07001078
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001079 volatile Element mElement_DOUBLE_2;
1080 volatile Element mElement_DOUBLE_3;
1081 volatile Element mElement_DOUBLE_4;
Stephen Hines836c4a52011-06-01 14:38:10 -07001082
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001083 volatile Element mElement_UCHAR_2;
1084 volatile Element mElement_UCHAR_3;
1085 volatile Element mElement_UCHAR_4;
Jason Sams7d787b42009-11-15 12:14:26 -08001086
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001087 volatile Element mElement_CHAR_2;
1088 volatile Element mElement_CHAR_3;
1089 volatile Element mElement_CHAR_4;
Stephen Hines836c4a52011-06-01 14:38:10 -07001090
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001091 volatile Element mElement_USHORT_2;
1092 volatile Element mElement_USHORT_3;
1093 volatile Element mElement_USHORT_4;
Stephen Hines836c4a52011-06-01 14:38:10 -07001094
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001095 volatile Element mElement_SHORT_2;
1096 volatile Element mElement_SHORT_3;
1097 volatile Element mElement_SHORT_4;
Stephen Hines836c4a52011-06-01 14:38:10 -07001098
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001099 volatile Element mElement_UINT_2;
1100 volatile Element mElement_UINT_3;
1101 volatile Element mElement_UINT_4;
Stephen Hines836c4a52011-06-01 14:38:10 -07001102
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001103 volatile Element mElement_INT_2;
1104 volatile Element mElement_INT_3;
1105 volatile Element mElement_INT_4;
Stephen Hines836c4a52011-06-01 14:38:10 -07001106
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001107 volatile Element mElement_ULONG_2;
1108 volatile Element mElement_ULONG_3;
1109 volatile Element mElement_ULONG_4;
Stephen Hines836c4a52011-06-01 14:38:10 -07001110
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001111 volatile Element mElement_LONG_2;
1112 volatile Element mElement_LONG_3;
1113 volatile Element mElement_LONG_4;
Stephen Hines836c4a52011-06-01 14:38:10 -07001114
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001115 volatile Element mElement_YUV;
Tim Murray932e78e2013-09-03 11:42:26 -07001116
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001117 volatile Element mElement_MATRIX_4X4;
1118 volatile Element mElement_MATRIX_3X3;
1119 volatile Element mElement_MATRIX_2X2;
Jason Sams1d45c472010-08-25 14:31:48 -07001120
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001121 volatile Sampler mSampler_CLAMP_NEAREST;
1122 volatile Sampler mSampler_CLAMP_LINEAR;
1123 volatile Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
1124 volatile Sampler mSampler_WRAP_NEAREST;
1125 volatile Sampler mSampler_WRAP_LINEAR;
1126 volatile Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
1127 volatile Sampler mSampler_MIRRORED_REPEAT_NEAREST;
1128 volatile Sampler mSampler_MIRRORED_REPEAT_LINEAR;
1129 volatile Sampler mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR;
Jason Sams4d339932010-05-11 14:03:58 -07001130
Alex Sakhartchoukd36f2482010-08-24 11:37:33 -07001131 ProgramStore mProgramStore_BLEND_NONE_DEPTH_TEST;
1132 ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
Alex Sakhartchoukd36f2482010-08-24 11:37:33 -07001133 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_TEST;
1134 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
Alex Sakhartchouk32e09b52010-08-23 10:24:10 -07001135
Alex Sakhartchoukd36f2482010-08-24 11:37:33 -07001136 ProgramRaster mProgramRaster_CULL_BACK;
1137 ProgramRaster mProgramRaster_CULL_FRONT;
1138 ProgramRaster mProgramRaster_CULL_NONE;
Alex Sakhartchouk32e09b52010-08-23 10:24:10 -07001139
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001140 ///////////////////////////////////////////////////////////////////////////////////
Jack Palevich43702d82009-05-28 13:38:16 -07001141 //
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001142
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001143 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001144 * The base class from which an application should derive in order
1145 * to receive RS messages from scripts. When a script calls {@code
1146 * rsSendToClient}, the data fields will be filled, and the run
1147 * method will be called on a separate thread. This will occur
1148 * some time after {@code rsSendToClient} completes in the script,
1149 * as {@code rsSendToClient} is asynchronous. Message handlers are
1150 * not guaranteed to have completed when {@link
1151 * android.renderscript.RenderScript#finish} returns.
Jason Sams27676fe2010-11-10 17:00:59 -08001152 *
1153 */
Jason Samsbf6ef8d72010-12-06 15:59:59 -08001154 public static class RSMessageHandler implements Runnable {
Jason Sams516c3192009-10-06 13:58:47 -07001155 protected int[] mData;
1156 protected int mID;
Jason Sams1c415172010-11-08 17:06:46 -08001157 protected int mLength;
Jason Sams516c3192009-10-06 13:58:47 -07001158 public void run() {
1159 }
1160 }
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001161 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001162 * If an application is expecting messages, it should set this
1163 * field to an instance of {@link RSMessageHandler}. This
1164 * instance will receive all the user messages sent from {@code
1165 * sendToClient} by scripts from this context.
Jason Sams27676fe2010-11-10 17:00:59 -08001166 *
1167 */
Mathew Inwood15324472018-08-06 11:18:49 +01001168 @UnsupportedAppUsage
Jason Samsbf6ef8d72010-12-06 15:59:59 -08001169 RSMessageHandler mMessageCallback = null;
1170
1171 public void setMessageHandler(RSMessageHandler msg) {
1172 mMessageCallback = msg;
1173 }
1174 public RSMessageHandler getMessageHandler() {
1175 return mMessageCallback;
1176 }
Jason Sams516c3192009-10-06 13:58:47 -07001177
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001178 /**
Jason Sams02d56d92013-04-12 16:40:50 -07001179 * Place a message into the message queue to be sent back to the message
1180 * handler once all previous commands have been executed.
Jason Sams455d6442013-02-05 19:20:18 -08001181 *
1182 * @param id
1183 * @param data
1184 */
1185 public void sendMessage(int id, int[] data) {
1186 nContextSendMessage(id, data);
1187 }
1188
1189 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001190 * The runtime error handler base class. An application should derive from this class
1191 * if it wishes to install an error handler. When errors occur at runtime,
1192 * the fields in this class will be filled, and the run method will be called.
Jason Sams27676fe2010-11-10 17:00:59 -08001193 *
1194 */
Jason Samsbf6ef8d72010-12-06 15:59:59 -08001195 public static class RSErrorHandler implements Runnable {
Jason Sams1c415172010-11-08 17:06:46 -08001196 protected String mErrorMessage;
1197 protected int mErrorNum;
1198 public void run() {
1199 }
1200 }
Jason Sams27676fe2010-11-10 17:00:59 -08001201
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001202 /**
Jason Sams27676fe2010-11-10 17:00:59 -08001203 * Application Error handler. All runtime errors will be dispatched to the
1204 * instance of RSAsyncError set here. If this field is null a
Tim Murrayc11e25c2013-04-09 11:01:01 -07001205 * {@link RSRuntimeException} will instead be thrown with details about the error.
Jason Sams27676fe2010-11-10 17:00:59 -08001206 * This will cause program termaination.
1207 *
1208 */
Jason Samsbf6ef8d72010-12-06 15:59:59 -08001209 RSErrorHandler mErrorCallback = null;
1210
1211 public void setErrorHandler(RSErrorHandler msg) {
1212 mErrorCallback = msg;
1213 }
1214 public RSErrorHandler getErrorHandler() {
1215 return mErrorCallback;
1216 }
Jason Sams1c415172010-11-08 17:06:46 -08001217
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001218 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001219 * RenderScript worker thread priority enumeration. The default value is
1220 * NORMAL. Applications wishing to do background processing should set
1221 * their priority to LOW to avoid starving forground processes.
Jason Sams27676fe2010-11-10 17:00:59 -08001222 */
Jason Sams7d787b42009-11-15 12:14:26 -08001223 public enum Priority {
Jason Samsc9870c12015-01-21 12:55:14 -08001224 // These values used to represent official thread priority values
1225 // now they are simply enums to be used by the runtime side
1226 LOW (15),
1227 NORMAL (-8);
Jason Sams7d787b42009-11-15 12:14:26 -08001228
1229 int mID;
1230 Priority(int id) {
1231 mID = id;
1232 }
1233 }
1234
Jason Sams678cc7f2014-03-05 16:09:02 -08001235 void validateObject(BaseObj o) {
1236 if (o != null) {
1237 if (o.mRS != this) {
1238 throw new RSIllegalArgumentException("Attempting to use an object across contexts.");
1239 }
1240 }
1241 }
1242
Mathew Inwood15324472018-08-06 11:18:49 +01001243 @UnsupportedAppUsage
Jason Sams771bebb2009-12-07 12:40:12 -08001244 void validate() {
1245 if (mContext == 0) {
Jason Samsc1d62102010-11-04 14:32:19 -07001246 throw new RSInvalidStateException("Calling RS with no Context active.");
Jason Sams771bebb2009-12-07 12:40:12 -08001247 }
1248 }
1249
Jason Sams27676fe2010-11-10 17:00:59 -08001250
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001251 /**
Jason Sams27676fe2010-11-10 17:00:59 -08001252 * Change the priority of the worker threads for this context.
1253 *
1254 * @param p New priority to be set.
1255 */
Jason Samsbf6ef8d72010-12-06 15:59:59 -08001256 public void setPriority(Priority p) {
Jason Sams5dbfe932010-01-27 14:41:43 -08001257 validate();
Jason Sams7d787b42009-11-15 12:14:26 -08001258 nContextSetPriority(p.mID);
1259 }
1260
Jason Samsbf6ef8d72010-12-06 15:59:59 -08001261 static class MessageThread extends Thread {
Jason Sams516c3192009-10-06 13:58:47 -07001262 RenderScript mRS;
1263 boolean mRun = true;
Jason Samsbf6ef8d72010-12-06 15:59:59 -08001264 int[] mAuxData = new int[2];
Jason Sams1c415172010-11-08 17:06:46 -08001265
Jason Samsbf6ef8d72010-12-06 15:59:59 -08001266 static final int RS_MESSAGE_TO_CLIENT_NONE = 0;
1267 static final int RS_MESSAGE_TO_CLIENT_EXCEPTION = 1;
1268 static final int RS_MESSAGE_TO_CLIENT_RESIZE = 2;
1269 static final int RS_MESSAGE_TO_CLIENT_ERROR = 3;
1270 static final int RS_MESSAGE_TO_CLIENT_USER = 4;
Jason Sams739c8262013-04-11 18:07:52 -07001271 static final int RS_MESSAGE_TO_CLIENT_NEW_BUFFER = 5;
Jason Sams516c3192009-10-06 13:58:47 -07001272
Stephen Hines42028a82013-04-17 19:22:01 -07001273 static final int RS_ERROR_FATAL_DEBUG = 0x0800;
Jason Samsbf6ef8d72010-12-06 15:59:59 -08001274 static final int RS_ERROR_FATAL_UNKNOWN = 0x1000;
Jason Samsadd9d962010-11-22 16:20:16 -08001275
Jason Sams516c3192009-10-06 13:58:47 -07001276 MessageThread(RenderScript rs) {
1277 super("RSMessageThread");
1278 mRS = rs;
1279
1280 }
1281
1282 public void run() {
1283 // This function is a temporary solution. The final solution will
1284 // used typed allocations where the message id is the type indicator.
1285 int[] rbuf = new int[16];
Jason Sams2e1872f2010-08-17 16:25:41 -07001286 mRS.nContextInitToClient(mRS.mContext);
Jason Sams516c3192009-10-06 13:58:47 -07001287 while(mRun) {
Jason Sams1d45c472010-08-25 14:31:48 -07001288 rbuf[0] = 0;
Jason Samsedbfabd2011-05-17 15:01:29 -07001289 int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData);
Jason Samsbf6ef8d72010-12-06 15:59:59 -08001290 int size = mAuxData[1];
1291 int subID = mAuxData[0];
Jason Sams1c415172010-11-08 17:06:46 -08001292
1293 if (msg == RS_MESSAGE_TO_CLIENT_USER) {
1294 if ((size>>2) >= rbuf.length) {
1295 rbuf = new int[(size + 3) >> 2];
1296 }
Jason Samsedbfabd2011-05-17 15:01:29 -07001297 if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
1298 RS_MESSAGE_TO_CLIENT_USER) {
Tim Murrayc11e25c2013-04-09 11:01:01 -07001299 throw new RSDriverException("Error processing message from RenderScript.");
Jason Samsedbfabd2011-05-17 15:01:29 -07001300 }
Jason Sams1c415172010-11-08 17:06:46 -08001301
1302 if(mRS.mMessageCallback != null) {
1303 mRS.mMessageCallback.mData = rbuf;
1304 mRS.mMessageCallback.mID = subID;
1305 mRS.mMessageCallback.mLength = size;
1306 mRS.mMessageCallback.run();
Jason Sams1d45c472010-08-25 14:31:48 -07001307 } else {
Jason Sams1c415172010-11-08 17:06:46 -08001308 throw new RSInvalidStateException("Received a message from the script with no message handler installed.");
Jason Sams516c3192009-10-06 13:58:47 -07001309 }
Stephen Hinesab98bb62010-09-24 14:38:30 -07001310 continue;
Jason Sams516c3192009-10-06 13:58:47 -07001311 }
Jason Sams1c415172010-11-08 17:06:46 -08001312
1313 if (msg == RS_MESSAGE_TO_CLIENT_ERROR) {
1314 String e = mRS.nContextGetErrorMessage(mRS.mContext);
1315
Stephen Hines42028a82013-04-17 19:22:01 -07001316 // Throw RSRuntimeException under the following conditions:
1317 //
1318 // 1) It is an unknown fatal error.
1319 // 2) It is a debug fatal error, and we are not in a
1320 // debug context.
1321 // 3) It is a debug fatal error, and we do not have an
1322 // error callback.
1323 if (subID >= RS_ERROR_FATAL_UNKNOWN ||
1324 (subID >= RS_ERROR_FATAL_DEBUG &&
1325 (mRS.mContextType != ContextType.DEBUG ||
1326 mRS.mErrorCallback == null))) {
Jason Samsadd9d962010-11-22 16:20:16 -08001327 throw new RSRuntimeException("Fatal error " + subID + ", details: " + e);
1328 }
1329
Jason Sams1c415172010-11-08 17:06:46 -08001330 if(mRS.mErrorCallback != null) {
1331 mRS.mErrorCallback.mErrorMessage = e;
1332 mRS.mErrorCallback.mErrorNum = subID;
1333 mRS.mErrorCallback.run();
1334 } else {
Jason Samsa4b7bc92013-02-05 15:05:39 -08001335 android.util.Log.e(LOG_TAG, "non fatal RS error, " + e);
Stephen Hinesbe74bdd2012-02-03 15:29:36 -08001336 // Do not throw here. In these cases, we do not have
1337 // a fatal error.
Jason Sams1c415172010-11-08 17:06:46 -08001338 }
1339 continue;
1340 }
1341
Jason Sams739c8262013-04-11 18:07:52 -07001342 if (msg == RS_MESSAGE_TO_CLIENT_NEW_BUFFER) {
Tim Murrayb730d862014-08-18 16:14:24 -07001343 if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
1344 RS_MESSAGE_TO_CLIENT_NEW_BUFFER) {
1345 throw new RSDriverException("Error processing message from RenderScript.");
1346 }
1347 long bufferID = ((long)rbuf[1] << 32L) + ((long)rbuf[0] & 0xffffffffL);
1348 Allocation.sendBufferNotification(bufferID);
Jason Sams739c8262013-04-11 18:07:52 -07001349 continue;
1350 }
1351
Jason Sams1c415172010-11-08 17:06:46 -08001352 // 2: teardown.
1353 // But we want to avoid starving other threads during
1354 // teardown by yielding until the next line in the destructor
1355 // can execute to set mRun = false
1356 try {
1357 sleep(1, 0);
1358 } catch(InterruptedException e) {
Jason Sams516c3192009-10-06 13:58:47 -07001359 }
Jason Sams516c3192009-10-06 13:58:47 -07001360 }
Tim Murrayda67deb2013-05-09 12:02:50 -07001361 //Log.d(LOG_TAG, "MessageThread exiting.");
Jason Sams516c3192009-10-06 13:58:47 -07001362 }
1363 }
1364
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001365 RenderScript(Context ctx) {
Stephen Hines42028a82013-04-17 19:22:01 -07001366 mContextType = ContextType.NORMAL;
Jason Sams1a4e1f3e2012-02-24 17:51:24 -08001367 if (ctx != null) {
1368 mApplicationContext = ctx.getApplicationContext();
1369 }
Tim Murray06b45672014-01-07 11:13:56 -08001370 mRWLock = new ReentrantReadWriteLock();
Tim Murrayaefbd5f2014-12-12 11:34:48 -08001371 try {
Tim Murrayd11a6582014-12-16 09:59:09 -08001372 registerNativeAllocation.invoke(sRuntime, 4 * 1024 * 1024); // 4MB for GC sake
Tim Murrayaefbd5f2014-12-12 11:34:48 -08001373 } catch (Exception e) {
1374 Log.e(RenderScript.LOG_TAG, "Couldn't invoke registerNativeAllocation:" + e);
1375 throw new RSRuntimeException("Couldn't invoke registerNativeAllocation:" + e);
1376 }
1377
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001378 }
1379
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001380 /**
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001381 * Gets the application context associated with the RenderScript context.
1382 *
1383 * @return The application context.
1384 */
1385 public final Context getApplicationContext() {
1386 return mApplicationContext;
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001387 }
1388
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001389 /**
Yang Ni689f6372016-03-10 16:12:31 -08001390 * Name of the file that holds the object cache.
1391 */
1392 private static String mCachePath;
1393
1394 /**
1395 * Gets the path to the code cache.
1396 */
1397 static synchronized String getCachePath() {
1398 if (mCachePath == null) {
1399 final String CACHE_PATH = "com.android.renderscript.cache";
1400 if (RenderScriptCacheDir.mCacheDir == null) {
1401 throw new RSRuntimeException("RenderScript code cache directory uninitialized.");
1402 }
1403 File f = new File(RenderScriptCacheDir.mCacheDir, CACHE_PATH);
1404 mCachePath = f.getAbsolutePath();
1405 f.mkdirs();
1406 }
1407 return mCachePath;
1408 }
1409
1410 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001411 * Create a RenderScript context.
Jason Sams27676fe2010-11-10 17:00:59 -08001412 *
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001413 * @param ctx The context.
Jason Sams27676fe2010-11-10 17:00:59 -08001414 * @return RenderScript
1415 */
Jason Samse16da122015-03-18 17:04:18 -07001416 private static RenderScript internalCreate(Context ctx, int sdkVersion, ContextType ct, int flags) {
Dan Morrille4d9a012013-03-28 18:10:43 -07001417 if (!sInitialized) {
1418 Log.e(LOG_TAG, "RenderScript.create() called when disabled; someone is likely to crash");
1419 return null;
1420 }
1421
verena beckhamc9659ea2015-05-22 16:47:53 +01001422 if ((flags & ~(CREATE_FLAG_LOW_LATENCY | CREATE_FLAG_LOW_POWER |
Stephen McGroarty88891e62015-09-02 15:54:05 +01001423 CREATE_FLAG_WAIT_FOR_ATTACH)) != 0) {
Jason Samsb69c7912014-05-20 18:48:35 -07001424 throw new RSIllegalArgumentException("Invalid flags passed.");
1425 }
1426
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001427 RenderScript rs = new RenderScript(ctx);
Jason Sams704ff642010-02-09 16:05:07 -08001428
Yang Nicb939dc2016-04-04 10:23:57 -07001429 long device = rs.nDeviceCreate();
1430 rs.mContext = rs.nContextCreate(device, flags, sdkVersion, ct.mID);
Stephen Hines42028a82013-04-17 19:22:01 -07001431 rs.mContextType = ct;
Jason Samse16da122015-03-18 17:04:18 -07001432 rs.mContextFlags = flags;
1433 rs.mContextSdkVersion = sdkVersion;
Jason Sams26985362011-05-03 15:01:58 -07001434 if (rs.mContext == 0) {
1435 throw new RSDriverException("Failed to create RS context.");
1436 }
Tim Murray47f31582015-04-07 15:43:24 -07001437
1438 // set up cache directory for entire context
Yang Ni689f6372016-03-10 16:12:31 -08001439 rs.nContextSetCacheDir(RenderScript.getCachePath());
Tim Murray47f31582015-04-07 15:43:24 -07001440
Jason Sams704ff642010-02-09 16:05:07 -08001441 rs.mMessageThread = new MessageThread(rs);
1442 rs.mMessageThread.start();
Jason Sams704ff642010-02-09 16:05:07 -08001443 return rs;
Jason Samsefd9b6fb2009-11-03 13:58:36 -08001444 }
1445
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001446 /**
Miao Wanga4e5adf2015-03-23 11:09:56 -07001447 * calls create(ctx, ContextType.NORMAL, CREATE_FLAG_NONE)
Jason Samse16da122015-03-18 17:04:18 -07001448 *
1449 * See documentation for @create for details
Jason Sams1a4e1f3e2012-02-24 17:51:24 -08001450 *
1451 * @param ctx The context.
1452 * @return RenderScript
1453 */
1454 public static RenderScript create(Context ctx) {
Jason Samsadd26dc2013-02-22 18:43:45 -08001455 return create(ctx, ContextType.NORMAL);
1456 }
1457
1458 /**
Miao Wanga4e5adf2015-03-23 11:09:56 -07001459 * calls create(ctx, ct, CREATE_FLAG_NONE)
Jason Samsadd26dc2013-02-22 18:43:45 -08001460 *
Jason Samse16da122015-03-18 17:04:18 -07001461 * See documentation for @create for details
Jason Samsadd26dc2013-02-22 18:43:45 -08001462 *
1463 * @param ctx The context.
Jason Sams02d56d92013-04-12 16:40:50 -07001464 * @param ct The type of context to be created.
Jason Samsadd26dc2013-02-22 18:43:45 -08001465 * @return RenderScript
1466 */
1467 public static RenderScript create(Context ctx, ContextType ct) {
Jason Samse16da122015-03-18 17:04:18 -07001468 return create(ctx, ct, CREATE_FLAG_NONE);
Jason Sams26e90512014-05-07 14:23:27 -07001469 }
1470
Miao Wanga4e5adf2015-03-23 11:09:56 -07001471
1472 /**
Jason Samse16da122015-03-18 17:04:18 -07001473 * Gets or creates a RenderScript context of the specified type.
Jason Sams26e90512014-05-07 14:23:27 -07001474 *
Jason Samse16da122015-03-18 17:04:18 -07001475 * The returned context will be cached for future reuse within
1476 * the process. When an application is finished using
1477 * RenderScript it should call releaseAllContexts()
1478 *
1479 * A process context is a context designed for easy creation and
1480 * lifecycle management. Multiple calls to this function will
1481 * return the same object provided they are called with the same
1482 * options. This allows it to be used any time a RenderScript
1483 * context is needed.
1484 *
1485 * Prior to API 23 this always created a new context.
Jason Sams26e90512014-05-07 14:23:27 -07001486 *
1487 * @param ctx The context.
1488 * @param ct The type of context to be created.
1489 * @param flags The OR of the CREATE_FLAG_* options desired
1490 * @return RenderScript
1491 */
Tim Murrayfd710e72014-06-06 11:10:45 -07001492 public static RenderScript create(Context ctx, ContextType ct, int flags) {
Jason Sams26e90512014-05-07 14:23:27 -07001493 int v = ctx.getApplicationInfo().targetSdkVersion;
Miao Wanga4e5adf2015-03-23 11:09:56 -07001494 return create(ctx, v, ct, flags);
1495 }
1496
1497 /**
1498 * calls create(ctx, sdkVersion, ContextType.NORMAL, CREATE_FLAG_NONE)
1499 *
1500 * Used by the RenderScriptThunker to maintain backward compatibility.
1501 *
1502 * @hide
1503 * @param ctx The context.
1504 * @param sdkVersion The target SDK Version.
1505 * @return RenderScript
1506 */
Mathew Inwood15324472018-08-06 11:18:49 +01001507 @UnsupportedAppUsage
Miao Wanga4e5adf2015-03-23 11:09:56 -07001508 public static RenderScript create(Context ctx, int sdkVersion) {
1509 return create(ctx, sdkVersion, ContextType.NORMAL, CREATE_FLAG_NONE);
1510 }
1511
1512 /**
1513 * Gets or creates a RenderScript context of the specified type.
1514 *
Miao Wanga4e5adf2015-03-23 11:09:56 -07001515 * @param ctx The context.
1516 * @param ct The type of context to be created.
1517 * @param sdkVersion The target SDK Version.
1518 * @param flags The OR of the CREATE_FLAG_* options desired
1519 * @return RenderScript
1520 */
Mathew Inwood15324472018-08-06 11:18:49 +01001521 @UnsupportedAppUsage
Jason Sams6a420b52015-03-30 15:31:26 -07001522 private static RenderScript create(Context ctx, int sdkVersion, ContextType ct, int flags) {
Miao Wanga4e5adf2015-03-23 11:09:56 -07001523 if (sdkVersion < 23) {
1524 return internalCreate(ctx, sdkVersion, ct, flags);
Jason Samse16da122015-03-18 17:04:18 -07001525 }
1526
1527 synchronized (mProcessContextList) {
1528 for (RenderScript prs : mProcessContextList) {
1529 if ((prs.mContextType == ct) &&
1530 (prs.mContextFlags == flags) &&
Miao Wanga4e5adf2015-03-23 11:09:56 -07001531 (prs.mContextSdkVersion == sdkVersion)) {
Jason Samse16da122015-03-18 17:04:18 -07001532
1533 return prs;
1534 }
1535 }
1536
Miao Wanga4e5adf2015-03-23 11:09:56 -07001537 RenderScript prs = internalCreate(ctx, sdkVersion, ct, flags);
Jason Samse16da122015-03-18 17:04:18 -07001538 prs.mIsProcessContext = true;
1539 mProcessContextList.add(prs);
1540 return prs;
1541 }
Jason Sams1a4e1f3e2012-02-24 17:51:24 -08001542 }
1543
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001544 /**
Jason Samse16da122015-03-18 17:04:18 -07001545 * Releases all the process contexts. This is the same as
1546 * calling .destroy() on each unique context retreived with
1547 * create(...). If no contexts have been created this
1548 * function does nothing.
1549 *
1550 * Typically you call this when your application is losing focus
1551 * and will not be using a context for some time.
1552 *
1553 * This has no effect on a context created with
1554 * createMultiContext()
1555 */
1556 public static void releaseAllContexts() {
1557 ArrayList<RenderScript> oldList;
1558 synchronized (mProcessContextList) {
1559 oldList = mProcessContextList;
1560 mProcessContextList = new ArrayList<RenderScript>();
1561 }
1562
1563 for (RenderScript prs : oldList) {
1564 prs.mIsProcessContext = false;
1565 prs.destroy();
1566 }
1567 oldList.clear();
1568 }
1569
1570
1571
1572 /**
1573 * Create a RenderScript context.
1574 *
1575 * This is an advanced function intended for applications which
1576 * need to create more than one RenderScript context to be used
1577 * at the same time.
1578 *
1579 * If you need a single context please use create()
1580 *
Jason Samse16da122015-03-18 17:04:18 -07001581 * @param ctx The context.
1582 * @return RenderScript
1583 */
1584 public static RenderScript createMultiContext(Context ctx, ContextType ct, int flags, int API_number) {
1585 return internalCreate(ctx, API_number, ct, flags);
1586 }
1587
1588
1589 /**
Jason Sams27676fe2010-11-10 17:00:59 -08001590 * Print the currently available debugging information about the state of
1591 * the RS context to the log.
1592 *
Jason Sams27676fe2010-11-10 17:00:59 -08001593 */
Jason Samsbf6ef8d72010-12-06 15:59:59 -08001594 public void contextDump() {
Jason Sams5dbfe932010-01-27 14:41:43 -08001595 validate();
Jason Samsbf6ef8d72010-12-06 15:59:59 -08001596 nContextDump(0);
Jason Sams715333b2009-11-17 17:26:46 -08001597 }
1598
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001599 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001600 * Wait for any pending asynchronous opeations (such as copies to a RS
1601 * allocation or RS script executions) to complete.
Jason Sams27676fe2010-11-10 17:00:59 -08001602 *
1603 */
Jason Sams96ed4cf2010-06-15 12:15:57 -07001604 public void finish() {
1605 nContextFinish();
1606 }
1607
Jason Samsd22a6f02015-02-19 17:19:52 -08001608 private void helpDestroy() {
1609 boolean shouldDestroy = false;
1610 synchronized(this) {
1611 if (!mDestroyed) {
1612 shouldDestroy = true;
1613 mDestroyed = true;
1614 }
1615 }
1616
1617 if (shouldDestroy) {
1618 nContextFinish();
1619
1620 nContextDeinitToClient(mContext);
1621 mMessageThread.mRun = false;
Miao Wang4a574802016-05-10 16:44:11 -07001622 // Interrupt mMessageThread so it gets to see immediately that mRun is false
1623 // and exit rightaway.
1624 mMessageThread.interrupt();
Pirama Arumuga Nainar2f25ce772015-10-02 12:06:10 -07001625
1626 // Wait for mMessageThread to join. Try in a loop, in case this thread gets interrupted
Pirama Arumuga Nainar83461d72015-10-02 16:38:08 -07001627 // during the wait. If interrupted, set the "interrupted" status of the current thread.
1628 boolean hasJoined = false, interrupted = false;
Pirama Arumuga Nainar2f25ce772015-10-02 12:06:10 -07001629 while (!hasJoined) {
1630 try {
1631 mMessageThread.join();
1632 hasJoined = true;
Pirama Arumuga Nainar83461d72015-10-02 16:38:08 -07001633 } catch (InterruptedException e) {
1634 interrupted = true;
Pirama Arumuga Nainar2f25ce772015-10-02 12:06:10 -07001635 }
Jason Samsd22a6f02015-02-19 17:19:52 -08001636 }
Pirama Arumuga Nainar83461d72015-10-02 16:38:08 -07001637 if (interrupted) {
1638 Log.v(LOG_TAG, "Interrupted during wait for MessageThread to join");
1639 Thread.currentThread().interrupt();
1640 }
Jason Samsd22a6f02015-02-19 17:19:52 -08001641
1642 nContextDestroy();
Jason Samsd22a6f02015-02-19 17:19:52 -08001643 }
1644 }
1645
1646 protected void finalize() throws Throwable {
1647 helpDestroy();
1648 super.finalize();
1649 }
1650
1651
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001652 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001653 * Destroys this RenderScript context. Once this function is called,
1654 * using this context or any objects belonging to this context is
1655 * illegal.
Jason Sams27676fe2010-11-10 17:00:59 -08001656 *
Jason Samse16da122015-03-18 17:04:18 -07001657 * API 23+, this function is a NOP if the context was created
1658 * with create(). Please use releaseAllContexts() to clean up
1659 * contexts created with the create function.
1660 *
Jason Sams27676fe2010-11-10 17:00:59 -08001661 */
Jason Samsf5b45962009-08-25 14:49:07 -07001662 public void destroy() {
Jason Samse16da122015-03-18 17:04:18 -07001663 if (mIsProcessContext) {
1664 // users cannot destroy a process context
1665 return;
1666 }
Jason Sams5dbfe932010-01-27 14:41:43 -08001667 validate();
Jason Samsd22a6f02015-02-19 17:19:52 -08001668 helpDestroy();
Jason Samsf5b45962009-08-25 14:49:07 -07001669 }
Jason Sams02fb2cb2009-05-28 15:37:57 -07001670
Jason Samsa9e7a052009-09-25 14:51:22 -07001671 boolean isAlive() {
1672 return mContext != 0;
1673 }
1674
Tim Murray460a0492013-11-19 12:45:54 -08001675 long safeID(BaseObj o) {
Jason Sams6b9dec02009-09-23 16:38:37 -07001676 if(o != null) {
Jason Samse07694b2012-04-03 15:36:36 -07001677 return o.getID(this);
Jason Samsd8e41612009-08-20 17:22:40 -07001678 }
Jason Sams6b9dec02009-09-23 16:38:37 -07001679 return 0;
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001680 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001681}