1 /* 2 * Copyright (C) 2008-2012 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 17 package android.renderscript; 18 19 import android.util.SparseArray; 20 21 /** 22 * 23 **/ 24 public class Script extends BaseObj { 25 26 /** 27 * KernelID is an identifier for a Script + root function pair. It is used 28 * as an identifier for ScriptGroup creation. 29 * 30 * This class should not be directly created. Instead use the method in the 31 * reflected or intrinsic code "getKernelID_funcname()". 32 * 33 */ 34 public static final class KernelID extends BaseObj { 35 Script mScript; 36 int mSlot; 37 int mSig; 38 KernelID(int id, RenderScript rs, Script s, int slot, int sig) { 39 super(id, rs); 40 mScript = s; 41 mSlot = slot; 42 mSig = sig; 43 } 44 } 45 46 private final SparseArray<KernelID> mKIDs = new SparseArray<KernelID>(); 47 /** 48 * Only to be used by generated reflected classes. 49 * 50 * 51 * @param slot 52 * @param sig 53 * @param ein 54 * @param eout 55 * 56 * @return KernelID 57 */ 58 protected KernelID createKernelID(int slot, int sig, Element ein, Element eout) { 59 KernelID k = mKIDs.get(slot); 60 if (k != null) { 61 return k; 62 } 63 64 int id = mRS.nScriptKernelIDCreate(getID(mRS), slot, sig); 65 if (id == 0) { 66 throw new RSDriverException("Failed to create KernelID"); 67 } 68 69 k = new KernelID(id, mRS, this, slot, sig); 70 mKIDs.put(slot, k); 71 return k; 72 } 73 74 /** 75 * FieldID is an identifier for a Script + exported field pair. It is used 76 * as an identifier for ScriptGroup creation. 77 * 78 * This class should not be directly created. Instead use the method in the 79 * reflected or intrinsic code "getFieldID_funcname()". 80 * 81 */ 82 public static final class FieldID extends BaseObj { 83 Script mScript; 84 int mSlot; 85 FieldID(int id, RenderScript rs, Script s, int slot) { 86 super(id, rs); 87 mScript = s; 88 mSlot = slot; 89 } 90 } 91 92 private final SparseArray<FieldID> mFIDs = new SparseArray(); 93 /** 94 * Only to be used by generated reflected classes. 95 * 96 * @param slot 97 * @param e 98 * 99 * @return FieldID 100 */ 101 protected FieldID createFieldID(int slot, Element e) { 102 FieldID f = mFIDs.get(slot); 103 if (f != null) { 104 return f; 105 } 106 107 int id = mRS.nScriptFieldIDCreate(getID(mRS), slot); 108 if (id == 0) { 109 throw new RSDriverException("Failed to create FieldID"); 110 } 111 112 f = new FieldID(id, mRS, this, slot); 113 mFIDs.put(slot, f); 114 return f; 115 } 116 117 118 /** 119 * Only intended for use by generated reflected code. 120 * 121 * @param slot 122 */ 123 protected void invoke(int slot) { 124 mRS.nScriptInvoke(getID(mRS), slot); 125 } 126 127 /** 128 * Only intended for use by generated reflected code. 129 * 130 * @param slot 131 * @param v 132 */ 133 protected void invoke(int slot, FieldPacker v) { 134 if (v != null) { 135 mRS.nScriptInvokeV(getID(mRS), slot, v.getData()); 136 } else { 137 mRS.nScriptInvoke(getID(mRS), slot); 138 } 139 } 140 141 /** 142 * Only intended for use by generated reflected code. 143 * 144 * @param slot 145 * @param ain 146 * @param aout 147 * @param v 148 */ 149 protected void forEach(int slot, Allocation ain, Allocation aout, FieldPacker v) { 150 if (ain == null && aout == null) { 151 throw new RSIllegalArgumentException( 152 "At least one of ain or aout is required to be non-null."); 153 } 154 int in_id = 0; 155 if (ain != null) { 156 in_id = ain.getID(mRS); 157 } 158 int out_id = 0; 159 if (aout != null) { 160 out_id = aout.getID(mRS); 161 } 162 byte[] params = null; 163 if (v != null) { 164 params = v.getData(); 165 } 166 mRS.nScriptForEach(getID(mRS), slot, in_id, out_id, params); 167 } 168 169 170 Script(int id, RenderScript rs) { 171 super(id, rs); 172 } 173 174 175 /** 176 * Only intended for use by generated reflected code. 177 * 178 * @param va 179 * @param slot 180 */ 181 public void bindAllocation(Allocation va, int slot) { 182 mRS.validate(); 183 if (va != null) { 184 mRS.nScriptBindAllocation(getID(mRS), va.getID(mRS), slot); 185 } else { 186 mRS.nScriptBindAllocation(getID(mRS), 0, slot); 187 } 188 } 189 190 /** 191 * Only intended for use by generated reflected code. 192 * 193 * @param index 194 * @param v 195 */ 196 public void setVar(int index, float v) { 197 mRS.nScriptSetVarF(getID(mRS), index, v); 198 } 199 200 /** 201 * Only intended for use by generated reflected code. 202 * 203 * @param index 204 * @param v 205 */ 206 public void setVar(int index, double v) { 207 mRS.nScriptSetVarD(getID(mRS), index, v); 208 } 209 210 /** 211 * Only intended for use by generated reflected code. 212 * 213 * @param index 214 * @param v 215 */ 216 public void setVar(int index, int v) { 217 mRS.nScriptSetVarI(getID(mRS), index, v); 218 } 219 220 /** 221 * Only intended for use by generated reflected code. 222 * 223 * @param index 224 * @param v 225 */ 226 public void setVar(int index, long v) { 227 mRS.nScriptSetVarJ(getID(mRS), index, v); 228 } 229 230 /** 231 * Only intended for use by generated reflected code. 232 * 233 * @param index 234 * @param v 235 */ 236 public void setVar(int index, boolean v) { 237 mRS.nScriptSetVarI(getID(mRS), index, v ? 1 : 0); 238 } 239 240 /** 241 * Only intended for use by generated reflected code. 242 * 243 * @param index 244 * @param o 245 */ 246 public void setVar(int index, BaseObj o) { 247 mRS.nScriptSetVarObj(getID(mRS), index, (o == null) ? 0 : o.getID(mRS)); 248 } 249 250 /** 251 * Only intended for use by generated reflected code. 252 * 253 * @param index 254 * @param v 255 */ 256 public void setVar(int index, FieldPacker v) { 257 mRS.nScriptSetVarV(getID(mRS), index, v.getData()); 258 } 259 260 /** 261 * Only intended for use by generated reflected code. 262 * 263 * @param index 264 * @param v 265 * @param e 266 * @param dims 267 */ 268 public void setVar(int index, FieldPacker v, Element e, int[] dims) { 269 mRS.nScriptSetVarVE(getID(mRS), index, v.getData(), e.getID(mRS), dims); 270 } 271 272 public void setTimeZone(String timeZone) { 273 mRS.validate(); 274 try { 275 mRS.nScriptSetTimeZone(getID(mRS), timeZone.getBytes("UTF-8")); 276 } catch (java.io.UnsupportedEncodingException e) { 277 throw new RuntimeException(e); 278 } 279 } 280 281 public static class Builder { 282 RenderScript mRS; 283 284 Builder(RenderScript rs) { 285 mRS = rs; 286 } 287 } 288 289 290 public static class FieldBase { 291 protected Element mElement; 292 protected Allocation mAllocation; 293 294 protected void init(RenderScript rs, int dimx) { 295 mAllocation = Allocation.createSized(rs, mElement, dimx, Allocation.USAGE_SCRIPT); 296 } 297 298 protected void init(RenderScript rs, int dimx, int usages) { 299 mAllocation = Allocation.createSized(rs, mElement, dimx, Allocation.USAGE_SCRIPT | usages); 300 } 301 302 protected FieldBase() { 303 } 304 305 public Element getElement() { 306 return mElement; 307 } 308 309 public Type getType() { 310 return mAllocation.getType(); 311 } 312 313 public Allocation getAllocation() { 314 return mAllocation; 315 } 316 317 //@Override 318 public void updateAllocation() { 319 } 320 } 321 } 322 323