am 808723f2: Merge "Cleanup Allocation and add 3D copies." into jb-mr2-dev

* commit '808723f2b8a3842114f064a5ad4ee08fa9698192':
  Cleanup Allocation and add 3D copies.
This commit is contained in:
Jason Sams
2013-04-09 21:24:39 -07:00
committed by Android Git Automerger
4 changed files with 270 additions and 55 deletions

View File

@ -19661,8 +19661,7 @@ package android.renderscript {
method public int getUsage();
method public void ioReceive();
method public void ioSend();
method public synchronized void resize(int);
method public synchronized void resize(int, int);
method public deprecated synchronized void resize(int);
method public void setFromFieldPacker(int, android.renderscript.FieldPacker);
method public void setFromFieldPacker(int, int, android.renderscript.FieldPacker);
method public void setSurface(android.view.Surface);

View File

@ -492,7 +492,9 @@ public class Allocation extends BaseObj {
*/
public void copyFromUnchecked(int[] d) {
mRS.validate();
if (mCurrentDimY > 0) {
if (mCurrentDimZ > 0) {
copy3DRangeFromUnchecked(0, 0, 0, mCurrentDimX, mCurrentDimY, mCurrentDimZ, d);
} else if (mCurrentDimY > 0) {
copy2DRangeFromUnchecked(0, 0, mCurrentDimX, mCurrentDimY, d);
} else {
copy1DRangeFromUnchecked(0, mCurrentCount, d);
@ -507,7 +509,9 @@ public class Allocation extends BaseObj {
*/
public void copyFromUnchecked(short[] d) {
mRS.validate();
if (mCurrentDimY > 0) {
if (mCurrentDimZ > 0) {
copy3DRangeFromUnchecked(0, 0, 0, mCurrentDimX, mCurrentDimY, mCurrentDimZ, d);
} else if (mCurrentDimY > 0) {
copy2DRangeFromUnchecked(0, 0, mCurrentDimX, mCurrentDimY, d);
} else {
copy1DRangeFromUnchecked(0, mCurrentCount, d);
@ -522,7 +526,9 @@ public class Allocation extends BaseObj {
*/
public void copyFromUnchecked(byte[] d) {
mRS.validate();
if (mCurrentDimY > 0) {
if (mCurrentDimZ > 0) {
copy3DRangeFromUnchecked(0, 0, 0, mCurrentDimX, mCurrentDimY, mCurrentDimZ, d);
} else if (mCurrentDimY > 0) {
copy2DRangeFromUnchecked(0, 0, mCurrentDimX, mCurrentDimY, d);
} else {
copy1DRangeFromUnchecked(0, mCurrentCount, d);
@ -537,7 +543,9 @@ public class Allocation extends BaseObj {
*/
public void copyFromUnchecked(float[] d) {
mRS.validate();
if (mCurrentDimY > 0) {
if (mCurrentDimZ > 0) {
copy3DRangeFromUnchecked(0, 0, 0, mCurrentDimX, mCurrentDimY, mCurrentDimZ, d);
} else if (mCurrentDimY > 0) {
copy2DRangeFromUnchecked(0, 0, mCurrentDimX, mCurrentDimY, d);
} else {
copy1DRangeFromUnchecked(0, mCurrentCount, d);
@ -553,7 +561,9 @@ public class Allocation extends BaseObj {
*/
public void copyFrom(int[] d) {
mRS.validate();
if (mCurrentDimY > 0) {
if (mCurrentDimZ > 0) {
copy3DRangeFrom(0, 0, 0, mCurrentDimX, mCurrentDimY, mCurrentDimZ, d);
} else if (mCurrentDimY > 0) {
copy2DRangeFrom(0, 0, mCurrentDimX, mCurrentDimY, d);
} else {
copy1DRangeFrom(0, mCurrentCount, d);
@ -569,7 +579,9 @@ public class Allocation extends BaseObj {
*/
public void copyFrom(short[] d) {
mRS.validate();
if (mCurrentDimY > 0) {
if (mCurrentDimZ > 0) {
copy3DRangeFrom(0, 0, 0, mCurrentDimX, mCurrentDimY, mCurrentDimZ, d);
} else if (mCurrentDimY > 0) {
copy2DRangeFrom(0, 0, mCurrentDimX, mCurrentDimY, d);
} else {
copy1DRangeFrom(0, mCurrentCount, d);
@ -585,7 +597,9 @@ public class Allocation extends BaseObj {
*/
public void copyFrom(byte[] d) {
mRS.validate();
if (mCurrentDimY > 0) {
if (mCurrentDimZ > 0) {
copy3DRangeFrom(0, 0, 0, mCurrentDimX, mCurrentDimY, mCurrentDimZ, d);
} else if (mCurrentDimY > 0) {
copy2DRangeFrom(0, 0, mCurrentDimX, mCurrentDimY, d);
} else {
copy1DRangeFrom(0, mCurrentCount, d);
@ -601,7 +615,9 @@ public class Allocation extends BaseObj {
*/
public void copyFrom(float[] d) {
mRS.validate();
if (mCurrentDimY > 0) {
if (mCurrentDimZ > 0) {
copy3DRangeFrom(0, 0, 0, mCurrentDimX, mCurrentDimY, mCurrentDimZ, d);
} else if (mCurrentDimY > 0) {
copy2DRangeFrom(0, 0, mCurrentDimX, mCurrentDimY, d);
} else {
copy1DRangeFrom(0, mCurrentCount, d);
@ -967,12 +983,144 @@ public class Allocation extends BaseObj {
Canvas c = new Canvas(newBitmap);
c.drawBitmap(data, 0, 0, null);
copy2DRangeFrom(xoff, yoff, newBitmap);
return;
}
validateBitmapFormat(data);
validate2DRange(xoff, yoff, data.getWidth(), data.getHeight());
mRS.nAllocationData2D(getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace.mID, data);
}
private void validate3DRange(int xoff, int yoff, int zoff, int w, int h, int d) {
if (mAdaptedAllocation != null) {
} else {
if (xoff < 0 || yoff < 0 || zoff < 0) {
throw new RSIllegalArgumentException("Offset cannot be negative.");
}
if (h < 0 || w < 0 || d < 0) {
throw new RSIllegalArgumentException("Height or width cannot be negative.");
}
if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY) || ((zoff + d) > mCurrentDimZ)) {
throw new RSIllegalArgumentException("Updated region larger than allocation.");
}
}
}
/**
* @hide
*
*/
void copy3DRangeFromUnchecked(int xoff, int yoff, int zoff, int w, int h, int d, byte[] data) {
mRS.validate();
validate3DRange(xoff, yoff, zoff, w, h, d);
mRS.nAllocationData3D(getIDSafe(), xoff, yoff, zoff, mSelectedLOD,
w, h, d, data, data.length);
}
/**
* @hide
*
*/
void copy3DRangeFromUnchecked(int xoff, int yoff, int zoff, int w, int h, int d, short[] data) {
mRS.validate();
validate3DRange(xoff, yoff, zoff, w, h, d);
mRS.nAllocationData3D(getIDSafe(), xoff, yoff, zoff, mSelectedLOD,
w, h, d, data, data.length * 2);
}
/**
* @hide
*
*/
void copy3DRangeFromUnchecked(int xoff, int yoff, int zoff, int w, int h, int d, int[] data) {
mRS.validate();
validate3DRange(xoff, yoff, zoff, w, h, d);
mRS.nAllocationData3D(getIDSafe(), xoff, yoff, zoff, mSelectedLOD,
w, h, d, data, data.length * 4);
}
/**
* @hide
*
*/
void copy3DRangeFromUnchecked(int xoff, int yoff, int zoff, int w, int h, int d, float[] data) {
mRS.validate();
validate3DRange(xoff, yoff, zoff, w, h, d);
mRS.nAllocationData3D(getIDSafe(), xoff, yoff, zoff, mSelectedLOD,
w, h, d, data, data.length * 4);
}
/**
* @hide
* Copy a rectangular region from the array into the allocation.
* The incoming array is assumed to be tightly packed.
*
* @param xoff X offset of the region to update
* @param yoff Y offset of the region to update
* @param zoff Z offset of the region to update
* @param w Width of the incoming region to update
* @param h Height of the incoming region to update
* @param d Depth of the incoming region to update
* @param data to be placed into the allocation
*/
public void copy3DRangeFrom(int xoff, int yoff, int zoff, int w, int h, int d, byte[] data) {
validateIsInt8();
copy3DRangeFromUnchecked(xoff, yoff, zoff, w, h, d, data);
}
/**
* @hide
*
*/
public void copy3DRangeFrom(int xoff, int yoff, int zoff, int w, int h, int d, short[] data) {
validateIsInt16();
copy3DRangeFromUnchecked(xoff, yoff, zoff, w, h, d, data);
}
/**
* @hide
*
*/
public void copy3DRangeFrom(int xoff, int yoff, int zoff, int w, int h, int d, int[] data) {
validateIsInt32();
copy3DRangeFromUnchecked(xoff, yoff, zoff, w, h, d, data);
}
/**
* @hide
*
*/
public void copy3DRangeFrom(int xoff, int yoff, int zoff, int w, int h, int d, float[] data) {
validateIsFloat32();
copy3DRangeFromUnchecked(xoff, yoff, zoff, w, h, d, data);
}
/**
* @hide
* Copy a rectangular region into the allocation from another
* allocation.
*
* @param xoff X offset of the region to update.
* @param yoff Y offset of the region to update.
* @param w Width of the incoming region to update.
* @param h Height of the incoming region to update.
* @param d Depth of the incoming region to update.
* @param data source allocation.
* @param dataXoff X offset in data of the region to update.
* @param dataYoff Y offset in data of the region to update.
* @param dataZoff Z offset in data of the region to update
*/
public void copy3DRangeFrom(int xoff, int yoff, int zoff, int w, int h, int d,
Allocation data, int dataXoff, int dataYoff, int dataZoff) {
mRS.validate();
validate3DRange(xoff, yoff, zoff, w, h, d);
mRS.nAllocationData3D(getIDSafe(), xoff, yoff, zoff, mSelectedLOD,
w, h, d, data.getID(mRS), dataXoff, dataYoff, dataZoff,
data.mSelectedLOD);
}
/**
* Copy from the Allocation into a Bitmap. The bitmap must
@ -1050,6 +1198,8 @@ public class Allocation extends BaseObj {
* A new type will be created with the new dimension.
*
* @param dimX The new size of the allocation.
*
* @deprecated
*/
public synchronized void resize(int dimX) {
if ((mType.getY() > 0)|| (mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) {
@ -1064,38 +1214,6 @@ public class Allocation extends BaseObj {
updateCacheInfo(mType);
}
/**
* Resize a 2D allocation. The contents of the allocation are
* preserved. If new elements are allocated objects are created
* with null contents and the new region is otherwise undefined.
*
* If the new region is smaller the references of any objects
* outside the new region will be released.
*
* A new type will be created with the new dimension.
*
* @param dimX The new size of the allocation.
* @param dimY The new size of the allocation.
*/
public synchronized void resize(int dimX, int dimY) {
if ((mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) {
throw new RSInvalidStateException(
"Resize only support for 2D allocations at this time.");
}
if (mType.getY() == 0) {
throw new RSInvalidStateException(
"Resize only support for 2D allocations at this time.");
}
mRS.nAllocationResize2D(getID(mRS), dimX, dimY);
mRS.finish(); // Necessary because resize is fifoed and update is async.
int typeID = mRS.nAllocationGetType(getID(mRS));
mType = new Type(typeID, mRS);
mType.updateFromNative();
updateCacheInfo(mType);
}
// creation

View File

@ -420,6 +420,46 @@ public class RenderScript {
rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, b);
}
native void rsnAllocationData3D(int con,
int dstAlloc, int dstXoff, int dstYoff, int dstZoff,
int dstMip,
int width, int height, int depth,
int srcAlloc, int srcXoff, int srcYoff, int srcZoff,
int srcMip);
synchronized void nAllocationData3D(int dstAlloc, int dstXoff, int dstYoff, int dstZoff,
int dstMip,
int width, int height, int depth,
int srcAlloc, int srcXoff, int srcYoff, int srcZoff,
int srcMip) {
validate();
rsnAllocationData3D(mContext,
dstAlloc, dstXoff, dstYoff, dstZoff,
dstMip, width, height, depth,
srcAlloc, srcXoff, srcYoff, srcZoff, srcMip);
}
native void rsnAllocationData3D(int con, int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, byte[] d, int sizeBytes);
synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, byte[] d, int sizeBytes) {
validate();
rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
}
native void rsnAllocationData3D(int con, int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, short[] d, int sizeBytes);
synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, short[] d, int sizeBytes) {
validate();
rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
}
native void rsnAllocationData3D(int con, int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, int[] d, int sizeBytes);
synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, int[] d, int sizeBytes) {
validate();
rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
}
native void rsnAllocationData3D(int con, int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, float[] d, int sizeBytes);
synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, float[] d, int sizeBytes) {
validate();
rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
}
native void rsnAllocationRead(int con, int id, byte[] d);
synchronized void nAllocationRead(int id, byte[] d) {
validate();
@ -451,11 +491,6 @@ public class RenderScript {
validate();
rsnAllocationResize1D(mContext, id, dimX);
}
native void rsnAllocationResize2D(int con, int id, int dimX, int dimY);
synchronized void nAllocationResize2D(int id, int dimX, int dimY) {
validate();
rsnAllocationResize2D(mContext, id, dimX, dimY);
}
native int rsnFileA3DCreateFromAssetStream(int con, int assetStream);
synchronized int nFileA3DCreateFromAssetStream(int assetStream) {

View File

@ -724,6 +724,72 @@ nAllocationData2D_alloc(JNIEnv *_env, jobject _this, RsContext con,
srcMip, srcFace);
}
static void
nAllocationData3D_s(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint zoff, jint lod,
jint w, jint h, jint d, jshortArray data, int sizeBytes)
{
jint len = _env->GetArrayLength(data);
LOG_API("nAllocation3DData_s, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", con, (RsAllocation)alloc, xoff, yoff, zoff, w, h, d, len);
jshort *ptr = _env->GetShortArrayElements(data, NULL);
rsAllocation3DData(con, (RsAllocation)alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
_env->ReleaseShortArrayElements(data, ptr, JNI_ABORT);
}
static void
nAllocationData3D_b(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint zoff, jint lod,
jint w, jint h, jint d, jbyteArray data, int sizeBytes)
{
jint len = _env->GetArrayLength(data);
LOG_API("nAllocation3DData_b, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", con, (RsAllocation)alloc, xoff, yoff, zoff, w, h, d, len);
jbyte *ptr = _env->GetByteArrayElements(data, NULL);
rsAllocation3DData(con, (RsAllocation)alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
_env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
}
static void
nAllocationData3D_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint zoff, jint lod,
jint w, jint h, jint d, jintArray data, int sizeBytes)
{
jint len = _env->GetArrayLength(data);
LOG_API("nAllocation3DData_i, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", con, (RsAllocation)alloc, xoff, yoff, zoff, w, h, d, len);
jint *ptr = _env->GetIntArrayElements(data, NULL);
rsAllocation3DData(con, (RsAllocation)alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
_env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
}
static void
nAllocationData3D_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint zoff, jint lod,
jint w, jint h, jint d, jfloatArray data, int sizeBytes)
{
jint len = _env->GetArrayLength(data);
LOG_API("nAllocation3DData_f, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", con, (RsAllocation)alloc, xoff, yoff, zoff, w, h, d, len);
jfloat *ptr = _env->GetFloatArrayElements(data, NULL);
rsAllocation3DData(con, (RsAllocation)alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
_env->ReleaseFloatArrayElements(data, ptr, JNI_ABORT);
}
static void
nAllocationData3D_alloc(JNIEnv *_env, jobject _this, RsContext con,
jint dstAlloc, jint dstXoff, jint dstYoff, jint dstZoff,
jint dstMip,
jint width, jint height, jint depth,
jint srcAlloc, jint srcXoff, jint srcYoff, jint srcZoff,
jint srcMip)
{
LOG_API("nAllocationData3D_alloc, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
" dstMip(%i), width(%i), height(%i),"
" srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i)",
con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
rsAllocationCopy3DRange(con,
(RsAllocation)dstAlloc,
dstXoff, dstYoff, dstZoff, dstMip,
width, height, depth,
(RsAllocation)srcAlloc,
srcXoff, srcYoff, srcZoff, srcMip);
}
static void
nAllocationRead_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jintArray data)
{
@ -782,13 +848,6 @@ nAllocationResize1D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint
rsAllocationResize1D(con, (RsAllocation)alloc, dimX);
}
static void
nAllocationResize2D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint dimX, jint dimY)
{
LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i), sizeY(%i)", con, (RsAllocation)alloc, dimX, dimY);
rsAllocationResize2D(con, (RsAllocation)alloc, dimX, dimY);
}
// -----------------------------------
static int
@ -1519,13 +1578,17 @@ static JNINativeMethod methods[] = {
{"rsnAllocationData2D", "(IIIIIIII[BI)V", (void*)nAllocationData2D_b },
{"rsnAllocationData2D", "(IIIIIIII[FI)V", (void*)nAllocationData2D_f },
{"rsnAllocationData2D", "(IIIIIIIIIIIII)V", (void*)nAllocationData2D_alloc },
{"rsnAllocationData3D", "(IIIIIIIII[II)V", (void*)nAllocationData3D_i },
{"rsnAllocationData3D", "(IIIIIIIII[SI)V", (void*)nAllocationData3D_s },
{"rsnAllocationData3D", "(IIIIIIIII[BI)V", (void*)nAllocationData3D_b },
{"rsnAllocationData3D", "(IIIIIIIII[FI)V", (void*)nAllocationData3D_f },
{"rsnAllocationData3D", "(IIIIIIIIIIIIII)V", (void*)nAllocationData3D_alloc },
{"rsnAllocationRead", "(II[I)V", (void*)nAllocationRead_i },
{"rsnAllocationRead", "(II[S)V", (void*)nAllocationRead_s },
{"rsnAllocationRead", "(II[B)V", (void*)nAllocationRead_b },
{"rsnAllocationRead", "(II[F)V", (void*)nAllocationRead_f },
{"rsnAllocationGetType", "(II)I", (void*)nAllocationGetType},
{"rsnAllocationResize1D", "(III)V", (void*)nAllocationResize1D },
{"rsnAllocationResize2D", "(IIII)V", (void*)nAllocationResize2D },
{"rsnAllocationGenerateMipmaps", "(II)V", (void*)nAllocationGenerateMipmaps },
{"rsnScriptBindAllocation", "(IIII)V", (void*)nScriptBindAllocation },