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