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 * The parent class for all executable scripts. This should not be used by 23 * applications. 24 **/ 25 public class Script extends BaseObj { 26 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. 50 */ 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. 88 */ 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 106 /** 107 * Only intended for use by generated reflected code. 108 * 109 */ 110 protected void invoke(int slot) { 111 mRS.nScriptInvoke(getID(mRS), slot); 112 } 113 114 /** 115 * Only intended for use by generated reflected code. 116 * 117 */ 118 protected void invoke(int slot, FieldPacker v) { 119 if (v != null) { 120 mRS.nScriptInvokeV(getID(mRS), slot, v.getData()); 121 } else { 122 mRS.nScriptInvoke(getID(mRS), slot); 123 } 124 } 125 126 /** 127 * Only intended for use by generated reflected code. 128 * 129 */ 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) { 137 in_id = ain.getID(mRS); 138 } 139 int out_id = 0; 140 if (aout != null) { 141 out_id = aout.getID(mRS); 142 } 143 byte[] params = null; 144 if (v != null) { 145 params = v.getData(); 146 } 147 mRS.nScriptForEach(getID(mRS), slot, in_id, out_id, params); 148 } 149 150 /** 151 * Only intended for use by generated reflected code. 152 * 153 */ 154 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 } 159 160 if (sc == null) { 161 forEach(slot, ain, aout, v); 162 return; 163 } 164 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 } 178 179 Script(int id, RenderScript rs) { 180 super(id, rs); 181 } 182 183 184 /** 185 * Only intended for use by generated reflected code. 186 * 187 */ 188 public void bindAllocation(Allocation va, int slot) { 189 mRS.validate(); 190 if (va != null) { 191 mRS.nScriptBindAllocation(getID(mRS), va.getID(mRS), slot); 192 } else { 193 mRS.nScriptBindAllocation(getID(mRS), 0, slot); 194 } 195 } 196 197 /** 198 * Only intended for use by generated reflected code. 199 * 200 */ 201 public void setVar(int index, float v) { 202 mRS.nScriptSetVarF(getID(mRS), index, v); 203 } 204 public float getVarF(int index) { 205 return mRS.nScriptGetVarF(getID(mRS), index); 206 } 207 208 /** 209 * Only intended for use by generated reflected code. 210 * 211 */ 212 public void setVar(int index, double v) { 213 mRS.nScriptSetVarD(getID(mRS), index, v); 214 } 215 public double getVarD(int index) { 216 return mRS.nScriptGetVarD(getID(mRS), index); 217 } 218 219 /** 220 * Only intended for use by generated reflected code. 221 * 222 */ 223 public void setVar(int index, int v) { 224 mRS.nScriptSetVarI(getID(mRS), index, v); 225 } 226 public int getVarI(int index) { 227 return mRS.nScriptGetVarI(getID(mRS), index); 228 } 229 230 231 /** 232 * Only intended for use by generated reflected code. 233 * 234 */ 235 public void setVar(int index, long v) { 236 mRS.nScriptSetVarJ(getID(mRS), index, v); 237 } 238 public long getVarJ(int index) { 239 return mRS.nScriptGetVarJ(getID(mRS), index); 240 } 241 242 243 /** 244 * Only intended for use by generated reflected code. 245 * 246 */ 247 public void setVar(int index, boolean v) { 248 mRS.nScriptSetVarI(getID(mRS), index, v ? 1 : 0); 249 } 250 public boolean getVarB(int index) { 251 return mRS.nScriptGetVarI(getID(mRS), index) > 0 ? true : false; 252 } 253 254 /** 255 * Only intended for use by generated reflected code. 256 * 257 */ 258 public void setVar(int index, BaseObj o) { 259 mRS.nScriptSetVarObj(getID(mRS), index, (o == null) ? 0 : o.getID(mRS)); 260 } 261 262 /** 263 * Only intended for use by generated reflected code. 264 * 265 */ 266 public void setVar(int index, FieldPacker v) { 267 mRS.nScriptSetVarV(getID(mRS), index, v.getData()); 268 } 269 270 /** 271 * Only intended for use by generated reflected code. 272 * 273 */ 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 278 /** 279 * Only intended for use by generated reflected code. 280 * 281 */ 282 public void getVarV(int index, FieldPacker v) { 283 mRS.nScriptGetVarV(getID(mRS), index, v.getData()); 284 } 285 286 public void setTimeZone(String timeZone) { 287 mRS.validate(); 288 try { 289 mRS.nScriptSetTimeZone(getID(mRS), timeZone.getBytes("UTF-8")); 290 } catch (java.io.UnsupportedEncodingException e) { 291 throw new RuntimeException(e); 292 } 293 } 294 295 /** 296 * Only intended for use by generated reflected code. 297 * 298 */ 299 public static class Builder { 300 RenderScript mRS; 301 302 Builder(RenderScript rs) { 303 mRS = rs; 304 } 305 } 306 307 308 /** 309 * Only intended for use by generated reflected code. 310 * 311 */ 312 public static class FieldBase { 313 protected Element mElement; 314 protected Allocation mAllocation; 315 316 protected void init(RenderScript rs, int dimx) { 317 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); 322 } 323 324 protected FieldBase() { 325 } 326 327 public Element getElement() { 328 return mElement; 329 } 330 331 public Type getType() { 332 return mAllocation.getType(); 333 } 334 335 public Allocation getAllocation() { 336 return mAllocation; 337 } 338 339 //@Override 340 public void updateAllocation() { 341 } 342 } 343 344 345 /** 346 * Class used to specify clipping for a kernel launch. 347 * 348 */ 349 public static final class LaunchOptions { 350 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; 357 358 /** 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 */ 367 public LaunchOptions setX(int xstartArg, int xendArg) { 368 if (xstartArg < 0 || xendArg <= xstartArg) { 369 throw new RSIllegalArgumentException("Invalid dimensions"); 370 } 371 xstart = xstartArg; 372 xend = xendArg; 373 return this; 374 } 375 376 /** 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 */ 385 public LaunchOptions setY(int ystartArg, int yendArg) { 386 if (ystartArg < 0 || yendArg <= ystartArg) { 387 throw new RSIllegalArgumentException("Invalid dimensions"); 388 } 389 ystart = ystartArg; 390 yend = yendArg; 391 return this; 392 } 393 394 /** 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 */ 403 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 413 /** 414 * Returns the current X start 415 * 416 * @return int current value 417 */ 418 public int getXStart() { 419 return xstart; 420 } 421 /** 422 * Returns the current X end 423 * 424 * @return int current value 425 */ 426 public int getXEnd() { 427 return xend; 428 } 429 /** 430 * Returns the current Y start 431 * 432 * @return int current value 433 */ 434 public int getYStart() { 435 return ystart; 436 } 437 /** 438 * Returns the current Y end 439 * 440 * @return int current value 441 */ 442 public int getYEnd() { 443 return yend; 444 } 445 /** 446 * Returns the current Z start 447 * 448 * @return int current value 449 */ 450 public int getZStart() { 451 return zstart; 452 } 453 /** 454 * Returns the current Z end 455 * 456 * @return int current value 457 */ 458 public int getZEnd() { 459 return zend; 460 } 461 462 } 463 } 464 465