blob: 0f22568a9e2acc129a59e81d7e718375db98c339 [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
Tim Murray47f31582015-04-07 15:43:24 -070019import java.io.File;
Tim Murray2f2472c2013-08-22 14:55:26 -070020import java.lang.reflect.Method;
Miao Wang0facf022015-11-25 11:21:13 -080021import java.nio.ByteBuffer;
22import java.util.ArrayList;
Tim Murray06b45672014-01-07 11:13:56 -080023import java.util.concurrent.locks.ReentrantReadWriteLock;
Jason Sams36e612a2009-07-31 16:26:13 -070024
Shih-wei Liao6b32fab2010-12-10 01:03:59 -080025import android.content.Context;
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -080026import android.content.res.AssetManager;
Jason Samsb8c5a842009-07-31 20:40:47 -070027import android.graphics.Bitmap;
Jason Samsfaa32b32011-06-20 16:58:04 -070028import android.graphics.SurfaceTexture;
Dan Morrille4d9a012013-03-28 18:10:43 -070029import android.os.SystemProperties;
Tim Murray6d7a53c2013-05-23 16:59:23 -070030import android.os.Trace;
Miao Wang0facf022015-11-25 11:21:13 -080031import android.util.Log;
32import android.view.Surface;
Stephen Hines4382467a2011-08-01 15:02:34 -070033
Matt Wala36eb1f72015-07-20 15:35:27 -070034// TODO: Clean up the whitespace that separates methods in this class.
35
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070036/**
Tim Murrayc11e25c2013-04-09 11:01:01 -070037 * This class provides access to a RenderScript context, which controls RenderScript
38 * initialization, resource management, and teardown. An instance of the RenderScript
39 * class must be created before any other RS objects can be created.
Jason Sams27676fe2010-11-10 17:00:59 -080040 *
Joe Fernandez3aef8e1d2011-12-20 10:38:34 -080041 * <div class="special reference">
42 * <h3>Developer Guides</h3>
Tim Murrayc11e25c2013-04-09 11:01:01 -070043 * <p>For more information about creating an application that uses RenderScript, read the
44 * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer guide.</p>
Joe Fernandez3aef8e1d2011-12-20 10:38:34 -080045 * </div>
Jason Samse29d4712009-07-23 15:19:03 -070046 **/
Jack Palevich60aa3ea2009-05-26 13:45:08 -070047public class RenderScript {
Tim Murray6d7a53c2013-05-23 16:59:23 -070048 static final long TRACE_TAG = Trace.TRACE_TAG_RS;
49
Jason Sams3bc47d42009-11-12 15:10:25 -080050 static final String LOG_TAG = "RenderScript_jni";
Jason Samsbf6ef8d2010-12-06 15:59:59 -080051 static final boolean DEBUG = false;
Romain Guy650a3eb2009-08-31 14:06:43 -070052 @SuppressWarnings({"UnusedDeclaration", "deprecation"})
Joe Onorato43a17652011-04-06 19:22:23 -070053 static final boolean LOG_ENABLED = false;
Jack Palevich60aa3ea2009-05-26 13:45:08 -070054
Jason Samse16da122015-03-18 17:04:18 -070055 static private ArrayList<RenderScript> mProcessContextList = new ArrayList<RenderScript>();
56 private boolean mIsProcessContext = false;
57 private int mContextFlags = 0;
58 private int mContextSdkVersion = 0;
59
60
Shih-wei Liao6b32fab2010-12-10 01:03:59 -080061 private Context mApplicationContext;
Jack Palevich60aa3ea2009-05-26 13:45:08 -070062
Shih-wei Liao6b32fab2010-12-10 01:03:59 -080063 /*
Jack Palevich60aa3ea2009-05-26 13:45:08 -070064 * We use a class initializer to allow the native code to cache some
65 * field offsets.
66 */
Dan Morrille4d9a012013-03-28 18:10:43 -070067 @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"}) // TODO: now used locally; remove?
Jason Samsbf6ef8d2010-12-06 15:59:59 -080068 static boolean sInitialized;
69 native static void _nInit();
Jack Palevich60aa3ea2009-05-26 13:45:08 -070070
Tim Murray2f2472c2013-08-22 14:55:26 -070071 static Object sRuntime;
72 static Method registerNativeAllocation;
73 static Method registerNativeFree;
Jason Samsdba3ba52009-07-30 14:56:12 -070074
Jason Sams26e90512014-05-07 14:23:27 -070075 /*
Tim Murrayfd710e72014-06-06 11:10:45 -070076 * Context creation flag that specifies a normal context.
Jason Sams26e90512014-05-07 14:23:27 -070077 */
Tim Murrayfd710e72014-06-06 11:10:45 -070078 public static final int CREATE_FLAG_NONE = 0x0000;
Jason Sams26e90512014-05-07 14:23:27 -070079
80 /*
81 * Context creation flag which specifies a context optimized for low
82 * latency over peak performance. This is a hint and may have no effect
83 * on some implementations.
84 */
Tim Murrayfd710e72014-06-06 11:10:45 -070085 public static final int CREATE_FLAG_LOW_LATENCY = 0x0002;
Jason Sams26e90512014-05-07 14:23:27 -070086
87 /*
88 * Context creation flag which specifies a context optimized for long
89 * battery life over peak performance. This is a hint and may have no effect
90 * on some implementations.
91 */
Tim Murrayfd710e72014-06-06 11:10:45 -070092 public static final int CREATE_FLAG_LOW_POWER = 0x0004;
Jason Sams26e90512014-05-07 14:23:27 -070093
Stephen McGroarty62cb9bd2015-05-08 15:56:58 +010094 /**
95 * @hide
96 * Context creation flag which instructs the implementation to wait for
97 * a debugger to be attached before continuing execution.
98 */
99 public static final int CREATE_FLAG_WAIT_FOR_ATTACH = 0x0008;
100
verena beckhamc9659ea2015-05-22 16:47:53 +0100101
Tim Murray56f9e6f2014-05-16 11:47:26 -0700102 /*
103 * Detect the bitness of the VM to allow FieldPacker to do the right thing.
104 */
105 static native int rsnSystemGetPointerSize();
106 static int sPointerSize;
107
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700108 static {
109 sInitialized = false;
Dan Morrille4d9a012013-03-28 18:10:43 -0700110 if (!SystemProperties.getBoolean("config.disable_renderscript", false)) {
111 try {
Tim Murray2f2472c2013-08-22 14:55:26 -0700112 Class<?> vm_runtime = Class.forName("dalvik.system.VMRuntime");
113 Method get_runtime = vm_runtime.getDeclaredMethod("getRuntime");
114 sRuntime = get_runtime.invoke(null);
115 registerNativeAllocation = vm_runtime.getDeclaredMethod("registerNativeAllocation", Integer.TYPE);
116 registerNativeFree = vm_runtime.getDeclaredMethod("registerNativeFree", Integer.TYPE);
117 } catch (Exception e) {
118 Log.e(LOG_TAG, "Error loading GC methods: " + e);
119 throw new RSRuntimeException("Error loading GC methods: " + e);
120 }
121 try {
Dan Morrille4d9a012013-03-28 18:10:43 -0700122 System.loadLibrary("rs_jni");
123 _nInit();
124 sInitialized = true;
Tim Murray56f9e6f2014-05-16 11:47:26 -0700125 sPointerSize = rsnSystemGetPointerSize();
Dan Morrille4d9a012013-03-28 18:10:43 -0700126 } catch (UnsatisfiedLinkError e) {
127 Log.e(LOG_TAG, "Error loading RS jni library: " + e);
128 throw new RSRuntimeException("Error loading RS jni library: " + e);
129 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700130 }
131 }
132
Jason Sams2e1872f2010-08-17 16:25:41 -0700133 // Non-threadsafe functions.
Tim Murrayeff663f2013-11-15 13:08:30 -0800134 native long nDeviceCreate();
135 native void nDeviceDestroy(long dev);
136 native void nDeviceSetConfig(long dev, int param, int value);
137 native int nContextGetUserMessage(long con, int[] data);
138 native String nContextGetErrorMessage(long con);
139 native int nContextPeekMessage(long con, int[] subID);
140 native void nContextInitToClient(long con);
141 native void nContextDeinitToClient(long con);
Jason Sams3eaa3382009-06-10 15:04:38 -0700142
Tim Murray67cc2d02014-02-06 16:39:38 -0800143 // this should be a monotonically increasing ID
144 // used in conjunction with the API version of a device
Jason Samsf7642302015-05-12 14:06:56 -0700145 static final long sMinorVersion = 1;
Tim Murray67cc2d02014-02-06 16:39:38 -0800146
147 /**
Miao Wangf9d518a2015-05-14 14:53:30 -0700148 * @hide
149 *
150 * Only exist to be compatible with old version RenderScript Support lib.
151 * Will eventually be removed.
152 *
153 * @return Always return 1
154 *
155 */
156 public static long getMinorID() {
157 return 1;
158 }
159
160
161 /**
Tim Murray67cc2d02014-02-06 16:39:38 -0800162 * Returns an identifier that can be used to identify a particular
163 * minor version of RS.
164 *
Jason Sams6a420b52015-03-30 15:31:26 -0700165 * @return The minor RenderScript version number
166 *
Tim Murray67cc2d02014-02-06 16:39:38 -0800167 */
Jason Samsf7642302015-05-12 14:06:56 -0700168 public static long getMinorVersion() {
169 return sMinorVersion;
Tim Murray67cc2d02014-02-06 16:39:38 -0800170 }
171
Jason Sams02d56d92013-04-12 16:40:50 -0700172 /**
173 * ContextType specifies the specific type of context to be created.
174 *
175 */
Jason Samsadd26dc2013-02-22 18:43:45 -0800176 public enum ContextType {
Jason Sams02d56d92013-04-12 16:40:50 -0700177 /**
178 * NORMAL context, this is the default and what shipping apps should
179 * use.
180 */
Jason Samsadd26dc2013-02-22 18:43:45 -0800181 NORMAL (0),
Jason Sams02d56d92013-04-12 16:40:50 -0700182
183 /**
184 * DEBUG context, perform extra runtime checks to validate the
185 * kernels and APIs are being used as intended. Get and SetElementAt
186 * will be bounds checked in this mode.
187 */
Jason Samsadd26dc2013-02-22 18:43:45 -0800188 DEBUG (1),
Jason Sams02d56d92013-04-12 16:40:50 -0700189
190 /**
191 * PROFILE context, Intended to be used once the first time an
192 * application is run on a new device. This mode allows the runtime to
193 * do additional testing and performance tuning.
194 */
Jason Samsadd26dc2013-02-22 18:43:45 -0800195 PROFILE (2);
196
197 int mID;
198 ContextType(int id) {
199 mID = id;
200 }
201 }
Jason Sams718cd1f2009-12-23 14:35:29 -0800202
Stephen Hines42028a82013-04-17 19:22:01 -0700203 ContextType mContextType;
Tim Murray06b45672014-01-07 11:13:56 -0800204 ReentrantReadWriteLock mRWLock;
Stephen Hines42028a82013-04-17 19:22:01 -0700205
Jason Sams2e1872f2010-08-17 16:25:41 -0700206 // Methods below are wrapped to protect the non-threadsafe
207 // lockless fifo.
Tim Murrayeff663f2013-11-15 13:08:30 -0800208 native long rsnContextCreateGL(long dev, int ver, int sdkVer,
Jason Sams11c8af92010-10-13 15:31:10 -0700209 int colorMin, int colorPref,
210 int alphaMin, int alphaPref,
211 int depthMin, int depthPref,
212 int stencilMin, int stencilPref,
Alex Sakhartchouk2c74ad92011-03-16 19:28:25 -0700213 int samplesMin, int samplesPref, float samplesQ, int dpi);
Tim Murrayeff663f2013-11-15 13:08:30 -0800214 synchronized long nContextCreateGL(long dev, int ver, int sdkVer,
Jason Sams11c8af92010-10-13 15:31:10 -0700215 int colorMin, int colorPref,
216 int alphaMin, int alphaPref,
217 int depthMin, int depthPref,
218 int stencilMin, int stencilPref,
Alex Sakhartchouk2c74ad92011-03-16 19:28:25 -0700219 int samplesMin, int samplesPref, float samplesQ, int dpi) {
Stephen Hines4382467a2011-08-01 15:02:34 -0700220 return rsnContextCreateGL(dev, ver, sdkVer, colorMin, colorPref,
Jason Sams11c8af92010-10-13 15:31:10 -0700221 alphaMin, alphaPref, depthMin, depthPref,
222 stencilMin, stencilPref,
Alex Sakhartchouk2c74ad92011-03-16 19:28:25 -0700223 samplesMin, samplesPref, samplesQ, dpi);
Jason Sams2e1872f2010-08-17 16:25:41 -0700224 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800225 native long rsnContextCreate(long dev, int ver, int sdkVer, int contextType);
226 synchronized long nContextCreate(long dev, int ver, int sdkVer, int contextType) {
Jason Samsadd26dc2013-02-22 18:43:45 -0800227 return rsnContextCreate(dev, ver, sdkVer, contextType);
Jason Sams2e1872f2010-08-17 16:25:41 -0700228 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800229 native void rsnContextDestroy(long con);
Jason Sams2e1872f2010-08-17 16:25:41 -0700230 synchronized void nContextDestroy() {
Jason Samsd1ac9812011-01-18 18:12:26 -0800231 validate();
Tim Murray06b45672014-01-07 11:13:56 -0800232
233 // take teardown lock
234 // teardown lock can only be taken when no objects are being destroyed
235 ReentrantReadWriteLock.WriteLock wlock = mRWLock.writeLock();
236 wlock.lock();
237
238 long curCon = mContext;
239 // context is considered dead as of this point
240 mContext = 0;
241
242 wlock.unlock();
243 rsnContextDestroy(curCon);
Jason Sams2e1872f2010-08-17 16:25:41 -0700244 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800245 native void rsnContextSetSurface(long con, int w, int h, Surface sur);
Jason Sams2e1872f2010-08-17 16:25:41 -0700246 synchronized void nContextSetSurface(int w, int h, Surface sur) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800247 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700248 rsnContextSetSurface(mContext, w, h, sur);
249 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800250 native void rsnContextSetSurfaceTexture(long con, int w, int h, SurfaceTexture sur);
Jason Samsfaa32b32011-06-20 16:58:04 -0700251 synchronized void nContextSetSurfaceTexture(int w, int h, SurfaceTexture sur) {
252 validate();
253 rsnContextSetSurfaceTexture(mContext, w, h, sur);
254 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800255 native void rsnContextSetPriority(long con, int p);
Jason Sams2e1872f2010-08-17 16:25:41 -0700256 synchronized void nContextSetPriority(int p) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800257 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700258 rsnContextSetPriority(mContext, p);
259 }
Tim Murray47f31582015-04-07 15:43:24 -0700260 native void rsnContextSetCacheDir(long con, String cacheDir);
261 synchronized void nContextSetCacheDir(String cacheDir) {
262 validate();
263 rsnContextSetCacheDir(mContext, cacheDir);
264 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800265 native void rsnContextDump(long con, int bits);
Jason Sams2e1872f2010-08-17 16:25:41 -0700266 synchronized void nContextDump(int bits) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800267 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700268 rsnContextDump(mContext, bits);
269 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800270 native void rsnContextFinish(long con);
Jason Sams2e1872f2010-08-17 16:25:41 -0700271 synchronized void nContextFinish() {
Jason Samsd1ac9812011-01-18 18:12:26 -0800272 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700273 rsnContextFinish(mContext);
274 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700275
Tim Murrayeff663f2013-11-15 13:08:30 -0800276 native void rsnContextSendMessage(long con, int id, int[] data);
Jason Sams455d6442013-02-05 19:20:18 -0800277 synchronized void nContextSendMessage(int id, int[] data) {
278 validate();
279 rsnContextSendMessage(mContext, id, data);
280 }
281
Narayan Kamath78c0ce52014-03-19 10:15:51 +0000282 native void rsnContextBindRootScript(long con, long script);
283 synchronized void nContextBindRootScript(long script) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800284 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700285 rsnContextBindRootScript(mContext, script);
286 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800287 native void rsnContextBindSampler(long con, int sampler, int slot);
Jason Sams2e1872f2010-08-17 16:25:41 -0700288 synchronized void nContextBindSampler(int sampler, int slot) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800289 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700290 rsnContextBindSampler(mContext, sampler, slot);
291 }
Narayan Kamath78c0ce52014-03-19 10:15:51 +0000292 native void rsnContextBindProgramStore(long con, long pfs);
293 synchronized void nContextBindProgramStore(long pfs) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800294 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700295 rsnContextBindProgramStore(mContext, pfs);
296 }
Narayan Kamath78c0ce52014-03-19 10:15:51 +0000297 native void rsnContextBindProgramFragment(long con, long pf);
298 synchronized void nContextBindProgramFragment(long pf) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800299 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700300 rsnContextBindProgramFragment(mContext, pf);
301 }
Narayan Kamath78c0ce52014-03-19 10:15:51 +0000302 native void rsnContextBindProgramVertex(long con, long pv);
303 synchronized void nContextBindProgramVertex(long pv) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800304 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700305 rsnContextBindProgramVertex(mContext, pv);
306 }
Narayan Kamath78c0ce52014-03-19 10:15:51 +0000307 native void rsnContextBindProgramRaster(long con, long pr);
308 synchronized void nContextBindProgramRaster(long pr) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800309 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700310 rsnContextBindProgramRaster(mContext, pr);
311 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800312 native void rsnContextPause(long con);
Jason Sams2e1872f2010-08-17 16:25:41 -0700313 synchronized void nContextPause() {
Jason Samsd1ac9812011-01-18 18:12:26 -0800314 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700315 rsnContextPause(mContext);
316 }
Tim Murrayeff663f2013-11-15 13:08:30 -0800317 native void rsnContextResume(long con);
Jason Sams2e1872f2010-08-17 16:25:41 -0700318 synchronized void nContextResume() {
Jason Samsd1ac9812011-01-18 18:12:26 -0800319 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700320 rsnContextResume(mContext);
321 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700322
Yang Ni281c3252014-10-24 08:52:24 -0700323 native long rsnClosureCreate(long con, long kernelID, long returnValue,
324 long[] fieldIDs, long[] values, int[] sizes, long[] depClosures,
325 long[] depFieldIDs);
326 synchronized long nClosureCreate(long kernelID, long returnValue,
327 long[] fieldIDs, long[] values, int[] sizes, long[] depClosures,
328 long[] depFieldIDs) {
329 validate();
Yang Ni17c2d7a2015-04-30 16:13:54 -0700330 long c = rsnClosureCreate(mContext, kernelID, returnValue, fieldIDs, values,
Yang Ni281c3252014-10-24 08:52:24 -0700331 sizes, depClosures, depFieldIDs);
Yang Ni17c2d7a2015-04-30 16:13:54 -0700332 if (c == 0) {
333 throw new RSRuntimeException("Failed creating closure.");
334 }
335 return c;
Yang Ni281c3252014-10-24 08:52:24 -0700336 }
337
Yang Nibe392ad2015-01-23 17:16:02 -0800338 native long rsnInvokeClosureCreate(long con, long invokeID, byte[] params,
339 long[] fieldIDs, long[] values, int[] sizes);
340 synchronized long nInvokeClosureCreate(long invokeID, byte[] params,
341 long[] fieldIDs, long[] values, int[] sizes) {
342 validate();
Yang Ni17c2d7a2015-04-30 16:13:54 -0700343 long c = rsnInvokeClosureCreate(mContext, invokeID, params, fieldIDs,
Yang Nibe392ad2015-01-23 17:16:02 -0800344 values, sizes);
Yang Ni17c2d7a2015-04-30 16:13:54 -0700345 if (c == 0) {
346 throw new RSRuntimeException("Failed creating closure.");
347 }
348 return c;
Yang Nibe392ad2015-01-23 17:16:02 -0800349 }
350
Yang Ni281c3252014-10-24 08:52:24 -0700351 native void rsnClosureSetArg(long con, long closureID, int index,
352 long value, int size);
353 synchronized void nClosureSetArg(long closureID, int index, long value,
354 int size) {
355 validate();
356 rsnClosureSetArg(mContext, closureID, index, value, size);
357 }
358
359 native void rsnClosureSetGlobal(long con, long closureID, long fieldID,
360 long value, int size);
361 // Does this have to be synchronized?
362 synchronized void nClosureSetGlobal(long closureID, long fieldID,
363 long value, int size) {
364 validate(); // TODO: is this necessary?
365 rsnClosureSetGlobal(mContext, closureID, fieldID, value, size);
366 }
367
Yang Ni35be56c2015-04-02 17:47:56 -0700368 native long rsnScriptGroup2Create(long con, String name, String cachePath,
369 long[] closures);
370 synchronized long nScriptGroup2Create(String name, String cachePath,
371 long[] closures) {
Yang Ni281c3252014-10-24 08:52:24 -0700372 validate();
Yang Ni17c2d7a2015-04-30 16:13:54 -0700373 long g = rsnScriptGroup2Create(mContext, name, cachePath, closures);
374 if (g == 0) {
375 throw new RSRuntimeException("Failed creating script group.");
376 }
377 return g;
Yang Ni281c3252014-10-24 08:52:24 -0700378 }
379
380 native void rsnScriptGroup2Execute(long con, long groupID);
381 synchronized void nScriptGroup2Execute(long groupID) {
382 validate();
383 rsnScriptGroup2Execute(mContext, groupID);
384 }
385
Tim Murray460a0492013-11-19 12:45:54 -0800386 native void rsnAssignName(long con, long obj, byte[] name);
387 synchronized void nAssignName(long obj, byte[] name) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800388 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700389 rsnAssignName(mContext, obj, name);
390 }
Tim Murray460a0492013-11-19 12:45:54 -0800391 native String rsnGetName(long con, long obj);
392 synchronized String nGetName(long obj) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800393 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700394 return rsnGetName(mContext, obj);
395 }
Tim Murray06b45672014-01-07 11:13:56 -0800396
397 // nObjDestroy is explicitly _not_ synchronous to prevent crashes in finalizers
Tim Murray460a0492013-11-19 12:45:54 -0800398 native void rsnObjDestroy(long con, long id);
Tim Murray06b45672014-01-07 11:13:56 -0800399 void nObjDestroy(long id) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800400 // There is a race condition here. The calling code may be run
401 // by the gc while teardown is occuring. This protects againts
402 // deleting dead objects.
403 if (mContext != 0) {
404 rsnObjDestroy(mContext, id);
405 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700406 }
Jason Samsfe08d992009-05-27 14:45:32 -0700407
Tim Murray460a0492013-11-19 12:45:54 -0800408 native long rsnElementCreate(long con, long type, int kind, boolean norm, int vecSize);
409 synchronized long nElementCreate(long type, int kind, boolean norm, int vecSize) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800410 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700411 return rsnElementCreate(mContext, type, kind, norm, vecSize);
412 }
Ashok Bhat98071552014-02-12 09:54:43 +0000413 native long rsnElementCreate2(long con, long[] elements, String[] names, int[] arraySizes);
414 synchronized long nElementCreate2(long[] elements, String[] names, int[] arraySizes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800415 validate();
Jason Sams70d4e502010-09-02 17:35:23 -0700416 return rsnElementCreate2(mContext, elements, names, arraySizes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700417 }
Tim Murray460a0492013-11-19 12:45:54 -0800418 native void rsnElementGetNativeData(long con, long id, int[] elementData);
419 synchronized void nElementGetNativeData(long id, int[] elementData) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800420 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700421 rsnElementGetNativeData(mContext, id, elementData);
422 }
Tim Murray460a0492013-11-19 12:45:54 -0800423 native void rsnElementGetSubElements(long con, long id,
Ashok Bhat98071552014-02-12 09:54:43 +0000424 long[] IDs, String[] names, int[] arraySizes);
425 synchronized void nElementGetSubElements(long id, long[] IDs, String[] names, int[] arraySizes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800426 validate();
Alex Sakhartchouk7d5f5e72011-10-18 11:08:31 -0700427 rsnElementGetSubElements(mContext, id, IDs, names, arraySizes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700428 }
Jason Sams768bc022009-09-21 19:41:04 -0700429
Tim Murray460a0492013-11-19 12:45:54 -0800430 native long rsnTypeCreate(long con, long eid, int x, int y, int z, boolean mips, boolean faces, int yuv);
431 synchronized long nTypeCreate(long eid, int x, int y, int z, boolean mips, boolean faces, int yuv) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800432 validate();
Jason Samsb109cc72013-01-07 18:20:12 -0800433 return rsnTypeCreate(mContext, eid, x, y, z, mips, faces, yuv);
Jason Sams2e1872f2010-08-17 16:25:41 -0700434 }
Ashok Bhat98071552014-02-12 09:54:43 +0000435 native void rsnTypeGetNativeData(long con, long id, long[] typeData);
436 synchronized void nTypeGetNativeData(long id, long[] typeData) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800437 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700438 rsnTypeGetNativeData(mContext, id, typeData);
439 }
Jason Sams768bc022009-09-21 19:41:04 -0700440
Ashok Bhat98071552014-02-12 09:54:43 +0000441 native long rsnAllocationCreateTyped(long con, long type, int mip, int usage, long pointer);
442 synchronized long nAllocationCreateTyped(long type, int mip, int usage, long pointer) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800443 validate();
Jason Sams857d0c72011-11-23 15:02:15 -0800444 return rsnAllocationCreateTyped(mContext, type, mip, usage, pointer);
Jason Sams2e1872f2010-08-17 16:25:41 -0700445 }
Tim Murray460a0492013-11-19 12:45:54 -0800446 native long rsnAllocationCreateFromBitmap(long con, long type, int mip, Bitmap bmp, int usage);
447 synchronized long nAllocationCreateFromBitmap(long type, int mip, Bitmap bmp, int usage) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800448 validate();
Jason Sams5476b452010-12-08 16:14:36 -0800449 return rsnAllocationCreateFromBitmap(mContext, type, mip, bmp, usage);
Alex Sakhartchouk26ae3902010-10-11 12:35:15 -0700450 }
Tim Murraya3145512012-12-04 17:59:29 -0800451
Tim Murray460a0492013-11-19 12:45:54 -0800452 native long rsnAllocationCreateBitmapBackedAllocation(long con, long type, int mip, Bitmap bmp, int usage);
453 synchronized long nAllocationCreateBitmapBackedAllocation(long type, int mip, Bitmap bmp, int usage) {
Tim Murraya3145512012-12-04 17:59:29 -0800454 validate();
455 return rsnAllocationCreateBitmapBackedAllocation(mContext, type, mip, bmp, usage);
456 }
457
Tim Murray460a0492013-11-19 12:45:54 -0800458 native long rsnAllocationCubeCreateFromBitmap(long con, long type, int mip, Bitmap bmp, int usage);
459 synchronized long nAllocationCubeCreateFromBitmap(long type, int mip, Bitmap bmp, int usage) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800460 validate();
Jason Sams5476b452010-12-08 16:14:36 -0800461 return rsnAllocationCubeCreateFromBitmap(mContext, type, mip, bmp, usage);
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -0800462 }
Tim Murray460a0492013-11-19 12:45:54 -0800463 native long rsnAllocationCreateBitmapRef(long con, long type, Bitmap bmp);
464 synchronized long nAllocationCreateBitmapRef(long type, Bitmap bmp) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800465 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700466 return rsnAllocationCreateBitmapRef(mContext, type, bmp);
467 }
Tim Murray460a0492013-11-19 12:45:54 -0800468 native long rsnAllocationCreateFromAssetStream(long con, int mips, int assetStream, int usage);
469 synchronized long nAllocationCreateFromAssetStream(int mips, int assetStream, int usage) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800470 validate();
Jason Sams5476b452010-12-08 16:14:36 -0800471 return rsnAllocationCreateFromAssetStream(mContext, mips, assetStream, usage);
472 }
473
Tim Murray460a0492013-11-19 12:45:54 -0800474 native void rsnAllocationCopyToBitmap(long con, long alloc, Bitmap bmp);
475 synchronized void nAllocationCopyToBitmap(long alloc, Bitmap bmp) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800476 validate();
Jason Sams4ef66502010-12-10 16:03:15 -0800477 rsnAllocationCopyToBitmap(mContext, alloc, bmp);
478 }
479
Tim Murray460a0492013-11-19 12:45:54 -0800480 native void rsnAllocationSyncAll(long con, long alloc, int src);
481 synchronized void nAllocationSyncAll(long alloc, int src) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800482 validate();
Jason Sams5476b452010-12-08 16:14:36 -0800483 rsnAllocationSyncAll(mContext, alloc, src);
484 }
Miao Wang0facf022015-11-25 11:21:13 -0800485
486 native ByteBuffer rsnAllocationGetByteBuffer(long con, long alloc, long[] stride, int xBytesSize, int dimY, int dimZ);
487 synchronized ByteBuffer nAllocationGetByteBuffer(long alloc, long[] stride, int xBytesSize, int dimY, int dimZ) {
488 validate();
489 return rsnAllocationGetByteBuffer(mContext, alloc, stride, xBytesSize, dimY, dimZ);
490 }
491
Miao Wang8c150922015-10-26 17:44:10 -0700492 native void rsnAllocationSetupBufferQueue(long con, long alloc, int numAlloc);
493 synchronized void nAllocationSetupBufferQueue(long alloc, int numAlloc) {
494 validate();
495 rsnAllocationSetupBufferQueue(mContext, alloc, numAlloc);
496 }
497 native void rsnAllocationShareBufferQueue(long con, long alloc1, long alloc2);
498 synchronized void nAllocationShareBufferQueue(long alloc1, long alloc2) {
499 validate();
500 rsnAllocationShareBufferQueue(mContext, alloc1, alloc2);
501 }
Tim Murray460a0492013-11-19 12:45:54 -0800502 native Surface rsnAllocationGetSurface(long con, long alloc);
503 synchronized Surface nAllocationGetSurface(long alloc) {
Jason Sams615e7ce2012-01-13 14:01:20 -0800504 validate();
Jason Sams72226e02013-02-22 12:45:54 -0800505 return rsnAllocationGetSurface(mContext, alloc);
Jason Samsfe1d5ff2012-03-23 11:47:26 -0700506 }
Tim Murray460a0492013-11-19 12:45:54 -0800507 native void rsnAllocationSetSurface(long con, long alloc, Surface sur);
508 synchronized void nAllocationSetSurface(long alloc, Surface sur) {
Jason Sams163766c2012-02-15 12:04:24 -0800509 validate();
Jason Samsfb9aa9f2012-03-28 15:30:07 -0700510 rsnAllocationSetSurface(mContext, alloc, sur);
Jason Sams163766c2012-02-15 12:04:24 -0800511 }
Tim Murray460a0492013-11-19 12:45:54 -0800512 native void rsnAllocationIoSend(long con, long alloc);
513 synchronized void nAllocationIoSend(long alloc) {
Jason Sams163766c2012-02-15 12:04:24 -0800514 validate();
515 rsnAllocationIoSend(mContext, alloc);
516 }
Miao Wang8c150922015-10-26 17:44:10 -0700517 native long rsnAllocationIoReceive(long con, long alloc);
518 synchronized long nAllocationIoReceive(long alloc) {
Jason Sams163766c2012-02-15 12:04:24 -0800519 validate();
Miao Wang8c150922015-10-26 17:44:10 -0700520 return rsnAllocationIoReceive(mContext, alloc);
Jason Sams163766c2012-02-15 12:04:24 -0800521 }
522
Tim Murray460a0492013-11-19 12:45:54 -0800523 native void rsnAllocationGenerateMipmaps(long con, long alloc);
524 synchronized void nAllocationGenerateMipmaps(long alloc) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800525 validate();
Jason Samsf7086092011-01-12 13:28:37 -0800526 rsnAllocationGenerateMipmaps(mContext, alloc);
527 }
Tim Murray460a0492013-11-19 12:45:54 -0800528 native void rsnAllocationCopyFromBitmap(long con, long alloc, Bitmap bmp);
529 synchronized void nAllocationCopyFromBitmap(long alloc, Bitmap bmp) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800530 validate();
Jason Sams4ef66502010-12-10 16:03:15 -0800531 rsnAllocationCopyFromBitmap(mContext, alloc, bmp);
Jason Sams2e1872f2010-08-17 16:25:41 -0700532 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700533
Jason Sams49a05d72010-12-29 14:31:29 -0800534
Miao Wang87e908d2015-03-02 15:15:15 -0800535 native void rsnAllocationData1D(long con, long id, int off, int mip, int count, Object d, int sizeBytes, int dt,
536 int mSize, boolean usePadding);
537 synchronized void nAllocationData1D(long id, int off, int mip, int count, Object d, int sizeBytes, Element.DataType dt,
538 int mSize, boolean usePadding) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800539 validate();
Miao Wang87e908d2015-03-02 15:15:15 -0800540 rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes, dt.mID, mSize, usePadding);
Jason Sams2e1872f2010-08-17 16:25:41 -0700541 }
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -0700542
Miao Wangc8e237e2015-02-20 18:36:32 -0800543 native void rsnAllocationElementData(long con,long id, int xoff, int yoff, int zoff, int mip, int compIdx, byte[] d, int sizeBytes);
544 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 -0800545 validate();
Miao Wangc8e237e2015-02-20 18:36:32 -0800546 rsnAllocationElementData(mContext, id, xoff, yoff, zoff, mip, compIdx, d, sizeBytes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700547 }
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700548
Tim Murrayeff663f2013-11-15 13:08:30 -0800549 native void rsnAllocationData2D(long con,
Tim Murray460a0492013-11-19 12:45:54 -0800550 long dstAlloc, int dstXoff, int dstYoff,
Alex Sakhartchouk304b1f52011-06-14 11:13:19 -0700551 int dstMip, int dstFace,
552 int width, int height,
Tim Murray460a0492013-11-19 12:45:54 -0800553 long srcAlloc, int srcXoff, int srcYoff,
Alex Sakhartchouk304b1f52011-06-14 11:13:19 -0700554 int srcMip, int srcFace);
Tim Murray460a0492013-11-19 12:45:54 -0800555 synchronized void nAllocationData2D(long dstAlloc, int dstXoff, int dstYoff,
Alex Sakhartchouk304b1f52011-06-14 11:13:19 -0700556 int dstMip, int dstFace,
557 int width, int height,
Tim Murray460a0492013-11-19 12:45:54 -0800558 long srcAlloc, int srcXoff, int srcYoff,
Alex Sakhartchouk304b1f52011-06-14 11:13:19 -0700559 int srcMip, int srcFace) {
560 validate();
561 rsnAllocationData2D(mContext,
562 dstAlloc, dstXoff, dstYoff,
563 dstMip, dstFace,
564 width, height,
565 srcAlloc, srcXoff, srcYoff,
566 srcMip, srcFace);
567 }
568
Tim Murray460a0492013-11-19 12:45:54 -0800569 native void rsnAllocationData2D(long con, long id, int xoff, int yoff, int mip, int face,
Miao Wang87e908d2015-03-02 15:15:15 -0800570 int w, int h, Object d, int sizeBytes, int dt,
571 int mSize, boolean usePadding);
Tim Murray460a0492013-11-19 12:45:54 -0800572 synchronized void nAllocationData2D(long id, int xoff, int yoff, int mip, int face,
Miao Wang87e908d2015-03-02 15:15:15 -0800573 int w, int h, Object d, int sizeBytes, Element.DataType dt,
574 int mSize, boolean usePadding) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800575 validate();
Miao Wang87e908d2015-03-02 15:15:15 -0800576 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes, dt.mID, mSize, usePadding);
Jason Sams2e1872f2010-08-17 16:25:41 -0700577 }
Jason Sams21659ac2013-11-06 15:08:07 -0800578
Tim Murray460a0492013-11-19 12:45:54 -0800579 native void rsnAllocationData2D(long con, long id, int xoff, int yoff, int mip, int face, Bitmap b);
580 synchronized void nAllocationData2D(long id, int xoff, int yoff, int mip, int face, Bitmap b) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800581 validate();
Jason Samsfa445b92011-01-07 17:00:07 -0800582 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, b);
583 }
Jason Sams49a05d72010-12-29 14:31:29 -0800584
Tim Murrayeff663f2013-11-15 13:08:30 -0800585 native void rsnAllocationData3D(long con,
Tim Murray460a0492013-11-19 12:45:54 -0800586 long dstAlloc, int dstXoff, int dstYoff, int dstZoff,
Jason Samsb05d6892013-04-09 15:59:24 -0700587 int dstMip,
588 int width, int height, int depth,
Tim Murray460a0492013-11-19 12:45:54 -0800589 long srcAlloc, int srcXoff, int srcYoff, int srcZoff,
Jason Samsb05d6892013-04-09 15:59:24 -0700590 int srcMip);
Tim Murray460a0492013-11-19 12:45:54 -0800591 synchronized void nAllocationData3D(long dstAlloc, int dstXoff, int dstYoff, int dstZoff,
Jason Samsb05d6892013-04-09 15:59:24 -0700592 int dstMip,
593 int width, int height, int depth,
Tim Murray460a0492013-11-19 12:45:54 -0800594 long srcAlloc, int srcXoff, int srcYoff, int srcZoff,
Jason Samsb05d6892013-04-09 15:59:24 -0700595 int srcMip) {
596 validate();
597 rsnAllocationData3D(mContext,
598 dstAlloc, dstXoff, dstYoff, dstZoff,
599 dstMip, width, height, depth,
600 srcAlloc, srcXoff, srcYoff, srcZoff, srcMip);
601 }
602
Tim Murray460a0492013-11-19 12:45:54 -0800603 native void rsnAllocationData3D(long con, long id, int xoff, int yoff, int zoff, int mip,
Miao Wang87e908d2015-03-02 15:15:15 -0800604 int w, int h, int depth, Object d, int sizeBytes, int dt,
605 int mSize, boolean usePadding);
Tim Murray460a0492013-11-19 12:45:54 -0800606 synchronized void nAllocationData3D(long id, int xoff, int yoff, int zoff, int mip,
Miao Wang87e908d2015-03-02 15:15:15 -0800607 int w, int h, int depth, Object d, int sizeBytes, Element.DataType dt,
608 int mSize, boolean usePadding) {
Jason Samsb05d6892013-04-09 15:59:24 -0700609 validate();
Miao Wang87e908d2015-03-02 15:15:15 -0800610 rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes,
611 dt.mID, mSize, usePadding);
Jason Samsb05d6892013-04-09 15:59:24 -0700612 }
Jason Samsb05d6892013-04-09 15:59:24 -0700613
Miao Wang87e908d2015-03-02 15:15:15 -0800614 native void rsnAllocationRead(long con, long id, Object d, int dt, int mSize, boolean usePadding);
615 synchronized void nAllocationRead(long id, Object d, Element.DataType dt, int mSize, boolean usePadding) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800616 validate();
Miao Wang87e908d2015-03-02 15:15:15 -0800617 rsnAllocationRead(mContext, id, d, dt.mID, mSize, usePadding);
Jason Samsfa445b92011-01-07 17:00:07 -0800618 }
Jason Sams21659ac2013-11-06 15:08:07 -0800619
Tim Murray460a0492013-11-19 12:45:54 -0800620 native void rsnAllocationRead1D(long con, long id, int off, int mip, int count, Object d,
Miao Wang87e908d2015-03-02 15:15:15 -0800621 int sizeBytes, int dt, int mSize, boolean usePadding);
Tim Murray460a0492013-11-19 12:45:54 -0800622 synchronized void nAllocationRead1D(long id, int off, int mip, int count, Object d,
Miao Wang87e908d2015-03-02 15:15:15 -0800623 int sizeBytes, Element.DataType dt, int mSize, boolean usePadding) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800624 validate();
Miao Wang87e908d2015-03-02 15:15:15 -0800625 rsnAllocationRead1D(mContext, id, off, mip, count, d, sizeBytes, dt.mID, mSize, usePadding);
Jason Samsfa445b92011-01-07 17:00:07 -0800626 }
Jason Sams21659ac2013-11-06 15:08:07 -0800627
Miao Wangc8e237e2015-02-20 18:36:32 -0800628 native void rsnAllocationElementRead(long con,long id, int xoff, int yoff, int zoff,
Miao Wang45cec0a2015-03-04 16:40:21 -0800629 int mip, int compIdx, byte[] d, int sizeBytes);
Miao Wangc8e237e2015-02-20 18:36:32 -0800630 synchronized void nAllocationElementRead(long id, int xoff, int yoff, int zoff,
Miao Wang45cec0a2015-03-04 16:40:21 -0800631 int mip, int compIdx, byte[] d, int sizeBytes) {
Miao Wangc8e237e2015-02-20 18:36:32 -0800632 validate();
Miao Wang45cec0a2015-03-04 16:40:21 -0800633 rsnAllocationElementRead(mContext, id, xoff, yoff, zoff, mip, compIdx, d, sizeBytes);
Miao Wangc8e237e2015-02-20 18:36:32 -0800634 }
635
Tim Murray460a0492013-11-19 12:45:54 -0800636 native void rsnAllocationRead2D(long con, long id, int xoff, int yoff, int mip, int face,
Miao Wang87e908d2015-03-02 15:15:15 -0800637 int w, int h, Object d, int sizeBytes, int dt,
638 int mSize, boolean usePadding);
Tim Murray460a0492013-11-19 12:45:54 -0800639 synchronized void nAllocationRead2D(long id, int xoff, int yoff, int mip, int face,
Miao Wang87e908d2015-03-02 15:15:15 -0800640 int w, int h, Object d, int sizeBytes, Element.DataType dt,
641 int mSize, boolean usePadding) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800642 validate();
Miao Wang87e908d2015-03-02 15:15:15 -0800643 rsnAllocationRead2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes, dt.mID, mSize, usePadding);
Jason Sams2e1872f2010-08-17 16:25:41 -0700644 }
Jason Sams21659ac2013-11-06 15:08:07 -0800645
Miao Wangc8e237e2015-02-20 18:36:32 -0800646 native void rsnAllocationRead3D(long con, long id, int xoff, int yoff, int zoff, int mip,
Miao Wang87e908d2015-03-02 15:15:15 -0800647 int w, int h, int depth, Object d, int sizeBytes, int dt,
648 int mSize, boolean usePadding);
Miao Wangc8e237e2015-02-20 18:36:32 -0800649 synchronized void nAllocationRead3D(long id, int xoff, int yoff, int zoff, int mip,
Miao Wang87e908d2015-03-02 15:15:15 -0800650 int w, int h, int depth, Object d, int sizeBytes, Element.DataType dt,
651 int mSize, boolean usePadding) {
Miao Wangc8e237e2015-02-20 18:36:32 -0800652 validate();
Miao Wang87e908d2015-03-02 15:15:15 -0800653 rsnAllocationRead3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes, dt.mID, mSize, usePadding);
Miao Wangc8e237e2015-02-20 18:36:32 -0800654 }
655
Tim Murray460a0492013-11-19 12:45:54 -0800656 native long rsnAllocationGetType(long con, long id);
657 synchronized long nAllocationGetType(long id) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800658 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700659 return rsnAllocationGetType(mContext, id);
660 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700661
Tim Murray460a0492013-11-19 12:45:54 -0800662 native void rsnAllocationResize1D(long con, long id, int dimX);
663 synchronized void nAllocationResize1D(long id, int dimX) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800664 validate();
Jason Sams5edc6082010-10-05 13:32:49 -0700665 rsnAllocationResize1D(mContext, id, dimX);
666 }
Jason Sams5edc6082010-10-05 13:32:49 -0700667
Jason Sams46ba27e32015-02-06 17:45:15 -0800668 native long rsnAllocationAdapterCreate(long con, long allocId, long typeId);
669 synchronized long nAllocationAdapterCreate(long allocId, long typeId) {
670 validate();
671 return rsnAllocationAdapterCreate(mContext, allocId, typeId);
672 }
673
674 native void rsnAllocationAdapterOffset(long con, long id, int x, int y, int z,
675 int mip, int face, int a1, int a2, int a3, int a4);
676 synchronized void nAllocationAdapterOffset(long id, int x, int y, int z,
677 int mip, int face, int a1, int a2, int a3, int a4) {
678 validate();
679 rsnAllocationAdapterOffset(mContext, id, x, y, z, mip, face, a1, a2, a3, a4);
680 }
681
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000682 native long rsnFileA3DCreateFromAssetStream(long con, long assetStream);
683 synchronized long nFileA3DCreateFromAssetStream(long assetStream) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800684 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700685 return rsnFileA3DCreateFromAssetStream(mContext, assetStream);
686 }
Tim Murray460a0492013-11-19 12:45:54 -0800687 native long rsnFileA3DCreateFromFile(long con, String path);
688 synchronized long nFileA3DCreateFromFile(String path) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800689 validate();
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800690 return rsnFileA3DCreateFromFile(mContext, path);
691 }
Tim Murray460a0492013-11-19 12:45:54 -0800692 native long rsnFileA3DCreateFromAsset(long con, AssetManager mgr, String path);
693 synchronized long nFileA3DCreateFromAsset(AssetManager mgr, String path) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800694 validate();
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800695 return rsnFileA3DCreateFromAsset(mContext, mgr, path);
696 }
Tim Murray460a0492013-11-19 12:45:54 -0800697 native int rsnFileA3DGetNumIndexEntries(long con, long fileA3D);
698 synchronized int nFileA3DGetNumIndexEntries(long fileA3D) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800699 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700700 return rsnFileA3DGetNumIndexEntries(mContext, fileA3D);
701 }
Tim Murray460a0492013-11-19 12:45:54 -0800702 native void rsnFileA3DGetIndexEntries(long con, long fileA3D, int numEntries, int[] IDs, String[] names);
703 synchronized void nFileA3DGetIndexEntries(long fileA3D, int numEntries, int[] IDs, String[] names) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800704 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700705 rsnFileA3DGetIndexEntries(mContext, fileA3D, numEntries, IDs, names);
706 }
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000707 native long rsnFileA3DGetEntryByIndex(long con, long fileA3D, int index);
708 synchronized long nFileA3DGetEntryByIndex(long fileA3D, int index) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800709 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700710 return rsnFileA3DGetEntryByIndex(mContext, fileA3D, index);
711 }
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700712
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000713 native long rsnFontCreateFromFile(long con, String fileName, float size, int dpi);
714 synchronized long nFontCreateFromFile(String fileName, float size, int dpi) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800715 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700716 return rsnFontCreateFromFile(mContext, fileName, size, dpi);
717 }
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000718 native long rsnFontCreateFromAssetStream(long con, String name, float size, int dpi, long assetStream);
719 synchronized long nFontCreateFromAssetStream(String name, float size, int dpi, long assetStream) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800720 validate();
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800721 return rsnFontCreateFromAssetStream(mContext, name, size, dpi, assetStream);
722 }
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000723 native long rsnFontCreateFromAsset(long con, AssetManager mgr, String path, float size, int dpi);
724 synchronized long nFontCreateFromAsset(AssetManager mgr, String path, float size, int dpi) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800725 validate();
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800726 return rsnFontCreateFromAsset(mContext, mgr, path, size, dpi);
727 }
Jason Sams22534172009-08-04 16:58:20 -0700728
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700729
Tim Murray460a0492013-11-19 12:45:54 -0800730 native void rsnScriptBindAllocation(long con, long script, long alloc, int slot);
731 synchronized void nScriptBindAllocation(long script, long alloc, int slot) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800732 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700733 rsnScriptBindAllocation(mContext, script, alloc, slot);
734 }
Tim Murray460a0492013-11-19 12:45:54 -0800735 native void rsnScriptSetTimeZone(long con, long script, byte[] timeZone);
736 synchronized void nScriptSetTimeZone(long script, byte[] timeZone) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800737 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700738 rsnScriptSetTimeZone(mContext, script, timeZone);
739 }
Tim Murray460a0492013-11-19 12:45:54 -0800740 native void rsnScriptInvoke(long con, long id, int slot);
741 synchronized void nScriptInvoke(long id, int slot) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800742 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700743 rsnScriptInvoke(mContext, id, slot);
744 }
Chris Wailesbe7b1de2014-07-15 10:56:14 -0700745
746 native void rsnScriptForEach(long con, long id, int slot, long[] ains,
747 long aout, byte[] params, int[] limits);
748
749 synchronized void nScriptForEach(long id, int slot, long[] ains, long aout,
750 byte[] params, int[] limits) {
Jason Sams6e494d32011-04-27 16:33:11 -0700751 validate();
Chris Wailesbe7b1de2014-07-15 10:56:14 -0700752 rsnScriptForEach(mContext, id, slot, ains, aout, params, limits);
Chris Wailes94961062014-06-11 12:01:28 -0700753 }
754
David Gross4a457852016-06-02 14:46:55 -0700755 native void rsnScriptReduce(long con, long id, int slot, long[] ains,
Matt Wala36eb1f72015-07-20 15:35:27 -0700756 long aout, int[] limits);
David Gross4a457852016-06-02 14:46:55 -0700757 synchronized void nScriptReduce(long id, int slot, long ains[], long aout,
Matt Wala36eb1f72015-07-20 15:35:27 -0700758 int[] limits) {
759 validate();
David Gross4a457852016-06-02 14:46:55 -0700760 rsnScriptReduce(mContext, id, slot, ains, aout, limits);
David Gross26ef7a732016-01-12 12:19:15 -0800761 }
762
Tim Murray460a0492013-11-19 12:45:54 -0800763 native void rsnScriptInvokeV(long con, long id, int slot, byte[] params);
764 synchronized void nScriptInvokeV(long id, int slot, byte[] params) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800765 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700766 rsnScriptInvokeV(mContext, id, slot, params);
767 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700768
Tim Murray460a0492013-11-19 12:45:54 -0800769 native void rsnScriptSetVarI(long con, long id, int slot, int val);
770 synchronized void nScriptSetVarI(long id, int slot, int val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800771 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700772 rsnScriptSetVarI(mContext, id, slot, val);
773 }
Tim Murray460a0492013-11-19 12:45:54 -0800774 native int rsnScriptGetVarI(long con, long id, int slot);
775 synchronized int nScriptGetVarI(long id, int slot) {
Tim Murray7c4caad2013-04-10 16:21:40 -0700776 validate();
777 return rsnScriptGetVarI(mContext, id, slot);
778 }
779
Tim Murray460a0492013-11-19 12:45:54 -0800780 native void rsnScriptSetVarJ(long con, long id, int slot, long val);
781 synchronized void nScriptSetVarJ(long id, int slot, long val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800782 validate();
Stephen Hines031ec58c2010-10-11 10:54:21 -0700783 rsnScriptSetVarJ(mContext, id, slot, val);
784 }
Tim Murray460a0492013-11-19 12:45:54 -0800785 native long rsnScriptGetVarJ(long con, long id, int slot);
786 synchronized long nScriptGetVarJ(long id, int slot) {
Tim Murray7c4caad2013-04-10 16:21:40 -0700787 validate();
788 return rsnScriptGetVarJ(mContext, id, slot);
789 }
790
Tim Murray460a0492013-11-19 12:45:54 -0800791 native void rsnScriptSetVarF(long con, long id, int slot, float val);
792 synchronized void nScriptSetVarF(long id, int slot, float val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800793 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700794 rsnScriptSetVarF(mContext, id, slot, val);
795 }
Tim Murray460a0492013-11-19 12:45:54 -0800796 native float rsnScriptGetVarF(long con, long id, int slot);
797 synchronized float nScriptGetVarF(long id, int slot) {
Tim Murray7c4caad2013-04-10 16:21:40 -0700798 validate();
799 return rsnScriptGetVarF(mContext, id, slot);
800 }
Tim Murray460a0492013-11-19 12:45:54 -0800801 native void rsnScriptSetVarD(long con, long id, int slot, double val);
802 synchronized void nScriptSetVarD(long id, int slot, double val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800803 validate();
Stephen Hinesca54ec32010-09-20 17:20:30 -0700804 rsnScriptSetVarD(mContext, id, slot, val);
805 }
Tim Murray460a0492013-11-19 12:45:54 -0800806 native double rsnScriptGetVarD(long con, long id, int slot);
807 synchronized double nScriptGetVarD(long id, int slot) {
Tim Murray7c4caad2013-04-10 16:21:40 -0700808 validate();
809 return rsnScriptGetVarD(mContext, id, slot);
810 }
Tim Murray460a0492013-11-19 12:45:54 -0800811 native void rsnScriptSetVarV(long con, long id, int slot, byte[] val);
812 synchronized void nScriptSetVarV(long id, int slot, byte[] val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800813 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700814 rsnScriptSetVarV(mContext, id, slot, val);
815 }
Tim Murray460a0492013-11-19 12:45:54 -0800816 native void rsnScriptGetVarV(long con, long id, int slot, byte[] val);
817 synchronized void nScriptGetVarV(long id, int slot, byte[] val) {
Tim Murray7c4caad2013-04-10 16:21:40 -0700818 validate();
819 rsnScriptGetVarV(mContext, id, slot, val);
820 }
Tim Murray460a0492013-11-19 12:45:54 -0800821 native void rsnScriptSetVarVE(long con, long id, int slot, byte[] val,
822 long e, int[] dims);
823 synchronized void nScriptSetVarVE(long id, int slot, byte[] val,
824 long e, int[] dims) {
Stephen Hinesadeb8092012-04-20 14:26:06 -0700825 validate();
826 rsnScriptSetVarVE(mContext, id, slot, val, e, dims);
827 }
Tim Murray460a0492013-11-19 12:45:54 -0800828 native void rsnScriptSetVarObj(long con, long id, int slot, long val);
829 synchronized void nScriptSetVarObj(long id, int slot, long val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800830 validate();
Jason Sams6f4cf0b2010-11-16 17:37:02 -0800831 rsnScriptSetVarObj(mContext, id, slot, val);
832 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700833
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000834 native long rsnScriptCCreate(long con, String resName, String cacheDir,
Jason Samse4a06c52011-03-16 16:29:28 -0700835 byte[] script, int length);
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000836 synchronized long nScriptCCreate(String resName, String cacheDir, byte[] script, int length) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800837 validate();
Jason Samse4a06c52011-03-16 16:29:28 -0700838 return rsnScriptCCreate(mContext, resName, cacheDir, script, length);
Jason Sams2e1872f2010-08-17 16:25:41 -0700839 }
Jason Samsebfb4362009-09-23 13:57:02 -0700840
Tim Murray460a0492013-11-19 12:45:54 -0800841 native long rsnScriptIntrinsicCreate(long con, int id, long eid);
842 synchronized long nScriptIntrinsicCreate(int id, long eid) {
Jason Sams6ab97682012-08-10 12:09:43 -0700843 validate();
844 return rsnScriptIntrinsicCreate(mContext, id, eid);
845 }
846
Tim Murray460a0492013-11-19 12:45:54 -0800847 native long rsnScriptKernelIDCreate(long con, long sid, int slot, int sig);
848 synchronized long nScriptKernelIDCreate(long sid, int slot, int sig) {
Jason Sams08a81582012-09-18 12:32:10 -0700849 validate();
850 return rsnScriptKernelIDCreate(mContext, sid, slot, sig);
851 }
852
Yang Nibe392ad2015-01-23 17:16:02 -0800853 native long rsnScriptInvokeIDCreate(long con, long sid, int slot);
854 synchronized long nScriptInvokeIDCreate(long sid, int slot) {
855 validate();
856 return rsnScriptInvokeIDCreate(mContext, sid, slot);
857 }
858
Tim Murray460a0492013-11-19 12:45:54 -0800859 native long rsnScriptFieldIDCreate(long con, long sid, int slot);
860 synchronized long nScriptFieldIDCreate(long sid, int slot) {
Jason Sams08a81582012-09-18 12:32:10 -0700861 validate();
862 return rsnScriptFieldIDCreate(mContext, sid, slot);
863 }
864
Ashok Bhat98071552014-02-12 09:54:43 +0000865 native long rsnScriptGroupCreate(long con, long[] kernels, long[] src, long[] dstk, long[] dstf, long[] types);
866 synchronized long nScriptGroupCreate(long[] kernels, long[] src, long[] dstk, long[] dstf, long[] types) {
Jason Sams08a81582012-09-18 12:32:10 -0700867 validate();
868 return rsnScriptGroupCreate(mContext, kernels, src, dstk, dstf, types);
869 }
870
Tim Murray460a0492013-11-19 12:45:54 -0800871 native void rsnScriptGroupSetInput(long con, long group, long kernel, long alloc);
872 synchronized void nScriptGroupSetInput(long group, long kernel, long alloc) {
Jason Sams08a81582012-09-18 12:32:10 -0700873 validate();
874 rsnScriptGroupSetInput(mContext, group, kernel, alloc);
875 }
876
Tim Murray460a0492013-11-19 12:45:54 -0800877 native void rsnScriptGroupSetOutput(long con, long group, long kernel, long alloc);
878 synchronized void nScriptGroupSetOutput(long group, long kernel, long alloc) {
Jason Sams08a81582012-09-18 12:32:10 -0700879 validate();
880 rsnScriptGroupSetOutput(mContext, group, kernel, alloc);
881 }
882
Tim Murray460a0492013-11-19 12:45:54 -0800883 native void rsnScriptGroupExecute(long con, long group);
884 synchronized void nScriptGroupExecute(long group) {
Jason Sams08a81582012-09-18 12:32:10 -0700885 validate();
886 rsnScriptGroupExecute(mContext, group);
887 }
888
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000889 native long rsnSamplerCreate(long con, int magFilter, int minFilter,
Alex Sakhartchouka89094a2011-05-04 17:45:36 -0700890 int wrapS, int wrapT, int wrapR, float aniso);
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000891 synchronized long nSamplerCreate(int magFilter, int minFilter,
Alex Sakhartchouka89094a2011-05-04 17:45:36 -0700892 int wrapS, int wrapT, int wrapR, float aniso) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800893 validate();
Alex Sakhartchouka89094a2011-05-04 17:45:36 -0700894 return rsnSamplerCreate(mContext, magFilter, minFilter, wrapS, wrapT, wrapR, aniso);
Jason Sams2e1872f2010-08-17 16:25:41 -0700895 }
Jason Sams0011bcf2009-12-15 12:58:36 -0800896
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000897 native long rsnProgramStoreCreate(long con, boolean r, boolean g, boolean b, boolean a,
Jason Sams331bf9b2011-04-06 11:23:54 -0700898 boolean depthMask, boolean dither,
899 int srcMode, int dstMode, int depthFunc);
Ashok Bhat0e0c0882014-02-04 14:57:58 +0000900 synchronized long nProgramStoreCreate(boolean r, boolean g, boolean b, boolean a,
Jason Sams331bf9b2011-04-06 11:23:54 -0700901 boolean depthMask, boolean dither,
902 int srcMode, int dstMode, int depthFunc) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800903 validate();
Jason Samsbd184c52011-04-06 11:44:47 -0700904 return rsnProgramStoreCreate(mContext, r, g, b, a, depthMask, dither, srcMode,
905 dstMode, depthFunc);
Jason Sams2e1872f2010-08-17 16:25:41 -0700906 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700907
Tim Murray460a0492013-11-19 12:45:54 -0800908 native long rsnProgramRasterCreate(long con, boolean pointSprite, int cullMode);
909 synchronized long nProgramRasterCreate(boolean pointSprite, int cullMode) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800910 validate();
Jason Sams94aaed32011-09-23 14:18:53 -0700911 return rsnProgramRasterCreate(mContext, pointSprite, cullMode);
Jason Sams2e1872f2010-08-17 16:25:41 -0700912 }
Jason Sams1fe9b8c2009-06-11 14:46:10 -0700913
Tim Murray460a0492013-11-19 12:45:54 -0800914 native void rsnProgramBindConstants(long con, long pv, int slot, long mID);
915 synchronized void nProgramBindConstants(long pv, int slot, long mID) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800916 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700917 rsnProgramBindConstants(mContext, pv, slot, mID);
918 }
Tim Murray460a0492013-11-19 12:45:54 -0800919 native void rsnProgramBindTexture(long con, long vpf, int slot, long a);
920 synchronized void nProgramBindTexture(long vpf, int slot, long a) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800921 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700922 rsnProgramBindTexture(mContext, vpf, slot, a);
923 }
Tim Murray460a0492013-11-19 12:45:54 -0800924 native void rsnProgramBindSampler(long con, long vpf, int slot, long s);
925 synchronized void nProgramBindSampler(long vpf, int slot, long s) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800926 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700927 rsnProgramBindSampler(mContext, vpf, slot, s);
928 }
Ashok Bhat98071552014-02-12 09:54:43 +0000929 native long rsnProgramFragmentCreate(long con, String shader, String[] texNames, long[] params);
930 synchronized long nProgramFragmentCreate(String shader, String[] texNames, long[] params) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800931 validate();
Alex Sakhartchouk2123b462012-02-15 16:21:46 -0800932 return rsnProgramFragmentCreate(mContext, shader, texNames, params);
Jason Sams2e1872f2010-08-17 16:25:41 -0700933 }
Ashok Bhat98071552014-02-12 09:54:43 +0000934 native long rsnProgramVertexCreate(long con, String shader, String[] texNames, long[] params);
935 synchronized long nProgramVertexCreate(String shader, String[] texNames, long[] params) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800936 validate();
Alex Sakhartchouk2123b462012-02-15 16:21:46 -0800937 return rsnProgramVertexCreate(mContext, shader, texNames, params);
Jason Sams2e1872f2010-08-17 16:25:41 -0700938 }
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700939
Ashok Bhat98071552014-02-12 09:54:43 +0000940 native long rsnMeshCreate(long con, long[] vtx, long[] idx, int[] prim);
941 synchronized long nMeshCreate(long[] vtx, long[] idx, int[] prim) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800942 validate();
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700943 return rsnMeshCreate(mContext, vtx, idx, prim);
Alex Sakhartchouk9d71e212010-11-08 15:10:52 -0800944 }
Tim Murray460a0492013-11-19 12:45:54 -0800945 native int rsnMeshGetVertexBufferCount(long con, long id);
946 synchronized int nMeshGetVertexBufferCount(long id) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800947 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700948 return rsnMeshGetVertexBufferCount(mContext, id);
949 }
Tim Murray460a0492013-11-19 12:45:54 -0800950 native int rsnMeshGetIndexCount(long con, long id);
951 synchronized int nMeshGetIndexCount(long id) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800952 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700953 return rsnMeshGetIndexCount(mContext, id);
954 }
Ashok Bhat98071552014-02-12 09:54:43 +0000955 native void rsnMeshGetVertices(long con, long id, long[] vtxIds, int vtxIdCount);
956 synchronized void nMeshGetVertices(long id, long[] vtxIds, int vtxIdCount) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800957 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700958 rsnMeshGetVertices(mContext, id, vtxIds, vtxIdCount);
959 }
Ashok Bhat98071552014-02-12 09:54:43 +0000960 native void rsnMeshGetIndices(long con, long id, long[] idxIds, int[] primitives, int vtxIdCount);
961 synchronized void nMeshGetIndices(long id, long[] idxIds, int[] primitives, int vtxIdCount) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800962 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700963 rsnMeshGetIndices(mContext, id, idxIds, primitives, vtxIdCount);
964 }
965
Tim Murray25207df2015-01-12 16:47:56 -0800966 native void rsnScriptIntrinsicBLAS_Single(long con, long id, int func, int TransA,
967 int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
968 float alpha, long A, long B, float beta, long C, int incX, int incY,
969 int KL, int KU);
970 synchronized void nScriptIntrinsicBLAS_Single(long id, int func, int TransA,
971 int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
972 float alpha, long A, long B, float beta, long C, int incX, int incY,
973 int KL, int KU) {
974 validate();
975 rsnScriptIntrinsicBLAS_Single(mContext, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alpha, A, B, beta, C, incX, incY, KL, KU);
976 }
977
978 native void rsnScriptIntrinsicBLAS_Double(long con, long id, int func, int TransA,
979 int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
980 double alpha, long A, long B, double beta, long C, int incX, int incY,
981 int KL, int KU);
982 synchronized void nScriptIntrinsicBLAS_Double(long id, int func, int TransA,
983 int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
984 double alpha, long A, long B, double beta, long C, int incX, int incY,
985 int KL, int KU) {
986 validate();
987 rsnScriptIntrinsicBLAS_Double(mContext, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alpha, A, B, beta, C, incX, incY, KL, KU);
988 }
989
990 native void rsnScriptIntrinsicBLAS_Complex(long con, long id, int func, int TransA,
991 int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
992 float alphaX, float alphaY, long A, long B, float betaX, float betaY, long C, int incX, int incY,
993 int KL, int KU);
994 synchronized void nScriptIntrinsicBLAS_Complex(long id, int func, int TransA,
995 int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
996 float alphaX, float alphaY, long A, long B, float betaX, float betaY, long C, int incX, int incY,
997 int KL, int KU) {
998 validate();
999 rsnScriptIntrinsicBLAS_Complex(mContext, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alphaX, alphaY, A, B, betaX, betaY, C, incX, incY, KL, KU);
1000 }
1001
1002 native void rsnScriptIntrinsicBLAS_Z(long con, long id, int func, int TransA,
1003 int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
1004 double alphaX, double alphaY, long A, long B, double betaX, double betaY, long C, int incX, int incY,
1005 int KL, int KU);
1006 synchronized void nScriptIntrinsicBLAS_Z(long id, int func, int TransA,
1007 int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
1008 double alphaX, double alphaY, long A, long B, double betaX, double betaY, long C, int incX, int incY,
1009 int KL, int KU) {
1010 validate();
1011 rsnScriptIntrinsicBLAS_Z(mContext, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alphaX, alphaY, A, B, betaX, betaY, C, incX, incY, KL, KU);
1012 }
1013
Tim Murray9cb16a22015-04-01 11:07:16 -07001014 native void rsnScriptIntrinsicBLAS_BNNM(long con, long id, int M, int N, int K,
1015 long A, int a_offset, long B, int b_offset, long C, int c_offset,
1016 int c_mult_int);
1017 synchronized void nScriptIntrinsicBLAS_BNNM(long id, int M, int N, int K,
1018 long A, int a_offset, long B, int b_offset, long C, int c_offset,
1019 int c_mult_int) {
1020 validate();
1021 rsnScriptIntrinsicBLAS_BNNM(mContext, id, M, N, K, A, a_offset, B, b_offset, C, c_offset, c_mult_int);
1022 }
1023
1024
Tim Murray25207df2015-01-12 16:47:56 -08001025
Tim Murrayeff663f2013-11-15 13:08:30 -08001026 long mContext;
Jason Samsd22a6f02015-02-19 17:19:52 -08001027 private boolean mDestroyed = false;
1028
Romain Guy650a3eb2009-08-31 14:06:43 -07001029 @SuppressWarnings({"FieldCanBeLocal"})
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001030 MessageThread mMessageThread;
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001031
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001032 volatile Element mElement_U8;
1033 volatile Element mElement_I8;
1034 volatile Element mElement_U16;
1035 volatile Element mElement_I16;
1036 volatile Element mElement_U32;
1037 volatile Element mElement_I32;
1038 volatile Element mElement_U64;
1039 volatile Element mElement_I64;
1040 volatile Element mElement_F16;
1041 volatile Element mElement_F32;
1042 volatile Element mElement_F64;
1043 volatile Element mElement_BOOLEAN;
Jason Sams3c0dfba2009-09-27 17:50:38 -07001044
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001045 volatile Element mElement_ELEMENT;
1046 volatile Element mElement_TYPE;
1047 volatile Element mElement_ALLOCATION;
1048 volatile Element mElement_SAMPLER;
1049 volatile Element mElement_SCRIPT;
1050 volatile Element mElement_MESH;
1051 volatile Element mElement_PROGRAM_FRAGMENT;
1052 volatile Element mElement_PROGRAM_VERTEX;
1053 volatile Element mElement_PROGRAM_RASTER;
1054 volatile Element mElement_PROGRAM_STORE;
1055 volatile Element mElement_FONT;
Jason Samsa70f4162010-03-26 15:33:42 -07001056
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001057 volatile Element mElement_A_8;
1058 volatile Element mElement_RGB_565;
1059 volatile Element mElement_RGB_888;
1060 volatile Element mElement_RGBA_5551;
1061 volatile Element mElement_RGBA_4444;
1062 volatile Element mElement_RGBA_8888;
Jason Sams3c0dfba2009-09-27 17:50:38 -07001063
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001064 volatile Element mElement_HALF_2;
1065 volatile Element mElement_HALF_3;
1066 volatile Element mElement_HALF_4;
Jason Samsa5835a22014-11-05 15:16:26 -08001067
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001068 volatile Element mElement_FLOAT_2;
1069 volatile Element mElement_FLOAT_3;
1070 volatile Element mElement_FLOAT_4;
Stephen Hines836c4a52011-06-01 14:38:10 -07001071
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001072 volatile Element mElement_DOUBLE_2;
1073 volatile Element mElement_DOUBLE_3;
1074 volatile Element mElement_DOUBLE_4;
Stephen Hines836c4a52011-06-01 14:38:10 -07001075
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001076 volatile Element mElement_UCHAR_2;
1077 volatile Element mElement_UCHAR_3;
1078 volatile Element mElement_UCHAR_4;
Jason Sams7d787b42009-11-15 12:14:26 -08001079
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001080 volatile Element mElement_CHAR_2;
1081 volatile Element mElement_CHAR_3;
1082 volatile Element mElement_CHAR_4;
Stephen Hines836c4a52011-06-01 14:38:10 -07001083
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001084 volatile Element mElement_USHORT_2;
1085 volatile Element mElement_USHORT_3;
1086 volatile Element mElement_USHORT_4;
Stephen Hines836c4a52011-06-01 14:38:10 -07001087
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001088 volatile Element mElement_SHORT_2;
1089 volatile Element mElement_SHORT_3;
1090 volatile Element mElement_SHORT_4;
Stephen Hines836c4a52011-06-01 14:38:10 -07001091
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001092 volatile Element mElement_UINT_2;
1093 volatile Element mElement_UINT_3;
1094 volatile Element mElement_UINT_4;
Stephen Hines836c4a52011-06-01 14:38:10 -07001095
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001096 volatile Element mElement_INT_2;
1097 volatile Element mElement_INT_3;
1098 volatile Element mElement_INT_4;
Stephen Hines836c4a52011-06-01 14:38:10 -07001099
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001100 volatile Element mElement_ULONG_2;
1101 volatile Element mElement_ULONG_3;
1102 volatile Element mElement_ULONG_4;
Stephen Hines836c4a52011-06-01 14:38:10 -07001103
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001104 volatile Element mElement_LONG_2;
1105 volatile Element mElement_LONG_3;
1106 volatile Element mElement_LONG_4;
Stephen Hines836c4a52011-06-01 14:38:10 -07001107
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001108 volatile Element mElement_YUV;
Tim Murray932e78e2013-09-03 11:42:26 -07001109
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001110 volatile Element mElement_MATRIX_4X4;
1111 volatile Element mElement_MATRIX_3X3;
1112 volatile Element mElement_MATRIX_2X2;
Jason Sams1d45c472010-08-25 14:31:48 -07001113
Yang Ni6bdfe0f2016-04-18 16:56:16 -07001114 volatile Sampler mSampler_CLAMP_NEAREST;
1115 volatile Sampler mSampler_CLAMP_LINEAR;
1116 volatile Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
1117 volatile Sampler mSampler_WRAP_NEAREST;
1118 volatile Sampler mSampler_WRAP_LINEAR;
1119 volatile Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
1120 volatile Sampler mSampler_MIRRORED_REPEAT_NEAREST;
1121 volatile Sampler mSampler_MIRRORED_REPEAT_LINEAR;
1122 volatile Sampler mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR;
Jason Sams4d339932010-05-11 14:03:58 -07001123
Alex Sakhartchoukd36f2482010-08-24 11:37:33 -07001124 ProgramStore mProgramStore_BLEND_NONE_DEPTH_TEST;
1125 ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
Alex Sakhartchoukd36f2482010-08-24 11:37:33 -07001126 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_TEST;
1127 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
Alex Sakhartchouk32e09b52010-08-23 10:24:10 -07001128
Alex Sakhartchoukd36f2482010-08-24 11:37:33 -07001129 ProgramRaster mProgramRaster_CULL_BACK;
1130 ProgramRaster mProgramRaster_CULL_FRONT;
1131 ProgramRaster mProgramRaster_CULL_NONE;
Alex Sakhartchouk32e09b52010-08-23 10:24:10 -07001132
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001133 ///////////////////////////////////////////////////////////////////////////////////
Jack Palevich43702d82009-05-28 13:38:16 -07001134 //
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001135
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001136 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001137 * The base class from which an application should derive in order
1138 * to receive RS messages from scripts. When a script calls {@code
1139 * rsSendToClient}, the data fields will be filled, and the run
1140 * method will be called on a separate thread. This will occur
1141 * some time after {@code rsSendToClient} completes in the script,
1142 * as {@code rsSendToClient} is asynchronous. Message handlers are
1143 * not guaranteed to have completed when {@link
1144 * android.renderscript.RenderScript#finish} returns.
Jason Sams27676fe2010-11-10 17:00:59 -08001145 *
1146 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001147 public static class RSMessageHandler implements Runnable {
Jason Sams516c3192009-10-06 13:58:47 -07001148 protected int[] mData;
1149 protected int mID;
Jason Sams1c415172010-11-08 17:06:46 -08001150 protected int mLength;
Jason Sams516c3192009-10-06 13:58:47 -07001151 public void run() {
1152 }
1153 }
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001154 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001155 * If an application is expecting messages, it should set this
1156 * field to an instance of {@link RSMessageHandler}. This
1157 * instance will receive all the user messages sent from {@code
1158 * sendToClient} by scripts from this context.
Jason Sams27676fe2010-11-10 17:00:59 -08001159 *
1160 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001161 RSMessageHandler mMessageCallback = null;
1162
1163 public void setMessageHandler(RSMessageHandler msg) {
1164 mMessageCallback = msg;
1165 }
1166 public RSMessageHandler getMessageHandler() {
1167 return mMessageCallback;
1168 }
Jason Sams516c3192009-10-06 13:58:47 -07001169
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001170 /**
Jason Sams02d56d92013-04-12 16:40:50 -07001171 * Place a message into the message queue to be sent back to the message
1172 * handler once all previous commands have been executed.
Jason Sams455d6442013-02-05 19:20:18 -08001173 *
1174 * @param id
1175 * @param data
1176 */
1177 public void sendMessage(int id, int[] data) {
1178 nContextSendMessage(id, data);
1179 }
1180
1181 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001182 * The runtime error handler base class. An application should derive from this class
1183 * if it wishes to install an error handler. When errors occur at runtime,
1184 * the fields in this class will be filled, and the run method will be called.
Jason Sams27676fe2010-11-10 17:00:59 -08001185 *
1186 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001187 public static class RSErrorHandler implements Runnable {
Jason Sams1c415172010-11-08 17:06:46 -08001188 protected String mErrorMessage;
1189 protected int mErrorNum;
1190 public void run() {
1191 }
1192 }
Jason Sams27676fe2010-11-10 17:00:59 -08001193
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001194 /**
Jason Sams27676fe2010-11-10 17:00:59 -08001195 * Application Error handler. All runtime errors will be dispatched to the
1196 * instance of RSAsyncError set here. If this field is null a
Tim Murrayc11e25c2013-04-09 11:01:01 -07001197 * {@link RSRuntimeException} will instead be thrown with details about the error.
Jason Sams27676fe2010-11-10 17:00:59 -08001198 * This will cause program termaination.
1199 *
1200 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001201 RSErrorHandler mErrorCallback = null;
1202
1203 public void setErrorHandler(RSErrorHandler msg) {
1204 mErrorCallback = msg;
1205 }
1206 public RSErrorHandler getErrorHandler() {
1207 return mErrorCallback;
1208 }
Jason Sams1c415172010-11-08 17:06:46 -08001209
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001210 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001211 * RenderScript worker thread priority enumeration. The default value is
1212 * NORMAL. Applications wishing to do background processing should set
1213 * their priority to LOW to avoid starving forground processes.
Jason Sams27676fe2010-11-10 17:00:59 -08001214 */
Jason Sams7d787b42009-11-15 12:14:26 -08001215 public enum Priority {
Jason Samsc9870c12015-01-21 12:55:14 -08001216 // These values used to represent official thread priority values
1217 // now they are simply enums to be used by the runtime side
1218 LOW (15),
1219 NORMAL (-8);
Jason Sams7d787b42009-11-15 12:14:26 -08001220
1221 int mID;
1222 Priority(int id) {
1223 mID = id;
1224 }
1225 }
1226
Jason Sams678cc7f2014-03-05 16:09:02 -08001227 void validateObject(BaseObj o) {
1228 if (o != null) {
1229 if (o.mRS != this) {
1230 throw new RSIllegalArgumentException("Attempting to use an object across contexts.");
1231 }
1232 }
1233 }
1234
Jason Sams771bebb2009-12-07 12:40:12 -08001235 void validate() {
1236 if (mContext == 0) {
Jason Samsc1d62102010-11-04 14:32:19 -07001237 throw new RSInvalidStateException("Calling RS with no Context active.");
Jason Sams771bebb2009-12-07 12:40:12 -08001238 }
1239 }
1240
Jason Sams27676fe2010-11-10 17:00:59 -08001241
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001242 /**
Jason Sams27676fe2010-11-10 17:00:59 -08001243 * Change the priority of the worker threads for this context.
1244 *
1245 * @param p New priority to be set.
1246 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001247 public void setPriority(Priority p) {
Jason Sams5dbfe932010-01-27 14:41:43 -08001248 validate();
Jason Sams7d787b42009-11-15 12:14:26 -08001249 nContextSetPriority(p.mID);
1250 }
1251
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001252 static class MessageThread extends Thread {
Jason Sams516c3192009-10-06 13:58:47 -07001253 RenderScript mRS;
1254 boolean mRun = true;
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001255 int[] mAuxData = new int[2];
Jason Sams1c415172010-11-08 17:06:46 -08001256
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001257 static final int RS_MESSAGE_TO_CLIENT_NONE = 0;
1258 static final int RS_MESSAGE_TO_CLIENT_EXCEPTION = 1;
1259 static final int RS_MESSAGE_TO_CLIENT_RESIZE = 2;
1260 static final int RS_MESSAGE_TO_CLIENT_ERROR = 3;
1261 static final int RS_MESSAGE_TO_CLIENT_USER = 4;
Jason Sams739c8262013-04-11 18:07:52 -07001262 static final int RS_MESSAGE_TO_CLIENT_NEW_BUFFER = 5;
Jason Sams516c3192009-10-06 13:58:47 -07001263
Stephen Hines42028a82013-04-17 19:22:01 -07001264 static final int RS_ERROR_FATAL_DEBUG = 0x0800;
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001265 static final int RS_ERROR_FATAL_UNKNOWN = 0x1000;
Jason Samsadd9d962010-11-22 16:20:16 -08001266
Jason Sams516c3192009-10-06 13:58:47 -07001267 MessageThread(RenderScript rs) {
1268 super("RSMessageThread");
1269 mRS = rs;
1270
1271 }
1272
1273 public void run() {
1274 // This function is a temporary solution. The final solution will
1275 // used typed allocations where the message id is the type indicator.
1276 int[] rbuf = new int[16];
Jason Sams2e1872f2010-08-17 16:25:41 -07001277 mRS.nContextInitToClient(mRS.mContext);
Jason Sams516c3192009-10-06 13:58:47 -07001278 while(mRun) {
Jason Sams1d45c472010-08-25 14:31:48 -07001279 rbuf[0] = 0;
Jason Samsedbfabd2011-05-17 15:01:29 -07001280 int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData);
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001281 int size = mAuxData[1];
1282 int subID = mAuxData[0];
Jason Sams1c415172010-11-08 17:06:46 -08001283
1284 if (msg == RS_MESSAGE_TO_CLIENT_USER) {
1285 if ((size>>2) >= rbuf.length) {
1286 rbuf = new int[(size + 3) >> 2];
1287 }
Jason Samsedbfabd2011-05-17 15:01:29 -07001288 if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
1289 RS_MESSAGE_TO_CLIENT_USER) {
Tim Murrayc11e25c2013-04-09 11:01:01 -07001290 throw new RSDriverException("Error processing message from RenderScript.");
Jason Samsedbfabd2011-05-17 15:01:29 -07001291 }
Jason Sams1c415172010-11-08 17:06:46 -08001292
1293 if(mRS.mMessageCallback != null) {
1294 mRS.mMessageCallback.mData = rbuf;
1295 mRS.mMessageCallback.mID = subID;
1296 mRS.mMessageCallback.mLength = size;
1297 mRS.mMessageCallback.run();
Jason Sams1d45c472010-08-25 14:31:48 -07001298 } else {
Jason Sams1c415172010-11-08 17:06:46 -08001299 throw new RSInvalidStateException("Received a message from the script with no message handler installed.");
Jason Sams516c3192009-10-06 13:58:47 -07001300 }
Stephen Hinesab98bb62010-09-24 14:38:30 -07001301 continue;
Jason Sams516c3192009-10-06 13:58:47 -07001302 }
Jason Sams1c415172010-11-08 17:06:46 -08001303
1304 if (msg == RS_MESSAGE_TO_CLIENT_ERROR) {
1305 String e = mRS.nContextGetErrorMessage(mRS.mContext);
1306
Stephen Hines42028a82013-04-17 19:22:01 -07001307 // Throw RSRuntimeException under the following conditions:
1308 //
1309 // 1) It is an unknown fatal error.
1310 // 2) It is a debug fatal error, and we are not in a
1311 // debug context.
1312 // 3) It is a debug fatal error, and we do not have an
1313 // error callback.
1314 if (subID >= RS_ERROR_FATAL_UNKNOWN ||
1315 (subID >= RS_ERROR_FATAL_DEBUG &&
1316 (mRS.mContextType != ContextType.DEBUG ||
1317 mRS.mErrorCallback == null))) {
Jason Samsadd9d962010-11-22 16:20:16 -08001318 throw new RSRuntimeException("Fatal error " + subID + ", details: " + e);
1319 }
1320
Jason Sams1c415172010-11-08 17:06:46 -08001321 if(mRS.mErrorCallback != null) {
1322 mRS.mErrorCallback.mErrorMessage = e;
1323 mRS.mErrorCallback.mErrorNum = subID;
1324 mRS.mErrorCallback.run();
1325 } else {
Jason Samsa4b7bc92013-02-05 15:05:39 -08001326 android.util.Log.e(LOG_TAG, "non fatal RS error, " + e);
Stephen Hinesbe74bdd2012-02-03 15:29:36 -08001327 // Do not throw here. In these cases, we do not have
1328 // a fatal error.
Jason Sams1c415172010-11-08 17:06:46 -08001329 }
1330 continue;
1331 }
1332
Jason Sams739c8262013-04-11 18:07:52 -07001333 if (msg == RS_MESSAGE_TO_CLIENT_NEW_BUFFER) {
Tim Murrayb730d862014-08-18 16:14:24 -07001334 if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
1335 RS_MESSAGE_TO_CLIENT_NEW_BUFFER) {
1336 throw new RSDriverException("Error processing message from RenderScript.");
1337 }
1338 long bufferID = ((long)rbuf[1] << 32L) + ((long)rbuf[0] & 0xffffffffL);
1339 Allocation.sendBufferNotification(bufferID);
Jason Sams739c8262013-04-11 18:07:52 -07001340 continue;
1341 }
1342
Jason Sams1c415172010-11-08 17:06:46 -08001343 // 2: teardown.
1344 // But we want to avoid starving other threads during
1345 // teardown by yielding until the next line in the destructor
1346 // can execute to set mRun = false
1347 try {
1348 sleep(1, 0);
1349 } catch(InterruptedException e) {
Jason Sams516c3192009-10-06 13:58:47 -07001350 }
Jason Sams516c3192009-10-06 13:58:47 -07001351 }
Tim Murrayda67deb2013-05-09 12:02:50 -07001352 //Log.d(LOG_TAG, "MessageThread exiting.");
Jason Sams516c3192009-10-06 13:58:47 -07001353 }
1354 }
1355
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001356 RenderScript(Context ctx) {
Stephen Hines42028a82013-04-17 19:22:01 -07001357 mContextType = ContextType.NORMAL;
Jason Sams1a4e1f32012-02-24 17:51:24 -08001358 if (ctx != null) {
1359 mApplicationContext = ctx.getApplicationContext();
1360 }
Tim Murray06b45672014-01-07 11:13:56 -08001361 mRWLock = new ReentrantReadWriteLock();
Tim Murrayaefbd5f2014-12-12 11:34:48 -08001362 try {
Tim Murrayd11a6582014-12-16 09:59:09 -08001363 registerNativeAllocation.invoke(sRuntime, 4 * 1024 * 1024); // 4MB for GC sake
Tim Murrayaefbd5f2014-12-12 11:34:48 -08001364 } catch (Exception e) {
1365 Log.e(RenderScript.LOG_TAG, "Couldn't invoke registerNativeAllocation:" + e);
1366 throw new RSRuntimeException("Couldn't invoke registerNativeAllocation:" + e);
1367 }
1368
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001369 }
1370
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001371 /**
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001372 * Gets the application context associated with the RenderScript context.
1373 *
1374 * @return The application context.
1375 */
1376 public final Context getApplicationContext() {
1377 return mApplicationContext;
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001378 }
1379
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001380 /**
Yang Ni689f6372016-03-10 16:12:31 -08001381 * Name of the file that holds the object cache.
1382 */
1383 private static String mCachePath;
1384
1385 /**
1386 * Gets the path to the code cache.
1387 */
1388 static synchronized String getCachePath() {
1389 if (mCachePath == null) {
1390 final String CACHE_PATH = "com.android.renderscript.cache";
1391 if (RenderScriptCacheDir.mCacheDir == null) {
1392 throw new RSRuntimeException("RenderScript code cache directory uninitialized.");
1393 }
1394 File f = new File(RenderScriptCacheDir.mCacheDir, CACHE_PATH);
1395 mCachePath = f.getAbsolutePath();
1396 f.mkdirs();
1397 }
1398 return mCachePath;
1399 }
1400
1401 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001402 * Create a RenderScript context.
Jason Sams27676fe2010-11-10 17:00:59 -08001403 *
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001404 * @param ctx The context.
Jason Sams27676fe2010-11-10 17:00:59 -08001405 * @return RenderScript
1406 */
Jason Samse16da122015-03-18 17:04:18 -07001407 private static RenderScript internalCreate(Context ctx, int sdkVersion, ContextType ct, int flags) {
Dan Morrille4d9a012013-03-28 18:10:43 -07001408 if (!sInitialized) {
1409 Log.e(LOG_TAG, "RenderScript.create() called when disabled; someone is likely to crash");
1410 return null;
1411 }
1412
verena beckhamc9659ea2015-05-22 16:47:53 +01001413 if ((flags & ~(CREATE_FLAG_LOW_LATENCY | CREATE_FLAG_LOW_POWER |
Stephen McGroarty88891e62015-09-02 15:54:05 +01001414 CREATE_FLAG_WAIT_FOR_ATTACH)) != 0) {
Jason Samsb69c7912014-05-20 18:48:35 -07001415 throw new RSIllegalArgumentException("Invalid flags passed.");
1416 }
1417
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001418 RenderScript rs = new RenderScript(ctx);
Jason Sams704ff642010-02-09 16:05:07 -08001419
Yang Nicb939dc2016-04-04 10:23:57 -07001420 long device = rs.nDeviceCreate();
1421 rs.mContext = rs.nContextCreate(device, flags, sdkVersion, ct.mID);
Stephen Hines42028a82013-04-17 19:22:01 -07001422 rs.mContextType = ct;
Jason Samse16da122015-03-18 17:04:18 -07001423 rs.mContextFlags = flags;
1424 rs.mContextSdkVersion = sdkVersion;
Jason Sams26985362011-05-03 15:01:58 -07001425 if (rs.mContext == 0) {
1426 throw new RSDriverException("Failed to create RS context.");
1427 }
Tim Murray47f31582015-04-07 15:43:24 -07001428
1429 // set up cache directory for entire context
Yang Ni689f6372016-03-10 16:12:31 -08001430 rs.nContextSetCacheDir(RenderScript.getCachePath());
Tim Murray47f31582015-04-07 15:43:24 -07001431
Jason Sams704ff642010-02-09 16:05:07 -08001432 rs.mMessageThread = new MessageThread(rs);
1433 rs.mMessageThread.start();
Jason Sams704ff642010-02-09 16:05:07 -08001434 return rs;
Jason Samsefd9b6fb2009-11-03 13:58:36 -08001435 }
1436
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001437 /**
Miao Wanga4e5adf2015-03-23 11:09:56 -07001438 * calls create(ctx, ContextType.NORMAL, CREATE_FLAG_NONE)
Jason Samse16da122015-03-18 17:04:18 -07001439 *
1440 * See documentation for @create for details
Jason Sams1a4e1f32012-02-24 17:51:24 -08001441 *
1442 * @param ctx The context.
1443 * @return RenderScript
1444 */
1445 public static RenderScript create(Context ctx) {
Jason Samsadd26dc2013-02-22 18:43:45 -08001446 return create(ctx, ContextType.NORMAL);
1447 }
1448
1449 /**
Miao Wanga4e5adf2015-03-23 11:09:56 -07001450 * calls create(ctx, ct, CREATE_FLAG_NONE)
Jason Samsadd26dc2013-02-22 18:43:45 -08001451 *
Jason Samse16da122015-03-18 17:04:18 -07001452 * See documentation for @create for details
Jason Samsadd26dc2013-02-22 18:43:45 -08001453 *
1454 * @param ctx The context.
Jason Sams02d56d92013-04-12 16:40:50 -07001455 * @param ct The type of context to be created.
Jason Samsadd26dc2013-02-22 18:43:45 -08001456 * @return RenderScript
1457 */
1458 public static RenderScript create(Context ctx, ContextType ct) {
Jason Samse16da122015-03-18 17:04:18 -07001459 return create(ctx, ct, CREATE_FLAG_NONE);
Jason Sams26e90512014-05-07 14:23:27 -07001460 }
1461
Miao Wanga4e5adf2015-03-23 11:09:56 -07001462
1463 /**
Jason Samse16da122015-03-18 17:04:18 -07001464 * Gets or creates a RenderScript context of the specified type.
Jason Sams26e90512014-05-07 14:23:27 -07001465 *
Jason Samse16da122015-03-18 17:04:18 -07001466 * The returned context will be cached for future reuse within
1467 * the process. When an application is finished using
1468 * RenderScript it should call releaseAllContexts()
1469 *
1470 * A process context is a context designed for easy creation and
1471 * lifecycle management. Multiple calls to this function will
1472 * return the same object provided they are called with the same
1473 * options. This allows it to be used any time a RenderScript
1474 * context is needed.
1475 *
1476 * Prior to API 23 this always created a new context.
Jason Sams26e90512014-05-07 14:23:27 -07001477 *
1478 * @param ctx The context.
1479 * @param ct The type of context to be created.
1480 * @param flags The OR of the CREATE_FLAG_* options desired
1481 * @return RenderScript
1482 */
Tim Murrayfd710e72014-06-06 11:10:45 -07001483 public static RenderScript create(Context ctx, ContextType ct, int flags) {
Jason Sams26e90512014-05-07 14:23:27 -07001484 int v = ctx.getApplicationInfo().targetSdkVersion;
Miao Wanga4e5adf2015-03-23 11:09:56 -07001485 return create(ctx, v, ct, flags);
1486 }
1487
1488 /**
1489 * calls create(ctx, sdkVersion, ContextType.NORMAL, CREATE_FLAG_NONE)
1490 *
1491 * Used by the RenderScriptThunker to maintain backward compatibility.
1492 *
1493 * @hide
1494 * @param ctx The context.
1495 * @param sdkVersion The target SDK Version.
1496 * @return RenderScript
1497 */
1498 public static RenderScript create(Context ctx, int sdkVersion) {
1499 return create(ctx, sdkVersion, ContextType.NORMAL, CREATE_FLAG_NONE);
1500 }
1501
1502 /**
1503 * Gets or creates a RenderScript context of the specified type.
1504 *
Miao Wanga4e5adf2015-03-23 11:09:56 -07001505 * @param ctx The context.
1506 * @param ct The type of context to be created.
1507 * @param sdkVersion The target SDK Version.
1508 * @param flags The OR of the CREATE_FLAG_* options desired
1509 * @return RenderScript
1510 */
Jason Sams6a420b52015-03-30 15:31:26 -07001511 private static RenderScript create(Context ctx, int sdkVersion, ContextType ct, int flags) {
Miao Wanga4e5adf2015-03-23 11:09:56 -07001512 if (sdkVersion < 23) {
1513 return internalCreate(ctx, sdkVersion, ct, flags);
Jason Samse16da122015-03-18 17:04:18 -07001514 }
1515
1516 synchronized (mProcessContextList) {
1517 for (RenderScript prs : mProcessContextList) {
1518 if ((prs.mContextType == ct) &&
1519 (prs.mContextFlags == flags) &&
Miao Wanga4e5adf2015-03-23 11:09:56 -07001520 (prs.mContextSdkVersion == sdkVersion)) {
Jason Samse16da122015-03-18 17:04:18 -07001521
1522 return prs;
1523 }
1524 }
1525
Miao Wanga4e5adf2015-03-23 11:09:56 -07001526 RenderScript prs = internalCreate(ctx, sdkVersion, ct, flags);
Jason Samse16da122015-03-18 17:04:18 -07001527 prs.mIsProcessContext = true;
1528 mProcessContextList.add(prs);
1529 return prs;
1530 }
Jason Sams1a4e1f32012-02-24 17:51:24 -08001531 }
1532
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001533 /**
Jason Samse16da122015-03-18 17:04:18 -07001534 * Releases all the process contexts. This is the same as
1535 * calling .destroy() on each unique context retreived with
1536 * create(...). If no contexts have been created this
1537 * function does nothing.
1538 *
1539 * Typically you call this when your application is losing focus
1540 * and will not be using a context for some time.
1541 *
1542 * This has no effect on a context created with
1543 * createMultiContext()
1544 */
1545 public static void releaseAllContexts() {
1546 ArrayList<RenderScript> oldList;
1547 synchronized (mProcessContextList) {
1548 oldList = mProcessContextList;
1549 mProcessContextList = new ArrayList<RenderScript>();
1550 }
1551
1552 for (RenderScript prs : oldList) {
1553 prs.mIsProcessContext = false;
1554 prs.destroy();
1555 }
1556 oldList.clear();
1557 }
1558
1559
1560
1561 /**
1562 * Create a RenderScript context.
1563 *
1564 * This is an advanced function intended for applications which
1565 * need to create more than one RenderScript context to be used
1566 * at the same time.
1567 *
1568 * If you need a single context please use create()
1569 *
Jason Samse16da122015-03-18 17:04:18 -07001570 * @param ctx The context.
1571 * @return RenderScript
1572 */
1573 public static RenderScript createMultiContext(Context ctx, ContextType ct, int flags, int API_number) {
1574 return internalCreate(ctx, API_number, ct, flags);
1575 }
1576
1577
1578 /**
Jason Sams27676fe2010-11-10 17:00:59 -08001579 * Print the currently available debugging information about the state of
1580 * the RS context to the log.
1581 *
Jason Sams27676fe2010-11-10 17:00:59 -08001582 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001583 public void contextDump() {
Jason Sams5dbfe932010-01-27 14:41:43 -08001584 validate();
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001585 nContextDump(0);
Jason Sams715333b2009-11-17 17:26:46 -08001586 }
1587
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001588 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001589 * Wait for any pending asynchronous opeations (such as copies to a RS
1590 * allocation or RS script executions) to complete.
Jason Sams27676fe2010-11-10 17:00:59 -08001591 *
1592 */
Jason Sams96ed4cf2010-06-15 12:15:57 -07001593 public void finish() {
1594 nContextFinish();
1595 }
1596
Jason Samsd22a6f02015-02-19 17:19:52 -08001597 private void helpDestroy() {
1598 boolean shouldDestroy = false;
1599 synchronized(this) {
1600 if (!mDestroyed) {
1601 shouldDestroy = true;
1602 mDestroyed = true;
1603 }
1604 }
1605
1606 if (shouldDestroy) {
1607 nContextFinish();
1608
1609 nContextDeinitToClient(mContext);
1610 mMessageThread.mRun = false;
Miao Wang4a574802016-05-10 16:44:11 -07001611 // Interrupt mMessageThread so it gets to see immediately that mRun is false
1612 // and exit rightaway.
1613 mMessageThread.interrupt();
Pirama Arumuga Nainar2f25ce772015-10-02 12:06:10 -07001614
1615 // Wait for mMessageThread to join. Try in a loop, in case this thread gets interrupted
Pirama Arumuga Nainar83461d72015-10-02 16:38:08 -07001616 // during the wait. If interrupted, set the "interrupted" status of the current thread.
1617 boolean hasJoined = false, interrupted = false;
Pirama Arumuga Nainar2f25ce772015-10-02 12:06:10 -07001618 while (!hasJoined) {
1619 try {
1620 mMessageThread.join();
1621 hasJoined = true;
Pirama Arumuga Nainar83461d72015-10-02 16:38:08 -07001622 } catch (InterruptedException e) {
1623 interrupted = true;
Pirama Arumuga Nainar2f25ce772015-10-02 12:06:10 -07001624 }
Jason Samsd22a6f02015-02-19 17:19:52 -08001625 }
Pirama Arumuga Nainar83461d72015-10-02 16:38:08 -07001626 if (interrupted) {
1627 Log.v(LOG_TAG, "Interrupted during wait for MessageThread to join");
1628 Thread.currentThread().interrupt();
1629 }
Jason Samsd22a6f02015-02-19 17:19:52 -08001630
1631 nContextDestroy();
Jason Samsd22a6f02015-02-19 17:19:52 -08001632 }
1633 }
1634
1635 protected void finalize() throws Throwable {
1636 helpDestroy();
1637 super.finalize();
1638 }
1639
1640
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001641 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001642 * Destroys this RenderScript context. Once this function is called,
1643 * using this context or any objects belonging to this context is
1644 * illegal.
Jason Sams27676fe2010-11-10 17:00:59 -08001645 *
Jason Samse16da122015-03-18 17:04:18 -07001646 * API 23+, this function is a NOP if the context was created
1647 * with create(). Please use releaseAllContexts() to clean up
1648 * contexts created with the create function.
1649 *
Jason Sams27676fe2010-11-10 17:00:59 -08001650 */
Jason Samsf5b45962009-08-25 14:49:07 -07001651 public void destroy() {
Jason Samse16da122015-03-18 17:04:18 -07001652 if (mIsProcessContext) {
1653 // users cannot destroy a process context
1654 return;
1655 }
Jason Sams5dbfe932010-01-27 14:41:43 -08001656 validate();
Jason Samsd22a6f02015-02-19 17:19:52 -08001657 helpDestroy();
Jason Samsf5b45962009-08-25 14:49:07 -07001658 }
Jason Sams02fb2cb2009-05-28 15:37:57 -07001659
Jason Samsa9e7a052009-09-25 14:51:22 -07001660 boolean isAlive() {
1661 return mContext != 0;
1662 }
1663
Tim Murray460a0492013-11-19 12:45:54 -08001664 long safeID(BaseObj o) {
Jason Sams6b9dec02009-09-23 16:38:37 -07001665 if(o != null) {
Jason Samse07694b2012-04-03 15:36:36 -07001666 return o.getID(this);
Jason Samsd8e41612009-08-20 17:22:40 -07001667 }
Jason Sams6b9dec02009-09-23 16:38:37 -07001668 return 0;
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001669 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001670}