diff options
author | Pablo Ceballos <pceballos@google.com> | 2016-01-29 15:43:00 -0800 |
---|---|---|
committer | Pablo Ceballos <pceballos@google.com> | 2016-02-09 16:09:28 -0800 |
commit | 59fb43e7bdc607f49b301644e4300485f352b103 (patch) | |
tree | 1a6118921069fd30524a2cab0256bb915c5e5b5e | |
parent | 93f04f89202d269fbb38c6f2ffacc3fa01728bbc (diff) |
Fix glGetTransformFeedbackVarying JNI
- Deprecate the broken version that takes a byte argument.
- Implement a new version that takes a byte buffer argument.
Bug 19478262
Change-Id: I5ea4f11940e93b5964b66dbf5700b7ff8b80339e
-rw-r--r-- | api/current.txt | 3 | ||||
-rw-r--r-- | api/system-current.txt | 3 | ||||
-rw-r--r-- | api/test-current.txt | 3 | ||||
-rw-r--r-- | core/jni/android_opengl_GLES30.cpp | 27 | ||||
-rw-r--r-- | opengl/java/android/opengl/GLES30.java | 17 |
5 files changed, 44 insertions, 9 deletions
diff --git a/api/current.txt b/api/current.txt index eb8befa286c5..8884a01e8da6 100644 --- a/api/current.txt +++ b/api/current.txt @@ -26797,7 +26797,8 @@ package android.opengl { method public static void glGetSynciv(long, int, int, int[], int, int[], int); method public static void glGetSynciv(long, int, int, java.nio.IntBuffer, java.nio.IntBuffer); method public static void glGetTransformFeedbackVarying(int, int, int, int[], int, int[], int, int[], int, byte[], int); - method public static void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, byte); + method public static deprecated void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, byte); + method public static void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.ByteBuffer); method public static java.lang.String glGetTransformFeedbackVarying(int, int, int[], int, int[], int); method public static java.lang.String glGetTransformFeedbackVarying(int, int, java.nio.IntBuffer, java.nio.IntBuffer); method public static int glGetUniformBlockIndex(int, java.lang.String); diff --git a/api/system-current.txt b/api/system-current.txt index 287df85c7ca4..cb6bf51ea6e5 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -29082,7 +29082,8 @@ package android.opengl { method public static void glGetSynciv(long, int, int, int[], int, int[], int); method public static void glGetSynciv(long, int, int, java.nio.IntBuffer, java.nio.IntBuffer); method public static void glGetTransformFeedbackVarying(int, int, int, int[], int, int[], int, int[], int, byte[], int); - method public static void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, byte); + method public static deprecated void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, byte); + method public static void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.ByteBuffer); method public static java.lang.String glGetTransformFeedbackVarying(int, int, int[], int, int[], int); method public static java.lang.String glGetTransformFeedbackVarying(int, int, java.nio.IntBuffer, java.nio.IntBuffer); method public static int glGetUniformBlockIndex(int, java.lang.String); diff --git a/api/test-current.txt b/api/test-current.txt index e7f4336c0971..1ba48e44e52d 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -26806,7 +26806,8 @@ package android.opengl { method public static void glGetSynciv(long, int, int, int[], int, int[], int); method public static void glGetSynciv(long, int, int, java.nio.IntBuffer, java.nio.IntBuffer); method public static void glGetTransformFeedbackVarying(int, int, int, int[], int, int[], int, int[], int, byte[], int); - method public static void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, byte); + method public static deprecated void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, byte); + method public static void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.ByteBuffer); method public static java.lang.String glGetTransformFeedbackVarying(int, int, int[], int, int[], int); method public static java.lang.String glGetTransformFeedbackVarying(int, int, java.nio.IntBuffer, java.nio.IntBuffer); method public static int glGetUniformBlockIndex(int, java.lang.String); diff --git a/core/jni/android_opengl_GLES30.cpp b/core/jni/android_opengl_GLES30.cpp index c9b5af74183f..783baef2952a 100644 --- a/core/jni/android_opengl_GLES30.cpp +++ b/core/jni/android_opengl_GLES30.cpp @@ -2012,22 +2012,35 @@ exit: static void android_glGetTransformFeedbackVarying__IIILjava_nio_IntBuffer_2Ljava_nio_IntBuffer_2Ljava_nio_IntBuffer_2B (JNIEnv *_env, jobject _this, jint program, jint index, jint bufsize, jobject length_buf, jobject size_buf, jobject type_buf, jbyte name) { + jniThrowException(_env, "java/lang/UnsupportedOperationException", "deprecated"); +} + +/* void glGetTransformFeedbackVarying ( GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name ) */ +static void +android_glGetTransformFeedbackVarying__IIILjava_nio_IntBuffer_2Ljava_nio_IntBuffer_2Ljava_nio_IntBuffer_2Ljava_nio_ByteBuffer_2 + (JNIEnv *_env, jobject _this, jint program, jint index, jint bufsize, jobject length_buf, jobject size_buf, jobject type_buf, jobject name_buf) { jintArray _lengthArray = (jintArray) 0; jint _lengthBufferOffset = (jint) 0; jintArray _sizeArray = (jintArray) 0; jint _sizeBufferOffset = (jint) 0; jintArray _typeArray = (jintArray) 0; jint _typeBufferOffset = (jint) 0; + jbyteArray _nameArray = (jbyteArray)0; + jint _nameBufferOffset = (jint)0; jint _lengthRemaining; GLsizei *length = (GLsizei *) 0; jint _sizeRemaining; GLint *size = (GLint *) 0; jint _typeRemaining; GLenum *type = (GLenum *) 0; + jint _nameRemaining; + GLchar* name = (GLchar*)0; + length = (GLsizei *)getPointer(_env, length_buf, (jarray*)&_lengthArray, &_lengthRemaining, &_lengthBufferOffset); size = (GLint *)getPointer(_env, size_buf, (jarray*)&_sizeArray, &_sizeRemaining, &_sizeBufferOffset); type = (GLenum *)getPointer(_env, type_buf, (jarray*)&_typeArray, &_typeRemaining, &_typeBufferOffset); + name = (GLchar*)getPointer(_env, name_buf, (jarray*)&_nameArray, &_nameRemaining, &_nameBufferOffset); if (length == NULL) { char * _lengthBase = (char *)_env->GetIntArrayElements(_lengthArray, (jboolean *) 0); length = (GLsizei *) (_lengthBase + _lengthBufferOffset); @@ -2040,6 +2053,10 @@ android_glGetTransformFeedbackVarying__IIILjava_nio_IntBuffer_2Ljava_nio_IntBuff char * _typeBase = (char *)_env->GetIntArrayElements(_typeArray, (jboolean *) 0); type = (GLenum *) (_typeBase + _typeBufferOffset); } + if (name == NULL) { + char* _nameBase = (char *)_env->GetByteArrayElements(_nameArray, (jboolean*)0); + name = (GLchar *) (_nameBase + _nameBufferOffset); + } glGetTransformFeedbackVarying( (GLuint)program, (GLuint)index, @@ -2047,11 +2064,7 @@ android_glGetTransformFeedbackVarying__IIILjava_nio_IntBuffer_2Ljava_nio_IntBuff (GLsizei *)length, (GLint *)size, (GLenum *)type, - // The cast below is incorrect. The driver will end up writing to the - // address specified by name, which will always crash the process since - // it is guaranteed to be in low memory. The additional static_cast - // suppresses the warning for now. http://b/19478262 - (char *)static_cast<uintptr_t>(name) + (GLchar*)name ); if (_typeArray) { releaseArrayPointer<jintArray, jint*, IntArrayReleaser>(_env, _typeArray, (jint*)type, JNI_TRUE); @@ -2062,6 +2075,9 @@ android_glGetTransformFeedbackVarying__IIILjava_nio_IntBuffer_2Ljava_nio_IntBuff if (_lengthArray) { releaseArrayPointer<jintArray, jint*, IntArrayReleaser>(_env, _lengthArray, (jint*)length, JNI_TRUE); } + if (_nameArray) { + releaseArrayPointer<jbyteArray, jbyte*, ByteArrayReleaser>(_env, _nameArray, (jbyte*)name, JNI_TRUE); + } } /* void glGetTransformFeedbackVarying ( GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name ) */ @@ -5218,6 +5234,7 @@ static const JNINativeMethod methods[] = { {"glTransformFeedbackVaryings", "(I[Ljava/lang/String;I)V", (void *) android_glTransformFeedbackVaryings }, {"glGetTransformFeedbackVarying", "(III[II[II[II[BI)V", (void *) android_glGetTransformFeedbackVarying__III_3II_3II_3II_3BI }, {"glGetTransformFeedbackVarying", "(IIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;B)V", (void *) android_glGetTransformFeedbackVarying__IIILjava_nio_IntBuffer_2Ljava_nio_IntBuffer_2Ljava_nio_IntBuffer_2B }, +{"glGetTransformFeedbackVarying", "(IIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/ByteBuffer;)V", (void *) android_glGetTransformFeedbackVarying__IIILjava_nio_IntBuffer_2Ljava_nio_IntBuffer_2Ljava_nio_IntBuffer_2Ljava_nio_ByteBuffer_2 }, {"glGetTransformFeedbackVarying", "(II[II[II)Ljava/lang/String;", (void *) android_glGetTransformFeedbackVarying1 }, {"glGetTransformFeedbackVarying", "(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)Ljava/lang/String;", (void *) android_glGetTransformFeedbackVarying2 }, {"glVertexAttribIPointerBounds", "(IIIILjava/nio/Buffer;I)V", (void *) android_glVertexAttribIPointerBounds__IIIILjava_nio_Buffer_2I }, diff --git a/opengl/java/android/opengl/GLES30.java b/opengl/java/android/opengl/GLES30.java index 342ffa41993e..6cc6bfc5209f 100644 --- a/opengl/java/android/opengl/GLES30.java +++ b/opengl/java/android/opengl/GLES30.java @@ -889,7 +889,10 @@ public class GLES30 extends GLES20 { ); // C function void glGetTransformFeedbackVarying ( GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name ) - + /** + * @deprecated + * Use the version that takes a ByteBuffer as the last argument, or the versions that return a String. + * */ public static native void glGetTransformFeedbackVarying( int program, int index, @@ -902,6 +905,18 @@ public class GLES30 extends GLES20 { // C function void glGetTransformFeedbackVarying ( GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name ) + public static native void glGetTransformFeedbackVarying( + int program, + int index, + int bufsize, + java.nio.IntBuffer length, + java.nio.IntBuffer size, + java.nio.IntBuffer type, + java.nio.ByteBuffer name + ); + + // C function void glGetTransformFeedbackVarying ( GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name ) + public static native String glGetTransformFeedbackVarying( int program, int index, |