Merge "[RenderScript] Implement APIs for better multi-frame process support."
am: 6ebdbfa549
* commit '6ebdbfa5498c486a96f2b8b07858eb1a25a6d08a':
[RenderScript] Implement APIs for better multi-frame process support.
This commit is contained in:
@@ -55,12 +55,16 @@ import android.view.Surface;
|
|||||||
**/
|
**/
|
||||||
|
|
||||||
public class Allocation extends BaseObj {
|
public class Allocation extends BaseObj {
|
||||||
|
private static final int MAX_NUMBER_IO_INPUT_ALLOC = 16;
|
||||||
|
|
||||||
Type mType;
|
Type mType;
|
||||||
Bitmap mBitmap;
|
Bitmap mBitmap;
|
||||||
int mUsage;
|
int mUsage;
|
||||||
Allocation mAdaptedAllocation;
|
Allocation mAdaptedAllocation;
|
||||||
int mSize;
|
int mSize;
|
||||||
|
MipmapControl mMipmapControl;
|
||||||
|
|
||||||
|
long mTimeStamp = -1;
|
||||||
boolean mReadAllowed = true;
|
boolean mReadAllowed = true;
|
||||||
boolean mWriteAllowed = true;
|
boolean mWriteAllowed = true;
|
||||||
boolean mAutoPadding = false;
|
boolean mAutoPadding = false;
|
||||||
@@ -277,6 +281,17 @@ public class Allocation extends BaseObj {
|
|||||||
return mUsage;
|
return mUsage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide
|
||||||
|
* Get the Mipmap control flag of the Allocation.
|
||||||
|
*
|
||||||
|
* @return the Mipmap control flag of the Allocation
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public MipmapControl getMipmap() {
|
||||||
|
return mMipmapControl;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable/Disable AutoPadding for Vec3 elements.
|
* Enable/Disable AutoPadding for Vec3 elements.
|
||||||
* By default: Diabled.
|
* By default: Diabled.
|
||||||
@@ -359,6 +374,11 @@ public class Allocation extends BaseObj {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Allocation(long id, RenderScript rs, Type t, int usage, MipmapControl mips) {
|
||||||
|
this(id, rs, t, usage);
|
||||||
|
mMipmapControl = mips;
|
||||||
|
}
|
||||||
|
|
||||||
protected void finalize() throws Throwable {
|
protected void finalize() throws Throwable {
|
||||||
RenderScript.registerNativeFree.invoke(RenderScript.sRuntime, mSize);
|
RenderScript.registerNativeFree.invoke(RenderScript.sRuntime, mSize);
|
||||||
super.finalize();
|
super.finalize();
|
||||||
@@ -521,7 +541,7 @@ public class Allocation extends BaseObj {
|
|||||||
"Can only receive if IO_INPUT usage specified.");
|
"Can only receive if IO_INPUT usage specified.");
|
||||||
}
|
}
|
||||||
mRS.validate();
|
mRS.validate();
|
||||||
mRS.nAllocationIoReceive(getID(mRS));
|
mTimeStamp = mRS.nAllocationIoReceive(getID(mRS));
|
||||||
} finally {
|
} finally {
|
||||||
Trace.traceEnd(RenderScript.TRACE_TAG);
|
Trace.traceEnd(RenderScript.TRACE_TAG);
|
||||||
}
|
}
|
||||||
@@ -1890,7 +1910,7 @@ public class Allocation extends BaseObj {
|
|||||||
if (id == 0) {
|
if (id == 0) {
|
||||||
throw new RSRuntimeException("Allocation creation failed.");
|
throw new RSRuntimeException("Allocation creation failed.");
|
||||||
}
|
}
|
||||||
return new Allocation(id, rs, type, usage);
|
return new Allocation(id, rs, type, usage, mips);
|
||||||
} finally {
|
} finally {
|
||||||
Trace.traceEnd(RenderScript.TRACE_TAG);
|
Trace.traceEnd(RenderScript.TRACE_TAG);
|
||||||
}
|
}
|
||||||
@@ -1948,7 +1968,7 @@ public class Allocation extends BaseObj {
|
|||||||
if (id == 0) {
|
if (id == 0) {
|
||||||
throw new RSRuntimeException("Allocation creation failed.");
|
throw new RSRuntimeException("Allocation creation failed.");
|
||||||
}
|
}
|
||||||
return new Allocation(id, rs, t, usage);
|
return new Allocation(id, rs, t, usage, MipmapControl.MIPMAP_NONE);
|
||||||
} finally {
|
} finally {
|
||||||
Trace.traceEnd(RenderScript.TRACE_TAG);
|
Trace.traceEnd(RenderScript.TRACE_TAG);
|
||||||
}
|
}
|
||||||
@@ -2037,7 +2057,7 @@ public class Allocation extends BaseObj {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// keep a reference to the Bitmap around to prevent GC
|
// keep a reference to the Bitmap around to prevent GC
|
||||||
Allocation alloc = new Allocation(id, rs, t, usage);
|
Allocation alloc = new Allocation(id, rs, t, usage, mips);
|
||||||
alloc.setBitmap(b);
|
alloc.setBitmap(b);
|
||||||
return alloc;
|
return alloc;
|
||||||
}
|
}
|
||||||
@@ -2047,7 +2067,7 @@ public class Allocation extends BaseObj {
|
|||||||
if (id == 0) {
|
if (id == 0) {
|
||||||
throw new RSRuntimeException("Load failed.");
|
throw new RSRuntimeException("Load failed.");
|
||||||
}
|
}
|
||||||
return new Allocation(id, rs, t, usage);
|
return new Allocation(id, rs, t, usage, mips);
|
||||||
} finally {
|
} finally {
|
||||||
Trace.traceEnd(RenderScript.TRACE_TAG);
|
Trace.traceEnd(RenderScript.TRACE_TAG);
|
||||||
}
|
}
|
||||||
@@ -2088,6 +2108,108 @@ public class Allocation extends BaseObj {
|
|||||||
return mByteBuffer;
|
return mByteBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide
|
||||||
|
* Creates a new Allocation Array with the given {@link
|
||||||
|
* android.renderscript.Type}, and usage flags.
|
||||||
|
* Note: If the input allocation is of usage: USAGE_IO_INPUT,
|
||||||
|
* the created Allocation will be sharing the same BufferQueue.
|
||||||
|
*
|
||||||
|
* @param rs RenderScript context
|
||||||
|
* @param t RenderScript type describing data layout
|
||||||
|
* @param usage bit field specifying how the Allocation is
|
||||||
|
* utilized
|
||||||
|
* @param numAlloc Number of Allocations in the array.
|
||||||
|
* @return Allocation[]
|
||||||
|
*/
|
||||||
|
public static Allocation[] createAllocations(RenderScript rs, Type t, int usage, int numAlloc) {
|
||||||
|
try {
|
||||||
|
Trace.traceBegin(RenderScript.TRACE_TAG, "createAllocations");
|
||||||
|
rs.validate();
|
||||||
|
if (t.getID(rs) == 0) {
|
||||||
|
throw new RSInvalidStateException("Bad Type");
|
||||||
|
}
|
||||||
|
|
||||||
|
Allocation[] mAllocationArray = new Allocation[numAlloc];
|
||||||
|
mAllocationArray[0] = createTyped(rs, t, usage);
|
||||||
|
if ((usage & USAGE_IO_INPUT) != 0) {
|
||||||
|
if (numAlloc > MAX_NUMBER_IO_INPUT_ALLOC) {
|
||||||
|
throw new RSIllegalArgumentException("Exceeds the max number of Allocations allowed: " +
|
||||||
|
MAX_NUMBER_IO_INPUT_ALLOC);
|
||||||
|
}
|
||||||
|
mAllocationArray[0].setupBufferQueue(numAlloc);;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i=1; i<numAlloc; i++) {
|
||||||
|
mAllocationArray[i] = createFromAllcation(rs, mAllocationArray[0]);
|
||||||
|
}
|
||||||
|
return mAllocationArray;
|
||||||
|
} finally {
|
||||||
|
Trace.traceEnd(RenderScript.TRACE_TAG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new Allocation with the given {@link
|
||||||
|
* android.renderscript.Allocation}. The same data layout of
|
||||||
|
* the input Allocation will be applied.
|
||||||
|
* If the input allocation is of usage: USAGE_IO_INPUT, the created
|
||||||
|
* Allocation will be sharing the same BufferQueue.
|
||||||
|
*
|
||||||
|
* @param rs Context to which the allocation will belong.
|
||||||
|
* @param alloc RenderScript Allocation describing data layout.
|
||||||
|
* @return Allocation sharing the same data structure.
|
||||||
|
*/
|
||||||
|
static Allocation createFromAllcation(RenderScript rs, Allocation alloc) {
|
||||||
|
try {
|
||||||
|
Trace.traceBegin(RenderScript.TRACE_TAG, "createFromAllcation");
|
||||||
|
rs.validate();
|
||||||
|
if (alloc.getID(rs) == 0) {
|
||||||
|
throw new RSInvalidStateException("Bad input Allocation");
|
||||||
|
}
|
||||||
|
|
||||||
|
Type type = alloc.getType();
|
||||||
|
int usage = alloc.getUsage();
|
||||||
|
MipmapControl mips = alloc.getMipmap();
|
||||||
|
long id = rs.nAllocationCreateTyped(type.getID(rs), mips.mID, usage, 0);
|
||||||
|
if (id == 0) {
|
||||||
|
throw new RSRuntimeException("Allocation creation failed.");
|
||||||
|
}
|
||||||
|
Allocation outAlloc = new Allocation(id, rs, type, usage, mips);
|
||||||
|
if ((usage & USAGE_IO_INPUT) != 0) {
|
||||||
|
outAlloc.shareBufferQueue(alloc);
|
||||||
|
}
|
||||||
|
return outAlloc;
|
||||||
|
} finally {
|
||||||
|
Trace.traceEnd(RenderScript.TRACE_TAG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize BufferQueue with specified max number of buffers.
|
||||||
|
*/
|
||||||
|
void setupBufferQueue(int numAlloc) {
|
||||||
|
mRS.validate();
|
||||||
|
if ((mUsage & USAGE_IO_INPUT) == 0) {
|
||||||
|
throw new RSInvalidStateException("Allocation is not USAGE_IO_INPUT.");
|
||||||
|
}
|
||||||
|
mRS.nAllocationSetupBufferQueue(getID(mRS), numAlloc);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Share the BufferQueue with another {@link #USAGE_IO_INPUT} Allocation.
|
||||||
|
*
|
||||||
|
* @param alloc Allocation to associate with allocation
|
||||||
|
*/
|
||||||
|
void shareBufferQueue(Allocation alloc) {
|
||||||
|
mRS.validate();
|
||||||
|
if ((mUsage & USAGE_IO_INPUT) == 0) {
|
||||||
|
throw new RSInvalidStateException("Allocation is not USAGE_IO_INPUT.");
|
||||||
|
}
|
||||||
|
mGetSurfaceSurface = alloc.getSurface();
|
||||||
|
mRS.nAllocationShareBufferQueue(getID(mRS), alloc.getID(mRS));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @hide
|
* @hide
|
||||||
* Gets the stride of the Allocation.
|
* Gets the stride of the Allocation.
|
||||||
@@ -2106,6 +2228,27 @@ public class Allocation extends BaseObj {
|
|||||||
return mByteBufferStride;
|
return mByteBufferStride;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide
|
||||||
|
* Get the timestamp for the most recent buffer held by this Allocation.
|
||||||
|
* The timestamp is guaranteed to be unique and monotonically increasing.
|
||||||
|
* Default value: -1. The timestamp will be updated after each {@link
|
||||||
|
* #ioReceive ioReceive()} call.
|
||||||
|
*
|
||||||
|
* It can be used to identify the images by comparing the unique timestamps
|
||||||
|
* when used with {@link android.hardware.camera2} APIs.
|
||||||
|
* Example steps:
|
||||||
|
* 1. Save {@link android.hardware.camera2.TotalCaptureResult} when the
|
||||||
|
* capture is completed.
|
||||||
|
* 2. Get the timestamp after {@link #ioReceive ioReceive()} call.
|
||||||
|
* 3. Comparing totalCaptureResult.get(CaptureResult.SENSOR_TIMESTAMP) with
|
||||||
|
* alloc.getTimeStamp().
|
||||||
|
* @return long Timestamp associated with the buffer held by the Allocation.
|
||||||
|
*/
|
||||||
|
public long getTimeStamp() {
|
||||||
|
return mTimeStamp;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the handle to a raw buffer that is being managed by the screen
|
* Returns the handle to a raw buffer that is being managed by the screen
|
||||||
* compositor. This operation is only valid for Allocations with {@link
|
* compositor. This operation is only valid for Allocations with {@link
|
||||||
@@ -2210,7 +2353,7 @@ public class Allocation extends BaseObj {
|
|||||||
if(id == 0) {
|
if(id == 0) {
|
||||||
throw new RSRuntimeException("Load failed for bitmap " + b + " element " + e);
|
throw new RSRuntimeException("Load failed for bitmap " + b + " element " + e);
|
||||||
}
|
}
|
||||||
return new Allocation(id, rs, t, usage);
|
return new Allocation(id, rs, t, usage, mips);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -484,7 +484,6 @@ public class RenderScript {
|
|||||||
rsnAllocationCopyToBitmap(mContext, alloc, bmp);
|
rsnAllocationCopyToBitmap(mContext, alloc, bmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
native void rsnAllocationSyncAll(long con, long alloc, int src);
|
native void rsnAllocationSyncAll(long con, long alloc, int src);
|
||||||
synchronized void nAllocationSyncAll(long alloc, int src) {
|
synchronized void nAllocationSyncAll(long alloc, int src) {
|
||||||
validate();
|
validate();
|
||||||
@@ -497,6 +496,16 @@ public class RenderScript {
|
|||||||
return rsnAllocationGetByteBuffer(mContext, alloc, stride, xBytesSize, dimY, dimZ);
|
return rsnAllocationGetByteBuffer(mContext, alloc, stride, xBytesSize, dimY, dimZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
native void rsnAllocationSetupBufferQueue(long con, long alloc, int numAlloc);
|
||||||
|
synchronized void nAllocationSetupBufferQueue(long alloc, int numAlloc) {
|
||||||
|
validate();
|
||||||
|
rsnAllocationSetupBufferQueue(mContext, alloc, numAlloc);
|
||||||
|
}
|
||||||
|
native void rsnAllocationShareBufferQueue(long con, long alloc1, long alloc2);
|
||||||
|
synchronized void nAllocationShareBufferQueue(long alloc1, long alloc2) {
|
||||||
|
validate();
|
||||||
|
rsnAllocationShareBufferQueue(mContext, alloc1, alloc2);
|
||||||
|
}
|
||||||
native Surface rsnAllocationGetSurface(long con, long alloc);
|
native Surface rsnAllocationGetSurface(long con, long alloc);
|
||||||
synchronized Surface nAllocationGetSurface(long alloc) {
|
synchronized Surface nAllocationGetSurface(long alloc) {
|
||||||
validate();
|
validate();
|
||||||
@@ -512,13 +521,12 @@ public class RenderScript {
|
|||||||
validate();
|
validate();
|
||||||
rsnAllocationIoSend(mContext, alloc);
|
rsnAllocationIoSend(mContext, alloc);
|
||||||
}
|
}
|
||||||
native void rsnAllocationIoReceive(long con, long alloc);
|
native long rsnAllocationIoReceive(long con, long alloc);
|
||||||
synchronized void nAllocationIoReceive(long alloc) {
|
synchronized long nAllocationIoReceive(long alloc) {
|
||||||
validate();
|
validate();
|
||||||
rsnAllocationIoReceive(mContext, alloc);
|
return rsnAllocationIoReceive(mContext, alloc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
native void rsnAllocationGenerateMipmaps(long con, long alloc);
|
native void rsnAllocationGenerateMipmaps(long con, long alloc);
|
||||||
synchronized void nAllocationGenerateMipmaps(long alloc) {
|
synchronized void nAllocationGenerateMipmaps(long alloc) {
|
||||||
validate();
|
validate();
|
||||||
|
|||||||
@@ -1223,6 +1223,27 @@ nAllocationSyncAll(JNIEnv *_env, jobject _this, jlong con, jlong a, jint bits)
|
|||||||
rsAllocationSyncAll((RsContext)con, (RsAllocation)a, (RsAllocationUsageType)bits);
|
rsAllocationSyncAll((RsContext)con, (RsAllocation)a, (RsAllocationUsageType)bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
nAllocationSetupBufferQueue(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint numAlloc)
|
||||||
|
{
|
||||||
|
if (kLogApi) {
|
||||||
|
ALOGD("nAllocationSetupBufferQueue, con(%p), alloc(%p), numAlloc(%d)", (RsContext)con,
|
||||||
|
(RsAllocation)alloc, numAlloc);
|
||||||
|
}
|
||||||
|
rsAllocationSetupBufferQueue((RsContext)con, (RsAllocation)alloc, (uint32_t)numAlloc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
nAllocationShareBufferQueue(JNIEnv *_env, jobject _this, jlong con, jlong alloc1, jlong alloc2)
|
||||||
|
{
|
||||||
|
if (kLogApi) {
|
||||||
|
ALOGD("nAllocationShareBufferQueue, con(%p), alloc1(%p), alloc2(%p)", (RsContext)con,
|
||||||
|
(RsAllocation)alloc1, (RsAllocation)alloc2);
|
||||||
|
}
|
||||||
|
|
||||||
|
rsAllocationShareBufferQueue((RsContext)con, (RsAllocation)alloc1, (RsAllocation)alloc2);
|
||||||
|
}
|
||||||
|
|
||||||
static jobject
|
static jobject
|
||||||
nAllocationGetSurface(JNIEnv *_env, jobject _this, jlong con, jlong a)
|
nAllocationGetSurface(JNIEnv *_env, jobject _this, jlong con, jlong a)
|
||||||
{
|
{
|
||||||
@@ -1265,16 +1286,15 @@ nAllocationIoSend(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
|
|||||||
rsAllocationIoSend((RsContext)con, (RsAllocation)alloc);
|
rsAllocationIoSend((RsContext)con, (RsAllocation)alloc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static jlong
|
||||||
nAllocationIoReceive(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
|
nAllocationIoReceive(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
|
||||||
{
|
{
|
||||||
if (kLogApi) {
|
if (kLogApi) {
|
||||||
ALOGD("nAllocationIoReceive, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
|
ALOGD("nAllocationIoReceive, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
|
||||||
}
|
}
|
||||||
rsAllocationIoReceive((RsContext)con, (RsAllocation)alloc);
|
return (jlong) rsAllocationIoReceive((RsContext)con, (RsAllocation)alloc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
|
nAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
|
||||||
{
|
{
|
||||||
@@ -2856,10 +2876,12 @@ static const JNINativeMethod methods[] = {
|
|||||||
{"rsnAllocationCopyToBitmap", "(JJLandroid/graphics/Bitmap;)V", (void*)nAllocationCopyToBitmap },
|
{"rsnAllocationCopyToBitmap", "(JJLandroid/graphics/Bitmap;)V", (void*)nAllocationCopyToBitmap },
|
||||||
|
|
||||||
{"rsnAllocationSyncAll", "(JJI)V", (void*)nAllocationSyncAll },
|
{"rsnAllocationSyncAll", "(JJI)V", (void*)nAllocationSyncAll },
|
||||||
|
{"rsnAllocationSetupBufferQueue", "(JJI)V", (void*)nAllocationSetupBufferQueue },
|
||||||
|
{"rsnAllocationShareBufferQueue", "(JJJ)V", (void*)nAllocationShareBufferQueue },
|
||||||
{"rsnAllocationGetSurface", "(JJ)Landroid/view/Surface;", (void*)nAllocationGetSurface },
|
{"rsnAllocationGetSurface", "(JJ)Landroid/view/Surface;", (void*)nAllocationGetSurface },
|
||||||
{"rsnAllocationSetSurface", "(JJLandroid/view/Surface;)V", (void*)nAllocationSetSurface },
|
{"rsnAllocationSetSurface", "(JJLandroid/view/Surface;)V", (void*)nAllocationSetSurface },
|
||||||
{"rsnAllocationIoSend", "(JJ)V", (void*)nAllocationIoSend },
|
{"rsnAllocationIoSend", "(JJ)V", (void*)nAllocationIoSend },
|
||||||
{"rsnAllocationIoReceive", "(JJ)V", (void*)nAllocationIoReceive },
|
{"rsnAllocationIoReceive", "(JJ)J", (void*)nAllocationIoReceive },
|
||||||
{"rsnAllocationData1D", "(JJIIILjava/lang/Object;IIIZ)V", (void*)nAllocationData1D },
|
{"rsnAllocationData1D", "(JJIIILjava/lang/Object;IIIZ)V", (void*)nAllocationData1D },
|
||||||
{"rsnAllocationElementData", "(JJIIIII[BI)V", (void*)nAllocationElementData },
|
{"rsnAllocationElementData", "(JJIIIII[BI)V", (void*)nAllocationElementData },
|
||||||
{"rsnAllocationData2D", "(JJIIIIIILjava/lang/Object;IIIZ)V", (void*)nAllocationData2D },
|
{"rsnAllocationData2D", "(JJIIIIIILjava/lang/Object;IIIZ)V", (void*)nAllocationData2D },
|
||||||
|
|||||||
Reference in New Issue
Block a user