RenderScript.java revision fbf0b9ecda03fbdbd4ebabfd18da09a789686249
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.io.IOException; 20import java.io.InputStream; 21import java.lang.reflect.Field; 22 23import android.content.res.Resources; 24import android.graphics.Bitmap; 25import android.renderscript.Type; 26import android.util.Config; 27import android.util.Log; 28import android.view.Surface; 29 30 31/** 32 * @hide 33 * 34 **/ 35public class RenderScript { 36 static final String LOG_TAG = "libRS_jni"; 37 private static final boolean DEBUG = false; 38 private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV; 39 40 41 42 /* 43 * We use a class initializer to allow the native code to cache some 44 * field offsets. 45 */ 46 private static boolean sInitialized; 47 native private static void _nInit(); 48 49 50 static { 51 sInitialized = false; 52 try { 53 System.loadLibrary("rs_jni"); 54 _nInit(); 55 sInitialized = true; 56 } catch (UnsatisfiedLinkError e) { 57 Log.d(LOG_TAG, "RenderScript JNI library not found!"); 58 } 59 } 60 61 native int nDeviceCreate(); 62 native void nDeviceDestroy(int dev); 63 native int nContextCreate(int dev, Surface sur, int ver); 64 native void nContextDestroy(int con); 65 66 //void rsContextBindSampler (uint32_t slot, RsSampler sampler); 67 //void rsContextBindRootScript (RsScript sampler); 68 native void nContextBindRootScript(int script); 69 native void nContextBindSampler(int sampler, int slot); 70 native void nContextBindProgramFragmentStore(int pfs); 71 native void nContextBindProgramFragment(int pf); 72 native void nContextBindProgramVertex(int pf); 73 native void nContextAddDefineI32(String name, int value); 74 native void nContextAddDefineF(String name, float value); 75 76 native void nAssignName(int obj, byte[] name); 77 native int nFileOpen(byte[] name); 78 79 native void nElementBegin(); 80 native void nElementAddPredefined(int predef); 81 native void nElementAdd(int kind, int type, int norm, int bits, String s); 82 native int nElementCreate(); 83 native int nElementGetPredefined(int predef); 84 native void nElementDestroy(int obj); 85 86 native void nTypeBegin(int elementID); 87 native void nTypeAdd(int dim, int val); 88 native int nTypeCreate(); 89 native void nTypeDestroy(int id); 90 native void nTypeFinalDestroy(Type t); 91 native void nTypeSetupFields(Type t, int[] types, int[] bits, Field[] IDs); 92 93 native int nAllocationCreateTyped(int type); 94 native int nAllocationCreatePredefSized(int predef, int count); 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 99 native void nAllocationUploadToTexture(int alloc, int baseMioLevel); 100 native void nAllocationDestroy(int alloc); 101 native void nAllocationData(int id, int[] d); 102 native void nAllocationData(int id, float[] d); 103 native void nAllocationSubData1D(int id, int off, int count, int[] d); 104 native void nAllocationSubData1D(int id, int off, int count, float[] d); 105 native void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, int[] d); 106 native void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, float[] d); 107 native void nAllocationRead(int id, int[] d); 108 native void nAllocationRead(int id, float[] d); 109 native void nAllocationDataFromObject(int id, Type t, Object o); 110 111 native void nTriangleMeshDestroy(int id); 112 native void nTriangleMeshBegin(int vertex, int index); 113 native void nTriangleMeshAddVertex_XY (float x, float y); 114 native void nTriangleMeshAddVertex_XYZ (float x, float y, float z); 115 native void nTriangleMeshAddVertex_XY_ST (float x, float y, float s, float t); 116 native void nTriangleMeshAddVertex_XYZ_ST (float x, float y, float z, float s, float t); 117 native void nTriangleMeshAddVertex_XYZ_ST_NORM (float x, float y, float z, float s, float t, float nx, float ny, float nz); 118 native void nTriangleMeshAddTriangle(int i1, int i2, int i3); 119 native int nTriangleMeshCreate(); 120 121 native void nAdapter1DDestroy(int id); 122 native void nAdapter1DBindAllocation(int ad, int alloc); 123 native void nAdapter1DSetConstraint(int ad, int dim, int value); 124 native void nAdapter1DData(int ad, int[] d); 125 native void nAdapter1DData(int ad, float[] d); 126 native void nAdapter1DSubData(int ad, int off, int count, int[] d); 127 native void nAdapter1DSubData(int ad, int off, int count, float[] d); 128 native int nAdapter1DCreate(); 129 130 native void nAdapter2DDestroy(int id); 131 native void nAdapter2DBindAllocation(int ad, int alloc); 132 native void nAdapter2DSetConstraint(int ad, int dim, int value); 133 native void nAdapter2DData(int ad, int[] d); 134 native void nAdapter2DData(int ad, float[] d); 135 native void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, int[] d); 136 native void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, float[] d); 137 native int nAdapter2DCreate(); 138 139 native void nScriptDestroy(int script); 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, String name, int slot); 146 native void nScriptSetRoot(boolean isRoot); 147 148 native void nScriptCBegin(); 149 native void nScriptCSetScript(byte[] script, int offset, int length); 150 native int nScriptCCreate(); 151 native void nScriptCAddDefineI32(String name, int value); 152 native void nScriptCAddDefineF(String name, float value); 153 154 native void nSamplerDestroy(int sampler); 155 native void nSamplerBegin(); 156 native void nSamplerSet(int param, int value); 157 native int nSamplerCreate(); 158 159 native void nProgramFragmentStoreBegin(int in, int out); 160 native void nProgramFragmentStoreDepthFunc(int func); 161 native void nProgramFragmentStoreDepthMask(boolean enable); 162 native void nProgramFragmentStoreColorMask(boolean r, boolean g, boolean b, boolean a); 163 native void nProgramFragmentStoreBlendFunc(int src, int dst); 164 native void nProgramFragmentStoreDither(boolean enable); 165 native int nProgramFragmentStoreCreate(); 166 native void nProgramFragmentStoreDestroy(int pgm); 167 168 native void nProgramFragmentBegin(int in, int out); 169 native void nProgramFragmentBindTexture(int vpf, int slot, int a); 170 native void nProgramFragmentBindSampler(int vpf, int slot, int s); 171 native void nProgramFragmentSetType(int slot, int vt); 172 native void nProgramFragmentSetEnvMode(int slot, int env); 173 native void nProgramFragmentSetTexEnable(int slot, boolean enable); 174 native int nProgramFragmentCreate(); 175 native void nProgramFragmentDestroy(int pgm); 176 177 native void nProgramVertexDestroy(int pv); 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 nLightDestroy(int l); 189 native void nLightSetColor(int l, float r, float g, float b); 190 native void nLightSetPosition(int l, float x, float y, float z); 191 192 native void nSimpleMeshDestroy(int id); 193 native int nSimpleMeshCreate(int batchID, int idxID, int[] vtxID, int prim); 194 native void nSimpleMeshBindVertex(int id, int alloc, int slot); 195 native void nSimpleMeshBindIndex(int id, int alloc); 196 197 native void nAnimationDestroy(int id); 198 native void nAnimationBegin(int attribCount, int keyframeCount); 199 native void nAnimationAdd(float time, float[] attribs); 200 native int nAnimationCreate(); 201 202 private int mDev; 203 private int mContext; 204 private Surface mSurface; 205 206 private static boolean mElementsInitialized = false; 207 208 /////////////////////////////////////////////////////////////////////////////////// 209 // 210 211 public RenderScript(Surface sur) { 212 mSurface = sur; 213 mDev = nDeviceCreate(); 214 mContext = nContextCreate(mDev, mSurface, 0); 215 216 // TODO: This should be protected by a lock 217 if(!mElementsInitialized) { 218 Element.init(this); 219 mElementsInitialized = true; 220 } 221 } 222 223 224 ////////////////////////////////////////////////////////////////////////////////// 225 // Triangle Mesh 226 227 public class TriangleMesh extends BaseObj { 228 TriangleMesh(int id) { 229 super(RenderScript.this); 230 mID = id; 231 } 232 233 public void destroy() { 234 nTriangleMeshDestroy(mID); 235 mID = 0; 236 } 237 } 238 239 public void triangleMeshBegin(Element vertex, Element index) { 240 Log.e("rs", "vtx " + vertex.toString() + " " + vertex.mID + " " + vertex.mPredefinedID); 241 nTriangleMeshBegin(vertex.mID, index.mID); 242 } 243 244 public void triangleMeshAddVertex_XY(float x, float y) { 245 nTriangleMeshAddVertex_XY(x, y); 246 } 247 248 public void triangleMeshAddVertex_XYZ(float x, float y, float z) { 249 nTriangleMeshAddVertex_XYZ(x, y, z); 250 } 251 252 public void triangleMeshAddVertex_XY_ST(float x, float y, float s, float t) { 253 nTriangleMeshAddVertex_XY_ST(x, y, s, t); 254 } 255 256 public void triangleMeshAddVertex_XYZ_ST(float x, float y, float z, float s, float t) { 257 nTriangleMeshAddVertex_XYZ_ST(x, y, z, s, t); 258 } 259 260 public void triangleMeshAddVertex_XYZ_ST_NORM(float x, float y, float z, float s, float t, float nx, float ny, float nz) { 261 nTriangleMeshAddVertex_XYZ_ST_NORM(x, y, z, s, t, nx, ny, nz); 262 } 263 264 public void triangleMeshAddTriangle(int i1, int i2, int i3) { 265 nTriangleMeshAddTriangle(i1, i2, i3); 266 } 267 268 public TriangleMesh triangleMeshCreate() { 269 int id = nTriangleMeshCreate(); 270 return new TriangleMesh(id); 271 } 272 273 ////////////////////////////////////////////////////////////////////////////////// 274 // File 275 276 public class File extends BaseObj { 277 File(int id) { 278 super(RenderScript.this); 279 mID = id; 280 } 281 282 public void destroy() { 283 //nLightDestroy(mID); 284 mID = 0; 285 } 286 } 287 288 public File fileOpen(String s) throws IllegalStateException, IllegalArgumentException 289 { 290 if(s.length() < 1) { 291 throw new IllegalArgumentException("fileOpen does not accept a zero length string."); 292 } 293 294 try { 295 byte[] bytes = s.getBytes("UTF-8"); 296 int id = nFileOpen(bytes); 297 return new File(id); 298 } catch (java.io.UnsupportedEncodingException e) { 299 throw new RuntimeException(e); 300 } 301 } 302 303 304 /////////////////////////////////////////////////////////////////////////////////// 305 // Root state 306 307 public void contextBindRootScript(Script s) { 308 nContextBindRootScript(s.mID); 309 } 310 311 //public void contextBindSampler(Sampler s, int slot) { 312 //nContextBindSampler(s.mID); 313 //} 314 315 public void contextBindProgramFragmentStore(ProgramStore pfs) { 316 nContextBindProgramFragmentStore(pfs.mID); 317 } 318 319 public void contextBindProgramFragment(ProgramFragment pf) { 320 nContextBindProgramFragment(pf.mID); 321 } 322 323 public void contextBindProgramVertex(ProgramVertex pf) { 324 nContextBindProgramVertex(pf.mID); 325 } 326 327} 328 329 330