blob: 0026e0edbfba1df624c99c9aa68273d0afded291 [file] [log] [blame]
Jason Sams69f0d312009-08-03 18:11:17 -07001/*
Stephen Hinesadeb8092012-04-20 14:26:06 -07002 * Copyright (C) 2008-2012 The Android Open Source Project
Jason Sams69f0d312009-08-03 18:11:17 -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
17package android.renderscript;
18
Jason Sams08a81582012-09-18 12:32:10 -070019import android.util.SparseArray;
20
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070021/**
Tim Murrayc11e25c2013-04-09 11:01:01 -070022 * The parent class for all executable scripts. This should not be used by
23 * applications.
Jason Sams69f0d312009-08-03 18:11:17 -070024 **/
25public class Script extends BaseObj {
Jason Sams08a81582012-09-18 12:32:10 -070026
27 /**
28 * KernelID is an identifier for a Script + root function pair. It is used
29 * as an identifier for ScriptGroup creation.
30 *
31 * This class should not be directly created. Instead use the method in the
32 * reflected or intrinsic code "getKernelID_funcname()".
33 *
34 */
35 public static final class KernelID extends BaseObj {
36 Script mScript;
37 int mSlot;
38 int mSig;
39 KernelID(int id, RenderScript rs, Script s, int slot, int sig) {
40 super(id, rs);
41 mScript = s;
42 mSlot = slot;
43 mSig = sig;
44 }
45 }
46
47 private final SparseArray<KernelID> mKIDs = new SparseArray<KernelID>();
48 /**
49 * Only to be used by generated reflected classes.
Jason Sams08a81582012-09-18 12:32:10 -070050 */
51 protected KernelID createKernelID(int slot, int sig, Element ein, Element eout) {
52 KernelID k = mKIDs.get(slot);
53 if (k != null) {
54 return k;
55 }
56
57 int id = mRS.nScriptKernelIDCreate(getID(mRS), slot, sig);
58 if (id == 0) {
59 throw new RSDriverException("Failed to create KernelID");
60 }
61
62 k = new KernelID(id, mRS, this, slot, sig);
63 mKIDs.put(slot, k);
64 return k;
65 }
66
67 /**
68 * FieldID is an identifier for a Script + exported field pair. It is used
69 * as an identifier for ScriptGroup creation.
70 *
71 * This class should not be directly created. Instead use the method in the
72 * reflected or intrinsic code "getFieldID_funcname()".
73 *
74 */
75 public static final class FieldID extends BaseObj {
76 Script mScript;
77 int mSlot;
78 FieldID(int id, RenderScript rs, Script s, int slot) {
79 super(id, rs);
80 mScript = s;
81 mSlot = slot;
82 }
83 }
84
85 private final SparseArray<FieldID> mFIDs = new SparseArray();
86 /**
87 * Only to be used by generated reflected classes.
Jason Sams08a81582012-09-18 12:32:10 -070088 */
89 protected FieldID createFieldID(int slot, Element e) {
90 FieldID f = mFIDs.get(slot);
91 if (f != null) {
92 return f;
93 }
94
95 int id = mRS.nScriptFieldIDCreate(getID(mRS), slot);
96 if (id == 0) {
97 throw new RSDriverException("Failed to create FieldID");
98 }
99
100 f = new FieldID(id, mRS, this, slot);
101 mFIDs.put(slot, f);
102 return f;
103 }
104
105
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700106 /**
Jason Sams67e3d202011-01-09 13:49:01 -0800107 * Only intended for use by generated reflected code.
108 *
Jason Sams67e3d202011-01-09 13:49:01 -0800109 */
Jason Sams2d71bc72010-03-26 16:06:43 -0700110 protected void invoke(int slot) {
Jason Samse07694b2012-04-03 15:36:36 -0700111 mRS.nScriptInvoke(getID(mRS), slot);
Jason Sams2d71bc72010-03-26 16:06:43 -0700112 }
113
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700114 /**
Jason Sams67e3d202011-01-09 13:49:01 -0800115 * Only intended for use by generated reflected code.
116 *
Jason Sams67e3d202011-01-09 13:49:01 -0800117 */
Jason Sams96ed4cf2010-06-15 12:15:57 -0700118 protected void invoke(int slot, FieldPacker v) {
119 if (v != null) {
Jason Samse07694b2012-04-03 15:36:36 -0700120 mRS.nScriptInvokeV(getID(mRS), slot, v.getData());
Jason Sams96ed4cf2010-06-15 12:15:57 -0700121 } else {
Jason Samse07694b2012-04-03 15:36:36 -0700122 mRS.nScriptInvoke(getID(mRS), slot);
Jason Sams96ed4cf2010-06-15 12:15:57 -0700123 }
Jason Sams4d339932010-05-11 14:03:58 -0700124 }
125
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700126 /**
Jason Sams6e494d32011-04-27 16:33:11 -0700127 * Only intended for use by generated reflected code.
128 *
Jason Sams6e494d32011-04-27 16:33:11 -0700129 */
130 protected void forEach(int slot, Allocation ain, Allocation aout, FieldPacker v) {
131 if (ain == null && aout == null) {
132 throw new RSIllegalArgumentException(
133 "At least one of ain or aout is required to be non-null.");
134 }
135 int in_id = 0;
136 if (ain != null) {
Jason Samse07694b2012-04-03 15:36:36 -0700137 in_id = ain.getID(mRS);
Jason Sams6e494d32011-04-27 16:33:11 -0700138 }
139 int out_id = 0;
140 if (aout != null) {
Jason Samse07694b2012-04-03 15:36:36 -0700141 out_id = aout.getID(mRS);
Jason Sams6e494d32011-04-27 16:33:11 -0700142 }
143 byte[] params = null;
144 if (v != null) {
145 params = v.getData();
146 }
Jason Samse07694b2012-04-03 15:36:36 -0700147 mRS.nScriptForEach(getID(mRS), slot, in_id, out_id, params);
Jason Sams6e494d32011-04-27 16:33:11 -0700148 }
149
Jason Samsf64cca92013-04-19 12:56:37 -0700150 /**
151 * Only intended for use by generated reflected code.
152 *
Jason Samsf64cca92013-04-19 12:56:37 -0700153 */
Tim Murrayeb8c29c2013-02-07 12:16:41 -0800154 protected void forEach(int slot, Allocation ain, Allocation aout, FieldPacker v, LaunchOptions sc) {
155 if (ain == null && aout == null) {
156 throw new RSIllegalArgumentException(
157 "At least one of ain or aout is required to be non-null.");
158 }
Tim Murrayba9dd062013-02-12 16:22:34 -0800159
160 if (sc == null) {
161 forEach(slot, ain, aout, v);
162 return;
163 }
Tim Murrayeb8c29c2013-02-07 12:16:41 -0800164 int in_id = 0;
165 if (ain != null) {
166 in_id = ain.getID(mRS);
167 }
168 int out_id = 0;
169 if (aout != null) {
170 out_id = aout.getID(mRS);
171 }
172 byte[] params = null;
173 if (v != null) {
174 params = v.getData();
175 }
176 mRS.nScriptForEachClipped(getID(mRS), slot, in_id, out_id, params, sc.xstart, sc.xend, sc.ystart, sc.yend, sc.zstart, sc.zend);
177 }
Jason Sams4d339932010-05-11 14:03:58 -0700178
Jason Sams69f0d312009-08-03 18:11:17 -0700179 Script(int id, RenderScript rs) {
Alex Sakhartchouk0de94442010-08-11 14:41:28 -0700180 super(id, rs);
Jason Sams69f0d312009-08-03 18:11:17 -0700181 }
182
Jason Sams67e3d202011-01-09 13:49:01 -0800183
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700184 /**
Jason Sams67e3d202011-01-09 13:49:01 -0800185 * Only intended for use by generated reflected code.
186 *
Jason Sams67e3d202011-01-09 13:49:01 -0800187 */
Jason Sams69f0d312009-08-03 18:11:17 -0700188 public void bindAllocation(Allocation va, int slot) {
Jason Sams771bebb2009-12-07 12:40:12 -0800189 mRS.validate();
Jason Sams4d339932010-05-11 14:03:58 -0700190 if (va != null) {
Jason Samse07694b2012-04-03 15:36:36 -0700191 mRS.nScriptBindAllocation(getID(mRS), va.getID(mRS), slot);
Jason Sams4d339932010-05-11 14:03:58 -0700192 } else {
Jason Samse07694b2012-04-03 15:36:36 -0700193 mRS.nScriptBindAllocation(getID(mRS), 0, slot);
Jason Sams4d339932010-05-11 14:03:58 -0700194 }
195 }
196
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700197 /**
Jason Sams67e3d202011-01-09 13:49:01 -0800198 * Only intended for use by generated reflected code.
199 *
Jason Sams67e3d202011-01-09 13:49:01 -0800200 */
Jason Sams4d339932010-05-11 14:03:58 -0700201 public void setVar(int index, float v) {
Jason Samse07694b2012-04-03 15:36:36 -0700202 mRS.nScriptSetVarF(getID(mRS), index, v);
Jason Sams4d339932010-05-11 14:03:58 -0700203 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700204 public float getVarF(int index) {
205 return mRS.nScriptGetVarF(getID(mRS), index);
206 }
Jason Sams4d339932010-05-11 14:03:58 -0700207
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700208 /**
Jason Sams67e3d202011-01-09 13:49:01 -0800209 * Only intended for use by generated reflected code.
210 *
Jason Sams67e3d202011-01-09 13:49:01 -0800211 */
Stephen Hinesca54ec32010-09-20 17:20:30 -0700212 public void setVar(int index, double v) {
Jason Samse07694b2012-04-03 15:36:36 -0700213 mRS.nScriptSetVarD(getID(mRS), index, v);
Stephen Hinesca54ec32010-09-20 17:20:30 -0700214 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700215 public double getVarD(int index) {
216 return mRS.nScriptGetVarD(getID(mRS), index);
217 }
Stephen Hinesca54ec32010-09-20 17:20:30 -0700218
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700219 /**
Jason Sams67e3d202011-01-09 13:49:01 -0800220 * Only intended for use by generated reflected code.
221 *
Jason Sams67e3d202011-01-09 13:49:01 -0800222 */
Jason Sams4d339932010-05-11 14:03:58 -0700223 public void setVar(int index, int v) {
Jason Samse07694b2012-04-03 15:36:36 -0700224 mRS.nScriptSetVarI(getID(mRS), index, v);
Jason Sams4d339932010-05-11 14:03:58 -0700225 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700226 public int getVarI(int index) {
227 return mRS.nScriptGetVarI(getID(mRS), index);
228 }
229
Jason Sams4d339932010-05-11 14:03:58 -0700230
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700231 /**
Jason Sams67e3d202011-01-09 13:49:01 -0800232 * Only intended for use by generated reflected code.
233 *
Jason Sams67e3d202011-01-09 13:49:01 -0800234 */
Stephen Hines031ec58c2010-10-11 10:54:21 -0700235 public void setVar(int index, long v) {
Jason Samse07694b2012-04-03 15:36:36 -0700236 mRS.nScriptSetVarJ(getID(mRS), index, v);
Stephen Hines031ec58c2010-10-11 10:54:21 -0700237 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700238 public long getVarJ(int index) {
239 return mRS.nScriptGetVarJ(getID(mRS), index);
240 }
241
Stephen Hines031ec58c2010-10-11 10:54:21 -0700242
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700243 /**
Jason Sams67e3d202011-01-09 13:49:01 -0800244 * Only intended for use by generated reflected code.
245 *
Jason Sams67e3d202011-01-09 13:49:01 -0800246 */
Jason Sams0b9a22c2010-07-02 15:35:19 -0700247 public void setVar(int index, boolean v) {
Jason Samse07694b2012-04-03 15:36:36 -0700248 mRS.nScriptSetVarI(getID(mRS), index, v ? 1 : 0);
Jason Sams0b9a22c2010-07-02 15:35:19 -0700249 }
Tim Murray7c4caad2013-04-10 16:21:40 -0700250 public boolean getVarB(int index) {
251 return mRS.nScriptGetVarI(getID(mRS), index) > 0 ? true : false;
252 }
Jason Sams0b9a22c2010-07-02 15:35:19 -0700253
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700254 /**
Jason Sams67e3d202011-01-09 13:49:01 -0800255 * Only intended for use by generated reflected code.
256 *
Jason Sams67e3d202011-01-09 13:49:01 -0800257 */
Jason Sams6f4cf0b2010-11-16 17:37:02 -0800258 public void setVar(int index, BaseObj o) {
Jason Samse07694b2012-04-03 15:36:36 -0700259 mRS.nScriptSetVarObj(getID(mRS), index, (o == null) ? 0 : o.getID(mRS));
Jason Sams6f4cf0b2010-11-16 17:37:02 -0800260 }
261
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700262 /**
Jason Sams67e3d202011-01-09 13:49:01 -0800263 * Only intended for use by generated reflected code.
264 *
Jason Sams67e3d202011-01-09 13:49:01 -0800265 */
Jason Sams4d339932010-05-11 14:03:58 -0700266 public void setVar(int index, FieldPacker v) {
Jason Samse07694b2012-04-03 15:36:36 -0700267 mRS.nScriptSetVarV(getID(mRS), index, v.getData());
Jason Sams69f0d312009-08-03 18:11:17 -0700268 }
269
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700270 /**
Stephen Hinesadeb8092012-04-20 14:26:06 -0700271 * Only intended for use by generated reflected code.
272 *
Stephen Hinesadeb8092012-04-20 14:26:06 -0700273 */
274 public void setVar(int index, FieldPacker v, Element e, int[] dims) {
275 mRS.nScriptSetVarVE(getID(mRS), index, v.getData(), e.getID(mRS), dims);
276 }
277
Jason Samsf64cca92013-04-19 12:56:37 -0700278 /**
279 * Only intended for use by generated reflected code.
280 *
Jason Samsf64cca92013-04-19 12:56:37 -0700281 */
Tim Murray7c4caad2013-04-10 16:21:40 -0700282 public void getVarV(int index, FieldPacker v) {
283 mRS.nScriptGetVarV(getID(mRS), index, v.getData());
284 }
285
Jason Sams22534172009-08-04 16:58:20 -0700286 public void setTimeZone(String timeZone) {
Jason Sams771bebb2009-12-07 12:40:12 -0800287 mRS.validate();
Jason Sams22534172009-08-04 16:58:20 -0700288 try {
Jason Samse07694b2012-04-03 15:36:36 -0700289 mRS.nScriptSetTimeZone(getID(mRS), timeZone.getBytes("UTF-8"));
Jason Sams22534172009-08-04 16:58:20 -0700290 } catch (java.io.UnsupportedEncodingException e) {
291 throw new RuntimeException(e);
292 }
293 }
Jason Sams69f0d312009-08-03 18:11:17 -0700294
Tim Murrayc11e25c2013-04-09 11:01:01 -0700295 /**
296 * Only intended for use by generated reflected code.
297 *
298 */
Jason Sams69f0d312009-08-03 18:11:17 -0700299 public static class Builder {
300 RenderScript mRS;
Jason Sams69f0d312009-08-03 18:11:17 -0700301
302 Builder(RenderScript rs) {
303 mRS = rs;
304 }
Jason Sams69f0d312009-08-03 18:11:17 -0700305 }
306
Jason Sams2d71bc72010-03-26 16:06:43 -0700307
Jason Samsf64cca92013-04-19 12:56:37 -0700308 /**
309 * Only intended for use by generated reflected code.
310 *
311 */
Jason Sams2d71bc72010-03-26 16:06:43 -0700312 public static class FieldBase {
313 protected Element mElement;
Jason Sams2d71bc72010-03-26 16:06:43 -0700314 protected Allocation mAllocation;
315
316 protected void init(RenderScript rs, int dimx) {
Jason Sams5476b452010-12-08 16:14:36 -0800317 mAllocation = Allocation.createSized(rs, mElement, dimx, Allocation.USAGE_SCRIPT);
318 }
319
320 protected void init(RenderScript rs, int dimx, int usages) {
321 mAllocation = Allocation.createSized(rs, mElement, dimx, Allocation.USAGE_SCRIPT | usages);
Jason Sams2d71bc72010-03-26 16:06:43 -0700322 }
323
324 protected FieldBase() {
325 }
326
327 public Element getElement() {
328 return mElement;
329 }
330
331 public Type getType() {
Jason Sams31a7e422010-10-26 13:09:17 -0700332 return mAllocation.getType();
Jason Sams2d71bc72010-03-26 16:06:43 -0700333 }
334
335 public Allocation getAllocation() {
336 return mAllocation;
337 }
338
339 //@Override
340 public void updateAllocation() {
341 }
Jason Sams2d71bc72010-03-26 16:06:43 -0700342 }
Tim Murrayfbfaa852012-12-14 16:01:58 -0800343
Jason Samsf64cca92013-04-19 12:56:37 -0700344
345 /**
346 * Class used to specify clipping for a kernel launch.
347 *
348 */
Tim Murrayfbfaa852012-12-14 16:01:58 -0800349 public static final class LaunchOptions {
Jason Samsf64cca92013-04-19 12:56:37 -0700350 private int xstart = 0;
351 private int ystart = 0;
352 private int xend = 0;
353 private int yend = 0;
354 private int zstart = 0;
355 private int zend = 0;
356 private int strategy;
Tim Murrayfbfaa852012-12-14 16:01:58 -0800357
Jason Samsf64cca92013-04-19 12:56:37 -0700358 /**
359 * Set the X range. If the end value is set to 0 the X dimension is not
360 * clipped.
361 *
362 * @param xstartArg Must be >= 0
363 * @param xendArg Must be >= xstartArg
364 *
365 * @return LaunchOptions
366 */
Tim Murrayeb8c29c2013-02-07 12:16:41 -0800367 public LaunchOptions setX(int xstartArg, int xendArg) {
Tim Murrayfbfaa852012-12-14 16:01:58 -0800368 if (xstartArg < 0 || xendArg <= xstartArg) {
369 throw new RSIllegalArgumentException("Invalid dimensions");
370 }
371 xstart = xstartArg;
372 xend = xendArg;
Tim Murrayeb8c29c2013-02-07 12:16:41 -0800373 return this;
Tim Murrayfbfaa852012-12-14 16:01:58 -0800374 }
375
Jason Samsf64cca92013-04-19 12:56:37 -0700376 /**
377 * Set the Y range. If the end value is set to 0 the Y dimension is not
378 * clipped.
379 *
380 * @param ystartArg Must be >= 0
381 * @param yendArg Must be >= ystartArg
382 *
383 * @return LaunchOptions
384 */
Tim Murrayeb8c29c2013-02-07 12:16:41 -0800385 public LaunchOptions setY(int ystartArg, int yendArg) {
Tim Murrayfbfaa852012-12-14 16:01:58 -0800386 if (ystartArg < 0 || yendArg <= ystartArg) {
387 throw new RSIllegalArgumentException("Invalid dimensions");
388 }
389 ystart = ystartArg;
390 yend = yendArg;
Tim Murrayeb8c29c2013-02-07 12:16:41 -0800391 return this;
Tim Murrayfbfaa852012-12-14 16:01:58 -0800392 }
393
Jason Samsf64cca92013-04-19 12:56:37 -0700394 /**
395 * Set the Z range. If the end value is set to 0 the Z dimension is not
396 * clipped.
397 *
398 * @param zstartArg Must be >= 0
399 * @param zendArg Must be >= zstartArg
400 *
401 * @return LaunchOptions
402 */
Tim Murrayeb8c29c2013-02-07 12:16:41 -0800403 public LaunchOptions setZ(int zstartArg, int zendArg) {
404 if (zstartArg < 0 || zendArg <= zstartArg) {
405 throw new RSIllegalArgumentException("Invalid dimensions");
406 }
407 zstart = zstartArg;
408 zend = zendArg;
409 return this;
410 }
411
412
Jason Samsf64cca92013-04-19 12:56:37 -0700413 /**
414 * Returns the current X start
415 *
416 * @return int current value
417 */
Tim Murrayfbfaa852012-12-14 16:01:58 -0800418 public int getXStart() {
419 return xstart;
420 }
Jason Samsf64cca92013-04-19 12:56:37 -0700421 /**
422 * Returns the current X end
423 *
424 * @return int current value
425 */
Tim Murrayfbfaa852012-12-14 16:01:58 -0800426 public int getXEnd() {
427 return xend;
428 }
Jason Samsf64cca92013-04-19 12:56:37 -0700429 /**
430 * Returns the current Y start
431 *
432 * @return int current value
433 */
Tim Murrayfbfaa852012-12-14 16:01:58 -0800434 public int getYStart() {
435 return ystart;
436 }
Jason Samsf64cca92013-04-19 12:56:37 -0700437 /**
438 * Returns the current Y end
439 *
440 * @return int current value
441 */
Tim Murrayfbfaa852012-12-14 16:01:58 -0800442 public int getYEnd() {
443 return yend;
444 }
Jason Samsf64cca92013-04-19 12:56:37 -0700445 /**
446 * Returns the current Z start
447 *
448 * @return int current value
449 */
Tim Murrayeb8c29c2013-02-07 12:16:41 -0800450 public int getZStart() {
451 return zstart;
452 }
Jason Samsf64cca92013-04-19 12:56:37 -0700453 /**
454 * Returns the current Z end
455 *
456 * @return int current value
457 */
Tim Murrayeb8c29c2013-02-07 12:16:41 -0800458 public int getZEnd() {
459 return zend;
460 }
Tim Murrayfbfaa852012-12-14 16:01:58 -0800461
462 }
Jason Sams69f0d312009-08-03 18:11:17 -0700463}
464