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