131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall/* void glGetTransformFeedbackVarying ( GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name ) */ 231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hallstatic void 331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hallandroid_glGetTransformFeedbackVarying__III_3II_3II_3II_3BI 431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (JNIEnv *_env, jobject _this, jint program, jint index, jint bufsize, jintArray length_ref, jint lengthOffset, jintArray size_ref, jint sizeOffset, jintArray type_ref, jint typeOffset, jbyteArray name_ref, jint nameOffset) { 531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _exception = 0; 631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall const char * _exceptionType; 731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall const char * _exceptionMessage; 831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall GLsizei *length_base = (GLsizei *) 0; 931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _lengthRemaining; 1031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall GLsizei *length = (GLsizei *) 0; 1131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall GLint *size_base = (GLint *) 0; 1231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _sizeRemaining; 1331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall GLint *size = (GLint *) 0; 1431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall GLenum *type_base = (GLenum *) 0; 1531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _typeRemaining; 1631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall GLenum *type = (GLenum *) 0; 1731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall char *name_base = (char *) 0; 1831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _nameRemaining; 1931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall char *name = (char *) 0; 2031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 2131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (!length_ref) { 2231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exception = 1; 2331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 2431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionMessage = "length == null"; 2531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall goto exit; 2631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 2731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (lengthOffset < 0) { 2831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exception = 1; 2931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 3031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionMessage = "lengthOffset < 0"; 3131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall goto exit; 3231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 3331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _lengthRemaining = _env->GetArrayLength(length_ref) - lengthOffset; 3431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall length_base = (GLsizei *) 354e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi _env->GetIntArrayElements(length_ref, (jboolean *)0); 3631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall length = length_base + lengthOffset; 3731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 3831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (!size_ref) { 3931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exception = 1; 4031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 4131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionMessage = "size == null"; 4231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall goto exit; 4331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 4431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (sizeOffset < 0) { 4531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exception = 1; 4631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 4731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionMessage = "sizeOffset < 0"; 4831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall goto exit; 4931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 5031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _sizeRemaining = _env->GetArrayLength(size_ref) - sizeOffset; 5131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall size_base = (GLint *) 524e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi _env->GetIntArrayElements(size_ref, (jboolean *)0); 5331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall size = size_base + sizeOffset; 5431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 5531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (!type_ref) { 5631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exception = 1; 5731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 5831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionMessage = "type == null"; 5931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall goto exit; 6031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 6131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (typeOffset < 0) { 6231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exception = 1; 6331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 6431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionMessage = "typeOffset < 0"; 6531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall goto exit; 6631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 6731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _typeRemaining = _env->GetArrayLength(type_ref) - typeOffset; 6831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall type_base = (GLenum *) 694e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi _env->GetIntArrayElements(type_ref, (jboolean *)0); 7031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall type = type_base + typeOffset; 7131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 7231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (!name_ref) { 7331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exception = 1; 7431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 7531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionMessage = "name == null"; 7631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall goto exit; 7731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 7831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (nameOffset < 0) { 7931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exception = 1; 8031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 8131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionMessage = "nameOffset < 0"; 8231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall goto exit; 8331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 8431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _nameRemaining = _env->GetArrayLength(name_ref) - nameOffset; 8531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall name_base = (char *) 864e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi _env->GetByteArrayElements(name_ref, (jboolean *)0); 8731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall name = name_base + nameOffset; 8831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 8931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall glGetTransformFeedbackVarying( 9031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLuint)program, 9131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLuint)index, 9231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLsizei)bufsize, 9331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLsizei *)length, 9431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLint *)size, 9531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLenum *)type, 9631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (char *)name 9731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall ); 9831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 9931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hallexit: 10031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (name_base) { 1014e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi _env->ReleaseByteArrayElements(name_ref, (jbyte*)name_base, 10231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exception ? JNI_ABORT: 0); 10331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 10431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (type_base) { 1054e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi _env->ReleaseIntArrayElements(type_ref, (jint*)type_base, 10631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exception ? JNI_ABORT: 0); 10731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 10831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (size_base) { 1094e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi _env->ReleaseIntArrayElements(size_ref, (jint*)size_base, 11031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exception ? JNI_ABORT: 0); 11131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 11231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (length_base) { 1134e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi _env->ReleaseIntArrayElements(length_ref, (jint*)length_base, 11431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exception ? JNI_ABORT: 0); 11531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 11631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (_exception) { 11731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jniThrowException(_env, _exceptionType, _exceptionMessage); 11831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 11931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall} 12031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 12131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall/* void glGetTransformFeedbackVarying ( GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name ) */ 12231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hallstatic void 12331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hallandroid_glGetTransformFeedbackVarying__IIILjava_nio_IntBuffer_2Ljava_nio_IntBuffer_2Ljava_nio_IntBuffer_2B 12431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (JNIEnv *_env, jobject _this, jint program, jint index, jint bufsize, jobject length_buf, jobject size_buf, jobject type_buf, jbyte name) { 1254e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi jintArray _lengthArray = (jintArray) 0; 12631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _lengthBufferOffset = (jint) 0; 1274e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi jintArray _sizeArray = (jintArray) 0; 12831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _sizeBufferOffset = (jint) 0; 1294e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi jintArray _typeArray = (jintArray) 0; 13031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _typeBufferOffset = (jint) 0; 13131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _lengthRemaining; 13231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall GLsizei *length = (GLsizei *) 0; 13331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _sizeRemaining; 13431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall GLint *size = (GLint *) 0; 13531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _typeRemaining; 13631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall GLenum *type = (GLenum *) 0; 13731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 1384e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi length = (GLsizei *)getPointer(_env, length_buf, (jarray*)&_lengthArray, &_lengthRemaining, &_lengthBufferOffset); 1394e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi size = (GLint *)getPointer(_env, size_buf, (jarray*)&_sizeArray, &_sizeRemaining, &_sizeBufferOffset); 1404e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi type = (GLenum *)getPointer(_env, type_buf, (jarray*)&_typeArray, &_typeRemaining, &_typeBufferOffset); 14131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (length == NULL) { 1424e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi char * _lengthBase = (char *)_env->GetIntArrayElements(_lengthArray, (jboolean *) 0); 14331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall length = (GLsizei *) (_lengthBase + _lengthBufferOffset); 14431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 14531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (size == NULL) { 1464e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi char * _sizeBase = (char *)_env->GetIntArrayElements(_sizeArray, (jboolean *) 0); 14731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall size = (GLint *) (_sizeBase + _sizeBufferOffset); 14831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 14931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (type == NULL) { 1504e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi char * _typeBase = (char *)_env->GetIntArrayElements(_typeArray, (jboolean *) 0); 15131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall type = (GLenum *) (_typeBase + _typeBufferOffset); 15231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 15331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall glGetTransformFeedbackVarying( 15431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLuint)program, 15531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLuint)index, 15631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLsizei)bufsize, 15731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLsizei *)length, 15831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLint *)size, 15931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLenum *)type, 160ad0f52fc2be6161f61fd95e4f12739c65661673aDan Albert // The cast below is incorrect. The driver will end up writing to the 161ad0f52fc2be6161f61fd95e4f12739c65661673aDan Albert // address specified by name, which will always crash the process since 162ad0f52fc2be6161f61fd95e4f12739c65661673aDan Albert // it is guaranteed to be in low memory. The additional static_cast 163ad0f52fc2be6161f61fd95e4f12739c65661673aDan Albert // suppresses the warning for now. http://b/19478262 164ad0f52fc2be6161f61fd95e4f12739c65661673aDan Albert (char *)static_cast<uintptr_t>(name) 16531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall ); 16631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (_typeArray) { 1674e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi releaseArrayPointer<jintArray, jint*, IntArrayReleaser>(_env, _typeArray, (jint*)type, JNI_TRUE); 16831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 16931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (_sizeArray) { 1704e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi releaseArrayPointer<jintArray, jint*, IntArrayReleaser>(_env, _sizeArray, (jint*)size, JNI_TRUE); 17131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 17231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (_lengthArray) { 1734e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi releaseArrayPointer<jintArray, jint*, IntArrayReleaser>(_env, _lengthArray, (jint*)length, JNI_TRUE); 17431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 17531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall} 17631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 17731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall/* void glGetTransformFeedbackVarying ( GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name ) */ 17831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hallstatic jstring 17931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hallandroid_glGetTransformFeedbackVarying1 18031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (JNIEnv *_env, jobject _this, jint program, jint index, jintArray size_ref, jint sizeOffset, jintArray type_ref, jint typeOffset) { 18131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _exception = 0; 18231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall const char * _exceptionType; 18331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall const char * _exceptionMessage; 18431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall GLint *size_base = (GLint *) 0; 18531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _sizeRemaining; 18631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall GLint *size = (GLint *) 0; 18731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall GLenum *type_base = (GLenum *) 0; 18831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _typeRemaining; 18931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall GLenum *type = (GLenum *) 0; 19031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 19131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jstring result = 0; 19231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 19331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall GLint len = 0; 19431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall glGetProgramiv((GLuint)program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &len); 19531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (!len) { 19631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall return _env->NewStringUTF(""); 19731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 19831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall char* buf = (char*) malloc(len); 19931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 20031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (buf == NULL) { 20131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jniThrowException(_env, "java/lang/IllegalArgumentException", "out of memory"); 20231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall return NULL; 20331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 20431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (!size_ref) { 20531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exception = 1; 20631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 20731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionMessage = "size == null"; 20831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall goto exit; 20931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 21031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (sizeOffset < 0) { 21131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exception = 1; 21231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 21331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionMessage = "sizeOffset < 0"; 21431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall goto exit; 21531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 21631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _sizeRemaining = _env->GetArrayLength(size_ref) - sizeOffset; 21731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall size_base = (GLint *) 2184e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi _env->GetIntArrayElements(size_ref, (jboolean *)0); 21931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall size = size_base + sizeOffset; 22031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 22131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (!type_ref) { 22231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exception = 1; 22331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 22431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionMessage = "type == null"; 22531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall goto exit; 22631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 22731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (typeOffset < 0) { 22831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exception = 1; 22931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionType = "java/lang/IllegalArgumentException"; 23031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exceptionMessage = "typeOffset < 0"; 23131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall goto exit; 23231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 23331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _typeRemaining = _env->GetArrayLength(type_ref) - typeOffset; 23431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall type_base = (GLenum *) 2354e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi _env->GetIntArrayElements(type_ref, (jboolean *)0); 23631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall type = type_base + typeOffset; 23731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 23831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall glGetTransformFeedbackVarying( 23931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLuint)program, 24031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLuint)index, 24131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLsizei)len, 24231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall NULL, 24331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLint *)size, 24431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLenum *)type, 24531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (char *)buf 24631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall ); 24731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hallexit: 24831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (type_base) { 2494e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi _env->ReleaseIntArrayElements(type_ref, (jint*)type_base, 25031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exception ? JNI_ABORT: 0); 25131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 25231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (size_base) { 2534e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi _env->ReleaseIntArrayElements(size_ref, (jint*)size_base, 25431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall _exception ? JNI_ABORT: 0); 25531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 25631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (_exception != 1) { 25731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall result = _env->NewStringUTF(buf); 25831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 25931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (buf) { 26031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall free(buf); 26131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 26231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (_exception) { 26331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jniThrowException(_env, _exceptionType, _exceptionMessage); 26431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 26531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (result == 0) { 26631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall result = _env->NewStringUTF(""); 26731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 26831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 26931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall return result; 27031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall} 27131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 27231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall/* void glGetTransformFeedbackVarying ( GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name ) */ 27331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hallstatic jstring 27431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hallandroid_glGetTransformFeedbackVarying2 27531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (JNIEnv *_env, jobject _this, jint program, jint index, jobject size_buf, jobject type_buf) { 2764e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi jintArray _sizeArray = (jintArray) 0; 27731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _sizeBufferOffset = (jint) 0; 2784e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi jintArray _typeArray = (jintArray) 0; 27931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _typeBufferOffset = (jint) 0; 28031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _lengthRemaining; 28131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall GLsizei *length = (GLsizei *) 0; 28231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _sizeRemaining; 28331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall GLint *size = (GLint *) 0; 28431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jint _typeRemaining; 28531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall GLenum *type = (GLenum *) 0; 28631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 28731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jstring result = 0; 28831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 28931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall GLint len = 0; 29031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall glGetProgramiv((GLuint)program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &len); 29131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (!len) { 29231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall return _env->NewStringUTF(""); 29331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 29431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall char* buf = (char*) malloc(len); 29531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 29631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (buf == NULL) { 29731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall jniThrowException(_env, "java/lang/IllegalArgumentException", "out of memory"); 29831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall return NULL; 29931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 30031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 3014e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi size = (GLint *)getPointer(_env, size_buf, (jarray*)&_sizeArray, &_sizeRemaining, &_sizeBufferOffset); 3024e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi type = (GLenum *)getPointer(_env, type_buf, (jarray*)&_typeArray, &_typeRemaining, &_typeBufferOffset); 30331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (size == NULL) { 3044e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi char * _sizeBase = (char *)_env->GetIntArrayElements(_sizeArray, (jboolean *) 0); 30531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall size = (GLint *) (_sizeBase + _sizeBufferOffset); 30631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 30731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (type == NULL) { 3084e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi char * _typeBase = (char *)_env->GetIntArrayElements(_typeArray, (jboolean *) 0); 30931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall type = (GLenum *) (_typeBase + _typeBufferOffset); 31031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 31131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall glGetTransformFeedbackVarying( 31231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLuint)program, 31331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLuint)index, 31431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLsizei)len, 31531f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall NULL, 31631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLint *)size, 31731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (GLenum *)type, 31831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall (char *)buf 31931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall ); 32031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall 32131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (_typeArray) { 3224e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi releaseArrayPointer<jintArray, jint*, IntArrayReleaser>(_env, _typeArray, (jint*)type, JNI_TRUE); 32331f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 32431f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (_sizeArray) { 3254e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi releaseArrayPointer<jintArray, jint*, IntArrayReleaser>(_env, _sizeArray, (jint*)size, JNI_TRUE); 32631f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 32731f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall result = _env->NewStringUTF(buf); 32831f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall if (buf) { 32931f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall free(buf); 33031f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall } 33131f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall return result; 33231f6edc21bbc2802f4c755b4982945d5237e92ceJesse Hall} 333