RenderScript.java revision 54db59c3594e887a412a24713fc3daa1c2404593
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 **/ 32public class RenderScript { 33 static final String LOG_TAG = "RenderScript_jni"; 34 protected static final boolean DEBUG = false; 35 @SuppressWarnings({"UnusedDeclaration", "deprecation"}) 36 protected static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV; 37 38 39 40 /* 41 * We use a class initializer to allow the native code to cache some 42 * field offsets. 43 */ 44 @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"}) 45 protected static boolean sInitialized; 46 native protected static void _nInit(); 47 48 49 static { 50 sInitialized = false; 51 try { 52 System.loadLibrary("rs_jni"); 53 _nInit(); 54 sInitialized = true; 55 } catch (UnsatisfiedLinkError e) { 56 Log.d(LOG_TAG, "RenderScript JNI library not found!"); 57 } 58 } 59 60 native void nInitElements(int a8, int rgba4444, int rgba8888, int rgb565); 61 62 native int nDeviceCreate(); 63 native void nDeviceDestroy(int dev); 64 native void nDeviceSetConfig(int dev, int param, int value); 65 native int nContextCreateGL(int dev, int ver, boolean useDepth); 66 native int nContextCreate(int dev, int ver); 67 native void nContextDestroy(int con); 68 native void nContextSetSurface(int w, int h, Surface sur); 69 native void nContextSetPriority(int p); 70 native void nContextDump(int bits); 71 72 native void nContextBindRootScript(int script); 73 native void nContextBindSampler(int sampler, int slot); 74 native void nContextBindProgramStore(int pfs); 75 native void nContextBindProgramFragment(int pf); 76 native void nContextBindProgramVertex(int pf); 77 native void nContextBindProgramRaster(int pr); 78 native void nContextPause(); 79 native void nContextResume(); 80 native int nContextGetMessage(int[] data, boolean wait); 81 native void nContextInitToClient(); 82 native void nContextDeinitToClient(); 83 84 native void nAssignName(int obj, byte[] name); 85 native void nObjDestroy(int id); 86 native void nObjDestroyOOB(int id); 87 native int nFileOpen(byte[] name); 88 89 90 native int nElementCreate(int type, int kind, boolean norm, int vecSize); 91 native int nElementCreate2(int[] elements, String[] names); 92 93 native void nTypeBegin(int elementID); 94 native void nTypeAdd(int dim, int val); 95 native int nTypeCreate(); 96 native void nTypeFinalDestroy(Type t); 97 native void nTypeSetupFields(Type t, int[] types, int[] bits, Field[] IDs); 98 99 native int nAllocationCreateTyped(int type); 100 native int nAllocationCreateFromBitmap(int dstFmt, boolean genMips, Bitmap bmp); 101 native int nAllocationCreateBitmapRef(int type, Bitmap bmp); 102 native int nAllocationCreateFromBitmapBoxed(int dstFmt, boolean genMips, Bitmap bmp); 103 native int nAllocationCreateFromAssetStream(int dstFmt, boolean genMips, int assetStream); 104 105 native void nAllocationUploadToTexture(int alloc, boolean genMips, int baseMioLevel); 106 native void nAllocationUploadToBufferObject(int alloc); 107 108 native void nAllocationSubData1D(int id, int off, int count, int[] d, int sizeBytes); 109 native void nAllocationSubData1D(int id, int off, int count, short[] d, int sizeBytes); 110 native void nAllocationSubData1D(int id, int off, int count, byte[] d, int sizeBytes); 111 native void nAllocationSubData1D(int id, int off, int count, float[] d, int sizeBytes); 112 113 native void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, int[] d, int sizeBytes); 114 native void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, float[] d, int sizeBytes); 115 native void nAllocationRead(int id, int[] d); 116 native void nAllocationRead(int id, float[] d); 117 native void nAllocationSubDataFromObject(int id, Type t, int offset, Object o); 118 native void nAllocationSubReadFromObject(int id, Type t, int offset, Object o); 119 120 native void nAdapter1DBindAllocation(int ad, int alloc); 121 native void nAdapter1DSetConstraint(int ad, int dim, int value); 122 native void nAdapter1DData(int ad, int[] d); 123 native void nAdapter1DData(int ad, float[] d); 124 native void nAdapter1DSubData(int ad, int off, int count, int[] d); 125 native void nAdapter1DSubData(int ad, int off, int count, float[] d); 126 native int nAdapter1DCreate(); 127 128 native void nAdapter2DBindAllocation(int ad, int alloc); 129 native void nAdapter2DSetConstraint(int ad, int dim, int value); 130 native void nAdapter2DData(int ad, int[] d); 131 native void nAdapter2DData(int ad, float[] d); 132 native void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, int[] d); 133 native void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, float[] d); 134 native int nAdapter2DCreate(); 135 136 native void nScriptBindAllocation(int script, int alloc, int slot); 137 native void nScriptSetClearColor(int script, float r, float g, float b, float a); 138 native void nScriptSetClearDepth(int script, float depth); 139 native void nScriptSetClearStencil(int script, int stencil); 140 native void nScriptSetTimeZone(int script, byte[] timeZone); 141 native void nScriptSetRoot(boolean isRoot); 142 native void nScriptInvoke(int id, int slot); 143 native void nScriptInvokeData(int id, int slot); 144 native void nScriptInvokeV(int id, int slot, byte[] params); 145 native void nScriptSetVarI(int id, int slot, int val); 146 native void nScriptSetVarF(int id, int slot, float val); 147 native void nScriptSetVarV(int id, int slot, byte[] val); 148 149 native void nScriptCBegin(); 150 native void nScriptCSetScript(byte[] script, int offset, int length); 151 native int nScriptCCreate(); 152 153 native void nSamplerBegin(); 154 native void nSamplerSet(int param, int value); 155 native int nSamplerCreate(); 156 157 native void nProgramStoreBegin(int in, int out); 158 native void nProgramStoreDepthFunc(int func); 159 native void nProgramStoreDepthMask(boolean enable); 160 native void nProgramStoreColorMask(boolean r, boolean g, boolean b, boolean a); 161 native void nProgramStoreBlendFunc(int src, int dst); 162 native void nProgramStoreDither(boolean enable); 163 native int nProgramStoreCreate(); 164 165 native int nProgramRasterCreate(int in, int out, boolean pointSmooth, boolean lineSmooth, boolean pointSprite); 166 native void nProgramRasterSetLineWidth(int pr, float v); 167 native void nProgramRasterSetPointSize(int pr, float v); 168 169 native void nProgramBindConstants(int pv, int slot, int mID); 170 native void nProgramBindTexture(int vpf, int slot, int a); 171 native void nProgramBindSampler(int vpf, int slot, int s); 172 173 native int nProgramFragmentCreate(int[] params); 174 native int nProgramFragmentCreate2(String shader, int[] params); 175 176 native int nProgramVertexCreate(boolean texMat); 177 native int nProgramVertexCreate2(String shader, int[] params); 178 179 native void nLightBegin(); 180 native void nLightSetIsMono(boolean isMono); 181 native void nLightSetIsLocal(boolean isLocal); 182 native int nLightCreate(); 183 native void nLightSetColor(int l, float r, float g, float b); 184 native void nLightSetPosition(int l, float x, float y, float z); 185 186 native int nSimpleMeshCreate(int batchID, int idxID, int[] vtxID, int prim); 187 native void nSimpleMeshBindVertex(int id, int alloc, int slot); 188 native void nSimpleMeshBindIndex(int id, int alloc); 189 190 native void nAnimationBegin(int attribCount, int keyframeCount); 191 native void nAnimationAdd(float time, float[] attribs); 192 native int nAnimationCreate(); 193 194 protected int mDev; 195 protected int mContext; 196 @SuppressWarnings({"FieldCanBeLocal"}) 197 protected MessageThread mMessageThread; 198 199 Element mElement_USER_U8; 200 Element mElement_USER_I8; 201 Element mElement_USER_U16; 202 Element mElement_USER_I16; 203 Element mElement_USER_U32; 204 Element mElement_USER_I32; 205 Element mElement_USER_F32; 206 207 Element mElement_USER_ELEMENT; 208 Element mElement_USER_TYPE; 209 Element mElement_USER_ALLOCATION; 210 Element mElement_USER_SAMPLER; 211 Element mElement_USER_SCRIPT; 212 Element mElement_USER_MESH; 213 Element mElement_USER_PROGRAM_FRAGMENT; 214 Element mElement_USER_PROGRAM_VERTEX; 215 Element mElement_USER_PROGRAM_RASTER; 216 Element mElement_USER_PROGRAM_STORE; 217 218 Element mElement_A_8; 219 Element mElement_RGB_565; 220 Element mElement_RGB_888; 221 Element mElement_RGBA_5551; 222 Element mElement_RGBA_4444; 223 Element mElement_RGBA_8888; 224 225 Element mElement_INDEX_16; 226 Element mElement_POSITION_2; 227 Element mElement_POSITION_3; 228 Element mElement_TEXTURE_2; 229 Element mElement_NORMAL_3; 230 Element mElement_COLOR_U8_4; 231 Element mElement_COLOR_F32_4; 232 233 Sampler mSampler_CLAMP_NEAREST; 234 Sampler mSampler_CLAMP_LINEAR; 235 Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR; 236 Sampler mSampler_WRAP_NEAREST; 237 Sampler mSampler_WRAP_LINEAR; 238 Sampler mSampler_WRAP_LINEAR_MIP_LINEAR; 239 240 /////////////////////////////////////////////////////////////////////////////////// 241 // 242 243 public static class RSMessage implements Runnable { 244 protected int[] mData; 245 protected int mID; 246 public void run() { 247 } 248 } 249 public RSMessage mMessageCallback = null; 250 251 public enum Priority { 252 LOW (5), //ANDROID_PRIORITY_BACKGROUND + 5 253 NORMAL (-4); //ANDROID_PRIORITY_DISPLAY 254 255 int mID; 256 Priority(int id) { 257 mID = id; 258 } 259 } 260 261 void validate() { 262 if (mContext == 0) { 263 throw new IllegalStateException("Calling RS with no Context active."); 264 } 265 } 266 267 public void contextSetPriority(Priority p) { 268 validate(); 269 nContextSetPriority(p.mID); 270 } 271 272 protected static class MessageThread extends Thread { 273 RenderScript mRS; 274 boolean mRun = true; 275 276 MessageThread(RenderScript rs) { 277 super("RSMessageThread"); 278 mRS = rs; 279 280 } 281 282 public void run() { 283 // This function is a temporary solution. The final solution will 284 // used typed allocations where the message id is the type indicator. 285 int[] rbuf = new int[16]; 286 mRS.nContextInitToClient(); 287 while(mRun) { 288 int msg = mRS.nContextGetMessage(rbuf, true); 289 if (msg == 0) { 290 // Should only happen during teardown. 291 // But we want to avoid starving other threads during 292 // teardown by yielding until the next line in the destructor 293 // can execute to set mRun = false 294 try { 295 sleep(1, 0); 296 } catch(InterruptedException e) { 297 } 298 } 299 if(mRS.mMessageCallback != null) { 300 mRS.mMessageCallback.mData = rbuf; 301 mRS.mMessageCallback.mID = msg; 302 mRS.mMessageCallback.run(); 303 } 304 } 305 Log.d(LOG_TAG, "MessageThread exiting."); 306 } 307 } 308 309 protected RenderScript() { 310 } 311 312 public static RenderScript create() { 313 RenderScript rs = new RenderScript(); 314 315 rs.mDev = rs.nDeviceCreate(); 316 rs.mContext = rs.nContextCreate(rs.mDev, 0); 317 rs.mMessageThread = new MessageThread(rs); 318 rs.mMessageThread.start(); 319 Element.initPredefined(rs); 320 return rs; 321 } 322 323 public void contextDump(int bits) { 324 validate(); 325 nContextDump(bits); 326 } 327 328 public void destroy() { 329 validate(); 330 nContextDeinitToClient(); 331 mMessageThread.mRun = false; 332 333 nContextDestroy(mContext); 334 mContext = 0; 335 336 nDeviceDestroy(mDev); 337 mDev = 0; 338 } 339 340 boolean isAlive() { 341 return mContext != 0; 342 } 343 344 /////////////////////////////////////////////////////////////////////////////////// 345 // Root state 346 347 protected int safeID(BaseObj o) { 348 if(o != null) { 349 return o.mID; 350 } 351 return 0; 352 } 353} 354 355 356