2009-05-26 13:45:08 -07:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2008 The Android Open Source Project
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2009-06-10 16:09:05 -07:00
|
|
|
package android.renderscript;
|
2009-05-26 13:45:08 -07:00
|
|
|
|
2009-08-12 17:54:11 -07:00
|
|
|
import java.lang.reflect.Field;
|
2009-07-31 16:26:13 -07:00
|
|
|
|
2009-07-31 20:40:47 -07:00
|
|
|
import android.graphics.Bitmap;
|
2009-08-31 14:06:43 -07:00
|
|
|
import android.graphics.BitmapFactory;
|
2009-07-31 16:26:13 -07:00
|
|
|
import android.util.Config;
|
|
|
|
import android.util.Log;
|
|
|
|
import android.view.Surface;
|
2009-05-28 13:38:16 -07:00
|
|
|
|
2009-05-26 13:45:08 -07:00
|
|
|
|
2009-07-23 15:19:03 -07:00
|
|
|
/**
|
|
|
|
* @hide
|
|
|
|
*
|
|
|
|
**/
|
2009-05-26 13:45:08 -07:00
|
|
|
public class RenderScript {
|
2009-11-12 15:10:25 -08:00
|
|
|
static final String LOG_TAG = "RenderScript_jni";
|
2010-02-09 16:05:07 -08:00
|
|
|
protected static final boolean DEBUG = false;
|
2009-08-31 14:06:43 -07:00
|
|
|
@SuppressWarnings({"UnusedDeclaration", "deprecation"})
|
2010-02-09 16:05:07 -08:00
|
|
|
protected static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
|
2009-05-26 13:45:08 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
2009-05-28 15:37:57 -07:00
|
|
|
/*
|
2009-05-26 13:45:08 -07:00
|
|
|
* We use a class initializer to allow the native code to cache some
|
|
|
|
* field offsets.
|
|
|
|
*/
|
2009-08-31 14:06:43 -07:00
|
|
|
@SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
|
2010-02-09 16:05:07 -08:00
|
|
|
protected static boolean sInitialized;
|
|
|
|
native protected static void _nInit();
|
2009-05-26 13:45:08 -07:00
|
|
|
|
2009-07-30 14:56:12 -07:00
|
|
|
|
2009-05-26 13:45:08 -07:00
|
|
|
static {
|
|
|
|
sInitialized = false;
|
|
|
|
try {
|
2009-07-23 15:19:03 -07:00
|
|
|
System.loadLibrary("rs_jni");
|
2009-05-26 13:45:08 -07:00
|
|
|
_nInit();
|
|
|
|
sInitialized = true;
|
|
|
|
} catch (UnsatisfiedLinkError e) {
|
|
|
|
Log.d(LOG_TAG, "RenderScript JNI library not found!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-08-17 16:25:41 -07:00
|
|
|
// Non-threadsafe functions.
|
2009-09-04 14:42:41 -07:00
|
|
|
native void nInitElements(int a8, int rgba4444, int rgba8888, int rgb565);
|
2009-07-31 16:26:13 -07:00
|
|
|
native int nDeviceCreate();
|
|
|
|
native void nDeviceDestroy(int dev);
|
2009-09-23 13:57:02 -07:00
|
|
|
native void nDeviceSetConfig(int dev, int param, int value);
|
2010-08-17 16:25:41 -07:00
|
|
|
native int nContextGetMessage(int con, int[] data, boolean wait);
|
|
|
|
native void nContextInitToClient(int con);
|
|
|
|
native void nContextDeinitToClient(int con);
|
|
|
|
|
|
|
|
|
|
|
|
// Methods below are wrapped to protect the non-threadsafe
|
|
|
|
// lockless fifo.
|
|
|
|
native int rsnContextCreateGL(int dev, int ver, boolean useDepth);
|
|
|
|
synchronized int nContextCreateGL(int dev, int ver, boolean useDepth) {
|
|
|
|
return rsnContextCreateGL(dev, ver, useDepth);
|
|
|
|
}
|
|
|
|
native int rsnContextCreate(int dev, int ver);
|
|
|
|
synchronized int nContextCreate(int dev, int ver) {
|
|
|
|
return rsnContextCreate(dev, ver);
|
|
|
|
}
|
|
|
|
native void rsnContextDestroy(int con);
|
|
|
|
synchronized void nContextDestroy() {
|
|
|
|
rsnContextDestroy(mContext);
|
|
|
|
}
|
|
|
|
native void rsnContextSetSurface(int con, int w, int h, Surface sur);
|
|
|
|
synchronized void nContextSetSurface(int w, int h, Surface sur) {
|
|
|
|
rsnContextSetSurface(mContext, w, h, sur);
|
|
|
|
}
|
|
|
|
native void rsnContextSetPriority(int con, int p);
|
|
|
|
synchronized void nContextSetPriority(int p) {
|
|
|
|
rsnContextSetPriority(mContext, p);
|
|
|
|
}
|
|
|
|
native void rsnContextDump(int con, int bits);
|
|
|
|
synchronized void nContextDump(int bits) {
|
|
|
|
rsnContextDump(mContext, bits);
|
|
|
|
}
|
|
|
|
native void rsnContextFinish(int con);
|
|
|
|
synchronized void nContextFinish() {
|
|
|
|
rsnContextFinish(mContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
native void rsnContextBindRootScript(int con, int script);
|
|
|
|
synchronized void nContextBindRootScript(int script) {
|
|
|
|
rsnContextBindRootScript(mContext, script);
|
|
|
|
}
|
|
|
|
native void rsnContextBindSampler(int con, int sampler, int slot);
|
|
|
|
synchronized void nContextBindSampler(int sampler, int slot) {
|
|
|
|
rsnContextBindSampler(mContext, sampler, slot);
|
|
|
|
}
|
|
|
|
native void rsnContextBindProgramStore(int con, int pfs);
|
|
|
|
synchronized void nContextBindProgramStore(int pfs) {
|
|
|
|
rsnContextBindProgramStore(mContext, pfs);
|
|
|
|
}
|
|
|
|
native void rsnContextBindProgramFragment(int con, int pf);
|
|
|
|
synchronized void nContextBindProgramFragment(int pf) {
|
|
|
|
rsnContextBindProgramFragment(mContext, pf);
|
|
|
|
}
|
|
|
|
native void rsnContextBindProgramVertex(int con, int pv);
|
|
|
|
synchronized void nContextBindProgramVertex(int pv) {
|
|
|
|
rsnContextBindProgramVertex(mContext, pv);
|
|
|
|
}
|
|
|
|
native void rsnContextBindProgramRaster(int con, int pr);
|
|
|
|
synchronized void nContextBindProgramRaster(int pr) {
|
|
|
|
rsnContextBindProgramRaster(mContext, pr);
|
|
|
|
}
|
|
|
|
native void rsnContextPause(int con);
|
|
|
|
synchronized void nContextPause() {
|
|
|
|
rsnContextPause(mContext);
|
|
|
|
}
|
|
|
|
native void rsnContextResume(int con);
|
|
|
|
synchronized void nContextResume() {
|
|
|
|
rsnContextResume(mContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
native void rsnAssignName(int con, int obj, byte[] name);
|
|
|
|
synchronized void nAssignName(int obj, byte[] name) {
|
|
|
|
rsnAssignName(mContext, obj, name);
|
|
|
|
}
|
|
|
|
native String rsnGetName(int con, int obj);
|
|
|
|
synchronized String nGetName(int obj) {
|
|
|
|
return rsnGetName(mContext, obj);
|
|
|
|
}
|
|
|
|
native void rsnObjDestroy(int con, int id);
|
|
|
|
synchronized void nObjDestroy(int id) {
|
|
|
|
rsnObjDestroy(mContext, id);
|
|
|
|
}
|
|
|
|
native int rsnFileOpen(int con, byte[] name);
|
|
|
|
synchronized int nFileOpen(byte[] name) {
|
|
|
|
return rsnFileOpen(mContext, name);
|
|
|
|
}
|
|
|
|
|
|
|
|
native int rsnElementCreate(int con, int type, int kind, boolean norm, int vecSize);
|
|
|
|
synchronized int nElementCreate(int type, int kind, boolean norm, int vecSize) {
|
|
|
|
return rsnElementCreate(mContext, type, kind, norm, vecSize);
|
|
|
|
}
|
2010-09-02 17:35:23 -07:00
|
|
|
native int rsnElementCreate2(int con, int[] elements, String[] names, int[] arraySizes);
|
|
|
|
synchronized int nElementCreate2(int[] elements, String[] names, int[] arraySizes) {
|
|
|
|
return rsnElementCreate2(mContext, elements, names, arraySizes);
|
2010-08-17 16:25:41 -07:00
|
|
|
}
|
|
|
|
native void rsnElementGetNativeData(int con, int id, int[] elementData);
|
|
|
|
synchronized void nElementGetNativeData(int id, int[] elementData) {
|
|
|
|
rsnElementGetNativeData(mContext, id, elementData);
|
|
|
|
}
|
|
|
|
native void rsnElementGetSubElements(int con, int id, int[] IDs, String[] names);
|
|
|
|
synchronized void nElementGetSubElements(int id, int[] IDs, String[] names) {
|
|
|
|
rsnElementGetSubElements(mContext, id, IDs, names);
|
|
|
|
}
|
|
|
|
|
|
|
|
native void rsnTypeBegin(int con, int elementID);
|
|
|
|
synchronized void nTypeBegin(int elementID) {
|
|
|
|
rsnTypeBegin(mContext, elementID);
|
|
|
|
}
|
|
|
|
native void rsnTypeAdd(int con, int dim, int val);
|
|
|
|
synchronized void nTypeAdd(int dim, int val) {
|
|
|
|
rsnTypeAdd(mContext, dim, val);
|
|
|
|
}
|
|
|
|
native int rsnTypeCreate(int con);
|
|
|
|
synchronized int nTypeCreate() {
|
|
|
|
return rsnTypeCreate(mContext);
|
|
|
|
}
|
|
|
|
native void rsnTypeGetNativeData(int con, int id, int[] typeData);
|
|
|
|
synchronized void nTypeGetNativeData(int id, int[] typeData) {
|
|
|
|
rsnTypeGetNativeData(mContext, id, typeData);
|
|
|
|
}
|
|
|
|
|
|
|
|
native int rsnAllocationCreateTyped(int con, int type);
|
|
|
|
synchronized int nAllocationCreateTyped(int type) {
|
|
|
|
return rsnAllocationCreateTyped(mContext, type);
|
|
|
|
}
|
|
|
|
native int rsnAllocationCreateFromBitmap(int con, int dstFmt, boolean genMips, Bitmap bmp);
|
|
|
|
synchronized int nAllocationCreateFromBitmap(int dstFmt, boolean genMips, Bitmap bmp) {
|
|
|
|
return rsnAllocationCreateFromBitmap(mContext, dstFmt, genMips, bmp);
|
|
|
|
}
|
|
|
|
native int rsnAllocationCreateBitmapRef(int con, int type, Bitmap bmp);
|
|
|
|
synchronized int nAllocationCreateBitmapRef(int type, Bitmap bmp) {
|
|
|
|
return rsnAllocationCreateBitmapRef(mContext, type, bmp);
|
|
|
|
}
|
|
|
|
native int rsnAllocationCreateFromBitmapBoxed(int con, int dstFmt, boolean genMips, Bitmap bmp);
|
|
|
|
synchronized int nAllocationCreateFromBitmapBoxed(int dstFmt, boolean genMips, Bitmap bmp) {
|
|
|
|
return rsnAllocationCreateFromBitmapBoxed(mContext, dstFmt, genMips, bmp);
|
|
|
|
}
|
|
|
|
native int rsnAllocationCreateFromAssetStream(int con, int dstFmt, boolean genMips, int assetStream);
|
|
|
|
synchronized int nAllocationCreateFromAssetStream(int dstFmt, boolean genMips, int assetStream) {
|
|
|
|
return rsnAllocationCreateFromAssetStream(mContext, dstFmt, genMips, assetStream);
|
|
|
|
}
|
|
|
|
|
|
|
|
native void rsnAllocationUploadToTexture(int con, int alloc, boolean genMips, int baseMioLevel);
|
|
|
|
synchronized void nAllocationUploadToTexture(int alloc, boolean genMips, int baseMioLevel) {
|
|
|
|
rsnAllocationUploadToTexture(mContext, alloc, genMips, baseMioLevel);
|
|
|
|
}
|
|
|
|
native void rsnAllocationUploadToBufferObject(int con, int alloc);
|
|
|
|
synchronized void nAllocationUploadToBufferObject(int alloc) {
|
|
|
|
rsnAllocationUploadToBufferObject(mContext, alloc);
|
|
|
|
}
|
|
|
|
|
|
|
|
native void rsnAllocationSubData1D(int con, int id, int off, int count, int[] d, int sizeBytes);
|
|
|
|
synchronized void nAllocationSubData1D(int id, int off, int count, int[] d, int sizeBytes) {
|
|
|
|
rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes);
|
|
|
|
}
|
|
|
|
native void rsnAllocationSubData1D(int con, int id, int off, int count, short[] d, int sizeBytes);
|
|
|
|
synchronized void nAllocationSubData1D(int id, int off, int count, short[] d, int sizeBytes) {
|
|
|
|
rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes);
|
|
|
|
}
|
|
|
|
native void rsnAllocationSubData1D(int con, int id, int off, int count, byte[] d, int sizeBytes);
|
|
|
|
synchronized void nAllocationSubData1D(int id, int off, int count, byte[] d, int sizeBytes) {
|
|
|
|
rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes);
|
|
|
|
}
|
2010-08-31 13:50:42 -07:00
|
|
|
native void rsnAllocationSubElementData1D(int con, int id, int xoff, int compIdx, byte[] d, int sizeBytes);
|
|
|
|
synchronized void nAllocationSubElementData1D(int id, int xoff, int compIdx, byte[] d, int sizeBytes) {
|
|
|
|
rsnAllocationSubElementData1D(mContext, id, xoff, compIdx, d, sizeBytes);
|
|
|
|
}
|
2010-08-17 16:25:41 -07:00
|
|
|
native void rsnAllocationSubData1D(int con, int id, int off, int count, float[] d, int sizeBytes);
|
|
|
|
synchronized void nAllocationSubData1D(int id, int off, int count, float[] d, int sizeBytes) {
|
|
|
|
rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes);
|
|
|
|
}
|
|
|
|
|
|
|
|
native void rsnAllocationSubData2D(int con, int id, int xoff, int yoff, int w, int h, int[] d, int sizeBytes);
|
|
|
|
synchronized void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, int[] d, int sizeBytes) {
|
|
|
|
rsnAllocationSubData2D(mContext, id, xoff, yoff, w, h, d, sizeBytes);
|
|
|
|
}
|
|
|
|
native void rsnAllocationSubData2D(int con, int id, int xoff, int yoff, int w, int h, float[] d, int sizeBytes);
|
|
|
|
synchronized void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, float[] d, int sizeBytes) {
|
|
|
|
rsnAllocationSubData2D(mContext, id, xoff, yoff, w, h, d, sizeBytes);
|
|
|
|
}
|
|
|
|
native void rsnAllocationRead(int con, int id, int[] d);
|
|
|
|
synchronized void nAllocationRead(int id, int[] d) {
|
|
|
|
rsnAllocationRead(mContext, id, d);
|
|
|
|
}
|
|
|
|
native void rsnAllocationRead(int con, int id, float[] d);
|
|
|
|
synchronized void nAllocationRead(int id, float[] d) {
|
|
|
|
rsnAllocationRead(mContext, id, d);
|
|
|
|
}
|
|
|
|
native int rsnAllocationGetType(int con, int id);
|
|
|
|
synchronized int nAllocationGetType(int id) {
|
|
|
|
return rsnAllocationGetType(mContext, id);
|
|
|
|
}
|
|
|
|
|
|
|
|
native int rsnFileA3DCreateFromAssetStream(int con, int assetStream);
|
|
|
|
synchronized int nFileA3DCreateFromAssetStream(int assetStream) {
|
|
|
|
return rsnFileA3DCreateFromAssetStream(mContext, assetStream);
|
|
|
|
}
|
|
|
|
native int rsnFileA3DGetNumIndexEntries(int con, int fileA3D);
|
|
|
|
synchronized int nFileA3DGetNumIndexEntries(int fileA3D) {
|
|
|
|
return rsnFileA3DGetNumIndexEntries(mContext, fileA3D);
|
|
|
|
}
|
|
|
|
native void rsnFileA3DGetIndexEntries(int con, int fileA3D, int numEntries, int[] IDs, String[] names);
|
|
|
|
synchronized void nFileA3DGetIndexEntries(int fileA3D, int numEntries, int[] IDs, String[] names) {
|
|
|
|
rsnFileA3DGetIndexEntries(mContext, fileA3D, numEntries, IDs, names);
|
|
|
|
}
|
|
|
|
native int rsnFileA3DGetEntryByIndex(int con, int fileA3D, int index);
|
|
|
|
synchronized int nFileA3DGetEntryByIndex(int fileA3D, int index) {
|
|
|
|
return rsnFileA3DGetEntryByIndex(mContext, fileA3D, index);
|
|
|
|
}
|
|
|
|
|
|
|
|
native int rsnFontCreateFromFile(int con, String fileName, int size, int dpi);
|
|
|
|
synchronized int nFontCreateFromFile(String fileName, int size, int dpi) {
|
|
|
|
return rsnFontCreateFromFile(mContext, fileName, size, dpi);
|
|
|
|
}
|
|
|
|
|
|
|
|
native void rsnAdapter1DBindAllocation(int con, int ad, int alloc);
|
|
|
|
synchronized void nAdapter1DBindAllocation(int ad, int alloc) {
|
|
|
|
rsnAdapter1DBindAllocation(mContext, ad, alloc);
|
|
|
|
}
|
|
|
|
native void rsnAdapter1DSetConstraint(int con, int ad, int dim, int value);
|
|
|
|
synchronized void nAdapter1DSetConstraint(int ad, int dim, int value) {
|
|
|
|
rsnAdapter1DSetConstraint(mContext, ad, dim, value);
|
|
|
|
}
|
|
|
|
native void rsnAdapter1DData(int con, int ad, int[] d);
|
|
|
|
synchronized void nAdapter1DData(int ad, int[] d) {
|
|
|
|
rsnAdapter1DData(mContext, ad, d);
|
|
|
|
}
|
|
|
|
native void rsnAdapter1DData(int con, int ad, float[] d);
|
|
|
|
synchronized void nAdapter1DData(int ad, float[] d) {
|
|
|
|
rsnAdapter1DData(mContext, ad, d);
|
|
|
|
}
|
|
|
|
native void rsnAdapter1DSubData(int con, int ad, int off, int count, int[] d);
|
|
|
|
synchronized void nAdapter1DSubData(int ad, int off, int count, int[] d) {
|
|
|
|
rsnAdapter1DSubData(mContext, ad, off, count, d);
|
|
|
|
}
|
|
|
|
native void rsnAdapter1DSubData(int con, int ad, int off, int count, float[] d);
|
|
|
|
synchronized void nAdapter1DSubData(int ad, int off, int count, float[] d) {
|
|
|
|
rsnAdapter1DSubData(mContext, ad, off, count, d);
|
|
|
|
}
|
|
|
|
native int rsnAdapter1DCreate(int con);
|
|
|
|
synchronized int nAdapter1DCreate() {
|
|
|
|
return rsnAdapter1DCreate(mContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
native void rsnAdapter2DBindAllocation(int con, int ad, int alloc);
|
|
|
|
synchronized void nAdapter2DBindAllocation(int ad, int alloc) {
|
|
|
|
rsnAdapter2DBindAllocation(mContext, ad, alloc);
|
|
|
|
}
|
|
|
|
native void rsnAdapter2DSetConstraint(int con, int ad, int dim, int value);
|
|
|
|
synchronized void nAdapter2DSetConstraint(int ad, int dim, int value) {
|
|
|
|
rsnAdapter2DSetConstraint(mContext, ad, dim, value);
|
|
|
|
}
|
|
|
|
native void rsnAdapter2DData(int con, int ad, int[] d);
|
|
|
|
synchronized void nAdapter2DData(int ad, int[] d) {
|
|
|
|
rsnAdapter2DData(mContext, ad, d);
|
|
|
|
}
|
|
|
|
native void rsnAdapter2DData(int con, int ad, float[] d);
|
|
|
|
synchronized void nAdapter2DData(int ad, float[] d) {
|
|
|
|
rsnAdapter2DData(mContext, ad, d);
|
|
|
|
}
|
|
|
|
native void rsnAdapter2DSubData(int con, int ad, int xoff, int yoff, int w, int h, int[] d);
|
|
|
|
synchronized void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, int[] d) {
|
|
|
|
rsnAdapter2DSubData(mContext, ad, xoff, yoff, w, h, d);
|
|
|
|
}
|
|
|
|
native void rsnAdapter2DSubData(int con, int ad, int xoff, int yoff, int w, int h, float[] d);
|
|
|
|
synchronized void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, float[] d) {
|
|
|
|
rsnAdapter2DSubData(mContext, ad, xoff, yoff, w, h, d);
|
|
|
|
}
|
|
|
|
native int rsnAdapter2DCreate(int con);
|
|
|
|
synchronized int nAdapter2DCreate() {
|
|
|
|
return rsnAdapter2DCreate(mContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
native void rsnScriptBindAllocation(int con, int script, int alloc, int slot);
|
|
|
|
synchronized void nScriptBindAllocation(int script, int alloc, int slot) {
|
|
|
|
rsnScriptBindAllocation(mContext, script, alloc, slot);
|
|
|
|
}
|
|
|
|
native void rsnScriptSetTimeZone(int con, int script, byte[] timeZone);
|
|
|
|
synchronized void nScriptSetTimeZone(int script, byte[] timeZone) {
|
|
|
|
rsnScriptSetTimeZone(mContext, script, timeZone);
|
|
|
|
}
|
|
|
|
native void rsnScriptInvoke(int con, int id, int slot);
|
|
|
|
synchronized void nScriptInvoke(int id, int slot) {
|
|
|
|
rsnScriptInvoke(mContext, id, slot);
|
|
|
|
}
|
|
|
|
native void rsnScriptInvokeV(int con, int id, int slot, byte[] params);
|
|
|
|
synchronized void nScriptInvokeV(int id, int slot, byte[] params) {
|
|
|
|
rsnScriptInvokeV(mContext, id, slot, params);
|
|
|
|
}
|
|
|
|
native void rsnScriptSetVarI(int con, int id, int slot, int val);
|
|
|
|
synchronized void nScriptSetVarI(int id, int slot, int val) {
|
|
|
|
rsnScriptSetVarI(mContext, id, slot, val);
|
|
|
|
}
|
|
|
|
native void rsnScriptSetVarF(int con, int id, int slot, float val);
|
|
|
|
synchronized void nScriptSetVarF(int id, int slot, float val) {
|
|
|
|
rsnScriptSetVarF(mContext, id, slot, val);
|
|
|
|
}
|
2010-09-20 17:20:30 -07:00
|
|
|
native void rsnScriptSetVarD(int con, int id, int slot, double val);
|
|
|
|
synchronized void nScriptSetVarD(int id, int slot, double val) {
|
|
|
|
rsnScriptSetVarD(mContext, id, slot, val);
|
|
|
|
}
|
2010-08-17 16:25:41 -07:00
|
|
|
native void rsnScriptSetVarV(int con, int id, int slot, byte[] val);
|
|
|
|
synchronized void nScriptSetVarV(int id, int slot, byte[] val) {
|
|
|
|
rsnScriptSetVarV(mContext, id, slot, val);
|
|
|
|
}
|
|
|
|
|
|
|
|
native void rsnScriptCBegin(int con);
|
|
|
|
synchronized void nScriptCBegin() {
|
|
|
|
rsnScriptCBegin(mContext);
|
|
|
|
}
|
|
|
|
native void rsnScriptCSetScript(int con, byte[] script, int offset, int length);
|
|
|
|
synchronized void nScriptCSetScript(byte[] script, int offset, int length) {
|
|
|
|
rsnScriptCSetScript(mContext, script, offset, length);
|
|
|
|
}
|
|
|
|
native int rsnScriptCCreate(int con);
|
|
|
|
synchronized int nScriptCCreate() {
|
|
|
|
return rsnScriptCCreate(mContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
native void rsnSamplerBegin(int con);
|
|
|
|
synchronized void nSamplerBegin() {
|
|
|
|
rsnSamplerBegin(mContext);
|
|
|
|
}
|
|
|
|
native void rsnSamplerSet(int con, int param, int value);
|
|
|
|
synchronized void nSamplerSet(int param, int value) {
|
|
|
|
rsnSamplerSet(mContext, param, value);
|
|
|
|
}
|
|
|
|
native int rsnSamplerCreate(int con);
|
|
|
|
synchronized int nSamplerCreate() {
|
|
|
|
return rsnSamplerCreate(mContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
native void rsnProgramStoreBegin(int con, int in, int out);
|
|
|
|
synchronized void nProgramStoreBegin(int in, int out) {
|
|
|
|
rsnProgramStoreBegin(mContext, in, out);
|
|
|
|
}
|
|
|
|
native void rsnProgramStoreDepthFunc(int con, int func);
|
|
|
|
synchronized void nProgramStoreDepthFunc(int func) {
|
|
|
|
rsnProgramStoreDepthFunc(mContext, func);
|
|
|
|
}
|
|
|
|
native void rsnProgramStoreDepthMask(int con, boolean enable);
|
|
|
|
synchronized void nProgramStoreDepthMask(boolean enable) {
|
|
|
|
rsnProgramStoreDepthMask(mContext, enable);
|
|
|
|
}
|
|
|
|
native void rsnProgramStoreColorMask(int con, boolean r, boolean g, boolean b, boolean a);
|
|
|
|
synchronized void nProgramStoreColorMask(boolean r, boolean g, boolean b, boolean a) {
|
|
|
|
rsnProgramStoreColorMask(mContext, r, g, b, a);
|
|
|
|
}
|
|
|
|
native void rsnProgramStoreBlendFunc(int con, int src, int dst);
|
|
|
|
synchronized void nProgramStoreBlendFunc(int src, int dst) {
|
|
|
|
rsnProgramStoreBlendFunc(mContext, src, dst);
|
|
|
|
}
|
|
|
|
native void rsnProgramStoreDither(int con, boolean enable);
|
|
|
|
synchronized void nProgramStoreDither(boolean enable) {
|
|
|
|
rsnProgramStoreDither(mContext, enable);
|
|
|
|
}
|
|
|
|
native int rsnProgramStoreCreate(int con);
|
|
|
|
synchronized int nProgramStoreCreate() {
|
|
|
|
return rsnProgramStoreCreate(mContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
native int rsnProgramRasterCreate(int con, boolean pointSmooth, boolean lineSmooth, boolean pointSprite);
|
|
|
|
synchronized int nProgramRasterCreate(boolean pointSmooth, boolean lineSmooth, boolean pointSprite) {
|
|
|
|
return rsnProgramRasterCreate(mContext, pointSmooth, lineSmooth, pointSprite);
|
|
|
|
}
|
|
|
|
native void rsnProgramRasterSetLineWidth(int con, int pr, float v);
|
|
|
|
synchronized void nProgramRasterSetLineWidth(int pr, float v) {
|
|
|
|
rsnProgramRasterSetLineWidth(mContext, pr, v);
|
|
|
|
}
|
|
|
|
native void rsnProgramRasterSetCullMode(int con, int pr, int mode);
|
|
|
|
synchronized void nProgramRasterSetCullMode(int pr, int mode) {
|
|
|
|
rsnProgramRasterSetCullMode(mContext, pr, mode);
|
|
|
|
}
|
|
|
|
|
|
|
|
native void rsnProgramBindConstants(int con, int pv, int slot, int mID);
|
|
|
|
synchronized void nProgramBindConstants(int pv, int slot, int mID) {
|
|
|
|
rsnProgramBindConstants(mContext, pv, slot, mID);
|
|
|
|
}
|
|
|
|
native void rsnProgramBindTexture(int con, int vpf, int slot, int a);
|
|
|
|
synchronized void nProgramBindTexture(int vpf, int slot, int a) {
|
|
|
|
rsnProgramBindTexture(mContext, vpf, slot, a);
|
|
|
|
}
|
|
|
|
native void rsnProgramBindSampler(int con, int vpf, int slot, int s);
|
|
|
|
synchronized void nProgramBindSampler(int vpf, int slot, int s) {
|
|
|
|
rsnProgramBindSampler(mContext, vpf, slot, s);
|
|
|
|
}
|
2010-09-23 16:16:33 -07:00
|
|
|
native int rsnProgramFragmentCreate(int con, String shader, int[] params);
|
|
|
|
synchronized int nProgramFragmentCreate(String shader, int[] params) {
|
|
|
|
return rsnProgramFragmentCreate(mContext, shader, params);
|
2010-08-17 16:25:41 -07:00
|
|
|
}
|
2010-09-23 16:16:33 -07:00
|
|
|
native int rsnProgramVertexCreate(int con, String shader, int[] params);
|
|
|
|
synchronized int nProgramVertexCreate(String shader, int[] params) {
|
|
|
|
return rsnProgramVertexCreate(mContext, shader, params);
|
2010-08-17 16:25:41 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
native int rsnMeshCreate(int con, int vtxCount, int indexCount);
|
|
|
|
synchronized int nMeshCreate(int vtxCount, int indexCount) {
|
|
|
|
return rsnMeshCreate(mContext, vtxCount, indexCount);
|
|
|
|
}
|
|
|
|
native void rsnMeshBindVertex(int con, int id, int alloc, int slot);
|
|
|
|
synchronized void nMeshBindVertex(int id, int alloc, int slot) {
|
|
|
|
rsnMeshBindVertex(mContext, id, alloc, slot);
|
|
|
|
}
|
|
|
|
native void rsnMeshBindIndex(int con, int id, int alloc, int prim, int slot);
|
|
|
|
synchronized void nMeshBindIndex(int id, int alloc, int prim, int slot) {
|
|
|
|
rsnMeshBindIndex(mContext, id, alloc, prim, slot);
|
|
|
|
}
|
|
|
|
native int rsnMeshGetVertexBufferCount(int con, int id);
|
|
|
|
synchronized int nMeshGetVertexBufferCount(int id) {
|
|
|
|
return rsnMeshGetVertexBufferCount(mContext, id);
|
|
|
|
}
|
|
|
|
native int rsnMeshGetIndexCount(int con, int id);
|
|
|
|
synchronized int nMeshGetIndexCount(int id) {
|
|
|
|
return rsnMeshGetIndexCount(mContext, id);
|
|
|
|
}
|
|
|
|
native void rsnMeshGetVertices(int con, int id, int[] vtxIds, int vtxIdCount);
|
|
|
|
synchronized void nMeshGetVertices(int id, int[] vtxIds, int vtxIdCount) {
|
|
|
|
rsnMeshGetVertices(mContext, id, vtxIds, vtxIdCount);
|
|
|
|
}
|
|
|
|
native void rsnMeshGetIndices(int con, int id, int[] idxIds, int[] primitives, int vtxIdCount);
|
|
|
|
synchronized void nMeshGetIndices(int id, int[] idxIds, int[] primitives, int vtxIdCount) {
|
|
|
|
rsnMeshGetIndices(mContext, id, idxIds, primitives, vtxIdCount);
|
|
|
|
}
|
|
|
|
|
2009-05-26 13:45:08 -07:00
|
|
|
|
2010-02-09 16:05:07 -08:00
|
|
|
protected int mDev;
|
|
|
|
protected int mContext;
|
2009-08-31 14:06:43 -07:00
|
|
|
@SuppressWarnings({"FieldCanBeLocal"})
|
2010-02-09 16:05:07 -08:00
|
|
|
protected MessageThread mMessageThread;
|
2009-05-26 13:45:08 -07:00
|
|
|
|
2010-06-01 15:47:01 -07:00
|
|
|
Element mElement_U8;
|
|
|
|
Element mElement_I8;
|
|
|
|
Element mElement_U16;
|
|
|
|
Element mElement_I16;
|
|
|
|
Element mElement_U32;
|
|
|
|
Element mElement_I32;
|
|
|
|
Element mElement_F32;
|
2010-06-21 17:42:41 -07:00
|
|
|
Element mElement_BOOLEAN;
|
2010-06-01 15:47:01 -07:00
|
|
|
|
|
|
|
Element mElement_ELEMENT;
|
|
|
|
Element mElement_TYPE;
|
|
|
|
Element mElement_ALLOCATION;
|
|
|
|
Element mElement_SAMPLER;
|
|
|
|
Element mElement_SCRIPT;
|
|
|
|
Element mElement_MESH;
|
|
|
|
Element mElement_PROGRAM_FRAGMENT;
|
|
|
|
Element mElement_PROGRAM_VERTEX;
|
|
|
|
Element mElement_PROGRAM_RASTER;
|
|
|
|
Element mElement_PROGRAM_STORE;
|
2010-03-26 15:33:42 -07:00
|
|
|
|
2009-09-27 17:50:38 -07:00
|
|
|
Element mElement_A_8;
|
|
|
|
Element mElement_RGB_565;
|
|
|
|
Element mElement_RGB_888;
|
|
|
|
Element mElement_RGBA_5551;
|
|
|
|
Element mElement_RGBA_4444;
|
|
|
|
Element mElement_RGBA_8888;
|
|
|
|
|
2010-06-01 15:47:01 -07:00
|
|
|
Element mElement_FLOAT_2;
|
|
|
|
Element mElement_FLOAT_3;
|
|
|
|
Element mElement_FLOAT_4;
|
|
|
|
Element mElement_UCHAR_4;
|
2009-11-15 12:14:26 -08:00
|
|
|
|
2010-08-25 14:31:48 -07:00
|
|
|
Element mElement_MATRIX_4X4;
|
|
|
|
Element mElement_MATRIX_3X3;
|
|
|
|
Element mElement_MATRIX_2X2;
|
|
|
|
|
2010-05-11 14:03:58 -07:00
|
|
|
Sampler mSampler_CLAMP_NEAREST;
|
|
|
|
Sampler mSampler_CLAMP_LINEAR;
|
|
|
|
Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
|
|
|
|
Sampler mSampler_WRAP_NEAREST;
|
|
|
|
Sampler mSampler_WRAP_LINEAR;
|
|
|
|
Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
|
|
|
|
|
2010-08-24 11:37:33 -07:00
|
|
|
ProgramStore mProgramStore_BLEND_NONE_DEPTH_TEST;
|
|
|
|
ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
|
|
|
|
ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_TEST;
|
|
|
|
ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_WRITE;
|
|
|
|
ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_TEST;
|
|
|
|
ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
|
|
|
|
ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_TEST;
|
|
|
|
ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_WRITE;
|
|
|
|
ProgramStore mProgramStore_BLEND_ADD_DEPTH_TEST;
|
|
|
|
ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_DEPTH;
|
|
|
|
ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_TEST;
|
|
|
|
ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_WRITE;
|
|
|
|
|
|
|
|
ProgramRaster mProgramRaster_CULL_BACK;
|
|
|
|
ProgramRaster mProgramRaster_CULL_FRONT;
|
|
|
|
ProgramRaster mProgramRaster_CULL_NONE;
|
2010-08-23 10:24:10 -07:00
|
|
|
|
2009-05-26 13:45:08 -07:00
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
2009-05-28 13:38:16 -07:00
|
|
|
//
|
2009-05-26 13:45:08 -07:00
|
|
|
|
2009-10-06 13:58:47 -07:00
|
|
|
public static class RSMessage implements Runnable {
|
|
|
|
protected int[] mData;
|
|
|
|
protected int mID;
|
|
|
|
public void run() {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
public RSMessage mMessageCallback = null;
|
|
|
|
|
2009-11-15 12:14:26 -08:00
|
|
|
public enum Priority {
|
|
|
|
LOW (5), //ANDROID_PRIORITY_BACKGROUND + 5
|
|
|
|
NORMAL (-4); //ANDROID_PRIORITY_DISPLAY
|
|
|
|
|
|
|
|
int mID;
|
|
|
|
Priority(int id) {
|
|
|
|
mID = id;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-12-07 12:40:12 -08:00
|
|
|
void validate() {
|
|
|
|
if (mContext == 0) {
|
|
|
|
throw new IllegalStateException("Calling RS with no Context active.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-11-15 12:14:26 -08:00
|
|
|
public void contextSetPriority(Priority p) {
|
2010-01-27 14:41:43 -08:00
|
|
|
validate();
|
2009-11-15 12:14:26 -08:00
|
|
|
nContextSetPriority(p.mID);
|
|
|
|
}
|
|
|
|
|
2010-02-09 16:05:07 -08:00
|
|
|
protected static class MessageThread extends Thread {
|
2009-10-06 13:58:47 -07:00
|
|
|
RenderScript mRS;
|
|
|
|
boolean mRun = true;
|
|
|
|
|
|
|
|
MessageThread(RenderScript rs) {
|
|
|
|
super("RSMessageThread");
|
|
|
|
mRS = rs;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public void run() {
|
|
|
|
// This function is a temporary solution. The final solution will
|
|
|
|
// used typed allocations where the message id is the type indicator.
|
|
|
|
int[] rbuf = new int[16];
|
2010-08-17 16:25:41 -07:00
|
|
|
mRS.nContextInitToClient(mRS.mContext);
|
2009-10-06 13:58:47 -07:00
|
|
|
while(mRun) {
|
2010-08-25 14:31:48 -07:00
|
|
|
rbuf[0] = 0;
|
2010-08-17 16:25:41 -07:00
|
|
|
int msg = mRS.nContextGetMessage(mRS.mContext, rbuf, true);
|
2010-09-16 13:43:19 -07:00
|
|
|
if ((msg == 0) && mRun) {
|
2010-08-25 14:31:48 -07:00
|
|
|
// Can happen for two reasons
|
|
|
|
if (rbuf[0] > 0) {
|
|
|
|
// 1: Buffer needs to be enlarged.
|
|
|
|
rbuf = new int[rbuf[0] + 2];
|
|
|
|
} else {
|
|
|
|
// 2: teardown.
|
|
|
|
// But we want to avoid starving other threads during
|
|
|
|
// teardown by yielding until the next line in the destructor
|
|
|
|
// can execute to set mRun = false
|
|
|
|
try {
|
|
|
|
sleep(1, 0);
|
|
|
|
} catch(InterruptedException e) {
|
|
|
|
}
|
2009-10-06 13:58:47 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if(mRS.mMessageCallback != null) {
|
|
|
|
mRS.mMessageCallback.mData = rbuf;
|
|
|
|
mRS.mMessageCallback.mID = msg;
|
|
|
|
mRS.mMessageCallback.run();
|
|
|
|
}
|
|
|
|
}
|
2009-11-12 15:10:25 -08:00
|
|
|
Log.d(LOG_TAG, "MessageThread exiting.");
|
2009-10-06 13:58:47 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-02-09 16:05:07 -08:00
|
|
|
protected RenderScript() {
|
2009-05-26 13:45:08 -07:00
|
|
|
}
|
|
|
|
|
2010-02-09 16:05:07 -08:00
|
|
|
public static RenderScript create() {
|
|
|
|
RenderScript rs = new RenderScript();
|
|
|
|
|
|
|
|
rs.mDev = rs.nDeviceCreate();
|
|
|
|
rs.mContext = rs.nContextCreate(rs.mDev, 0);
|
|
|
|
rs.mMessageThread = new MessageThread(rs);
|
|
|
|
rs.mMessageThread.start();
|
|
|
|
Element.initPredefined(rs);
|
|
|
|
return rs;
|
2009-11-03 13:58:36 -08:00
|
|
|
}
|
|
|
|
|
2009-11-17 17:26:46 -08:00
|
|
|
public void contextDump(int bits) {
|
2010-01-27 14:41:43 -08:00
|
|
|
validate();
|
2009-11-17 17:26:46 -08:00
|
|
|
nContextDump(bits);
|
|
|
|
}
|
|
|
|
|
2010-06-15 12:15:57 -07:00
|
|
|
public void finish() {
|
|
|
|
nContextFinish();
|
|
|
|
}
|
|
|
|
|
2009-08-25 14:49:07 -07:00
|
|
|
public void destroy() {
|
2010-01-27 14:41:43 -08:00
|
|
|
validate();
|
2010-08-17 16:25:41 -07:00
|
|
|
nContextDeinitToClient(mContext);
|
2009-10-06 13:58:47 -07:00
|
|
|
mMessageThread.mRun = false;
|
2010-09-16 13:43:19 -07:00
|
|
|
try {
|
|
|
|
mMessageThread.join();
|
|
|
|
} catch(InterruptedException e) {
|
|
|
|
}
|
2009-10-06 13:58:47 -07:00
|
|
|
|
2010-08-17 16:25:41 -07:00
|
|
|
nContextDestroy();
|
2009-08-25 14:49:07 -07:00
|
|
|
mContext = 0;
|
|
|
|
|
|
|
|
nDeviceDestroy(mDev);
|
|
|
|
mDev = 0;
|
|
|
|
}
|
2009-05-28 15:37:57 -07:00
|
|
|
|
2009-09-25 14:51:22 -07:00
|
|
|
boolean isAlive() {
|
|
|
|
return mContext != 0;
|
|
|
|
}
|
|
|
|
|
2009-05-26 13:45:08 -07:00
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Root state
|
|
|
|
|
2010-02-09 16:05:07 -08:00
|
|
|
protected int safeID(BaseObj o) {
|
2009-09-23 16:38:37 -07:00
|
|
|
if(o != null) {
|
|
|
|
return o.mID;
|
2009-08-20 17:22:40 -07:00
|
|
|
}
|
2009-09-23 16:38:37 -07:00
|
|
|
return 0;
|
2009-05-26 13:45:08 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-07-31 16:26:13 -07:00
|
|
|
|
2010-07-12 15:50:32 -07:00
|
|
|
|