From 9807155b11a25fb6068edc9b1cd82928ac2f05de Mon Sep 17 00:00:00 2001 From: Ashok Bhat Date: Wed, 12 Feb 2014 09:54:43 +0000 Subject: AArch64: Use long[] for RS id array Change-Id: Ia5145a547c0d13c7d6f1bb4d8f5472be62481bd9 Signed-off-by: Ashok Bhat --- rs/java/android/renderscript/Element.java | 9 +- rs/java/android/renderscript/Mesh.java | 20 +- rs/java/android/renderscript/ProgramFragment.java | 10 +- .../renderscript/ProgramFragmentFixedFunction.java | 10 +- rs/java/android/renderscript/ProgramVertex.java | 10 +- .../renderscript/ProgramVertexFixedFunction.java | 10 +- rs/java/android/renderscript/RenderScript.java | 40 ++-- rs/java/android/renderscript/ScriptGroup.java | 21 +- rs/java/android/renderscript/Type.java | 16 +- rs/jni/android_renderscript_RenderScript.cpp | 220 ++++++++++++++------- 10 files changed, 215 insertions(+), 151 deletions(-) (limited to 'rs') diff --git a/rs/java/android/renderscript/Element.java b/rs/java/android/renderscript/Element.java index 2932770..aa5d687 100644 --- a/rs/java/android/renderscript/Element.java +++ b/rs/java/android/renderscript/Element.java @@ -803,8 +803,6 @@ public class Element extends BaseObj { void updateFromNative() { super.updateFromNative(); - // FIXME: updateFromNative is broken in JNI for 64-bit - // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements int[] dataBuffer = new int[5]; mRS.nElementGetNativeData(getID(mRS), dataBuffer); @@ -831,7 +829,7 @@ public class Element extends BaseObj { mArraySizes = new int[numSubElements]; mOffsetInBytes = new int[numSubElements]; - int[] subElementIds = new int[numSubElements]; + long[] subElementIds = new long[numSubElements]; mRS.nElementGetSubElements(getID(mRS), subElementIds, mElementNames, mArraySizes); for(int i = 0; i < numSubElements; i ++) { mElements[i] = new Element(subElementIds[i], mRS); @@ -1090,10 +1088,9 @@ public class Element extends BaseObj { java.lang.System.arraycopy(mElementNames, 0, sin, 0, mCount); java.lang.System.arraycopy(mArraySizes, 0, asin, 0, mCount); - // FIXME: broken for 64-bit - int[] ids = new int[ein.length]; + long[] ids = new long[ein.length]; for (int ct = 0; ct < ein.length; ct++ ) { - ids[ct] = (int)ein[ct].getID(mRS); + ids[ct] = ein[ct].getID(mRS); } long id = mRS.nElementCreate2(ids, sin, asin); return new Element(id, mRS, ein, sin, asin); diff --git a/rs/java/android/renderscript/Mesh.java b/rs/java/android/renderscript/Mesh.java index 9ce3fb2..ca0da9d 100644 --- a/rs/java/android/renderscript/Mesh.java +++ b/rs/java/android/renderscript/Mesh.java @@ -154,8 +154,8 @@ public class Mesh extends BaseObj { int vtxCount = mRS.nMeshGetVertexBufferCount(getID(mRS)); int idxCount = mRS.nMeshGetIndexCount(getID(mRS)); - int[] vtxIDs = new int[vtxCount]; - int[] idxIDs = new int[idxCount]; + long[] vtxIDs = new long[vtxCount]; + long[] idxIDs = new long[idxCount]; int[] primitives = new int[idxCount]; mRS.nMeshGetVertices(getID(mRS), vtxIDs, vtxCount); @@ -350,8 +350,8 @@ public class Mesh extends BaseObj { **/ public Mesh create() { mRS.validate(); - int[] vtx = new int[mVertexTypeCount]; - int[] idx = new int[mIndexTypes.size()]; + long[] vtx = new long[mVertexTypeCount]; + long[] idx = new long[mIndexTypes.size()]; int[] prim = new int[mIndexTypes.size()]; Allocation[] vertexBuffers = new Allocation[mVertexTypeCount]; @@ -367,7 +367,7 @@ public class Mesh extends BaseObj { alloc = Allocation.createSized(mRS, entry.e, entry.size, mUsage); } vertexBuffers[ct] = alloc; - vtx[ct] = (int)alloc.getID(mRS); + vtx[ct] = alloc.getID(mRS); } for(int ct = 0; ct < mIndexTypes.size(); ct ++) { @@ -382,7 +382,7 @@ public class Mesh extends BaseObj { indexBuffers[ct] = alloc; primitives[ct] = entry.prim; - idx[ct] = (int)allocID; + idx[ct] = allocID; prim[ct] = entry.prim.mID; } @@ -506,8 +506,8 @@ public class Mesh extends BaseObj { public Mesh create() { mRS.validate(); - int[] vtx = new int[mVertexTypeCount]; - int[] idx = new int[mIndexTypes.size()]; + long[] vtx = new long[mVertexTypeCount]; + long[] idx = new long[mIndexTypes.size()]; int[] prim = new int[mIndexTypes.size()]; Allocation[] indexBuffers = new Allocation[mIndexTypes.size()]; @@ -517,7 +517,7 @@ public class Mesh extends BaseObj { for(int ct = 0; ct < mVertexTypeCount; ct ++) { Entry entry = mVertexTypes[ct]; vertexBuffers[ct] = entry.a; - vtx[ct] = (int)entry.a.getID(mRS); + vtx[ct] = entry.a.getID(mRS); } for(int ct = 0; ct < mIndexTypes.size(); ct ++) { @@ -526,7 +526,7 @@ public class Mesh extends BaseObj { indexBuffers[ct] = entry.a; primitives[ct] = entry.prim; - idx[ct] = (int)allocID; + idx[ct] = allocID; prim[ct] = entry.prim.mID; } diff --git a/rs/java/android/renderscript/ProgramFragment.java b/rs/java/android/renderscript/ProgramFragment.java index 5e886a3..4bb527b 100644 --- a/rs/java/android/renderscript/ProgramFragment.java +++ b/rs/java/android/renderscript/ProgramFragment.java @@ -65,25 +65,25 @@ public class ProgramFragment extends Program { */ public ProgramFragment create() { mRS.validate(); - int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2]; + long[] tmp = new long[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2]; String[] texNames = new String[mTextureCount]; int idx = 0; for (int i=0; i < mInputCount; i++) { tmp[idx++] = ProgramParam.INPUT.mID; - tmp[idx++] = (int)mInputs[i].getID(mRS); + tmp[idx++] = mInputs[i].getID(mRS); } for (int i=0; i < mOutputCount; i++) { tmp[idx++] = ProgramParam.OUTPUT.mID; - tmp[idx++] = (int)mOutputs[i].getID(mRS); + tmp[idx++] = mOutputs[i].getID(mRS); } for (int i=0; i < mConstantCount; i++) { tmp[idx++] = ProgramParam.CONSTANT.mID; - tmp[idx++] = (int)mConstants[i].getID(mRS); + tmp[idx++] = mConstants[i].getID(mRS); } for (int i=0; i < mTextureCount; i++) { tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID; - tmp[idx++] = (int)mTextureTypes[i].mID; + tmp[idx++] = mTextureTypes[i].mID; texNames[i] = mTextureNames[i]; } diff --git a/rs/java/android/renderscript/ProgramFragmentFixedFunction.java b/rs/java/android/renderscript/ProgramFragmentFixedFunction.java index 22aed0a..2fe68be 100644 --- a/rs/java/android/renderscript/ProgramFragmentFixedFunction.java +++ b/rs/java/android/renderscript/ProgramFragmentFixedFunction.java @@ -52,25 +52,25 @@ public class ProgramFragmentFixedFunction extends ProgramFragment { */ public ProgramFragmentFixedFunction create() { mRS.validate(); - int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2]; + long[] tmp = new long[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2]; String[] texNames = new String[mTextureCount]; int idx = 0; for (int i=0; i < mInputCount; i++) { tmp[idx++] = ProgramParam.INPUT.mID; - tmp[idx++] = (int)mInputs[i].getID(mRS); + tmp[idx++] = mInputs[i].getID(mRS); } for (int i=0; i < mOutputCount; i++) { tmp[idx++] = ProgramParam.OUTPUT.mID; - tmp[idx++] = (int)mOutputs[i].getID(mRS); + tmp[idx++] = mOutputs[i].getID(mRS); } for (int i=0; i < mConstantCount; i++) { tmp[idx++] = ProgramParam.CONSTANT.mID; - tmp[idx++] = (int)mConstants[i].getID(mRS); + tmp[idx++] = mConstants[i].getID(mRS); } for (int i=0; i < mTextureCount; i++) { tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID; - tmp[idx++] = (int)mTextureTypes[i].mID; + tmp[idx++] = mTextureTypes[i].mID; texNames[i] = mTextureNames[i]; } diff --git a/rs/java/android/renderscript/ProgramVertex.java b/rs/java/android/renderscript/ProgramVertex.java index b6886e1..d3a51de 100644 --- a/rs/java/android/renderscript/ProgramVertex.java +++ b/rs/java/android/renderscript/ProgramVertex.java @@ -126,25 +126,25 @@ public class ProgramVertex extends Program { */ public ProgramVertex create() { mRS.validate(); - int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2]; + long[] tmp = new long[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2]; String[] texNames = new String[mTextureCount]; int idx = 0; for (int i=0; i < mInputCount; i++) { tmp[idx++] = ProgramParam.INPUT.mID; - tmp[idx++] = (int)mInputs[i].getID(mRS); + tmp[idx++] = mInputs[i].getID(mRS); } for (int i=0; i < mOutputCount; i++) { tmp[idx++] = ProgramParam.OUTPUT.mID; - tmp[idx++] = (int)mOutputs[i].getID(mRS); + tmp[idx++] = mOutputs[i].getID(mRS); } for (int i=0; i < mConstantCount; i++) { tmp[idx++] = ProgramParam.CONSTANT.mID; - tmp[idx++] = (int)mConstants[i].getID(mRS); + tmp[idx++] = mConstants[i].getID(mRS); } for (int i=0; i < mTextureCount; i++) { tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID; - tmp[idx++] = (int)mTextureTypes[i].mID; + tmp[idx++] = mTextureTypes[i].mID; texNames[i] = mTextureNames[i]; } diff --git a/rs/java/android/renderscript/ProgramVertexFixedFunction.java b/rs/java/android/renderscript/ProgramVertexFixedFunction.java index c479c77..a350154 100644 --- a/rs/java/android/renderscript/ProgramVertexFixedFunction.java +++ b/rs/java/android/renderscript/ProgramVertexFixedFunction.java @@ -79,25 +79,25 @@ public class ProgramVertexFixedFunction extends ProgramVertex { */ public ProgramVertexFixedFunction create() { mRS.validate(); - int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2]; + long[] tmp = new long[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2]; String[] texNames = new String[mTextureCount]; int idx = 0; for (int i=0; i < mInputCount; i++) { tmp[idx++] = ProgramParam.INPUT.mID; - tmp[idx++] = (int)mInputs[i].getID(mRS); + tmp[idx++] = mInputs[i].getID(mRS); } for (int i=0; i < mOutputCount; i++) { tmp[idx++] = ProgramParam.OUTPUT.mID; - tmp[idx++] = (int)mOutputs[i].getID(mRS); + tmp[idx++] = mOutputs[i].getID(mRS); } for (int i=0; i < mConstantCount; i++) { tmp[idx++] = ProgramParam.CONSTANT.mID; - tmp[idx++] = (int)mConstants[i].getID(mRS); + tmp[idx++] = mConstants[i].getID(mRS); } for (int i=0; i < mTextureCount; i++) { tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID; - tmp[idx++] = (int)mTextureTypes[i].mID; + tmp[idx++] = mTextureTypes[i].mID; texNames[i] = mTextureNames[i]; } diff --git a/rs/java/android/renderscript/RenderScript.java b/rs/java/android/renderscript/RenderScript.java index 8618764..efede36 100644 --- a/rs/java/android/renderscript/RenderScript.java +++ b/rs/java/android/renderscript/RenderScript.java @@ -293,8 +293,8 @@ public class RenderScript { validate(); return rsnElementCreate(mContext, type, kind, norm, vecSize); } - native long rsnElementCreate2(long con, int[]elements, String[] names, int[] arraySizes); - synchronized long nElementCreate2(int[] elements, String[] names, int[] arraySizes) { + native long rsnElementCreate2(long con, long[] elements, String[] names, int[] arraySizes); + synchronized long nElementCreate2(long[] elements, String[] names, int[] arraySizes) { validate(); return rsnElementCreate2(mContext, elements, names, arraySizes); } @@ -304,8 +304,8 @@ public class RenderScript { rsnElementGetNativeData(mContext, id, elementData); } native void rsnElementGetSubElements(long con, long id, - int[] IDs, String[] names, int[] arraySizes); - synchronized void nElementGetSubElements(long id, int[] IDs, String[] names, int[] arraySizes) { + long[] IDs, String[] names, int[] arraySizes); + synchronized void nElementGetSubElements(long id, long[] IDs, String[] names, int[] arraySizes) { validate(); rsnElementGetSubElements(mContext, id, IDs, names, arraySizes); } @@ -315,14 +315,14 @@ public class RenderScript { validate(); return rsnTypeCreate(mContext, eid, x, y, z, mips, faces, yuv); } - native void rsnTypeGetNativeData(long con, long id, int[] typeData); - synchronized void nTypeGetNativeData(long id, int[] typeData) { + native void rsnTypeGetNativeData(long con, long id, long[] typeData); + synchronized void nTypeGetNativeData(long id, long[] typeData) { validate(); rsnTypeGetNativeData(mContext, id, typeData); } - native long rsnAllocationCreateTyped(long con, long type, int mip, int usage, int pointer); - synchronized long nAllocationCreateTyped(long type, int mip, int usage, int pointer) { + native long rsnAllocationCreateTyped(long con, long type, int mip, int usage, long pointer); + synchronized long nAllocationCreateTyped(long type, int mip, int usage, long pointer) { validate(); return rsnAllocationCreateTyped(mContext, type, mip, usage, pointer); } @@ -690,8 +690,8 @@ public class RenderScript { return rsnScriptFieldIDCreate(mContext, sid, slot); } - native long rsnScriptGroupCreate(long con, int[] kernels, int[] src, int[] dstk, int[] dstf, int[] types); - synchronized long nScriptGroupCreate(int[] kernels, int[] src, int[] dstk, int[] dstf, int[] types) { + native long rsnScriptGroupCreate(long con, long[] kernels, long[] src, long[] dstk, long[] dstf, long[] types); + synchronized long nScriptGroupCreate(long[] kernels, long[] src, long[] dstk, long[] dstf, long[] types) { validate(); return rsnScriptGroupCreate(mContext, kernels, src, dstk, dstf, types); } @@ -754,19 +754,19 @@ public class RenderScript { validate(); rsnProgramBindSampler(mContext, vpf, slot, s); } - native long rsnProgramFragmentCreate(long con, String shader, String[] texNames, int[] params); - synchronized long nProgramFragmentCreate(String shader, String[] texNames, int[] params) { + native long rsnProgramFragmentCreate(long con, String shader, String[] texNames, long[] params); + synchronized long nProgramFragmentCreate(String shader, String[] texNames, long[] params) { validate(); return rsnProgramFragmentCreate(mContext, shader, texNames, params); } - native long rsnProgramVertexCreate(long con, String shader, String[] texNames, int[] params); - synchronized long nProgramVertexCreate(String shader, String[] texNames, int[] params) { + native long rsnProgramVertexCreate(long con, String shader, String[] texNames, long[] params); + synchronized long nProgramVertexCreate(String shader, String[] texNames, long[] params) { validate(); return rsnProgramVertexCreate(mContext, shader, texNames, params); } - native long rsnMeshCreate(long con, int[] vtx, int[] idx, int[] prim); - synchronized long nMeshCreate(int[] vtx, int[] idx, int[] prim) { + native long rsnMeshCreate(long con, long[] vtx, long[] idx, int[] prim); + synchronized long nMeshCreate(long[] vtx, long[] idx, int[] prim) { validate(); return rsnMeshCreate(mContext, vtx, idx, prim); } @@ -780,13 +780,13 @@ public class RenderScript { validate(); return rsnMeshGetIndexCount(mContext, id); } - native void rsnMeshGetVertices(long con, long id, int[] vtxIds, int vtxIdCount); - synchronized void nMeshGetVertices(long id, int[] vtxIds, int vtxIdCount) { + native void rsnMeshGetVertices(long con, long id, long[] vtxIds, int vtxIdCount); + synchronized void nMeshGetVertices(long id, long[] vtxIds, int vtxIdCount) { validate(); rsnMeshGetVertices(mContext, id, vtxIds, vtxIdCount); } - native void rsnMeshGetIndices(long con, long id, int[] idxIds, int[] primitives, int vtxIdCount); - synchronized void nMeshGetIndices(long id, int[] idxIds, int[] primitives, int vtxIdCount) { + native void rsnMeshGetIndices(long con, long id, long[] idxIds, int[] primitives, int vtxIdCount); + synchronized void nMeshGetIndices(long id, long[] idxIds, int[] primitives, int vtxIdCount) { validate(); rsnMeshGetIndices(mContext, id, idxIds, primitives, vtxIdCount); } diff --git a/rs/java/android/renderscript/ScriptGroup.java b/rs/java/android/renderscript/ScriptGroup.java index 48dba30..1200a66 100644 --- a/rs/java/android/renderscript/ScriptGroup.java +++ b/rs/java/android/renderscript/ScriptGroup.java @@ -380,7 +380,6 @@ public final class ScriptGroup extends BaseObj { * @return ScriptGroup The new ScriptGroup */ public ScriptGroup create() { - // FIXME: this is broken for 64-bit if (mNodes.size() == 0) { throw new RSInvalidStateException("Empty script groups are not allowed"); @@ -395,13 +394,13 @@ public final class ScriptGroup extends BaseObj { ArrayList inputs = new ArrayList(); ArrayList outputs = new ArrayList(); - int[] kernels = new int[mKernelCount]; + long[] kernels = new long[mKernelCount]; int idx = 0; for (int ct=0; ct < mNodes.size(); ct++) { Node n = mNodes.get(ct); for (int ct2=0; ct2 < n.mKernels.size(); ct2++) { final Script.KernelID kid = n.mKernels.get(ct2); - kernels[idx++] = (int)kid.getID(mRS); + kernels[idx++] = kid.getID(mRS); boolean hasInput = false; boolean hasOutput = false; @@ -428,21 +427,21 @@ public final class ScriptGroup extends BaseObj { throw new RSRuntimeException("Count mismatch, should not happen."); } - int[] src = new int[mLines.size()]; - int[] dstk = new int[mLines.size()]; - int[] dstf = new int[mLines.size()]; - int[] types = new int[mLines.size()]; + long[] src = new long[mLines.size()]; + long[] dstk = new long[mLines.size()]; + long[] dstf = new long[mLines.size()]; + long[] types = new long[mLines.size()]; for (int ct=0; ct < mLines.size(); ct++) { ConnectLine cl = mLines.get(ct); - src[ct] = (int)cl.mFrom.getID(mRS); + src[ct] = cl.mFrom.getID(mRS); if (cl.mToK != null) { - dstk[ct] = (int)cl.mToK.getID(mRS); + dstk[ct] = cl.mToK.getID(mRS); } if (cl.mToF != null) { - dstf[ct] = (int)cl.mToF.getID(mRS); + dstf[ct] = cl.mToF.getID(mRS); } - types[ct] = (int)cl.mAllocationType.getID(mRS); + types[ct] = cl.mAllocationType.getID(mRS); } long id = mRS.nScriptGroupCreate(kernels, src, dstk, dstf, types); diff --git a/rs/java/android/renderscript/Type.java b/rs/java/android/renderscript/Type.java index 7bdd360..ce7f571 100644 --- a/rs/java/android/renderscript/Type.java +++ b/rs/java/android/renderscript/Type.java @@ -196,20 +196,18 @@ public class Type extends BaseObj { @Override void updateFromNative() { - // FIXME: rsaTypeGetNativeData needs 32-bit and 64-bit paths - - // We have 6 integer to obtain mDimX; mDimY; mDimZ; + // We have 6 integer/long to obtain mDimX; mDimY; mDimZ; // mDimLOD; mDimFaces; mElement; - int[] dataBuffer = new int[6]; - mRS.nTypeGetNativeData((int)getID(mRS), dataBuffer); + long[] dataBuffer = new long[6]; + mRS.nTypeGetNativeData(getID(mRS), dataBuffer); - mDimX = dataBuffer[0]; - mDimY = dataBuffer[1]; - mDimZ = dataBuffer[2]; + mDimX = (int)dataBuffer[0]; + mDimY = (int)dataBuffer[1]; + mDimZ = (int)dataBuffer[2]; mDimMipmaps = dataBuffer[3] == 1 ? true : false; mDimFaces = dataBuffer[4] == 1 ? true : false; - int elementID = dataBuffer[5]; + long elementID = dataBuffer[5]; if(elementID != 0) { mElement = new Element(elementID, mRS); mElement.updateFromNative(); diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp index 80a5da2..a8f92ce 100644 --- a/rs/jni/android_renderscript_RenderScript.cpp +++ b/rs/jni/android_renderscript_RenderScript.cpp @@ -412,13 +412,21 @@ nElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind, jb static jlong nElementCreate2(JNIEnv *_env, jobject _this, jlong con, - jintArray _ids, jobjectArray _names, jintArray _arraySizes) + jlongArray _ids, jobjectArray _names, jintArray _arraySizes) { int fieldCount = _env->GetArrayLength(_ids); LOG_API("nElementCreate2, con(%p)", (RsContext)con); - jint *ids = _env->GetIntArrayElements(_ids, NULL); - jint *arraySizes = _env->GetIntArrayElements(_arraySizes, NULL); + jlong *jIds = _env->GetLongArrayElements(_ids, NULL); + jint *jArraySizes = _env->GetIntArrayElements(_arraySizes, NULL); + + RsElement *ids = (RsElement*)malloc(fieldCount * sizeof(RsElement)); + uint32_t *arraySizes = (uint32_t *)malloc(fieldCount * sizeof(uint32_t)); + + for(int i = 0; i < fieldCount; i ++) { + ids[i] = (RsElement)jIds[i]; + arraySizes[i] = (uint32_t)jArraySizes[i]; + } AutoJavaStringArrayToUTF8 names(_env, _names, fieldCount); @@ -426,12 +434,15 @@ nElementCreate2(JNIEnv *_env, jobject _this, jlong con, size_t *sizeArray = names.c_str_len(); jlong id = (jlong)rsElementCreate2((RsContext)con, - (RsElement *)ids, fieldCount, + (const RsElement *)ids, fieldCount, nameArray, fieldCount * sizeof(size_t), sizeArray, (const uint32_t *)arraySizes, fieldCount); - _env->ReleaseIntArrayElements(_ids, ids, JNI_ABORT); - _env->ReleaseIntArrayElements(_arraySizes, arraySizes, JNI_ABORT); + free(ids); + free(arraySizes); + _env->ReleaseLongArrayElements(_ids, jIds, JNI_ABORT); + _env->ReleaseIntArrayElements(_arraySizes, jArraySizes, JNI_ABORT); + return (jlong)id; } @@ -448,30 +459,33 @@ nElementGetNativeData(JNIEnv *_env, jobject _this, jlong con, jlong id, jintArra rsaElementGetNativeData((RsContext)con, (RsElement)id, elementData, dataSize); for(jint i = 0; i < dataSize; i ++) { - _env->SetIntArrayRegion(_elementData, i, 1, (const jint*)&elementData[i]); + const jint data = (jint)elementData[i]; + _env->SetIntArrayRegion(_elementData, i, 1, &data); } } static void nElementGetSubElements(JNIEnv *_env, jobject _this, jlong con, jlong id, - jintArray _IDs, + jlongArray _IDs, jobjectArray _names, jintArray _arraySizes) { - int dataSize = _env->GetArrayLength(_IDs); + uint32_t dataSize = _env->GetArrayLength(_IDs); LOG_API("nElementGetSubElements, con(%p)", (RsContext)con); - uint32_t *ids = (uint32_t *)malloc((uint32_t)dataSize * sizeof(uint32_t)); - const char **names = (const char **)malloc((uint32_t)dataSize * sizeof(const char *)); - uint32_t *arraySizes = (uint32_t *)malloc((uint32_t)dataSize * sizeof(uint32_t)); + uintptr_t *ids = (uintptr_t*)malloc(dataSize * sizeof(uintptr_t)); + const char **names = (const char **)malloc(dataSize * sizeof(const char *)); + size_t *arraySizes = (size_t *)malloc(dataSize * sizeof(size_t)); rsaElementGetSubElements((RsContext)con, (RsElement)id, ids, names, arraySizes, (uint32_t)dataSize); - for(jint i = 0; i < dataSize; i++) { + for(uint32_t i = 0; i < dataSize; i++) { + const jlong id = (jlong)ids[i]; + const jint arraySize = (jint)arraySizes[i]; _env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i])); - _env->SetIntArrayRegion(_IDs, i, 1, (const jint*)&ids[i]); - _env->SetIntArrayRegion(_arraySizes, i, 1, (const jint*)&arraySizes[i]); + _env->SetLongArrayRegion(_IDs, i, 1, &id); + _env->SetIntArrayRegion(_arraySizes, i, 1, &arraySize); } free(ids); @@ -492,7 +506,7 @@ nTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid, } static void -nTypeGetNativeData(JNIEnv *_env, jobject _this, jlong con, jlong id, jintArray _typeData) +nTypeGetNativeData(JNIEnv *_env, jobject _this, jlong con, jlong id, jlongArray _typeData) { // We are packing 6 items: mDimX; mDimY; mDimZ; // mDimLOD; mDimFaces; mElement; into typeData @@ -501,21 +515,22 @@ nTypeGetNativeData(JNIEnv *_env, jobject _this, jlong con, jlong id, jintArray _ assert(elementCount == 6); LOG_API("nTypeGetNativeData, con(%p)", (RsContext)con); - uint32_t typeData[6]; + uintptr_t typeData[6]; rsaTypeGetNativeData((RsContext)con, (RsType)id, typeData, 6); for(jint i = 0; i < elementCount; i ++) { - _env->SetIntArrayRegion(_typeData, i, 1, (const jint*)&typeData[i]); + const jlong data = (jlong)typeData[i]; + _env->SetLongArrayRegion(_typeData, i, 1, &data); } } // ----------------------------------- static jlong -nAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mips, jint usage, jint pointer) +nAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mips, jint usage, jlong pointer) { LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)", (RsContext)con, (RsElement)type, mips, usage, (void *)pointer); - return (jlong) rsAllocationCreateTyped((RsContext)con, (RsType)type, (RsAllocationMipmapControl)mips, (uint32_t)usage, (uint32_t)pointer); + return (jlong) rsAllocationCreateTyped((RsContext)con, (RsType)type, (RsAllocationMipmapControl)mips, (uint32_t)usage, (uintptr_t)pointer); } static void @@ -601,7 +616,7 @@ nAllocationCreateBitmapBackedAllocation(JNIEnv *_env, jobject _this, jlong con, const void* ptr = bitmap.getPixels(); jlong id = (jlong)rsAllocationCreateTyped((RsContext)con, (RsType)type, (RsAllocationMipmapControl)mip, - (uint32_t)usage, (size_t)ptr); + (uint32_t)usage, (uintptr_t)ptr); bitmap.unlockPixels(); return id; } @@ -1196,34 +1211,63 @@ nScriptFieldIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slo } static jlong -nScriptGroupCreate(JNIEnv *_env, jobject _this, jlong con, jintArray _kernels, jintArray _src, - jintArray _dstk, jintArray _dstf, jintArray _types) +nScriptGroupCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _kernels, jlongArray _src, + jlongArray _dstk, jlongArray _dstf, jlongArray _types) { LOG_API("nScriptGroupCreate, con(%p)", (RsContext)con); - jint kernelsLen = _env->GetArrayLength(_kernels) * sizeof(int); - jint *kernelsPtr = _env->GetIntArrayElements(_kernels, NULL); - jint srcLen = _env->GetArrayLength(_src) * sizeof(int); - jint *srcPtr = _env->GetIntArrayElements(_src, NULL); - jint dstkLen = _env->GetArrayLength(_dstk) * sizeof(int); - jint *dstkPtr = _env->GetIntArrayElements(_dstk, NULL); - jint dstfLen = _env->GetArrayLength(_dstf) * sizeof(int); - jint *dstfPtr = _env->GetIntArrayElements(_dstf, NULL); - jint typesLen = _env->GetArrayLength(_types) * sizeof(int); - jint *typesPtr = _env->GetIntArrayElements(_types, NULL); - - int id = (int)rsScriptGroupCreate((RsContext)con, - (RsScriptKernelID *)kernelsPtr, kernelsLen, - (RsScriptKernelID *)srcPtr, srcLen, - (RsScriptKernelID *)dstkPtr, dstkLen, - (RsScriptFieldID *)dstfPtr, dstfLen, - (RsType *)typesPtr, typesLen); - - _env->ReleaseIntArrayElements(_kernels, kernelsPtr, 0); - _env->ReleaseIntArrayElements(_src, srcPtr, 0); - _env->ReleaseIntArrayElements(_dstk, dstkPtr, 0); - _env->ReleaseIntArrayElements(_dstf, dstfPtr, 0); - _env->ReleaseIntArrayElements(_types, typesPtr, 0); + jint kernelsLen = _env->GetArrayLength(_kernels); + jlong *jKernelsPtr = _env->GetLongArrayElements(_kernels, NULL); + RsScriptKernelID* kernelsPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * kernelsLen); + for(int i = 0; i < kernelsLen; ++i) { + kernelsPtr[i] = (RsScriptKernelID)jKernelsPtr[i]; + } + + jint srcLen = _env->GetArrayLength(_src); + jlong *jSrcPtr = _env->GetLongArrayElements(_src, NULL); + RsScriptKernelID* srcPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * srcLen); + for(int i = 0; i < srcLen; ++i) { + srcPtr[i] = (RsScriptKernelID)jSrcPtr[i]; + } + + jint dstkLen = _env->GetArrayLength(_dstk); + jlong *jDstkPtr = _env->GetLongArrayElements(_dstk, NULL); + RsScriptKernelID* dstkPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstkLen); + for(int i = 0; i < dstkLen; ++i) { + dstkPtr[i] = (RsScriptKernelID)jDstkPtr[i]; + } + + jint dstfLen = _env->GetArrayLength(_dstf); + jlong *jDstfPtr = _env->GetLongArrayElements(_dstf, NULL); + RsScriptKernelID* dstfPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstfLen); + for(int i = 0; i < dstfLen; ++i) { + dstfPtr[i] = (RsScriptKernelID)jDstfPtr[i]; + } + + jint typesLen = _env->GetArrayLength(_types); + jlong *jTypesPtr = _env->GetLongArrayElements(_types, NULL); + RsType* typesPtr = (RsType*) malloc(sizeof(RsType) * typesLen); + for(int i = 0; i < typesLen; ++i) { + typesPtr[i] = (RsType)jTypesPtr[i]; + } + + jlong id = (jlong)rsScriptGroupCreate((RsContext)con, + (RsScriptKernelID *)kernelsPtr, kernelsLen * sizeof(RsScriptKernelID), + (RsScriptKernelID *)srcPtr, srcLen * sizeof(RsScriptKernelID), + (RsScriptKernelID *)dstkPtr, dstkLen * sizeof(RsScriptKernelID), + (RsScriptFieldID *)dstfPtr, dstfLen * sizeof(RsScriptKernelID), + (RsType *)typesPtr, typesLen * sizeof(RsType)); + + free(kernelsPtr); + free(srcPtr); + free(dstkPtr); + free(dstfPtr); + free(typesPtr); + _env->ReleaseLongArrayElements(_kernels, jKernelsPtr, 0); + _env->ReleaseLongArrayElements(_src, jSrcPtr, 0); + _env->ReleaseLongArrayElements(_dstk, jDstkPtr, 0); + _env->ReleaseLongArrayElements(_dstf, jDstfPtr, 0); + _env->ReleaseLongArrayElements(_types, jTypesPtr, 0); return id; } @@ -1292,10 +1336,10 @@ nProgramBindSampler(JNIEnv *_env, jobject _this, jlong con, jlong vpf, jint slot static jlong nProgramFragmentCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader, - jobjectArray texNames, jintArray params) + jobjectArray texNames, jlongArray params) { AutoJavaStringToUTF8 shaderUTF(_env, shader); - jint *paramPtr = _env->GetIntArrayElements(params, NULL); + jlong *jParamPtr = _env->GetLongArrayElements(params, NULL); jint paramLen = _env->GetArrayLength(params); int texCount = _env->GetArrayLength(texNames); @@ -1305,11 +1349,16 @@ nProgramFragmentCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader, LOG_API("nProgramFragmentCreate, con(%p), paramLen(%i)", (RsContext)con, paramLen); + uintptr_t * paramPtr = (uintptr_t*) malloc(sizeof(uintptr_t) * paramLen); + for(int i = 0; i < paramLen; ++i) { + paramPtr[i] = (uintptr_t)jParamPtr[i]; + } jlong ret = (jlong)rsProgramFragmentCreate((RsContext)con, shaderUTF.c_str(), shaderUTF.length(), nameArray, texCount, sizeArray, - (uint32_t *)paramPtr, paramLen); + paramPtr, paramLen); - _env->ReleaseIntArrayElements(params, paramPtr, JNI_ABORT); + free(paramPtr); + _env->ReleaseLongArrayElements(params, jParamPtr, JNI_ABORT); return ret; } @@ -1318,10 +1367,10 @@ nProgramFragmentCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader, static jlong nProgramVertexCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader, - jobjectArray texNames, jintArray params) + jobjectArray texNames, jlongArray params) { AutoJavaStringToUTF8 shaderUTF(_env, shader); - jint *paramPtr = _env->GetIntArrayElements(params, NULL); + jlong *jParamPtr = _env->GetLongArrayElements(params, NULL); jint paramLen = _env->GetArrayLength(params); LOG_API("nProgramVertexCreate, con(%p), paramLen(%i)", (RsContext)con, paramLen); @@ -1331,11 +1380,17 @@ nProgramVertexCreate(JNIEnv *_env, jobject _this, jlong con, jstring shader, const char ** nameArray = names.c_str(); size_t* sizeArray = names.c_str_len(); + uintptr_t * paramPtr = (uintptr_t*) malloc(sizeof(uintptr_t) * paramLen); + for(int i = 0; i < paramLen; ++i) { + paramPtr[i] = (uintptr_t)jParamPtr[i]; + } + jlong ret = (jlong)rsProgramVertexCreate((RsContext)con, shaderUTF.c_str(), shaderUTF.length(), nameArray, texCount, sizeArray, - (uint32_t *)paramPtr, paramLen); + paramPtr, paramLen); - _env->ReleaseIntArrayElements(params, paramPtr, JNI_ABORT); + free(paramPtr); + _env->ReleaseLongArrayElements(params, jParamPtr, JNI_ABORT); return ret; } @@ -1416,24 +1471,36 @@ nPathCreate(JNIEnv *_env, jobject _this, jlong con, jint prim, jboolean isStatic } static jlong -nMeshCreate(JNIEnv *_env, jobject _this, jlong con, jintArray _vtx, jintArray _idx, jintArray _prim) +nMeshCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _vtx, jlongArray _idx, jintArray _prim) { LOG_API("nMeshCreate, con(%p)", (RsContext)con); jint vtxLen = _env->GetArrayLength(_vtx); - jint *vtxPtr = _env->GetIntArrayElements(_vtx, NULL); + jlong *jVtxPtr = _env->GetLongArrayElements(_vtx, NULL); + RsAllocation* vtxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * vtxLen); + for(int i = 0; i < vtxLen; ++i) { + vtxPtr[i] = (RsAllocation)(uintptr_t)jVtxPtr[i]; + } + jint idxLen = _env->GetArrayLength(_idx); - jint *idxPtr = _env->GetIntArrayElements(_idx, NULL); + jlong *jIdxPtr = _env->GetLongArrayElements(_idx, NULL); + RsAllocation* idxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * idxLen); + for(int i = 0; i < idxLen; ++i) { + idxPtr[i] = (RsAllocation)(uintptr_t)jIdxPtr[i]; + } + jint primLen = _env->GetArrayLength(_prim); jint *primPtr = _env->GetIntArrayElements(_prim, NULL); - int id = (int)rsMeshCreate((RsContext)con, + jlong id = (jlong)rsMeshCreate((RsContext)con, (RsAllocation *)vtxPtr, vtxLen, (RsAllocation *)idxPtr, idxLen, (uint32_t *)primPtr, primLen); - _env->ReleaseIntArrayElements(_vtx, vtxPtr, 0); - _env->ReleaseIntArrayElements(_idx, idxPtr, 0); + free(vtxPtr); + free(idxPtr); + _env->ReleaseLongArrayElements(_vtx, jVtxPtr, 0); + _env->ReleaseLongArrayElements(_idx, jIdxPtr, 0); _env->ReleaseIntArrayElements(_prim, primPtr, 0); return id; } @@ -1457,7 +1524,7 @@ nMeshGetIndexCount(JNIEnv *_env, jobject _this, jlong con, jlong mesh) } static void -nMeshGetVertices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jintArray _ids, int numVtxIDs) +nMeshGetVertices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jlongArray _ids, jint numVtxIDs) { LOG_API("nMeshGetVertices, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh); @@ -1465,14 +1532,15 @@ nMeshGetVertices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jintArray _ rsaMeshGetVertices((RsContext)con, (RsMesh)mesh, allocs, (uint32_t)numVtxIDs); for(jint i = 0; i < numVtxIDs; i ++) { - _env->SetIntArrayRegion(_ids, i, 1, (const jint*)&allocs[i]); + const jlong alloc = (jlong)allocs[i]; + _env->SetLongArrayRegion(_ids, i, 1, &alloc); } free(allocs); } static void -nMeshGetIndices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jintArray _idxIds, jintArray _primitives, int numIndices) +nMeshGetIndices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jlongArray _idxIds, jintArray _primitives, jint numIndices) { LOG_API("nMeshGetVertices, con(%p), Mesh(%p)", (RsContext)con, (RsMesh)mesh); @@ -1482,8 +1550,10 @@ nMeshGetIndices(JNIEnv *_env, jobject _this, jlong con, jlong mesh, jintArray _i rsaMeshGetIndices((RsContext)con, (RsMesh)mesh, allocs, prims, (uint32_t)numIndices); for(jint i = 0; i < numIndices; i ++) { - _env->SetIntArrayRegion(_idxIds, i, 1, (const jint*)&allocs[i]); - _env->SetIntArrayRegion(_primitives, i, 1, (const jint*)&prims[i]); + const jlong alloc = (jlong)allocs[i]; + const jint prim = (jint)prims[i]; + _env->SetLongArrayRegion(_idxIds, i, 1, &alloc); + _env->SetIntArrayRegion(_primitives, i, 1, &prim); } free(allocs); @@ -1536,14 +1606,14 @@ static JNINativeMethod methods[] = { {"rsnFontCreateFromAsset", "(JLandroid/content/res/AssetManager;Ljava/lang/String;FI)J", (void*)nFontCreateFromAsset }, {"rsnElementCreate", "(JJIZI)J", (void*)nElementCreate }, -{"rsnElementCreate2", "(J[I[Ljava/lang/String;[I)J", (void*)nElementCreate2 }, +{"rsnElementCreate2", "(J[J[Ljava/lang/String;[I)J", (void*)nElementCreate2 }, {"rsnElementGetNativeData", "(JJ[I)V", (void*)nElementGetNativeData }, -{"rsnElementGetSubElements", "(JJ[I[Ljava/lang/String;[I)V", (void*)nElementGetSubElements }, +{"rsnElementGetSubElements", "(JJ[J[Ljava/lang/String;[I)V", (void*)nElementGetSubElements }, {"rsnTypeCreate", "(JJIIIZZI)J", (void*)nTypeCreate }, -{"rsnTypeGetNativeData", "(JJ[I)V", (void*)nTypeGetNativeData }, +{"rsnTypeGetNativeData", "(JJ[J)V", (void*)nTypeGetNativeData }, -{"rsnAllocationCreateTyped", "(JJIII)J", (void*)nAllocationCreateTyped }, +{"rsnAllocationCreateTyped", "(JJIIJ)J", (void*)nAllocationCreateTyped }, {"rsnAllocationCreateFromBitmap", "(JJILandroid/graphics/Bitmap;I)J", (void*)nAllocationCreateFromBitmap }, {"rsnAllocationCreateBitmapBackedAllocation", "(JJILandroid/graphics/Bitmap;I)J", (void*)nAllocationCreateBitmapBackedAllocation }, {"rsnAllocationCubeCreateFromBitmap","(JJILandroid/graphics/Bitmap;I)J", (void*)nAllocationCubeCreateFromBitmap }, @@ -1594,7 +1664,7 @@ static JNINativeMethod methods[] = { {"rsnScriptIntrinsicCreate", "(JIJ)J", (void*)nScriptIntrinsicCreate }, {"rsnScriptKernelIDCreate", "(JJII)J", (void*)nScriptKernelIDCreate }, {"rsnScriptFieldIDCreate", "(JJI)J", (void*)nScriptFieldIDCreate }, -{"rsnScriptGroupCreate", "(J[I[I[I[I[I)J", (void*)nScriptGroupCreate }, +{"rsnScriptGroupCreate", "(J[J[J[J[J[J)J", (void*)nScriptGroupCreate }, {"rsnScriptGroupSetInput", "(JJJJ)V", (void*)nScriptGroupSetInput }, {"rsnScriptGroupSetOutput", "(JJJJ)V", (void*)nScriptGroupSetOutput }, {"rsnScriptGroupExecute", "(JJ)V", (void*)nScriptGroupExecute }, @@ -1605,9 +1675,9 @@ static JNINativeMethod methods[] = { {"rsnProgramBindTexture", "(JJIJ)V", (void*)nProgramBindTexture }, {"rsnProgramBindSampler", "(JJIJ)V", (void*)nProgramBindSampler }, -{"rsnProgramFragmentCreate", "(JLjava/lang/String;[Ljava/lang/String;[I)J", (void*)nProgramFragmentCreate }, +{"rsnProgramFragmentCreate", "(JLjava/lang/String;[Ljava/lang/String;[J)J", (void*)nProgramFragmentCreate }, {"rsnProgramRasterCreate", "(JZI)J", (void*)nProgramRasterCreate }, -{"rsnProgramVertexCreate", "(JLjava/lang/String;[Ljava/lang/String;[I)J", (void*)nProgramVertexCreate }, +{"rsnProgramVertexCreate", "(JLjava/lang/String;[Ljava/lang/String;[J)J", (void*)nProgramVertexCreate }, {"rsnContextBindRootScript", "(JI)V", (void*)nContextBindRootScript }, {"rsnContextBindProgramStore", "(JI)V", (void*)nContextBindProgramStore }, @@ -1618,12 +1688,12 @@ static JNINativeMethod methods[] = { {"rsnSamplerCreate", "(JIIIIIF)J", (void*)nSamplerCreate }, {"rsnPathCreate", "(JIZJJF)J", (void*)nPathCreate }, -{"rsnMeshCreate", "(J[I[I[I)J", (void*)nMeshCreate }, +{"rsnMeshCreate", "(J[J[J[I)J", (void*)nMeshCreate }, {"rsnMeshGetVertexBufferCount", "(JJ)I", (void*)nMeshGetVertexBufferCount }, {"rsnMeshGetIndexCount", "(JJ)I", (void*)nMeshGetIndexCount }, -{"rsnMeshGetVertices", "(JJ[II)V", (void*)nMeshGetVertices }, -{"rsnMeshGetIndices", "(JJ[I[II)V", (void*)nMeshGetIndices }, +{"rsnMeshGetVertices", "(JJ[JI)V", (void*)nMeshGetVertices }, +{"rsnMeshGetIndices", "(JJ[J[II)V", (void*)nMeshGetIndices }, }; -- cgit v1.1