blob: 33639dc57d4fb06bc6d18f3ae9545bf9ea85132f [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 Murray6dacf832013-04-11 19:32:14 -070021import java.util.concurrent.locks.*;
Jason Sams36e612a2009-07-31 16:26:13 -070022
Tim Murray6dacf832013-04-11 19:32:14 -070023import android.app.ActivityManager;
Shih-wei Liao6b32fab2010-12-10 01:03:59 -080024import android.content.Context;
Stephen Hines4382467a2011-08-01 15:02:34 -070025import android.content.pm.ApplicationInfo;
26import android.content.pm.PackageManager;
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -080027import android.content.res.AssetManager;
Jason Samsb8c5a842009-07-31 20:40:47 -070028import android.graphics.Bitmap;
Romain Guy650a3eb2009-08-31 14:06:43 -070029import android.graphics.BitmapFactory;
Jason Samsfaa32b32011-06-20 16:58:04 -070030import android.graphics.SurfaceTexture;
Glenn Kasten260c77a2011-06-01 17:25:54 -070031import android.os.Process;
Jason Sams36e612a2009-07-31 16:26:13 -070032import android.util.Log;
33import android.view.Surface;
Jack Palevich43702d82009-05-28 13:38:16 -070034
Jack Palevich60aa3ea2009-05-26 13:45:08 -070035
Stephen Hines4382467a2011-08-01 15:02:34 -070036
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070037/**
Joe Fernandez3aef8e1d2011-12-20 10:38:34 -080038 * Renderscript base master class. An instance of this class creates native
Jason Sams27676fe2010-11-10 17:00:59 -080039 * worker threads for processing commands from this object. This base class
40 * does not provide any extended capabilities beyond simple data processing.
41 * For extended capabilities use derived classes such as RenderScriptGL.
42 *
Joe Fernandez3aef8e1d2011-12-20 10:38:34 -080043 * <div class="special reference">
44 * <h3>Developer Guides</h3>
45 * <p>For more information about creating an application that uses Renderscript, read the
Scott Mainb47fa162013-02-05 14:23:13 -080046 * <a href="{@docRoot}guide/topics/renderscript/index.html">Renderscript</a> developer guide.</p>
Joe Fernandez3aef8e1d2011-12-20 10:38:34 -080047 * </div>
Jason Samse29d4712009-07-23 15:19:03 -070048 **/
Jack Palevich60aa3ea2009-05-26 13:45:08 -070049public class RenderScript {
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 */
Romain Guy650a3eb2009-08-31 14:06:43 -070061 @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
Jason Samsbf6ef8d2010-12-06 15:59:59 -080062 static boolean sInitialized;
63 native static void _nInit();
Jack Palevich60aa3ea2009-05-26 13:45:08 -070064
Jason Samsdba3ba52009-07-30 14:56:12 -070065
Jack Palevich60aa3ea2009-05-26 13:45:08 -070066 static {
67 sInitialized = false;
68 try {
Jason Samse29d4712009-07-23 15:19:03 -070069 System.loadLibrary("rs_jni");
Jack Palevich60aa3ea2009-05-26 13:45:08 -070070 _nInit();
Jack Palevich60aa3ea2009-05-26 13:45:08 -070071 sInitialized = true;
72 } catch (UnsatisfiedLinkError e) {
Jason Samsfa445b92011-01-07 17:00:07 -080073 Log.e(LOG_TAG, "Error loading RS jni library: " + e);
74 throw new RSRuntimeException("Error loading RS jni library: " + e);
Jack Palevich60aa3ea2009-05-26 13:45:08 -070075 }
76 }
77
Jason Sams2e1872f2010-08-17 16:25:41 -070078 // Non-threadsafe functions.
Jason Sams36e612a2009-07-31 16:26:13 -070079 native int nDeviceCreate();
80 native void nDeviceDestroy(int dev);
Jason Samsebfb4362009-09-23 13:57:02 -070081 native void nDeviceSetConfig(int dev, int param, int value);
Jason Samsedbfabd2011-05-17 15:01:29 -070082 native int nContextGetUserMessage(int con, int[] data);
Jason Sams1c415172010-11-08 17:06:46 -080083 native String nContextGetErrorMessage(int con);
Jason Samsedbfabd2011-05-17 15:01:29 -070084 native int nContextPeekMessage(int con, int[] subID);
Jason Sams2e1872f2010-08-17 16:25:41 -070085 native void nContextInitToClient(int con);
86 native void nContextDeinitToClient(int con);
Jason Sams3eaa3382009-06-10 15:04:38 -070087
Stephen Hines7d25a822013-04-09 23:51:56 -070088 static File mCacheDir;
Jason Samsa6f338c2012-02-24 16:22:16 -080089
90 /**
91 * Sets the directory to use as a persistent storage for the
92 * renderscript object file cache.
93 *
94 * @hide
95 * @param cacheDir A directory the current process can write to
96 */
Jason Samsa6f338c2012-02-24 16:22:16 -080097 public static void setupDiskCache(File cacheDir) {
Stephen Hines7d25a822013-04-09 23:51:56 -070098 // Defer creation of cache path to nScriptCCreate().
99 mCacheDir = cacheDir;
Jason Samsa6f338c2012-02-24 16:22:16 -0800100 }
101
Jason Sams02d56d92013-04-12 16:40:50 -0700102 /**
103 * ContextType specifies the specific type of context to be created.
104 *
105 */
Jason Samsadd26dc2013-02-22 18:43:45 -0800106 public enum ContextType {
Jason Sams02d56d92013-04-12 16:40:50 -0700107 /**
108 * NORMAL context, this is the default and what shipping apps should
109 * use.
110 */
Jason Samsadd26dc2013-02-22 18:43:45 -0800111 NORMAL (0),
Jason Sams02d56d92013-04-12 16:40:50 -0700112
113 /**
114 * DEBUG context, perform extra runtime checks to validate the
115 * kernels and APIs are being used as intended. Get and SetElementAt
116 * will be bounds checked in this mode.
117 */
Jason Samsadd26dc2013-02-22 18:43:45 -0800118 DEBUG (1),
Jason Sams02d56d92013-04-12 16:40:50 -0700119
120 /**
121 * PROFILE context, Intended to be used once the first time an
122 * application is run on a new device. This mode allows the runtime to
123 * do additional testing and performance tuning.
124 */
Jason Samsadd26dc2013-02-22 18:43:45 -0800125 PROFILE (2);
126
127 int mID;
128 ContextType(int id) {
129 mID = id;
130 }
131 }
Jason Sams718cd1f2009-12-23 14:35:29 -0800132
Jason Sams2e1872f2010-08-17 16:25:41 -0700133 // Methods below are wrapped to protect the non-threadsafe
134 // lockless fifo.
Stephen Hines4382467a2011-08-01 15:02:34 -0700135 native int rsnContextCreateGL(int dev, int ver, int sdkVer,
Jason Sams11c8af92010-10-13 15:31:10 -0700136 int colorMin, int colorPref,
137 int alphaMin, int alphaPref,
138 int depthMin, int depthPref,
139 int stencilMin, int stencilPref,
Alex Sakhartchouk2c74ad92011-03-16 19:28:25 -0700140 int samplesMin, int samplesPref, float samplesQ, int dpi);
Stephen Hines4382467a2011-08-01 15:02:34 -0700141 synchronized int nContextCreateGL(int dev, int ver, int sdkVer,
Jason Sams11c8af92010-10-13 15:31:10 -0700142 int colorMin, int colorPref,
143 int alphaMin, int alphaPref,
144 int depthMin, int depthPref,
145 int stencilMin, int stencilPref,
Alex Sakhartchouk2c74ad92011-03-16 19:28:25 -0700146 int samplesMin, int samplesPref, float samplesQ, int dpi) {
Stephen Hines4382467a2011-08-01 15:02:34 -0700147 return rsnContextCreateGL(dev, ver, sdkVer, colorMin, colorPref,
Jason Sams11c8af92010-10-13 15:31:10 -0700148 alphaMin, alphaPref, depthMin, depthPref,
149 stencilMin, stencilPref,
Alex Sakhartchouk2c74ad92011-03-16 19:28:25 -0700150 samplesMin, samplesPref, samplesQ, dpi);
Jason Sams2e1872f2010-08-17 16:25:41 -0700151 }
Jason Samsadd26dc2013-02-22 18:43:45 -0800152 native int rsnContextCreate(int dev, int ver, int sdkVer, int contextType);
153 synchronized int nContextCreate(int dev, int ver, int sdkVer, int contextType) {
154 return rsnContextCreate(dev, ver, sdkVer, contextType);
Jason Sams2e1872f2010-08-17 16:25:41 -0700155 }
156 native void rsnContextDestroy(int con);
157 synchronized void nContextDestroy() {
Jason Samsd1ac9812011-01-18 18:12:26 -0800158 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700159 rsnContextDestroy(mContext);
160 }
161 native void rsnContextSetSurface(int con, int w, int h, Surface sur);
162 synchronized void nContextSetSurface(int w, int h, Surface sur) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800163 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700164 rsnContextSetSurface(mContext, w, h, sur);
165 }
Jason Samsfaa32b32011-06-20 16:58:04 -0700166 native void rsnContextSetSurfaceTexture(int con, int w, int h, SurfaceTexture sur);
167 synchronized void nContextSetSurfaceTexture(int w, int h, SurfaceTexture sur) {
168 validate();
169 rsnContextSetSurfaceTexture(mContext, w, h, sur);
170 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700171 native void rsnContextSetPriority(int con, int p);
172 synchronized void nContextSetPriority(int p) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800173 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700174 rsnContextSetPriority(mContext, p);
175 }
176 native void rsnContextDump(int con, int bits);
177 synchronized void nContextDump(int bits) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800178 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700179 rsnContextDump(mContext, bits);
180 }
181 native void rsnContextFinish(int con);
182 synchronized void nContextFinish() {
Jason Samsd1ac9812011-01-18 18:12:26 -0800183 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700184 rsnContextFinish(mContext);
185 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700186
Jason Sams455d6442013-02-05 19:20:18 -0800187 native void rsnContextSendMessage(int con, int id, int[] data);
188 synchronized void nContextSendMessage(int id, int[] data) {
189 validate();
190 rsnContextSendMessage(mContext, id, data);
191 }
192
Jason Sams2e1872f2010-08-17 16:25:41 -0700193 native void rsnContextBindRootScript(int con, int script);
194 synchronized void nContextBindRootScript(int script) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800195 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700196 rsnContextBindRootScript(mContext, script);
197 }
198 native void rsnContextBindSampler(int con, int sampler, int slot);
199 synchronized void nContextBindSampler(int sampler, int slot) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800200 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700201 rsnContextBindSampler(mContext, sampler, slot);
202 }
203 native void rsnContextBindProgramStore(int con, int pfs);
204 synchronized void nContextBindProgramStore(int pfs) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800205 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700206 rsnContextBindProgramStore(mContext, pfs);
207 }
208 native void rsnContextBindProgramFragment(int con, int pf);
209 synchronized void nContextBindProgramFragment(int pf) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800210 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700211 rsnContextBindProgramFragment(mContext, pf);
212 }
213 native void rsnContextBindProgramVertex(int con, int pv);
214 synchronized void nContextBindProgramVertex(int pv) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800215 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700216 rsnContextBindProgramVertex(mContext, pv);
217 }
218 native void rsnContextBindProgramRaster(int con, int pr);
219 synchronized void nContextBindProgramRaster(int pr) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800220 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700221 rsnContextBindProgramRaster(mContext, pr);
222 }
223 native void rsnContextPause(int con);
224 synchronized void nContextPause() {
Jason Samsd1ac9812011-01-18 18:12:26 -0800225 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700226 rsnContextPause(mContext);
227 }
228 native void rsnContextResume(int con);
229 synchronized void nContextResume() {
Jason Samsd1ac9812011-01-18 18:12:26 -0800230 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700231 rsnContextResume(mContext);
232 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700233
Jason Sams2e1872f2010-08-17 16:25:41 -0700234 native void rsnAssignName(int con, int obj, byte[] name);
235 synchronized void nAssignName(int obj, byte[] name) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800236 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700237 rsnAssignName(mContext, obj, name);
238 }
239 native String rsnGetName(int con, int obj);
240 synchronized String nGetName(int obj) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800241 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700242 return rsnGetName(mContext, obj);
243 }
244 native void rsnObjDestroy(int con, int id);
245 synchronized void nObjDestroy(int id) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800246 // There is a race condition here. The calling code may be run
247 // by the gc while teardown is occuring. This protects againts
248 // deleting dead objects.
249 if (mContext != 0) {
250 rsnObjDestroy(mContext, id);
251 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700252 }
Jason Samsfe08d992009-05-27 14:45:32 -0700253
Jason Sams2e1872f2010-08-17 16:25:41 -0700254 native int rsnElementCreate(int con, int type, int kind, boolean norm, int vecSize);
255 synchronized int nElementCreate(int type, int kind, boolean norm, int vecSize) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800256 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700257 return rsnElementCreate(mContext, type, kind, norm, vecSize);
258 }
Jason Sams70d4e502010-09-02 17:35:23 -0700259 native int rsnElementCreate2(int con, int[] elements, String[] names, int[] arraySizes);
260 synchronized int nElementCreate2(int[] elements, String[] names, int[] arraySizes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800261 validate();
Jason Sams70d4e502010-09-02 17:35:23 -0700262 return rsnElementCreate2(mContext, elements, names, arraySizes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700263 }
264 native void rsnElementGetNativeData(int con, int id, int[] elementData);
265 synchronized void nElementGetNativeData(int id, int[] elementData) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800266 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700267 rsnElementGetNativeData(mContext, id, elementData);
268 }
Alex Sakhartchouk7d5f5e72011-10-18 11:08:31 -0700269 native void rsnElementGetSubElements(int con, int id,
270 int[] IDs, String[] names, int[] arraySizes);
271 synchronized void nElementGetSubElements(int id, int[] IDs, String[] names, int[] arraySizes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800272 validate();
Alex Sakhartchouk7d5f5e72011-10-18 11:08:31 -0700273 rsnElementGetSubElements(mContext, id, IDs, names, arraySizes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700274 }
Jason Sams768bc022009-09-21 19:41:04 -0700275
Jason Samsb109cc72013-01-07 18:20:12 -0800276 native int rsnTypeCreate(int con, int eid, int x, int y, int z, boolean mips, boolean faces, int yuv);
277 synchronized int nTypeCreate(int eid, int x, int y, int z, boolean mips, boolean faces, int yuv) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800278 validate();
Jason Samsb109cc72013-01-07 18:20:12 -0800279 return rsnTypeCreate(mContext, eid, x, y, z, mips, faces, yuv);
Jason Sams2e1872f2010-08-17 16:25:41 -0700280 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700281 native void rsnTypeGetNativeData(int con, int id, int[] typeData);
282 synchronized void nTypeGetNativeData(int id, int[] typeData) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800283 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700284 rsnTypeGetNativeData(mContext, id, typeData);
285 }
Jason Sams768bc022009-09-21 19:41:04 -0700286
Jason Sams857d0c72011-11-23 15:02:15 -0800287 native int rsnAllocationCreateTyped(int con, int type, int mip, int usage, int pointer);
288 synchronized int nAllocationCreateTyped(int type, int mip, int usage, int pointer) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800289 validate();
Jason Sams857d0c72011-11-23 15:02:15 -0800290 return rsnAllocationCreateTyped(mContext, type, mip, usage, pointer);
Jason Sams2e1872f2010-08-17 16:25:41 -0700291 }
Jason Sams5476b452010-12-08 16:14:36 -0800292 native int rsnAllocationCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage);
293 synchronized int nAllocationCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800294 validate();
Jason Sams5476b452010-12-08 16:14:36 -0800295 return rsnAllocationCreateFromBitmap(mContext, type, mip, bmp, usage);
Alex Sakhartchouk26ae3902010-10-11 12:35:15 -0700296 }
Tim Murraya3145512012-12-04 17:59:29 -0800297
298 native int rsnAllocationCreateBitmapBackedAllocation(int con, int type, int mip, Bitmap bmp, int usage);
299 synchronized int nAllocationCreateBitmapBackedAllocation(int type, int mip, Bitmap bmp, int usage) {
300 validate();
301 return rsnAllocationCreateBitmapBackedAllocation(mContext, type, mip, bmp, usage);
302 }
303
304
Jason Sams5476b452010-12-08 16:14:36 -0800305 native int rsnAllocationCubeCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage);
306 synchronized int nAllocationCubeCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800307 validate();
Jason Sams5476b452010-12-08 16:14:36 -0800308 return rsnAllocationCubeCreateFromBitmap(mContext, type, mip, bmp, usage);
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -0800309 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700310 native int rsnAllocationCreateBitmapRef(int con, int type, Bitmap bmp);
311 synchronized int nAllocationCreateBitmapRef(int type, Bitmap bmp) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800312 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700313 return rsnAllocationCreateBitmapRef(mContext, type, bmp);
314 }
Jason Sams5476b452010-12-08 16:14:36 -0800315 native int rsnAllocationCreateFromAssetStream(int con, int mips, int assetStream, int usage);
316 synchronized int nAllocationCreateFromAssetStream(int mips, int assetStream, int usage) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800317 validate();
Jason Sams5476b452010-12-08 16:14:36 -0800318 return rsnAllocationCreateFromAssetStream(mContext, mips, assetStream, usage);
319 }
320
Jason Sams4ef66502010-12-10 16:03:15 -0800321 native void rsnAllocationCopyToBitmap(int con, int alloc, Bitmap bmp);
322 synchronized void nAllocationCopyToBitmap(int alloc, Bitmap bmp) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800323 validate();
Jason Sams4ef66502010-12-10 16:03:15 -0800324 rsnAllocationCopyToBitmap(mContext, alloc, bmp);
325 }
326
327
Jason Sams5476b452010-12-08 16:14:36 -0800328 native void rsnAllocationSyncAll(int con, int alloc, int src);
329 synchronized void nAllocationSyncAll(int alloc, int src) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800330 validate();
Jason Sams5476b452010-12-08 16:14:36 -0800331 rsnAllocationSyncAll(mContext, alloc, src);
332 }
Jason Sams72226e02013-02-22 12:45:54 -0800333 native Surface rsnAllocationGetSurface(int con, int alloc);
334 synchronized Surface nAllocationGetSurface(int alloc) {
Jason Sams615e7ce2012-01-13 14:01:20 -0800335 validate();
Jason Sams72226e02013-02-22 12:45:54 -0800336 return rsnAllocationGetSurface(mContext, alloc);
Jason Samsfe1d5ff2012-03-23 11:47:26 -0700337 }
Jason Samsfb9aa9f2012-03-28 15:30:07 -0700338 native void rsnAllocationSetSurface(int con, int alloc, Surface sur);
339 synchronized void nAllocationSetSurface(int alloc, Surface sur) {
Jason Sams163766c2012-02-15 12:04:24 -0800340 validate();
Jason Samsfb9aa9f2012-03-28 15:30:07 -0700341 rsnAllocationSetSurface(mContext, alloc, sur);
Jason Sams163766c2012-02-15 12:04:24 -0800342 }
343 native void rsnAllocationIoSend(int con, int alloc);
344 synchronized void nAllocationIoSend(int alloc) {
345 validate();
346 rsnAllocationIoSend(mContext, alloc);
347 }
348 native void rsnAllocationIoReceive(int con, int alloc);
349 synchronized void nAllocationIoReceive(int alloc) {
350 validate();
351 rsnAllocationIoReceive(mContext, alloc);
352 }
353
Jason Sams615e7ce2012-01-13 14:01:20 -0800354
Jason Samsf7086092011-01-12 13:28:37 -0800355 native void rsnAllocationGenerateMipmaps(int con, int alloc);
356 synchronized void nAllocationGenerateMipmaps(int alloc) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800357 validate();
Jason Samsf7086092011-01-12 13:28:37 -0800358 rsnAllocationGenerateMipmaps(mContext, alloc);
359 }
Jason Sams4ef66502010-12-10 16:03:15 -0800360 native void rsnAllocationCopyFromBitmap(int con, int alloc, Bitmap bmp);
361 synchronized void nAllocationCopyFromBitmap(int alloc, Bitmap bmp) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800362 validate();
Jason Sams4ef66502010-12-10 16:03:15 -0800363 rsnAllocationCopyFromBitmap(mContext, alloc, bmp);
Jason Sams2e1872f2010-08-17 16:25:41 -0700364 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700365
Jason Sams49a05d72010-12-29 14:31:29 -0800366
367 native void rsnAllocationData1D(int con, int id, int off, int mip, int count, int[] d, int sizeBytes);
368 synchronized void nAllocationData1D(int id, int off, int mip, int count, int[] d, int sizeBytes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800369 validate();
Jason Sams49a05d72010-12-29 14:31:29 -0800370 rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700371 }
Jason Sams49a05d72010-12-29 14:31:29 -0800372 native void rsnAllocationData1D(int con, int id, int off, int mip, int count, short[] d, int sizeBytes);
373 synchronized void nAllocationData1D(int id, int off, int mip, int count, short[] d, int sizeBytes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800374 validate();
Jason Sams49a05d72010-12-29 14:31:29 -0800375 rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
376 }
377 native void rsnAllocationData1D(int con, int id, int off, int mip, int count, byte[] d, int sizeBytes);
378 synchronized void nAllocationData1D(int id, int off, int mip, int count, byte[] d, int sizeBytes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800379 validate();
Jason Sams49a05d72010-12-29 14:31:29 -0800380 rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
381 }
382 native void rsnAllocationData1D(int con, int id, int off, int mip, int count, float[] d, int sizeBytes);
383 synchronized void nAllocationData1D(int id, int off, int mip, int count, float[] d, int sizeBytes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800384 validate();
Jason Sams49a05d72010-12-29 14:31:29 -0800385 rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700386 }
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -0700387
Jason Sams49a05d72010-12-29 14:31:29 -0800388 native void rsnAllocationElementData1D(int con, int id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes);
389 synchronized void nAllocationElementData1D(int id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800390 validate();
Jason Sams49a05d72010-12-29 14:31:29 -0800391 rsnAllocationElementData1D(mContext, id, xoff, mip, compIdx, d, sizeBytes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700392 }
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700393
Alex Sakhartchouk304b1f52011-06-14 11:13:19 -0700394 native void rsnAllocationData2D(int con,
395 int dstAlloc, int dstXoff, int dstYoff,
396 int dstMip, int dstFace,
397 int width, int height,
398 int srcAlloc, int srcXoff, int srcYoff,
399 int srcMip, int srcFace);
400 synchronized void nAllocationData2D(int dstAlloc, int dstXoff, int dstYoff,
401 int dstMip, int dstFace,
402 int width, int height,
403 int srcAlloc, int srcXoff, int srcYoff,
404 int srcMip, int srcFace) {
405 validate();
406 rsnAllocationData2D(mContext,
407 dstAlloc, dstXoff, dstYoff,
408 dstMip, dstFace,
409 width, height,
410 srcAlloc, srcXoff, srcYoff,
411 srcMip, srcFace);
412 }
413
Jason Samsfa445b92011-01-07 17:00:07 -0800414 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, byte[] d, int sizeBytes);
415 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 -0800416 validate();
Jason Samsfa445b92011-01-07 17:00:07 -0800417 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
418 }
419 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, short[] d, int sizeBytes);
420 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 -0800421 validate();
Jason Samsfa445b92011-01-07 17:00:07 -0800422 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
423 }
Jason Sams49a05d72010-12-29 14:31:29 -0800424 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, int[] d, int sizeBytes);
425 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 -0800426 validate();
Jason Sams49a05d72010-12-29 14:31:29 -0800427 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700428 }
Jason Sams49a05d72010-12-29 14:31:29 -0800429 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, float[] d, int sizeBytes);
430 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 -0800431 validate();
Jason Sams49a05d72010-12-29 14:31:29 -0800432 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700433 }
Jason Samsfa445b92011-01-07 17:00:07 -0800434 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, Bitmap b);
435 synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, Bitmap b) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800436 validate();
Jason Samsfa445b92011-01-07 17:00:07 -0800437 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, b);
438 }
Jason Sams49a05d72010-12-29 14:31:29 -0800439
Jason Samsb05d6892013-04-09 15:59:24 -0700440 native void rsnAllocationData3D(int con,
441 int dstAlloc, int dstXoff, int dstYoff, int dstZoff,
442 int dstMip,
443 int width, int height, int depth,
444 int srcAlloc, int srcXoff, int srcYoff, int srcZoff,
445 int srcMip);
446 synchronized void nAllocationData3D(int dstAlloc, int dstXoff, int dstYoff, int dstZoff,
447 int dstMip,
448 int width, int height, int depth,
449 int srcAlloc, int srcXoff, int srcYoff, int srcZoff,
450 int srcMip) {
451 validate();
452 rsnAllocationData3D(mContext,
453 dstAlloc, dstXoff, dstYoff, dstZoff,
454 dstMip, width, height, depth,
455 srcAlloc, srcXoff, srcYoff, srcZoff, srcMip);
456 }
457
458 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);
459 synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, byte[] d, int sizeBytes) {
460 validate();
461 rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
462 }
463 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);
464 synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, short[] d, int sizeBytes) {
465 validate();
466 rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
467 }
468 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);
469 synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, int[] d, int sizeBytes) {
470 validate();
471 rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
472 }
473 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);
474 synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, float[] d, int sizeBytes) {
475 validate();
476 rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
477 }
478
479
Jason Samsfa445b92011-01-07 17:00:07 -0800480 native void rsnAllocationRead(int con, int id, byte[] d);
481 synchronized void nAllocationRead(int id, byte[] d) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800482 validate();
Jason Samsfa445b92011-01-07 17:00:07 -0800483 rsnAllocationRead(mContext, id, d);
484 }
485 native void rsnAllocationRead(int con, int id, short[] d);
486 synchronized void nAllocationRead(int id, short[] d) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800487 validate();
Jason Samsfa445b92011-01-07 17:00:07 -0800488 rsnAllocationRead(mContext, id, d);
489 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700490 native void rsnAllocationRead(int con, int id, int[] d);
491 synchronized void nAllocationRead(int id, int[] d) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800492 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700493 rsnAllocationRead(mContext, id, d);
494 }
495 native void rsnAllocationRead(int con, int id, float[] d);
496 synchronized void nAllocationRead(int id, float[] d) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800497 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700498 rsnAllocationRead(mContext, id, d);
499 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700500 native int rsnAllocationGetType(int con, int id);
501 synchronized int nAllocationGetType(int id) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800502 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700503 return rsnAllocationGetType(mContext, id);
504 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700505
Jason Sams5edc6082010-10-05 13:32:49 -0700506 native void rsnAllocationResize1D(int con, int id, int dimX);
507 synchronized void nAllocationResize1D(int id, int dimX) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800508 validate();
Jason Sams5edc6082010-10-05 13:32:49 -0700509 rsnAllocationResize1D(mContext, id, dimX);
510 }
Jason Sams5edc6082010-10-05 13:32:49 -0700511
Jason Sams2e1872f2010-08-17 16:25:41 -0700512 native int rsnFileA3DCreateFromAssetStream(int con, int assetStream);
513 synchronized int nFileA3DCreateFromAssetStream(int assetStream) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800514 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700515 return rsnFileA3DCreateFromAssetStream(mContext, assetStream);
516 }
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800517 native int rsnFileA3DCreateFromFile(int con, String path);
518 synchronized int nFileA3DCreateFromFile(String path) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800519 validate();
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800520 return rsnFileA3DCreateFromFile(mContext, path);
521 }
522 native int rsnFileA3DCreateFromAsset(int con, AssetManager mgr, String path);
523 synchronized int nFileA3DCreateFromAsset(AssetManager mgr, String path) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800524 validate();
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800525 return rsnFileA3DCreateFromAsset(mContext, mgr, path);
526 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700527 native int rsnFileA3DGetNumIndexEntries(int con, int fileA3D);
528 synchronized int nFileA3DGetNumIndexEntries(int fileA3D) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800529 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700530 return rsnFileA3DGetNumIndexEntries(mContext, fileA3D);
531 }
532 native void rsnFileA3DGetIndexEntries(int con, int fileA3D, int numEntries, int[] IDs, String[] names);
533 synchronized void nFileA3DGetIndexEntries(int fileA3D, int numEntries, int[] IDs, String[] names) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800534 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700535 rsnFileA3DGetIndexEntries(mContext, fileA3D, numEntries, IDs, names);
536 }
537 native int rsnFileA3DGetEntryByIndex(int con, int fileA3D, int index);
538 synchronized int nFileA3DGetEntryByIndex(int fileA3D, int index) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800539 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700540 return rsnFileA3DGetEntryByIndex(mContext, fileA3D, index);
541 }
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700542
Alex Sakhartchouke27cdee2010-12-17 11:41:08 -0800543 native int rsnFontCreateFromFile(int con, String fileName, float size, int dpi);
544 synchronized int nFontCreateFromFile(String fileName, float size, int dpi) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800545 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700546 return rsnFontCreateFromFile(mContext, fileName, size, dpi);
547 }
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800548 native int rsnFontCreateFromAssetStream(int con, String name, float size, int dpi, int assetStream);
549 synchronized int nFontCreateFromAssetStream(String name, float size, int dpi, int assetStream) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800550 validate();
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800551 return rsnFontCreateFromAssetStream(mContext, name, size, dpi, assetStream);
552 }
553 native int rsnFontCreateFromAsset(int con, AssetManager mgr, String path, float size, int dpi);
554 synchronized int nFontCreateFromAsset(AssetManager mgr, String path, float size, int dpi) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800555 validate();
Alex Sakhartchoukb0253ea2011-01-07 11:12:08 -0800556 return rsnFontCreateFromAsset(mContext, mgr, path, size, dpi);
557 }
Jason Sams22534172009-08-04 16:58:20 -0700558
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700559
Jason Sams2e1872f2010-08-17 16:25:41 -0700560 native void rsnScriptBindAllocation(int con, int script, int alloc, int slot);
561 synchronized void nScriptBindAllocation(int script, int alloc, int slot) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800562 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700563 rsnScriptBindAllocation(mContext, script, alloc, slot);
564 }
565 native void rsnScriptSetTimeZone(int con, int script, byte[] timeZone);
566 synchronized void nScriptSetTimeZone(int script, byte[] timeZone) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800567 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700568 rsnScriptSetTimeZone(mContext, script, timeZone);
569 }
570 native void rsnScriptInvoke(int con, int id, int slot);
571 synchronized void nScriptInvoke(int id, int slot) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800572 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700573 rsnScriptInvoke(mContext, id, slot);
574 }
Jason Sams6e494d32011-04-27 16:33:11 -0700575 native void rsnScriptForEach(int con, int id, int slot, int ain, int aout, byte[] params);
576 native void rsnScriptForEach(int con, int id, int slot, int ain, int aout);
Tim Murrayeb8c29c2013-02-07 12:16:41 -0800577 native void rsnScriptForEachClipped(int con, int id, int slot, int ain, int aout, byte[] params,
578 int xstart, int xend, int ystart, int yend, int zstart, int zend);
Stephen Hinesdac6ed02013-02-13 00:09:02 -0800579 native void rsnScriptForEachClipped(int con, int id, int slot, int ain, int aout,
580 int xstart, int xend, int ystart, int yend, int zstart, int zend);
Jason Sams6e494d32011-04-27 16:33:11 -0700581 synchronized void nScriptForEach(int id, int slot, int ain, int aout, byte[] params) {
582 validate();
583 if (params == null) {
584 rsnScriptForEach(mContext, id, slot, ain, aout);
585 } else {
586 rsnScriptForEach(mContext, id, slot, ain, aout, params);
587 }
588 }
Tim Murrayeb8c29c2013-02-07 12:16:41 -0800589
590 synchronized void nScriptForEachClipped(int id, int slot, int ain, int aout, byte[] params,
591 int xstart, int xend, int ystart, int yend, int zstart, int zend) {
592 validate();
Stephen Hinesdac6ed02013-02-13 00:09:02 -0800593 if (params == null) {
594 rsnScriptForEachClipped(mContext, id, slot, ain, aout, xstart, xend, ystart, yend, zstart, zend);
595 } else {
596 rsnScriptForEachClipped(mContext, id, slot, ain, aout, params, xstart, xend, ystart, yend, zstart, zend);
597 }
Tim Murrayeb8c29c2013-02-07 12:16:41 -0800598 }
599
Jason Sams2e1872f2010-08-17 16:25:41 -0700600 native void rsnScriptInvokeV(int con, int id, int slot, byte[] params);
601 synchronized void nScriptInvokeV(int id, int slot, byte[] params) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800602 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700603 rsnScriptInvokeV(mContext, id, slot, params);
604 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700605
Jason Sams2e1872f2010-08-17 16:25:41 -0700606 native void rsnScriptSetVarI(int con, int id, int slot, int val);
607 synchronized void nScriptSetVarI(int id, int slot, int val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800608 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700609 rsnScriptSetVarI(mContext, id, slot, val);
610 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700611 native int rsnScriptGetVarI(int con, int id, int slot);
612 synchronized int nScriptGetVarI(int id, int slot) {
613 validate();
614 return rsnScriptGetVarI(mContext, id, slot);
615 }
616
Stephen Hines031ec58c2010-10-11 10:54:21 -0700617 native void rsnScriptSetVarJ(int con, int id, int slot, long val);
618 synchronized void nScriptSetVarJ(int id, int slot, long val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800619 validate();
Stephen Hines031ec58c2010-10-11 10:54:21 -0700620 rsnScriptSetVarJ(mContext, id, slot, val);
621 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700622 native long rsnScriptGetVarJ(int con, int id, int slot);
623 synchronized long nScriptGetVarJ(int id, int slot) {
624 validate();
625 return rsnScriptGetVarJ(mContext, id, slot);
626 }
627
Jason Sams2e1872f2010-08-17 16:25:41 -0700628 native void rsnScriptSetVarF(int con, int id, int slot, float val);
629 synchronized void nScriptSetVarF(int id, int slot, float val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800630 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700631 rsnScriptSetVarF(mContext, id, slot, val);
632 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700633 native float rsnScriptGetVarF(int con, int id, int slot);
634 synchronized float nScriptGetVarF(int id, int slot) {
635 validate();
636 return rsnScriptGetVarF(mContext, id, slot);
637 }
Stephen Hinesca54ec32010-09-20 17:20:30 -0700638 native void rsnScriptSetVarD(int con, int id, int slot, double val);
639 synchronized void nScriptSetVarD(int id, int slot, double val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800640 validate();
Stephen Hinesca54ec32010-09-20 17:20:30 -0700641 rsnScriptSetVarD(mContext, id, slot, val);
642 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700643 native double rsnScriptGetVarD(int con, int id, int slot);
644 synchronized double nScriptGetVarD(int id, int slot) {
645 validate();
646 return rsnScriptGetVarD(mContext, id, slot);
647 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700648 native void rsnScriptSetVarV(int con, int id, int slot, byte[] val);
649 synchronized void nScriptSetVarV(int id, int slot, byte[] val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800650 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700651 rsnScriptSetVarV(mContext, id, slot, val);
652 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700653 native void rsnScriptGetVarV(int con, int id, int slot, byte[] val);
654 synchronized void nScriptGetVarV(int id, int slot, byte[] val) {
655 validate();
656 rsnScriptGetVarV(mContext, id, slot, val);
657 }
Stephen Hinesadeb8092012-04-20 14:26:06 -0700658 native void rsnScriptSetVarVE(int con, int id, int slot, byte[] val,
659 int e, int[] dims);
660 synchronized void nScriptSetVarVE(int id, int slot, byte[] val,
661 int e, int[] dims) {
662 validate();
663 rsnScriptSetVarVE(mContext, id, slot, val, e, dims);
664 }
Jason Sams6f4cf0b2010-11-16 17:37:02 -0800665 native void rsnScriptSetVarObj(int con, int id, int slot, int val);
666 synchronized void nScriptSetVarObj(int id, int slot, int val) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800667 validate();
Jason Sams6f4cf0b2010-11-16 17:37:02 -0800668 rsnScriptSetVarObj(mContext, id, slot, val);
669 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700670
Jason Samse4a06c52011-03-16 16:29:28 -0700671 native int rsnScriptCCreate(int con, String resName, String cacheDir,
672 byte[] script, int length);
673 synchronized int nScriptCCreate(String resName, String cacheDir, byte[] script, int length) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800674 validate();
Jason Samse4a06c52011-03-16 16:29:28 -0700675 return rsnScriptCCreate(mContext, resName, cacheDir, script, length);
Jason Sams2e1872f2010-08-17 16:25:41 -0700676 }
Jason Samsebfb4362009-09-23 13:57:02 -0700677
Jason Sams6ab97682012-08-10 12:09:43 -0700678 native int rsnScriptIntrinsicCreate(int con, int id, int eid);
679 synchronized int nScriptIntrinsicCreate(int id, int eid) {
680 validate();
681 return rsnScriptIntrinsicCreate(mContext, id, eid);
682 }
683
Jason Sams08a81582012-09-18 12:32:10 -0700684 native int rsnScriptKernelIDCreate(int con, int sid, int slot, int sig);
685 synchronized int nScriptKernelIDCreate(int sid, int slot, int sig) {
686 validate();
687 return rsnScriptKernelIDCreate(mContext, sid, slot, sig);
688 }
689
690 native int rsnScriptFieldIDCreate(int con, int sid, int slot);
691 synchronized int nScriptFieldIDCreate(int sid, int slot) {
692 validate();
693 return rsnScriptFieldIDCreate(mContext, sid, slot);
694 }
695
696 native int rsnScriptGroupCreate(int con, int[] kernels, int[] src, int[] dstk, int[] dstf, int[] types);
697 synchronized int nScriptGroupCreate(int[] kernels, int[] src, int[] dstk, int[] dstf, int[] types) {
698 validate();
699 return rsnScriptGroupCreate(mContext, kernels, src, dstk, dstf, types);
700 }
701
702 native void rsnScriptGroupSetInput(int con, int group, int kernel, int alloc);
703 synchronized void nScriptGroupSetInput(int group, int kernel, int alloc) {
704 validate();
705 rsnScriptGroupSetInput(mContext, group, kernel, alloc);
706 }
707
708 native void rsnScriptGroupSetOutput(int con, int group, int kernel, int alloc);
709 synchronized void nScriptGroupSetOutput(int group, int kernel, int alloc) {
710 validate();
711 rsnScriptGroupSetOutput(mContext, group, kernel, alloc);
712 }
713
714 native void rsnScriptGroupExecute(int con, int group);
715 synchronized void nScriptGroupExecute(int group) {
716 validate();
717 rsnScriptGroupExecute(mContext, group);
718 }
719
Alex Sakhartchouka89094a2011-05-04 17:45:36 -0700720 native int rsnSamplerCreate(int con, int magFilter, int minFilter,
721 int wrapS, int wrapT, int wrapR, float aniso);
722 synchronized int nSamplerCreate(int magFilter, int minFilter,
723 int wrapS, int wrapT, int wrapR, float aniso) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800724 validate();
Alex Sakhartchouka89094a2011-05-04 17:45:36 -0700725 return rsnSamplerCreate(mContext, magFilter, minFilter, wrapS, wrapT, wrapR, aniso);
Jason Sams2e1872f2010-08-17 16:25:41 -0700726 }
Jason Sams0011bcf2009-12-15 12:58:36 -0800727
Jason Sams331bf9b2011-04-06 11:23:54 -0700728 native int rsnProgramStoreCreate(int con, boolean r, boolean g, boolean b, boolean a,
729 boolean depthMask, boolean dither,
730 int srcMode, int dstMode, int depthFunc);
731 synchronized int nProgramStoreCreate(boolean r, boolean g, boolean b, boolean a,
732 boolean depthMask, boolean dither,
733 int srcMode, int dstMode, int depthFunc) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800734 validate();
Jason Samsbd184c52011-04-06 11:44:47 -0700735 return rsnProgramStoreCreate(mContext, r, g, b, a, depthMask, dither, srcMode,
736 dstMode, depthFunc);
Jason Sams2e1872f2010-08-17 16:25:41 -0700737 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700738
Jason Sams94aaed32011-09-23 14:18:53 -0700739 native int rsnProgramRasterCreate(int con, boolean pointSprite, int cullMode);
740 synchronized int nProgramRasterCreate(boolean pointSprite, int cullMode) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800741 validate();
Jason Sams94aaed32011-09-23 14:18:53 -0700742 return rsnProgramRasterCreate(mContext, pointSprite, cullMode);
Jason Sams2e1872f2010-08-17 16:25:41 -0700743 }
Jason Sams1fe9b8c2009-06-11 14:46:10 -0700744
Jason Sams2e1872f2010-08-17 16:25:41 -0700745 native void rsnProgramBindConstants(int con, int pv, int slot, int mID);
746 synchronized void nProgramBindConstants(int pv, int slot, int mID) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800747 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700748 rsnProgramBindConstants(mContext, pv, slot, mID);
749 }
750 native void rsnProgramBindTexture(int con, int vpf, int slot, int a);
751 synchronized void nProgramBindTexture(int vpf, int slot, int a) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800752 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700753 rsnProgramBindTexture(mContext, vpf, slot, a);
754 }
755 native void rsnProgramBindSampler(int con, int vpf, int slot, int s);
756 synchronized void nProgramBindSampler(int vpf, int slot, int s) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800757 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700758 rsnProgramBindSampler(mContext, vpf, slot, s);
759 }
Alex Sakhartchouk2123b462012-02-15 16:21:46 -0800760 native int rsnProgramFragmentCreate(int con, String shader, String[] texNames, int[] params);
761 synchronized int nProgramFragmentCreate(String shader, String[] texNames, int[] params) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800762 validate();
Alex Sakhartchouk2123b462012-02-15 16:21:46 -0800763 return rsnProgramFragmentCreate(mContext, shader, texNames, params);
Jason Sams2e1872f2010-08-17 16:25:41 -0700764 }
Alex Sakhartchouk2123b462012-02-15 16:21:46 -0800765 native int rsnProgramVertexCreate(int con, String shader, String[] texNames, int[] params);
766 synchronized int nProgramVertexCreate(String shader, String[] texNames, int[] params) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800767 validate();
Alex Sakhartchouk2123b462012-02-15 16:21:46 -0800768 return rsnProgramVertexCreate(mContext, shader, texNames, params);
Jason Sams2e1872f2010-08-17 16:25:41 -0700769 }
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700770
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700771 native int rsnMeshCreate(int con, int[] vtx, int[] idx, int[] prim);
772 synchronized int nMeshCreate(int[] vtx, int[] idx, int[] prim) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800773 validate();
Alex Sakhartchouk25999a02011-05-12 10:38:03 -0700774 return rsnMeshCreate(mContext, vtx, idx, prim);
Alex Sakhartchouk9d71e212010-11-08 15:10:52 -0800775 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700776 native int rsnMeshGetVertexBufferCount(int con, int id);
777 synchronized int nMeshGetVertexBufferCount(int id) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800778 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700779 return rsnMeshGetVertexBufferCount(mContext, id);
780 }
781 native int rsnMeshGetIndexCount(int con, int id);
782 synchronized int nMeshGetIndexCount(int id) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800783 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700784 return rsnMeshGetIndexCount(mContext, id);
785 }
786 native void rsnMeshGetVertices(int con, int id, int[] vtxIds, int vtxIdCount);
787 synchronized void nMeshGetVertices(int id, int[] vtxIds, int vtxIdCount) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800788 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700789 rsnMeshGetVertices(mContext, id, vtxIds, vtxIdCount);
790 }
791 native void rsnMeshGetIndices(int con, int id, int[] idxIds, int[] primitives, int vtxIdCount);
792 synchronized void nMeshGetIndices(int id, int[] idxIds, int[] primitives, int vtxIdCount) {
Jason Samsd1ac9812011-01-18 18:12:26 -0800793 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700794 rsnMeshGetIndices(mContext, id, idxIds, primitives, vtxIdCount);
795 }
796
Jason Samsf15ed012011-10-31 13:23:43 -0700797 native int rsnPathCreate(int con, int prim, boolean isStatic, int vtx, int loop, float q);
798 synchronized int nPathCreate(int prim, boolean isStatic, int vtx, int loop, float q) {
799 validate();
800 return rsnPathCreate(mContext, prim, isStatic, vtx, loop, q);
801 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700802
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800803 int mDev;
804 int mContext;
Romain Guy650a3eb2009-08-31 14:06:43 -0700805 @SuppressWarnings({"FieldCanBeLocal"})
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800806 MessageThread mMessageThread;
Tim Murrayf8c033d2013-04-09 14:33:32 -0700807 GCThread mGCThread;
808
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700809
Jason Sams8cb39de2010-06-01 15:47:01 -0700810 Element mElement_U8;
811 Element mElement_I8;
812 Element mElement_U16;
813 Element mElement_I16;
814 Element mElement_U32;
815 Element mElement_I32;
Stephen Hines52d83632010-10-11 16:10:42 -0700816 Element mElement_U64;
Stephen Hinesef1dac22010-10-01 15:39:33 -0700817 Element mElement_I64;
Jason Sams8cb39de2010-06-01 15:47:01 -0700818 Element mElement_F32;
Stephen Hines02f417052010-09-30 15:19:22 -0700819 Element mElement_F64;
Jason Samsf110d4b2010-06-21 17:42:41 -0700820 Element mElement_BOOLEAN;
Jason Sams3c0dfba2009-09-27 17:50:38 -0700821
Jason Sams8cb39de2010-06-01 15:47:01 -0700822 Element mElement_ELEMENT;
823 Element mElement_TYPE;
824 Element mElement_ALLOCATION;
825 Element mElement_SAMPLER;
826 Element mElement_SCRIPT;
827 Element mElement_MESH;
828 Element mElement_PROGRAM_FRAGMENT;
829 Element mElement_PROGRAM_VERTEX;
830 Element mElement_PROGRAM_RASTER;
831 Element mElement_PROGRAM_STORE;
Stephen Hines3a291412012-04-11 17:27:29 -0700832 Element mElement_FONT;
Jason Samsa70f4162010-03-26 15:33:42 -0700833
Jason Sams3c0dfba2009-09-27 17:50:38 -0700834 Element mElement_A_8;
835 Element mElement_RGB_565;
836 Element mElement_RGB_888;
837 Element mElement_RGBA_5551;
838 Element mElement_RGBA_4444;
839 Element mElement_RGBA_8888;
840
Jason Sams8cb39de2010-06-01 15:47:01 -0700841 Element mElement_FLOAT_2;
842 Element mElement_FLOAT_3;
843 Element mElement_FLOAT_4;
Stephen Hines836c4a52011-06-01 14:38:10 -0700844
845 Element mElement_DOUBLE_2;
846 Element mElement_DOUBLE_3;
847 Element mElement_DOUBLE_4;
848
849 Element mElement_UCHAR_2;
850 Element mElement_UCHAR_3;
Jason Sams8cb39de2010-06-01 15:47:01 -0700851 Element mElement_UCHAR_4;
Jason Sams7d787b42009-11-15 12:14:26 -0800852
Stephen Hines836c4a52011-06-01 14:38:10 -0700853 Element mElement_CHAR_2;
854 Element mElement_CHAR_3;
855 Element mElement_CHAR_4;
856
857 Element mElement_USHORT_2;
858 Element mElement_USHORT_3;
859 Element mElement_USHORT_4;
860
861 Element mElement_SHORT_2;
862 Element mElement_SHORT_3;
863 Element mElement_SHORT_4;
864
865 Element mElement_UINT_2;
866 Element mElement_UINT_3;
867 Element mElement_UINT_4;
868
869 Element mElement_INT_2;
870 Element mElement_INT_3;
871 Element mElement_INT_4;
872
873 Element mElement_ULONG_2;
874 Element mElement_ULONG_3;
875 Element mElement_ULONG_4;
876
877 Element mElement_LONG_2;
878 Element mElement_LONG_3;
879 Element mElement_LONG_4;
880
Jason Sams1d45c472010-08-25 14:31:48 -0700881 Element mElement_MATRIX_4X4;
882 Element mElement_MATRIX_3X3;
883 Element mElement_MATRIX_2X2;
884
Jason Sams4d339932010-05-11 14:03:58 -0700885 Sampler mSampler_CLAMP_NEAREST;
886 Sampler mSampler_CLAMP_LINEAR;
887 Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
888 Sampler mSampler_WRAP_NEAREST;
889 Sampler mSampler_WRAP_LINEAR;
890 Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
Tim Murray6b9b2ca2013-02-15 13:25:55 -0800891 Sampler mSampler_MIRRORED_REPEAT_NEAREST;
892 Sampler mSampler_MIRRORED_REPEAT_LINEAR;
893 Sampler mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR;
Jason Sams4d339932010-05-11 14:03:58 -0700894
Alex Sakhartchoukd36f2482010-08-24 11:37:33 -0700895 ProgramStore mProgramStore_BLEND_NONE_DEPTH_TEST;
896 ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
Alex Sakhartchoukd36f2482010-08-24 11:37:33 -0700897 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_TEST;
898 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
Alex Sakhartchouk32e09b52010-08-23 10:24:10 -0700899
Alex Sakhartchoukd36f2482010-08-24 11:37:33 -0700900 ProgramRaster mProgramRaster_CULL_BACK;
901 ProgramRaster mProgramRaster_CULL_FRONT;
902 ProgramRaster mProgramRaster_CULL_NONE;
Alex Sakhartchouk32e09b52010-08-23 10:24:10 -0700903
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700904 ///////////////////////////////////////////////////////////////////////////////////
Jack Palevich43702d82009-05-28 13:38:16 -0700905 //
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700906
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700907 /**
Jason Sams27676fe2010-11-10 17:00:59 -0800908 * Base class application should derive from for handling RS messages
Stephen Hines8cecbb52011-02-28 18:20:34 -0800909 * coming from their scripts. When a script calls sendToClient the data
Jason Sams27676fe2010-11-10 17:00:59 -0800910 * fields will be filled in and then the run method called by a message
911 * handling thread. This will occur some time after sendToClient completes
912 * in the script.
913 *
914 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800915 public static class RSMessageHandler implements Runnable {
Jason Sams516c3192009-10-06 13:58:47 -0700916 protected int[] mData;
917 protected int mID;
Jason Sams1c415172010-11-08 17:06:46 -0800918 protected int mLength;
Jason Sams516c3192009-10-06 13:58:47 -0700919 public void run() {
920 }
921 }
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700922 /**
Jason Sams27676fe2010-11-10 17:00:59 -0800923 * If an application is expecting messages it should set this field to an
924 * instance of RSMessage. This instance will receive all the user messages
925 * sent from sendToClient by scripts from this context.
926 *
927 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800928 RSMessageHandler mMessageCallback = null;
929
930 public void setMessageHandler(RSMessageHandler msg) {
931 mMessageCallback = msg;
932 }
933 public RSMessageHandler getMessageHandler() {
934 return mMessageCallback;
935 }
Jason Sams516c3192009-10-06 13:58:47 -0700936
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700937 /**
Jason Sams02d56d92013-04-12 16:40:50 -0700938 * Place a message into the message queue to be sent back to the message
939 * handler once all previous commands have been executed.
Jason Sams455d6442013-02-05 19:20:18 -0800940 *
941 * @param id
942 * @param data
943 */
944 public void sendMessage(int id, int[] data) {
945 nContextSendMessage(id, data);
946 }
947
948 /**
Jason Sams27676fe2010-11-10 17:00:59 -0800949 * Runtime error base class. An application should derive from this class
950 * if it wishes to install an error handler. When errors occur at runtime
951 * the fields in this class will be filled and the run method called.
952 *
953 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800954 public static class RSErrorHandler implements Runnable {
Jason Sams1c415172010-11-08 17:06:46 -0800955 protected String mErrorMessage;
956 protected int mErrorNum;
957 public void run() {
958 }
959 }
Jason Sams27676fe2010-11-10 17:00:59 -0800960
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700961 /**
Jason Sams27676fe2010-11-10 17:00:59 -0800962 * Application Error handler. All runtime errors will be dispatched to the
963 * instance of RSAsyncError set here. If this field is null a
964 * RSRuntimeException will instead be thrown with details about the error.
965 * This will cause program termaination.
966 *
967 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800968 RSErrorHandler mErrorCallback = null;
969
970 public void setErrorHandler(RSErrorHandler msg) {
971 mErrorCallback = msg;
972 }
973 public RSErrorHandler getErrorHandler() {
974 return mErrorCallback;
975 }
Jason Sams1c415172010-11-08 17:06:46 -0800976
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700977 /**
Jason Sams27676fe2010-11-10 17:00:59 -0800978 * RenderScript worker threads priority enumeration. The default value is
979 * NORMAL. Applications wishing to do background processing such as
980 * wallpapers should set their priority to LOW to avoid starving forground
981 * processes.
982 */
Jason Sams7d787b42009-11-15 12:14:26 -0800983 public enum Priority {
Glenn Kasten260c77a2011-06-01 17:25:54 -0700984 LOW (Process.THREAD_PRIORITY_BACKGROUND + (5 * Process.THREAD_PRIORITY_LESS_FAVORABLE)),
985 NORMAL (Process.THREAD_PRIORITY_DISPLAY);
Jason Sams7d787b42009-11-15 12:14:26 -0800986
987 int mID;
988 Priority(int id) {
989 mID = id;
990 }
991 }
992
Jason Sams771bebb2009-12-07 12:40:12 -0800993 void validate() {
994 if (mContext == 0) {
Jason Samsc1d62102010-11-04 14:32:19 -0700995 throw new RSInvalidStateException("Calling RS with no Context active.");
Jason Sams771bebb2009-12-07 12:40:12 -0800996 }
997 }
998
Jason Sams27676fe2010-11-10 17:00:59 -0800999
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001000 /**
Jason Sams27676fe2010-11-10 17:00:59 -08001001 * Change the priority of the worker threads for this context.
1002 *
1003 * @param p New priority to be set.
1004 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001005 public void setPriority(Priority p) {
Jason Sams5dbfe932010-01-27 14:41:43 -08001006 validate();
Jason Sams7d787b42009-11-15 12:14:26 -08001007 nContextSetPriority(p.mID);
1008 }
1009
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001010 static class MessageThread extends Thread {
Jason Sams516c3192009-10-06 13:58:47 -07001011 RenderScript mRS;
1012 boolean mRun = true;
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001013 int[] mAuxData = new int[2];
Jason Sams1c415172010-11-08 17:06:46 -08001014
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001015 static final int RS_MESSAGE_TO_CLIENT_NONE = 0;
1016 static final int RS_MESSAGE_TO_CLIENT_EXCEPTION = 1;
1017 static final int RS_MESSAGE_TO_CLIENT_RESIZE = 2;
1018 static final int RS_MESSAGE_TO_CLIENT_ERROR = 3;
1019 static final int RS_MESSAGE_TO_CLIENT_USER = 4;
Jason Sams739c8262013-04-11 18:07:52 -07001020 static final int RS_MESSAGE_TO_CLIENT_NEW_BUFFER = 5;
Jason Sams516c3192009-10-06 13:58:47 -07001021
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001022 static final int RS_ERROR_FATAL_UNKNOWN = 0x1000;
Jason Samsadd9d962010-11-22 16:20:16 -08001023
Jason Sams516c3192009-10-06 13:58:47 -07001024 MessageThread(RenderScript rs) {
1025 super("RSMessageThread");
1026 mRS = rs;
1027
1028 }
1029
1030 public void run() {
1031 // This function is a temporary solution. The final solution will
1032 // used typed allocations where the message id is the type indicator.
1033 int[] rbuf = new int[16];
Jason Sams2e1872f2010-08-17 16:25:41 -07001034 mRS.nContextInitToClient(mRS.mContext);
Jason Sams516c3192009-10-06 13:58:47 -07001035 while(mRun) {
Jason Sams1d45c472010-08-25 14:31:48 -07001036 rbuf[0] = 0;
Jason Samsedbfabd2011-05-17 15:01:29 -07001037 int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData);
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001038 int size = mAuxData[1];
1039 int subID = mAuxData[0];
Jason Sams1c415172010-11-08 17:06:46 -08001040
1041 if (msg == RS_MESSAGE_TO_CLIENT_USER) {
1042 if ((size>>2) >= rbuf.length) {
1043 rbuf = new int[(size + 3) >> 2];
1044 }
Jason Samsedbfabd2011-05-17 15:01:29 -07001045 if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
1046 RS_MESSAGE_TO_CLIENT_USER) {
1047 throw new RSDriverException("Error processing message from Renderscript.");
1048 }
Jason Sams1c415172010-11-08 17:06:46 -08001049
1050 if(mRS.mMessageCallback != null) {
1051 mRS.mMessageCallback.mData = rbuf;
1052 mRS.mMessageCallback.mID = subID;
1053 mRS.mMessageCallback.mLength = size;
1054 mRS.mMessageCallback.run();
Jason Sams1d45c472010-08-25 14:31:48 -07001055 } else {
Jason Sams1c415172010-11-08 17:06:46 -08001056 throw new RSInvalidStateException("Received a message from the script with no message handler installed.");
Jason Sams516c3192009-10-06 13:58:47 -07001057 }
Stephen Hinesab98bb62010-09-24 14:38:30 -07001058 continue;
Jason Sams516c3192009-10-06 13:58:47 -07001059 }
Jason Sams1c415172010-11-08 17:06:46 -08001060
1061 if (msg == RS_MESSAGE_TO_CLIENT_ERROR) {
1062 String e = mRS.nContextGetErrorMessage(mRS.mContext);
1063
Jason Samsadd9d962010-11-22 16:20:16 -08001064 if (subID >= RS_ERROR_FATAL_UNKNOWN) {
1065 throw new RSRuntimeException("Fatal error " + subID + ", details: " + e);
1066 }
1067
Jason Sams1c415172010-11-08 17:06:46 -08001068 if(mRS.mErrorCallback != null) {
1069 mRS.mErrorCallback.mErrorMessage = e;
1070 mRS.mErrorCallback.mErrorNum = subID;
1071 mRS.mErrorCallback.run();
1072 } else {
Jason Samsa4b7bc92013-02-05 15:05:39 -08001073 android.util.Log.e(LOG_TAG, "non fatal RS error, " + e);
Stephen Hinesbe74bdd2012-02-03 15:29:36 -08001074 // Do not throw here. In these cases, we do not have
1075 // a fatal error.
Jason Sams1c415172010-11-08 17:06:46 -08001076 }
1077 continue;
1078 }
1079
Jason Sams739c8262013-04-11 18:07:52 -07001080 if (msg == RS_MESSAGE_TO_CLIENT_NEW_BUFFER) {
1081 Allocation.sendBufferNotification(subID);
1082 continue;
1083 }
1084
Jason Sams1c415172010-11-08 17:06:46 -08001085 // 2: teardown.
1086 // But we want to avoid starving other threads during
1087 // teardown by yielding until the next line in the destructor
1088 // can execute to set mRun = false
1089 try {
1090 sleep(1, 0);
1091 } catch(InterruptedException e) {
Jason Sams516c3192009-10-06 13:58:47 -07001092 }
Jason Sams516c3192009-10-06 13:58:47 -07001093 }
Jason Sams3bc47d42009-11-12 15:10:25 -08001094 Log.d(LOG_TAG, "MessageThread exiting.");
Jason Sams516c3192009-10-06 13:58:47 -07001095 }
1096 }
1097
Tim Murrayf8c033d2013-04-09 14:33:32 -07001098 static class GCThread extends Thread {
1099 RenderScript mRS;
1100 boolean mRun = true;
1101
Tim Murray6dacf832013-04-11 19:32:14 -07001102 long currentSize = 0;
1103 long targetSize; // call System.gc after 512MB of allocs
1104
1105 final Lock lock = new ReentrantLock();
1106 final Condition cond = lock.newCondition();
Tim Murrayf8c033d2013-04-09 14:33:32 -07001107
1108 GCThread(RenderScript rs) {
1109 super("RSGCThread");
1110 mRS = rs;
1111
1112 }
1113
1114 public void run() {
Tim Murray6dacf832013-04-11 19:32:14 -07001115 ActivityManager am = (ActivityManager)mRS.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
1116 ActivityManager.MemoryInfo meminfo = new ActivityManager.MemoryInfo();
1117 am.getMemoryInfo(meminfo);
1118 targetSize = (long)(meminfo.totalMem * .5f);
1119
Tim Murrayf8c033d2013-04-09 14:33:32 -07001120 while(mRun) {
Tim Murray6dacf832013-04-11 19:32:14 -07001121 System.gc();
1122 lock.lock();
Tim Murrayf8c033d2013-04-09 14:33:32 -07001123 try {
Tim Murray6dacf832013-04-11 19:32:14 -07001124 cond.awaitUninterruptibly();
1125 } finally {
1126 lock.unlock();
Tim Murrayf8c033d2013-04-09 14:33:32 -07001127 }
1128 }
Tim Murray6dacf832013-04-11 19:32:14 -07001129
Tim Murrayf8c033d2013-04-09 14:33:32 -07001130 Log.d(LOG_TAG, "GCThread exiting.");
1131 }
1132
Tim Murray6dacf832013-04-11 19:32:14 -07001133 public synchronized void addAllocSize(long bytes) {
Tim Murrayf8c033d2013-04-09 14:33:32 -07001134 currentSize += bytes;
Tim Murray6dacf832013-04-11 19:32:14 -07001135 if (currentSize >= targetSize) {
1136 lock.lock();
1137 try {
1138 cond.signal();
1139 } finally {
1140 lock.unlock();
1141 }
1142 }
Tim Murrayf8c033d2013-04-09 14:33:32 -07001143 }
1144
Tim Murray6dacf832013-04-11 19:32:14 -07001145 public synchronized void removeAllocSize(long bytes) {
Tim Murrayf8c033d2013-04-09 14:33:32 -07001146 currentSize -= bytes;
1147 }
1148
1149 }
1150
1151
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001152 RenderScript(Context ctx) {
Jason Sams1a4e1f32012-02-24 17:51:24 -08001153 if (ctx != null) {
1154 mApplicationContext = ctx.getApplicationContext();
1155 }
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001156 }
1157
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001158 /**
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001159 * Gets the application context associated with the RenderScript context.
1160 *
1161 * @return The application context.
1162 */
1163 public final Context getApplicationContext() {
1164 return mApplicationContext;
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001165 }
1166
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001167 /**
Jason Samsadd26dc2013-02-22 18:43:45 -08001168 * @hide
1169 */
1170 public static RenderScript create(Context ctx, int sdkVersion) {
1171 return create(ctx, sdkVersion, ContextType.NORMAL);
1172 }
1173
Tim Murrayf8c033d2013-04-09 14:33:32 -07001174 void addAllocSizeForGC(int bytes) {
1175 mGCThread.addAllocSize(bytes);
1176 }
1177
1178 void removeAllocSizeForGC(int bytes) {
1179 mGCThread.removeAllocSize(bytes);
1180 }
1181
1182
Jason Samsadd26dc2013-02-22 18:43:45 -08001183 /**
Jason Sams27676fe2010-11-10 17:00:59 -08001184 * Create a basic RenderScript context.
1185 *
Jason Sams1a4e1f32012-02-24 17:51:24 -08001186 * @hide
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001187 * @param ctx The context.
Jason Sams27676fe2010-11-10 17:00:59 -08001188 * @return RenderScript
1189 */
Jason Samsadd26dc2013-02-22 18:43:45 -08001190 public static RenderScript create(Context ctx, int sdkVersion, ContextType ct) {
Shih-wei Liao6b32fab2010-12-10 01:03:59 -08001191 RenderScript rs = new RenderScript(ctx);
Jason Sams704ff642010-02-09 16:05:07 -08001192
1193 rs.mDev = rs.nDeviceCreate();
Jason Samsadd26dc2013-02-22 18:43:45 -08001194 rs.mContext = rs.nContextCreate(rs.mDev, 0, sdkVersion, ct.mID);
Jason Sams26985362011-05-03 15:01:58 -07001195 if (rs.mContext == 0) {
1196 throw new RSDriverException("Failed to create RS context.");
1197 }
Jason Sams704ff642010-02-09 16:05:07 -08001198 rs.mMessageThread = new MessageThread(rs);
Tim Murrayf8c033d2013-04-09 14:33:32 -07001199 rs.mGCThread = new GCThread(rs);
Jason Sams704ff642010-02-09 16:05:07 -08001200 rs.mMessageThread.start();
Tim Murrayf8c033d2013-04-09 14:33:32 -07001201 rs.mGCThread.start();
Jason Sams704ff642010-02-09 16:05:07 -08001202 return rs;
Jason Samsefd9b6fb2009-11-03 13:58:36 -08001203 }
1204
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001205 /**
Jason Sams1a4e1f32012-02-24 17:51:24 -08001206 * Create a basic RenderScript context.
1207 *
1208 * @param ctx The context.
1209 * @return RenderScript
1210 */
1211 public static RenderScript create(Context ctx) {
Jason Samsadd26dc2013-02-22 18:43:45 -08001212 return create(ctx, ContextType.NORMAL);
1213 }
1214
1215 /**
1216 * Create a basic RenderScript context.
1217 *
Jason Samsadd26dc2013-02-22 18:43:45 -08001218 *
1219 * @param ctx The context.
Jason Sams02d56d92013-04-12 16:40:50 -07001220 * @param ct The type of context to be created.
Jason Samsadd26dc2013-02-22 18:43:45 -08001221 * @return RenderScript
1222 */
1223 public static RenderScript create(Context ctx, ContextType ct) {
Jason Sams1a4e1f32012-02-24 17:51:24 -08001224 int v = ctx.getApplicationInfo().targetSdkVersion;
Jason Samsadd26dc2013-02-22 18:43:45 -08001225 return create(ctx, v, ct);
Jason Sams1a4e1f32012-02-24 17:51:24 -08001226 }
1227
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001228 /**
Jason Sams27676fe2010-11-10 17:00:59 -08001229 * Print the currently available debugging information about the state of
1230 * the RS context to the log.
1231 *
Jason Sams27676fe2010-11-10 17:00:59 -08001232 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001233 public void contextDump() {
Jason Sams5dbfe932010-01-27 14:41:43 -08001234 validate();
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001235 nContextDump(0);
Jason Sams715333b2009-11-17 17:26:46 -08001236 }
1237
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001238 /**
Jason Sams27676fe2010-11-10 17:00:59 -08001239 * Wait for any commands in the fifo between the java bindings and native to
1240 * be processed.
1241 *
1242 */
Jason Sams96ed4cf2010-06-15 12:15:57 -07001243 public void finish() {
1244 nContextFinish();
1245 }
1246
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -07001247 /**
Jason Sams27676fe2010-11-10 17:00:59 -08001248 * Destroy this renderscript context. Once this function is called its no
1249 * longer legal to use this or any objects created by this context.
1250 *
1251 */
Jason Samsf5b45962009-08-25 14:49:07 -07001252 public void destroy() {
Jason Sams5dbfe932010-01-27 14:41:43 -08001253 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -07001254 nContextDeinitToClient(mContext);
Jason Sams516c3192009-10-06 13:58:47 -07001255 mMessageThread.mRun = false;
Tim Murrayf8c033d2013-04-09 14:33:32 -07001256 mGCThread.mRun = false;
Tim Murray6dacf832013-04-11 19:32:14 -07001257 mGCThread.addAllocSize(0);
Jason Samsa8bf9422010-09-16 13:43:19 -07001258 try {
1259 mMessageThread.join();
Tim Murrayf8c033d2013-04-09 14:33:32 -07001260 mGCThread.join();
Jason Samsa8bf9422010-09-16 13:43:19 -07001261 } catch(InterruptedException e) {
1262 }
Jason Sams516c3192009-10-06 13:58:47 -07001263
Jason Sams2e1872f2010-08-17 16:25:41 -07001264 nContextDestroy();
Jason Samsf5b45962009-08-25 14:49:07 -07001265 mContext = 0;
1266
1267 nDeviceDestroy(mDev);
1268 mDev = 0;
1269 }
Jason Sams02fb2cb2009-05-28 15:37:57 -07001270
Jason Samsa9e7a052009-09-25 14:51:22 -07001271 boolean isAlive() {
1272 return mContext != 0;
1273 }
1274
Jason Samsbf6ef8d2010-12-06 15:59:59 -08001275 int safeID(BaseObj o) {
Jason Sams6b9dec02009-09-23 16:38:37 -07001276 if(o != null) {
Jason Samse07694b2012-04-03 15:36:36 -07001277 return o.getID(this);
Jason Samsd8e41612009-08-20 17:22:40 -07001278 }
Jason Sams6b9dec02009-09-23 16:38:37 -07001279 return 0;
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001280 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001281}