summaryrefslogtreecommitdiffstats
path: root/rs/java/android/renderscript/Script.java
diff options
context:
space:
mode:
Diffstat (limited to 'rs/java/android/renderscript/Script.java')
-rw-r--r--rs/java/android/renderscript/Script.java471
1 files changed, 471 insertions, 0 deletions
diff --git a/rs/java/android/renderscript/Script.java b/rs/java/android/renderscript/Script.java
new file mode 100644
index 0000000..a1f2287
--- /dev/null
+++ b/rs/java/android/renderscript/Script.java
@@ -0,0 +1,471 @@
+/*
+ * Copyright (C) 2008-2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.renderscript;
+
+import android.util.SparseArray;
+
+/**
+ * The parent class for all executable scripts. This should not be used by
+ * applications.
+ **/
+public class Script extends BaseObj {
+
+ /**
+ * KernelID is an identifier for a Script + root function pair. It is used
+ * as an identifier for ScriptGroup creation.
+ *
+ * This class should not be directly created. Instead use the method in the
+ * reflected or intrinsic code "getKernelID_funcname()".
+ *
+ */
+ public static final class KernelID extends BaseObj {
+ Script mScript;
+ int mSlot;
+ int mSig;
+ KernelID(long id, RenderScript rs, Script s, int slot, int sig) {
+ super(id, rs);
+ mScript = s;
+ mSlot = slot;
+ mSig = sig;
+ }
+ }
+
+ private final SparseArray<KernelID> mKIDs = new SparseArray<KernelID>();
+ /**
+ * Only to be used by generated reflected classes.
+ */
+ protected KernelID createKernelID(int slot, int sig, Element ein, Element eout) {
+ KernelID k = mKIDs.get(slot);
+ if (k != null) {
+ return k;
+ }
+
+ long id = mRS.nScriptKernelIDCreate(getID(mRS), slot, sig);
+ if (id == 0) {
+ throw new RSDriverException("Failed to create KernelID");
+ }
+
+ k = new KernelID(id, mRS, this, slot, sig);
+ mKIDs.put(slot, k);
+ return k;
+ }
+
+ /**
+ * FieldID is an identifier for a Script + exported field pair. It is used
+ * as an identifier for ScriptGroup creation.
+ *
+ * This class should not be directly created. Instead use the method in the
+ * reflected or intrinsic code "getFieldID_funcname()".
+ *
+ */
+ public static final class FieldID extends BaseObj {
+ Script mScript;
+ int mSlot;
+ FieldID(long id, RenderScript rs, Script s, int slot) {
+ super(id, rs);
+ mScript = s;
+ mSlot = slot;
+ }
+ }
+
+ private final SparseArray<FieldID> mFIDs = new SparseArray();
+ /**
+ * Only to be used by generated reflected classes.
+ */
+ protected FieldID createFieldID(int slot, Element e) {
+ FieldID f = mFIDs.get(slot);
+ if (f != null) {
+ return f;
+ }
+
+ long id = mRS.nScriptFieldIDCreate(getID(mRS), slot);
+ if (id == 0) {
+ throw new RSDriverException("Failed to create FieldID");
+ }
+
+ f = new FieldID(id, mRS, this, slot);
+ mFIDs.put(slot, f);
+ return f;
+ }
+
+
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ */
+ protected void invoke(int slot) {
+ mRS.nScriptInvoke(getID(mRS), slot);
+ }
+
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ */
+ protected void invoke(int slot, FieldPacker v) {
+ if (v != null) {
+ mRS.nScriptInvokeV(getID(mRS), slot, v.getData());
+ } else {
+ mRS.nScriptInvoke(getID(mRS), slot);
+ }
+ }
+
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ */
+ protected void forEach(int slot, Allocation ain, Allocation aout, FieldPacker v) {
+ if (ain == null && aout == null) {
+ throw new RSIllegalArgumentException(
+ "At least one of ain or aout is required to be non-null.");
+ }
+ long in_id = 0;
+ if (ain != null) {
+ in_id = ain.getID(mRS);
+ }
+ long out_id = 0;
+ if (aout != null) {
+ out_id = aout.getID(mRS);
+ }
+ byte[] params = null;
+ if (v != null) {
+ params = v.getData();
+ }
+ mRS.nScriptForEach(getID(mRS), slot, in_id, out_id, params);
+ }
+
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ */
+ protected void forEach(int slot, Allocation ain, Allocation aout, FieldPacker v, LaunchOptions sc) {
+ if (ain == null && aout == null) {
+ throw new RSIllegalArgumentException(
+ "At least one of ain or aout is required to be non-null.");
+ }
+
+ if (sc == null) {
+ forEach(slot, ain, aout, v);
+ return;
+ }
+ long in_id = 0;
+ if (ain != null) {
+ in_id = ain.getID(mRS);
+ }
+ long out_id = 0;
+ if (aout != null) {
+ out_id = aout.getID(mRS);
+ }
+ byte[] params = null;
+ if (v != null) {
+ params = v.getData();
+ }
+ mRS.nScriptForEachClipped(getID(mRS), slot, in_id, out_id, params, sc.xstart, sc.xend, sc.ystart, sc.yend, sc.zstart, sc.zend);
+ }
+
+ Script(long id, RenderScript rs) {
+ super(id, rs);
+ }
+
+
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ */
+ public void bindAllocation(Allocation va, int slot) {
+ mRS.validate();
+ if (va != null) {
+ if (mRS.getApplicationContext().getApplicationInfo().targetSdkVersion >= 20) {
+ final Type t = va.mType;
+ if (t.hasMipmaps() || t.hasFaces() || (t.getY() != 0) || (t.getZ() != 0)) {
+ throw new RSIllegalArgumentException(
+ "API 20+ only allows simple 1D allocations to be used with bind.");
+ }
+ }
+ mRS.nScriptBindAllocation(getID(mRS), va.getID(mRS), slot);
+ } else {
+ mRS.nScriptBindAllocation(getID(mRS), 0, slot);
+ }
+ }
+
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ */
+ public void setVar(int index, float v) {
+ mRS.nScriptSetVarF(getID(mRS), index, v);
+ }
+ public float getVarF(int index) {
+ return mRS.nScriptGetVarF(getID(mRS), index);
+ }
+
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ */
+ public void setVar(int index, double v) {
+ mRS.nScriptSetVarD(getID(mRS), index, v);
+ }
+ public double getVarD(int index) {
+ return mRS.nScriptGetVarD(getID(mRS), index);
+ }
+
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ */
+ public void setVar(int index, int v) {
+ mRS.nScriptSetVarI(getID(mRS), index, v);
+ }
+ public int getVarI(int index) {
+ return mRS.nScriptGetVarI(getID(mRS), index);
+ }
+
+
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ */
+ public void setVar(int index, long v) {
+ mRS.nScriptSetVarJ(getID(mRS), index, v);
+ }
+ public long getVarJ(int index) {
+ return mRS.nScriptGetVarJ(getID(mRS), index);
+ }
+
+
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ */
+ public void setVar(int index, boolean v) {
+ mRS.nScriptSetVarI(getID(mRS), index, v ? 1 : 0);
+ }
+ public boolean getVarB(int index) {
+ return mRS.nScriptGetVarI(getID(mRS), index) > 0 ? true : false;
+ }
+
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ */
+ public void setVar(int index, BaseObj o) {
+ mRS.nScriptSetVarObj(getID(mRS), index, (o == null) ? 0 : o.getID(mRS));
+ }
+
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ */
+ public void setVar(int index, FieldPacker v) {
+ mRS.nScriptSetVarV(getID(mRS), index, v.getData());
+ }
+
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ */
+ public void setVar(int index, FieldPacker v, Element e, int[] dims) {
+ mRS.nScriptSetVarVE(getID(mRS), index, v.getData(), e.getID(mRS), dims);
+ }
+
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ */
+ public void getVarV(int index, FieldPacker v) {
+ mRS.nScriptGetVarV(getID(mRS), index, v.getData());
+ }
+
+ public void setTimeZone(String timeZone) {
+ mRS.validate();
+ try {
+ mRS.nScriptSetTimeZone(getID(mRS), timeZone.getBytes("UTF-8"));
+ } catch (java.io.UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ */
+ public static class Builder {
+ RenderScript mRS;
+
+ Builder(RenderScript rs) {
+ mRS = rs;
+ }
+ }
+
+
+ /**
+ * Only intended for use by generated reflected code.
+ *
+ */
+ public static class FieldBase {
+ protected Element mElement;
+ protected Allocation mAllocation;
+
+ protected void init(RenderScript rs, int dimx) {
+ mAllocation = Allocation.createSized(rs, mElement, dimx, Allocation.USAGE_SCRIPT);
+ }
+
+ protected void init(RenderScript rs, int dimx, int usages) {
+ mAllocation = Allocation.createSized(rs, mElement, dimx, Allocation.USAGE_SCRIPT | usages);
+ }
+
+ protected FieldBase() {
+ }
+
+ public Element getElement() {
+ return mElement;
+ }
+
+ public Type getType() {
+ return mAllocation.getType();
+ }
+
+ public Allocation getAllocation() {
+ return mAllocation;
+ }
+
+ //@Override
+ public void updateAllocation() {
+ }
+ }
+
+
+ /**
+ * Class used to specify clipping for a kernel launch.
+ *
+ */
+ public static final class LaunchOptions {
+ private int xstart = 0;
+ private int ystart = 0;
+ private int xend = 0;
+ private int yend = 0;
+ private int zstart = 0;
+ private int zend = 0;
+ private int strategy;
+
+ /**
+ * Set the X range. If the end value is set to 0 the X dimension is not
+ * clipped.
+ *
+ * @param xstartArg Must be >= 0
+ * @param xendArg Must be >= xstartArg
+ *
+ * @return LaunchOptions
+ */
+ public LaunchOptions setX(int xstartArg, int xendArg) {
+ if (xstartArg < 0 || xendArg <= xstartArg) {
+ throw new RSIllegalArgumentException("Invalid dimensions");
+ }
+ xstart = xstartArg;
+ xend = xendArg;
+ return this;
+ }
+
+ /**
+ * Set the Y range. If the end value is set to 0 the Y dimension is not
+ * clipped.
+ *
+ * @param ystartArg Must be >= 0
+ * @param yendArg Must be >= ystartArg
+ *
+ * @return LaunchOptions
+ */
+ public LaunchOptions setY(int ystartArg, int yendArg) {
+ if (ystartArg < 0 || yendArg <= ystartArg) {
+ throw new RSIllegalArgumentException("Invalid dimensions");
+ }
+ ystart = ystartArg;
+ yend = yendArg;
+ return this;
+ }
+
+ /**
+ * Set the Z range. If the end value is set to 0 the Z dimension is not
+ * clipped.
+ *
+ * @param zstartArg Must be >= 0
+ * @param zendArg Must be >= zstartArg
+ *
+ * @return LaunchOptions
+ */
+ public LaunchOptions setZ(int zstartArg, int zendArg) {
+ if (zstartArg < 0 || zendArg <= zstartArg) {
+ throw new RSIllegalArgumentException("Invalid dimensions");
+ }
+ zstart = zstartArg;
+ zend = zendArg;
+ return this;
+ }
+
+
+ /**
+ * Returns the current X start
+ *
+ * @return int current value
+ */
+ public int getXStart() {
+ return xstart;
+ }
+ /**
+ * Returns the current X end
+ *
+ * @return int current value
+ */
+ public int getXEnd() {
+ return xend;
+ }
+ /**
+ * Returns the current Y start
+ *
+ * @return int current value
+ */
+ public int getYStart() {
+ return ystart;
+ }
+ /**
+ * Returns the current Y end
+ *
+ * @return int current value
+ */
+ public int getYEnd() {
+ return yend;
+ }
+ /**
+ * Returns the current Z start
+ *
+ * @return int current value
+ */
+ public int getZStart() {
+ return zstart;
+ }
+ /**
+ * Returns the current Z end
+ *
+ * @return int current value
+ */
+ public int getZEnd() {
+ return zend;
+ }
+
+ }
+}
+