blob: 7d4a5c4d1295a6edf9d9cd7033aed4c4df6d4d0d [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
Jason Samsa6f338c2012-02-24 16:22:16 -080019import java.io.File;
Jason Samsfe1d5ff2012-03-23 11:47:26 -070020import java.lang.reflect.Field;
Tim Murray2f2472c2013-08-22 14:55:26 -070021import java.lang.reflect.Method;
Jason Sams36e612a2009-07-31 16:26:13 -070022
Shih-wei Liao6b32fab2010-12-10 01:03:59 -080023import android.content.Context;
Stephen Hines4382467a2011-08-01 15:02:34 -070024import android.content.pm.ApplicationInfo;
25import android.content.pm.PackageManager;
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -080026import android.content.res.AssetManager;
Jason Samsb8c5a842009-07-31 20:40:47 -070027import android.graphics.Bitmap;
Romain Guy650a3eb2009-08-31 14:06:43 -070028import android.graphics.BitmapFactory;
Jason Samsfaa32b32011-06-20 16:58:04 -070029import android.graphics.SurfaceTexture;
Glenn Kasten260c77a2011-06-01 17:25:54 -070030import android.os.Process;
Jason Sams36e612a2009-07-31 16:26:13 -070031import android.util.Log;
32import android.view.Surface;
Dan Morrille4d9a012013-03-28 18:10:43 -070033import android.os.SystemProperties;
Tim Murray6d7a53c2013-05-23 16:59:23 -070034import android.os.Trace;
Stephen Hines4382467a2011-08-01 15:02:34 -070035
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
Shih-wei Liao6b32fab2010-12-10 01:03:59 -080055 private Context mApplicationContext;
Jack Palevich60aa3ea2009-05-26 13:45:08 -070056
Shih-wei Liao6b32fab2010-12-10 01:03:59 -080057 /*
Jack Palevich60aa3ea2009-05-26 13:45:08 -070058 * We use a class initializer to allow the native code to cache some
59 * field offsets.
60 */
Dan Morrille4d9a012013-03-28 18:10:43 -070061 @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"}) // TODO: now used locally; remove?
Jason Samsbf6ef8d2010-12-06 15:59:59 -080062 static boolean sInitialized;
63 native static void _nInit();
Jack Palevich60aa3ea2009-05-26 13:45:08 -070064
Tim Murray2f2472c2013-08-22 14:55:26 -070065 static Object sRuntime;
66 static Method registerNativeAllocation;
67 static Method registerNativeFree;
Jason Samsdba3ba52009-07-30 14:56:12 -070068
Jack Palevich60aa3ea2009-05-26 13:45:08 -070069 static {
70 sInitialized = false;
Dan Morrille4d9a012013-03-28 18:10:43 -070071 if (!SystemProperties.getBoolean("config.disable_renderscript", false)) {
72 try {
Tim Murray2f2472c2013-08-22 14:55:26 -070073 Class<?> vm_runtime = Class.forName("dalvik.system.VMRuntime");
74 Method get_runtime = vm_runtime.getDeclaredMethod("getRuntime");
75 sRuntime = get_runtime.invoke(null);
76 registerNativeAllocation = vm_runtime.getDeclaredMethod("registerNativeAllocation", Integer.TYPE);
77 registerNativeFree = vm_runtime.getDeclaredMethod("registerNativeFree", Integer.TYPE);
78 } catch (Exception e) {
79 Log.e(LOG_TAG, "Error loading GC methods: " + e);
80 throw new RSRuntimeException("Error loading GC methods: " + e);
81 }
82 try {
Dan Morrille4d9a012013-03-28 18:10:43 -070083 System.loadLibrary("rs_jni");
84 _nInit();
85 sInitialized = true;
86 } catch (UnsatisfiedLinkError e) {
87 Log.e(LOG_TAG, "Error loading RS jni library: " + e);
88 throw new RSRuntimeException("Error loading RS jni library: " + e);
89 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -070090 }
91 }
92
Jason Sams2e1872f2010-08-17 16:25:41 -070093 // Non-threadsafe functions.
Jason Sams36e612a2009-07-31 16:26:13 -070094 native int nDeviceCreate();
95 native void nDeviceDestroy(int dev);
Jason Samsebfb4362009-09-23 13:57:02 -070096 native void nDeviceSetConfig(int dev, int param, int value);
Jason Samsedbfabd2011-05-17 15:01:29 -070097 native int nContextGetUserMessage(int con, int[] data);
Jason Sams1c415172010-11-08 17:06:46 -080098 native String nContextGetErrorMessage(int con);
Jason Samsedbfabd2011-05-17 15:01:29 -070099 native int nContextPeekMessage(int con, int[] subID);
Jason Sams2e1872f2010-08-17 16:25:41 -0700100 native void nContextInitToClient(int con);
101 native void nContextDeinitToClient(int con);
Jason Sams3eaa3382009-06-10 15:04:38 -0700102
Stephen Hines7d25a822013-04-09 23:51:56 -0700103 static File mCacheDir;
Jason Samsa6f338c2012-02-24 16:22:16 -0800104
105 /**
106 * Sets the directory to use as a persistent storage for the
107 * renderscript object file cache.
108 *
109 * @hide
110 * @param cacheDir A directory the current process can write to
111 */
Jason Samsa6f338c2012-02-24 16:22:16 -0800112 public static void setupDiskCache(File cacheDir) {
Dan Morrille4d9a012013-03-28 18:10:43 -0700113 if (!sInitialized) {
114 Log.e(LOG_TAG, "RenderScript.setupDiskCache() called when disabled");
115 return;
116 }
117
Stephen Hines7d25a822013-04-09 23:51:56 -0700118 // Defer creation of cache path to nScriptCCreate().
119 mCacheDir = cacheDir;
Jason Samsa6f338c2012-02-24 16:22:16 -0800120 }
121
Jason Sams02d56d92013-04-12 16:40:50 -0700122 /**
123 * ContextType specifies the specific type of context to be created.
124 *
125 */
Jason Samsadd26dc2013-02-22 18:43:45 -0800126 public enum ContextType {
Jason Sams02d56d92013-04-12 16:40:50 -0700127 /**
128 * NORMAL context, this is the default and what shipping apps should
129 * use.
130 */
Jason Samsadd26dc2013-02-22 18:43:45 -0800131 NORMAL (0),
Jason Sams02d56d92013-04-12 16:40:50 -0700132
133 /**
134 * DEBUG context, perform extra runtime checks to validate the
135 * kernels and APIs are being used as intended. Get and SetElementAt
136 * will be bounds checked in this mode.
137 */
Jason Samsadd26dc2013-02-22 18:43:45 -0800138 DEBUG (1),
Jason Sams02d56d92013-04-12 16:40:50 -0700139
140 /**
141 * PROFILE context, Intended to be used once the first time an
142 * application is run on a new device. This mode allows the runtime to
143 * do additional testing and performance tuning.
144 */
Jason Samsadd26dc2013-02-22 18:43:45 -0800145 PROFILE (2);
146
147 int mID;
148 ContextType(int id) {
149 mID = id;
150 }
151 }
Jason Sams718cd1f2009-12-23 14:35:29 -0800152
Stephen Hines42028a82013-04-17 19:22:01 -0700153 ContextType mContextType;
154
Jason Sams2e1872f2010-08-17 16:25:41 -0700155 // Methods below are wrapped to protect the non-threadsafe
156 // lockless fifo.
Stephen Hines4382467a2011-08-01 15:02:34 -0700157 native int rsnContextCreateGL(int dev, int ver, int sdkVer,
Jason Sams11c8af92010-10-13 15:31:10 -0700158 int colorMin, int colorPref,
159 int alphaMin, int alphaPref,
160 int depthMin, int depthPref,
161 int stencilMin, int stencilPref,
Alex Sakhartchouk2c74ad92011-03-16 19:28:25 -0700162 int samplesMin, int samplesPref, float samplesQ, int dpi);
Stephen Hines4382467a2011-08-01 15:02:34 -0700163 synchronized int nContextCreateGL(int dev, int ver, int sdkVer,
Jason Sams11c8af92010-10-13 15:31:10 -0700164 int colorMin, int colorPref,
165 int alphaMin, int alphaPref,
166 int depthMin, int depthPref,
167 int stencilMin, int stencilPref,
Alex Sakhartchouk2c74ad92011-03-16 19:28:25 -0700168 int samplesMin, int samplesPref, float samplesQ, int dpi) {
Stephen Hines4382467a2011-08-01 15:02:34 -0700169 return rsnContextCreateGL(dev, ver, sdkVer, colorMin, colorPref,
Jason Sams11c8af92010-10-13 15:31:10 -0700170 alphaMin, alphaPref, depthMin, depthPref,
171 stencilMin, stencilPref,
Alex Sakhartchouk2c74ad92011-03-16 19:28:25 -0700172 samplesMin, samplesPref, samplesQ, dpi);
Jason Sams2e1872f2010-08-17 16:25:41 -0700173 }
Jason Samsadd26dc2013-02-22 18:43:45 -0800174 native int rsnContextCreate(int dev, int ver, int sdkVer, int contextType);
175 synchronized int nContextCreate(int dev, int ver, int sdkVer, int contextType) {
176 return rsnContextCreate(dev, ver, sdkVer, contextType);
Jason Sams2e1872f2010-08-17 16:25:41 -0700177 }
178 native void rsnContextDestroy(int con);
179 synchronized void nContextDestroy() {
Jason Samsd1ac9812011-01-18 18:12:26 -0800180 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700181 rsnContextDestroy(mContext);
182 }
183 native void rsnContextSetSurface(int con, int w, int h, Surface sur);
184 synchronized void nContextSetSurface(int w, int h, Surface sur) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800185 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700186 rsnContextSetSurface(mContext, w, h, sur);
187 }
Jason Samsfaa32b32011-06-20 16:58:04 -0700188 native void rsnContextSetSurfaceTexture(int con, int w, int h, SurfaceTexture sur);
189 synchronized void nContextSetSurfaceTexture(int w, int h, SurfaceTexture sur) {
190 validate();
191 rsnContextSetSurfaceTexture(mContext, w, h, sur);
192 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700193 native void rsnContextSetPriority(int con, int p);
194 synchronized void nContextSetPriority(int p) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800195 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700196 rsnContextSetPriority(mContext, p);
197 }
198 native void rsnContextDump(int con, int bits);
199 synchronized void nContextDump(int bits) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800200 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700201 rsnContextDump(mContext, bits);
202 }
203 native void rsnContextFinish(int con);
204 synchronized void nContextFinish() {
Jason Samsd1ac9812011-01-18 18:12:26 -0800205 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700206 rsnContextFinish(mContext);
207 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700208
Jason Sams455d6442013-02-05 19:20:18 -0800209 native void rsnContextSendMessage(int con, int id, int[] data);
210 synchronized void nContextSendMessage(int id, int[] data) {
211 validate();
212 rsnContextSendMessage(mContext, id, data);
213 }
214
Jason Sams2e1872f2010-08-17 16:25:41 -0700215 native void rsnContextBindRootScript(int con, int script);
216 synchronized void nContextBindRootScript(int script) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800217 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700218 rsnContextBindRootScript(mContext, script);
219 }
220 native void rsnContextBindSampler(int con, int sampler, int slot);
221 synchronized void nContextBindSampler(int sampler, int slot) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800222 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700223 rsnContextBindSampler(mContext, sampler, slot);
224 }
225 native void rsnContextBindProgramStore(int con, int pfs);
226 synchronized void nContextBindProgramStore(int pfs) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800227 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700228 rsnContextBindProgramStore(mContext, pfs);
229 }
230 native void rsnContextBindProgramFragment(int con, int pf);
231 synchronized void nContextBindProgramFragment(int pf) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800232 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700233 rsnContextBindProgramFragment(mContext, pf);
234 }
235 native void rsnContextBindProgramVertex(int con, int pv);
236 synchronized void nContextBindProgramVertex(int pv) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800237 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700238 rsnContextBindProgramVertex(mContext, pv);
239 }
240 native void rsnContextBindProgramRaster(int con, int pr);
241 synchronized void nContextBindProgramRaster(int pr) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800242 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700243 rsnContextBindProgramRaster(mContext, pr);
244 }
245 native void rsnContextPause(int con);
246 synchronized void nContextPause() {
Jason Samsd1ac9812011-01-18 18:12:26 -0800247 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700248 rsnContextPause(mContext);
249 }
250 native void rsnContextResume(int con);
251 synchronized void nContextResume() {
Jason Samsd1ac9812011-01-18 18:12:26 -0800252 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700253 rsnContextResume(mContext);
254 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700255
Jason Sams2e1872f2010-08-17 16:25:41 -0700256 native void rsnAssignName(int con, int obj, byte[] name);
257 synchronized void nAssignName(int obj, byte[] name) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800258 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700259 rsnAssignName(mContext, obj, name);
260 }
261 native String rsnGetName(int con, int obj);
262 synchronized String nGetName(int obj) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800263 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700264 return rsnGetName(mContext, obj);
265 }
266 native void rsnObjDestroy(int con, int id);
267 synchronized void nObjDestroy(int id) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800268 // There is a race condition here. The calling code may be run
269 // by the gc while teardown is occuring. This protects againts
270 // deleting dead objects.
271 if (mContext != 0) {
272 rsnObjDestroy(mContext, id);
273 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700274 }
Jason Samsfe08d992009-05-27 14:45:32 -0700275
Jason Sams2e1872f2010-08-17 16:25:41 -0700276 native int rsnElementCreate(int con, int type, int kind, boolean norm, int vecSize);
277 synchronized int nElementCreate(int type, int kind, boolean norm, int vecSize) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800278 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700279 return rsnElementCreate(mContext, type, kind, norm, vecSize);
280 }
Jason Sams70d4e502010-09-02 17:35:23 -0700281 native int rsnElementCreate2(int con, int[] elements, String[] names, int[] arraySizes);
282 synchronized int nElementCreate2(int[] elements, String[] names, int[] arraySizes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800283 validate();
Jason Sams70d4e502010-09-02 17:35:23 -0700284 return rsnElementCreate2(mContext, elements, names, arraySizes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700285 }
286 native void rsnElementGetNativeData(int con, int id, int[] elementData);
287 synchronized void nElementGetNativeData(int id, int[] elementData) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800288 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700289 rsnElementGetNativeData(mContext, id, elementData);
290 }
Alex Sakhartchouk7d5f5e72011-10-18 11:08:31 -0700291 native void rsnElementGetSubElements(int con, int id,
292 int[] IDs, String[] names, int[] arraySizes);
293 synchronized void nElementGetSubElements(int id, int[] IDs, String[] names, int[] arraySizes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800294 validate();
Alex Sakhartchouk7d5f5e72011-10-18 11:08:31 -0700295 rsnElementGetSubElements(mContext, id, IDs, names, arraySizes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700296 }
Jason Sams768bc022009-09-21 19:41:04 -0700297
Jason Samsb109cc72013-01-07 18:20:12 -0800298 native int rsnTypeCreate(int con, int eid, int x, int y, int z, boolean mips, boolean faces, int yuv);
299 synchronized int nTypeCreate(int eid, int x, int y, int z, boolean mips, boolean faces, int yuv) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800300 validate();
Jason Samsb109cc72013-01-07 18:20:12 -0800301 return rsnTypeCreate(mContext, eid, x, y, z, mips, faces, yuv);
Jason Sams2e1872f2010-08-17 16:25:41 -0700302 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700303 native void rsnTypeGetNativeData(int con, int id, int[] typeData);
304 synchronized void nTypeGetNativeData(int id, int[] typeData) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800305 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700306 rsnTypeGetNativeData(mContext, id, typeData);
307 }
Jason Sams768bc022009-09-21 19:41:04 -0700308
Jason Sams857d0c72011-11-23 15:02:15 -0800309 native int rsnAllocationCreateTyped(int con, int type, int mip, int usage, int pointer);
310 synchronized int nAllocationCreateTyped(int type, int mip, int usage, int pointer) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800311 validate();
Jason Sams857d0c72011-11-23 15:02:15 -0800312 return rsnAllocationCreateTyped(mContext, type, mip, usage, pointer);
Jason Sams2e1872f2010-08-17 16:25:41 -0700313 }
Jason Sams5476b452010-12-08 16:14:36 -0800314 native int rsnAllocationCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage);
315 synchronized int nAllocationCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800316 validate();
Jason Sams5476b452010-12-08 16:14:36 -0800317 return rsnAllocationCreateFromBitmap(mContext, type, mip, bmp, usage);
Alex Sakhartchouk26ae3902010-10-11 12:35:15 -0700318 }
Tim Murraya3145512012-12-04 17:59:29 -0800319
320 native int rsnAllocationCreateBitmapBackedAllocation(int con, int type, int mip, Bitmap bmp, int usage);
321 synchronized int nAllocationCreateBitmapBackedAllocation(int type, int mip, Bitmap bmp, int usage) {
322 validate();
323 return rsnAllocationCreateBitmapBackedAllocation(mContext, type, mip, bmp, usage);
324 }
325
326
Jason Sams5476b452010-12-08 16:14:36 -0800327 native int rsnAllocationCubeCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage);
328 synchronized int nAllocationCubeCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800329 validate();
Jason Sams5476b452010-12-08 16:14:36 -0800330 return rsnAllocationCubeCreateFromBitmap(mContext, type, mip, bmp, usage);
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -0800331 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700332 native int rsnAllocationCreateBitmapRef(int con, int type, Bitmap bmp);
333 synchronized int nAllocationCreateBitmapRef(int type, Bitmap bmp) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800334 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700335 return rsnAllocationCreateBitmapRef(mContext, type, bmp);
336 }
Jason Sams5476b452010-12-08 16:14:36 -0800337 native int rsnAllocationCreateFromAssetStream(int con, int mips, int assetStream, int usage);
338 synchronized int nAllocationCreateFromAssetStream(int mips, int assetStream, int usage) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800339 validate();
Jason Sams5476b452010-12-08 16:14:36 -0800340 return rsnAllocationCreateFromAssetStream(mContext, mips, assetStream, usage);
341 }
342
Jason Sams4ef66502010-12-10 16:03:15 -0800343 native void rsnAllocationCopyToBitmap(int con, int alloc, Bitmap bmp);
344 synchronized void nAllocationCopyToBitmap(int alloc, Bitmap bmp) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800345 validate();
Jason Sams4ef66502010-12-10 16:03:15 -0800346 rsnAllocationCopyToBitmap(mContext, alloc, bmp);
347 }
348
349
Jason Sams5476b452010-12-08 16:14:36 -0800350 native void rsnAllocationSyncAll(int con, int alloc, int src);
351 synchronized void nAllocationSyncAll(int alloc, int src) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800352 validate();
Jason Sams5476b452010-12-08 16:14:36 -0800353 rsnAllocationSyncAll(mContext, alloc, src);
354 }
Jason Sams72226e02013-02-22 12:45:54 -0800355 native Surface rsnAllocationGetSurface(int con, int alloc);
356 synchronized Surface nAllocationGetSurface(int alloc) {
Jason Sams615e7ce2012-01-13 14:01:20 -0800357 validate();
Jason Sams72226e02013-02-22 12:45:54 -0800358 return rsnAllocationGetSurface(mContext, alloc);
Jason Samsfe1d5ff2012-03-23 11:47:26 -0700359 }
Jason Samsfb9aa9f2012-03-28 15:30:07 -0700360 native void rsnAllocationSetSurface(int con, int alloc, Surface sur);
361 synchronized void nAllocationSetSurface(int alloc, Surface sur) {
Jason Sams163766c2012-02-15 12:04:24 -0800362 validate();
Jason Samsfb9aa9f2012-03-28 15:30:07 -0700363 rsnAllocationSetSurface(mContext, alloc, sur);
Jason Sams163766c2012-02-15 12:04:24 -0800364 }
365 native void rsnAllocationIoSend(int con, int alloc);
366 synchronized void nAllocationIoSend(int alloc) {
367 validate();
368 rsnAllocationIoSend(mContext, alloc);
369 }
370 native void rsnAllocationIoReceive(int con, int alloc);
371 synchronized void nAllocationIoReceive(int alloc) {
372 validate();
373 rsnAllocationIoReceive(mContext, alloc);
374 }
375
Jason Sams615e7ce2012-01-13 14:01:20 -0800376
Jason Samsf7086092011-01-12 13:28:37 -0800377 native void rsnAllocationGenerateMipmaps(int con, int alloc);
378 synchronized void nAllocationGenerateMipmaps(int alloc) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800379 validate();
Jason Samsf7086092011-01-12 13:28:37 -0800380 rsnAllocationGenerateMipmaps(mContext, alloc);
381 }
Jason Sams4ef66502010-12-10 16:03:15 -0800382 native void rsnAllocationCopyFromBitmap(int con, int alloc, Bitmap bmp);
383 synchronized void nAllocationCopyFromBitmap(int alloc, Bitmap bmp) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800384 validate();
Jason Sams4ef66502010-12-10 16:03:15 -0800385 rsnAllocationCopyFromBitmap(mContext, alloc, bmp);
Jason Sams2e1872f2010-08-17 16:25:41 -0700386 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700387
Jason Sams49a05d72010-12-29 14:31:29 -0800388
389 native void rsnAllocationData1D(int con, int id, int off, int mip, int count, int[] d, int sizeBytes);
390 synchronized void nAllocationData1D(int id, int off, int mip, int count, int[] d, int sizeBytes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800391 validate();
Jason Sams49a05d72010-12-29 14:31:29 -0800392 rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700393 }
Jason Sams49a05d72010-12-29 14:31:29 -0800394 native void rsnAllocationData1D(int con, int id, int off, int mip, int count, short[] d, int sizeBytes);
395 synchronized void nAllocationData1D(int id, int off, int mip, int count, short[] d, int sizeBytes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800396 validate();
Jason Sams49a05d72010-12-29 14:31:29 -0800397 rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
398 }
399 native void rsnAllocationData1D(int con, int id, int off, int mip, int count, byte[] d, int sizeBytes);
400 synchronized void nAllocationData1D(int id, int off, int mip, int count, byte[] d, int sizeBytes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800401 validate();
Jason Sams49a05d72010-12-29 14:31:29 -0800402 rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
403 }
404 native void rsnAllocationData1D(int con, int id, int off, int mip, int count, float[] d, int sizeBytes);
405 synchronized void nAllocationData1D(int id, int off, int mip, int count, float[] d, int sizeBytes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800406 validate();
Jason Sams49a05d72010-12-29 14:31:29 -0800407 rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700408 }
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -0700409
Jason Sams49a05d72010-12-29 14:31:29 -0800410 native void rsnAllocationElementData1D(int con, int id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes);
411 synchronized void nAllocationElementData1D(int id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800412 validate();
Jason Sams49a05d72010-12-29 14:31:29 -0800413 rsnAllocationElementData1D(mContext, id, xoff, mip, compIdx, d, sizeBytes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700414 }
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700415
Alex Sakhartchouk304b1f52011-06-14 11:13:19 -0700416 native void rsnAllocationData2D(int con,
417 int dstAlloc, int dstXoff, int dstYoff,
418 int dstMip, int dstFace,
419 int width, int height,
420 int srcAlloc, int srcXoff, int srcYoff,
421 int srcMip, int srcFace);
422 synchronized void nAllocationData2D(int dstAlloc, int dstXoff, int dstYoff,
423 int dstMip, int dstFace,
424 int width, int height,
425 int srcAlloc, int srcXoff, int srcYoff,
426 int srcMip, int srcFace) {
427 validate();
428 rsnAllocationData2D(mContext,
429 dstAlloc, dstXoff, dstYoff,
430 dstMip, dstFace,
431 width, height,
432 srcAlloc, srcXoff, srcYoff,
433 srcMip, srcFace);
434 }
435
Jason Samsfa445b92011-01-07 17:00:07 -0800436 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, byte[] d, int sizeBytes);
437 synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, byte[] d, int sizeBytes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800438 validate();
Jason Samsfa445b92011-01-07 17:00:07 -0800439 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
440 }
441 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, short[] d, int sizeBytes);
442 synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, short[] d, int sizeBytes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800443 validate();
Jason Samsfa445b92011-01-07 17:00:07 -0800444 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
445 }
Jason Sams49a05d72010-12-29 14:31:29 -0800446 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, int[] d, int sizeBytes);
447 synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, int[] d, int sizeBytes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800448 validate();
Jason Sams49a05d72010-12-29 14:31:29 -0800449 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700450 }
Jason Sams49a05d72010-12-29 14:31:29 -0800451 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, float[] d, int sizeBytes);
452 synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, float[] d, int sizeBytes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800453 validate();
Jason Sams49a05d72010-12-29 14:31:29 -0800454 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700455 }
Jason Samsfa445b92011-01-07 17:00:07 -0800456 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, Bitmap b);
457 synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, Bitmap b) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800458 validate();
Jason Samsfa445b92011-01-07 17:00:07 -0800459 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, b);
460 }
Jason Sams49a05d72010-12-29 14:31:29 -0800461
Jason Samsb05d6892013-04-09 15:59:24 -0700462 native void rsnAllocationData3D(int con,
463 int dstAlloc, int dstXoff, int dstYoff, int dstZoff,
464 int dstMip,
465 int width, int height, int depth,
466 int srcAlloc, int srcXoff, int srcYoff, int srcZoff,
467 int srcMip);
468 synchronized void nAllocationData3D(int dstAlloc, int dstXoff, int dstYoff, int dstZoff,
469 int dstMip,
470 int width, int height, int depth,
471 int srcAlloc, int srcXoff, int srcYoff, int srcZoff,
472 int srcMip) {
473 validate();
474 rsnAllocationData3D(mContext,
475 dstAlloc, dstXoff, dstYoff, dstZoff,
476 dstMip, width, height, depth,
477 srcAlloc, srcXoff, srcYoff, srcZoff, srcMip);
478 }
479
480 native void rsnAllocationData3D(int con, int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, byte[] d, int sizeBytes);
481 synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, byte[] d, int sizeBytes) {
482 validate();
483 rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
484 }
485 native void rsnAllocationData3D(int con, int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, short[] d, int sizeBytes);
486 synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, short[] d, int sizeBytes) {
487 validate();
488 rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
489 }
490 native void rsnAllocationData3D(int con, int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, int[] d, int sizeBytes);
491 synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, int[] d, int sizeBytes) {
492 validate();
493 rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
494 }
495 native void rsnAllocationData3D(int con, int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, float[] d, int sizeBytes);
496 synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, float[] d, int sizeBytes) {
497 validate();
498 rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
499 }
500
501
Jason Samsfa445b92011-01-07 17:00:07 -0800502 native void rsnAllocationRead(int con, int id, byte[] d);
503 synchronized void nAllocationRead(int id, byte[] d) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800504 validate();
Jason Samsfa445b92011-01-07 17:00:07 -0800505 rsnAllocationRead(mContext, id, d);
506 }
507 native void rsnAllocationRead(int con, int id, short[] d);
508 synchronized void nAllocationRead(int id, short[] d) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800509 validate();
Jason Samsfa445b92011-01-07 17:00:07 -0800510 rsnAllocationRead(mContext, id, d);
511 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700512 native void rsnAllocationRead(int con, int id, int[] d);
513 synchronized void nAllocationRead(int id, int[] d) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800514 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700515 rsnAllocationRead(mContext, id, d);
516 }
517 native void rsnAllocationRead(int con, int id, float[] d);
518 synchronized void nAllocationRead(int id, float[] d) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800519 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700520 rsnAllocationRead(mContext, id, d);
521 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700522 native int rsnAllocationGetType(int con, int id);
523 synchronized int nAllocationGetType(int id) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800524 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700525 return rsnAllocationGetType(mContext, id);
526 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700527
Jason Sams5edc6082010-10-05 13:32:49 -0700528 native void rsnAllocationResize1D(int con, int id, int dimX);
529 synchronized void nAllocationResize1D(int id, int dimX) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800530 validate();
Jason Sams5edc6082010-10-05 13:32:49 -0700531 rsnAllocationResize1D(mContext, id, dimX);
532 }
Jason Sams5edc6082010-10-05 13:32:49 -0700533
Jason Sams2e1872f2010-08-17 16:25:41 -0700534 native int rsnFileA3DCreateFromAssetStream(int con, int assetStream);
535 synchronized int nFileA3DCreateFromAssetStream(int assetStream) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800536 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700537 return rsnFileA3DCreateFromAssetStream(mContext, assetStream);
538 }
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800539 native int rsnFileA3DCreateFromFile(int con, String path);
540 synchronized int nFileA3DCreateFromFile(String path) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800541 validate();
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800542 return rsnFileA3DCreateFromFile(mContext, path);
543 }
544 native int rsnFileA3DCreateFromAsset(int con, AssetManager mgr, String path);
545 synchronized int nFileA3DCreateFromAsset(AssetManager mgr, String path) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800546 validate();
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800547 return rsnFileA3DCreateFromAsset(mContext, mgr, path);
548 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700549 native int rsnFileA3DGetNumIndexEntries(int con, int fileA3D);
550 synchronized int nFileA3DGetNumIndexEntries(int fileA3D) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800551 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700552 return rsnFileA3DGetNumIndexEntries(mContext, fileA3D);
553 }
554 native void rsnFileA3DGetIndexEntries(int con, int fileA3D, int numEntries, int[] IDs, String[] names);
555 synchronized void nFileA3DGetIndexEntries(int fileA3D, int numEntries, int[] IDs, String[] names) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800556 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700557 rsnFileA3DGetIndexEntries(mContext, fileA3D, numEntries, IDs, names);
558 }
559 native int rsnFileA3DGetEntryByIndex(int con, int fileA3D, int index);
560 synchronized int nFileA3DGetEntryByIndex(int fileA3D, int index) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800561 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700562 return rsnFileA3DGetEntryByIndex(mContext, fileA3D, index);
563 }
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700564
Alex Sakhartchouke27cdee2010-12-17 11:41:08 -0800565 native int rsnFontCreateFromFile(int con, String fileName, float size, int dpi);
566 synchronized int nFontCreateFromFile(String fileName, float size, int dpi) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800567 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700568 return rsnFontCreateFromFile(mContext, fileName, size, dpi);
569 }
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800570 native int rsnFontCreateFromAssetStream(int con, String name, float size, int dpi, int assetStream);
571 synchronized int nFontCreateFromAssetStream(String name, float size, int dpi, int assetStream) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800572 validate();
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800573 return rsnFontCreateFromAssetStream(mContext, name, size, dpi, assetStream);
574 }
575 native int rsnFontCreateFromAsset(int con, AssetManager mgr, String path, float size, int dpi);
576 synchronized int nFontCreateFromAsset(AssetManager mgr, String path, float size, int dpi) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800577 validate();
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800578 return rsnFontCreateFromAsset(mContext, mgr, path, size, dpi);
579 }
Jason Sams22534172009-08-04 16:58:20 -0700580
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700581
Jason Sams2e1872f2010-08-17 16:25:41 -0700582 native void rsnScriptBindAllocation(int con, int script, int alloc, int slot);
583 synchronized void nScriptBindAllocation(int script, int alloc, int slot) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800584 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700585 rsnScriptBindAllocation(mContext, script, alloc, slot);
586 }
587 native void rsnScriptSetTimeZone(int con, int script, byte[] timeZone);
588 synchronized void nScriptSetTimeZone(int script, byte[] timeZone) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800589 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700590 rsnScriptSetTimeZone(mContext, script, timeZone);
591 }
592 native void rsnScriptInvoke(int con, int id, int slot);
593 synchronized void nScriptInvoke(int id, int slot) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800594 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700595 rsnScriptInvoke(mContext, id, slot);
596 }
Jason Sams6e494d32011-04-27 16:33:11 -0700597 native void rsnScriptForEach(int con, int id, int slot, int ain, int aout, byte[] params);
598 native void rsnScriptForEach(int con, int id, int slot, int ain, int aout);
Tim Murrayeb8c29c2013-02-07 12:16:41 -0800599 native void rsnScriptForEachClipped(int con, int id, int slot, int ain, int aout, byte[] params,
600 int xstart, int xend, int ystart, int yend, int zstart, int zend);
Stephen Hinesdac6ed02013-02-13 00:09:02 -0800601 native void rsnScriptForEachClipped(int con, int id, int slot, int ain, int aout,
602 int xstart, int xend, int ystart, int yend, int zstart, int zend);
Jason Sams6e494d32011-04-27 16:33:11 -0700603 synchronized void nScriptForEach(int id, int slot, int ain, int aout, byte[] params) {
604 validate();
605 if (params == null) {
606 rsnScriptForEach(mContext, id, slot, ain, aout);
607 } else {
608 rsnScriptForEach(mContext, id, slot, ain, aout, params);
609 }
610 }
Tim Murrayeb8c29c2013-02-07 12:16:41 -0800611
612 synchronized void nScriptForEachClipped(int id, int slot, int ain, int aout, byte[] params,
613 int xstart, int xend, int ystart, int yend, int zstart, int zend) {
614 validate();
Stephen Hinesdac6ed02013-02-13 00:09:02 -0800615 if (params == null) {
616 rsnScriptForEachClipped(mContext, id, slot, ain, aout, xstart, xend, ystart, yend, zstart, zend);
617 } else {
618 rsnScriptForEachClipped(mContext, id, slot, ain, aout, params, xstart, xend, ystart, yend, zstart, zend);
619 }
Tim Murrayeb8c29c2013-02-07 12:16:41 -0800620 }
621
Jason Sams2e1872f2010-08-17 16:25:41 -0700622 native void rsnScriptInvokeV(int con, int id, int slot, byte[] params);
623 synchronized void nScriptInvokeV(int id, int slot, byte[] params) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800624 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700625 rsnScriptInvokeV(mContext, id, slot, params);
626 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700627
Jason Sams2e1872f2010-08-17 16:25:41 -0700628 native void rsnScriptSetVarI(int con, int id, int slot, int val);
629 synchronized void nScriptSetVarI(int id, int slot, int val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800630 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700631 rsnScriptSetVarI(mContext, id, slot, val);
632 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700633 native int rsnScriptGetVarI(int con, int id, int slot);
634 synchronized int nScriptGetVarI(int id, int slot) {
635 validate();
636 return rsnScriptGetVarI(mContext, id, slot);
637 }
638
Stephen Hines031ec58c2010-10-11 10:54:21 -0700639 native void rsnScriptSetVarJ(int con, int id, int slot, long val);
640 synchronized void nScriptSetVarJ(int id, int slot, long val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800641 validate();
Stephen Hines031ec58c2010-10-11 10:54:21 -0700642 rsnScriptSetVarJ(mContext, id, slot, val);
643 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700644 native long rsnScriptGetVarJ(int con, int id, int slot);
645 synchronized long nScriptGetVarJ(int id, int slot) {
646 validate();
647 return rsnScriptGetVarJ(mContext, id, slot);
648 }
649
Jason Sams2e1872f2010-08-17 16:25:41 -0700650 native void rsnScriptSetVarF(int con, int id, int slot, float val);
651 synchronized void nScriptSetVarF(int id, int slot, float val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800652 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700653 rsnScriptSetVarF(mContext, id, slot, val);
654 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700655 native float rsnScriptGetVarF(int con, int id, int slot);
656 synchronized float nScriptGetVarF(int id, int slot) {
657 validate();
658 return rsnScriptGetVarF(mContext, id, slot);
659 }
Stephen Hinesca54ec32010-09-20 17:20:30 -0700660 native void rsnScriptSetVarD(int con, int id, int slot, double val);
661 synchronized void nScriptSetVarD(int id, int slot, double val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800662 validate();
Stephen Hinesca54ec32010-09-20 17:20:30 -0700663 rsnScriptSetVarD(mContext, id, slot, val);
664 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700665 native double rsnScriptGetVarD(int con, int id, int slot);
666 synchronized double nScriptGetVarD(int id, int slot) {
667 validate();
668 return rsnScriptGetVarD(mContext, id, slot);
669 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700670 native void rsnScriptSetVarV(int con, int id, int slot, byte[] val);
671 synchronized void nScriptSetVarV(int id, int slot, byte[] val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800672 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700673 rsnScriptSetVarV(mContext, id, slot, val);
674 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700675 native void rsnScriptGetVarV(int con, int id, int slot, byte[] val);
676 synchronized void nScriptGetVarV(int id, int slot, byte[] val) {
677 validate();
678 rsnScriptGetVarV(mContext, id, slot, val);
679 }
Stephen Hinesadeb8092012-04-20 14:26:06 -0700680 native void rsnScriptSetVarVE(int con, int id, int slot, byte[] val,
681 int e, int[] dims);
682 synchronized void nScriptSetVarVE(int id, int slot, byte[] val,
683 int e, int[] dims) {
684 validate();
685 rsnScriptSetVarVE(mContext, id, slot, val, e, dims);
686 }
Jason Sams6f4cf0b2010-11-16 17:37:02 -0800687 native void rsnScriptSetVarObj(int con, int id, int slot, int val);
688 synchronized void nScriptSetVarObj(int id, int slot, int val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800689 validate();
Jason Sams6f4cf0b2010-11-16 17:37:02 -0800690 rsnScriptSetVarObj(mContext, id, slot, val);
691 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700692
Jason Samse4a06c52011-03-16 16:29:28 -0700693 native int rsnScriptCCreate(int con, String resName, String cacheDir,
694 byte[] script, int length);
695 synchronized int nScriptCCreate(String resName, String cacheDir, byte[] script, int length) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800696 validate();
Jason Samse4a06c52011-03-16 16:29:28 -0700697 return rsnScriptCCreate(mContext, resName, cacheDir, script, length);
Jason Sams2e1872f2010-08-17 16:25:41 -0700698 }
Jason Samsebfb4362009-09-23 13:57:02 -0700699
Jason Sams6ab97682012-08-10 12:09:43 -0700700 native int rsnScriptIntrinsicCreate(int con, int id, int eid);
701 synchronized int nScriptIntrinsicCreate(int id, int eid) {
702 validate();
703 return rsnScriptIntrinsicCreate(mContext, id, eid);
704 }
705
Jason Sams08a81582012-09-18 12:32:10 -0700706 native int rsnScriptKernelIDCreate(int con, int sid, int slot, int sig);
707 synchronized int nScriptKernelIDCreate(int sid, int slot, int sig) {
708 validate();
709 return rsnScriptKernelIDCreate(mContext, sid, slot, sig);
710 }
711
712 native int rsnScriptFieldIDCreate(int con, int sid, int slot);
713 synchronized int nScriptFieldIDCreate(int sid, int slot) {
714 validate();
715 return rsnScriptFieldIDCreate(mContext, sid, slot);
716 }
717
718 native int rsnScriptGroupCreate(int con, int[] kernels, int[] src, int[] dstk, int[] dstf, int[] types);
719 synchronized int nScriptGroupCreate(int[] kernels, int[] src, int[] dstk, int[] dstf, int[] types) {
720 validate();
721 return rsnScriptGroupCreate(mContext, kernels, src, dstk, dstf, types);
722 }
723
724 native void rsnScriptGroupSetInput(int con, int group, int kernel, int alloc);
725 synchronized void nScriptGroupSetInput(int group, int kernel, int alloc) {
726 validate();
727 rsnScriptGroupSetInput(mContext, group, kernel, alloc);
728 }
729
730 native void rsnScriptGroupSetOutput(int con, int group, int kernel, int alloc);
731 synchronized void nScriptGroupSetOutput(int group, int kernel, int alloc) {
732 validate();
733 rsnScriptGroupSetOutput(mContext, group, kernel, alloc);
734 }
735
736 native void rsnScriptGroupExecute(int con, int group);
737 synchronized void nScriptGroupExecute(int group) {
738 validate();
739 rsnScriptGroupExecute(mContext, group);
740 }
741
Alex Sakhartchouka89094a2011-05-04 17:45:36 -0700742 native int rsnSamplerCreate(int con, int magFilter, int minFilter,
743 int wrapS, int wrapT, int wrapR, float aniso);
744 synchronized int nSamplerCreate(int magFilter, int minFilter,
745 int wrapS, int wrapT, int wrapR, float aniso) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800746 validate();
Alex Sakhartchouka89094a2011-05-04 17:45:36 -0700747 return rsnSamplerCreate(mContext, magFilter, minFilter, wrapS, wrapT, wrapR, aniso);
Jason Sams2e1872f2010-08-17 16:25:41 -0700748 }
Jason Sams0011bcf2009-12-15 12:58:36 -0800749
Jason Sams331bf9b2011-04-06 11:23:54 -0700750 native int rsnProgramStoreCreate(int con, boolean r, boolean g, boolean b, boolean a,
751 boolean depthMask, boolean dither,
752 int srcMode, int dstMode, int depthFunc);
753 synchronized int nProgramStoreCreate(boolean r, boolean g, boolean b, boolean a,
754 boolean depthMask, boolean dither,
755 int srcMode, int dstMode, int depthFunc) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800756 validate();
Jason Samsbd184c52011-04-06 11:44:47 -0700757 return rsnProgramStoreCreate(mContext, r, g, b, a, depthMask, dither, srcMode,
758 dstMode, depthFunc);
Jason Sams2e1872f2010-08-17 16:25:41 -0700759 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700760
Jason Sams94aaed32011-09-23 14:18:53 -0700761 native int rsnProgramRasterCreate(int con, boolean pointSprite, int cullMode);
762 synchronized int nProgramRasterCreate(boolean pointSprite, int cullMode) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800763 validate();
Jason Sams94aaed32011-09-23 14:18:53 -0700764 return rsnProgramRasterCreate(mContext, pointSprite, cullMode);
Jason Sams2e1872f2010-08-17 16:25:41 -0700765 }
Jason Sams1fe9b8c2009-06-11 14:46:10 -0700766
Jason Sams2e1872f2010-08-17 16:25:41 -0700767 native void rsnProgramBindConstants(int con, int pv, int slot, int mID);
768 synchronized void nProgramBindConstants(int pv, int slot, int mID) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800769 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700770 rsnProgramBindConstants(mContext, pv, slot, mID);
771 }
772 native void rsnProgramBindTexture(int con, int vpf, int slot, int a);
773 synchronized void nProgramBindTexture(int vpf, int slot, int a) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800774 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700775 rsnProgramBindTexture(mContext, vpf, slot, a);
776 }
777 native void rsnProgramBindSampler(int con, int vpf, int slot, int s);
778 synchronized void nProgramBindSampler(int vpf, int slot, int s) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800779 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700780 rsnProgramBindSampler(mContext, vpf, slot, s);
781 }
Alex Sakhartchouk2123b462012-02-15 16:21:46 -0800782 native int rsnProgramFragmentCreate(int con, String shader, String[] texNames, int[] params);
783 synchronized int nProgramFragmentCreate(String shader, String[] texNames, int[] params) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800784 validate();
Alex Sakhartchouk2123b462012-02-15 16:21:46 -0800785 return rsnProgramFragmentCreate(mContext, shader, texNames, params);
Jason Sams2e1872f2010-08-17 16:25:41 -0700786 }
Alex Sakhartchouk2123b462012-02-15 16:21:46 -0800787 native int rsnProgramVertexCreate(int con, String shader, String[] texNames, int[] params);
788 synchronized int nProgramVertexCreate(String shader, String[] texNames, int[] params) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800789 validate();
Alex Sakhartchouk2123b462012-02-15 16:21:46 -0800790 return rsnProgramVertexCreate(mContext, shader, texNames, params);
Jason Sams2e1872f2010-08-17 16:25:41 -0700791 }
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700792
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700793 native int rsnMeshCreate(int con, int[] vtx, int[] idx, int[] prim);
794 synchronized int nMeshCreate(int[] vtx, int[] idx, int[] prim) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800795 validate();
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700796 return rsnMeshCreate(mContext, vtx, idx, prim);
Alex Sakhartchouk9d71e212010-11-08 15:10:52 -0800797 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700798 native int rsnMeshGetVertexBufferCount(int con, int id);
799 synchronized int nMeshGetVertexBufferCount(int id) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800800 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700801 return rsnMeshGetVertexBufferCount(mContext, id);
802 }
803 native int rsnMeshGetIndexCount(int con, int id);
804 synchronized int nMeshGetIndexCount(int id) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800805 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700806 return rsnMeshGetIndexCount(mContext, id);
807 }
808 native void rsnMeshGetVertices(int con, int id, int[] vtxIds, int vtxIdCount);
809 synchronized void nMeshGetVertices(int id, int[] vtxIds, int vtxIdCount) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800810 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700811 rsnMeshGetVertices(mContext, id, vtxIds, vtxIdCount);
812 }
813 native void rsnMeshGetIndices(int con, int id, int[] idxIds, int[] primitives, int vtxIdCount);
814 synchronized void nMeshGetIndices(int id, int[] idxIds, int[] primitives, int vtxIdCount) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800815 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700816 rsnMeshGetIndices(mContext, id, idxIds, primitives, vtxIdCount);
817 }
818
Jason Samsf15ed012011-10-31 13:23:43 -0700819 native int rsnPathCreate(int con, int prim, boolean isStatic, int vtx, int loop, float q);
820 synchronized int nPathCreate(int prim, boolean isStatic, int vtx, int loop, float q) {
821 validate();
822 return rsnPathCreate(mContext, prim, isStatic, vtx, loop, q);
823 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700824
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800825 int mDev;
826 int mContext;
Romain Guy650a3eb2009-08-31 14:06:43 -0700827 @SuppressWarnings({"FieldCanBeLocal"})
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800828 MessageThread mMessageThread;
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700829
Jason Sams8cb39de2010-06-01 15:47:01 -0700830 Element mElement_U8;
831 Element mElement_I8;
832 Element mElement_U16;
833 Element mElement_I16;
834 Element mElement_U32;
835 Element mElement_I32;
Stephen Hines52d83632010-10-11 16:10:42 -0700836 Element mElement_U64;
Stephen Hinesef1dac22010-10-01 15:39:33 -0700837 Element mElement_I64;
Jason Sams8cb39de2010-06-01 15:47:01 -0700838 Element mElement_F32;
Stephen Hines02f417052010-09-30 15:19:22 -0700839 Element mElement_F64;
Jason Samsf110d4b2010-06-21 17:42:41 -0700840 Element mElement_BOOLEAN;
Jason Sams3c0dfba2009-09-27 17:50:38 -0700841
Jason Sams8cb39de2010-06-01 15:47:01 -0700842 Element mElement_ELEMENT;
843 Element mElement_TYPE;
844 Element mElement_ALLOCATION;
845 Element mElement_SAMPLER;
846 Element mElement_SCRIPT;
847 Element mElement_MESH;
848 Element mElement_PROGRAM_FRAGMENT;
849 Element mElement_PROGRAM_VERTEX;
850 Element mElement_PROGRAM_RASTER;
851 Element mElement_PROGRAM_STORE;
Stephen Hines3a291412012-04-11 17:27:29 -0700852 Element mElement_FONT;
Jason Samsa70f4162010-03-26 15:33:42 -0700853
Jason Sams3c0dfba2009-09-27 17:50:38 -0700854 Element mElement_A_8;
855 Element mElement_RGB_565;
856 Element mElement_RGB_888;
857 Element mElement_RGBA_5551;
858 Element mElement_RGBA_4444;
859 Element mElement_RGBA_8888;
860
Jason Sams8cb39de2010-06-01 15:47:01 -0700861 Element mElement_FLOAT_2;
862 Element mElement_FLOAT_3;
863 Element mElement_FLOAT_4;
Stephen Hines836c4a52011-06-01 14:38:10 -0700864
865 Element mElement_DOUBLE_2;
866 Element mElement_DOUBLE_3;
867 Element mElement_DOUBLE_4;
868
869 Element mElement_UCHAR_2;
870 Element mElement_UCHAR_3;
Jason Sams8cb39de2010-06-01 15:47:01 -0700871 Element mElement_UCHAR_4;
Jason Sams7d787b42009-11-15 12:14:26 -0800872
Stephen Hines836c4a52011-06-01 14:38:10 -0700873 Element mElement_CHAR_2;
874 Element mElement_CHAR_3;
875 Element mElement_CHAR_4;
876
877 Element mElement_USHORT_2;
878 Element mElement_USHORT_3;
879 Element mElement_USHORT_4;
880
881 Element mElement_SHORT_2;
882 Element mElement_SHORT_3;
883 Element mElement_SHORT_4;
884
885 Element mElement_UINT_2;
886 Element mElement_UINT_3;
887 Element mElement_UINT_4;
888
889 Element mElement_INT_2;
890 Element mElement_INT_3;
891 Element mElement_INT_4;
892
893 Element mElement_ULONG_2;
894 Element mElement_ULONG_3;
895 Element mElement_ULONG_4;
896
897 Element mElement_LONG_2;
898 Element mElement_LONG_3;
899 Element mElement_LONG_4;
900
Tim Murray932e78e2013-09-03 11:42:26 -0700901 Element mElement_YUV;
902
Jason Sams1d45c472010-08-25 14:31:48 -0700903 Element mElement_MATRIX_4X4;
904 Element mElement_MATRIX_3X3;
905 Element mElement_MATRIX_2X2;
906
Jason Sams4d339932010-05-11 14:03:58 -0700907 Sampler mSampler_CLAMP_NEAREST;
908 Sampler mSampler_CLAMP_LINEAR;
909 Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
910 Sampler mSampler_WRAP_NEAREST;
911 Sampler mSampler_WRAP_LINEAR;
912 Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
Tim Murray6b9b2ca2013-02-15 13:25:55 -0800913 Sampler mSampler_MIRRORED_REPEAT_NEAREST;
914 Sampler mSampler_MIRRORED_REPEAT_LINEAR;
915 Sampler mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR;
Jason Sams4d339932010-05-11 14:03:58 -0700916
Alex Sakhartchoukd36f2482010-08-24 11:37:33 -0700917 ProgramStore mProgramStore_BLEND_NONE_DEPTH_TEST;
918 ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
Alex Sakhartchoukd36f2482010-08-24 11:37:33 -0700919 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_TEST;
920 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
Alex Sakhartchouk32e09b52010-08-23 10:24:10 -0700921
Alex Sakhartchoukd36f2482010-08-24 11:37:33 -0700922 ProgramRaster mProgramRaster_CULL_BACK;
923 ProgramRaster mProgramRaster_CULL_FRONT;
924 ProgramRaster mProgramRaster_CULL_NONE;
Alex Sakhartchouk32e09b52010-08-23 10:24:10 -0700925
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700926 ///////////////////////////////////////////////////////////////////////////////////
Jack Palevich43702d82009-05-28 13:38:16 -0700927 //
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700928
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700929 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -0700930 * The base class from which an application should derive in order
931 * to receive RS messages from scripts. When a script calls {@code
932 * rsSendToClient}, the data fields will be filled, and the run
933 * method will be called on a separate thread. This will occur
934 * some time after {@code rsSendToClient} completes in the script,
935 * as {@code rsSendToClient} is asynchronous. Message handlers are
936 * not guaranteed to have completed when {@link
937 * android.renderscript.RenderScript#finish} returns.
Jason Sams27676fe2010-11-10 17:00:59 -0800938 *
939 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800940 public static class RSMessageHandler implements Runnable {
Jason Sams516c3192009-10-06 13:58:47 -0700941 protected int[] mData;
942 protected int mID;
Jason Sams1c415172010-11-08 17:06:46 -0800943 protected int mLength;
Jason Sams516c3192009-10-06 13:58:47 -0700944 public void run() {
945 }
946 }
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700947 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -0700948 * If an application is expecting messages, it should set this
949 * field to an instance of {@link RSMessageHandler}. This
950 * instance will receive all the user messages sent from {@code
951 * sendToClient} by scripts from this context.
Jason Sams27676fe2010-11-10 17:00:59 -0800952 *
953 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800954 RSMessageHandler mMessageCallback = null;
955
956 public void setMessageHandler(RSMessageHandler msg) {
957 mMessageCallback = msg;
958 }
959 public RSMessageHandler getMessageHandler() {
960 return mMessageCallback;
961 }
Jason Sams516c3192009-10-06 13:58:47 -0700962
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700963 /**
Jason Sams02d56d92013-04-12 16:40:50 -0700964 * Place a message into the message queue to be sent back to the message
965 * handler once all previous commands have been executed.
Jason Sams455d6442013-02-05 19:20:18 -0800966 *
967 * @param id
968 * @param data
969 */
970 public void sendMessage(int id, int[] data) {
971 nContextSendMessage(id, data);
972 }
973
974 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -0700975 * The runtime error handler base class. An application should derive from this class
976 * if it wishes to install an error handler. When errors occur at runtime,
977 * the fields in this class will be filled, and the run method will be called.
Jason Sams27676fe2010-11-10 17:00:59 -0800978 *
979 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800980 public static class RSErrorHandler implements Runnable {
Jason Sams1c415172010-11-08 17:06:46 -0800981 protected String mErrorMessage;
982 protected int mErrorNum;
983 public void run() {
984 }
985 }
Jason Sams27676fe2010-11-10 17:00:59 -0800986
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700987 /**
Jason Sams27676fe2010-11-10 17:00:59 -0800988 * Application Error handler. All runtime errors will be dispatched to the
989 * instance of RSAsyncError set here. If this field is null a
Tim Murrayc11e25c2013-04-09 11:01:01 -0700990 * {@link RSRuntimeException} will instead be thrown with details about the error.
Jason Sams27676fe2010-11-10 17:00:59 -0800991 * This will cause program termaination.
992 *
993 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800994 RSErrorHandler mErrorCallback = null;
995
996 public void setErrorHandler(RSErrorHandler msg) {
997 mErrorCallback = msg;
998 }
999 public RSErrorHandler getErrorHandler() {
1000 return mErrorCallback;
1001 }
Jason Sams1c415172010-11-08 17:06:46 -08001002
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001003 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001004 * RenderScript worker thread priority enumeration. The default value is
1005 * NORMAL. Applications wishing to do background processing should set
1006 * their priority to LOW to avoid starving forground processes.
Jason Sams27676fe2010-11-10 17:00:59 -08001007 */
Jason Sams7d787b42009-11-15 12:14:26 -08001008 public enum Priority {
Glenn Kasten260c77a2011-06-01 17:25:54 -07001009 LOW (Process.THREAD_PRIORITY_BACKGROUND + (5 * Process.THREAD_PRIORITY_LESS_FAVORABLE)),
1010 NORMAL (Process.THREAD_PRIORITY_DISPLAY);
Jason Sams7d787b42009-11-15 12:14:26 -08001011
1012 int mID;
1013 Priority(int id) {
1014 mID = id;
1015 }
1016 }
1017
Jason Sams771bebb2009-12-07 12:40:12 -08001018 void validate() {
1019 if (mContext == 0) {
Jason Samsc1d62102010-11-04 14:32:19 -07001020 throw new RSInvalidStateException("Calling RS with no Context active.");
Jason Sams771bebb2009-12-07 12:40:12 -08001021 }
1022 }
1023
Jason Sams27676fe2010-11-10 17:00:59 -08001024
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001025 /**
Jason Sams27676fe2010-11-10 17:00:59 -08001026 * Change the priority of the worker threads for this context.
1027 *
1028 * @param p New priority to be set.
1029 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001030 public void setPriority(Priority p) {
Jason Sams5dbfe932010-01-27 14:41:43 -08001031 validate();
Jason Sams7d787b42009-11-15 12:14:26 -08001032 nContextSetPriority(p.mID);
1033 }
1034
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001035 static class MessageThread extends Thread {
Jason Sams516c3192009-10-06 13:58:47 -07001036 RenderScript mRS;
1037 boolean mRun = true;
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001038 int[] mAuxData = new int[2];
Jason Sams1c415172010-11-08 17:06:46 -08001039
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001040 static final int RS_MESSAGE_TO_CLIENT_NONE = 0;
1041 static final int RS_MESSAGE_TO_CLIENT_EXCEPTION = 1;
1042 static final int RS_MESSAGE_TO_CLIENT_RESIZE = 2;
1043 static final int RS_MESSAGE_TO_CLIENT_ERROR = 3;
1044 static final int RS_MESSAGE_TO_CLIENT_USER = 4;
Jason Sams739c8262013-04-11 18:07:52 -07001045 static final int RS_MESSAGE_TO_CLIENT_NEW_BUFFER = 5;
Jason Sams516c3192009-10-06 13:58:47 -07001046
Stephen Hines42028a82013-04-17 19:22:01 -07001047 static final int RS_ERROR_FATAL_DEBUG = 0x0800;
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001048 static final int RS_ERROR_FATAL_UNKNOWN = 0x1000;
Jason Samsadd9d962010-11-22 16:20:16 -08001049
Jason Sams516c3192009-10-06 13:58:47 -07001050 MessageThread(RenderScript rs) {
1051 super("RSMessageThread");
1052 mRS = rs;
1053
1054 }
1055
1056 public void run() {
1057 // This function is a temporary solution. The final solution will
1058 // used typed allocations where the message id is the type indicator.
1059 int[] rbuf = new int[16];
Jason Sams2e1872f2010-08-17 16:25:41 -07001060 mRS.nContextInitToClient(mRS.mContext);
Jason Sams516c3192009-10-06 13:58:47 -07001061 while(mRun) {
Jason Sams1d45c472010-08-25 14:31:48 -07001062 rbuf[0] = 0;
Jason Samsedbfabd2011-05-17 15:01:29 -07001063 int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData);
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001064 int size = mAuxData[1];
1065 int subID = mAuxData[0];
Jason Sams1c415172010-11-08 17:06:46 -08001066
1067 if (msg == RS_MESSAGE_TO_CLIENT_USER) {
1068 if ((size>>2) >= rbuf.length) {
1069 rbuf = new int[(size + 3) >> 2];
1070 }
Jason Samsedbfabd2011-05-17 15:01:29 -07001071 if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
1072 RS_MESSAGE_TO_CLIENT_USER) {
Tim Murrayc11e25c2013-04-09 11:01:01 -07001073 throw new RSDriverException("Error processing message from RenderScript.");
Jason Samsedbfabd2011-05-17 15:01:29 -07001074 }
Jason Sams1c415172010-11-08 17:06:46 -08001075
1076 if(mRS.mMessageCallback != null) {
1077 mRS.mMessageCallback.mData = rbuf;
1078 mRS.mMessageCallback.mID = subID;
1079 mRS.mMessageCallback.mLength = size;
1080 mRS.mMessageCallback.run();
Jason Sams1d45c472010-08-25 14:31:48 -07001081 } else {
Jason Sams1c415172010-11-08 17:06:46 -08001082 throw new RSInvalidStateException("Received a message from the script with no message handler installed.");
Jason Sams516c3192009-10-06 13:58:47 -07001083 }
Stephen Hinesab98bb62010-09-24 14:38:30 -07001084 continue;
Jason Sams516c3192009-10-06 13:58:47 -07001085 }
Jason Sams1c415172010-11-08 17:06:46 -08001086
1087 if (msg == RS_MESSAGE_TO_CLIENT_ERROR) {
1088 String e = mRS.nContextGetErrorMessage(mRS.mContext);
1089
Stephen Hines42028a82013-04-17 19:22:01 -07001090 // Throw RSRuntimeException under the following conditions:
1091 //
1092 // 1) It is an unknown fatal error.
1093 // 2) It is a debug fatal error, and we are not in a
1094 // debug context.
1095 // 3) It is a debug fatal error, and we do not have an
1096 // error callback.
1097 if (subID >= RS_ERROR_FATAL_UNKNOWN ||
1098 (subID >= RS_ERROR_FATAL_DEBUG &&
1099 (mRS.mContextType != ContextType.DEBUG ||
1100 mRS.mErrorCallback == null))) {
Jason Samsadd9d962010-11-22 16:20:16 -08001101 throw new RSRuntimeException("Fatal error " + subID + ", details: " + e);
1102 }
1103
Jason Sams1c415172010-11-08 17:06:46 -08001104 if(mRS.mErrorCallback != null) {
1105 mRS.mErrorCallback.mErrorMessage = e;
1106 mRS.mErrorCallback.mErrorNum = subID;
1107 mRS.mErrorCallback.run();
1108 } else {
Jason Samsa4b7bc92013-02-05 15:05:39 -08001109 android.util.Log.e(LOG_TAG, "non fatal RS error, " + e);
Stephen Hinesbe74bdd2012-02-03 15:29:36 -08001110 // Do not throw here. In these cases, we do not have
1111 // a fatal error.
Jason Sams1c415172010-11-08 17:06:46 -08001112 }
1113 continue;
1114 }
1115
Jason Sams739c8262013-04-11 18:07:52 -07001116 if (msg == RS_MESSAGE_TO_CLIENT_NEW_BUFFER) {
1117 Allocation.sendBufferNotification(subID);
1118 continue;
1119 }
1120
Jason Sams1c415172010-11-08 17:06:46 -08001121 // 2: teardown.
1122 // But we want to avoid starving other threads during
1123 // teardown by yielding until the next line in the destructor
1124 // can execute to set mRun = false
1125 try {
1126 sleep(1, 0);
1127 } catch(InterruptedException e) {
Jason Sams516c3192009-10-06 13:58:47 -07001128 }
Jason Sams516c3192009-10-06 13:58:47 -07001129 }
Tim Murrayda67deb2013-05-09 12:02:50 -07001130 //Log.d(LOG_TAG, "MessageThread exiting.");
Jason Sams516c3192009-10-06 13:58:47 -07001131 }
1132 }
1133
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001134 RenderScript(Context ctx) {
Stephen Hines42028a82013-04-17 19:22:01 -07001135 mContextType = ContextType.NORMAL;
Jason Sams1a4e1f32012-02-24 17:51:24 -08001136 if (ctx != null) {
1137 mApplicationContext = ctx.getApplicationContext();
1138 }
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001139 }
1140
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001141 /**
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001142 * Gets the application context associated with the RenderScript context.
1143 *
1144 * @return The application context.
1145 */
1146 public final Context getApplicationContext() {
1147 return mApplicationContext;
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001148 }
1149
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001150 /**
Jason Samsadd26dc2013-02-22 18:43:45 -08001151 * @hide
1152 */
1153 public static RenderScript create(Context ctx, int sdkVersion) {
1154 return create(ctx, sdkVersion, ContextType.NORMAL);
1155 }
1156
1157 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001158 * Create a RenderScript context.
Jason Sams27676fe2010-11-10 17:00:59 -08001159 *
Jason Sams1a4e1f32012-02-24 17:51:24 -08001160 * @hide
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001161 * @param ctx The context.
Jason Sams27676fe2010-11-10 17:00:59 -08001162 * @return RenderScript
1163 */
Jason Samsadd26dc2013-02-22 18:43:45 -08001164 public static RenderScript create(Context ctx, int sdkVersion, ContextType ct) {
Dan Morrille4d9a012013-03-28 18:10:43 -07001165 if (!sInitialized) {
1166 Log.e(LOG_TAG, "RenderScript.create() called when disabled; someone is likely to crash");
1167 return null;
1168 }
1169
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001170 RenderScript rs = new RenderScript(ctx);
Jason Sams704ff642010-02-09 16:05:07 -08001171
1172 rs.mDev = rs.nDeviceCreate();
Jason Samsadd26dc2013-02-22 18:43:45 -08001173 rs.mContext = rs.nContextCreate(rs.mDev, 0, sdkVersion, ct.mID);
Stephen Hines42028a82013-04-17 19:22:01 -07001174 rs.mContextType = ct;
Jason Sams26985362011-05-03 15:01:58 -07001175 if (rs.mContext == 0) {
1176 throw new RSDriverException("Failed to create RS context.");
1177 }
Jason Sams704ff642010-02-09 16:05:07 -08001178 rs.mMessageThread = new MessageThread(rs);
1179 rs.mMessageThread.start();
Jason Sams704ff642010-02-09 16:05:07 -08001180 return rs;
Jason Samsefd9b6fb2009-11-03 13:58:36 -08001181 }
1182
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001183 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001184 * Create a RenderScript context.
Jason Sams1a4e1f32012-02-24 17:51:24 -08001185 *
1186 * @param ctx The context.
1187 * @return RenderScript
1188 */
1189 public static RenderScript create(Context ctx) {
Jason Samsadd26dc2013-02-22 18:43:45 -08001190 return create(ctx, ContextType.NORMAL);
1191 }
1192
1193 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001194 * Create a RenderScript context.
Jason Samsadd26dc2013-02-22 18:43:45 -08001195 *
Jason Samsadd26dc2013-02-22 18:43:45 -08001196 *
1197 * @param ctx The context.
Jason Sams02d56d92013-04-12 16:40:50 -07001198 * @param ct The type of context to be created.
Jason Samsadd26dc2013-02-22 18:43:45 -08001199 * @return RenderScript
1200 */
1201 public static RenderScript create(Context ctx, ContextType ct) {
Jason Sams1a4e1f32012-02-24 17:51:24 -08001202 int v = ctx.getApplicationInfo().targetSdkVersion;
Jason Samsadd26dc2013-02-22 18:43:45 -08001203 return create(ctx, v, ct);
Jason Sams1a4e1f32012-02-24 17:51:24 -08001204 }
1205
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001206 /**
Jason Sams27676fe2010-11-10 17:00:59 -08001207 * Print the currently available debugging information about the state of
1208 * the RS context to the log.
1209 *
Jason Sams27676fe2010-11-10 17:00:59 -08001210 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001211 public void contextDump() {
Jason Sams5dbfe932010-01-27 14:41:43 -08001212 validate();
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001213 nContextDump(0);
Jason Sams715333b2009-11-17 17:26:46 -08001214 }
1215
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001216 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001217 * Wait for any pending asynchronous opeations (such as copies to a RS
1218 * allocation or RS script executions) to complete.
Jason Sams27676fe2010-11-10 17:00:59 -08001219 *
1220 */
Jason Sams96ed4cf2010-06-15 12:15:57 -07001221 public void finish() {
1222 nContextFinish();
1223 }
1224
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001225 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -07001226 * Destroys this RenderScript context. Once this function is called,
1227 * using this context or any objects belonging to this context is
1228 * illegal.
Jason Sams27676fe2010-11-10 17:00:59 -08001229 *
1230 */
Jason Samsf5b45962009-08-25 14:49:07 -07001231 public void destroy() {
Jason Sams5dbfe932010-01-27 14:41:43 -08001232 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -07001233 nContextDeinitToClient(mContext);
Jason Sams516c3192009-10-06 13:58:47 -07001234 mMessageThread.mRun = false;
Jason Samsa8bf9422010-09-16 13:43:19 -07001235 try {
1236 mMessageThread.join();
1237 } catch(InterruptedException e) {
1238 }
Jason Sams516c3192009-10-06 13:58:47 -07001239
Jason Sams2e1872f2010-08-17 16:25:41 -07001240 nContextDestroy();
Jason Samsf5b45962009-08-25 14:49:07 -07001241 mContext = 0;
1242
1243 nDeviceDestroy(mDev);
1244 mDev = 0;
1245 }
Jason Sams02fb2cb2009-05-28 15:37:57 -07001246
Jason Samsa9e7a052009-09-25 14:51:22 -07001247 boolean isAlive() {
1248 return mContext != 0;
1249 }
1250
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001251 int safeID(BaseObj o) {
Jason Sams6b9dec02009-09-23 16:38:37 -07001252 if(o != null) {
Jason Samse07694b2012-04-03 15:36:36 -07001253 return o.getID(this);
Jason Samsd8e41612009-08-20 17:22:40 -07001254 }
Jason Sams6b9dec02009-09-23 16:38:37 -07001255 return 0;
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001256 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001257}