[RenderScript] AutoPadding & Unpadding for Vec3 Elements during

copyTo & copyFrom.

Change-Id: I10b6fb235717e181ebb30b92e4dbe23e6183a29c
This commit is contained in:
Miao Wang
2015-03-02 15:15:15 -08:00
parent 56fde9e70e
commit 87e908dfde
3 changed files with 329 additions and 69 deletions

View File

@@ -54,10 +54,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) { \
@@ -65,14 +67,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: \
@@ -80,7 +118,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: \
@@ -88,7 +144,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: \
@@ -96,7 +170,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: \
@@ -104,13 +196,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); \
}
@@ -184,6 +294,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)
{
@@ -1014,7 +1150,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) {
@@ -1022,8 +1159,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
@@ -1048,7 +1185,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;
@@ -1056,7 +1194,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
@@ -1090,7 +1230,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) {
@@ -1098,7 +1239,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
@@ -1130,26 +1273,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.
@@ -1170,7 +1318,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;
@@ -1178,13 +1327,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) {
@@ -1192,8 +1344,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
@@ -2214,17 +2367,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 },