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