1 /* 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 17 package android.renderscript; 18 19 import java.lang.reflect.Field; 20 21 import android.content.Context; 22 import android.content.pm.ApplicationInfo; 23 import android.content.pm.PackageManager; 24 import android.content.res.AssetManager; 25 import android.graphics.Bitmap; 26 import android.graphics.BitmapFactory; 27 import android.graphics.SurfaceTexture; 28 import android.os.Process; 29 import android.util.Log; 30 import android.view.Surface; 31 32 33 34 /** 35 * Renderscript base master class. An instance of this class creates native 36 * worker threads for processing commands from this object. This base class 37 * does not provide any extended capabilities beyond simple data processing. 38 * For extended capabilities use derived classes such as RenderScriptGL. 39 * 40 * <div class="special reference"> 41 * <h3>Developer Guides</h3> 42 * <p>For more information about creating an application that uses Renderscript, read the 43 * <a href="{@docRoot}guide/topics/graphics/renderscript.html">Renderscript</a> developer guide.</p> 44 * </div> 45 **/ 46 public class RenderScript { 47 static final String LOG_TAG = "RenderScript_jni"; 48 static final boolean DEBUG = false; 49 @SuppressWarnings({"UnusedDeclaration", "deprecation"}) 50 static final boolean LOG_ENABLED = false; 51 52 private Context mApplicationContext; 53 54 /* 55 * We use a class initializer to allow the native code to cache some 56 * field offsets. 57 */ 58 @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"}) 59 static boolean sInitialized; 60 native static void _nInit(); 61 62 63 static { 64 sInitialized = false; 65 try { 66 System.loadLibrary("rs_jni"); 67 _nInit(); 68 sInitialized = true; 69 } catch (UnsatisfiedLinkError e) { 70 Log.e(LOG_TAG, "Error loading RS jni library: " + e); 71 throw new RSRuntimeException("Error loading RS jni library: " + e); 72 } 73 } 74 75 // Non-threadsafe functions. 76 native int nDeviceCreate(); 77 native void nDeviceDestroy(int dev); 78 native void nDeviceSetConfig(int dev, int param, int value); 79 native int nContextGetUserMessage(int con, int[] data); 80 native String nContextGetErrorMessage(int con); 81 native int nContextPeekMessage(int con, int[] subID); 82 native void nContextInitToClient(int con); 83 native void nContextDeinitToClient(int con); 84 85 86 // Methods below are wrapped to protect the non-threadsafe 87 // lockless fifo. 88 native int rsnContextCreateGL(int dev, int ver, int sdkVer, 89 int colorMin, int colorPref, 90 int alphaMin, int alphaPref, 91 int depthMin, int depthPref, 92 int stencilMin, int stencilPref, 93 int samplesMin, int samplesPref, float samplesQ, int dpi); 94 synchronized int nContextCreateGL(int dev, int ver, int sdkVer, 95 int colorMin, int colorPref, 96 int alphaMin, int alphaPref, 97 int depthMin, int depthPref, 98 int stencilMin, int stencilPref, 99 int samplesMin, int samplesPref, float samplesQ, int dpi) { 100 return rsnContextCreateGL(dev, ver, sdkVer, colorMin, colorPref, 101 alphaMin, alphaPref, depthMin, depthPref, 102 stencilMin, stencilPref, 103 samplesMin, samplesPref, samplesQ, dpi); 104 } 105 native int rsnContextCreate(int dev, int ver, int sdkVer); 106 synchronized int nContextCreate(int dev, int ver, int sdkVer) { 107 return rsnContextCreate(dev, ver, sdkVer); 108 } 109 native void rsnContextDestroy(int con); 110 synchronized void nContextDestroy() { 111 validate(); 112 rsnContextDestroy(mContext); 113 } 114 native void rsnContextSetSurface(int con, int w, int h, Surface sur); 115 synchronized void nContextSetSurface(int w, int h, Surface sur) { 116 validate(); 117 rsnContextSetSurface(mContext, w, h, sur); 118 } 119 native void rsnContextSetSurfaceTexture(int con, int w, int h, SurfaceTexture sur); 120 synchronized void nContextSetSurfaceTexture(int w, int h, SurfaceTexture sur) { 121 validate(); 122 rsnContextSetSurfaceTexture(mContext, w, h, sur); 123 } 124 native void rsnContextSetPriority(int con, int p); 125 synchronized void nContextSetPriority(int p) { 126 validate(); 127 rsnContextSetPriority(mContext, p); 128 } 129 native void rsnContextDump(int con, int bits); 130 synchronized void nContextDump(int bits) { 131 validate(); 132 rsnContextDump(mContext, bits); 133 } 134 native void rsnContextFinish(int con); 135 synchronized void nContextFinish() { 136 validate(); 137 rsnContextFinish(mContext); 138 } 139 140 native void rsnContextBindRootScript(int con, int script); 141 synchronized void nContextBindRootScript(int script) { 142 validate(); 143 rsnContextBindRootScript(mContext, script); 144 } 145 native void rsnContextBindSampler(int con, int sampler, int slot); 146 synchronized void nContextBindSampler(int sampler, int slot) { 147 validate(); 148 rsnContextBindSampler(mContext, sampler, slot); 149 } 150 native void rsnContextBindProgramStore(int con, int pfs); 151 synchronized void nContextBindProgramStore(int pfs) { 152 validate(); 153 rsnContextBindProgramStore(mContext, pfs); 154 } 155 native void rsnContextBindProgramFragment(int con, int pf); 156 synchronized void nContextBindProgramFragment(int pf) { 157 validate(); 158 rsnContextBindProgramFragment(mContext, pf); 159 } 160 native void rsnContextBindProgramVertex(int con, int pv); 161 synchronized void nContextBindProgramVertex(int pv) { 162 validate(); 163 rsnContextBindProgramVertex(mContext, pv); 164 } 165 native void rsnContextBindProgramRaster(int con, int pr); 166 synchronized void nContextBindProgramRaster(int pr) { 167 validate(); 168 rsnContextBindProgramRaster(mContext, pr); 169 } 170 native void rsnContextPause(int con); 171 synchronized void nContextPause() { 172 validate(); 173 rsnContextPause(mContext); 174 } 175 native void rsnContextResume(int con); 176 synchronized void nContextResume() { 177 validate(); 178 rsnContextResume(mContext); 179 } 180 181 native void rsnAssignName(int con, int obj, byte[] name); 182 synchronized void nAssignName(int obj, byte[] name) { 183 validate(); 184 rsnAssignName(mContext, obj, name); 185 } 186 native String rsnGetName(int con, int obj); 187 synchronized String nGetName(int obj) { 188 validate(); 189 return rsnGetName(mContext, obj); 190 } 191 native void rsnObjDestroy(int con, int id); 192 synchronized void nObjDestroy(int id) { 193 // There is a race condition here. The calling code may be run 194 // by the gc while teardown is occuring. This protects againts 195 // deleting dead objects. 196 if (mContext != 0) { 197 rsnObjDestroy(mContext, id); 198 } 199 } 200 201 native int rsnElementCreate(int con, int type, int kind, boolean norm, int vecSize); 202 synchronized int nElementCreate(int type, int kind, boolean norm, int vecSize) { 203 validate(); 204 return rsnElementCreate(mContext, type, kind, norm, vecSize); 205 } 206 native int rsnElementCreate2(int con, int[] elements, String[] names, int[] arraySizes); 207 synchronized int nElementCreate2(int[] elements, String[] names, int[] arraySizes) { 208 validate(); 209 return rsnElementCreate2(mContext, elements, names, arraySizes); 210 } 211 native void rsnElementGetNativeData(int con, int id, int[] elementData); 212 synchronized void nElementGetNativeData(int id, int[] elementData) { 213 validate(); 214 rsnElementGetNativeData(mContext, id, elementData); 215 } 216 native void rsnElementGetSubElements(int con, int id, 217 int[] IDs, String[] names, int[] arraySizes); 218 synchronized void nElementGetSubElements(int id, int[] IDs, String[] names, int[] arraySizes) { 219 validate(); 220 rsnElementGetSubElements(mContext, id, IDs, names, arraySizes); 221 } 222 223 native int rsnTypeCreate(int con, int eid, int x, int y, int z, boolean mips, boolean faces); 224 synchronized int nTypeCreate(int eid, int x, int y, int z, boolean mips, boolean faces) { 225 validate(); 226 return rsnTypeCreate(mContext, eid, x, y, z, mips, faces); 227 } 228 native void rsnTypeGetNativeData(int con, int id, int[] typeData); 229 synchronized void nTypeGetNativeData(int id, int[] typeData) { 230 validate(); 231 rsnTypeGetNativeData(mContext, id, typeData); 232 } 233 234 native int rsnAllocationCreateTyped(int con, int type, int mip, int usage); 235 synchronized int nAllocationCreateTyped(int type, int mip, int usage) { 236 validate(); 237 return rsnAllocationCreateTyped(mContext, type, mip, usage); 238 } 239 native int rsnAllocationCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage); 240 synchronized int nAllocationCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) { 241 validate(); 242 return rsnAllocationCreateFromBitmap(mContext, type, mip, bmp, usage); 243 } 244 native int rsnAllocationCubeCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage); 245 synchronized int nAllocationCubeCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) { 246 validate(); 247 return rsnAllocationCubeCreateFromBitmap(mContext, type, mip, bmp, usage); 248 } 249 native int rsnAllocationCreateBitmapRef(int con, int type, Bitmap bmp); 250 synchronized int nAllocationCreateBitmapRef(int type, Bitmap bmp) { 251 validate(); 252 return rsnAllocationCreateBitmapRef(mContext, type, bmp); 253 } 254 native int rsnAllocationCreateFromAssetStream(int con, int mips, int assetStream, int usage); 255 synchronized int nAllocationCreateFromAssetStream(int mips, int assetStream, int usage) { 256 validate(); 257 return rsnAllocationCreateFromAssetStream(mContext, mips, assetStream, usage); 258 } 259 260 native void rsnAllocationCopyToBitmap(int con, int alloc, Bitmap bmp); 261 synchronized void nAllocationCopyToBitmap(int alloc, Bitmap bmp) { 262 validate(); 263 rsnAllocationCopyToBitmap(mContext, alloc, bmp); 264 } 265 266 267 native void rsnAllocationSyncAll(int con, int alloc, int src); 268 synchronized void nAllocationSyncAll(int alloc, int src) { 269 validate(); 270 rsnAllocationSyncAll(mContext, alloc, src); 271 } 272 native void rsnAllocationGenerateMipmaps(int con, int alloc); 273 synchronized void nAllocationGenerateMipmaps(int alloc) { 274 validate(); 275 rsnAllocationGenerateMipmaps(mContext, alloc); 276 } 277 native void rsnAllocationCopyFromBitmap(int con, int alloc, Bitmap bmp); 278 synchronized void nAllocationCopyFromBitmap(int alloc, Bitmap bmp) { 279 validate(); 280 rsnAllocationCopyFromBitmap(mContext, alloc, bmp); 281 } 282 283 284 native void rsnAllocationData1D(int con, int id, int off, int mip, int count, int[] d, int sizeBytes); 285 synchronized void nAllocationData1D(int id, int off, int mip, int count, int[] d, int sizeBytes) { 286 validate(); 287 rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes); 288 } 289 native void rsnAllocationData1D(int con, int id, int off, int mip, int count, short[] d, int sizeBytes); 290 synchronized void nAllocationData1D(int id, int off, int mip, int count, short[] d, int sizeBytes) { 291 validate(); 292 rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes); 293 } 294 native void rsnAllocationData1D(int con, int id, int off, int mip, int count, byte[] d, int sizeBytes); 295 synchronized void nAllocationData1D(int id, int off, int mip, int count, byte[] d, int sizeBytes) { 296 validate(); 297 rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes); 298 } 299 native void rsnAllocationData1D(int con, int id, int off, int mip, int count, float[] d, int sizeBytes); 300 synchronized void nAllocationData1D(int id, int off, int mip, int count, float[] d, int sizeBytes) { 301 validate(); 302 rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes); 303 } 304 305 native void rsnAllocationElementData1D(int con, int id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes); 306 synchronized void nAllocationElementData1D(int id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes) { 307 validate(); 308 rsnAllocationElementData1D(mContext, id, xoff, mip, compIdx, d, sizeBytes); 309 } 310 311 native void rsnAllocationData2D(int con, 312 int dstAlloc, int dstXoff, int dstYoff, 313 int dstMip, int dstFace, 314 int width, int height, 315 int srcAlloc, int srcXoff, int srcYoff, 316 int srcMip, int srcFace); 317 synchronized void nAllocationData2D(int dstAlloc, int dstXoff, int dstYoff, 318 int dstMip, int dstFace, 319 int width, int height, 320 int srcAlloc, int srcXoff, int srcYoff, 321 int srcMip, int srcFace) { 322 validate(); 323 rsnAllocationData2D(mContext, 324 dstAlloc, dstXoff, dstYoff, 325 dstMip, dstFace, 326 width, height, 327 srcAlloc, srcXoff, srcYoff, 328 srcMip, srcFace); 329 } 330 331 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, byte[] d, int sizeBytes); 332 synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, byte[] d, int sizeBytes) { 333 validate(); 334 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes); 335 } 336 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, short[] d, int sizeBytes); 337 synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, short[] d, int sizeBytes) { 338 validate(); 339 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes); 340 } 341 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, int[] d, int sizeBytes); 342 synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, int[] d, int sizeBytes) { 343 validate(); 344 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes); 345 } 346 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, float[] d, int sizeBytes); 347 synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, float[] d, int sizeBytes) { 348 validate(); 349 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes); 350 } 351 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, Bitmap b); 352 synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, Bitmap b) { 353 validate(); 354 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, b); 355 } 356 357 native void rsnAllocationRead(int con, int id, byte[] d); 358 synchronized void nAllocationRead(int id, byte[] d) { 359 validate(); 360 rsnAllocationRead(mContext, id, d); 361 } 362 native void rsnAllocationRead(int con, int id, short[] d); 363 synchronized void nAllocationRead(int id, short[] d) { 364 validate(); 365 rsnAllocationRead(mContext, id, d); 366 } 367 native void rsnAllocationRead(int con, int id, int[] d); 368 synchronized void nAllocationRead(int id, int[] d) { 369 validate(); 370 rsnAllocationRead(mContext, id, d); 371 } 372 native void rsnAllocationRead(int con, int id, float[] d); 373 synchronized void nAllocationRead(int id, float[] d) { 374 validate(); 375 rsnAllocationRead(mContext, id, d); 376 } 377 native int rsnAllocationGetType(int con, int id); 378 synchronized int nAllocationGetType(int id) { 379 validate(); 380 return rsnAllocationGetType(mContext, id); 381 } 382 383 native void rsnAllocationResize1D(int con, int id, int dimX); 384 synchronized void nAllocationResize1D(int id, int dimX) { 385 validate(); 386 rsnAllocationResize1D(mContext, id, dimX); 387 } 388 native void rsnAllocationResize2D(int con, int id, int dimX, int dimY); 389 synchronized void nAllocationResize2D(int id, int dimX, int dimY) { 390 validate(); 391 rsnAllocationResize2D(mContext, id, dimX, dimY); 392 } 393 394 native int rsnFileA3DCreateFromAssetStream(int con, int assetStream); 395 synchronized int nFileA3DCreateFromAssetStream(int assetStream) { 396 validate(); 397 return rsnFileA3DCreateFromAssetStream(mContext, assetStream); 398 } 399 native int rsnFileA3DCreateFromFile(int con, String path); 400 synchronized int nFileA3DCreateFromFile(String path) { 401 validate(); 402 return rsnFileA3DCreateFromFile(mContext, path); 403 } 404 native int rsnFileA3DCreateFromAsset(int con, AssetManager mgr, String path); 405 synchronized int nFileA3DCreateFromAsset(AssetManager mgr, String path) { 406 validate(); 407 return rsnFileA3DCreateFromAsset(mContext, mgr, path); 408 } 409 native int rsnFileA3DGetNumIndexEntries(int con, int fileA3D); 410 synchronized int nFileA3DGetNumIndexEntries(int fileA3D) { 411 validate(); 412 return rsnFileA3DGetNumIndexEntries(mContext, fileA3D); 413 } 414 native void rsnFileA3DGetIndexEntries(int con, int fileA3D, int numEntries, int[] IDs, String[] names); 415 synchronized void nFileA3DGetIndexEntries(int fileA3D, int numEntries, int[] IDs, String[] names) { 416 validate(); 417 rsnFileA3DGetIndexEntries(mContext, fileA3D, numEntries, IDs, names); 418 } 419 native int rsnFileA3DGetEntryByIndex(int con, int fileA3D, int index); 420 synchronized int nFileA3DGetEntryByIndex(int fileA3D, int index) { 421 validate(); 422 return rsnFileA3DGetEntryByIndex(mContext, fileA3D, index); 423 } 424 425 native int rsnFontCreateFromFile(int con, String fileName, float size, int dpi); 426 synchronized int nFontCreateFromFile(String fileName, float size, int dpi) { 427 validate(); 428 return rsnFontCreateFromFile(mContext, fileName, size, dpi); 429 } 430 native int rsnFontCreateFromAssetStream(int con, String name, float size, int dpi, int assetStream); 431 synchronized int nFontCreateFromAssetStream(String name, float size, int dpi, int assetStream) { 432 validate(); 433 return rsnFontCreateFromAssetStream(mContext, name, size, dpi, assetStream); 434 } 435 native int rsnFontCreateFromAsset(int con, AssetManager mgr, String path, float size, int dpi); 436 synchronized int nFontCreateFromAsset(AssetManager mgr, String path, float size, int dpi) { 437 validate(); 438 return rsnFontCreateFromAsset(mContext, mgr, path, size, dpi); 439 } 440 441 442 native void rsnScriptBindAllocation(int con, int script, int alloc, int slot); 443 synchronized void nScriptBindAllocation(int script, int alloc, int slot) { 444 validate(); 445 rsnScriptBindAllocation(mContext, script, alloc, slot); 446 } 447 native void rsnScriptSetTimeZone(int con, int script, byte[] timeZone); 448 synchronized void nScriptSetTimeZone(int script, byte[] timeZone) { 449 validate(); 450 rsnScriptSetTimeZone(mContext, script, timeZone); 451 } 452 native void rsnScriptInvoke(int con, int id, int slot); 453 synchronized void nScriptInvoke(int id, int slot) { 454 validate(); 455 rsnScriptInvoke(mContext, id, slot); 456 } 457 native void rsnScriptForEach(int con, int id, int slot, int ain, int aout, byte[] params); 458 native void rsnScriptForEach(int con, int id, int slot, int ain, int aout); 459 synchronized void nScriptForEach(int id, int slot, int ain, int aout, byte[] params) { 460 validate(); 461 if (params == null) { 462 rsnScriptForEach(mContext, id, slot, ain, aout); 463 } else { 464 rsnScriptForEach(mContext, id, slot, ain, aout, params); 465 } 466 } 467 native void rsnScriptInvokeV(int con, int id, int slot, byte[] params); 468 synchronized void nScriptInvokeV(int id, int slot, byte[] params) { 469 validate(); 470 rsnScriptInvokeV(mContext, id, slot, params); 471 } 472 native void rsnScriptSetVarI(int con, int id, int slot, int val); 473 synchronized void nScriptSetVarI(int id, int slot, int val) { 474 validate(); 475 rsnScriptSetVarI(mContext, id, slot, val); 476 } 477 native void rsnScriptSetVarJ(int con, int id, int slot, long val); 478 synchronized void nScriptSetVarJ(int id, int slot, long val) { 479 validate(); 480 rsnScriptSetVarJ(mContext, id, slot, val); 481 } 482 native void rsnScriptSetVarF(int con, int id, int slot, float val); 483 synchronized void nScriptSetVarF(int id, int slot, float val) { 484 validate(); 485 rsnScriptSetVarF(mContext, id, slot, val); 486 } 487 native void rsnScriptSetVarD(int con, int id, int slot, double val); 488 synchronized void nScriptSetVarD(int id, int slot, double val) { 489 validate(); 490 rsnScriptSetVarD(mContext, id, slot, val); 491 } 492 native void rsnScriptSetVarV(int con, int id, int slot, byte[] val); 493 synchronized void nScriptSetVarV(int id, int slot, byte[] val) { 494 validate(); 495 rsnScriptSetVarV(mContext, id, slot, val); 496 } 497 native void rsnScriptSetVarObj(int con, int id, int slot, int val); 498 synchronized void nScriptSetVarObj(int id, int slot, int val) { 499 validate(); 500 rsnScriptSetVarObj(mContext, id, slot, val); 501 } 502 503 native int rsnScriptCCreate(int con, String resName, String cacheDir, 504 byte[] script, int length); 505 synchronized int nScriptCCreate(String resName, String cacheDir, byte[] script, int length) { 506 validate(); 507 return rsnScriptCCreate(mContext, resName, cacheDir, script, length); 508 } 509 510 native int rsnSamplerCreate(int con, int magFilter, int minFilter, 511 int wrapS, int wrapT, int wrapR, float aniso); 512 synchronized int nSamplerCreate(int magFilter, int minFilter, 513 int wrapS, int wrapT, int wrapR, float aniso) { 514 validate(); 515 return rsnSamplerCreate(mContext, magFilter, minFilter, wrapS, wrapT, wrapR, aniso); 516 } 517 518 native int rsnProgramStoreCreate(int con, boolean r, boolean g, boolean b, boolean a, 519 boolean depthMask, boolean dither, 520 int srcMode, int dstMode, int depthFunc); 521 synchronized int nProgramStoreCreate(boolean r, boolean g, boolean b, boolean a, 522 boolean depthMask, boolean dither, 523 int srcMode, int dstMode, int depthFunc) { 524 validate(); 525 return rsnProgramStoreCreate(mContext, r, g, b, a, depthMask, dither, srcMode, 526 dstMode, depthFunc); 527 } 528 529 native int rsnProgramRasterCreate(int con, boolean pointSprite, int cullMode); 530 synchronized int nProgramRasterCreate(boolean pointSprite, int cullMode) { 531 validate(); 532 return rsnProgramRasterCreate(mContext, pointSprite, cullMode); 533 } 534 535 native void rsnProgramBindConstants(int con, int pv, int slot, int mID); 536 synchronized void nProgramBindConstants(int pv, int slot, int mID) { 537 validate(); 538 rsnProgramBindConstants(mContext, pv, slot, mID); 539 } 540 native void rsnProgramBindTexture(int con, int vpf, int slot, int a); 541 synchronized void nProgramBindTexture(int vpf, int slot, int a) { 542 validate(); 543 rsnProgramBindTexture(mContext, vpf, slot, a); 544 } 545 native void rsnProgramBindSampler(int con, int vpf, int slot, int s); 546 synchronized void nProgramBindSampler(int vpf, int slot, int s) { 547 validate(); 548 rsnProgramBindSampler(mContext, vpf, slot, s); 549 } 550 native int rsnProgramFragmentCreate(int con, String shader, int[] params); 551 synchronized int nProgramFragmentCreate(String shader, int[] params) { 552 validate(); 553 return rsnProgramFragmentCreate(mContext, shader, params); 554 } 555 native int rsnProgramVertexCreate(int con, String shader, int[] params); 556 synchronized int nProgramVertexCreate(String shader, int[] params) { 557 validate(); 558 return rsnProgramVertexCreate(mContext, shader, params); 559 } 560 561 native int rsnMeshCreate(int con, int[] vtx, int[] idx, int[] prim); 562 synchronized int nMeshCreate(int[] vtx, int[] idx, int[] prim) { 563 validate(); 564 return rsnMeshCreate(mContext, vtx, idx, prim); 565 } 566 native int rsnMeshGetVertexBufferCount(int con, int id); 567 synchronized int nMeshGetVertexBufferCount(int id) { 568 validate(); 569 return rsnMeshGetVertexBufferCount(mContext, id); 570 } 571 native int rsnMeshGetIndexCount(int con, int id); 572 synchronized int nMeshGetIndexCount(int id) { 573 validate(); 574 return rsnMeshGetIndexCount(mContext, id); 575 } 576 native void rsnMeshGetVertices(int con, int id, int[] vtxIds, int vtxIdCount); 577 synchronized void nMeshGetVertices(int id, int[] vtxIds, int vtxIdCount) { 578 validate(); 579 rsnMeshGetVertices(mContext, id, vtxIds, vtxIdCount); 580 } 581 native void rsnMeshGetIndices(int con, int id, int[] idxIds, int[] primitives, int vtxIdCount); 582 synchronized void nMeshGetIndices(int id, int[] idxIds, int[] primitives, int vtxIdCount) { 583 validate(); 584 rsnMeshGetIndices(mContext, id, idxIds, primitives, vtxIdCount); 585 } 586 587 588 int mDev; 589 int mContext; 590 @SuppressWarnings({"FieldCanBeLocal"}) 591 MessageThread mMessageThread; 592 593 Element mElement_U8; 594 Element mElement_I8; 595 Element mElement_U16; 596 Element mElement_I16; 597 Element mElement_U32; 598 Element mElement_I32; 599 Element mElement_U64; 600 Element mElement_I64; 601 Element mElement_F32; 602 Element mElement_F64; 603 Element mElement_BOOLEAN; 604 605 Element mElement_ELEMENT; 606 Element mElement_TYPE; 607 Element mElement_ALLOCATION; 608 Element mElement_SAMPLER; 609 Element mElement_SCRIPT; 610 Element mElement_MESH; 611 Element mElement_PROGRAM_FRAGMENT; 612 Element mElement_PROGRAM_VERTEX; 613 Element mElement_PROGRAM_RASTER; 614 Element mElement_PROGRAM_STORE; 615 616 Element mElement_A_8; 617 Element mElement_RGB_565; 618 Element mElement_RGB_888; 619 Element mElement_RGBA_5551; 620 Element mElement_RGBA_4444; 621 Element mElement_RGBA_8888; 622 623 Element mElement_FLOAT_2; 624 Element mElement_FLOAT_3; 625 Element mElement_FLOAT_4; 626 627 Element mElement_DOUBLE_2; 628 Element mElement_DOUBLE_3; 629 Element mElement_DOUBLE_4; 630 631 Element mElement_UCHAR_2; 632 Element mElement_UCHAR_3; 633 Element mElement_UCHAR_4; 634 635 Element mElement_CHAR_2; 636 Element mElement_CHAR_3; 637 Element mElement_CHAR_4; 638 639 Element mElement_USHORT_2; 640 Element mElement_USHORT_3; 641 Element mElement_USHORT_4; 642 643 Element mElement_SHORT_2; 644 Element mElement_SHORT_3; 645 Element mElement_SHORT_4; 646 647 Element mElement_UINT_2; 648 Element mElement_UINT_3; 649 Element mElement_UINT_4; 650 651 Element mElement_INT_2; 652 Element mElement_INT_3; 653 Element mElement_INT_4; 654 655 Element mElement_ULONG_2; 656 Element mElement_ULONG_3; 657 Element mElement_ULONG_4; 658 659 Element mElement_LONG_2; 660 Element mElement_LONG_3; 661 Element mElement_LONG_4; 662 663 Element mElement_MATRIX_4X4; 664 Element mElement_MATRIX_3X3; 665 Element mElement_MATRIX_2X2; 666 667 Sampler mSampler_CLAMP_NEAREST; 668 Sampler mSampler_CLAMP_LINEAR; 669 Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR; 670 Sampler mSampler_WRAP_NEAREST; 671 Sampler mSampler_WRAP_LINEAR; 672 Sampler mSampler_WRAP_LINEAR_MIP_LINEAR; 673 674 ProgramStore mProgramStore_BLEND_NONE_DEPTH_TEST; 675 ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH; 676 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_TEST; 677 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH; 678 679 ProgramRaster mProgramRaster_CULL_BACK; 680 ProgramRaster mProgramRaster_CULL_FRONT; 681 ProgramRaster mProgramRaster_CULL_NONE; 682 683 /////////////////////////////////////////////////////////////////////////////////// 684 // 685 686 /** 687 * Base class application should derive from for handling RS messages 688 * coming from their scripts. When a script calls sendToClient the data 689 * fields will be filled in and then the run method called by a message 690 * handling thread. This will occur some time after sendToClient completes 691 * in the script. 692 * 693 */ 694 public static class RSMessageHandler implements Runnable { 695 protected int[] mData; 696 protected int mID; 697 protected int mLength; 698 public void run() { 699 } 700 } 701 /** 702 * If an application is expecting messages it should set this field to an 703 * instance of RSMessage. This instance will receive all the user messages 704 * sent from sendToClient by scripts from this context. 705 * 706 */ 707 RSMessageHandler mMessageCallback = null; 708 709 public void setMessageHandler(RSMessageHandler msg) { 710 mMessageCallback = msg; 711 } 712 public RSMessageHandler getMessageHandler() { 713 return mMessageCallback; 714 } 715 716 /** 717 * Runtime error base class. An application should derive from this class 718 * if it wishes to install an error handler. When errors occur at runtime 719 * the fields in this class will be filled and the run method called. 720 * 721 */ 722 public static class RSErrorHandler implements Runnable { 723 protected String mErrorMessage; 724 protected int mErrorNum; 725 public void run() { 726 } 727 } 728 729 /** 730 * Application Error handler. All runtime errors will be dispatched to the 731 * instance of RSAsyncError set here. If this field is null a 732 * RSRuntimeException will instead be thrown with details about the error. 733 * This will cause program termaination. 734 * 735 */ 736 RSErrorHandler mErrorCallback = null; 737 738 public void setErrorHandler(RSErrorHandler msg) { 739 mErrorCallback = msg; 740 } 741 public RSErrorHandler getErrorHandler() { 742 return mErrorCallback; 743 } 744 745 /** 746 * RenderScript worker threads priority enumeration. The default value is 747 * NORMAL. Applications wishing to do background processing such as 748 * wallpapers should set their priority to LOW to avoid starving forground 749 * processes. 750 */ 751 public enum Priority { 752 LOW (Process.THREAD_PRIORITY_BACKGROUND + (5 * Process.THREAD_PRIORITY_LESS_FAVORABLE)), 753 NORMAL (Process.THREAD_PRIORITY_DISPLAY); 754 755 int mID; 756 Priority(int id) { 757 mID = id; 758 } 759 } 760 761 void validate() { 762 if (mContext == 0) { 763 throw new RSInvalidStateException("Calling RS with no Context active."); 764 } 765 } 766 767 768 /** 769 * Change the priority of the worker threads for this context. 770 * 771 * @param p New priority to be set. 772 */ 773 public void setPriority(Priority p) { 774 validate(); 775 nContextSetPriority(p.mID); 776 } 777 778 static class MessageThread extends Thread { 779 RenderScript mRS; 780 boolean mRun = true; 781 int[] mAuxData = new int[2]; 782 783 static final int RS_MESSAGE_TO_CLIENT_NONE = 0; 784 static final int RS_MESSAGE_TO_CLIENT_EXCEPTION = 1; 785 static final int RS_MESSAGE_TO_CLIENT_RESIZE = 2; 786 static final int RS_MESSAGE_TO_CLIENT_ERROR = 3; 787 static final int RS_MESSAGE_TO_CLIENT_USER = 4; 788 789 static final int RS_ERROR_FATAL_UNKNOWN = 0x1000; 790 791 MessageThread(RenderScript rs) { 792 super("RSMessageThread"); 793 mRS = rs; 794 795 } 796 797 public void run() { 798 // This function is a temporary solution. The final solution will 799 // used typed allocations where the message id is the type indicator. 800 int[] rbuf = new int[16]; 801 mRS.nContextInitToClient(mRS.mContext); 802 while(mRun) { 803 rbuf[0] = 0; 804 int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData); 805 int size = mAuxData[1]; 806 int subID = mAuxData[0]; 807 808 if (msg == RS_MESSAGE_TO_CLIENT_USER) { 809 if ((size>>2) >= rbuf.length) { 810 rbuf = new int[(size + 3) >> 2]; 811 } 812 if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) != 813 RS_MESSAGE_TO_CLIENT_USER) { 814 throw new RSDriverException("Error processing message from Renderscript."); 815 } 816 817 if(mRS.mMessageCallback != null) { 818 mRS.mMessageCallback.mData = rbuf; 819 mRS.mMessageCallback.mID = subID; 820 mRS.mMessageCallback.mLength = size; 821 mRS.mMessageCallback.run(); 822 } else { 823 throw new RSInvalidStateException("Received a message from the script with no message handler installed."); 824 } 825 continue; 826 } 827 828 if (msg == RS_MESSAGE_TO_CLIENT_ERROR) { 829 String e = mRS.nContextGetErrorMessage(mRS.mContext); 830 831 if (subID >= RS_ERROR_FATAL_UNKNOWN) { 832 throw new RSRuntimeException("Fatal error " + subID + ", details: " + e); 833 } 834 835 if(mRS.mErrorCallback != null) { 836 mRS.mErrorCallback.mErrorMessage = e; 837 mRS.mErrorCallback.mErrorNum = subID; 838 mRS.mErrorCallback.run(); 839 } else { 840 //throw new RSRuntimeException("Received error num " + subID + ", details: " + e); 841 } 842 continue; 843 } 844 845 // 2: teardown. 846 // But we want to avoid starving other threads during 847 // teardown by yielding until the next line in the destructor 848 // can execute to set mRun = false 849 try { 850 sleep(1, 0); 851 } catch(InterruptedException e) { 852 } 853 } 854 Log.d(LOG_TAG, "MessageThread exiting."); 855 } 856 } 857 858 RenderScript(Context ctx) { 859 mApplicationContext = ctx.getApplicationContext(); 860 } 861 862 /** 863 * Gets the application context associated with the RenderScript context. 864 * 865 * @return The application context. 866 */ 867 public final Context getApplicationContext() { 868 return mApplicationContext; 869 } 870 871 static int getTargetSdkVersion(Context ctx) { 872 return ctx.getApplicationInfo().targetSdkVersion; 873 } 874 875 /** 876 * Create a basic RenderScript context. 877 * 878 * @param ctx The context. 879 * @return RenderScript 880 */ 881 public static RenderScript create(Context ctx) { 882 RenderScript rs = new RenderScript(ctx); 883 884 int sdkVersion = getTargetSdkVersion(ctx); 885 886 rs.mDev = rs.nDeviceCreate(); 887 rs.mContext = rs.nContextCreate(rs.mDev, 0, sdkVersion); 888 if (rs.mContext == 0) { 889 throw new RSDriverException("Failed to create RS context."); 890 } 891 rs.mMessageThread = new MessageThread(rs); 892 rs.mMessageThread.start(); 893 return rs; 894 } 895 896 /** 897 * Print the currently available debugging information about the state of 898 * the RS context to the log. 899 * 900 */ 901 public void contextDump() { 902 validate(); 903 nContextDump(0); 904 } 905 906 /** 907 * Wait for any commands in the fifo between the java bindings and native to 908 * be processed. 909 * 910 */ 911 public void finish() { 912 nContextFinish(); 913 } 914 915 /** 916 * Destroy this renderscript context. Once this function is called its no 917 * longer legal to use this or any objects created by this context. 918 * 919 */ 920 public void destroy() { 921 validate(); 922 nContextDeinitToClient(mContext); 923 mMessageThread.mRun = false; 924 try { 925 mMessageThread.join(); 926 } catch(InterruptedException e) { 927 } 928 929 nContextDestroy(); 930 mContext = 0; 931 932 nDeviceDestroy(mDev); 933 mDev = 0; 934 } 935 936 boolean isAlive() { 937 return mContext != 0; 938 } 939 940 int safeID(BaseObj o) { 941 if(o != null) { 942 return o.getID(); 943 } 944 return 0; 945 } 946 } 947