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