RenderScript.java revision 67f2e442a31b8395e3c1951f8e91139ec7f2be99
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.graphics.Bitmap; 22import android.graphics.BitmapFactory; 23import android.util.Config; 24import android.util.Log; 25import android.view.Surface; 26 27 28/** 29 * @hide 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 protected static final boolean DEBUG = false; 42 @SuppressWarnings({"UnusedDeclaration", "deprecation"}) 43 protected static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV; 44 45 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 protected static boolean sInitialized; 53 native protected 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.d(LOG_TAG, "RenderScript JNI library not found!"); 64 } 65 } 66 67 // Non-threadsafe functions. 68 native void nInitElements(int a8, int rgba4444, int rgba8888, int rgb565); 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); 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) { 93 return rsnContextCreateGL(dev, ver, colorMin, colorPref, 94 alphaMin, alphaPref, depthMin, depthPref, 95 stencilMin, stencilPref, 96 samplesMin, samplesPref, samplesQ); 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 rsnContextDestroy(mContext); 105 } 106 native void rsnContextSetSurface(int con, int w, int h, Surface sur); 107 synchronized void nContextSetSurface(int w, int h, Surface sur) { 108 rsnContextSetSurface(mContext, w, h, sur); 109 } 110 native void rsnContextSetPriority(int con, int p); 111 synchronized void nContextSetPriority(int p) { 112 rsnContextSetPriority(mContext, p); 113 } 114 native void rsnContextDump(int con, int bits); 115 synchronized void nContextDump(int bits) { 116 rsnContextDump(mContext, bits); 117 } 118 native void rsnContextFinish(int con); 119 synchronized void nContextFinish() { 120 rsnContextFinish(mContext); 121 } 122 123 native void rsnContextBindRootScript(int con, int script); 124 synchronized void nContextBindRootScript(int script) { 125 rsnContextBindRootScript(mContext, script); 126 } 127 native void rsnContextBindSampler(int con, int sampler, int slot); 128 synchronized void nContextBindSampler(int sampler, int slot) { 129 rsnContextBindSampler(mContext, sampler, slot); 130 } 131 native void rsnContextBindProgramStore(int con, int pfs); 132 synchronized void nContextBindProgramStore(int pfs) { 133 rsnContextBindProgramStore(mContext, pfs); 134 } 135 native void rsnContextBindProgramFragment(int con, int pf); 136 synchronized void nContextBindProgramFragment(int pf) { 137 rsnContextBindProgramFragment(mContext, pf); 138 } 139 native void rsnContextBindProgramVertex(int con, int pv); 140 synchronized void nContextBindProgramVertex(int pv) { 141 rsnContextBindProgramVertex(mContext, pv); 142 } 143 native void rsnContextBindProgramRaster(int con, int pr); 144 synchronized void nContextBindProgramRaster(int pr) { 145 rsnContextBindProgramRaster(mContext, pr); 146 } 147 native void rsnContextPause(int con); 148 synchronized void nContextPause() { 149 rsnContextPause(mContext); 150 } 151 native void rsnContextResume(int con); 152 synchronized void nContextResume() { 153 rsnContextResume(mContext); 154 } 155 156 native void rsnAssignName(int con, int obj, byte[] name); 157 synchronized void nAssignName(int obj, byte[] name) { 158 rsnAssignName(mContext, obj, name); 159 } 160 native String rsnGetName(int con, int obj); 161 synchronized String nGetName(int obj) { 162 return rsnGetName(mContext, obj); 163 } 164 native void rsnObjDestroy(int con, int id); 165 synchronized void nObjDestroy(int id) { 166 rsnObjDestroy(mContext, id); 167 } 168 169 native int rsnElementCreate(int con, int type, int kind, boolean norm, int vecSize); 170 synchronized int nElementCreate(int type, int kind, boolean norm, int vecSize) { 171 return rsnElementCreate(mContext, type, kind, norm, vecSize); 172 } 173 native int rsnElementCreate2(int con, int[] elements, String[] names, int[] arraySizes); 174 synchronized int nElementCreate2(int[] elements, String[] names, int[] arraySizes) { 175 return rsnElementCreate2(mContext, elements, names, arraySizes); 176 } 177 native void rsnElementGetNativeData(int con, int id, int[] elementData); 178 synchronized void nElementGetNativeData(int id, int[] elementData) { 179 rsnElementGetNativeData(mContext, id, elementData); 180 } 181 native void rsnElementGetSubElements(int con, int id, int[] IDs, String[] names); 182 synchronized void nElementGetSubElements(int id, int[] IDs, String[] names) { 183 rsnElementGetSubElements(mContext, id, IDs, names); 184 } 185 186 native int rsnTypeCreate(int con, int eid, int[] dims, int[] vals); 187 synchronized int nTypeCreate(int eid, int[] dims, int[] vals) { 188 return rsnTypeCreate(mContext, eid, dims, vals); 189 } 190 native void rsnTypeGetNativeData(int con, int id, int[] typeData); 191 synchronized void nTypeGetNativeData(int id, int[] typeData) { 192 rsnTypeGetNativeData(mContext, id, typeData); 193 } 194 195 native int rsnAllocationCreateTyped(int con, int type); 196 synchronized int nAllocationCreateTyped(int type) { 197 return rsnAllocationCreateTyped(mContext, type); 198 } 199 native void rsnAllocationUpdateFromBitmap(int con, int alloc, Bitmap bmp); 200 synchronized void nAllocationUpdateFromBitmap(int alloc, Bitmap bmp) { 201 rsnAllocationUpdateFromBitmap(mContext, alloc, bmp); 202 } 203 native int rsnAllocationCreateFromBitmap(int con, int dstFmt, boolean genMips, Bitmap bmp); 204 synchronized int nAllocationCreateFromBitmap(int dstFmt, boolean genMips, Bitmap bmp) { 205 return rsnAllocationCreateFromBitmap(mContext, dstFmt, genMips, bmp); 206 } 207 native int rsnAllocationCubeCreateFromBitmap(int con, int dstFmt, boolean genMips, Bitmap bmp); 208 synchronized int nAllocationCubeCreateFromBitmap(int dstFmt, boolean genMips, Bitmap bmp) { 209 return rsnAllocationCubeCreateFromBitmap(mContext, dstFmt, genMips, bmp); 210 } 211 native int rsnAllocationCreateBitmapRef(int con, int type, Bitmap bmp); 212 synchronized int nAllocationCreateBitmapRef(int type, Bitmap bmp) { 213 return rsnAllocationCreateBitmapRef(mContext, type, bmp); 214 } 215 native int rsnAllocationCreateFromAssetStream(int con, int dstFmt, boolean genMips, int assetStream); 216 synchronized int nAllocationCreateFromAssetStream(int dstFmt, boolean genMips, int assetStream) { 217 return rsnAllocationCreateFromAssetStream(mContext, dstFmt, genMips, assetStream); 218 } 219 220 native void rsnAllocationUploadToTexture(int con, int alloc, boolean genMips, int baseMioLevel); 221 synchronized void nAllocationUploadToTexture(int alloc, boolean genMips, int baseMioLevel) { 222 rsnAllocationUploadToTexture(mContext, alloc, genMips, baseMioLevel); 223 } 224 native void rsnAllocationUploadToBufferObject(int con, int alloc); 225 synchronized void nAllocationUploadToBufferObject(int alloc) { 226 rsnAllocationUploadToBufferObject(mContext, alloc); 227 } 228 229 native void rsnAllocationSubData1D(int con, int id, int off, int count, int[] d, int sizeBytes); 230 synchronized void nAllocationSubData1D(int id, int off, int count, int[] d, int sizeBytes) { 231 rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes); 232 } 233 native void rsnAllocationSubData1D(int con, int id, int off, int count, short[] d, int sizeBytes); 234 synchronized void nAllocationSubData1D(int id, int off, int count, short[] d, int sizeBytes) { 235 rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes); 236 } 237 native void rsnAllocationSubData1D(int con, int id, int off, int count, byte[] d, int sizeBytes); 238 synchronized void nAllocationSubData1D(int id, int off, int count, byte[] d, int sizeBytes) { 239 rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes); 240 } 241 native void rsnAllocationSubElementData1D(int con, int id, int xoff, int compIdx, byte[] d, int sizeBytes); 242 synchronized void nAllocationSubElementData1D(int id, int xoff, int compIdx, byte[] d, int sizeBytes) { 243 rsnAllocationSubElementData1D(mContext, id, xoff, compIdx, d, sizeBytes); 244 } 245 native void rsnAllocationSubData1D(int con, int id, int off, int count, float[] d, int sizeBytes); 246 synchronized void nAllocationSubData1D(int id, int off, int count, float[] d, int sizeBytes) { 247 rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes); 248 } 249 250 native void rsnAllocationSubData2D(int con, int id, int xoff, int yoff, int w, int h, int[] d, int sizeBytes); 251 synchronized void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, int[] d, int sizeBytes) { 252 rsnAllocationSubData2D(mContext, id, xoff, yoff, w, h, d, sizeBytes); 253 } 254 native void rsnAllocationSubData2D(int con, int id, int xoff, int yoff, int w, int h, float[] d, int sizeBytes); 255 synchronized void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, float[] d, int sizeBytes) { 256 rsnAllocationSubData2D(mContext, id, xoff, yoff, w, h, d, sizeBytes); 257 } 258 native void rsnAllocationRead(int con, int id, int[] d); 259 synchronized void nAllocationRead(int id, int[] d) { 260 rsnAllocationRead(mContext, id, d); 261 } 262 native void rsnAllocationRead(int con, int id, float[] d); 263 synchronized void nAllocationRead(int id, float[] d) { 264 rsnAllocationRead(mContext, id, d); 265 } 266 native int rsnAllocationGetType(int con, int id); 267 synchronized int nAllocationGetType(int id) { 268 return rsnAllocationGetType(mContext, id); 269 } 270 271 native void rsnAllocationResize1D(int con, int id, int dimX); 272 synchronized void nAllocationResize1D(int id, int dimX) { 273 rsnAllocationResize1D(mContext, id, dimX); 274 } 275 native void rsnAllocationResize2D(int con, int id, int dimX, int dimY); 276 synchronized void nAllocationResize2D(int id, int dimX, int dimY) { 277 rsnAllocationResize2D(mContext, id, dimX, dimY); 278 } 279 280 native int rsnFileA3DCreateFromAssetStream(int con, int assetStream); 281 synchronized int nFileA3DCreateFromAssetStream(int assetStream) { 282 return rsnFileA3DCreateFromAssetStream(mContext, assetStream); 283 } 284 native int rsnFileA3DGetNumIndexEntries(int con, int fileA3D); 285 synchronized int nFileA3DGetNumIndexEntries(int fileA3D) { 286 return rsnFileA3DGetNumIndexEntries(mContext, fileA3D); 287 } 288 native void rsnFileA3DGetIndexEntries(int con, int fileA3D, int numEntries, int[] IDs, String[] names); 289 synchronized void nFileA3DGetIndexEntries(int fileA3D, int numEntries, int[] IDs, String[] names) { 290 rsnFileA3DGetIndexEntries(mContext, fileA3D, numEntries, IDs, names); 291 } 292 native int rsnFileA3DGetEntryByIndex(int con, int fileA3D, int index); 293 synchronized int nFileA3DGetEntryByIndex(int fileA3D, int index) { 294 return rsnFileA3DGetEntryByIndex(mContext, fileA3D, index); 295 } 296 297 native int rsnFontCreateFromFile(int con, String fileName, int size, int dpi); 298 synchronized int nFontCreateFromFile(String fileName, int size, int dpi) { 299 return rsnFontCreateFromFile(mContext, fileName, size, dpi); 300 } 301 302 native void rsnAdapter1DBindAllocation(int con, int ad, int alloc); 303 synchronized void nAdapter1DBindAllocation(int ad, int alloc) { 304 rsnAdapter1DBindAllocation(mContext, ad, alloc); 305 } 306 native void rsnAdapter1DSetConstraint(int con, int ad, int dim, int value); 307 synchronized void nAdapter1DSetConstraint(int ad, int dim, int value) { 308 rsnAdapter1DSetConstraint(mContext, ad, dim, value); 309 } 310 native void rsnAdapter1DData(int con, int ad, int[] d); 311 synchronized void nAdapter1DData(int ad, int[] d) { 312 rsnAdapter1DData(mContext, ad, d); 313 } 314 native void rsnAdapter1DData(int con, int ad, float[] d); 315 synchronized void nAdapter1DData(int ad, float[] d) { 316 rsnAdapter1DData(mContext, ad, d); 317 } 318 native void rsnAdapter1DSubData(int con, int ad, int off, int count, int[] d); 319 synchronized void nAdapter1DSubData(int ad, int off, int count, int[] d) { 320 rsnAdapter1DSubData(mContext, ad, off, count, d); 321 } 322 native void rsnAdapter1DSubData(int con, int ad, int off, int count, float[] d); 323 synchronized void nAdapter1DSubData(int ad, int off, int count, float[] d) { 324 rsnAdapter1DSubData(mContext, ad, off, count, d); 325 } 326 native int rsnAdapter1DCreate(int con); 327 synchronized int nAdapter1DCreate() { 328 return rsnAdapter1DCreate(mContext); 329 } 330 331 native void rsnAdapter2DBindAllocation(int con, int ad, int alloc); 332 synchronized void nAdapter2DBindAllocation(int ad, int alloc) { 333 rsnAdapter2DBindAllocation(mContext, ad, alloc); 334 } 335 native void rsnAdapter2DSetConstraint(int con, int ad, int dim, int value); 336 synchronized void nAdapter2DSetConstraint(int ad, int dim, int value) { 337 rsnAdapter2DSetConstraint(mContext, ad, dim, value); 338 } 339 native void rsnAdapter2DData(int con, int ad, int[] d); 340 synchronized void nAdapter2DData(int ad, int[] d) { 341 rsnAdapter2DData(mContext, ad, d); 342 } 343 native void rsnAdapter2DData(int con, int ad, float[] d); 344 synchronized void nAdapter2DData(int ad, float[] d) { 345 rsnAdapter2DData(mContext, ad, d); 346 } 347 native void rsnAdapter2DSubData(int con, int ad, int xoff, int yoff, int w, int h, int[] d); 348 synchronized void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, int[] d) { 349 rsnAdapter2DSubData(mContext, ad, xoff, yoff, w, h, d); 350 } 351 native void rsnAdapter2DSubData(int con, int ad, int xoff, int yoff, int w, int h, float[] d); 352 synchronized void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, float[] d) { 353 rsnAdapter2DSubData(mContext, ad, xoff, yoff, w, h, d); 354 } 355 native int rsnAdapter2DCreate(int con); 356 synchronized int nAdapter2DCreate() { 357 return rsnAdapter2DCreate(mContext); 358 } 359 360 native void rsnScriptBindAllocation(int con, int script, int alloc, int slot); 361 synchronized void nScriptBindAllocation(int script, int alloc, int slot) { 362 rsnScriptBindAllocation(mContext, script, alloc, slot); 363 } 364 native void rsnScriptSetTimeZone(int con, int script, byte[] timeZone); 365 synchronized void nScriptSetTimeZone(int script, byte[] timeZone) { 366 rsnScriptSetTimeZone(mContext, script, timeZone); 367 } 368 native void rsnScriptInvoke(int con, int id, int slot); 369 synchronized void nScriptInvoke(int id, int slot) { 370 rsnScriptInvoke(mContext, id, slot); 371 } 372 native void rsnScriptInvokeV(int con, int id, int slot, byte[] params); 373 synchronized void nScriptInvokeV(int id, int slot, byte[] params) { 374 rsnScriptInvokeV(mContext, id, slot, params); 375 } 376 native void rsnScriptSetVarI(int con, int id, int slot, int val); 377 synchronized void nScriptSetVarI(int id, int slot, int val) { 378 rsnScriptSetVarI(mContext, id, slot, val); 379 } 380 native void rsnScriptSetVarJ(int con, int id, int slot, long val); 381 synchronized void nScriptSetVarJ(int id, int slot, long val) { 382 rsnScriptSetVarJ(mContext, id, slot, val); 383 } 384 native void rsnScriptSetVarF(int con, int id, int slot, float val); 385 synchronized void nScriptSetVarF(int id, int slot, float val) { 386 rsnScriptSetVarF(mContext, id, slot, val); 387 } 388 native void rsnScriptSetVarD(int con, int id, int slot, double val); 389 synchronized void nScriptSetVarD(int id, int slot, double val) { 390 rsnScriptSetVarD(mContext, id, slot, val); 391 } 392 native void rsnScriptSetVarV(int con, int id, int slot, byte[] val); 393 synchronized void nScriptSetVarV(int id, int slot, byte[] val) { 394 rsnScriptSetVarV(mContext, id, slot, val); 395 } 396 native void rsnScriptSetVarObj(int con, int id, int slot, int val); 397 synchronized void nScriptSetVarObj(int id, int slot, int val) { 398 rsnScriptSetVarObj(mContext, id, slot, val); 399 } 400 401 native void rsnScriptCBegin(int con); 402 synchronized void nScriptCBegin() { 403 rsnScriptCBegin(mContext); 404 } 405 native void rsnScriptCSetScript(int con, byte[] script, int offset, int length); 406 synchronized void nScriptCSetScript(byte[] script, int offset, int length) { 407 rsnScriptCSetScript(mContext, script, offset, length); 408 } 409 native int rsnScriptCCreate(int con, String val); 410 synchronized int nScriptCCreate(String val) { 411 return rsnScriptCCreate(mContext, val); 412 } 413 414 native void rsnSamplerBegin(int con); 415 synchronized void nSamplerBegin() { 416 rsnSamplerBegin(mContext); 417 } 418 native void rsnSamplerSet(int con, int param, int value); 419 synchronized void nSamplerSet(int param, int value) { 420 rsnSamplerSet(mContext, param, value); 421 } 422 native void rsnSamplerSet2(int con, int param, float value); 423 synchronized void nSamplerSet2(int param, float value) { 424 rsnSamplerSet2(mContext, param, value); 425 } 426 native int rsnSamplerCreate(int con); 427 synchronized int nSamplerCreate() { 428 return rsnSamplerCreate(mContext); 429 } 430 431 native void rsnProgramStoreBegin(int con, int in, int out); 432 synchronized void nProgramStoreBegin(int in, int out) { 433 rsnProgramStoreBegin(mContext, in, out); 434 } 435 native void rsnProgramStoreDepthFunc(int con, int func); 436 synchronized void nProgramStoreDepthFunc(int func) { 437 rsnProgramStoreDepthFunc(mContext, func); 438 } 439 native void rsnProgramStoreDepthMask(int con, boolean enable); 440 synchronized void nProgramStoreDepthMask(boolean enable) { 441 rsnProgramStoreDepthMask(mContext, enable); 442 } 443 native void rsnProgramStoreColorMask(int con, boolean r, boolean g, boolean b, boolean a); 444 synchronized void nProgramStoreColorMask(boolean r, boolean g, boolean b, boolean a) { 445 rsnProgramStoreColorMask(mContext, r, g, b, a); 446 } 447 native void rsnProgramStoreBlendFunc(int con, int src, int dst); 448 synchronized void nProgramStoreBlendFunc(int src, int dst) { 449 rsnProgramStoreBlendFunc(mContext, src, dst); 450 } 451 native void rsnProgramStoreDither(int con, boolean enable); 452 synchronized void nProgramStoreDither(boolean enable) { 453 rsnProgramStoreDither(mContext, enable); 454 } 455 native int rsnProgramStoreCreate(int con); 456 synchronized int nProgramStoreCreate() { 457 return rsnProgramStoreCreate(mContext); 458 } 459 460 native int rsnProgramRasterCreate(int con, boolean pointSmooth, boolean lineSmooth, boolean pointSprite); 461 synchronized int nProgramRasterCreate(boolean pointSmooth, boolean lineSmooth, boolean pointSprite) { 462 return rsnProgramRasterCreate(mContext, pointSmooth, lineSmooth, pointSprite); 463 } 464 native void rsnProgramRasterSetLineWidth(int con, int pr, float v); 465 synchronized void nProgramRasterSetLineWidth(int pr, float v) { 466 rsnProgramRasterSetLineWidth(mContext, pr, v); 467 } 468 native void rsnProgramRasterSetCullMode(int con, int pr, int mode); 469 synchronized void nProgramRasterSetCullMode(int pr, int mode) { 470 rsnProgramRasterSetCullMode(mContext, pr, mode); 471 } 472 473 native void rsnProgramBindConstants(int con, int pv, int slot, int mID); 474 synchronized void nProgramBindConstants(int pv, int slot, int mID) { 475 rsnProgramBindConstants(mContext, pv, slot, mID); 476 } 477 native void rsnProgramBindTexture(int con, int vpf, int slot, int a); 478 synchronized void nProgramBindTexture(int vpf, int slot, int a) { 479 rsnProgramBindTexture(mContext, vpf, slot, a); 480 } 481 native void rsnProgramBindSampler(int con, int vpf, int slot, int s); 482 synchronized void nProgramBindSampler(int vpf, int slot, int s) { 483 rsnProgramBindSampler(mContext, vpf, slot, s); 484 } 485 native int rsnProgramFragmentCreate(int con, String shader, int[] params); 486 synchronized int nProgramFragmentCreate(String shader, int[] params) { 487 return rsnProgramFragmentCreate(mContext, shader, params); 488 } 489 native int rsnProgramVertexCreate(int con, String shader, int[] params); 490 synchronized int nProgramVertexCreate(String shader, int[] params) { 491 return rsnProgramVertexCreate(mContext, shader, params); 492 } 493 494 native int rsnMeshCreate(int con, int vtxCount, int indexCount); 495 synchronized int nMeshCreate(int vtxCount, int indexCount) { 496 return rsnMeshCreate(mContext, vtxCount, indexCount); 497 } 498 native void rsnMeshBindVertex(int con, int id, int alloc, int slot); 499 synchronized void nMeshBindVertex(int id, int alloc, int slot) { 500 rsnMeshBindVertex(mContext, id, alloc, slot); 501 } 502 native void rsnMeshBindIndex(int con, int id, int alloc, int prim, int slot); 503 synchronized void nMeshBindIndex(int id, int alloc, int prim, int slot) { 504 rsnMeshBindIndex(mContext, id, alloc, prim, slot); 505 } 506 native void rsnMeshInitVertexAttribs(int con, int id); 507 synchronized void nMeshInitVertexAttribs(int id) { 508 rsnMeshInitVertexAttribs(mContext, id); 509 } 510 native int rsnMeshGetVertexBufferCount(int con, int id); 511 synchronized int nMeshGetVertexBufferCount(int id) { 512 return rsnMeshGetVertexBufferCount(mContext, id); 513 } 514 native int rsnMeshGetIndexCount(int con, int id); 515 synchronized int nMeshGetIndexCount(int id) { 516 return rsnMeshGetIndexCount(mContext, id); 517 } 518 native void rsnMeshGetVertices(int con, int id, int[] vtxIds, int vtxIdCount); 519 synchronized void nMeshGetVertices(int id, int[] vtxIds, int vtxIdCount) { 520 rsnMeshGetVertices(mContext, id, vtxIds, vtxIdCount); 521 } 522 native void rsnMeshGetIndices(int con, int id, int[] idxIds, int[] primitives, int vtxIdCount); 523 synchronized void nMeshGetIndices(int id, int[] idxIds, int[] primitives, int vtxIdCount) { 524 rsnMeshGetIndices(mContext, id, idxIds, primitives, vtxIdCount); 525 } 526 527 528 protected int mDev; 529 protected int mContext; 530 @SuppressWarnings({"FieldCanBeLocal"}) 531 protected MessageThread mMessageThread; 532 533 Element mElement_U8; 534 Element mElement_I8; 535 Element mElement_U16; 536 Element mElement_I16; 537 Element mElement_U32; 538 Element mElement_I32; 539 Element mElement_U64; 540 Element mElement_I64; 541 Element mElement_F32; 542 Element mElement_F64; 543 Element mElement_BOOLEAN; 544 545 Element mElement_ELEMENT; 546 Element mElement_TYPE; 547 Element mElement_ALLOCATION; 548 Element mElement_SAMPLER; 549 Element mElement_SCRIPT; 550 Element mElement_MESH; 551 Element mElement_PROGRAM_FRAGMENT; 552 Element mElement_PROGRAM_VERTEX; 553 Element mElement_PROGRAM_RASTER; 554 Element mElement_PROGRAM_STORE; 555 556 Element mElement_A_8; 557 Element mElement_RGB_565; 558 Element mElement_RGB_888; 559 Element mElement_RGBA_5551; 560 Element mElement_RGBA_4444; 561 Element mElement_RGBA_8888; 562 563 Element mElement_FLOAT_2; 564 Element mElement_FLOAT_3; 565 Element mElement_FLOAT_4; 566 Element mElement_UCHAR_4; 567 568 Element mElement_MATRIX_4X4; 569 Element mElement_MATRIX_3X3; 570 Element mElement_MATRIX_2X2; 571 572 Sampler mSampler_CLAMP_NEAREST; 573 Sampler mSampler_CLAMP_LINEAR; 574 Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR; 575 Sampler mSampler_WRAP_NEAREST; 576 Sampler mSampler_WRAP_LINEAR; 577 Sampler mSampler_WRAP_LINEAR_MIP_LINEAR; 578 579 ProgramStore mProgramStore_BLEND_NONE_DEPTH_TEST; 580 ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH; 581 ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_TEST; 582 ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_WRITE; 583 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_TEST; 584 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH; 585 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_TEST; 586 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_WRITE; 587 ProgramStore mProgramStore_BLEND_ADD_DEPTH_TEST; 588 ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_DEPTH; 589 ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_TEST; 590 ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_WRITE; 591 592 ProgramRaster mProgramRaster_CULL_BACK; 593 ProgramRaster mProgramRaster_CULL_FRONT; 594 ProgramRaster mProgramRaster_CULL_NONE; 595 596 /////////////////////////////////////////////////////////////////////////////////// 597 // 598 599 /** 600 * Base class application should derive from for handling RS messages 601 * comming from their scripts. When a script calls sendToClient the data 602 * fields will be filled in and then the run method called by a message 603 * handling thread. This will occur some time after sendToClient completes 604 * in the script. 605 * 606 */ 607 public static class RSMessage implements Runnable { 608 protected int[] mData; 609 protected int mID; 610 protected int mLength; 611 public void run() { 612 } 613 } 614 /** 615 * If an application is expecting messages it should set this field to an 616 * instance of RSMessage. This instance will receive all the user messages 617 * sent from sendToClient by scripts from this context. 618 * 619 */ 620 public RSMessage mMessageCallback = null; 621 622 /** 623 * Runtime error base class. An application should derive from this class 624 * if it wishes to install an error handler. When errors occur at runtime 625 * the fields in this class will be filled and the run method called. 626 * 627 */ 628 public static class RSAsyncError implements Runnable { 629 protected String mErrorMessage; 630 protected int mErrorNum; 631 public void run() { 632 } 633 } 634 635 /** 636 * Application Error handler. All runtime errors will be dispatched to the 637 * instance of RSAsyncError set here. If this field is null a 638 * RSRuntimeException will instead be thrown with details about the error. 639 * This will cause program termaination. 640 * 641 */ 642 public RSAsyncError mErrorCallback = null; 643 644 /** 645 * RenderScript worker threads priority enumeration. The default value is 646 * NORMAL. Applications wishing to do background processing such as 647 * wallpapers should set their priority to LOW to avoid starving forground 648 * processes. 649 */ 650 public enum Priority { 651 LOW (5), //ANDROID_PRIORITY_BACKGROUND + 5 652 NORMAL (-4); //ANDROID_PRIORITY_DISPLAY 653 654 int mID; 655 Priority(int id) { 656 mID = id; 657 } 658 } 659 660 void validate() { 661 if (mContext == 0) { 662 throw new RSInvalidStateException("Calling RS with no Context active."); 663 } 664 } 665 666 667 /** 668 * Change the priority of the worker threads for this context. 669 * 670 * @param p New priority to be set. 671 */ 672 public void contextSetPriority(Priority p) { 673 validate(); 674 nContextSetPriority(p.mID); 675 } 676 677 protected static class MessageThread extends Thread { 678 RenderScript mRS; 679 boolean mRun = true; 680 int[] auxData = new int[2]; 681 682 public static final int RS_MESSAGE_TO_CLIENT_NONE = 0; 683 public static final int RS_MESSAGE_TO_CLIENT_EXCEPTION = 1; 684 public static final int RS_MESSAGE_TO_CLIENT_RESIZE = 2; 685 public static final int RS_MESSAGE_TO_CLIENT_ERROR = 3; 686 public static final int RS_MESSAGE_TO_CLIENT_USER = 4; 687 688 MessageThread(RenderScript rs) { 689 super("RSMessageThread"); 690 mRS = rs; 691 692 } 693 694 public void run() { 695 // This function is a temporary solution. The final solution will 696 // used typed allocations where the message id is the type indicator. 697 int[] rbuf = new int[16]; 698 mRS.nContextInitToClient(mRS.mContext); 699 while(mRun) { 700 rbuf[0] = 0; 701 int msg = mRS.nContextPeekMessage(mRS.mContext, auxData, true); 702 int size = auxData[1]; 703 int subID = auxData[0]; 704 705 if (msg == RS_MESSAGE_TO_CLIENT_USER) { 706 if ((size>>2) >= rbuf.length) { 707 rbuf = new int[(size + 3) >> 2]; 708 } 709 mRS.nContextGetUserMessage(mRS.mContext, rbuf); 710 711 if(mRS.mMessageCallback != null) { 712 mRS.mMessageCallback.mData = rbuf; 713 mRS.mMessageCallback.mID = subID; 714 mRS.mMessageCallback.mLength = size; 715 mRS.mMessageCallback.run(); 716 } else { 717 throw new RSInvalidStateException("Received a message from the script with no message handler installed."); 718 } 719 continue; 720 } 721 722 if (msg == RS_MESSAGE_TO_CLIENT_ERROR) { 723 String e = mRS.nContextGetErrorMessage(mRS.mContext); 724 725 if(mRS.mErrorCallback != null) { 726 mRS.mErrorCallback.mErrorMessage = e; 727 mRS.mErrorCallback.mErrorNum = subID; 728 mRS.mErrorCallback.run(); 729 } else { 730 //throw new RSRuntimeException("Received error num " + subID + ", details: " + e); 731 } 732 continue; 733 } 734 735 // 2: teardown. 736 // But we want to avoid starving other threads during 737 // teardown by yielding until the next line in the destructor 738 // can execute to set mRun = false 739 try { 740 sleep(1, 0); 741 } catch(InterruptedException e) { 742 } 743 } 744 Log.d(LOG_TAG, "MessageThread exiting."); 745 } 746 } 747 748 RenderScript() { 749 } 750 751 /** 752 * Create a basic RenderScript context. 753 * 754 * 755 * @return RenderScript 756 */ 757 public static RenderScript create() { 758 RenderScript rs = new RenderScript(); 759 760 rs.mDev = rs.nDeviceCreate(); 761 rs.mContext = rs.nContextCreate(rs.mDev, 0); 762 rs.mMessageThread = new MessageThread(rs); 763 rs.mMessageThread.start(); 764 Element.initPredefined(rs); 765 return rs; 766 } 767 768 /** 769 * Print the currently available debugging information about the state of 770 * the RS context to the log. 771 * 772 * 773 * @param bits Currently ignored. 774 */ 775 public void contextDump(int bits) { 776 validate(); 777 nContextDump(bits); 778 } 779 780 /** 781 * Wait for any commands in the fifo between the java bindings and native to 782 * be processed. 783 * 784 */ 785 public void finish() { 786 nContextFinish(); 787 } 788 789 /** 790 * Destroy this renderscript context. Once this function is called its no 791 * longer legal to use this or any objects created by this context. 792 * 793 */ 794 public void destroy() { 795 validate(); 796 nContextDeinitToClient(mContext); 797 mMessageThread.mRun = false; 798 try { 799 mMessageThread.join(); 800 } catch(InterruptedException e) { 801 } 802 803 nContextDestroy(); 804 mContext = 0; 805 806 nDeviceDestroy(mDev); 807 mDev = 0; 808 } 809 810 boolean isAlive() { 811 return mContext != 0; 812 } 813 814 protected int safeID(BaseObj o) { 815 if(o != null) { 816 return o.getID(); 817 } 818 return 0; 819 } 820} 821