blob: 08ba7e2901d53b3bea6522c735bac288356f0d9e [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
Jason Samsb8c5a842009-07-31 20:40:47 -070021import android.graphics.Bitmap;
Romain Guy650a3eb2009-08-31 14:06:43 -070022import android.graphics.BitmapFactory;
Jason Sams36e612a2009-07-31 16:26:13 -070023import android.util.Config;
24import android.util.Log;
25import android.view.Surface;
Jack Palevich43702d82009-05-28 13:38:16 -070026
Jack Palevich60aa3ea2009-05-26 13:45:08 -070027
Jason Samse29d4712009-07-23 15:19:03 -070028/**
29 * @hide
30 *
31 **/
Jack Palevich60aa3ea2009-05-26 13:45:08 -070032public class RenderScript {
Jason Sams3bc47d42009-11-12 15:10:25 -080033 static final String LOG_TAG = "RenderScript_jni";
Jason Sams704ff642010-02-09 16:05:07 -080034 protected static final boolean DEBUG = false;
Romain Guy650a3eb2009-08-31 14:06:43 -070035 @SuppressWarnings({"UnusedDeclaration", "deprecation"})
Jason Sams704ff642010-02-09 16:05:07 -080036 protected static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
Jack Palevich60aa3ea2009-05-26 13:45:08 -070037
38
39
Jason Sams02fb2cb2009-05-28 15:37:57 -070040 /*
Jack Palevich60aa3ea2009-05-26 13:45:08 -070041 * We use a class initializer to allow the native code to cache some
42 * field offsets.
43 */
Romain Guy650a3eb2009-08-31 14:06:43 -070044 @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
Jason Sams704ff642010-02-09 16:05:07 -080045 protected static boolean sInitialized;
46 native protected static void _nInit();
Jack Palevich60aa3ea2009-05-26 13:45:08 -070047
Jason Samsdba3ba52009-07-30 14:56:12 -070048
Jack Palevich60aa3ea2009-05-26 13:45:08 -070049 static {
50 sInitialized = false;
51 try {
Jason Samse29d4712009-07-23 15:19:03 -070052 System.loadLibrary("rs_jni");
Jack Palevich60aa3ea2009-05-26 13:45:08 -070053 _nInit();
Jack Palevich60aa3ea2009-05-26 13:45:08 -070054 sInitialized = true;
55 } catch (UnsatisfiedLinkError e) {
56 Log.d(LOG_TAG, "RenderScript JNI library not found!");
57 }
58 }
59
Jason Sams2e1872f2010-08-17 16:25:41 -070060 // Non-threadsafe functions.
Jason Samsea84a7c2009-09-04 14:42:41 -070061 native void nInitElements(int a8, int rgba4444, int rgba8888, int rgb565);
Jason Sams36e612a2009-07-31 16:26:13 -070062 native int nDeviceCreate();
63 native void nDeviceDestroy(int dev);
Jason Samsebfb4362009-09-23 13:57:02 -070064 native void nDeviceSetConfig(int dev, int param, int value);
Jason Sams2e1872f2010-08-17 16:25:41 -070065 native int nContextGetMessage(int con, int[] data, boolean wait);
66 native void nContextInitToClient(int con);
67 native void nContextDeinitToClient(int con);
Jason Sams3eaa3382009-06-10 15:04:38 -070068
Jason Sams718cd1f2009-12-23 14:35:29 -080069
Jason Sams2e1872f2010-08-17 16:25:41 -070070 // Methods below are wrapped to protect the non-threadsafe
71 // lockless fifo.
72 native int rsnContextCreateGL(int dev, int ver, boolean useDepth);
73 synchronized int nContextCreateGL(int dev, int ver, boolean useDepth) {
74 return rsnContextCreateGL(dev, ver, useDepth);
75 }
76 native int rsnContextCreate(int dev, int ver);
77 synchronized int nContextCreate(int dev, int ver) {
78 return rsnContextCreate(dev, ver);
79 }
80 native void rsnContextDestroy(int con);
81 synchronized void nContextDestroy() {
82 rsnContextDestroy(mContext);
83 }
84 native void rsnContextSetSurface(int con, int w, int h, Surface sur);
85 synchronized void nContextSetSurface(int w, int h, Surface sur) {
86 rsnContextSetSurface(mContext, w, h, sur);
87 }
88 native void rsnContextSetPriority(int con, int p);
89 synchronized void nContextSetPriority(int p) {
90 rsnContextSetPriority(mContext, p);
91 }
92 native void rsnContextDump(int con, int bits);
93 synchronized void nContextDump(int bits) {
94 rsnContextDump(mContext, bits);
95 }
96 native void rsnContextFinish(int con);
97 synchronized void nContextFinish() {
98 rsnContextFinish(mContext);
99 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700100
Jason Sams2e1872f2010-08-17 16:25:41 -0700101 native void rsnContextBindRootScript(int con, int script);
102 synchronized void nContextBindRootScript(int script) {
103 rsnContextBindRootScript(mContext, script);
104 }
105 native void rsnContextBindSampler(int con, int sampler, int slot);
106 synchronized void nContextBindSampler(int sampler, int slot) {
107 rsnContextBindSampler(mContext, sampler, slot);
108 }
109 native void rsnContextBindProgramStore(int con, int pfs);
110 synchronized void nContextBindProgramStore(int pfs) {
111 rsnContextBindProgramStore(mContext, pfs);
112 }
113 native void rsnContextBindProgramFragment(int con, int pf);
114 synchronized void nContextBindProgramFragment(int pf) {
115 rsnContextBindProgramFragment(mContext, pf);
116 }
117 native void rsnContextBindProgramVertex(int con, int pv);
118 synchronized void nContextBindProgramVertex(int pv) {
119 rsnContextBindProgramVertex(mContext, pv);
120 }
121 native void rsnContextBindProgramRaster(int con, int pr);
122 synchronized void nContextBindProgramRaster(int pr) {
123 rsnContextBindProgramRaster(mContext, pr);
124 }
125 native void rsnContextPause(int con);
126 synchronized void nContextPause() {
127 rsnContextPause(mContext);
128 }
129 native void rsnContextResume(int con);
130 synchronized void nContextResume() {
131 rsnContextResume(mContext);
132 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700133
Jason Sams2e1872f2010-08-17 16:25:41 -0700134 native void rsnAssignName(int con, int obj, byte[] name);
135 synchronized void nAssignName(int obj, byte[] name) {
136 rsnAssignName(mContext, obj, name);
137 }
138 native String rsnGetName(int con, int obj);
139 synchronized String nGetName(int obj) {
140 return rsnGetName(mContext, obj);
141 }
142 native void rsnObjDestroy(int con, int id);
143 synchronized void nObjDestroy(int id) {
144 rsnObjDestroy(mContext, id);
145 }
Jason Sams2e1872f2010-08-17 16:25:41 -0700146 native int rsnFileOpen(int con, byte[] name);
147 synchronized int nFileOpen(byte[] name) {
148 return rsnFileOpen(mContext, name);
149 }
Jason Samsfe08d992009-05-27 14:45:32 -0700150
Jason Sams2e1872f2010-08-17 16:25:41 -0700151 native int rsnElementCreate(int con, int type, int kind, boolean norm, int vecSize);
152 synchronized int nElementCreate(int type, int kind, boolean norm, int vecSize) {
153 return rsnElementCreate(mContext, type, kind, norm, vecSize);
154 }
155 native int rsnElementCreate2(int con, int[] elements, String[] names);
156 synchronized int nElementCreate2(int[] elements, String[] names) {
157 return rsnElementCreate2(mContext, elements, names);
158 }
159 native void rsnElementGetNativeData(int con, int id, int[] elementData);
160 synchronized void nElementGetNativeData(int id, int[] elementData) {
161 rsnElementGetNativeData(mContext, id, elementData);
162 }
163 native void rsnElementGetSubElements(int con, int id, int[] IDs, String[] names);
164 synchronized void nElementGetSubElements(int id, int[] IDs, String[] names) {
165 rsnElementGetSubElements(mContext, id, IDs, names);
166 }
Jason Sams768bc022009-09-21 19:41:04 -0700167
Jason Sams2e1872f2010-08-17 16:25:41 -0700168 native void rsnTypeBegin(int con, int elementID);
169 synchronized void nTypeBegin(int elementID) {
170 rsnTypeBegin(mContext, elementID);
171 }
172 native void rsnTypeAdd(int con, int dim, int val);
173 synchronized void nTypeAdd(int dim, int val) {
174 rsnTypeAdd(mContext, dim, val);
175 }
176 native int rsnTypeCreate(int con);
177 synchronized int nTypeCreate() {
178 return rsnTypeCreate(mContext);
179 }
180 native void rsnTypeFinalDestroy(int con, Type t);
181 synchronized void nTypeFinalDestroy(Type t) {
182 rsnTypeFinalDestroy(mContext, t);
183 }
184 native void rsnTypeSetupFields(int con, Type t, int[] types, int[] bits, Field[] IDs);
185 synchronized void nTypeSetupFields(Type t, int[] types, int[] bits, Field[] IDs) {
186 rsnTypeSetupFields(mContext, t, types, bits, IDs);
187 }
188 native void rsnTypeGetNativeData(int con, int id, int[] typeData);
189 synchronized void nTypeGetNativeData(int id, int[] typeData) {
190 rsnTypeGetNativeData(mContext, id, typeData);
191 }
Jason Sams768bc022009-09-21 19:41:04 -0700192
Jason Sams2e1872f2010-08-17 16:25:41 -0700193 native int rsnAllocationCreateTyped(int con, int type);
194 synchronized int nAllocationCreateTyped(int type) {
195 return rsnAllocationCreateTyped(mContext, type);
196 }
197 native int rsnAllocationCreateFromBitmap(int con, int dstFmt, boolean genMips, Bitmap bmp);
198 synchronized int nAllocationCreateFromBitmap(int dstFmt, boolean genMips, Bitmap bmp) {
199 return rsnAllocationCreateFromBitmap(mContext, dstFmt, genMips, bmp);
200 }
201 native int rsnAllocationCreateBitmapRef(int con, int type, Bitmap bmp);
202 synchronized int nAllocationCreateBitmapRef(int type, Bitmap bmp) {
203 return rsnAllocationCreateBitmapRef(mContext, type, bmp);
204 }
205 native int rsnAllocationCreateFromBitmapBoxed(int con, int dstFmt, boolean genMips, Bitmap bmp);
206 synchronized int nAllocationCreateFromBitmapBoxed(int dstFmt, boolean genMips, Bitmap bmp) {
207 return rsnAllocationCreateFromBitmapBoxed(mContext, dstFmt, genMips, bmp);
208 }
209 native int rsnAllocationCreateFromAssetStream(int con, int dstFmt, boolean genMips, int assetStream);
210 synchronized int nAllocationCreateFromAssetStream(int dstFmt, boolean genMips, int assetStream) {
211 return rsnAllocationCreateFromAssetStream(mContext, dstFmt, genMips, assetStream);
212 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700213
Jason Sams2e1872f2010-08-17 16:25:41 -0700214 native void rsnAllocationUploadToTexture(int con, int alloc, boolean genMips, int baseMioLevel);
215 synchronized void nAllocationUploadToTexture(int alloc, boolean genMips, int baseMioLevel) {
216 rsnAllocationUploadToTexture(mContext, alloc, genMips, baseMioLevel);
217 }
218 native void rsnAllocationUploadToBufferObject(int con, int alloc);
219 synchronized void nAllocationUploadToBufferObject(int alloc) {
220 rsnAllocationUploadToBufferObject(mContext, alloc);
221 }
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -0700222
Jason Sams2e1872f2010-08-17 16:25:41 -0700223 native void rsnAllocationSubData1D(int con, int id, int off, int count, int[] d, int sizeBytes);
224 synchronized void nAllocationSubData1D(int id, int off, int count, int[] d, int sizeBytes) {
225 rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes);
226 }
227 native void rsnAllocationSubData1D(int con, int id, int off, int count, short[] d, int sizeBytes);
228 synchronized void nAllocationSubData1D(int id, int off, int count, short[] d, int sizeBytes) {
229 rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes);
230 }
231 native void rsnAllocationSubData1D(int con, int id, int off, int count, byte[] d, int sizeBytes);
232 synchronized void nAllocationSubData1D(int id, int off, int count, byte[] d, int sizeBytes) {
233 rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes);
234 }
235 native void rsnAllocationSubData1D(int con, int id, int off, int count, float[] d, int sizeBytes);
236 synchronized void nAllocationSubData1D(int id, int off, int count, float[] d, int sizeBytes) {
237 rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes);
238 }
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700239
Jason Sams2e1872f2010-08-17 16:25:41 -0700240 native void rsnAllocationSubData2D(int con, int id, int xoff, int yoff, int w, int h, int[] d, int sizeBytes);
241 synchronized void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, int[] d, int sizeBytes) {
242 rsnAllocationSubData2D(mContext, id, xoff, yoff, w, h, d, sizeBytes);
243 }
244 native void rsnAllocationSubData2D(int con, int id, int xoff, int yoff, int w, int h, float[] d, int sizeBytes);
245 synchronized void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, float[] d, int sizeBytes) {
246 rsnAllocationSubData2D(mContext, id, xoff, yoff, w, h, d, sizeBytes);
247 }
248 native void rsnAllocationRead(int con, int id, int[] d);
249 synchronized void nAllocationRead(int id, int[] d) {
250 rsnAllocationRead(mContext, id, d);
251 }
252 native void rsnAllocationRead(int con, int id, float[] d);
253 synchronized void nAllocationRead(int id, float[] d) {
254 rsnAllocationRead(mContext, id, d);
255 }
256 native void rsnAllocationSubDataFromObject(int con, int id, Type t, int offset, Object o);
257 synchronized void nAllocationSubDataFromObject(int id, Type t, int offset, Object o) {
258 rsnAllocationSubDataFromObject(mContext, id, t, offset, o);
259 }
260 native void rsnAllocationSubReadFromObject(int con, int id, Type t, int offset, Object o);
261 synchronized void nAllocationSubReadFromObject(int id, Type t, int offset, Object o) {
262 rsnAllocationSubReadFromObject(mContext, id, t, offset, o);
263 }
264 native int rsnAllocationGetType(int con, int id);
265 synchronized int nAllocationGetType(int id) {
266 return rsnAllocationGetType(mContext, id);
267 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700268
Jason Sams2e1872f2010-08-17 16:25:41 -0700269 native int rsnFileA3DCreateFromAssetStream(int con, int assetStream);
270 synchronized int nFileA3DCreateFromAssetStream(int assetStream) {
271 return rsnFileA3DCreateFromAssetStream(mContext, assetStream);
272 }
273 native int rsnFileA3DGetNumIndexEntries(int con, int fileA3D);
274 synchronized int nFileA3DGetNumIndexEntries(int fileA3D) {
275 return rsnFileA3DGetNumIndexEntries(mContext, fileA3D);
276 }
277 native void rsnFileA3DGetIndexEntries(int con, int fileA3D, int numEntries, int[] IDs, String[] names);
278 synchronized void nFileA3DGetIndexEntries(int fileA3D, int numEntries, int[] IDs, String[] names) {
279 rsnFileA3DGetIndexEntries(mContext, fileA3D, numEntries, IDs, names);
280 }
281 native int rsnFileA3DGetEntryByIndex(int con, int fileA3D, int index);
282 synchronized int nFileA3DGetEntryByIndex(int fileA3D, int index) {
283 return rsnFileA3DGetEntryByIndex(mContext, fileA3D, index);
284 }
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700285
Jason Sams2e1872f2010-08-17 16:25:41 -0700286 native int rsnFontCreateFromFile(int con, String fileName, int size, int dpi);
287 synchronized int nFontCreateFromFile(String fileName, int size, int dpi) {
288 return rsnFontCreateFromFile(mContext, fileName, size, dpi);
289 }
Jason Sams22534172009-08-04 16:58:20 -0700290
Jason Sams2e1872f2010-08-17 16:25:41 -0700291 native void rsnAdapter1DBindAllocation(int con, int ad, int alloc);
292 synchronized void nAdapter1DBindAllocation(int ad, int alloc) {
293 rsnAdapter1DBindAllocation(mContext, ad, alloc);
294 }
295 native void rsnAdapter1DSetConstraint(int con, int ad, int dim, int value);
296 synchronized void nAdapter1DSetConstraint(int ad, int dim, int value) {
297 rsnAdapter1DSetConstraint(mContext, ad, dim, value);
298 }
299 native void rsnAdapter1DData(int con, int ad, int[] d);
300 synchronized void nAdapter1DData(int ad, int[] d) {
301 rsnAdapter1DData(mContext, ad, d);
302 }
303 native void rsnAdapter1DData(int con, int ad, float[] d);
304 synchronized void nAdapter1DData(int ad, float[] d) {
305 rsnAdapter1DData(mContext, ad, d);
306 }
307 native void rsnAdapter1DSubData(int con, int ad, int off, int count, int[] d);
308 synchronized void nAdapter1DSubData(int ad, int off, int count, int[] d) {
309 rsnAdapter1DSubData(mContext, ad, off, count, d);
310 }
311 native void rsnAdapter1DSubData(int con, int ad, int off, int count, float[] d);
312 synchronized void nAdapter1DSubData(int ad, int off, int count, float[] d) {
313 rsnAdapter1DSubData(mContext, ad, off, count, d);
314 }
315 native int rsnAdapter1DCreate(int con);
316 synchronized int nAdapter1DCreate() {
317 return rsnAdapter1DCreate(mContext);
318 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700319
Jason Sams2e1872f2010-08-17 16:25:41 -0700320 native void rsnAdapter2DBindAllocation(int con, int ad, int alloc);
321 synchronized void nAdapter2DBindAllocation(int ad, int alloc) {
322 rsnAdapter2DBindAllocation(mContext, ad, alloc);
323 }
324 native void rsnAdapter2DSetConstraint(int con, int ad, int dim, int value);
325 synchronized void nAdapter2DSetConstraint(int ad, int dim, int value) {
326 rsnAdapter2DSetConstraint(mContext, ad, dim, value);
327 }
328 native void rsnAdapter2DData(int con, int ad, int[] d);
329 synchronized void nAdapter2DData(int ad, int[] d) {
330 rsnAdapter2DData(mContext, ad, d);
331 }
332 native void rsnAdapter2DData(int con, int ad, float[] d);
333 synchronized void nAdapter2DData(int ad, float[] d) {
334 rsnAdapter2DData(mContext, ad, d);
335 }
336 native void rsnAdapter2DSubData(int con, int ad, int xoff, int yoff, int w, int h, int[] d);
337 synchronized void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, int[] d) {
338 rsnAdapter2DSubData(mContext, ad, xoff, yoff, w, h, d);
339 }
340 native void rsnAdapter2DSubData(int con, int ad, int xoff, int yoff, int w, int h, float[] d);
341 synchronized void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, float[] d) {
342 rsnAdapter2DSubData(mContext, ad, xoff, yoff, w, h, d);
343 }
344 native int rsnAdapter2DCreate(int con);
345 synchronized int nAdapter2DCreate() {
346 return rsnAdapter2DCreate(mContext);
347 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700348
Jason Sams2e1872f2010-08-17 16:25:41 -0700349 native void rsnScriptBindAllocation(int con, int script, int alloc, int slot);
350 synchronized void nScriptBindAllocation(int script, int alloc, int slot) {
351 rsnScriptBindAllocation(mContext, script, alloc, slot);
352 }
353 native void rsnScriptSetTimeZone(int con, int script, byte[] timeZone);
354 synchronized void nScriptSetTimeZone(int script, byte[] timeZone) {
355 rsnScriptSetTimeZone(mContext, script, timeZone);
356 }
357 native void rsnScriptInvoke(int con, int id, int slot);
358 synchronized void nScriptInvoke(int id, int slot) {
359 rsnScriptInvoke(mContext, id, slot);
360 }
361 native void rsnScriptInvokeV(int con, int id, int slot, byte[] params);
362 synchronized void nScriptInvokeV(int id, int slot, byte[] params) {
363 rsnScriptInvokeV(mContext, id, slot, params);
364 }
365 native void rsnScriptSetVarI(int con, int id, int slot, int val);
366 synchronized void nScriptSetVarI(int id, int slot, int val) {
367 rsnScriptSetVarI(mContext, id, slot, val);
368 }
369 native void rsnScriptSetVarF(int con, int id, int slot, float val);
370 synchronized void nScriptSetVarF(int id, int slot, float val) {
371 rsnScriptSetVarF(mContext, id, slot, val);
372 }
373 native void rsnScriptSetVarV(int con, int id, int slot, byte[] val);
374 synchronized void nScriptSetVarV(int id, int slot, byte[] val) {
375 rsnScriptSetVarV(mContext, id, slot, val);
376 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700377
Jason Sams2e1872f2010-08-17 16:25:41 -0700378 native void rsnScriptCBegin(int con);
379 synchronized void nScriptCBegin() {
380 rsnScriptCBegin(mContext);
381 }
382 native void rsnScriptCSetScript(int con, byte[] script, int offset, int length);
383 synchronized void nScriptCSetScript(byte[] script, int offset, int length) {
384 rsnScriptCSetScript(mContext, script, offset, length);
385 }
386 native int rsnScriptCCreate(int con);
387 synchronized int nScriptCCreate() {
388 return rsnScriptCCreate(mContext);
389 }
Jason Samsebfb4362009-09-23 13:57:02 -0700390
Jason Sams2e1872f2010-08-17 16:25:41 -0700391 native void rsnSamplerBegin(int con);
392 synchronized void nSamplerBegin() {
393 rsnSamplerBegin(mContext);
394 }
395 native void rsnSamplerSet(int con, int param, int value);
396 synchronized void nSamplerSet(int param, int value) {
397 rsnSamplerSet(mContext, param, value);
398 }
399 native int rsnSamplerCreate(int con);
400 synchronized int nSamplerCreate() {
401 return rsnSamplerCreate(mContext);
402 }
Jason Sams0011bcf2009-12-15 12:58:36 -0800403
Jason Sams2e1872f2010-08-17 16:25:41 -0700404 native void rsnProgramStoreBegin(int con, int in, int out);
405 synchronized void nProgramStoreBegin(int in, int out) {
406 rsnProgramStoreBegin(mContext, in, out);
407 }
408 native void rsnProgramStoreDepthFunc(int con, int func);
409 synchronized void nProgramStoreDepthFunc(int func) {
410 rsnProgramStoreDepthFunc(mContext, func);
411 }
412 native void rsnProgramStoreDepthMask(int con, boolean enable);
413 synchronized void nProgramStoreDepthMask(boolean enable) {
414 rsnProgramStoreDepthMask(mContext, enable);
415 }
416 native void rsnProgramStoreColorMask(int con, boolean r, boolean g, boolean b, boolean a);
417 synchronized void nProgramStoreColorMask(boolean r, boolean g, boolean b, boolean a) {
418 rsnProgramStoreColorMask(mContext, r, g, b, a);
419 }
420 native void rsnProgramStoreBlendFunc(int con, int src, int dst);
421 synchronized void nProgramStoreBlendFunc(int src, int dst) {
422 rsnProgramStoreBlendFunc(mContext, src, dst);
423 }
424 native void rsnProgramStoreDither(int con, boolean enable);
425 synchronized void nProgramStoreDither(boolean enable) {
426 rsnProgramStoreDither(mContext, enable);
427 }
428 native int rsnProgramStoreCreate(int con);
429 synchronized int nProgramStoreCreate() {
430 return rsnProgramStoreCreate(mContext);
431 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700432
Jason Sams2e1872f2010-08-17 16:25:41 -0700433 native int rsnProgramRasterCreate(int con, boolean pointSmooth, boolean lineSmooth, boolean pointSprite);
434 synchronized int nProgramRasterCreate(boolean pointSmooth, boolean lineSmooth, boolean pointSprite) {
435 return rsnProgramRasterCreate(mContext, pointSmooth, lineSmooth, pointSprite);
436 }
437 native void rsnProgramRasterSetLineWidth(int con, int pr, float v);
438 synchronized void nProgramRasterSetLineWidth(int pr, float v) {
439 rsnProgramRasterSetLineWidth(mContext, pr, v);
440 }
441 native void rsnProgramRasterSetCullMode(int con, int pr, int mode);
442 synchronized void nProgramRasterSetCullMode(int pr, int mode) {
443 rsnProgramRasterSetCullMode(mContext, pr, mode);
444 }
Jason Sams1fe9b8c2009-06-11 14:46:10 -0700445
Jason Sams2e1872f2010-08-17 16:25:41 -0700446 native void rsnProgramBindConstants(int con, int pv, int slot, int mID);
447 synchronized void nProgramBindConstants(int pv, int slot, int mID) {
448 rsnProgramBindConstants(mContext, pv, slot, mID);
449 }
450 native void rsnProgramBindTexture(int con, int vpf, int slot, int a);
451 synchronized void nProgramBindTexture(int vpf, int slot, int a) {
452 rsnProgramBindTexture(mContext, vpf, slot, a);
453 }
454 native void rsnProgramBindSampler(int con, int vpf, int slot, int s);
455 synchronized void nProgramBindSampler(int vpf, int slot, int s) {
456 rsnProgramBindSampler(mContext, vpf, slot, s);
457 }
Jason Samsbba134c2009-06-22 15:49:21 -0700458
Jason Sams2e1872f2010-08-17 16:25:41 -0700459 native int rsnProgramFragmentCreate(int con, int[] params);
460 synchronized int nProgramFragmentCreate(int[] params) {
461 return rsnProgramFragmentCreate(mContext, params);
462 }
463 native int rsnProgramFragmentCreate2(int con, String shader, int[] params);
464 synchronized int nProgramFragmentCreate2(String shader, int[] params) {
465 return rsnProgramFragmentCreate2(mContext, shader, params);
466 }
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700467
Jason Sams2e1872f2010-08-17 16:25:41 -0700468 native int rsnProgramVertexCreate(int con, boolean texMat);
469 synchronized int nProgramVertexCreate(boolean texMat) {
470 return rsnProgramVertexCreate(mContext, texMat);
471 }
472 native int rsnProgramVertexCreate2(int con, String shader, int[] params);
473 synchronized int nProgramVertexCreate2(String shader, int[] params) {
474 return rsnProgramVertexCreate2(mContext, shader, params);
475 }
476
477
478 native int rsnMeshCreate(int con, int vtxCount, int indexCount);
479 synchronized int nMeshCreate(int vtxCount, int indexCount) {
480 return rsnMeshCreate(mContext, vtxCount, indexCount);
481 }
482 native void rsnMeshBindVertex(int con, int id, int alloc, int slot);
483 synchronized void nMeshBindVertex(int id, int alloc, int slot) {
484 rsnMeshBindVertex(mContext, id, alloc, slot);
485 }
486 native void rsnMeshBindIndex(int con, int id, int alloc, int prim, int slot);
487 synchronized void nMeshBindIndex(int id, int alloc, int prim, int slot) {
488 rsnMeshBindIndex(mContext, id, alloc, prim, slot);
489 }
490 native int rsnMeshGetVertexBufferCount(int con, int id);
491 synchronized int nMeshGetVertexBufferCount(int id) {
492 return rsnMeshGetVertexBufferCount(mContext, id);
493 }
494 native int rsnMeshGetIndexCount(int con, int id);
495 synchronized int nMeshGetIndexCount(int id) {
496 return rsnMeshGetIndexCount(mContext, id);
497 }
498 native void rsnMeshGetVertices(int con, int id, int[] vtxIds, int vtxIdCount);
499 synchronized void nMeshGetVertices(int id, int[] vtxIds, int vtxIdCount) {
500 rsnMeshGetVertices(mContext, id, vtxIds, vtxIdCount);
501 }
502 native void rsnMeshGetIndices(int con, int id, int[] idxIds, int[] primitives, int vtxIdCount);
503 synchronized void nMeshGetIndices(int id, int[] idxIds, int[] primitives, int vtxIdCount) {
504 rsnMeshGetIndices(mContext, id, idxIds, primitives, vtxIdCount);
505 }
506
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700507
Jason Sams704ff642010-02-09 16:05:07 -0800508 protected int mDev;
509 protected int mContext;
Romain Guy650a3eb2009-08-31 14:06:43 -0700510 @SuppressWarnings({"FieldCanBeLocal"})
Jason Sams704ff642010-02-09 16:05:07 -0800511 protected MessageThread mMessageThread;
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700512
Jason Sams8cb39de2010-06-01 15:47:01 -0700513 Element mElement_U8;
514 Element mElement_I8;
515 Element mElement_U16;
516 Element mElement_I16;
517 Element mElement_U32;
518 Element mElement_I32;
519 Element mElement_F32;
Jason Samsf110d4b2010-06-21 17:42:41 -0700520 Element mElement_BOOLEAN;
Jason Sams3c0dfba2009-09-27 17:50:38 -0700521
Jason Sams8cb39de2010-06-01 15:47:01 -0700522 Element mElement_ELEMENT;
523 Element mElement_TYPE;
524 Element mElement_ALLOCATION;
525 Element mElement_SAMPLER;
526 Element mElement_SCRIPT;
527 Element mElement_MESH;
528 Element mElement_PROGRAM_FRAGMENT;
529 Element mElement_PROGRAM_VERTEX;
530 Element mElement_PROGRAM_RASTER;
531 Element mElement_PROGRAM_STORE;
Jason Samsa70f4162010-03-26 15:33:42 -0700532
Jason Sams3c0dfba2009-09-27 17:50:38 -0700533 Element mElement_A_8;
534 Element mElement_RGB_565;
535 Element mElement_RGB_888;
536 Element mElement_RGBA_5551;
537 Element mElement_RGBA_4444;
538 Element mElement_RGBA_8888;
539
Jason Sams8cb39de2010-06-01 15:47:01 -0700540 Element mElement_FLOAT_2;
541 Element mElement_FLOAT_3;
542 Element mElement_FLOAT_4;
543 Element mElement_UCHAR_4;
Jason Sams7d787b42009-11-15 12:14:26 -0800544
Jason Sams1d45c472010-08-25 14:31:48 -0700545 Element mElement_MATRIX_4X4;
546 Element mElement_MATRIX_3X3;
547 Element mElement_MATRIX_2X2;
548
Jason Sams4d339932010-05-11 14:03:58 -0700549 Sampler mSampler_CLAMP_NEAREST;
550 Sampler mSampler_CLAMP_LINEAR;
551 Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
552 Sampler mSampler_WRAP_NEAREST;
553 Sampler mSampler_WRAP_LINEAR;
554 Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
555
Alex Sakhartchoukd36f2482010-08-24 11:37:33 -0700556 ProgramStore mProgramStore_BLEND_NONE_DEPTH_TEST;
557 ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
558 ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_TEST;
559 ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_WRITE;
560 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_TEST;
561 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
562 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_TEST;
563 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_WRITE;
564 ProgramStore mProgramStore_BLEND_ADD_DEPTH_TEST;
565 ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_DEPTH;
566 ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_TEST;
567 ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_WRITE;
Alex Sakhartchouk32e09b52010-08-23 10:24:10 -0700568
Alex Sakhartchoukd36f2482010-08-24 11:37:33 -0700569 ProgramRaster mProgramRaster_CULL_BACK;
570 ProgramRaster mProgramRaster_CULL_FRONT;
571 ProgramRaster mProgramRaster_CULL_NONE;
Alex Sakhartchouk32e09b52010-08-23 10:24:10 -0700572
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700573 ///////////////////////////////////////////////////////////////////////////////////
Jack Palevich43702d82009-05-28 13:38:16 -0700574 //
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700575
Jason Sams516c3192009-10-06 13:58:47 -0700576 public static class RSMessage implements Runnable {
577 protected int[] mData;
578 protected int mID;
579 public void run() {
580 }
581 }
582 public RSMessage mMessageCallback = null;
583
Jason Sams7d787b42009-11-15 12:14:26 -0800584 public enum Priority {
585 LOW (5), //ANDROID_PRIORITY_BACKGROUND + 5
586 NORMAL (-4); //ANDROID_PRIORITY_DISPLAY
587
588 int mID;
589 Priority(int id) {
590 mID = id;
591 }
592 }
593
Jason Sams771bebb2009-12-07 12:40:12 -0800594 void validate() {
595 if (mContext == 0) {
596 throw new IllegalStateException("Calling RS with no Context active.");
597 }
598 }
599
Jason Sams7d787b42009-11-15 12:14:26 -0800600 public void contextSetPriority(Priority p) {
Jason Sams5dbfe932010-01-27 14:41:43 -0800601 validate();
Jason Sams7d787b42009-11-15 12:14:26 -0800602 nContextSetPriority(p.mID);
603 }
604
Jason Sams704ff642010-02-09 16:05:07 -0800605 protected static class MessageThread extends Thread {
Jason Sams516c3192009-10-06 13:58:47 -0700606 RenderScript mRS;
607 boolean mRun = true;
608
609 MessageThread(RenderScript rs) {
610 super("RSMessageThread");
611 mRS = rs;
612
613 }
614
615 public void run() {
616 // This function is a temporary solution. The final solution will
617 // used typed allocations where the message id is the type indicator.
618 int[] rbuf = new int[16];
Jason Sams2e1872f2010-08-17 16:25:41 -0700619 mRS.nContextInitToClient(mRS.mContext);
Jason Sams516c3192009-10-06 13:58:47 -0700620 while(mRun) {
Jason Sams1d45c472010-08-25 14:31:48 -0700621 rbuf[0] = 0;
Jason Sams2e1872f2010-08-17 16:25:41 -0700622 int msg = mRS.nContextGetMessage(mRS.mContext, rbuf, true);
Jason Sams516c3192009-10-06 13:58:47 -0700623 if (msg == 0) {
Jason Sams1d45c472010-08-25 14:31:48 -0700624 // Can happen for two reasons
625 if (rbuf[0] > 0) {
626 // 1: Buffer needs to be enlarged.
627 rbuf = new int[rbuf[0] + 2];
628 } else {
629 // 2: teardown.
630 // But we want to avoid starving other threads during
631 // teardown by yielding until the next line in the destructor
632 // can execute to set mRun = false
633 try {
634 sleep(1, 0);
635 } catch(InterruptedException e) {
636 }
Jason Sams516c3192009-10-06 13:58:47 -0700637 }
638 }
639 if(mRS.mMessageCallback != null) {
640 mRS.mMessageCallback.mData = rbuf;
641 mRS.mMessageCallback.mID = msg;
642 mRS.mMessageCallback.run();
643 }
Jason Sams516c3192009-10-06 13:58:47 -0700644 }
Jason Sams3bc47d42009-11-12 15:10:25 -0800645 Log.d(LOG_TAG, "MessageThread exiting.");
Jason Sams516c3192009-10-06 13:58:47 -0700646 }
647 }
648
Jason Sams704ff642010-02-09 16:05:07 -0800649 protected RenderScript() {
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700650 }
651
Jason Sams704ff642010-02-09 16:05:07 -0800652 public static RenderScript create() {
653 RenderScript rs = new RenderScript();
654
655 rs.mDev = rs.nDeviceCreate();
656 rs.mContext = rs.nContextCreate(rs.mDev, 0);
657 rs.mMessageThread = new MessageThread(rs);
658 rs.mMessageThread.start();
659 Element.initPredefined(rs);
660 return rs;
Jason Samsefd9b6fb2009-11-03 13:58:36 -0800661 }
662
Jason Sams715333b2009-11-17 17:26:46 -0800663 public void contextDump(int bits) {
Jason Sams5dbfe932010-01-27 14:41:43 -0800664 validate();
Jason Sams715333b2009-11-17 17:26:46 -0800665 nContextDump(bits);
666 }
667
Jason Sams96ed4cf2010-06-15 12:15:57 -0700668 public void finish() {
669 nContextFinish();
670 }
671
Jason Samsf5b45962009-08-25 14:49:07 -0700672 public void destroy() {
Jason Sams5dbfe932010-01-27 14:41:43 -0800673 validate();
Jason Sams2e1872f2010-08-17 16:25:41 -0700674 nContextDeinitToClient(mContext);
Jason Sams516c3192009-10-06 13:58:47 -0700675 mMessageThread.mRun = false;
676
Jason Sams2e1872f2010-08-17 16:25:41 -0700677 nContextDestroy();
Jason Samsf5b45962009-08-25 14:49:07 -0700678 mContext = 0;
679
680 nDeviceDestroy(mDev);
681 mDev = 0;
682 }
Jason Sams02fb2cb2009-05-28 15:37:57 -0700683
Jason Samsa9e7a052009-09-25 14:51:22 -0700684 boolean isAlive() {
685 return mContext != 0;
686 }
687
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700688 ///////////////////////////////////////////////////////////////////////////////////
689 // Root state
690
Jason Sams704ff642010-02-09 16:05:07 -0800691 protected int safeID(BaseObj o) {
Jason Sams6b9dec02009-09-23 16:38:37 -0700692 if(o != null) {
693 return o.mID;
Jason Samsd8e41612009-08-20 17:22:40 -0700694 }
Jason Sams6b9dec02009-09-23 16:38:37 -0700695 return 0;
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700696 }
Jack Palevich60aa3ea2009-05-26 13:45:08 -0700697}
698
Jason Sams36e612a2009-07-31 16:26:13 -0700699
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -0700700