Merge "OpenGL bindings fix for methods with iobuffer args"

This commit is contained in:
Mathias Agopian 2012-07-18 18:31:41 -07:00 committed by Android (Google) Code Review
commit df5cbd7622
7 changed files with 53 additions and 44 deletions

View File

@ -939,10 +939,13 @@ public class JniCodeEmitter {
// Emit a single _array or multiple _XXXArray variables
if (numBufferArgs == 1) {
out.println(indent + "jarray _array = (jarray) 0;");
out.println(indent + "jint _bufferOffset = (jint) 0;");
} else {
for (int i = 0; i < numBufferArgs; i++) {
out.println(indent + "jarray _" + bufferArgNames.get(i) +
"Array = (jarray) 0;");
out.println(indent + "jint _" + bufferArgNames.get(i) +
"BufferOffset = (jint) 0;");
}
}
if (!isVoid) {
@ -1075,7 +1078,6 @@ public class JniCodeEmitter {
// Emit 'GetPrimitiveArrayCritical' for non-object arrays
// Emit 'GetPointer' calls for Buffer pointers
int bufArgIdx = 0;
if (nonPrimitiveArgs.size() > 0) {
for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
int idx = nonPrimitiveArgs.get(i).intValue();
@ -1168,7 +1170,9 @@ public class JniCodeEmitter {
out.println();
} else if (jfunc.getArgType(idx).isBuffer()) {
String array = numBufferArgs <= 1 ? "_array" :
"_" + bufferArgNames.get(bufArgIdx++) + "Array";
"_" + cfunc.getArgName(cIndex) + "Array";
String bufferOffset = numBufferArgs <= 1 ? "_bufferOffset" :
"_" + cfunc.getArgName(cIndex) + "BufferOffset";
boolean nullAllowed = isNullAllowed(cfunc) || isPointerFunc;
if (nullAllowed) {
@ -1194,7 +1198,7 @@ public class JniCodeEmitter {
cfunc.getArgType(cIndex).getDeclaration() +
")getPointer(_env, " +
cname +
"_buf, &" + array + ", &" + remaining +
"_buf, &" + array + ", &" + remaining + ", &" + bufferOffset +
");");
}
@ -1209,6 +1213,28 @@ public class JniCodeEmitter {
}
}
// Emit 'GetPrimitiveArrayCritical' for pointers if needed
if (nonPrimitiveArgs.size() > 0) {
for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
int idx = nonPrimitiveArgs.get(i).intValue();
int cIndex = jfunc.getArgCIndex(idx);
if(!jfunc.getArgType(idx).isBuffer() || isPointerFunc) continue;
String cname = cfunc.getArgName(cIndex);
String bufferOffset = numBufferArgs <= 1 ? "_bufferOffset" :
"_" + cname + "BufferOffset";
String array = numBufferArgs <= 1 ? "_array" :
"_" + cfunc.getArgName(cIndex) + "Array";
out.println(indent + "if (" + cname +" == NULL) {");
out.println(indent + indent + "char * _" + cname + "Base = (char *)_env->GetPrimitiveArrayCritical(" + array + ", (jboolean *) 0);");
out.println(indent + indent + cname + " = (" +cfunc.getArgType(cIndex).getDeclaration() +") (_" + cname + "Base + " + bufferOffset + ");");
out.println(indent + "}");
}
}
if (!isVoid) {
out.print(indent + "_returnValue = ");
} else {
@ -1252,7 +1278,7 @@ public class JniCodeEmitter {
out.print("_native");
}
if (cfunc.getArgType(i).isEGLHandle() &&
if (cfunc.getArgType(i).isEGLHandle() &&
!cfunc.getArgType(i).isPointer()){
out.print(cfunc.getArgName(i)+"_native");
} else {
@ -1279,7 +1305,7 @@ public class JniCodeEmitter {
needsExit = false;
}
bufArgIdx = 0;
if (nonPrimitiveArgs.size() > 0) {
for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) {
int idx = nonPrimitiveArgs.get(i).intValue();
@ -1307,7 +1333,7 @@ public class JniCodeEmitter {
} else if (jfunc.getArgType(idx).isBuffer()) {
if (! isPointerFunc) {
String array = numBufferArgs <= 1 ? "_array" :
"_" + bufferArgNames.get(bufArgIdx++) + "Array";
"_" + cfunc.getArgName(cIndex) + "Array";
out.println(indent + "if (" + array + ") {");
out.println(indent + indent +
"releasePointer(_env, " + array + ", " +

View File

@ -62,14 +62,12 @@ nativeClassInit(JNIEnv *_env, jclass glImplClass)
static void *
getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining)
getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining, jint *offset)
{
jint position;
jint limit;
jint elementSizeShift;
jlong pointer;
jint offset;
void *data;
position = _env->GetIntField(buffer, positionID);
limit = _env->GetIntField(buffer, limitID);
@ -84,11 +82,10 @@ getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining)
*array = (jarray) _env->CallStaticObjectMethod(nioAccessClass,
getBaseArrayID, buffer);
offset = _env->CallStaticIntMethod(nioAccessClass,
*offset = _env->CallStaticIntMethod(nioAccessClass,
getBaseArrayOffsetID, buffer);
data = _env->GetPrimitiveArrayCritical(*array, (jboolean *) 0);
return (void *) ((char *) data + offset);
return NULL;
}

View File

@ -74,14 +74,12 @@ nativeClassInit(JNIEnv *_env, jclass glImplClass)
}
static void *
getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining)
getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining, jint *offset)
{
jint position;
jint limit;
jint elementSizeShift;
jlong pointer;
jint offset;
void *data;
position = _env->GetIntField(buffer, positionID);
limit = _env->GetIntField(buffer, limitID);
@ -96,11 +94,10 @@ getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining)
*array = (jarray) _env->CallStaticObjectMethod(nioAccessClass,
getBaseArrayID, buffer);
offset = _env->CallStaticIntMethod(nioAccessClass,
*offset = _env->CallStaticIntMethod(nioAccessClass,
getBaseArrayOffsetID, buffer);
data = _env->GetPrimitiveArrayCritical(*array, (jboolean *) 0);
return (void *) ((char *) data + offset);
return NULL;
}
static void

View File

@ -71,14 +71,12 @@ nativeClassInit(JNIEnv *_env, jclass glImplClass)
static void *
getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining)
getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining, jint *offset)
{
jint position;
jint limit;
jint elementSizeShift;
jlong pointer;
jint offset;
void *data;
position = _env->GetIntField(buffer, positionID);
limit = _env->GetIntField(buffer, limitID);
@ -93,11 +91,9 @@ getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining)
*array = (jarray) _env->CallStaticObjectMethod(nioAccessClass,
getBaseArrayID, buffer);
offset = _env->CallStaticIntMethod(nioAccessClass,
*offset = _env->CallStaticIntMethod(nioAccessClass,
getBaseArrayOffsetID, buffer);
data = _env->GetPrimitiveArrayCritical(*array, (jboolean *) 0);
return (void *) ((char *) data + offset);
return NULL;
}

View File

@ -69,14 +69,12 @@ nativeClassInit(JNIEnv *_env, jclass glImplClass)
static void *
getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining)
getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining, jint *offset)
{
jint position;
jint limit;
jint elementSizeShift;
jlong pointer;
jint offset;
void *data;
position = _env->GetIntField(buffer, positionID);
limit = _env->GetIntField(buffer, limitID);
@ -91,11 +89,10 @@ getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining)
*array = (jarray) _env->CallStaticObjectMethod(nioAccessClass,
getBaseArrayID, buffer);
offset = _env->CallStaticIntMethod(nioAccessClass,
*offset = _env->CallStaticIntMethod(nioAccessClass,
getBaseArrayOffsetID, buffer);
data = _env->GetPrimitiveArrayCritical(*array, (jboolean *) 0);
return (void *) ((char *) data + offset);
return NULL;
}

View File

@ -62,14 +62,12 @@ nativeClassInit(JNIEnv *_env, jclass glImplClass)
static void *
getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining)
getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining, jint *offset)
{
jint position;
jint limit;
jint elementSizeShift;
jlong pointer;
jint offset;
void *data;
position = _env->GetIntField(buffer, positionID);
limit = _env->GetIntField(buffer, limitID);
@ -84,11 +82,10 @@ getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining)
*array = (jarray) _env->CallStaticObjectMethod(nioAccessClass,
getBaseArrayID, buffer);
offset = _env->CallStaticIntMethod(nioAccessClass,
*offset = _env->CallStaticIntMethod(nioAccessClass,
getBaseArrayOffsetID, buffer);
data = _env->GetPrimitiveArrayCritical(*array, (jboolean *) 0);
return (void *) ((char *) data + offset);
return NULL;
}

View File

@ -113,14 +113,12 @@ nativeClassInit(JNIEnv *_env, jclass glImplClass)
}
static void *
getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining)
getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining, jint *offset)
{
jint position;
jint limit;
jint elementSizeShift;
jlong pointer;
jint offset;
void *data;
position = _env->GetIntField(buffer, positionID);
limit = _env->GetIntField(buffer, limitID);
@ -138,11 +136,10 @@ getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining)
if (*array == NULL) {
return (void*) NULL;
}
offset = _env->CallStaticIntMethod(nioAccessClass,
*offset = _env->CallStaticIntMethod(nioAccessClass,
getBaseArrayOffsetID, buffer);
data = _env->GetPrimitiveArrayCritical(*array, (jboolean *) 0);
return (void *) ((char *) data + offset);
return NULL;
}
static void
@ -180,10 +177,12 @@ getDirectBufferPointer(JNIEnv *_env, jobject buffer) {
if (allowIndirectBuffers(_env)) {
jarray array = 0;
jint remaining;
buf = getPointer(_env, buffer, &array, &remaining);
jint offset;
buf = getPointer(_env, buffer, &array, &remaining, &offset);
if (array) {
releasePointer(_env, array, buf, 0);
}
buf = buf + offset;
} else {
jniThrowException(_env, "java/lang/IllegalArgumentException",
"Must use a native order direct Buffer");