RenderScript.java revision ebfb436a49673693b98469683451bd9ede797557
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 = "libRS_jni"; 34 private static final boolean DEBUG = false; 35 @SuppressWarnings({"UnusedDeclaration", "deprecation"}) 36 private 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 private static boolean sInitialized; 46 native private 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 nContextCreate(int dev, Surface sur, int ver, boolean useDepth); 66 native void nContextDestroy(int con); 67 68 //void rsContextBindSampler (uint32_t slot, RsSampler sampler); 69 //void rsContextBindRootScript (RsScript sampler); 70 native void nContextBindRootScript(int script); 71 native void nContextBindSampler(int sampler, int slot); 72 native void nContextBindProgramFragmentStore(int pfs); 73 native void nContextBindProgramFragment(int pf); 74 native void nContextBindProgramVertex(int pf); 75 native void nContextBindProgramRaster(int pr); 76 native void nContextAddDefineI32(String name, int value); 77 native void nContextAddDefineF(String name, float value); 78 79 native void nAssignName(int obj, byte[] name); 80 native void nObjDestroy(int id); 81 native void nObjDestroyOOB(int id); 82 native int nFileOpen(byte[] name); 83 84 native void nElementBegin(); 85 native void nElementAdd(int kind, int type, boolean norm, int bits, String s); 86 native int nElementCreate(); 87 88 native void nTypeBegin(int elementID); 89 native void nTypeAdd(int dim, int val); 90 native int nTypeCreate(); 91 native void nTypeFinalDestroy(Type t); 92 native void nTypeSetupFields(Type t, int[] types, int[] bits, Field[] IDs); 93 94 native int nAllocationCreateTyped(int type); 95 //native int nAllocationCreateSized(int elem, int count); 96 native int nAllocationCreateFromBitmap(int dstFmt, boolean genMips, Bitmap bmp); 97 native int nAllocationCreateFromBitmapBoxed(int dstFmt, boolean genMips, Bitmap bmp); 98 native int nAllocationCreateFromAssetStream(int dstFmt, boolean genMips, int assetStream); 99 100 native void nAllocationUploadToTexture(int alloc, int baseMioLevel); 101 native void nAllocationUploadToBufferObject(int alloc); 102 103 native void nAllocationSubData1D(int id, int off, int count, int[] d, int sizeBytes); 104 native void nAllocationSubData1D(int id, int off, int count, short[] d, int sizeBytes); 105 native void nAllocationSubData1D(int id, int off, int count, byte[] d, int sizeBytes); 106 native void nAllocationSubData1D(int id, int off, int count, float[] d, int sizeBytes); 107 108 native void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, int[] d, int sizeBytes); 109 native void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, float[] d, int sizeBytes); 110 native void nAllocationRead(int id, int[] d); 111 native void nAllocationRead(int id, float[] d); 112 native void nAllocationSubDataFromObject(int id, Type t, int offset, Object o); 113 native void nAllocationSubReadFromObject(int id, Type t, int offset, Object o); 114 115 native void nTriangleMeshBegin(int vertex, int index); 116 native void nTriangleMeshAddVertex_XY (float x, float y); 117 native void nTriangleMeshAddVertex_XYZ (float x, float y, float z); 118 native void nTriangleMeshAddVertex_XY_ST (float x, float y, float s, float t); 119 native void nTriangleMeshAddVertex_XYZ_ST (float x, float y, float z, float s, float t); 120 native void nTriangleMeshAddVertex_XYZ_ST_NORM (float x, float y, float z, float s, float t, float nx, float ny, float nz); 121 native void nTriangleMeshAddTriangle(int i1, int i2, int i3); 122 native int nTriangleMeshCreate(); 123 124 native void nAdapter1DBindAllocation(int ad, int alloc); 125 native void nAdapter1DSetConstraint(int ad, int dim, int value); 126 native void nAdapter1DData(int ad, int[] d); 127 native void nAdapter1DData(int ad, float[] d); 128 native void nAdapter1DSubData(int ad, int off, int count, int[] d); 129 native void nAdapter1DSubData(int ad, int off, int count, float[] d); 130 native int nAdapter1DCreate(); 131 132 native void nAdapter2DBindAllocation(int ad, int alloc); 133 native void nAdapter2DSetConstraint(int ad, int dim, int value); 134 native void nAdapter2DData(int ad, int[] d); 135 native void nAdapter2DData(int ad, float[] d); 136 native void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, int[] d); 137 native void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, float[] d); 138 native int nAdapter2DCreate(); 139 140 native void nScriptBindAllocation(int script, int alloc, int slot); 141 native void nScriptSetClearColor(int script, float r, float g, float b, float a); 142 native void nScriptSetClearDepth(int script, float depth); 143 native void nScriptSetClearStencil(int script, int stencil); 144 native void nScriptSetTimeZone(int script, byte[] timeZone); 145 native void nScriptSetType(int type, boolean writable, String name, int slot); 146 native void nScriptSetRoot(boolean isRoot); 147 native void nScriptSetInvokable(String name, int slot); 148 native void nScriptInvoke(int id, int slot); 149 150 native void nScriptCBegin(); 151 native void nScriptCSetScript(byte[] script, int offset, int length); 152 native int nScriptCCreate(); 153 native void nScriptCAddDefineI32(String name, int value); 154 native void nScriptCAddDefineF(String name, float value); 155 156 native void nSamplerBegin(); 157 native void nSamplerSet(int param, int value); 158 native int nSamplerCreate(); 159 160 native void nProgramFragmentStoreBegin(int in, int out); 161 native void nProgramFragmentStoreDepthFunc(int func); 162 native void nProgramFragmentStoreDepthMask(boolean enable); 163 native void nProgramFragmentStoreColorMask(boolean r, boolean g, boolean b, boolean a); 164 native void nProgramFragmentStoreBlendFunc(int src, int dst); 165 native void nProgramFragmentStoreDither(boolean enable); 166 native int nProgramFragmentStoreCreate(); 167 168 native int nProgramRasterCreate(int in, int out, boolean pointSmooth, boolean lineSmooth, boolean pointSprite); 169 native void nProgramRasterSetLineWidth(int pr, float v); 170 native void nProgramRasterSetPointSize(int pr, float v); 171 172 native void nProgramFragmentBegin(int in, int out, boolean pointSpriteEnable); 173 native void nProgramFragmentBindTexture(int vpf, int slot, int a); 174 native void nProgramFragmentBindSampler(int vpf, int slot, int s); 175 native void nProgramFragmentSetSlot(int slot, boolean enable, int env, int vt); 176 native int nProgramFragmentCreate(); 177 178 native void nProgramVertexBindAllocation(int pv, int mID); 179 native void nProgramVertexBegin(int inID, int outID); 180 native void nProgramVertexSetTextureMatrixEnable(boolean enable); 181 native void nProgramVertexAddLight(int id); 182 native int nProgramVertexCreate(); 183 184 native void nLightBegin(); 185 native void nLightSetIsMono(boolean isMono); 186 native void nLightSetIsLocal(boolean isLocal); 187 native int nLightCreate(); 188 native void nLightSetColor(int l, float r, float g, float b); 189 native void nLightSetPosition(int l, float x, float y, float z); 190 191 native int nSimpleMeshCreate(int batchID, int idxID, int[] vtxID, int prim); 192 native void nSimpleMeshBindVertex(int id, int alloc, int slot); 193 native void nSimpleMeshBindIndex(int id, int alloc); 194 195 native void nAnimationBegin(int attribCount, int keyframeCount); 196 native void nAnimationAdd(float time, float[] attribs); 197 native int nAnimationCreate(); 198 199 private int mDev; 200 private int mContext; 201 @SuppressWarnings({"FieldCanBeLocal"}) 202 private Surface mSurface; 203 204 private static boolean mElementsInitialized = false; 205 206 /////////////////////////////////////////////////////////////////////////////////// 207 // 208 209 public RenderScript(Surface sur, boolean useDepth, boolean forceSW) { 210 mSurface = sur; 211 mDev = nDeviceCreate(); 212 if(forceSW) { 213 nDeviceSetConfig(mDev, 0, 1); 214 } 215 mContext = nContextCreate(mDev, mSurface, 0, useDepth); 216 217 // TODO: This should be protected by a lock 218 if(!mElementsInitialized) { 219 Element.initPredefined(this); 220 mElementsInitialized = true; 221 } 222 } 223 224 public void destroy() { 225 nContextDestroy(mContext); 226 mContext = 0; 227 228 nDeviceDestroy(mDev); 229 mDev = 0; 230 } 231 232 ////////////////////////////////////////////////////////////////////////////////// 233 // Triangle Mesh 234 235 public class TriangleMesh extends BaseObj { 236 TriangleMesh(int id) { 237 super(RenderScript.this); 238 mID = id; 239 } 240 } 241 242 public void triangleMeshBegin(Element vertex, Element index) { 243 nTriangleMeshBegin(vertex.mID, index.mID); 244 } 245 246 public void triangleMeshAddVertex_XY(float x, float y) { 247 nTriangleMeshAddVertex_XY(x, y); 248 } 249 250 public void triangleMeshAddVertex_XYZ(float x, float y, float z) { 251 nTriangleMeshAddVertex_XYZ(x, y, z); 252 } 253 254 public void triangleMeshAddVertex_XY_ST(float x, float y, float s, float t) { 255 nTriangleMeshAddVertex_XY_ST(x, y, s, t); 256 } 257 258 public void triangleMeshAddVertex_XYZ_ST(float x, float y, float z, float s, float t) { 259 nTriangleMeshAddVertex_XYZ_ST(x, y, z, s, t); 260 } 261 262 public void triangleMeshAddVertex_XYZ_ST_NORM(float x, float y, float z, float s, float t, float nx, float ny, float nz) { 263 nTriangleMeshAddVertex_XYZ_ST_NORM(x, y, z, s, t, nx, ny, nz); 264 } 265 266 public void triangleMeshAddTriangle(int i1, int i2, int i3) { 267 nTriangleMeshAddTriangle(i1, i2, i3); 268 } 269 270 public TriangleMesh triangleMeshCreate() { 271 int id = nTriangleMeshCreate(); 272 return new TriangleMesh(id); 273 } 274 275 ////////////////////////////////////////////////////////////////////////////////// 276 // File 277 278 public class File extends BaseObj { 279 File(int id) { 280 super(RenderScript.this); 281 mID = id; 282 } 283 } 284 285 public File fileOpen(String s) throws IllegalStateException, IllegalArgumentException 286 { 287 if(s.length() < 1) { 288 throw new IllegalArgumentException("fileOpen does not accept a zero length string."); 289 } 290 291 try { 292 byte[] bytes = s.getBytes("UTF-8"); 293 int id = nFileOpen(bytes); 294 return new File(id); 295 } catch (java.io.UnsupportedEncodingException e) { 296 throw new RuntimeException(e); 297 } 298 } 299 300 301 /////////////////////////////////////////////////////////////////////////////////// 302 // Root state 303 304 public void contextBindRootScript(Script s) { 305 int id = 0; 306 if(s != null) { 307 id = s.mID; 308 } 309 nContextBindRootScript(id); 310 } 311 312 //public void contextBindSampler(Sampler s, int slot) { 313 //nContextBindSampler(s.mID); 314 //} 315 316 public void contextBindProgramFragmentStore(ProgramStore pfs) { 317 nContextBindProgramFragmentStore(pfs.mID); 318 } 319 320 public void contextBindProgramFragment(ProgramFragment pf) { 321 nContextBindProgramFragment(pf.mID); 322 } 323 324 public void contextBindProgramRaster(ProgramRaster pf) { 325 nContextBindProgramRaster(pf.mID); 326 } 327 328 public void contextBindProgramVertex(ProgramVertex pf) { 329 nContextBindProgramVertex(pf.mID); 330 } 331 332} 333 334 335