diff options
Diffstat (limited to 'rs')
-rw-r--r-- | rs/java/android/renderscript/Allocation.java | 130 | ||||
-rw-r--r-- | rs/java/android/renderscript/RenderScript.java | 53 | ||||
-rw-r--r-- | rs/jni/android_renderscript_RenderScript.cpp | 215 |
3 files changed, 329 insertions, 69 deletions
diff --git a/rs/java/android/renderscript/Allocation.java b/rs/java/android/renderscript/Allocation.java index ede63a9..1164651 100644 --- a/rs/java/android/renderscript/Allocation.java +++ b/rs/java/android/renderscript/Allocation.java @@ -60,6 +60,7 @@ public class Allocation extends BaseObj { boolean mReadAllowed = true; boolean mWriteAllowed = true; + boolean mAutoPadding = false; int mSelectedX; int mSelectedY; int mSelectedZ; @@ -270,6 +271,17 @@ public class Allocation extends BaseObj { } /** + * @hide + * Enable/Disable AutoPadding for Vec3 elements. + * + * @param useAutoPadding True: enable AutoPadding; flase: disable AutoPadding + * + */ + public void setAutoPadding(boolean useAutoPadding) { + mAutoPadding = useAutoPadding; + } + + /** * Get the size of the Allocation in bytes. * * @return size of the Allocation in bytes. @@ -851,7 +863,7 @@ public class Allocation extends BaseObj { component_number, data, data_length); } - private void data1DChecks(int off, int count, int len, int dataSize) { + private void data1DChecks(int off, int count, int len, int dataSize, boolean usePadding) { mRS.validate(); if(off < 0) { throw new RSIllegalArgumentException("Offset must be >= 0."); @@ -863,8 +875,14 @@ public class Allocation extends BaseObj { throw new RSIllegalArgumentException("Overflow, Available count " + mCurrentCount + ", got " + count + " at offset " + off + "."); } - if(len < dataSize) { - throw new RSIllegalArgumentException("Array too small for allocation type."); + if(usePadding) { + if(len < dataSize / 4 * 3) { + throw new RSIllegalArgumentException("Array too small for allocation type."); + } + } else { + if(len < dataSize) { + throw new RSIllegalArgumentException("Array too small for allocation type."); + } } } @@ -886,8 +904,14 @@ public class Allocation extends BaseObj { Element.DataType dt, int arrayLen) { Trace.traceBegin(RenderScript.TRACE_TAG, "copy1DRangeFromUnchecked"); final int dataSize = mType.mElement.getBytesSize() * count; - data1DChecks(off, count, arrayLen * dt.mSize, dataSize); - mRS.nAllocationData1D(getIDSafe(), off, mSelectedLOD, count, array, dataSize, dt); + // AutoPadding for Vec3 Element + boolean usePadding = false; + if (mAutoPadding && (mType.getElement().getVectorSize() == 3)) { + usePadding = true; + } + data1DChecks(off, count, arrayLen * dt.mSize, dataSize, usePadding); + mRS.nAllocationData1D(getIDSafe(), off, mSelectedLOD, count, array, dataSize, dt, + mType.mElement.mType.mSize, usePadding); Trace.traceEnd(RenderScript.TRACE_TAG); } @@ -1064,8 +1088,24 @@ public class Allocation extends BaseObj { Trace.traceBegin(RenderScript.TRACE_TAG, "copy2DRangeFromUnchecked"); mRS.validate(); validate2DRange(xoff, yoff, w, h); + final int dataSize = mType.mElement.getBytesSize() * w * h; + // AutoPadding for Vec3 Element + boolean usePadding = false; + int sizeBytes = arrayLen * dt.mSize; + if (mAutoPadding && (mType.getElement().getVectorSize() == 3)) { + if (dataSize / 4 * 3 > sizeBytes) { + throw new RSIllegalArgumentException("Array too small for allocation type."); + } + usePadding = true; + sizeBytes = dataSize; + } else { + if (dataSize > sizeBytes) { + throw new RSIllegalArgumentException("Array too small for allocation type."); + } + } mRS.nAllocationData2D(getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace.mID, w, h, - array, arrayLen * dt.mSize, dt); + array, sizeBytes, dt, + mType.mElement.mType.mSize, usePadding); Trace.traceEnd(RenderScript.TRACE_TAG); } @@ -1226,8 +1266,24 @@ public class Allocation extends BaseObj { Trace.traceBegin(RenderScript.TRACE_TAG, "copy3DRangeFromUnchecked"); mRS.validate(); validate3DRange(xoff, yoff, zoff, w, h, d); + final int dataSize = mType.mElement.getBytesSize() * w * h * d; + // AutoPadding for Vec3 Element + boolean usePadding = false; + int sizeBytes = arrayLen * dt.mSize; + if (mAutoPadding && (mType.getElement().getVectorSize() == 3)) { + if (dataSize / 4 * 3 > sizeBytes) { + throw new RSIllegalArgumentException("Array too small for allocation type."); + } + usePadding = true; + sizeBytes = dataSize; + } else { + if (dataSize > sizeBytes) { + throw new RSIllegalArgumentException("Array too small for allocation type."); + } + } mRS.nAllocationData3D(getIDSafe(), xoff, yoff, zoff, mSelectedLOD, w, h, d, - array, arrayLen * dt.mSize, dt); + array, sizeBytes, dt, + mType.mElement.mType.mSize, usePadding); Trace.traceEnd(RenderScript.TRACE_TAG); } @@ -1242,7 +1298,7 @@ public class Allocation extends BaseObj { * @param w Width of the region to update * @param h Height of the region to update * @param d Depth of the region to update - * @param data to be placed into the allocation + * @param array to be placed into the allocation */ public void copy3DRangeFrom(int xoff, int yoff, int zoff, int w, int h, int d, Object array) { Trace.traceBegin(RenderScript.TRACE_TAG, "copy3DRangeFrom"); @@ -1300,7 +1356,11 @@ public class Allocation extends BaseObj { "Size of output array cannot be smaller than size of allocation."); } mRS.validate(); - mRS.nAllocationRead(getID(mRS), array, dt); + boolean usePadding = false; + if (mAutoPadding && (mType.getElement().getVectorSize() == 3)) { + usePadding = true; + } + mRS.nAllocationRead(getID(mRS), array, dt, mType.mElement.mType.mSize, usePadding); Trace.traceEnd(RenderScript.TRACE_TAG); } @@ -1469,8 +1529,14 @@ public class Allocation extends BaseObj { Element.DataType dt, int arrayLen) { Trace.traceBegin(RenderScript.TRACE_TAG, "copy1DRangeToUnchecked"); final int dataSize = mType.mElement.getBytesSize() * count; - data1DChecks(off, count, arrayLen * dt.mSize, dataSize); - mRS.nAllocationRead1D(getIDSafe(), off, mSelectedLOD, count, array, dataSize, dt); + // AutoPadding for Vec3 Element + boolean usePadding = false; + if (mAutoPadding && (mType.getElement().getVectorSize() == 3)) { + usePadding = true; + } + data1DChecks(off, count, arrayLen * dt.mSize, dataSize, usePadding); + mRS.nAllocationRead1D(getIDSafe(), off, mSelectedLOD, count, array, dataSize, dt, + mType.mElement.mType.mSize, usePadding); Trace.traceEnd(RenderScript.TRACE_TAG); } @@ -1624,8 +1690,23 @@ public class Allocation extends BaseObj { Trace.traceBegin(RenderScript.TRACE_TAG, "copy2DRangeToUnchecked"); mRS.validate(); validate2DRange(xoff, yoff, w, h); + final int dataSize = mType.mElement.getBytesSize() * w * h; + // AutoPadding for Vec3 Element + boolean usePadding = false; + int sizeBytes = arrayLen * dt.mSize; + if (mAutoPadding && (mType.getElement().getVectorSize() == 3)) { + if (dataSize / 4 * 3 > sizeBytes) { + throw new RSIllegalArgumentException("Array too small for allocation type."); + } + usePadding = true; + sizeBytes = dataSize; + } else { + if (dataSize > sizeBytes) { + throw new RSIllegalArgumentException("Array too small for allocation type."); + } + } mRS.nAllocationRead2D(getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace.mID, w, h, - array, arrayLen * dt.mSize, dt); + array, sizeBytes, dt, mType.mElement.mType.mSize, usePadding); Trace.traceEnd(RenderScript.TRACE_TAG); } @@ -1653,7 +1734,7 @@ public class Allocation extends BaseObj { * @param yoff Y offset of the region to copy in this Allocation * @param w Width of the region to copy * @param h Height of the region to copy - * @param array Dest Array to be copied into + * @param data Dest Array to be copied into */ public void copy2DRangeTo(int xoff, int yoff, int w, int h, byte[] data) { validateIsInt8(); @@ -1669,7 +1750,7 @@ public class Allocation extends BaseObj { * @param yoff Y offset of the region to copy in this Allocation * @param w Width of the region to copy * @param h Height of the region to copy - * @param array Dest Array to be copied into + * @param data Dest Array to be copied into */ public void copy2DRangeTo(int xoff, int yoff, int w, int h, short[] data) { validateIsInt16(); @@ -1685,7 +1766,7 @@ public class Allocation extends BaseObj { * @param yoff Y offset of the region to copy in this Allocation * @param w Width of the region to copy * @param h Height of the region to copy - * @param array Dest Array to be copied into + * @param data Dest Array to be copied into */ public void copy2DRangeTo(int xoff, int yoff, int w, int h, int[] data) { validateIsInt32(); @@ -1701,7 +1782,7 @@ public class Allocation extends BaseObj { * @param yoff Y offset of the region to copy in this Allocation * @param w Width of the region to copy * @param h Height of the region to copy - * @param array Dest Array to be copied into + * @param data Dest Array to be copied into */ public void copy2DRangeTo(int xoff, int yoff, int w, int h, float[] data) { validateIsFloat32(); @@ -1719,8 +1800,23 @@ public class Allocation extends BaseObj { Trace.traceBegin(RenderScript.TRACE_TAG, "copy3DRangeToUnchecked"); mRS.validate(); validate3DRange(xoff, yoff, zoff, w, h, d); + final int dataSize = mType.mElement.getBytesSize() * w * h * d; + // AutoPadding for Vec3 Element + boolean usePadding = false; + int sizeBytes = arrayLen * dt.mSize; + if (mAutoPadding && (mType.getElement().getVectorSize() == 3)) { + if (dataSize / 4 * 3 > sizeBytes) { + throw new RSIllegalArgumentException("Array too small for allocation type."); + } + usePadding = true; + sizeBytes = dataSize; + } else { + if (dataSize > sizeBytes) { + throw new RSIllegalArgumentException("Array too small for allocation type."); + } + } mRS.nAllocationRead3D(getIDSafe(), xoff, yoff, zoff, mSelectedLOD, w, h, d, - array, arrayLen * dt.mSize, dt); + array, sizeBytes, dt, mType.mElement.mType.mSize, usePadding); Trace.traceEnd(RenderScript.TRACE_TAG); } diff --git a/rs/java/android/renderscript/RenderScript.java b/rs/java/android/renderscript/RenderScript.java index 1f3b63e..6c32238 100644 --- a/rs/java/android/renderscript/RenderScript.java +++ b/rs/java/android/renderscript/RenderScript.java @@ -484,10 +484,12 @@ public class RenderScript { } - native void rsnAllocationData1D(long con, long id, int off, int mip, int count, Object d, int sizeBytes, int dt); - synchronized void nAllocationData1D(long id, int off, int mip, int count, Object d, int sizeBytes, Element.DataType dt) { + native void rsnAllocationData1D(long con, long id, int off, int mip, int count, Object d, int sizeBytes, int dt, + int mSize, boolean usePadding); + synchronized void nAllocationData1D(long id, int off, int mip, int count, Object d, int sizeBytes, Element.DataType dt, + int mSize, boolean usePadding) { validate(); - rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes, dt.mID); + rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes, dt.mID, mSize, usePadding); } native void rsnAllocationElementData(long con,long id, int xoff, int yoff, int zoff, int mip, int compIdx, byte[] d, int sizeBytes); @@ -517,11 +519,13 @@ public class RenderScript { } native void rsnAllocationData2D(long con, long id, int xoff, int yoff, int mip, int face, - int w, int h, Object d, int sizeBytes, int dt); + int w, int h, Object d, int sizeBytes, int dt, + int mSize, boolean usePadding); synchronized void nAllocationData2D(long id, int xoff, int yoff, int mip, int face, - int w, int h, Object d, int sizeBytes, Element.DataType dt) { + int w, int h, Object d, int sizeBytes, Element.DataType dt, + int mSize, boolean usePadding) { validate(); - rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes, dt.mID); + rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes, dt.mID, mSize, usePadding); } native void rsnAllocationData2D(long con, long id, int xoff, int yoff, int mip, int face, Bitmap b); @@ -549,25 +553,28 @@ public class RenderScript { } native void rsnAllocationData3D(long con, long id, int xoff, int yoff, int zoff, int mip, - int w, int h, int depth, Object d, int sizeBytes, int dt); + int w, int h, int depth, Object d, int sizeBytes, int dt, + int mSize, boolean usePadding); synchronized void nAllocationData3D(long id, int xoff, int yoff, int zoff, int mip, - int w, int h, int depth, Object d, int sizeBytes, Element.DataType dt) { + int w, int h, int depth, Object d, int sizeBytes, Element.DataType dt, + int mSize, boolean usePadding) { validate(); - rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes, dt.mID); + rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes, + dt.mID, mSize, usePadding); } - native void rsnAllocationRead(long con, long id, Object d, int dt); - synchronized void nAllocationRead(long id, Object d, Element.DataType dt) { + native void rsnAllocationRead(long con, long id, Object d, int dt, int mSize, boolean usePadding); + synchronized void nAllocationRead(long id, Object d, Element.DataType dt, int mSize, boolean usePadding) { validate(); - rsnAllocationRead(mContext, id, d, dt.mID); + rsnAllocationRead(mContext, id, d, dt.mID, mSize, usePadding); } native void rsnAllocationRead1D(long con, long id, int off, int mip, int count, Object d, - int sizeBytes, int dt); + int sizeBytes, int dt, int mSize, boolean usePadding); synchronized void nAllocationRead1D(long id, int off, int mip, int count, Object d, - int sizeBytes, Element.DataType dt) { + int sizeBytes, Element.DataType dt, int mSize, boolean usePadding) { validate(); - rsnAllocationRead1D(mContext, id, off, mip, count, d, sizeBytes, dt.mID); + rsnAllocationRead1D(mContext, id, off, mip, count, d, sizeBytes, dt.mID, mSize, usePadding); } native void rsnAllocationElementRead(long con,long id, int xoff, int yoff, int zoff, @@ -580,19 +587,23 @@ public class RenderScript { } native void rsnAllocationRead2D(long con, long id, int xoff, int yoff, int mip, int face, - int w, int h, Object d, int sizeBytes, int dt); + int w, int h, Object d, int sizeBytes, int dt, + int mSize, boolean usePadding); synchronized void nAllocationRead2D(long id, int xoff, int yoff, int mip, int face, - int w, int h, Object d, int sizeBytes, Element.DataType dt) { + int w, int h, Object d, int sizeBytes, Element.DataType dt, + int mSize, boolean usePadding) { validate(); - rsnAllocationRead2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes, dt.mID); + rsnAllocationRead2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes, dt.mID, mSize, usePadding); } native void rsnAllocationRead3D(long con, long id, int xoff, int yoff, int zoff, int mip, - int w, int h, int depth, Object d, int sizeBytes, int dt); + int w, int h, int depth, Object d, int sizeBytes, int dt, + int mSize, boolean usePadding); synchronized void nAllocationRead3D(long id, int xoff, int yoff, int zoff, int mip, - int w, int h, int depth, Object d, int sizeBytes, Element.DataType dt) { + int w, int h, int depth, Object d, int sizeBytes, Element.DataType dt, + int mSize, boolean usePadding) { validate(); - rsnAllocationRead3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes, dt.mID); + rsnAllocationRead3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes, dt.mID, mSize, usePadding); } native long rsnAllocationGetType(long con, long id); diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp index d8e1464..f8bce2acd 100644 --- a/rs/jni/android_renderscript_RenderScript.cpp +++ b/rs/jni/android_renderscript_RenderScript.cpp @@ -53,10 +53,12 @@ void UNUSED(T... t) {} #define PER_ARRAY_TYPE(flag, fnc, readonly, ...) { \ jint len = 0; \ void *ptr = nullptr; \ + void *srcPtr = nullptr; \ size_t typeBytes = 0; \ jint relFlag = 0; \ if (readonly) { \ /* The on-release mode should only be JNI_ABORT for read-only accesses. */ \ + /* readonly = true, also indicates we are copying to the allocation . */ \ relFlag = JNI_ABORT; \ } \ switch(dataType) { \ @@ -64,14 +66,50 @@ void UNUSED(T... t) {} len = _env->GetArrayLength((jfloatArray)data); \ ptr = _env->GetFloatArrayElements((jfloatArray)data, flag); \ typeBytes = 4; \ - fnc(__VA_ARGS__); \ + if (usePadding) { \ + srcPtr = ptr; \ + len = len / 3 * 4; \ + if (count == 0) { \ + count = len / 4; \ + } \ + ptr = malloc (len * typeBytes); \ + if (readonly) { \ + copyWithPadding(ptr, srcPtr, mSize, count); \ + fnc(__VA_ARGS__); \ + } else { \ + fnc(__VA_ARGS__); \ + copyWithUnPadding(srcPtr, ptr, mSize, count); \ + } \ + free(ptr); \ + ptr = srcPtr; \ + } else { \ + fnc(__VA_ARGS__); \ + } \ _env->ReleaseFloatArrayElements((jfloatArray)data, (jfloat *)ptr, relFlag); \ return; \ case RS_TYPE_FLOAT_64: \ len = _env->GetArrayLength((jdoubleArray)data); \ ptr = _env->GetDoubleArrayElements((jdoubleArray)data, flag); \ typeBytes = 8; \ - fnc(__VA_ARGS__); \ + if (usePadding) { \ + srcPtr = ptr; \ + len = len / 3 * 4; \ + if (count == 0) { \ + count = len / 4; \ + } \ + ptr = malloc (len * typeBytes); \ + if (readonly) { \ + copyWithPadding(ptr, srcPtr, mSize, count); \ + fnc(__VA_ARGS__); \ + } else { \ + fnc(__VA_ARGS__); \ + copyWithUnPadding(srcPtr, ptr, mSize, count); \ + } \ + free(ptr); \ + ptr = srcPtr; \ + } else { \ + fnc(__VA_ARGS__); \ + } \ _env->ReleaseDoubleArrayElements((jdoubleArray)data, (jdouble *)ptr, relFlag); \ return; \ case RS_TYPE_SIGNED_8: \ @@ -79,7 +117,25 @@ void UNUSED(T... t) {} len = _env->GetArrayLength((jbyteArray)data); \ ptr = _env->GetByteArrayElements((jbyteArray)data, flag); \ typeBytes = 1; \ - fnc(__VA_ARGS__); \ + if (usePadding) { \ + srcPtr = ptr; \ + len = len / 3 * 4; \ + if (count == 0) { \ + count = len / 4; \ + } \ + ptr = malloc (len * typeBytes); \ + if (readonly) { \ + copyWithPadding(ptr, srcPtr, mSize, count); \ + fnc(__VA_ARGS__); \ + } else { \ + fnc(__VA_ARGS__); \ + copyWithUnPadding(srcPtr, ptr, mSize, count); \ + } \ + free(ptr); \ + ptr = srcPtr; \ + } else { \ + fnc(__VA_ARGS__); \ + } \ _env->ReleaseByteArrayElements((jbyteArray)data, (jbyte*)ptr, relFlag); \ return; \ case RS_TYPE_SIGNED_16: \ @@ -87,7 +143,25 @@ void UNUSED(T... t) {} len = _env->GetArrayLength((jshortArray)data); \ ptr = _env->GetShortArrayElements((jshortArray)data, flag); \ typeBytes = 2; \ - fnc(__VA_ARGS__); \ + if (usePadding) { \ + srcPtr = ptr; \ + len = len / 3 * 4; \ + if (count == 0) { \ + count = len / 4; \ + } \ + ptr = malloc (len * typeBytes); \ + if (readonly) { \ + copyWithPadding(ptr, srcPtr, mSize, count); \ + fnc(__VA_ARGS__); \ + } else { \ + fnc(__VA_ARGS__); \ + copyWithUnPadding(srcPtr, ptr, mSize, count); \ + } \ + free(ptr); \ + ptr = srcPtr; \ + } else { \ + fnc(__VA_ARGS__); \ + } \ _env->ReleaseShortArrayElements((jshortArray)data, (jshort *)ptr, relFlag); \ return; \ case RS_TYPE_SIGNED_32: \ @@ -95,7 +169,25 @@ void UNUSED(T... t) {} len = _env->GetArrayLength((jintArray)data); \ ptr = _env->GetIntArrayElements((jintArray)data, flag); \ typeBytes = 4; \ - fnc(__VA_ARGS__); \ + if (usePadding) { \ + srcPtr = ptr; \ + len = len / 3 * 4; \ + if (count == 0) { \ + count = len / 4; \ + } \ + ptr = malloc (len * typeBytes); \ + if (readonly) { \ + copyWithPadding(ptr, srcPtr, mSize, count); \ + fnc(__VA_ARGS__); \ + } else { \ + fnc(__VA_ARGS__); \ + copyWithUnPadding(srcPtr, ptr, mSize, count); \ + } \ + free(ptr); \ + ptr = srcPtr; \ + } else { \ + fnc(__VA_ARGS__); \ + } \ _env->ReleaseIntArrayElements((jintArray)data, (jint *)ptr, relFlag); \ return; \ case RS_TYPE_SIGNED_64: \ @@ -103,13 +195,31 @@ void UNUSED(T... t) {} len = _env->GetArrayLength((jlongArray)data); \ ptr = _env->GetLongArrayElements((jlongArray)data, flag); \ typeBytes = 8; \ - fnc(__VA_ARGS__); \ + if (usePadding) { \ + srcPtr = ptr; \ + len = len / 3 * 4; \ + if (count == 0) { \ + count = len / 4; \ + } \ + ptr = malloc (len * typeBytes); \ + if (readonly) { \ + copyWithPadding(ptr, srcPtr, mSize, count); \ + fnc(__VA_ARGS__); \ + } else { \ + fnc(__VA_ARGS__); \ + copyWithUnPadding(srcPtr, ptr, mSize, count); \ + } \ + free(ptr); \ + ptr = srcPtr; \ + } else { \ + fnc(__VA_ARGS__); \ + } \ _env->ReleaseLongArrayElements((jlongArray)data, (jlong *)ptr, relFlag); \ return; \ default: \ break; \ } \ - UNUSED(len, ptr, typeBytes, relFlag); \ + UNUSED(len, ptr, srcPtr, typeBytes, relFlag); \ } @@ -179,6 +289,32 @@ static void _nInit(JNIEnv *_env, jclass _this) // --------------------------------------------------------------------------- +static void copyWithPadding(void* ptr, void* srcPtr, int mSize, int count) { + int sizeBytesPad = mSize * 4; + int sizeBytes = mSize * 3; + uint8_t *dst = static_cast<uint8_t *>(ptr); + uint8_t *src = static_cast<uint8_t *>(srcPtr); + for (int i = 0; i < count; i++) { + memcpy(dst, src, sizeBytes); + dst += sizeBytesPad; + src += sizeBytes; + } +} + +static void copyWithUnPadding(void* ptr, void* srcPtr, int mSize, int count) { + int sizeBytesPad = mSize * 4; + int sizeBytes = mSize * 3; + uint8_t *dst = static_cast<uint8_t *>(ptr); + uint8_t *src = static_cast<uint8_t *>(srcPtr); + for (int i = 0; i < count; i++) { + memcpy(dst, src, sizeBytes); + dst += sizeBytes; + src += sizeBytesPad; + } +} + + +// --------------------------------------------------------------------------- static void nContextFinish(JNIEnv *_env, jobject _this, jlong con) { @@ -1009,7 +1145,8 @@ nAllocationCopyToBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, job // Copies from the Java object data into the Allocation pointed to by _alloc. static void nAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod, - jint count, jobject data, jint sizeBytes, jint dataType) + jint count, jobject data, jint sizeBytes, jint dataType, jint mSize, + jboolean usePadding) { RsAllocation *alloc = (RsAllocation *)_alloc; if (kLogApi) { @@ -1017,8 +1154,8 @@ nAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint off "dataType(%i)", (RsContext)con, (RsAllocation)alloc, offset, count, sizeBytes, dataType); } - PER_ARRAY_TYPE(nullptr, rsAllocation1DData, true, (RsContext)con, alloc, offset, lod, count, - ptr, sizeBytes); + PER_ARRAY_TYPE(nullptr, rsAllocation1DData, true, + (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes); } static void @@ -1043,7 +1180,8 @@ nAllocationElementData(JNIEnv *_env, jobject _this, jlong con, jlong alloc, // Copies from the Java object data into the Allocation pointed to by _alloc. static void nAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face, - jint w, jint h, jobject data, jint sizeBytes, jint dataType) + jint w, jint h, jobject data, jint sizeBytes, jint dataType, jint mSize, + jboolean usePadding) { RsAllocation *alloc = (RsAllocation *)_alloc; RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face; @@ -1051,7 +1189,9 @@ nAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xof ALOGD("nAllocation2DData, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) " "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType); } - PER_ARRAY_TYPE(nullptr, rsAllocation2DData, true, (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0); + int count = w * h; + PER_ARRAY_TYPE(nullptr, rsAllocation2DData, true, + (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0); } // Copies from the Allocation pointed to by srcAlloc into the Allocation @@ -1085,7 +1225,8 @@ nAllocationData2D_alloc(JNIEnv *_env, jobject _this, jlong con, // Copies from the Java object data into the Allocation pointed to by _alloc. static void nAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod, - jint w, jint h, jint d, jobject data, int sizeBytes, int dataType) + jint w, jint h, jint d, jobject data, jint sizeBytes, jint dataType, + jint mSize, jboolean usePadding) { RsAllocation *alloc = (RsAllocation *)_alloc; if (kLogApi) { @@ -1093,7 +1234,9 @@ nAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xof " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, lod, w, h, d, sizeBytes); } - PER_ARRAY_TYPE(nullptr, rsAllocation3DData, true, (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0); + int count = w * h * d; + PER_ARRAY_TYPE(nullptr, rsAllocation3DData, true, + (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0); } // Copies from the Allocation pointed to by srcAlloc into the Allocation @@ -1125,26 +1268,31 @@ nAllocationData3D_alloc(JNIEnv *_env, jobject _this, jlong con, // Copies from the Allocation pointed to by _alloc into the Java object data. static void -nAllocationRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jobject data, int dataType) +nAllocationRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jobject data, jint dataType, + jint mSize, jboolean usePadding) { RsAllocation *alloc = (RsAllocation *)_alloc; if (kLogApi) { ALOGD("nAllocationRead, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc); } - PER_ARRAY_TYPE(0, rsAllocationRead, false, (RsContext)con, alloc, ptr, len * typeBytes); + int count = 0; + PER_ARRAY_TYPE(0, rsAllocationRead, false, + (RsContext)con, alloc, ptr, len * typeBytes); } // Copies from the Allocation pointed to by _alloc into the Java object data. static void nAllocationRead1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod, - jint count, jobject data, int sizeBytes, int dataType) + jint count, jobject data, jint sizeBytes, jint dataType, + jint mSize, jboolean usePadding) { RsAllocation *alloc = (RsAllocation *)_alloc; if (kLogApi) { ALOGD("nAllocation1DRead, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), " "dataType(%i)", (RsContext)con, alloc, offset, count, sizeBytes, dataType); } - PER_ARRAY_TYPE(0, rsAllocation1DRead, false, (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes); + PER_ARRAY_TYPE(0, rsAllocation1DRead, false, + (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes); } // Copies from the Element in the Allocation pointed to by _alloc into the Java array data. @@ -1165,7 +1313,8 @@ nAllocationElementRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, // Copies from the Allocation pointed to by _alloc into the Java object data. static void nAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face, - jint w, jint h, jobject data, int sizeBytes, int dataType) + jint w, jint h, jobject data, jint sizeBytes, jint dataType, + jint mSize, jboolean usePadding) { RsAllocation *alloc = (RsAllocation *)_alloc; RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face; @@ -1173,13 +1322,16 @@ nAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xof ALOGD("nAllocation2DRead, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) " "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType); } - PER_ARRAY_TYPE(0, rsAllocation2DRead, false, (RsContext)con, alloc, xoff, yoff, lod, face, w, h, - ptr, sizeBytes, 0); + int count = w * h; + PER_ARRAY_TYPE(0, rsAllocation2DRead, false, + (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0); } + // Copies from the Allocation pointed to by _alloc into the Java object data. static void nAllocationRead3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod, - jint w, jint h, jint d, jobject data, int sizeBytes, int dataType) + jint w, jint h, jint d, jobject data, int sizeBytes, int dataType, + jint mSize, jboolean usePadding) { RsAllocation *alloc = (RsAllocation *)_alloc; if (kLogApi) { @@ -1187,8 +1339,9 @@ nAllocationRead3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xof " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, lod, w, h, d, sizeBytes); } - PER_ARRAY_TYPE(0, rsAllocation3DRead, false, (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, - ptr, sizeBytes, 0); + int count = w * h * d; + PER_ARRAY_TYPE(nullptr, rsAllocation3DRead, false, + (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0); } static jlong @@ -2209,17 +2362,17 @@ static JNINativeMethod methods[] = { {"rsnAllocationSetSurface", "(JJLandroid/view/Surface;)V", (void*)nAllocationSetSurface }, {"rsnAllocationIoSend", "(JJ)V", (void*)nAllocationIoSend }, {"rsnAllocationIoReceive", "(JJ)V", (void*)nAllocationIoReceive }, -{"rsnAllocationData1D", "(JJIIILjava/lang/Object;II)V", (void*)nAllocationData1D }, +{"rsnAllocationData1D", "(JJIIILjava/lang/Object;IIIZ)V", (void*)nAllocationData1D }, {"rsnAllocationElementData", "(JJIIIII[BI)V", (void*)nAllocationElementData }, -{"rsnAllocationData2D", "(JJIIIIIILjava/lang/Object;II)V", (void*)nAllocationData2D }, +{"rsnAllocationData2D", "(JJIIIIIILjava/lang/Object;IIIZ)V", (void*)nAllocationData2D }, {"rsnAllocationData2D", "(JJIIIIIIJIIII)V", (void*)nAllocationData2D_alloc }, -{"rsnAllocationData3D", "(JJIIIIIIILjava/lang/Object;II)V", (void*)nAllocationData3D }, +{"rsnAllocationData3D", "(JJIIIIIIILjava/lang/Object;IIIZ)V", (void*)nAllocationData3D }, {"rsnAllocationData3D", "(JJIIIIIIIJIIII)V", (void*)nAllocationData3D_alloc }, -{"rsnAllocationRead", "(JJLjava/lang/Object;I)V", (void*)nAllocationRead }, -{"rsnAllocationRead1D", "(JJIIILjava/lang/Object;II)V", (void*)nAllocationRead1D }, +{"rsnAllocationRead", "(JJLjava/lang/Object;IIZ)V", (void*)nAllocationRead }, +{"rsnAllocationRead1D", "(JJIIILjava/lang/Object;IIIZ)V", (void*)nAllocationRead1D }, {"rsnAllocationElementRead", "(JJIIIIILjava/lang/Object;II)V", (void*)nAllocationElementRead }, -{"rsnAllocationRead2D", "(JJIIIIIILjava/lang/Object;II)V", (void*)nAllocationRead2D }, -{"rsnAllocationRead3D", "(JJIIIIIIILjava/lang/Object;II)V", (void*)nAllocationRead3D }, +{"rsnAllocationRead2D", "(JJIIIIIILjava/lang/Object;IIIZ)V", (void*)nAllocationRead2D }, +{"rsnAllocationRead3D", "(JJIIIIIIILjava/lang/Object;IIIZ)V", (void*)nAllocationRead3D }, {"rsnAllocationGetType", "(JJ)J", (void*)nAllocationGetType}, {"rsnAllocationResize1D", "(JJI)V", (void*)nAllocationResize1D }, {"rsnAllocationGenerateMipmaps", "(JJ)V", (void*)nAllocationGenerateMipmaps }, |