Cleaned up the implementation of Surface and SurfaceSession to use more consistent naming and structure. Added JNI for all of the new surface flinger display API calls. Enforced the requirement that all Surfaces created by the window manager be named. Updated the display manager service to use the new methods. Change-Id: I2a658f1bfd0437e1c6f9d22df8d4ffcce7284ca2
1482 lines
59 KiB
C++
1482 lines
59 KiB
C++
/*
|
|
* Copyright (C) 2011-2012 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#define LOG_TAG "libRS_jni"
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <math.h>
|
|
#include <utils/misc.h>
|
|
|
|
#include <core/SkBitmap.h>
|
|
#include <core/SkPixelRef.h>
|
|
#include <core/SkStream.h>
|
|
#include <core/SkTemplates.h>
|
|
#include <images/SkImageDecoder.h>
|
|
|
|
#include <androidfw/Asset.h>
|
|
#include <androidfw/AssetManager.h>
|
|
#include <androidfw/ResourceTypes.h>
|
|
|
|
#include "jni.h"
|
|
#include "JNIHelp.h"
|
|
#include "android_runtime/AndroidRuntime.h"
|
|
#include "android_runtime/android_view_Surface.h"
|
|
#include "android_runtime/android_util_AssetManager.h"
|
|
|
|
#include <rs.h>
|
|
#include <rsEnv.h>
|
|
#include <gui/Surface.h>
|
|
#include <gui/SurfaceTexture.h>
|
|
#include <gui/SurfaceTextureClient.h>
|
|
#include <android_runtime/android_graphics_SurfaceTexture.h>
|
|
|
|
//#define LOG_API ALOGE
|
|
#define LOG_API(...)
|
|
|
|
using namespace android;
|
|
|
|
class AutoJavaStringToUTF8 {
|
|
public:
|
|
AutoJavaStringToUTF8(JNIEnv* env, jstring str) : fEnv(env), fJStr(str) {
|
|
fCStr = env->GetStringUTFChars(str, NULL);
|
|
fLength = env->GetStringUTFLength(str);
|
|
}
|
|
~AutoJavaStringToUTF8() {
|
|
fEnv->ReleaseStringUTFChars(fJStr, fCStr);
|
|
}
|
|
const char* c_str() const { return fCStr; }
|
|
jsize length() const { return fLength; }
|
|
|
|
private:
|
|
JNIEnv* fEnv;
|
|
jstring fJStr;
|
|
const char* fCStr;
|
|
jsize fLength;
|
|
};
|
|
|
|
class AutoJavaStringArrayToUTF8 {
|
|
public:
|
|
AutoJavaStringArrayToUTF8(JNIEnv* env, jobjectArray strings, jsize stringsLength)
|
|
: mEnv(env), mStrings(strings), mStringsLength(stringsLength) {
|
|
mCStrings = NULL;
|
|
mSizeArray = NULL;
|
|
if (stringsLength > 0) {
|
|
mCStrings = (const char **)calloc(stringsLength, sizeof(char *));
|
|
mSizeArray = (size_t*)calloc(stringsLength, sizeof(size_t));
|
|
for (jsize ct = 0; ct < stringsLength; ct ++) {
|
|
jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
|
|
mCStrings[ct] = mEnv->GetStringUTFChars(s, NULL);
|
|
mSizeArray[ct] = mEnv->GetStringUTFLength(s);
|
|
}
|
|
}
|
|
}
|
|
~AutoJavaStringArrayToUTF8() {
|
|
for (jsize ct=0; ct < mStringsLength; ct++) {
|
|
jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
|
|
mEnv->ReleaseStringUTFChars(s, mCStrings[ct]);
|
|
}
|
|
free(mCStrings);
|
|
free(mSizeArray);
|
|
}
|
|
const char **c_str() const { return mCStrings; }
|
|
size_t *c_str_len() const { return mSizeArray; }
|
|
jsize length() const { return mStringsLength; }
|
|
|
|
private:
|
|
JNIEnv *mEnv;
|
|
jobjectArray mStrings;
|
|
const char **mCStrings;
|
|
size_t *mSizeArray;
|
|
jsize mStringsLength;
|
|
};
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
static jfieldID gContextId = 0;
|
|
static jfieldID gNativeBitmapID = 0;
|
|
static jfieldID gTypeNativeCache = 0;
|
|
|
|
static void _nInit(JNIEnv *_env, jclass _this)
|
|
{
|
|
gContextId = _env->GetFieldID(_this, "mContext", "I");
|
|
|
|
jclass bitmapClass = _env->FindClass("android/graphics/Bitmap");
|
|
gNativeBitmapID = _env->GetFieldID(bitmapClass, "mNativeBitmap", "I");
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
static void
|
|
nContextFinish(JNIEnv *_env, jobject _this, RsContext con)
|
|
{
|
|
LOG_API("nContextFinish, con(%p)", con);
|
|
rsContextFinish(con);
|
|
}
|
|
|
|
static void
|
|
nAssignName(JNIEnv *_env, jobject _this, RsContext con, jint obj, jbyteArray str)
|
|
{
|
|
LOG_API("nAssignName, con(%p), obj(%p)", con, (void *)obj);
|
|
jint len = _env->GetArrayLength(str);
|
|
jbyte * cptr = (jbyte *) _env->GetPrimitiveArrayCritical(str, 0);
|
|
rsAssignName(con, (void *)obj, (const char *)cptr, len);
|
|
_env->ReleasePrimitiveArrayCritical(str, cptr, JNI_ABORT);
|
|
}
|
|
|
|
static jstring
|
|
nGetName(JNIEnv *_env, jobject _this, RsContext con, jint obj)
|
|
{
|
|
LOG_API("nGetName, con(%p), obj(%p)", con, (void *)obj);
|
|
const char *name = NULL;
|
|
rsaGetName(con, (void *)obj, &name);
|
|
if(name == NULL || strlen(name) == 0) {
|
|
return NULL;
|
|
}
|
|
return _env->NewStringUTF(name);
|
|
}
|
|
|
|
static void
|
|
nObjDestroy(JNIEnv *_env, jobject _this, RsContext con, jint obj)
|
|
{
|
|
LOG_API("nObjDestroy, con(%p) obj(%p)", con, (void *)obj);
|
|
rsObjDestroy(con, (void *)obj);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
static jint
|
|
nDeviceCreate(JNIEnv *_env, jobject _this)
|
|
{
|
|
LOG_API("nDeviceCreate");
|
|
return (jint)rsDeviceCreate();
|
|
}
|
|
|
|
static void
|
|
nDeviceDestroy(JNIEnv *_env, jobject _this, jint dev)
|
|
{
|
|
LOG_API("nDeviceDestroy");
|
|
return rsDeviceDestroy((RsDevice)dev);
|
|
}
|
|
|
|
static void
|
|
nDeviceSetConfig(JNIEnv *_env, jobject _this, jint dev, jint p, jint value)
|
|
{
|
|
LOG_API("nDeviceSetConfig dev(%p), param(%i), value(%i)", (void *)dev, p, value);
|
|
return rsDeviceSetConfig((RsDevice)dev, (RsDeviceParam)p, value);
|
|
}
|
|
|
|
static jint
|
|
nContextCreate(JNIEnv *_env, jobject _this, jint dev, jint ver, jint sdkVer)
|
|
{
|
|
LOG_API("nContextCreate");
|
|
return (jint)rsContextCreate((RsDevice)dev, ver, sdkVer);
|
|
}
|
|
|
|
static jint
|
|
nContextCreateGL(JNIEnv *_env, jobject _this, jint dev, jint ver, jint sdkVer,
|
|
int colorMin, int colorPref,
|
|
int alphaMin, int alphaPref,
|
|
int depthMin, int depthPref,
|
|
int stencilMin, int stencilPref,
|
|
int samplesMin, int samplesPref, float samplesQ,
|
|
int dpi)
|
|
{
|
|
RsSurfaceConfig sc;
|
|
sc.alphaMin = alphaMin;
|
|
sc.alphaPref = alphaPref;
|
|
sc.colorMin = colorMin;
|
|
sc.colorPref = colorPref;
|
|
sc.depthMin = depthMin;
|
|
sc.depthPref = depthPref;
|
|
sc.samplesMin = samplesMin;
|
|
sc.samplesPref = samplesPref;
|
|
sc.samplesQ = samplesQ;
|
|
|
|
LOG_API("nContextCreateGL");
|
|
return (jint)rsContextCreateGL((RsDevice)dev, ver, sdkVer, sc, dpi);
|
|
}
|
|
|
|
static void
|
|
nContextSetPriority(JNIEnv *_env, jobject _this, RsContext con, jint p)
|
|
{
|
|
LOG_API("ContextSetPriority, con(%p), priority(%i)", con, p);
|
|
rsContextSetPriority(con, p);
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
nContextSetSurface(JNIEnv *_env, jobject _this, RsContext con, jint width, jint height, jobject wnd)
|
|
{
|
|
LOG_API("nContextSetSurface, con(%p), width(%i), height(%i), surface(%p)", con, width, height, (Surface *)wnd);
|
|
|
|
ANativeWindow * window = NULL;
|
|
if (wnd == NULL) {
|
|
|
|
} else {
|
|
window = android_view_Surface_getNativeWindow(_env, wnd).get();
|
|
}
|
|
|
|
rsContextSetSurface(con, width, height, window);
|
|
}
|
|
|
|
static void
|
|
nContextSetSurfaceTexture(JNIEnv *_env, jobject _this, RsContext con, jint width, jint height, jobject sur)
|
|
{
|
|
LOG_API("nContextSetSurfaceTexture, con(%p), width(%i), height(%i), surface(%p)", con, width, height, (Surface *)sur);
|
|
|
|
sp<ANativeWindow> window;
|
|
sp<SurfaceTexture> st;
|
|
if (sur == 0) {
|
|
|
|
} else {
|
|
st = SurfaceTexture_getSurfaceTexture(_env, sur);
|
|
window = new SurfaceTextureClient(st);
|
|
}
|
|
|
|
rsContextSetSurface(con, width, height, window.get());
|
|
}
|
|
|
|
static void
|
|
nContextDestroy(JNIEnv *_env, jobject _this, RsContext con)
|
|
{
|
|
LOG_API("nContextDestroy, con(%p)", con);
|
|
rsContextDestroy(con);
|
|
}
|
|
|
|
static void
|
|
nContextDump(JNIEnv *_env, jobject _this, RsContext con, jint bits)
|
|
{
|
|
LOG_API("nContextDump, con(%p) bits(%i)", (RsContext)con, bits);
|
|
rsContextDump((RsContext)con, bits);
|
|
}
|
|
|
|
static void
|
|
nContextPause(JNIEnv *_env, jobject _this, RsContext con)
|
|
{
|
|
LOG_API("nContextPause, con(%p)", con);
|
|
rsContextPause(con);
|
|
}
|
|
|
|
static void
|
|
nContextResume(JNIEnv *_env, jobject _this, RsContext con)
|
|
{
|
|
LOG_API("nContextResume, con(%p)", con);
|
|
rsContextResume(con);
|
|
}
|
|
|
|
|
|
static jstring
|
|
nContextGetErrorMessage(JNIEnv *_env, jobject _this, RsContext con)
|
|
{
|
|
LOG_API("nContextGetErrorMessage, con(%p)", con);
|
|
char buf[1024];
|
|
|
|
size_t receiveLen;
|
|
uint32_t subID;
|
|
int id = rsContextGetMessage(con,
|
|
buf, sizeof(buf),
|
|
&receiveLen, sizeof(receiveLen),
|
|
&subID, sizeof(subID));
|
|
if (!id && receiveLen) {
|
|
ALOGV("message receive buffer too small. %i", receiveLen);
|
|
}
|
|
return _env->NewStringUTF(buf);
|
|
}
|
|
|
|
static jint
|
|
nContextGetUserMessage(JNIEnv *_env, jobject _this, RsContext con, jintArray data)
|
|
{
|
|
jint len = _env->GetArrayLength(data);
|
|
LOG_API("nContextGetMessage, con(%p), len(%i)", con, len);
|
|
jint *ptr = _env->GetIntArrayElements(data, NULL);
|
|
size_t receiveLen;
|
|
uint32_t subID;
|
|
int id = rsContextGetMessage(con,
|
|
ptr, len * 4,
|
|
&receiveLen, sizeof(receiveLen),
|
|
&subID, sizeof(subID));
|
|
if (!id && receiveLen) {
|
|
ALOGV("message receive buffer too small. %i", receiveLen);
|
|
}
|
|
_env->ReleaseIntArrayElements(data, ptr, 0);
|
|
return id;
|
|
}
|
|
|
|
static jint
|
|
nContextPeekMessage(JNIEnv *_env, jobject _this, RsContext con, jintArray auxData)
|
|
{
|
|
LOG_API("nContextPeekMessage, con(%p)", con);
|
|
jint *auxDataPtr = _env->GetIntArrayElements(auxData, NULL);
|
|
size_t receiveLen;
|
|
uint32_t subID;
|
|
int id = rsContextPeekMessage(con, &receiveLen, sizeof(receiveLen),
|
|
&subID, sizeof(subID));
|
|
auxDataPtr[0] = (jint)subID;
|
|
auxDataPtr[1] = (jint)receiveLen;
|
|
_env->ReleaseIntArrayElements(auxData, auxDataPtr, 0);
|
|
return id;
|
|
}
|
|
|
|
static void nContextInitToClient(JNIEnv *_env, jobject _this, RsContext con)
|
|
{
|
|
LOG_API("nContextInitToClient, con(%p)", con);
|
|
rsContextInitToClient(con);
|
|
}
|
|
|
|
static void nContextDeinitToClient(JNIEnv *_env, jobject _this, RsContext con)
|
|
{
|
|
LOG_API("nContextDeinitToClient, con(%p)", con);
|
|
rsContextDeinitToClient(con);
|
|
}
|
|
|
|
|
|
static jint
|
|
nElementCreate(JNIEnv *_env, jobject _this, RsContext con, jint type, jint kind, jboolean norm, jint size)
|
|
{
|
|
LOG_API("nElementCreate, con(%p), type(%i), kind(%i), norm(%i), size(%i)", con, type, kind, norm, size);
|
|
return (jint)rsElementCreate(con, (RsDataType)type, (RsDataKind)kind, norm, size);
|
|
}
|
|
|
|
static jint
|
|
nElementCreate2(JNIEnv *_env, jobject _this, RsContext con,
|
|
jintArray _ids, jobjectArray _names, jintArray _arraySizes)
|
|
{
|
|
int fieldCount = _env->GetArrayLength(_ids);
|
|
LOG_API("nElementCreate2, con(%p)", con);
|
|
|
|
jint *ids = _env->GetIntArrayElements(_ids, NULL);
|
|
jint *arraySizes = _env->GetIntArrayElements(_arraySizes, NULL);
|
|
|
|
AutoJavaStringArrayToUTF8 names(_env, _names, fieldCount);
|
|
|
|
const char **nameArray = names.c_str();
|
|
size_t *sizeArray = names.c_str_len();
|
|
|
|
jint id = (jint)rsElementCreate2(con,
|
|
(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);
|
|
return (jint)id;
|
|
}
|
|
|
|
static void
|
|
nElementGetNativeData(JNIEnv *_env, jobject _this, RsContext con, jint id, jintArray _elementData)
|
|
{
|
|
int dataSize = _env->GetArrayLength(_elementData);
|
|
LOG_API("nElementGetNativeData, con(%p)", con);
|
|
|
|
// we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
|
|
assert(dataSize == 5);
|
|
|
|
uint32_t elementData[5];
|
|
rsaElementGetNativeData(con, (RsElement)id, elementData, dataSize);
|
|
|
|
for(jint i = 0; i < dataSize; i ++) {
|
|
_env->SetIntArrayRegion(_elementData, i, 1, (const jint*)&elementData[i]);
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
nElementGetSubElements(JNIEnv *_env, jobject _this, RsContext con, jint id,
|
|
jintArray _IDs,
|
|
jobjectArray _names,
|
|
jintArray _arraySizes)
|
|
{
|
|
int dataSize = _env->GetArrayLength(_IDs);
|
|
LOG_API("nElementGetSubElements, con(%p)", 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));
|
|
|
|
rsaElementGetSubElements(con, (RsElement)id, ids, names, arraySizes, (uint32_t)dataSize);
|
|
|
|
for(jint i = 0; i < dataSize; 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]);
|
|
}
|
|
|
|
free(ids);
|
|
free(names);
|
|
free(arraySizes);
|
|
}
|
|
|
|
// -----------------------------------
|
|
|
|
static int
|
|
nTypeCreate(JNIEnv *_env, jobject _this, RsContext con, RsElement eid,
|
|
jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces)
|
|
{
|
|
LOG_API("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i)",
|
|
con, eid, dimx, dimy, dimz, mips, faces);
|
|
|
|
jint id = (jint)rsTypeCreate(con, (RsElement)eid, dimx, dimy, dimz, mips, faces);
|
|
return (jint)id;
|
|
}
|
|
|
|
static void
|
|
nTypeGetNativeData(JNIEnv *_env, jobject _this, RsContext con, jint id, jintArray _typeData)
|
|
{
|
|
// We are packing 6 items: mDimX; mDimY; mDimZ;
|
|
// mDimLOD; mDimFaces; mElement; into typeData
|
|
int elementCount = _env->GetArrayLength(_typeData);
|
|
|
|
assert(elementCount == 6);
|
|
LOG_API("nTypeCreate, con(%p)", con);
|
|
|
|
uint32_t typeData[6];
|
|
rsaTypeGetNativeData(con, (RsType)id, typeData, 6);
|
|
|
|
for(jint i = 0; i < elementCount; i ++) {
|
|
_env->SetIntArrayRegion(_typeData, i, 1, (const jint*)&typeData[i]);
|
|
}
|
|
}
|
|
|
|
// -----------------------------------
|
|
|
|
static jint
|
|
nAllocationCreateTyped(JNIEnv *_env, jobject _this, RsContext con, jint type, jint mips, jint usage, jint pointer)
|
|
{
|
|
LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)", con, (RsElement)type, mips, usage, (void *)pointer);
|
|
return (jint) rsAllocationCreateTyped(con, (RsType)type, (RsAllocationMipmapControl)mips, (uint32_t)usage, (uint32_t)pointer);
|
|
}
|
|
|
|
static void
|
|
nAllocationSyncAll(JNIEnv *_env, jobject _this, RsContext con, jint a, jint bits)
|
|
{
|
|
LOG_API("nAllocationSyncAll, con(%p), a(%p), bits(0x%08x)", con, (RsAllocation)a, bits);
|
|
rsAllocationSyncAll(con, (RsAllocation)a, (RsAllocationUsageType)bits);
|
|
}
|
|
|
|
static jint
|
|
nAllocationGetSurfaceTextureID(JNIEnv *_env, jobject _this, RsContext con, jint a)
|
|
{
|
|
LOG_API("nAllocationGetSurfaceTextureID, con(%p), a(%p)", con, (RsAllocation)a);
|
|
return rsAllocationGetSurfaceTextureID(con, (RsAllocation)a);
|
|
}
|
|
|
|
static void
|
|
nAllocationGetSurfaceTextureID2(JNIEnv *_env, jobject _this, RsContext con, jint a, jobject jst)
|
|
{
|
|
LOG_API("nAllocationGetSurfaceTextureID2, con(%p), a(%p)", con, (RsAllocation)a);
|
|
sp<SurfaceTexture> st = SurfaceTexture_getSurfaceTexture(_env, jst);
|
|
|
|
rsAllocationGetSurfaceTextureID2(con, (RsAllocation)a, st.get(), sizeof(SurfaceTexture *));
|
|
}
|
|
|
|
static void
|
|
nAllocationSetSurface(JNIEnv *_env, jobject _this, RsContext con, RsAllocation alloc, jobject sur)
|
|
{
|
|
LOG_API("nAllocationSetSurface, con(%p), alloc(%p), surface(%p)",
|
|
con, alloc, (Surface *)sur);
|
|
|
|
sp<Surface> s;
|
|
if (sur != 0) {
|
|
s = android_view_Surface_getSurface(_env, sur);
|
|
}
|
|
|
|
rsAllocationSetSurface(con, alloc, static_cast<ANativeWindow *>(s.get()));
|
|
}
|
|
|
|
static void
|
|
nAllocationIoSend(JNIEnv *_env, jobject _this, RsContext con, RsAllocation alloc)
|
|
{
|
|
LOG_API("nAllocationIoSend, con(%p), alloc(%p)", con, alloc);
|
|
rsAllocationIoSend(con, alloc);
|
|
}
|
|
|
|
static void
|
|
nAllocationIoReceive(JNIEnv *_env, jobject _this, RsContext con, RsAllocation alloc)
|
|
{
|
|
LOG_API("nAllocationIoReceive, con(%p), alloc(%p)", con, alloc);
|
|
rsAllocationIoReceive(con, alloc);
|
|
}
|
|
|
|
|
|
static void
|
|
nAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, RsContext con, jint alloc)
|
|
{
|
|
LOG_API("nAllocationGenerateMipmaps, con(%p), a(%p)", con, (RsAllocation)alloc);
|
|
rsAllocationGenerateMipmaps(con, (RsAllocation)alloc);
|
|
}
|
|
|
|
static int
|
|
nAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, RsContext con, jint type, jint mip, jobject jbitmap, jint usage)
|
|
{
|
|
SkBitmap const * nativeBitmap =
|
|
(SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID);
|
|
const SkBitmap& bitmap(*nativeBitmap);
|
|
|
|
bitmap.lockPixels();
|
|
const void* ptr = bitmap.getPixels();
|
|
jint id = (jint)rsAllocationCreateFromBitmap(con,
|
|
(RsType)type, (RsAllocationMipmapControl)mip,
|
|
ptr, bitmap.getSize(), usage);
|
|
bitmap.unlockPixels();
|
|
return id;
|
|
}
|
|
|
|
static int
|
|
nAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, RsContext con, jint type, jint mip, jobject jbitmap, jint usage)
|
|
{
|
|
SkBitmap const * nativeBitmap =
|
|
(SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID);
|
|
const SkBitmap& bitmap(*nativeBitmap);
|
|
|
|
bitmap.lockPixels();
|
|
const void* ptr = bitmap.getPixels();
|
|
jint id = (jint)rsAllocationCubeCreateFromBitmap(con,
|
|
(RsType)type, (RsAllocationMipmapControl)mip,
|
|
ptr, bitmap.getSize(), usage);
|
|
bitmap.unlockPixels();
|
|
return id;
|
|
}
|
|
|
|
static void
|
|
nAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jobject jbitmap)
|
|
{
|
|
SkBitmap const * nativeBitmap =
|
|
(SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID);
|
|
const SkBitmap& bitmap(*nativeBitmap);
|
|
int w = bitmap.width();
|
|
int h = bitmap.height();
|
|
|
|
bitmap.lockPixels();
|
|
const void* ptr = bitmap.getPixels();
|
|
rsAllocation2DData(con, (RsAllocation)alloc, 0, 0,
|
|
0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X,
|
|
w, h, ptr, bitmap.getSize());
|
|
bitmap.unlockPixels();
|
|
}
|
|
|
|
static void
|
|
nAllocationCopyToBitmap(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jobject jbitmap)
|
|
{
|
|
SkBitmap const * nativeBitmap =
|
|
(SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID);
|
|
const SkBitmap& bitmap(*nativeBitmap);
|
|
|
|
bitmap.lockPixels();
|
|
void* ptr = bitmap.getPixels();
|
|
rsAllocationCopyToBitmap(con, (RsAllocation)alloc, ptr, bitmap.getSize());
|
|
bitmap.unlockPixels();
|
|
bitmap.notifyPixelsChanged();
|
|
}
|
|
|
|
static void ReleaseBitmapCallback(void *bmp)
|
|
{
|
|
SkBitmap const * nativeBitmap = (SkBitmap const *)bmp;
|
|
nativeBitmap->unlockPixels();
|
|
}
|
|
|
|
|
|
static void
|
|
nAllocationData1D_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jintArray data, int sizeBytes)
|
|
{
|
|
jint len = _env->GetArrayLength(data);
|
|
LOG_API("nAllocation1DData_i, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes);
|
|
jint *ptr = _env->GetIntArrayElements(data, NULL);
|
|
rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes);
|
|
_env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
|
|
}
|
|
|
|
static void
|
|
nAllocationData1D_s(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jshortArray data, int sizeBytes)
|
|
{
|
|
jint len = _env->GetArrayLength(data);
|
|
LOG_API("nAllocation1DData_s, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes);
|
|
jshort *ptr = _env->GetShortArrayElements(data, NULL);
|
|
rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes);
|
|
_env->ReleaseShortArrayElements(data, ptr, JNI_ABORT);
|
|
}
|
|
|
|
static void
|
|
nAllocationData1D_b(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jbyteArray data, int sizeBytes)
|
|
{
|
|
jint len = _env->GetArrayLength(data);
|
|
LOG_API("nAllocation1DData_b, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes);
|
|
jbyte *ptr = _env->GetByteArrayElements(data, NULL);
|
|
rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes);
|
|
_env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
|
|
}
|
|
|
|
static void
|
|
nAllocationData1D_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jfloatArray data, int sizeBytes)
|
|
{
|
|
jint len = _env->GetArrayLength(data);
|
|
LOG_API("nAllocation1DData_f, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes);
|
|
jfloat *ptr = _env->GetFloatArrayElements(data, NULL);
|
|
rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes);
|
|
_env->ReleaseFloatArrayElements(data, ptr, JNI_ABORT);
|
|
}
|
|
|
|
static void
|
|
// native void rsnAllocationElementData1D(int con, int id, int xoff, int compIdx, byte[] d, int sizeBytes);
|
|
nAllocationElementData1D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint compIdx, jbyteArray data, int sizeBytes)
|
|
{
|
|
jint len = _env->GetArrayLength(data);
|
|
LOG_API("nAllocationElementData1D, con(%p), alloc(%p), offset(%i), comp(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, compIdx, len, sizeBytes);
|
|
jbyte *ptr = _env->GetByteArrayElements(data, NULL);
|
|
rsAllocation1DElementData(con, (RsAllocation)alloc, offset, lod, ptr, sizeBytes, compIdx);
|
|
_env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
|
|
}
|
|
|
|
static void
|
|
nAllocationData2D_s(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face,
|
|
jint w, jint h, jshortArray data, int sizeBytes)
|
|
{
|
|
jint len = _env->GetArrayLength(data);
|
|
LOG_API("nAllocation2DData_s, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", con, (RsAllocation)alloc, xoff, yoff, w, h, len);
|
|
jshort *ptr = _env->GetShortArrayElements(data, NULL);
|
|
rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes);
|
|
_env->ReleaseShortArrayElements(data, ptr, JNI_ABORT);
|
|
}
|
|
|
|
static void
|
|
nAllocationData2D_b(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face,
|
|
jint w, jint h, jbyteArray data, int sizeBytes)
|
|
{
|
|
jint len = _env->GetArrayLength(data);
|
|
LOG_API("nAllocation2DData_b, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", con, (RsAllocation)alloc, xoff, yoff, w, h, len);
|
|
jbyte *ptr = _env->GetByteArrayElements(data, NULL);
|
|
rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes);
|
|
_env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
|
|
}
|
|
|
|
static void
|
|
nAllocationData2D_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face,
|
|
jint w, jint h, jintArray data, int sizeBytes)
|
|
{
|
|
jint len = _env->GetArrayLength(data);
|
|
LOG_API("nAllocation2DData_i, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", con, (RsAllocation)alloc, xoff, yoff, w, h, len);
|
|
jint *ptr = _env->GetIntArrayElements(data, NULL);
|
|
rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes);
|
|
_env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
|
|
}
|
|
|
|
static void
|
|
nAllocationData2D_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face,
|
|
jint w, jint h, jfloatArray data, int sizeBytes)
|
|
{
|
|
jint len = _env->GetArrayLength(data);
|
|
LOG_API("nAllocation2DData_i, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", con, (RsAllocation)alloc, xoff, yoff, w, h, len);
|
|
jfloat *ptr = _env->GetFloatArrayElements(data, NULL);
|
|
rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes);
|
|
_env->ReleaseFloatArrayElements(data, ptr, JNI_ABORT);
|
|
}
|
|
|
|
static void
|
|
nAllocationData2D_alloc(JNIEnv *_env, jobject _this, RsContext con,
|
|
jint dstAlloc, jint dstXoff, jint dstYoff,
|
|
jint dstMip, jint dstFace,
|
|
jint width, jint height,
|
|
jint srcAlloc, jint srcXoff, jint srcYoff,
|
|
jint srcMip, jint srcFace)
|
|
{
|
|
LOG_API("nAllocation2DData_s, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
|
|
" dstMip(%i), dstFace(%i), width(%i), height(%i),"
|
|
" srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i), srcFace(%i)",
|
|
con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
|
|
width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
|
|
|
|
rsAllocationCopy2DRange(con,
|
|
(RsAllocation)dstAlloc,
|
|
dstXoff, dstYoff,
|
|
dstMip, dstFace,
|
|
width, height,
|
|
(RsAllocation)srcAlloc,
|
|
srcXoff, srcYoff,
|
|
srcMip, srcFace);
|
|
}
|
|
|
|
static void
|
|
nAllocationRead_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jintArray data)
|
|
{
|
|
jint len = _env->GetArrayLength(data);
|
|
LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len);
|
|
jint *ptr = _env->GetIntArrayElements(data, NULL);
|
|
jsize length = _env->GetArrayLength(data);
|
|
rsAllocationRead(con, (RsAllocation)alloc, ptr, length * sizeof(int));
|
|
_env->ReleaseIntArrayElements(data, ptr, 0);
|
|
}
|
|
|
|
static void
|
|
nAllocationRead_s(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jshortArray data)
|
|
{
|
|
jint len = _env->GetArrayLength(data);
|
|
LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len);
|
|
jshort *ptr = _env->GetShortArrayElements(data, NULL);
|
|
jsize length = _env->GetArrayLength(data);
|
|
rsAllocationRead(con, (RsAllocation)alloc, ptr, length * sizeof(short));
|
|
_env->ReleaseShortArrayElements(data, ptr, 0);
|
|
}
|
|
|
|
static void
|
|
nAllocationRead_b(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jbyteArray data)
|
|
{
|
|
jint len = _env->GetArrayLength(data);
|
|
LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len);
|
|
jbyte *ptr = _env->GetByteArrayElements(data, NULL);
|
|
jsize length = _env->GetArrayLength(data);
|
|
rsAllocationRead(con, (RsAllocation)alloc, ptr, length * sizeof(char));
|
|
_env->ReleaseByteArrayElements(data, ptr, 0);
|
|
}
|
|
|
|
static void
|
|
nAllocationRead_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jfloatArray data)
|
|
{
|
|
jint len = _env->GetArrayLength(data);
|
|
LOG_API("nAllocationRead_f, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len);
|
|
jfloat *ptr = _env->GetFloatArrayElements(data, NULL);
|
|
jsize length = _env->GetArrayLength(data);
|
|
rsAllocationRead(con, (RsAllocation)alloc, ptr, length * sizeof(float));
|
|
_env->ReleaseFloatArrayElements(data, ptr, 0);
|
|
}
|
|
|
|
static jint
|
|
nAllocationGetType(JNIEnv *_env, jobject _this, RsContext con, jint a)
|
|
{
|
|
LOG_API("nAllocationGetType, con(%p), a(%p)", con, (RsAllocation)a);
|
|
return (jint) rsaAllocationGetType(con, (RsAllocation)a);
|
|
}
|
|
|
|
static void
|
|
nAllocationResize1D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint dimX)
|
|
{
|
|
LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", con, (RsAllocation)alloc, dimX);
|
|
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
|
|
nFileA3DCreateFromAssetStream(JNIEnv *_env, jobject _this, RsContext con, jint native_asset)
|
|
{
|
|
ALOGV("______nFileA3D %u", (uint32_t) native_asset);
|
|
|
|
Asset* asset = reinterpret_cast<Asset*>(native_asset);
|
|
|
|
jint id = (jint)rsaFileA3DCreateFromMemory(con, asset->getBuffer(false), asset->getLength());
|
|
return id;
|
|
}
|
|
|
|
static int
|
|
nFileA3DCreateFromAsset(JNIEnv *_env, jobject _this, RsContext con, jobject _assetMgr, jstring _path)
|
|
{
|
|
AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr);
|
|
if (mgr == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
AutoJavaStringToUTF8 str(_env, _path);
|
|
Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
|
|
if (asset == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
jint id = (jint)rsaFileA3DCreateFromAsset(con, asset);
|
|
return id;
|
|
}
|
|
|
|
static int
|
|
nFileA3DCreateFromFile(JNIEnv *_env, jobject _this, RsContext con, jstring fileName)
|
|
{
|
|
AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
|
|
jint id = (jint)rsaFileA3DCreateFromFile(con, fileNameUTF.c_str());
|
|
|
|
return id;
|
|
}
|
|
|
|
static int
|
|
nFileA3DGetNumIndexEntries(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D)
|
|
{
|
|
int32_t numEntries = 0;
|
|
rsaFileA3DGetNumIndexEntries(con, &numEntries, (RsFile)fileA3D);
|
|
return numEntries;
|
|
}
|
|
|
|
static void
|
|
nFileA3DGetIndexEntries(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D, jint numEntries, jintArray _ids, jobjectArray _entries)
|
|
{
|
|
ALOGV("______nFileA3D %u", (uint32_t) fileA3D);
|
|
RsFileIndexEntry *fileEntries = (RsFileIndexEntry*)malloc((uint32_t)numEntries * sizeof(RsFileIndexEntry));
|
|
|
|
rsaFileA3DGetIndexEntries(con, fileEntries, (uint32_t)numEntries, (RsFile)fileA3D);
|
|
|
|
for(jint i = 0; i < numEntries; i ++) {
|
|
_env->SetObjectArrayElement(_entries, i, _env->NewStringUTF(fileEntries[i].objectName));
|
|
_env->SetIntArrayRegion(_ids, i, 1, (const jint*)&fileEntries[i].classID);
|
|
}
|
|
|
|
free(fileEntries);
|
|
}
|
|
|
|
static int
|
|
nFileA3DGetEntryByIndex(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D, jint index)
|
|
{
|
|
ALOGV("______nFileA3D %u", (uint32_t) fileA3D);
|
|
jint id = (jint)rsaFileA3DGetEntryByIndex(con, (uint32_t)index, (RsFile)fileA3D);
|
|
return id;
|
|
}
|
|
|
|
// -----------------------------------
|
|
|
|
static int
|
|
nFontCreateFromFile(JNIEnv *_env, jobject _this, RsContext con,
|
|
jstring fileName, jfloat fontSize, jint dpi)
|
|
{
|
|
AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
|
|
jint id = (jint)rsFontCreateFromFile(con,
|
|
fileNameUTF.c_str(), fileNameUTF.length(),
|
|
fontSize, dpi);
|
|
|
|
return id;
|
|
}
|
|
|
|
static int
|
|
nFontCreateFromAssetStream(JNIEnv *_env, jobject _this, RsContext con,
|
|
jstring name, jfloat fontSize, jint dpi, jint native_asset)
|
|
{
|
|
Asset* asset = reinterpret_cast<Asset*>(native_asset);
|
|
AutoJavaStringToUTF8 nameUTF(_env, name);
|
|
|
|
jint id = (jint)rsFontCreateFromMemory(con,
|
|
nameUTF.c_str(), nameUTF.length(),
|
|
fontSize, dpi,
|
|
asset->getBuffer(false), asset->getLength());
|
|
return id;
|
|
}
|
|
|
|
static int
|
|
nFontCreateFromAsset(JNIEnv *_env, jobject _this, RsContext con, jobject _assetMgr, jstring _path,
|
|
jfloat fontSize, jint dpi)
|
|
{
|
|
AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr);
|
|
if (mgr == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
AutoJavaStringToUTF8 str(_env, _path);
|
|
Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
|
|
if (asset == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
jint id = (jint)rsFontCreateFromMemory(con,
|
|
str.c_str(), str.length(),
|
|
fontSize, dpi,
|
|
asset->getBuffer(false), asset->getLength());
|
|
delete asset;
|
|
return id;
|
|
}
|
|
|
|
// -----------------------------------
|
|
|
|
static void
|
|
nScriptBindAllocation(JNIEnv *_env, jobject _this, RsContext con, jint script, jint alloc, jint slot)
|
|
{
|
|
LOG_API("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)", con, (RsScript)script, (RsAllocation)alloc, slot);
|
|
rsScriptBindAllocation(con, (RsScript)script, (RsAllocation)alloc, slot);
|
|
}
|
|
|
|
static void
|
|
nScriptSetVarI(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jint val)
|
|
{
|
|
LOG_API("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", con, (void *)script, slot, val);
|
|
rsScriptSetVarI(con, (RsScript)script, slot, val);
|
|
}
|
|
|
|
static void
|
|
nScriptSetVarObj(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jint val)
|
|
{
|
|
LOG_API("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%i)", con, (void *)script, slot, val);
|
|
rsScriptSetVarObj(con, (RsScript)script, slot, (RsObjectBase)val);
|
|
}
|
|
|
|
static void
|
|
nScriptSetVarJ(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jlong val)
|
|
{
|
|
LOG_API("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%lli)", con, (void *)script, slot, val);
|
|
rsScriptSetVarJ(con, (RsScript)script, slot, val);
|
|
}
|
|
|
|
static void
|
|
nScriptSetVarF(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, float val)
|
|
{
|
|
LOG_API("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", con, (void *)script, slot, val);
|
|
rsScriptSetVarF(con, (RsScript)script, slot, val);
|
|
}
|
|
|
|
static void
|
|
nScriptSetVarD(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, double val)
|
|
{
|
|
LOG_API("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", con, (void *)script, slot, val);
|
|
rsScriptSetVarD(con, (RsScript)script, slot, val);
|
|
}
|
|
|
|
static void
|
|
nScriptSetVarV(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jbyteArray data)
|
|
{
|
|
LOG_API("nScriptSetVarV, con(%p), s(%p), slot(%i)", con, (void *)script, slot);
|
|
jint len = _env->GetArrayLength(data);
|
|
jbyte *ptr = _env->GetByteArrayElements(data, NULL);
|
|
rsScriptSetVarV(con, (RsScript)script, slot, ptr, len);
|
|
_env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
|
|
}
|
|
|
|
static void
|
|
nScriptSetVarVE(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jbyteArray data, jint elem, jintArray dims)
|
|
{
|
|
LOG_API("nScriptSetVarVE, con(%p), s(%p), slot(%i)", con, (void *)script, slot);
|
|
jint len = _env->GetArrayLength(data);
|
|
jbyte *ptr = _env->GetByteArrayElements(data, NULL);
|
|
jint dimsLen = _env->GetArrayLength(dims) * sizeof(int);
|
|
jint *dimsPtr = _env->GetIntArrayElements(dims, NULL);
|
|
rsScriptSetVarVE(con, (RsScript)script, slot, ptr, len, (RsElement)elem,
|
|
(const size_t*) dimsPtr, dimsLen);
|
|
_env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
|
|
_env->ReleaseIntArrayElements(dims, dimsPtr, JNI_ABORT);
|
|
}
|
|
|
|
|
|
static void
|
|
nScriptSetTimeZone(JNIEnv *_env, jobject _this, RsContext con, jint script, jbyteArray timeZone)
|
|
{
|
|
LOG_API("nScriptCSetTimeZone, con(%p), s(%p), timeZone(%s)", con, (void *)script, (const char *)timeZone);
|
|
|
|
jint length = _env->GetArrayLength(timeZone);
|
|
jbyte* timeZone_ptr;
|
|
timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0);
|
|
|
|
rsScriptSetTimeZone(con, (RsScript)script, (const char *)timeZone_ptr, length);
|
|
|
|
if (timeZone_ptr) {
|
|
_env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0);
|
|
}
|
|
}
|
|
|
|
static void
|
|
nScriptInvoke(JNIEnv *_env, jobject _this, RsContext con, jint obj, jint slot)
|
|
{
|
|
LOG_API("nScriptInvoke, con(%p), script(%p)", con, (void *)obj);
|
|
rsScriptInvoke(con, (RsScript)obj, slot);
|
|
}
|
|
|
|
static void
|
|
nScriptInvokeV(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jbyteArray data)
|
|
{
|
|
LOG_API("nScriptInvokeV, con(%p), s(%p), slot(%i)", con, (void *)script, slot);
|
|
jint len = _env->GetArrayLength(data);
|
|
jbyte *ptr = _env->GetByteArrayElements(data, NULL);
|
|
rsScriptInvokeV(con, (RsScript)script, slot, ptr, len);
|
|
_env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
|
|
}
|
|
|
|
static void
|
|
nScriptForEach(JNIEnv *_env, jobject _this, RsContext con,
|
|
jint script, jint slot, jint ain, jint aout)
|
|
{
|
|
LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", con, (void *)script, slot);
|
|
rsScriptForEach(con, (RsScript)script, slot, (RsAllocation)ain, (RsAllocation)aout, NULL, 0);
|
|
}
|
|
static void
|
|
nScriptForEachV(JNIEnv *_env, jobject _this, RsContext con,
|
|
jint script, jint slot, jint ain, jint aout, jbyteArray params)
|
|
{
|
|
LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", con, (void *)script, slot);
|
|
jint len = _env->GetArrayLength(params);
|
|
jbyte *ptr = _env->GetByteArrayElements(params, NULL);
|
|
rsScriptForEach(con, (RsScript)script, slot, (RsAllocation)ain, (RsAllocation)aout, ptr, len);
|
|
_env->ReleaseByteArrayElements(params, ptr, JNI_ABORT);
|
|
}
|
|
|
|
|
|
// -----------------------------------
|
|
|
|
static jint
|
|
nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con,
|
|
jstring resName, jstring cacheDir,
|
|
jbyteArray scriptRef, jint length)
|
|
{
|
|
LOG_API("nScriptCCreate, con(%p)", con);
|
|
|
|
AutoJavaStringToUTF8 resNameUTF(_env, resName);
|
|
AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
|
|
jint ret = 0;
|
|
jbyte* script_ptr = NULL;
|
|
jint _exception = 0;
|
|
jint remaining;
|
|
if (!scriptRef) {
|
|
_exception = 1;
|
|
//jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null");
|
|
goto exit;
|
|
}
|
|
if (length < 0) {
|
|
_exception = 1;
|
|
//jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0");
|
|
goto exit;
|
|
}
|
|
remaining = _env->GetArrayLength(scriptRef);
|
|
if (remaining < length) {
|
|
_exception = 1;
|
|
//jniThrowException(_env, "java/lang/IllegalArgumentException",
|
|
// "length > script.length - offset");
|
|
goto exit;
|
|
}
|
|
script_ptr = (jbyte *)
|
|
_env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0);
|
|
|
|
//rsScriptCSetText(con, (const char *)script_ptr, length);
|
|
|
|
ret = (jint)rsScriptCCreate(con,
|
|
resNameUTF.c_str(), resNameUTF.length(),
|
|
cacheDirUTF.c_str(), cacheDirUTF.length(),
|
|
(const char *)script_ptr, length);
|
|
|
|
exit:
|
|
if (script_ptr) {
|
|
_env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr,
|
|
_exception ? JNI_ABORT: 0);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static jint
|
|
nScriptIntrinsicCreate(JNIEnv *_env, jobject _this, RsContext con, jint id, jint eid)
|
|
{
|
|
LOG_API("nScriptIntrinsicCreate, con(%p) id(%i) element(%p)", con, id, (void *)eid);
|
|
return (jint)rsScriptIntrinsicCreate(con, id, (RsElement)eid);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
static jint
|
|
nProgramStoreCreate(JNIEnv *_env, jobject _this, RsContext con,
|
|
jboolean colorMaskR, jboolean colorMaskG, jboolean colorMaskB, jboolean colorMaskA,
|
|
jboolean depthMask, jboolean ditherEnable,
|
|
jint srcFunc, jint destFunc,
|
|
jint depthFunc)
|
|
{
|
|
LOG_API("nProgramStoreCreate, con(%p)", con);
|
|
return (jint)rsProgramStoreCreate(con, colorMaskR, colorMaskG, colorMaskB, colorMaskA,
|
|
depthMask, ditherEnable, (RsBlendSrcFunc)srcFunc,
|
|
(RsBlendDstFunc)destFunc, (RsDepthFunc)depthFunc);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
static void
|
|
nProgramBindConstants(JNIEnv *_env, jobject _this, RsContext con, jint vpv, jint slot, jint a)
|
|
{
|
|
LOG_API("nProgramBindConstants, con(%p), vpf(%p), sloat(%i), a(%p)", con, (RsProgramVertex)vpv, slot, (RsAllocation)a);
|
|
rsProgramBindConstants(con, (RsProgram)vpv, slot, (RsAllocation)a);
|
|
}
|
|
|
|
static void
|
|
nProgramBindTexture(JNIEnv *_env, jobject _this, RsContext con, jint vpf, jint slot, jint a)
|
|
{
|
|
LOG_API("nProgramBindTexture, con(%p), vpf(%p), slot(%i), a(%p)", con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
|
|
rsProgramBindTexture(con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
|
|
}
|
|
|
|
static void
|
|
nProgramBindSampler(JNIEnv *_env, jobject _this, RsContext con, jint vpf, jint slot, jint a)
|
|
{
|
|
LOG_API("nProgramBindSampler, con(%p), vpf(%p), slot(%i), a(%p)", con, (RsProgramFragment)vpf, slot, (RsSampler)a);
|
|
rsProgramBindSampler(con, (RsProgramFragment)vpf, slot, (RsSampler)a);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
static jint
|
|
nProgramFragmentCreate(JNIEnv *_env, jobject _this, RsContext con, jstring shader,
|
|
jobjectArray texNames, jintArray params)
|
|
{
|
|
AutoJavaStringToUTF8 shaderUTF(_env, shader);
|
|
jint *paramPtr = _env->GetIntArrayElements(params, NULL);
|
|
jint paramLen = _env->GetArrayLength(params);
|
|
|
|
int texCount = _env->GetArrayLength(texNames);
|
|
AutoJavaStringArrayToUTF8 names(_env, texNames, texCount);
|
|
const char ** nameArray = names.c_str();
|
|
size_t* sizeArray = names.c_str_len();
|
|
|
|
LOG_API("nProgramFragmentCreate, con(%p), paramLen(%i)", con, paramLen);
|
|
|
|
jint ret = (jint)rsProgramFragmentCreate(con, shaderUTF.c_str(), shaderUTF.length(),
|
|
nameArray, texCount, sizeArray,
|
|
(uint32_t *)paramPtr, paramLen);
|
|
|
|
_env->ReleaseIntArrayElements(params, paramPtr, JNI_ABORT);
|
|
return ret;
|
|
}
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
static jint
|
|
nProgramVertexCreate(JNIEnv *_env, jobject _this, RsContext con, jstring shader,
|
|
jobjectArray texNames, jintArray params)
|
|
{
|
|
AutoJavaStringToUTF8 shaderUTF(_env, shader);
|
|
jint *paramPtr = _env->GetIntArrayElements(params, NULL);
|
|
jint paramLen = _env->GetArrayLength(params);
|
|
|
|
LOG_API("nProgramVertexCreate, con(%p), paramLen(%i)", con, paramLen);
|
|
|
|
int texCount = _env->GetArrayLength(texNames);
|
|
AutoJavaStringArrayToUTF8 names(_env, texNames, texCount);
|
|
const char ** nameArray = names.c_str();
|
|
size_t* sizeArray = names.c_str_len();
|
|
|
|
jint ret = (jint)rsProgramVertexCreate(con, shaderUTF.c_str(), shaderUTF.length(),
|
|
nameArray, texCount, sizeArray,
|
|
(uint32_t *)paramPtr, paramLen);
|
|
|
|
_env->ReleaseIntArrayElements(params, paramPtr, JNI_ABORT);
|
|
return ret;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
static jint
|
|
nProgramRasterCreate(JNIEnv *_env, jobject _this, RsContext con, jboolean pointSprite, jint cull)
|
|
{
|
|
LOG_API("nProgramRasterCreate, con(%p), pointSprite(%i), cull(%i)", con, pointSprite, cull);
|
|
return (jint)rsProgramRasterCreate(con, pointSprite, (RsCullMode)cull);
|
|
}
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
static void
|
|
nContextBindRootScript(JNIEnv *_env, jobject _this, RsContext con, jint script)
|
|
{
|
|
LOG_API("nContextBindRootScript, con(%p), script(%p)", con, (RsScript)script);
|
|
rsContextBindRootScript(con, (RsScript)script);
|
|
}
|
|
|
|
static void
|
|
nContextBindProgramStore(JNIEnv *_env, jobject _this, RsContext con, jint pfs)
|
|
{
|
|
LOG_API("nContextBindProgramStore, con(%p), pfs(%p)", con, (RsProgramStore)pfs);
|
|
rsContextBindProgramStore(con, (RsProgramStore)pfs);
|
|
}
|
|
|
|
static void
|
|
nContextBindProgramFragment(JNIEnv *_env, jobject _this, RsContext con, jint pf)
|
|
{
|
|
LOG_API("nContextBindProgramFragment, con(%p), pf(%p)", con, (RsProgramFragment)pf);
|
|
rsContextBindProgramFragment(con, (RsProgramFragment)pf);
|
|
}
|
|
|
|
static void
|
|
nContextBindProgramVertex(JNIEnv *_env, jobject _this, RsContext con, jint pf)
|
|
{
|
|
LOG_API("nContextBindProgramVertex, con(%p), pf(%p)", con, (RsProgramVertex)pf);
|
|
rsContextBindProgramVertex(con, (RsProgramVertex)pf);
|
|
}
|
|
|
|
static void
|
|
nContextBindProgramRaster(JNIEnv *_env, jobject _this, RsContext con, jint pf)
|
|
{
|
|
LOG_API("nContextBindProgramRaster, con(%p), pf(%p)", con, (RsProgramRaster)pf);
|
|
rsContextBindProgramRaster(con, (RsProgramRaster)pf);
|
|
}
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
static jint
|
|
nSamplerCreate(JNIEnv *_env, jobject _this, RsContext con, jint magFilter, jint minFilter,
|
|
jint wrapS, jint wrapT, jint wrapR, jfloat aniso)
|
|
{
|
|
LOG_API("nSamplerCreate, con(%p)", con);
|
|
return (jint)rsSamplerCreate(con,
|
|
(RsSamplerValue)magFilter,
|
|
(RsSamplerValue)minFilter,
|
|
(RsSamplerValue)wrapS,
|
|
(RsSamplerValue)wrapT,
|
|
(RsSamplerValue)wrapR,
|
|
aniso);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
//native int rsnPathCreate(int con, int prim, boolean isStatic, int vtx, int loop, float q);
|
|
static jint
|
|
nPathCreate(JNIEnv *_env, jobject _this, RsContext con, jint prim, jboolean isStatic, jint _vtx, jint _loop, jfloat q) {
|
|
LOG_API("nPathCreate, con(%p)", con);
|
|
|
|
int id = (int)rsPathCreate(con, (RsPathPrimitive)prim, isStatic,
|
|
(RsAllocation)_vtx,
|
|
(RsAllocation)_loop, q);
|
|
return id;
|
|
}
|
|
|
|
static jint
|
|
nMeshCreate(JNIEnv *_env, jobject _this, RsContext con, jintArray _vtx, jintArray _idx, jintArray _prim)
|
|
{
|
|
LOG_API("nMeshCreate, con(%p)", con);
|
|
|
|
jint vtxLen = _env->GetArrayLength(_vtx);
|
|
jint *vtxPtr = _env->GetIntArrayElements(_vtx, NULL);
|
|
jint idxLen = _env->GetArrayLength(_idx);
|
|
jint *idxPtr = _env->GetIntArrayElements(_idx, NULL);
|
|
jint primLen = _env->GetArrayLength(_prim);
|
|
jint *primPtr = _env->GetIntArrayElements(_prim, NULL);
|
|
|
|
int id = (int)rsMeshCreate(con,
|
|
(RsAllocation *)vtxPtr, vtxLen,
|
|
(RsAllocation *)idxPtr, idxLen,
|
|
(uint32_t *)primPtr, primLen);
|
|
|
|
_env->ReleaseIntArrayElements(_vtx, vtxPtr, 0);
|
|
_env->ReleaseIntArrayElements(_idx, idxPtr, 0);
|
|
_env->ReleaseIntArrayElements(_prim, primPtr, 0);
|
|
return id;
|
|
}
|
|
|
|
static jint
|
|
nMeshGetVertexBufferCount(JNIEnv *_env, jobject _this, RsContext con, jint mesh)
|
|
{
|
|
LOG_API("nMeshGetVertexBufferCount, con(%p), Mesh(%p)", con, (RsMesh)mesh);
|
|
jint vtxCount = 0;
|
|
rsaMeshGetVertexBufferCount(con, (RsMesh)mesh, &vtxCount);
|
|
return vtxCount;
|
|
}
|
|
|
|
static jint
|
|
nMeshGetIndexCount(JNIEnv *_env, jobject _this, RsContext con, jint mesh)
|
|
{
|
|
LOG_API("nMeshGetIndexCount, con(%p), Mesh(%p)", con, (RsMesh)mesh);
|
|
jint idxCount = 0;
|
|
rsaMeshGetIndexCount(con, (RsMesh)mesh, &idxCount);
|
|
return idxCount;
|
|
}
|
|
|
|
static void
|
|
nMeshGetVertices(JNIEnv *_env, jobject _this, RsContext con, jint mesh, jintArray _ids, int numVtxIDs)
|
|
{
|
|
LOG_API("nMeshGetVertices, con(%p), Mesh(%p)", con, (RsMesh)mesh);
|
|
|
|
RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numVtxIDs * sizeof(RsAllocation));
|
|
rsaMeshGetVertices(con, (RsMesh)mesh, allocs, (uint32_t)numVtxIDs);
|
|
|
|
for(jint i = 0; i < numVtxIDs; i ++) {
|
|
_env->SetIntArrayRegion(_ids, i, 1, (const jint*)&allocs[i]);
|
|
}
|
|
|
|
free(allocs);
|
|
}
|
|
|
|
static void
|
|
nMeshGetIndices(JNIEnv *_env, jobject _this, RsContext con, jint mesh, jintArray _idxIds, jintArray _primitives, int numIndices)
|
|
{
|
|
LOG_API("nMeshGetVertices, con(%p), Mesh(%p)", con, (RsMesh)mesh);
|
|
|
|
RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numIndices * sizeof(RsAllocation));
|
|
uint32_t *prims= (uint32_t*)malloc((uint32_t)numIndices * sizeof(uint32_t));
|
|
|
|
rsaMeshGetIndices(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]);
|
|
}
|
|
|
|
free(allocs);
|
|
free(prims);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
|
static const char *classPathName = "android/renderscript/RenderScript";
|
|
|
|
static JNINativeMethod methods[] = {
|
|
{"_nInit", "()V", (void*)_nInit },
|
|
|
|
{"nDeviceCreate", "()I", (void*)nDeviceCreate },
|
|
{"nDeviceDestroy", "(I)V", (void*)nDeviceDestroy },
|
|
{"nDeviceSetConfig", "(III)V", (void*)nDeviceSetConfig },
|
|
{"nContextGetUserMessage", "(I[I)I", (void*)nContextGetUserMessage },
|
|
{"nContextGetErrorMessage", "(I)Ljava/lang/String;", (void*)nContextGetErrorMessage },
|
|
{"nContextPeekMessage", "(I[I)I", (void*)nContextPeekMessage },
|
|
|
|
{"nContextInitToClient", "(I)V", (void*)nContextInitToClient },
|
|
{"nContextDeinitToClient", "(I)V", (void*)nContextDeinitToClient },
|
|
|
|
|
|
// All methods below are thread protected in java.
|
|
{"rsnContextCreate", "(III)I", (void*)nContextCreate },
|
|
{"rsnContextCreateGL", "(IIIIIIIIIIIIIFI)I", (void*)nContextCreateGL },
|
|
{"rsnContextFinish", "(I)V", (void*)nContextFinish },
|
|
{"rsnContextSetPriority", "(II)V", (void*)nContextSetPriority },
|
|
{"rsnContextSetSurface", "(IIILandroid/view/Surface;)V", (void*)nContextSetSurface },
|
|
{"rsnContextSetSurfaceTexture", "(IIILandroid/graphics/SurfaceTexture;)V", (void*)nContextSetSurfaceTexture },
|
|
{"rsnContextDestroy", "(I)V", (void*)nContextDestroy },
|
|
{"rsnContextDump", "(II)V", (void*)nContextDump },
|
|
{"rsnContextPause", "(I)V", (void*)nContextPause },
|
|
{"rsnContextResume", "(I)V", (void*)nContextResume },
|
|
{"rsnAssignName", "(II[B)V", (void*)nAssignName },
|
|
{"rsnGetName", "(II)Ljava/lang/String;", (void*)nGetName },
|
|
{"rsnObjDestroy", "(II)V", (void*)nObjDestroy },
|
|
|
|
{"rsnFileA3DCreateFromFile", "(ILjava/lang/String;)I", (void*)nFileA3DCreateFromFile },
|
|
{"rsnFileA3DCreateFromAssetStream", "(II)I", (void*)nFileA3DCreateFromAssetStream },
|
|
{"rsnFileA3DCreateFromAsset", "(ILandroid/content/res/AssetManager;Ljava/lang/String;)I", (void*)nFileA3DCreateFromAsset },
|
|
{"rsnFileA3DGetNumIndexEntries", "(II)I", (void*)nFileA3DGetNumIndexEntries },
|
|
{"rsnFileA3DGetIndexEntries", "(III[I[Ljava/lang/String;)V", (void*)nFileA3DGetIndexEntries },
|
|
{"rsnFileA3DGetEntryByIndex", "(III)I", (void*)nFileA3DGetEntryByIndex },
|
|
|
|
{"rsnFontCreateFromFile", "(ILjava/lang/String;FI)I", (void*)nFontCreateFromFile },
|
|
{"rsnFontCreateFromAssetStream", "(ILjava/lang/String;FII)I", (void*)nFontCreateFromAssetStream },
|
|
{"rsnFontCreateFromAsset", "(ILandroid/content/res/AssetManager;Ljava/lang/String;FI)I", (void*)nFontCreateFromAsset },
|
|
|
|
{"rsnElementCreate", "(IIIZI)I", (void*)nElementCreate },
|
|
{"rsnElementCreate2", "(I[I[Ljava/lang/String;[I)I", (void*)nElementCreate2 },
|
|
{"rsnElementGetNativeData", "(II[I)V", (void*)nElementGetNativeData },
|
|
{"rsnElementGetSubElements", "(II[I[Ljava/lang/String;[I)V", (void*)nElementGetSubElements },
|
|
|
|
{"rsnTypeCreate", "(IIIIIZZ)I", (void*)nTypeCreate },
|
|
{"rsnTypeGetNativeData", "(II[I)V", (void*)nTypeGetNativeData },
|
|
|
|
{"rsnAllocationCreateTyped", "(IIIII)I", (void*)nAllocationCreateTyped },
|
|
{"rsnAllocationCreateFromBitmap", "(IIILandroid/graphics/Bitmap;I)I", (void*)nAllocationCreateFromBitmap },
|
|
{"rsnAllocationCubeCreateFromBitmap","(IIILandroid/graphics/Bitmap;I)I", (void*)nAllocationCubeCreateFromBitmap },
|
|
|
|
{"rsnAllocationCopyFromBitmap", "(IILandroid/graphics/Bitmap;)V", (void*)nAllocationCopyFromBitmap },
|
|
{"rsnAllocationCopyToBitmap", "(IILandroid/graphics/Bitmap;)V", (void*)nAllocationCopyToBitmap },
|
|
|
|
{"rsnAllocationSyncAll", "(III)V", (void*)nAllocationSyncAll },
|
|
{"rsnAllocationGetSurfaceTextureID", "(II)I", (void*)nAllocationGetSurfaceTextureID },
|
|
{"rsnAllocationGetSurfaceTextureID2","(IILandroid/graphics/SurfaceTexture;)V",(void*)nAllocationGetSurfaceTextureID2 },
|
|
{"rsnAllocationSetSurface", "(IILandroid/view/Surface;)V", (void*)nAllocationSetSurface },
|
|
{"rsnAllocationIoSend", "(II)V", (void*)nAllocationIoSend },
|
|
{"rsnAllocationIoReceive", "(II)V", (void*)nAllocationIoReceive },
|
|
{"rsnAllocationData1D", "(IIIII[II)V", (void*)nAllocationData1D_i },
|
|
{"rsnAllocationData1D", "(IIIII[SI)V", (void*)nAllocationData1D_s },
|
|
{"rsnAllocationData1D", "(IIIII[BI)V", (void*)nAllocationData1D_b },
|
|
{"rsnAllocationData1D", "(IIIII[FI)V", (void*)nAllocationData1D_f },
|
|
{"rsnAllocationElementData1D", "(IIIII[BI)V", (void*)nAllocationElementData1D },
|
|
{"rsnAllocationData2D", "(IIIIIIII[II)V", (void*)nAllocationData2D_i },
|
|
{"rsnAllocationData2D", "(IIIIIIII[SI)V", (void*)nAllocationData2D_s },
|
|
{"rsnAllocationData2D", "(IIIIIIII[BI)V", (void*)nAllocationData2D_b },
|
|
{"rsnAllocationData2D", "(IIIIIIII[FI)V", (void*)nAllocationData2D_f },
|
|
{"rsnAllocationData2D", "(IIIIIIIIIIIII)V", (void*)nAllocationData2D_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 },
|
|
{"rsnScriptSetTimeZone", "(II[B)V", (void*)nScriptSetTimeZone },
|
|
{"rsnScriptInvoke", "(III)V", (void*)nScriptInvoke },
|
|
{"rsnScriptInvokeV", "(III[B)V", (void*)nScriptInvokeV },
|
|
{"rsnScriptForEach", "(IIIII)V", (void*)nScriptForEach },
|
|
{"rsnScriptForEach", "(IIIII[B)V", (void*)nScriptForEachV },
|
|
{"rsnScriptSetVarI", "(IIII)V", (void*)nScriptSetVarI },
|
|
{"rsnScriptSetVarJ", "(IIIJ)V", (void*)nScriptSetVarJ },
|
|
{"rsnScriptSetVarF", "(IIIF)V", (void*)nScriptSetVarF },
|
|
{"rsnScriptSetVarD", "(IIID)V", (void*)nScriptSetVarD },
|
|
{"rsnScriptSetVarV", "(III[B)V", (void*)nScriptSetVarV },
|
|
{"rsnScriptSetVarVE", "(III[BI[I)V", (void*)nScriptSetVarVE },
|
|
{"rsnScriptSetVarObj", "(IIII)V", (void*)nScriptSetVarObj },
|
|
|
|
{"rsnScriptCCreate", "(ILjava/lang/String;Ljava/lang/String;[BI)I", (void*)nScriptCCreate },
|
|
{"rsnScriptIntrinsicCreate", "(III)I", (void*)nScriptIntrinsicCreate },
|
|
|
|
{"rsnProgramStoreCreate", "(IZZZZZZIII)I", (void*)nProgramStoreCreate },
|
|
|
|
{"rsnProgramBindConstants", "(IIII)V", (void*)nProgramBindConstants },
|
|
{"rsnProgramBindTexture", "(IIII)V", (void*)nProgramBindTexture },
|
|
{"rsnProgramBindSampler", "(IIII)V", (void*)nProgramBindSampler },
|
|
|
|
{"rsnProgramFragmentCreate", "(ILjava/lang/String;[Ljava/lang/String;[I)I", (void*)nProgramFragmentCreate },
|
|
{"rsnProgramRasterCreate", "(IZI)I", (void*)nProgramRasterCreate },
|
|
{"rsnProgramVertexCreate", "(ILjava/lang/String;[Ljava/lang/String;[I)I", (void*)nProgramVertexCreate },
|
|
|
|
{"rsnContextBindRootScript", "(II)V", (void*)nContextBindRootScript },
|
|
{"rsnContextBindProgramStore", "(II)V", (void*)nContextBindProgramStore },
|
|
{"rsnContextBindProgramFragment", "(II)V", (void*)nContextBindProgramFragment },
|
|
{"rsnContextBindProgramVertex", "(II)V", (void*)nContextBindProgramVertex },
|
|
{"rsnContextBindProgramRaster", "(II)V", (void*)nContextBindProgramRaster },
|
|
|
|
{"rsnSamplerCreate", "(IIIIIIF)I", (void*)nSamplerCreate },
|
|
|
|
{"rsnPathCreate", "(IIZIIF)I", (void*)nPathCreate },
|
|
{"rsnMeshCreate", "(I[I[I[I)I", (void*)nMeshCreate },
|
|
|
|
{"rsnMeshGetVertexBufferCount", "(II)I", (void*)nMeshGetVertexBufferCount },
|
|
{"rsnMeshGetIndexCount", "(II)I", (void*)nMeshGetIndexCount },
|
|
{"rsnMeshGetVertices", "(II[II)V", (void*)nMeshGetVertices },
|
|
{"rsnMeshGetIndices", "(II[I[II)V", (void*)nMeshGetIndices },
|
|
|
|
};
|
|
|
|
static int registerFuncs(JNIEnv *_env)
|
|
{
|
|
return android::AndroidRuntime::registerNativeMethods(
|
|
_env, classPathName, methods, NELEM(methods));
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
jint JNI_OnLoad(JavaVM* vm, void* reserved)
|
|
{
|
|
JNIEnv* env = NULL;
|
|
jint result = -1;
|
|
|
|
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
|
|
ALOGE("ERROR: GetEnv failed\n");
|
|
goto bail;
|
|
}
|
|
assert(env != NULL);
|
|
|
|
if (registerFuncs(env) < 0) {
|
|
ALOGE("ERROR: MediaPlayer native registration failed\n");
|
|
goto bail;
|
|
}
|
|
|
|
/* success -- return valid version number */
|
|
result = JNI_VERSION_1_4;
|
|
|
|
bail:
|
|
return result;
|
|
}
|