blob: 5f93f5b769ecd3aed6fe3cc571163c3d5b8ea095 [file] [log] [blame]
Jack Palevich60aa3ea2009-05-26 13:45:08 -07001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
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 Sams43ee06852009-08-12 17:54:11 -070019import java.lang.reflect.Field;
Jason Sams36e612a2009-07-31 16:26:13 -070020
Shih-wei Liao6b32fab2010-12-10 01:03:59 -080021import android.content.Context;
Jason Samsb8c5a842009-07-31 20:40:47 -070022import android.graphics.Bitmap;
Romain Guy650a3eb2009-08-31 14:06:43 -070023import android.graphics.BitmapFactory;
Jason Sams36e612a2009-07-31 16:26:13 -070024import android.util.Config;
25import android.util.Log;
26import android.view.Surface;
Jack Palevich43702d82009-05-28 13:38:16 -070027
Jack Palevich60aa3ea2009-05-26 13:45:08 -070028
Jason Samse29d4712009-07-23 15:19:03 -070029/**
30 * @hide
31 *
Jason Sams27676fe2010-11-10 17:00:59 -080032 * RenderScript base master class. An instance of this class creates native
33 * worker threads for processing commands from this object. This base class
34 * does not provide any extended capabilities beyond simple data processing.
35 * For extended capabilities use derived classes such as RenderScriptGL.
36 *
37 *
38 *
Jason Samse29d4712009-07-23 15:19:03 -070039 **/
Jack Palevich60aa3ea2009-05-26 13:45:08 -070040public class RenderScript {
Jason Sams3bc47d42009-11-12 15:10:25 -080041 static final String LOG_TAG = "RenderScript_jni";
Jason Samsbf6ef8d2010-12-06 15:59:59 -080042 static final boolean DEBUG = false;
Romain Guy650a3eb2009-08-31 14:06:43 -070043 @SuppressWarnings({"UnusedDeclaration", "deprecation"})
Jason Samsbf6ef8d2010-12-06 15:59:59 -080044 static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
Jack Palevich60aa3ea2009-05-26 13:45:08 -070045
Shih-wei Liao6b32fab2010-12-10 01:03:59 -080046 private Context mApplicationContext;
Jack Palevich60aa3ea2009-05-26 13:45:08 -070047
Shih-wei Liao6b32fab2010-12-10 01:03:59 -080048 /*
Jack Palevich60aa3ea2009-05-26 13:45:08 -070049 * We use a class initializer to allow the native code to cache some
50 * field offsets.
51 */
Romain Guy650a3eb2009-08-31 14:06:43 -070052 @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
Jason Samsbf6ef8d2010-12-06 15:59:59 -080053 static boolean sInitialized;
54 native static void _nInit();
Jack Palevich60aa3ea2009-05-26 13:45:08 -070055
Jason Samsdba3ba52009-07-30 14:56:12 -070056
Jack Palevich60aa3ea2009-05-26 13:45:08 -070057 static {
58 sInitialized = false;
59 try {
Jason Samse29d4712009-07-23 15:19:03 -070060 System.loadLibrary("rs_jni");
Jack Palevich60aa3ea2009-05-26 13:45:08 -070061 _nInit();
Jack Palevich60aa3ea2009-05-26 13:45:08 -070062 sInitialized = true;
63 } catch (UnsatisfiedLinkError e) {
64 Log.d(LOG_TAG, "RenderScript JNI library not found!");
65 }
66 }
67
Jason Sams2e1872f2010-08-17 16:25:41 -070068 // Non-threadsafe functions.
Jason Sams36e612a2009-07-31 16:26:13 -070069 native int nDeviceCreate();
70 native void nDeviceDestroy(int dev);
Jason Samsebfb4362009-09-23 13:57:02 -070071 native void nDeviceSetConfig(int dev, int param, int value);
Jason Sams1c415172010-11-08 17:06:46 -080072 native void nContextGetUserMessage(int con, int[] data);
73 native String nContextGetErrorMessage(int con);
74 native int nContextPeekMessage(int con, int[] subID, boolean wait);
Jason Sams2e1872f2010-08-17 16:25:41 -070075 native void nContextInitToClient(int con);
76 native void nContextDeinitToClient(int con);
Jason Sams3eaa3382009-06-10 15:04:38 -070077
Jason Sams718cd1f2009-12-23 14:35:29 -080078
Jason Sams2e1872f2010-08-17 16:25:41 -070079 // Methods below are wrapped to protect the non-threadsafe
80 // lockless fifo.
Jason Sams11c8af92010-10-13 15:31:10 -070081 native int rsnContextCreateGL(int dev, int ver,
82 int colorMin, int colorPref,
83 int alphaMin, int alphaPref,
84 int depthMin, int depthPref,
85 int stencilMin, int stencilPref,
86 int samplesMin, int samplesPref, float samplesQ);
87 synchronized int nContextCreateGL(int dev, int ver,
88 int colorMin, int colorPref,
89 int alphaMin, int alphaPref,
90 int depthMin, int depthPref,
91 int stencilMin, int stencilPref,
92 int samplesMin, int samplesPref, float samplesQ) {
93 return rsnContextCreateGL(dev, ver, colorMin, colorPref,
94 alphaMin, alphaPref, depthMin, depthPref,
95 stencilMin, stencilPref,
96 samplesMin, samplesPref, samplesQ);
Jason Sams2e1872f2010-08-17 16:25:41 -070097 }
98 native int rsnContextCreate(int dev, int ver);
99 synchronized int nContextCreate(int dev, int ver) {
100 return rsnContextCreate(dev, ver);
101 }
102 native void rsnContextDestroy(int con);
103 synchronized void nContextDestroy() {
104 rsnContextDestroy(mContext);
105 }
106 native void rsnContextSetSurface(int con, int w, int h, Surface sur);
107 synchronized void nContextSetSurface(int w, int h, Surface sur) {
108 rsnContextSetSurface(mContext, w, h, sur);
109 }
110 native void rsnContextSetPriority(int con, int p);
111 synchronized void nContextSetPriority(int p) {
112 rsnContextSetPriority(mContext, p);
113 }
114 native void rsnContextDump(int con, int bits);
115 synchronized void nContextDump(int bits) {
116 rsnContextDump(mContext, bits);
117 }
118 native void rsnContextFinish(int con);
119 synchronized void nContextFinish() {
120 rsnContextFinish(mContext);
121 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700122
Jason Sams2e1872f2010-08-17 16:25:41 -0700123 native void rsnContextBindRootScript(int con, int script);
124 synchronized void nContextBindRootScript(int script) {
125 rsnContextBindRootScript(mContext, script);
126 }
127 native void rsnContextBindSampler(int con, int sampler, int slot);
128 synchronized void nContextBindSampler(int sampler, int slot) {
129 rsnContextBindSampler(mContext, sampler, slot);
130 }
131 native void rsnContextBindProgramStore(int con, int pfs);
132 synchronized void nContextBindProgramStore(int pfs) {
133 rsnContextBindProgramStore(mContext, pfs);
134 }
135 native void rsnContextBindProgramFragment(int con, int pf);
136 synchronized void nContextBindProgramFragment(int pf) {
137 rsnContextBindProgramFragment(mContext, pf);
138 }
139 native void rsnContextBindProgramVertex(int con, int pv);
140 synchronized void nContextBindProgramVertex(int pv) {
141 rsnContextBindProgramVertex(mContext, pv);
142 }
143 native void rsnContextBindProgramRaster(int con, int pr);
144 synchronized void nContextBindProgramRaster(int pr) {
145 rsnContextBindProgramRaster(mContext, pr);
146 }
147 native void rsnContextPause(int con);
148 synchronized void nContextPause() {
149 rsnContextPause(mContext);
150 }
151 native void rsnContextResume(int con);
152 synchronized void nContextResume() {
153 rsnContextResume(mContext);
154 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700155
Jason Sams2e1872f2010-08-17 16:25:41 -0700156 native void rsnAssignName(int con, int obj, byte[] name);
157 synchronized void nAssignName(int obj, byte[] name) {
158 rsnAssignName(mContext, obj, name);
159 }
160 native String rsnGetName(int con, int obj);
161 synchronized String nGetName(int obj) {
162 return rsnGetName(mContext, obj);
163 }
164 native void rsnObjDestroy(int con, int id);
165 synchronized void nObjDestroy(int id) {
166 rsnObjDestroy(mContext, id);
167 }
Jason Samsfe08d992009-05-27 14:45:32 -0700168
Jason Sams2e1872f2010-08-17 16:25:41 -0700169 native int rsnElementCreate(int con, int type, int kind, boolean norm, int vecSize);
170 synchronized int nElementCreate(int type, int kind, boolean norm, int vecSize) {
171 return rsnElementCreate(mContext, type, kind, norm, vecSize);
172 }
Jason Sams70d4e502010-09-02 17:35:23 -0700173 native int rsnElementCreate2(int con, int[] elements, String[] names, int[] arraySizes);
174 synchronized int nElementCreate2(int[] elements, String[] names, int[] arraySizes) {
175 return rsnElementCreate2(mContext, elements, names, arraySizes);
Jason Sams2e1872f2010-08-17 16:25:41 -0700176 }
177 native void rsnElementGetNativeData(int con, int id, int[] elementData);
178 synchronized void nElementGetNativeData(int id, int[] elementData) {
179 rsnElementGetNativeData(mContext, id, elementData);
180 }
181 native void rsnElementGetSubElements(int con, int id, int[] IDs, String[] names);
182 synchronized void nElementGetSubElements(int id, int[] IDs, String[] names) {
183 rsnElementGetSubElements(mContext, id, IDs, names);
184 }
Jason Sams768bc022009-09-21 19:41:04 -0700185
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800186 native int rsnTypeCreate(int con, int eid, int x, int y, int z, boolean mips, boolean faces);
187 synchronized int nTypeCreate(int eid, int x, int y, int z, boolean mips, boolean faces) {
188 return rsnTypeCreate(mContext, eid, x, y, z, mips, faces);
Jason Sams2e1872f2010-08-17 16:25:41 -0700189 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700190 native void rsnTypeGetNativeData(int con, int id, int[] typeData);
191 synchronized void nTypeGetNativeData(int id, int[] typeData) {
192 rsnTypeGetNativeData(mContext, id, typeData);
193 }
Jason Sams768bc022009-09-21 19:41:04 -0700194
Jason Samsd4b23b52010-12-13 15:32:35 -0800195 native int rsnAllocationCreateTyped(int con, int type, int mip, int usage);
196 synchronized int nAllocationCreateTyped(int type, int mip, int usage) {
197 return rsnAllocationCreateTyped(mContext, type, mip, usage);
Jason Sams2e1872f2010-08-17 16:25:41 -0700198 }
Jason Sams5476b452010-12-08 16:14:36 -0800199 native int rsnAllocationCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage);
200 synchronized int nAllocationCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) {
201 return rsnAllocationCreateFromBitmap(mContext, type, mip, bmp, usage);
Alex Sakhartchouk26ae3902010-10-11 12:35:15 -0700202 }
Jason Sams5476b452010-12-08 16:14:36 -0800203 native int rsnAllocationCubeCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage);
204 synchronized int nAllocationCubeCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) {
205 return rsnAllocationCubeCreateFromBitmap(mContext, type, mip, bmp, usage);
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -0800206 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700207 native int rsnAllocationCreateBitmapRef(int con, int type, Bitmap bmp);
208 synchronized int nAllocationCreateBitmapRef(int type, Bitmap bmp) {
209 return rsnAllocationCreateBitmapRef(mContext, type, bmp);
210 }
Jason Sams5476b452010-12-08 16:14:36 -0800211 native int rsnAllocationCreateFromAssetStream(int con, int mips, int assetStream, int usage);
212 synchronized int nAllocationCreateFromAssetStream(int mips, int assetStream, int usage) {
213 return rsnAllocationCreateFromAssetStream(mContext, mips, assetStream, usage);
214 }
215
Jason Sams4ef66502010-12-10 16:03:15 -0800216 native void rsnAllocationCopyToBitmap(int con, int alloc, Bitmap bmp);
217 synchronized void nAllocationCopyToBitmap(int alloc, Bitmap bmp) {
218 rsnAllocationCopyToBitmap(mContext, alloc, bmp);
219 }
220
221
Jason Sams5476b452010-12-08 16:14:36 -0800222 native void rsnAllocationSyncAll(int con, int alloc, int src);
223 synchronized void nAllocationSyncAll(int alloc, int src) {
224 rsnAllocationSyncAll(mContext, alloc, src);
225 }
Jason Sams4ef66502010-12-10 16:03:15 -0800226 native void rsnAllocationCopyFromBitmap(int con, int alloc, Bitmap bmp);
227 synchronized void nAllocationCopyFromBitmap(int alloc, Bitmap bmp) {
228 rsnAllocationCopyFromBitmap(mContext, alloc, bmp);
Jason Sams2e1872f2010-08-17 16:25:41 -0700229 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700230
Jason Sams2e1872f2010-08-17 16:25:41 -0700231 native void rsnAllocationUploadToTexture(int con, int alloc, boolean genMips, int baseMioLevel);
232 synchronized void nAllocationUploadToTexture(int alloc, boolean genMips, int baseMioLevel) {
233 rsnAllocationUploadToTexture(mContext, alloc, genMips, baseMioLevel);
234 }
235 native void rsnAllocationUploadToBufferObject(int con, int alloc);
236 synchronized void nAllocationUploadToBufferObject(int alloc) {
237 rsnAllocationUploadToBufferObject(mContext, alloc);
238 }
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -0700239
Jason Sams2e1872f2010-08-17 16:25:41 -0700240 native void rsnAllocationSubData1D(int con, int id, int off, int count, int[] d, int sizeBytes);
241 synchronized void nAllocationSubData1D(int id, int off, int count, int[] d, int sizeBytes) {
242 rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes);
243 }
244 native void rsnAllocationSubData1D(int con, int id, int off, int count, short[] d, int sizeBytes);
245 synchronized void nAllocationSubData1D(int id, int off, int count, short[] d, int sizeBytes) {
246 rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes);
247 }
248 native void rsnAllocationSubData1D(int con, int id, int off, int count, byte[] d, int sizeBytes);
249 synchronized void nAllocationSubData1D(int id, int off, int count, byte[] d, int sizeBytes) {
250 rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes);
251 }
Jason Sams49bdaf02010-08-31 13:50:42 -0700252 native void rsnAllocationSubElementData1D(int con, int id, int xoff, int compIdx, byte[] d, int sizeBytes);
253 synchronized void nAllocationSubElementData1D(int id, int xoff, int compIdx, byte[] d, int sizeBytes) {
254 rsnAllocationSubElementData1D(mContext, id, xoff, compIdx, d, sizeBytes);
255 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700256 native void rsnAllocationSubData1D(int con, int id, int off, int count, float[] d, int sizeBytes);
257 synchronized void nAllocationSubData1D(int id, int off, int count, float[] d, int sizeBytes) {
258 rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes);
259 }
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700260
Jason Sams2e1872f2010-08-17 16:25:41 -0700261 native void rsnAllocationSubData2D(int con, int id, int xoff, int yoff, int w, int h, int[] d, int sizeBytes);
262 synchronized void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, int[] d, int sizeBytes) {
263 rsnAllocationSubData2D(mContext, id, xoff, yoff, w, h, d, sizeBytes);
264 }
265 native void rsnAllocationSubData2D(int con, int id, int xoff, int yoff, int w, int h, float[] d, int sizeBytes);
266 synchronized void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, float[] d, int sizeBytes) {
267 rsnAllocationSubData2D(mContext, id, xoff, yoff, w, h, d, sizeBytes);
268 }
269 native void rsnAllocationRead(int con, int id, int[] d);
270 synchronized void nAllocationRead(int id, int[] d) {
271 rsnAllocationRead(mContext, id, d);
272 }
273 native void rsnAllocationRead(int con, int id, float[] d);
274 synchronized void nAllocationRead(int id, float[] d) {
275 rsnAllocationRead(mContext, id, d);
276 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700277 native int rsnAllocationGetType(int con, int id);
278 synchronized int nAllocationGetType(int id) {
279 return rsnAllocationGetType(mContext, id);
280 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700281
Jason Sams5edc6082010-10-05 13:32:49 -0700282 native void rsnAllocationResize1D(int con, int id, int dimX);
283 synchronized void nAllocationResize1D(int id, int dimX) {
284 rsnAllocationResize1D(mContext, id, dimX);
285 }
286 native void rsnAllocationResize2D(int con, int id, int dimX, int dimY);
287 synchronized void nAllocationResize2D(int id, int dimX, int dimY) {
288 rsnAllocationResize2D(mContext, id, dimX, dimY);
289 }
290
Jason Sams2e1872f2010-08-17 16:25:41 -0700291 native int rsnFileA3DCreateFromAssetStream(int con, int assetStream);
292 synchronized int nFileA3DCreateFromAssetStream(int assetStream) {
293 return rsnFileA3DCreateFromAssetStream(mContext, assetStream);
294 }
295 native int rsnFileA3DGetNumIndexEntries(int con, int fileA3D);
296 synchronized int nFileA3DGetNumIndexEntries(int fileA3D) {
297 return rsnFileA3DGetNumIndexEntries(mContext, fileA3D);
298 }
299 native void rsnFileA3DGetIndexEntries(int con, int fileA3D, int numEntries, int[] IDs, String[] names);
300 synchronized void nFileA3DGetIndexEntries(int fileA3D, int numEntries, int[] IDs, String[] names) {
301 rsnFileA3DGetIndexEntries(mContext, fileA3D, numEntries, IDs, names);
302 }
303 native int rsnFileA3DGetEntryByIndex(int con, int fileA3D, int index);
304 synchronized int nFileA3DGetEntryByIndex(int fileA3D, int index) {
305 return rsnFileA3DGetEntryByIndex(mContext, fileA3D, index);
306 }
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700307
Jason Sams2e1872f2010-08-17 16:25:41 -0700308 native int rsnFontCreateFromFile(int con, String fileName, int size, int dpi);
309 synchronized int nFontCreateFromFile(String fileName, int size, int dpi) {
310 return rsnFontCreateFromFile(mContext, fileName, size, dpi);
311 }
Jason Sams22534172009-08-04 16:58:20 -0700312
Jason Sams2e1872f2010-08-17 16:25:41 -0700313 native void rsnAdapter1DBindAllocation(int con, int ad, int alloc);
314 synchronized void nAdapter1DBindAllocation(int ad, int alloc) {
315 rsnAdapter1DBindAllocation(mContext, ad, alloc);
316 }
317 native void rsnAdapter1DSetConstraint(int con, int ad, int dim, int value);
318 synchronized void nAdapter1DSetConstraint(int ad, int dim, int value) {
319 rsnAdapter1DSetConstraint(mContext, ad, dim, value);
320 }
321 native void rsnAdapter1DData(int con, int ad, int[] d);
322 synchronized void nAdapter1DData(int ad, int[] d) {
323 rsnAdapter1DData(mContext, ad, d);
324 }
325 native void rsnAdapter1DData(int con, int ad, float[] d);
326 synchronized void nAdapter1DData(int ad, float[] d) {
327 rsnAdapter1DData(mContext, ad, d);
328 }
329 native void rsnAdapter1DSubData(int con, int ad, int off, int count, int[] d);
330 synchronized void nAdapter1DSubData(int ad, int off, int count, int[] d) {
331 rsnAdapter1DSubData(mContext, ad, off, count, d);
332 }
333 native void rsnAdapter1DSubData(int con, int ad, int off, int count, float[] d);
334 synchronized void nAdapter1DSubData(int ad, int off, int count, float[] d) {
335 rsnAdapter1DSubData(mContext, ad, off, count, d);
336 }
337 native int rsnAdapter1DCreate(int con);
338 synchronized int nAdapter1DCreate() {
339 return rsnAdapter1DCreate(mContext);
340 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700341
Jason Sams2e1872f2010-08-17 16:25:41 -0700342 native void rsnAdapter2DBindAllocation(int con, int ad, int alloc);
343 synchronized void nAdapter2DBindAllocation(int ad, int alloc) {
344 rsnAdapter2DBindAllocation(mContext, ad, alloc);
345 }
346 native void rsnAdapter2DSetConstraint(int con, int ad, int dim, int value);
347 synchronized void nAdapter2DSetConstraint(int ad, int dim, int value) {
348 rsnAdapter2DSetConstraint(mContext, ad, dim, value);
349 }
350 native void rsnAdapter2DData(int con, int ad, int[] d);
351 synchronized void nAdapter2DData(int ad, int[] d) {
352 rsnAdapter2DData(mContext, ad, d);
353 }
354 native void rsnAdapter2DData(int con, int ad, float[] d);
355 synchronized void nAdapter2DData(int ad, float[] d) {
356 rsnAdapter2DData(mContext, ad, d);
357 }
358 native void rsnAdapter2DSubData(int con, int ad, int xoff, int yoff, int w, int h, int[] d);
359 synchronized void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, int[] d) {
360 rsnAdapter2DSubData(mContext, ad, xoff, yoff, w, h, d);
361 }
362 native void rsnAdapter2DSubData(int con, int ad, int xoff, int yoff, int w, int h, float[] d);
363 synchronized void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, float[] d) {
364 rsnAdapter2DSubData(mContext, ad, xoff, yoff, w, h, d);
365 }
366 native int rsnAdapter2DCreate(int con);
367 synchronized int nAdapter2DCreate() {
368 return rsnAdapter2DCreate(mContext);
369 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700370
Jason Sams2e1872f2010-08-17 16:25:41 -0700371 native void rsnScriptBindAllocation(int con, int script, int alloc, int slot);
372 synchronized void nScriptBindAllocation(int script, int alloc, int slot) {
373 rsnScriptBindAllocation(mContext, script, alloc, slot);
374 }
375 native void rsnScriptSetTimeZone(int con, int script, byte[] timeZone);
376 synchronized void nScriptSetTimeZone(int script, byte[] timeZone) {
377 rsnScriptSetTimeZone(mContext, script, timeZone);
378 }
379 native void rsnScriptInvoke(int con, int id, int slot);
380 synchronized void nScriptInvoke(int id, int slot) {
381 rsnScriptInvoke(mContext, id, slot);
382 }
383 native void rsnScriptInvokeV(int con, int id, int slot, byte[] params);
384 synchronized void nScriptInvokeV(int id, int slot, byte[] params) {
385 rsnScriptInvokeV(mContext, id, slot, params);
386 }
387 native void rsnScriptSetVarI(int con, int id, int slot, int val);
388 synchronized void nScriptSetVarI(int id, int slot, int val) {
389 rsnScriptSetVarI(mContext, id, slot, val);
390 }
Stephen Hines031ec58c2010-10-11 10:54:21 -0700391 native void rsnScriptSetVarJ(int con, int id, int slot, long val);
392 synchronized void nScriptSetVarJ(int id, int slot, long val) {
393 rsnScriptSetVarJ(mContext, id, slot, val);
394 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700395 native void rsnScriptSetVarF(int con, int id, int slot, float val);
396 synchronized void nScriptSetVarF(int id, int slot, float val) {
397 rsnScriptSetVarF(mContext, id, slot, val);
398 }
Stephen Hinesca54ec32010-09-20 17:20:30 -0700399 native void rsnScriptSetVarD(int con, int id, int slot, double val);
400 synchronized void nScriptSetVarD(int id, int slot, double val) {
401 rsnScriptSetVarD(mContext, id, slot, val);
402 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700403 native void rsnScriptSetVarV(int con, int id, int slot, byte[] val);
404 synchronized void nScriptSetVarV(int id, int slot, byte[] val) {
405 rsnScriptSetVarV(mContext, id, slot, val);
406 }
Jason Sams6f4cf0b2010-11-16 17:37:02 -0800407 native void rsnScriptSetVarObj(int con, int id, int slot, int val);
408 synchronized void nScriptSetVarObj(int id, int slot, int val) {
409 rsnScriptSetVarObj(mContext, id, slot, val);
410 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700411
Jason Sams2e1872f2010-08-17 16:25:41 -0700412 native void rsnScriptCBegin(int con);
413 synchronized void nScriptCBegin() {
414 rsnScriptCBegin(mContext);
415 }
416 native void rsnScriptCSetScript(int con, byte[] script, int offset, int length);
417 synchronized void nScriptCSetScript(byte[] script, int offset, int length) {
418 rsnScriptCSetScript(mContext, script, offset, length);
419 }
Shih-wei Liao6b32fab2010-12-10 01:03:59 -0800420 native int rsnScriptCCreate(int con, String val, String cacheDir);
421 synchronized int nScriptCCreate(String resName, String cacheDir) {
422 return rsnScriptCCreate(mContext, resName, cacheDir);
Jason Sams2e1872f2010-08-17 16:25:41 -0700423 }
Jason Samsebfb4362009-09-23 13:57:02 -0700424
Jason Sams2e1872f2010-08-17 16:25:41 -0700425 native void rsnSamplerBegin(int con);
426 synchronized void nSamplerBegin() {
427 rsnSamplerBegin(mContext);
428 }
429 native void rsnSamplerSet(int con, int param, int value);
430 synchronized void nSamplerSet(int param, int value) {
431 rsnSamplerSet(mContext, param, value);
432 }
Alex Sakhartchoukf5b35102010-09-30 11:36:37 -0700433 native void rsnSamplerSet2(int con, int param, float value);
434 synchronized void nSamplerSet2(int param, float value) {
435 rsnSamplerSet2(mContext, param, value);
436 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700437 native int rsnSamplerCreate(int con);
438 synchronized int nSamplerCreate() {
439 return rsnSamplerCreate(mContext);
440 }
Jason Sams0011bcf2009-12-15 12:58:36 -0800441
Jason Sams2e1872f2010-08-17 16:25:41 -0700442 native void rsnProgramStoreBegin(int con, int in, int out);
443 synchronized void nProgramStoreBegin(int in, int out) {
444 rsnProgramStoreBegin(mContext, in, out);
445 }
446 native void rsnProgramStoreDepthFunc(int con, int func);
447 synchronized void nProgramStoreDepthFunc(int func) {
448 rsnProgramStoreDepthFunc(mContext, func);
449 }
450 native void rsnProgramStoreDepthMask(int con, boolean enable);
451 synchronized void nProgramStoreDepthMask(boolean enable) {
452 rsnProgramStoreDepthMask(mContext, enable);
453 }
454 native void rsnProgramStoreColorMask(int con, boolean r, boolean g, boolean b, boolean a);
455 synchronized void nProgramStoreColorMask(boolean r, boolean g, boolean b, boolean a) {
456 rsnProgramStoreColorMask(mContext, r, g, b, a);
457 }
458 native void rsnProgramStoreBlendFunc(int con, int src, int dst);
459 synchronized void nProgramStoreBlendFunc(int src, int dst) {
460 rsnProgramStoreBlendFunc(mContext, src, dst);
461 }
462 native void rsnProgramStoreDither(int con, boolean enable);
463 synchronized void nProgramStoreDither(boolean enable) {
464 rsnProgramStoreDither(mContext, enable);
465 }
466 native int rsnProgramStoreCreate(int con);
467 synchronized int nProgramStoreCreate() {
468 return rsnProgramStoreCreate(mContext);
469 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700470
Jason Sams2e1872f2010-08-17 16:25:41 -0700471 native int rsnProgramRasterCreate(int con, boolean pointSmooth, boolean lineSmooth, boolean pointSprite);
472 synchronized int nProgramRasterCreate(boolean pointSmooth, boolean lineSmooth, boolean pointSprite) {
473 return rsnProgramRasterCreate(mContext, pointSmooth, lineSmooth, pointSprite);
474 }
475 native void rsnProgramRasterSetLineWidth(int con, int pr, float v);
476 synchronized void nProgramRasterSetLineWidth(int pr, float v) {
477 rsnProgramRasterSetLineWidth(mContext, pr, v);
478 }
479 native void rsnProgramRasterSetCullMode(int con, int pr, int mode);
480 synchronized void nProgramRasterSetCullMode(int pr, int mode) {
481 rsnProgramRasterSetCullMode(mContext, pr, mode);
482 }
Jason Sams1fe9b8c2009-06-11 14:46:10 -0700483
Jason Sams2e1872f2010-08-17 16:25:41 -0700484 native void rsnProgramBindConstants(int con, int pv, int slot, int mID);
485 synchronized void nProgramBindConstants(int pv, int slot, int mID) {
486 rsnProgramBindConstants(mContext, pv, slot, mID);
487 }
488 native void rsnProgramBindTexture(int con, int vpf, int slot, int a);
489 synchronized void nProgramBindTexture(int vpf, int slot, int a) {
490 rsnProgramBindTexture(mContext, vpf, slot, a);
491 }
492 native void rsnProgramBindSampler(int con, int vpf, int slot, int s);
493 synchronized void nProgramBindSampler(int vpf, int slot, int s) {
494 rsnProgramBindSampler(mContext, vpf, slot, s);
495 }
Alex Sakhartchoukb89aaac2010-09-23 16:16:33 -0700496 native int rsnProgramFragmentCreate(int con, String shader, int[] params);
497 synchronized int nProgramFragmentCreate(String shader, int[] params) {
498 return rsnProgramFragmentCreate(mContext, shader, params);
Jason Sams2e1872f2010-08-17 16:25:41 -0700499 }
Alex Sakhartchoukb89aaac2010-09-23 16:16:33 -0700500 native int rsnProgramVertexCreate(int con, String shader, int[] params);
501 synchronized int nProgramVertexCreate(String shader, int[] params) {
502 return rsnProgramVertexCreate(mContext, shader, params);
Jason Sams2e1872f2010-08-17 16:25:41 -0700503 }
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700504
Jason Sams2e1872f2010-08-17 16:25:41 -0700505 native int rsnMeshCreate(int con, int vtxCount, int indexCount);
506 synchronized int nMeshCreate(int vtxCount, int indexCount) {
507 return rsnMeshCreate(mContext, vtxCount, indexCount);
508 }
509 native void rsnMeshBindVertex(int con, int id, int alloc, int slot);
510 synchronized void nMeshBindVertex(int id, int alloc, int slot) {
511 rsnMeshBindVertex(mContext, id, alloc, slot);
512 }
513 native void rsnMeshBindIndex(int con, int id, int alloc, int prim, int slot);
514 synchronized void nMeshBindIndex(int id, int alloc, int prim, int slot) {
515 rsnMeshBindIndex(mContext, id, alloc, prim, slot);
516 }
Alex Sakhartchouk9d71e212010-11-08 15:10:52 -0800517 native void rsnMeshInitVertexAttribs(int con, int id);
518 synchronized void nMeshInitVertexAttribs(int id) {
519 rsnMeshInitVertexAttribs(mContext, id);
520 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700521 native int rsnMeshGetVertexBufferCount(int con, int id);
522 synchronized int nMeshGetVertexBufferCount(int id) {
523 return rsnMeshGetVertexBufferCount(mContext, id);
524 }
525 native int rsnMeshGetIndexCount(int con, int id);
526 synchronized int nMeshGetIndexCount(int id) {
527 return rsnMeshGetIndexCount(mContext, id);
528 }
529 native void rsnMeshGetVertices(int con, int id, int[] vtxIds, int vtxIdCount);
530 synchronized void nMeshGetVertices(int id, int[] vtxIds, int vtxIdCount) {
531 rsnMeshGetVertices(mContext, id, vtxIds, vtxIdCount);
532 }
533 native void rsnMeshGetIndices(int con, int id, int[] idxIds, int[] primitives, int vtxIdCount);
534 synchronized void nMeshGetIndices(int id, int[] idxIds, int[] primitives, int vtxIdCount) {
535 rsnMeshGetIndices(mContext, id, idxIds, primitives, vtxIdCount);
536 }
537
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700538
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800539 int mDev;
540 int mContext;
Romain Guy650a3eb2009-08-31 14:06:43 -0700541 @SuppressWarnings({"FieldCanBeLocal"})
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800542 MessageThread mMessageThread;
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700543
Jason Sams8cb39de2010-06-01 15:47:01 -0700544 Element mElement_U8;
545 Element mElement_I8;
546 Element mElement_U16;
547 Element mElement_I16;
548 Element mElement_U32;
549 Element mElement_I32;
Stephen Hines52d83632010-10-11 16:10:42 -0700550 Element mElement_U64;
Stephen Hinesef1dac22010-10-01 15:39:33 -0700551 Element mElement_I64;
Jason Sams8cb39de2010-06-01 15:47:01 -0700552 Element mElement_F32;
Stephen Hines02f417052010-09-30 15:19:22 -0700553 Element mElement_F64;
Jason Samsf110d4b2010-06-21 17:42:41 -0700554 Element mElement_BOOLEAN;
Jason Sams3c0dfba2009-09-27 17:50:38 -0700555
Jason Sams8cb39de2010-06-01 15:47:01 -0700556 Element mElement_ELEMENT;
557 Element mElement_TYPE;
558 Element mElement_ALLOCATION;
559 Element mElement_SAMPLER;
560 Element mElement_SCRIPT;
561 Element mElement_MESH;
562 Element mElement_PROGRAM_FRAGMENT;
563 Element mElement_PROGRAM_VERTEX;
564 Element mElement_PROGRAM_RASTER;
565 Element mElement_PROGRAM_STORE;
Jason Samsa70f4162010-03-26 15:33:42 -0700566
Jason Sams3c0dfba2009-09-27 17:50:38 -0700567 Element mElement_A_8;
568 Element mElement_RGB_565;
569 Element mElement_RGB_888;
570 Element mElement_RGBA_5551;
571 Element mElement_RGBA_4444;
572 Element mElement_RGBA_8888;
573
Jason Sams8cb39de2010-06-01 15:47:01 -0700574 Element mElement_FLOAT_2;
575 Element mElement_FLOAT_3;
576 Element mElement_FLOAT_4;
577 Element mElement_UCHAR_4;
Jason Sams7d787b42009-11-15 12:14:26 -0800578
Jason Sams1d45c472010-08-25 14:31:48 -0700579 Element mElement_MATRIX_4X4;
580 Element mElement_MATRIX_3X3;
581 Element mElement_MATRIX_2X2;
582
Jason Sams4d339932010-05-11 14:03:58 -0700583 Sampler mSampler_CLAMP_NEAREST;
584 Sampler mSampler_CLAMP_LINEAR;
585 Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
586 Sampler mSampler_WRAP_NEAREST;
587 Sampler mSampler_WRAP_LINEAR;
588 Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
589
Alex Sakhartchoukd36f2482010-08-24 11:37:33 -0700590 ProgramStore mProgramStore_BLEND_NONE_DEPTH_TEST;
591 ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
592 ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_TEST;
593 ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_WRITE;
594 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_TEST;
595 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
596 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_TEST;
597 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_WRITE;
598 ProgramStore mProgramStore_BLEND_ADD_DEPTH_TEST;
599 ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_DEPTH;
600 ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_TEST;
601 ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_WRITE;
Alex Sakhartchouk32e09b52010-08-23 10:24:10 -0700602
Alex Sakhartchoukd36f2482010-08-24 11:37:33 -0700603 ProgramRaster mProgramRaster_CULL_BACK;
604 ProgramRaster mProgramRaster_CULL_FRONT;
605 ProgramRaster mProgramRaster_CULL_NONE;
Alex Sakhartchouk32e09b52010-08-23 10:24:10 -0700606
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700607 ///////////////////////////////////////////////////////////////////////////////////
Jack Palevich43702d82009-05-28 13:38:16 -0700608 //
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700609
Jason Sams27676fe2010-11-10 17:00:59 -0800610 /**
611 * Base class application should derive from for handling RS messages
612 * comming from their scripts. When a script calls sendToClient the data
613 * fields will be filled in and then the run method called by a message
614 * handling thread. This will occur some time after sendToClient completes
615 * in the script.
616 *
617 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800618 public static class RSMessageHandler implements Runnable {
Jason Sams516c3192009-10-06 13:58:47 -0700619 protected int[] mData;
620 protected int mID;
Jason Sams1c415172010-11-08 17:06:46 -0800621 protected int mLength;
Jason Sams516c3192009-10-06 13:58:47 -0700622 public void run() {
623 }
624 }
Jason Sams27676fe2010-11-10 17:00:59 -0800625 /**
626 * If an application is expecting messages it should set this field to an
627 * instance of RSMessage. This instance will receive all the user messages
628 * sent from sendToClient by scripts from this context.
629 *
630 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800631 RSMessageHandler mMessageCallback = null;
632
633 public void setMessageHandler(RSMessageHandler msg) {
634 mMessageCallback = msg;
635 }
636 public RSMessageHandler getMessageHandler() {
637 return mMessageCallback;
638 }
Jason Sams516c3192009-10-06 13:58:47 -0700639
Jason Sams27676fe2010-11-10 17:00:59 -0800640 /**
641 * Runtime error base class. An application should derive from this class
642 * if it wishes to install an error handler. When errors occur at runtime
643 * the fields in this class will be filled and the run method called.
644 *
645 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800646 public static class RSErrorHandler implements Runnable {
Jason Sams1c415172010-11-08 17:06:46 -0800647 protected String mErrorMessage;
648 protected int mErrorNum;
649 public void run() {
650 }
651 }
Jason Sams27676fe2010-11-10 17:00:59 -0800652
653 /**
654 * Application Error handler. All runtime errors will be dispatched to the
655 * instance of RSAsyncError set here. If this field is null a
656 * RSRuntimeException will instead be thrown with details about the error.
657 * This will cause program termaination.
658 *
659 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800660 RSErrorHandler mErrorCallback = null;
661
662 public void setErrorHandler(RSErrorHandler msg) {
663 mErrorCallback = msg;
664 }
665 public RSErrorHandler getErrorHandler() {
666 return mErrorCallback;
667 }
Jason Sams1c415172010-11-08 17:06:46 -0800668
Jason Sams27676fe2010-11-10 17:00:59 -0800669 /**
670 * RenderScript worker threads priority enumeration. The default value is
671 * NORMAL. Applications wishing to do background processing such as
672 * wallpapers should set their priority to LOW to avoid starving forground
673 * processes.
674 */
Jason Sams7d787b42009-11-15 12:14:26 -0800675 public enum Priority {
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800676 // Remap these numbers to opaque...
Jason Sams7d787b42009-11-15 12:14:26 -0800677 LOW (5), //ANDROID_PRIORITY_BACKGROUND + 5
678 NORMAL (-4); //ANDROID_PRIORITY_DISPLAY
679
680 int mID;
681 Priority(int id) {
682 mID = id;
683 }
684 }
685
Jason Sams771bebb2009-12-07 12:40:12 -0800686 void validate() {
687 if (mContext == 0) {
Jason Samsc1d62102010-11-04 14:32:19 -0700688 throw new RSInvalidStateException("Calling RS with no Context active.");
Jason Sams771bebb2009-12-07 12:40:12 -0800689 }
690 }
691
Jason Sams27676fe2010-11-10 17:00:59 -0800692
693 /**
694 * Change the priority of the worker threads for this context.
695 *
696 * @param p New priority to be set.
697 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800698 public void setPriority(Priority p) {
Jason Sams5dbfe932010-01-27 14:41:43 -0800699 validate();
Jason Sams7d787b42009-11-15 12:14:26 -0800700 nContextSetPriority(p.mID);
701 }
702
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800703 static class MessageThread extends Thread {
Jason Sams516c3192009-10-06 13:58:47 -0700704 RenderScript mRS;
705 boolean mRun = true;
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800706 int[] mAuxData = new int[2];
Jason Sams1c415172010-11-08 17:06:46 -0800707
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800708 static final int RS_MESSAGE_TO_CLIENT_NONE = 0;
709 static final int RS_MESSAGE_TO_CLIENT_EXCEPTION = 1;
710 static final int RS_MESSAGE_TO_CLIENT_RESIZE = 2;
711 static final int RS_MESSAGE_TO_CLIENT_ERROR = 3;
712 static final int RS_MESSAGE_TO_CLIENT_USER = 4;
Jason Sams516c3192009-10-06 13:58:47 -0700713
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800714 static final int RS_ERROR_FATAL_UNKNOWN = 0x1000;
Jason Samsadd9d962010-11-22 16:20:16 -0800715
Jason Sams516c3192009-10-06 13:58:47 -0700716 MessageThread(RenderScript rs) {
717 super("RSMessageThread");
718 mRS = rs;
719
720 }
721
722 public void run() {
723 // This function is a temporary solution. The final solution will
724 // used typed allocations where the message id is the type indicator.
725 int[] rbuf = new int[16];
Jason Sams2e1872f2010-08-17 16:25:41 -0700726 mRS.nContextInitToClient(mRS.mContext);
Jason Sams516c3192009-10-06 13:58:47 -0700727 while(mRun) {
Jason Sams1d45c472010-08-25 14:31:48 -0700728 rbuf[0] = 0;
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800729 int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData, true);
730 int size = mAuxData[1];
731 int subID = mAuxData[0];
Jason Sams1c415172010-11-08 17:06:46 -0800732
733 if (msg == RS_MESSAGE_TO_CLIENT_USER) {
734 if ((size>>2) >= rbuf.length) {
735 rbuf = new int[(size + 3) >> 2];
736 }
737 mRS.nContextGetUserMessage(mRS.mContext, rbuf);
738
739 if(mRS.mMessageCallback != null) {
740 mRS.mMessageCallback.mData = rbuf;
741 mRS.mMessageCallback.mID = subID;
742 mRS.mMessageCallback.mLength = size;
743 mRS.mMessageCallback.run();
Jason Sams1d45c472010-08-25 14:31:48 -0700744 } else {
Jason Sams1c415172010-11-08 17:06:46 -0800745 throw new RSInvalidStateException("Received a message from the script with no message handler installed.");
Jason Sams516c3192009-10-06 13:58:47 -0700746 }
Stephen Hinesab98bb62010-09-24 14:38:30 -0700747 continue;
Jason Sams516c3192009-10-06 13:58:47 -0700748 }
Jason Sams1c415172010-11-08 17:06:46 -0800749
750 if (msg == RS_MESSAGE_TO_CLIENT_ERROR) {
751 String e = mRS.nContextGetErrorMessage(mRS.mContext);
752
Jason Samsadd9d962010-11-22 16:20:16 -0800753 if (subID >= RS_ERROR_FATAL_UNKNOWN) {
754 throw new RSRuntimeException("Fatal error " + subID + ", details: " + e);
755 }
756
Jason Sams1c415172010-11-08 17:06:46 -0800757 if(mRS.mErrorCallback != null) {
758 mRS.mErrorCallback.mErrorMessage = e;
759 mRS.mErrorCallback.mErrorNum = subID;
760 mRS.mErrorCallback.run();
761 } else {
762 //throw new RSRuntimeException("Received error num " + subID + ", details: " + e);
763 }
764 continue;
765 }
766
767 // 2: teardown.
768 // But we want to avoid starving other threads during
769 // teardown by yielding until the next line in the destructor
770 // can execute to set mRun = false
771 try {
772 sleep(1, 0);
773 } catch(InterruptedException e) {
Jason Sams516c3192009-10-06 13:58:47 -0700774 }
Jason Sams516c3192009-10-06 13:58:47 -0700775 }
Jason Sams3bc47d42009-11-12 15:10:25 -0800776 Log.d(LOG_TAG, "MessageThread exiting.");
Jason Sams516c3192009-10-06 13:58:47 -0700777 }
778 }
779
Shih-wei Liao6b32fab2010-12-10 01:03:59 -0800780 RenderScript(Context ctx) {
781 mApplicationContext = ctx.getApplicationContext();
782 }
783
784 /**
785 * Gets the application context associated with the RenderScript context.
786 *
787 * @return The application context.
788 */
789 public final Context getApplicationContext() {
790 return mApplicationContext;
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700791 }
792
Jason Sams27676fe2010-11-10 17:00:59 -0800793 /**
794 * Create a basic RenderScript context.
795 *
Shih-wei Liao6b32fab2010-12-10 01:03:59 -0800796 * @param ctx The context.
Jason Sams27676fe2010-11-10 17:00:59 -0800797 * @return RenderScript
798 */
Shih-wei Liao6b32fab2010-12-10 01:03:59 -0800799 public static RenderScript create(Context ctx) {
800 RenderScript rs = new RenderScript(ctx);
Jason Sams704ff642010-02-09 16:05:07 -0800801
802 rs.mDev = rs.nDeviceCreate();
803 rs.mContext = rs.nContextCreate(rs.mDev, 0);
804 rs.mMessageThread = new MessageThread(rs);
805 rs.mMessageThread.start();
Jason Sams704ff642010-02-09 16:05:07 -0800806 return rs;
Jason Samsefd9b6fb2009-11-03 13:58:36 -0800807 }
808
Jason Sams27676fe2010-11-10 17:00:59 -0800809 /**
810 * Print the currently available debugging information about the state of
811 * the RS context to the log.
812 *
Jason Sams27676fe2010-11-10 17:00:59 -0800813 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800814 public void contextDump() {
Jason Sams5dbfe932010-01-27 14:41:43 -0800815 validate();
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800816 nContextDump(0);
Jason Sams715333b2009-11-17 17:26:46 -0800817 }
818
Jason Sams27676fe2010-11-10 17:00:59 -0800819 /**
820 * Wait for any commands in the fifo between the java bindings and native to
821 * be processed.
822 *
823 */
Jason Sams96ed4cf2010-06-15 12:15:57 -0700824 public void finish() {
825 nContextFinish();
826 }
827
Jason Sams27676fe2010-11-10 17:00:59 -0800828 /**
829 * Destroy this renderscript context. Once this function is called its no
830 * longer legal to use this or any objects created by this context.
831 *
832 */
Jason Samsf5b45962009-08-25 14:49:07 -0700833 public void destroy() {
Jason Sams5dbfe932010-01-27 14:41:43 -0800834 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700835 nContextDeinitToClient(mContext);
Jason Sams516c3192009-10-06 13:58:47 -0700836 mMessageThread.mRun = false;
Jason Samsa8bf9422010-09-16 13:43:19 -0700837 try {
838 mMessageThread.join();
839 } catch(InterruptedException e) {
840 }
Jason Sams516c3192009-10-06 13:58:47 -0700841
Jason Sams2e1872f2010-08-17 16:25:41 -0700842 nContextDestroy();
Jason Samsf5b45962009-08-25 14:49:07 -0700843 mContext = 0;
844
845 nDeviceDestroy(mDev);
846 mDev = 0;
847 }
Jason Sams02fb2cb2009-05-28 15:37:57 -0700848
Jason Samsa9e7a052009-09-25 14:51:22 -0700849 boolean isAlive() {
850 return mContext != 0;
851 }
852
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800853 int safeID(BaseObj o) {
Jason Sams6b9dec02009-09-23 16:38:37 -0700854 if(o != null) {
Jason Sams06d69de2010-11-09 17:11:40 -0800855 return o.getID();
Jason Samsd8e41612009-08-20 17:22:40 -0700856 }
Jason Sams6b9dec02009-09-23 16:38:37 -0700857 return 0;
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700858 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700859}