summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/jni/android_opengl_GLES10.cpp44
-rw-r--r--core/jni/com_google_android_gles_jni_GLImpl.cpp44
-rw-r--r--opengl/java/android/opengl/GLES10.java54
-rw-r--r--opengl/java/com/google/android/gles_jni/GLImpl.java54
-rw-r--r--opengl/tools/glgen/src/JniCodeEmitter.java67
5 files changed, 158 insertions, 105 deletions
diff --git a/core/jni/android_opengl_GLES10.cpp b/core/jni/android_opengl_GLES10.cpp
index 6756580..7e388ef 100644
--- a/core/jni/android_opengl_GLES10.cpp
+++ b/core/jni/android_opengl_GLES10.cpp
@@ -291,7 +291,13 @@ android_glColorPointerBounds__IIILjava_nio_Buffer_2I
jint _remaining;
GLvoid *pointer = (GLvoid *) 0;
- pointer = (GLvoid *)getPointer(_env, pointer_buf, &_array, &_remaining);
+ if (pointer_buf) {
+ pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf);
+ if ( ! pointer ) {
+ _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
+ return;
+ }
+ }
glColorPointerBounds(
(GLint)size,
(GLenum)type,
@@ -299,9 +305,6 @@ android_glColorPointerBounds__IIILjava_nio_Buffer_2I
(GLvoid *)pointer,
(GLsizei)remaining
);
- if (_array) {
- releasePointer(_env, _array, pointer, JNI_FALSE);
- }
}
/* void glCompressedTexImage2D ( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data ) */
@@ -2762,16 +2765,19 @@ android_glNormalPointerBounds__IILjava_nio_Buffer_2I
jint _remaining;
GLvoid *pointer = (GLvoid *) 0;
- pointer = (GLvoid *)getPointer(_env, pointer_buf, &_array, &_remaining);
+ if (pointer_buf) {
+ pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf);
+ if ( ! pointer ) {
+ _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
+ return;
+ }
+ }
glNormalPointerBounds(
(GLenum)type,
(GLsizei)stride,
(GLvoid *)pointer,
(GLsizei)remaining
);
- if (_array) {
- releasePointer(_env, _array, pointer, JNI_FALSE);
- }
}
/* void glOrthof ( GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar ) */
@@ -3014,7 +3020,13 @@ android_glTexCoordPointerBounds__IIILjava_nio_Buffer_2I
jint _remaining;
GLvoid *pointer = (GLvoid *) 0;
- pointer = (GLvoid *)getPointer(_env, pointer_buf, &_array, &_remaining);
+ if (pointer_buf) {
+ pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf);
+ if ( ! pointer ) {
+ _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
+ return;
+ }
+ }
glTexCoordPointerBounds(
(GLint)size,
(GLenum)type,
@@ -3022,9 +3034,6 @@ android_glTexCoordPointerBounds__IIILjava_nio_Buffer_2I
(GLvoid *)pointer,
(GLsizei)remaining
);
- if (_array) {
- releasePointer(_env, _array, pointer, JNI_FALSE);
- }
}
/* void glTexEnvf ( GLenum target, GLenum pname, GLfloat param ) */
@@ -3369,7 +3378,13 @@ android_glVertexPointerBounds__IIILjava_nio_Buffer_2I
jint _remaining;
GLvoid *pointer = (GLvoid *) 0;
- pointer = (GLvoid *)getPointer(_env, pointer_buf, &_array, &_remaining);
+ if (pointer_buf) {
+ pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf);
+ if ( ! pointer ) {
+ _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
+ return;
+ }
+ }
glVertexPointerBounds(
(GLint)size,
(GLenum)type,
@@ -3377,9 +3392,6 @@ android_glVertexPointerBounds__IIILjava_nio_Buffer_2I
(GLvoid *)pointer,
(GLsizei)remaining
);
- if (_array) {
- releasePointer(_env, _array, pointer, JNI_FALSE);
- }
}
/* void glViewport ( GLint x, GLint y, GLsizei width, GLsizei height ) */
diff --git a/core/jni/com_google_android_gles_jni_GLImpl.cpp b/core/jni/com_google_android_gles_jni_GLImpl.cpp
index 7ad0b9e..6f2a438 100644
--- a/core/jni/com_google_android_gles_jni_GLImpl.cpp
+++ b/core/jni/com_google_android_gles_jni_GLImpl.cpp
@@ -291,7 +291,13 @@ android_glColorPointerBounds__IIILjava_nio_Buffer_2I
jint _remaining;
GLvoid *pointer = (GLvoid *) 0;
- pointer = (GLvoid *)getPointer(_env, pointer_buf, &_array, &_remaining);
+ if (pointer_buf) {
+ pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf);
+ if ( ! pointer ) {
+ _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
+ return;
+ }
+ }
glColorPointerBounds(
(GLint)size,
(GLenum)type,
@@ -299,9 +305,6 @@ android_glColorPointerBounds__IIILjava_nio_Buffer_2I
(GLvoid *)pointer,
(GLsizei)remaining
);
- if (_array) {
- releasePointer(_env, _array, pointer, JNI_FALSE);
- }
}
/* void glCompressedTexImage2D ( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data ) */
@@ -2762,16 +2765,19 @@ android_glNormalPointerBounds__IILjava_nio_Buffer_2I
jint _remaining;
GLvoid *pointer = (GLvoid *) 0;
- pointer = (GLvoid *)getPointer(_env, pointer_buf, &_array, &_remaining);
+ if (pointer_buf) {
+ pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf);
+ if ( ! pointer ) {
+ _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
+ return;
+ }
+ }
glNormalPointerBounds(
(GLenum)type,
(GLsizei)stride,
(GLvoid *)pointer,
(GLsizei)remaining
);
- if (_array) {
- releasePointer(_env, _array, pointer, JNI_FALSE);
- }
}
/* void glOrthof ( GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar ) */
@@ -3014,7 +3020,13 @@ android_glTexCoordPointerBounds__IIILjava_nio_Buffer_2I
jint _remaining;
GLvoid *pointer = (GLvoid *) 0;
- pointer = (GLvoid *)getPointer(_env, pointer_buf, &_array, &_remaining);
+ if (pointer_buf) {
+ pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf);
+ if ( ! pointer ) {
+ _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
+ return;
+ }
+ }
glTexCoordPointerBounds(
(GLint)size,
(GLenum)type,
@@ -3022,9 +3034,6 @@ android_glTexCoordPointerBounds__IIILjava_nio_Buffer_2I
(GLvoid *)pointer,
(GLsizei)remaining
);
- if (_array) {
- releasePointer(_env, _array, pointer, JNI_FALSE);
- }
}
/* void glTexEnvf ( GLenum target, GLenum pname, GLfloat param ) */
@@ -3369,7 +3378,13 @@ android_glVertexPointerBounds__IIILjava_nio_Buffer_2I
jint _remaining;
GLvoid *pointer = (GLvoid *) 0;
- pointer = (GLvoid *)getPointer(_env, pointer_buf, &_array, &_remaining);
+ if (pointer_buf) {
+ pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf);
+ if ( ! pointer ) {
+ _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
+ return;
+ }
+ }
glVertexPointerBounds(
(GLint)size,
(GLenum)type,
@@ -3377,9 +3392,6 @@ android_glVertexPointerBounds__IIILjava_nio_Buffer_2I
(GLvoid *)pointer,
(GLsizei)remaining
);
- if (_array) {
- releasePointer(_env, _array, pointer, JNI_FALSE);
- }
}
/* void glViewport ( GLint x, GLint y, GLsizei width, GLsizei height ) */
diff --git a/opengl/java/android/opengl/GLES10.java b/opengl/java/android/opengl/GLES10.java
index 147b60f..db52b82 100644
--- a/opengl/java/android/opengl/GLES10.java
+++ b/opengl/java/android/opengl/GLES10.java
@@ -395,13 +395,6 @@ public class GLES10 {
int stride,
java.nio.Buffer pointer
) {
- if ((size == 4) &&
- ((type == GL_FLOAT) ||
- (type == GL_UNSIGNED_BYTE) ||
- (type == GL_FIXED)) &&
- (stride >= 0)) {
- _colorPointer = pointer;
- }
glColorPointerBounds(
size,
type,
@@ -409,6 +402,13 @@ public class GLES10 {
pointer,
pointer.remaining()
);
+ if ((size == 4) &&
+ ((type == GL_FLOAT) ||
+ (type == GL_UNSIGNED_BYTE) ||
+ (type == GL_FIXED)) &&
+ (stride >= 0)) {
+ _colorPointer = pointer;
+ }
}
// C function void glCompressedTexImage2D ( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data )
@@ -956,6 +956,12 @@ public class GLES10 {
int stride,
java.nio.Buffer pointer
) {
+ glNormalPointerBounds(
+ type,
+ stride,
+ pointer,
+ pointer.remaining()
+ );
if (((type == GL_FLOAT) ||
(type == GL_BYTE) ||
(type == GL_SHORT) ||
@@ -963,12 +969,6 @@ public class GLES10 {
(stride >= 0)) {
_normalPointer = pointer;
}
- glNormalPointerBounds(
- type,
- stride,
- pointer,
- pointer.remaining()
- );
}
// C function void glOrthof ( GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar )
@@ -1149,6 +1149,13 @@ public class GLES10 {
int stride,
java.nio.Buffer pointer
) {
+ glTexCoordPointerBounds(
+ size,
+ type,
+ stride,
+ pointer,
+ pointer.remaining()
+ );
if (((size == 2) ||
(size == 3) ||
(size == 4)) &&
@@ -1159,13 +1166,6 @@ public class GLES10 {
(stride >= 0)) {
_texCoordPointer = pointer;
}
- glTexCoordPointerBounds(
- size,
- type,
- stride,
- pointer,
- pointer.remaining()
- );
}
// C function void glTexEnvf ( GLenum target, GLenum pname, GLfloat param )
@@ -1294,6 +1294,13 @@ public class GLES10 {
int stride,
java.nio.Buffer pointer
) {
+ glVertexPointerBounds(
+ size,
+ type,
+ stride,
+ pointer,
+ pointer.remaining()
+ );
if (((size == 2) ||
(size == 3) ||
(size == 4)) &&
@@ -1304,13 +1311,6 @@ public class GLES10 {
(stride >= 0)) {
_vertexPointer = pointer;
}
- glVertexPointerBounds(
- size,
- type,
- stride,
- pointer,
- pointer.remaining()
- );
}
// C function void glViewport ( GLint x, GLint y, GLsizei width, GLsizei height )
diff --git a/opengl/java/com/google/android/gles_jni/GLImpl.java b/opengl/java/com/google/android/gles_jni/GLImpl.java
index 47f07d0..4e365ef 100644
--- a/opengl/java/com/google/android/gles_jni/GLImpl.java
+++ b/opengl/java/com/google/android/gles_jni/GLImpl.java
@@ -172,13 +172,6 @@ public class GLImpl implements GL10, GL10Ext, GL11, GL11Ext, GL11ExtensionPack {
int stride,
java.nio.Buffer pointer
) {
- if ((size == 4) &&
- ((type == GL_FLOAT) ||
- (type == GL_UNSIGNED_BYTE) ||
- (type == GL_FIXED)) &&
- (stride >= 0)) {
- _colorPointer = pointer;
- }
glColorPointerBounds(
size,
type,
@@ -186,6 +179,13 @@ public class GLImpl implements GL10, GL10Ext, GL11, GL11Ext, GL11ExtensionPack {
pointer,
pointer.remaining()
);
+ if ((size == 4) &&
+ ((type == GL_FLOAT) ||
+ (type == GL_UNSIGNED_BYTE) ||
+ (type == GL_FIXED)) &&
+ (stride >= 0)) {
+ _colorPointer = pointer;
+ }
}
// C function void glCompressedTexImage2D ( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data )
@@ -744,6 +744,12 @@ public class GLImpl implements GL10, GL10Ext, GL11, GL11Ext, GL11ExtensionPack {
int stride,
java.nio.Buffer pointer
) {
+ glNormalPointerBounds(
+ type,
+ stride,
+ pointer,
+ pointer.remaining()
+ );
if (((type == GL_FLOAT) ||
(type == GL_BYTE) ||
(type == GL_SHORT) ||
@@ -751,12 +757,6 @@ public class GLImpl implements GL10, GL10Ext, GL11, GL11Ext, GL11ExtensionPack {
(stride >= 0)) {
_normalPointer = pointer;
}
- glNormalPointerBounds(
- type,
- stride,
- pointer,
- pointer.remaining()
- );
}
// C function void glOrthof ( GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar )
@@ -937,6 +937,13 @@ public class GLImpl implements GL10, GL10Ext, GL11, GL11Ext, GL11ExtensionPack {
int stride,
java.nio.Buffer pointer
) {
+ glTexCoordPointerBounds(
+ size,
+ type,
+ stride,
+ pointer,
+ pointer.remaining()
+ );
if (((size == 2) ||
(size == 3) ||
(size == 4)) &&
@@ -947,13 +954,6 @@ public class GLImpl implements GL10, GL10Ext, GL11, GL11Ext, GL11ExtensionPack {
(stride >= 0)) {
_texCoordPointer = pointer;
}
- glTexCoordPointerBounds(
- size,
- type,
- stride,
- pointer,
- pointer.remaining()
- );
}
// C function void glTexEnvf ( GLenum target, GLenum pname, GLfloat param )
@@ -1082,6 +1082,13 @@ public class GLImpl implements GL10, GL10Ext, GL11, GL11Ext, GL11ExtensionPack {
int stride,
java.nio.Buffer pointer
) {
+ glVertexPointerBounds(
+ size,
+ type,
+ stride,
+ pointer,
+ pointer.remaining()
+ );
if (((size == 2) ||
(size == 3) ||
(size == 4)) &&
@@ -1092,13 +1099,6 @@ public class GLImpl implements GL10, GL10Ext, GL11, GL11Ext, GL11ExtensionPack {
(stride >= 0)) {
_vertexPointer = pointer;
}
- glVertexPointerBounds(
- size,
- type,
- stride,
- pointer,
- pointer.remaining()
- );
}
// C function void glViewport ( GLint x, GLint y, GLsizei width, GLsizei height )
diff --git a/opengl/tools/glgen/src/JniCodeEmitter.java b/opengl/tools/glgen/src/JniCodeEmitter.java
index ef0dbd0..b0997b1 100644
--- a/opengl/tools/glgen/src/JniCodeEmitter.java
+++ b/opengl/tools/glgen/src/JniCodeEmitter.java
@@ -454,6 +454,15 @@ public class JniCodeEmitter {
String iii = indent + indent;
+ // emitBoundsChecks(jfunc, out, iii);
+ emitFunctionCall(jfunc, out, iii, false);
+
+ // Set the pointer after we call the native code, so that if
+ // the native code throws an exception we don't modify the
+ // pointer. We assume that the native code is written so that
+ // if an exception is thrown, then the underlying glXXXPointer
+ // function will not have been called.
+
String fname = jfunc.getName();
if (isPointerFunc) {
// TODO - deal with VBO variants
@@ -498,9 +507,6 @@ public class JniCodeEmitter {
}
}
- // emitBoundsChecks(jfunc, out, iii);
- emitFunctionCall(jfunc, out, iii, false);
-
boolean isVoid = jfunc.getType().isVoid();
if (!isVoid) {
@@ -873,19 +879,39 @@ public class JniCodeEmitter {
String array = numBufferArgs <= 1 ? "_array" :
"_" + bufferArgNames.get(bufArgIdx++) + "Array";
- boolean nullAllowed = isNullAllowed(cfunc);
+ boolean nullAllowed = isNullAllowed(cfunc) || isPointerFunc;
if (nullAllowed) {
out.println(indent + "if (" + cname + "_buf) {");
out.print(indent);
}
- out.println(indent +
+ if (isPointerFunc) {
+ out.println(indent +
cname +
" = (" +
cfunc.getArgType(cIndex).getDeclaration() +
- ")getPointer(_env, " +
- cname +
- "_buf, &" + array + ", &" + remaining + ");");
+ ") _env->GetDirectBufferAddress(" +
+ (mUseCPlusPlus ? "" : "_env, ") +
+ cname + "_buf);");
+ String iii = " ";
+ out.println(iii + indent + "if ( ! " + cname + " ) {");
+ out.println(iii + iii + indent +
+ (mUseCPlusPlus ? "_env" : "(*_env)") +
+ "->ThrowNew(" +
+ (mUseCPlusPlus ? "" : "_env, ") +
+ "IAEClass, \"Must use a native order direct Buffer\");");
+ out.println(iii + iii + indent + "return;");
+ out.println(iii + indent + "}");
+ } else {
+ out.println(indent +
+ cname +
+ " = (" +
+ cfunc.getArgType(cIndex).getDeclaration() +
+ ")getPointer(_env, " +
+ cname +
+ "_buf, &" + array + ", &" + remaining +
+ ");");
+ }
if (nullAllowed) {
out.println(indent + "}");
@@ -987,17 +1013,20 @@ public class JniCodeEmitter {
");");
out.println(indent + "}");
} else if (jfunc.getArgType(idx).isBuffer()) {
- String array = numBufferArgs <= 1 ? "_array" :
- "_" + bufferArgNames.get(bufArgIdx++) + "Array";
- out.println(indent + "if (" + array + ") {");
- out.println(indent + indent +
- "releasePointer(_env, " + array + ", " +
- cfunc.getArgName(cIndex) +
- ", " +
- (cfunc.getArgType(cIndex).isConst() ?
- "JNI_FALSE" : "_exception ? JNI_FALSE : JNI_TRUE") +
- ");");
- out.println(indent + "}");
+ if (! isPointerFunc) {
+ String array = numBufferArgs <= 1 ? "_array" :
+ "_" + bufferArgNames.get(bufArgIdx++) + "Array";
+ out.println(indent + "if (" + array + ") {");
+ out.println(indent + indent +
+ "releasePointer(_env, " + array + ", " +
+ cfunc.getArgName(cIndex) +
+ ", " +
+ (cfunc.getArgType(cIndex).isConst() ?
+ "JNI_FALSE" : "_exception ? JNI_FALSE :" +
+ " JNI_TRUE") +
+ ");");
+ out.println(indent + "}");
+ }
}
}
}