155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer/* void glGetShaderSource ( GLuint shader, GLsizei bufsize, GLsizei *length, char *source ) */ 255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshoferstatic void 355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshoferandroid_glGetShaderSource__II_3II_3BI 455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer (JNIEnv *_env, jobject _this, jint shader, jint bufsize, jintArray length_ref, jint lengthOffset, jbyteArray source_ref, jint sourceOffset) { 555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer jint _exception = 0; 655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer const char * _exceptionType; 755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer const char * _exceptionMessage; 855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer GLsizei *length_base = (GLsizei *) 0; 955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer jint _lengthRemaining; 1055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer GLsizei *length = (GLsizei *) 0; 1155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer char *source_base = (char *) 0; 1255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer jint _sourceRemaining; 1355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer char *source = (char *) 0; 1455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer 1555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer if (!length_ref) { 1655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _exception = 1; 1755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _exceptionType = "java/lang/IllegalArgumentException"; 1855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _exceptionMessage = "length == null"; 1955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer goto exit; 2055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer } 2155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer if (lengthOffset < 0) { 2255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _exception = 1; 2355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _exceptionType = "java/lang/IllegalArgumentException"; 2455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _exceptionMessage = "lengthOffset < 0"; 2555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer goto exit; 2655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer } 2755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _lengthRemaining = _env->GetArrayLength(length_ref) - lengthOffset; 2855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer length_base = (GLsizei *) 2955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _env->GetPrimitiveArrayCritical(length_ref, (jboolean *)0); 3055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer length = length_base + lengthOffset; 3155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer 3255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer if (!source_ref) { 3355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _exception = 1; 3455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _exceptionType = "java/lang/IllegalArgumentException"; 3555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _exceptionMessage = "source == null"; 3655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer goto exit; 3755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer } 3855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer if (sourceOffset < 0) { 3955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _exception = 1; 4055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _exceptionType = "java/lang/IllegalArgumentException"; 4155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _exceptionMessage = "sourceOffset < 0"; 4255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer goto exit; 4355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer } 4455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _sourceRemaining = _env->GetArrayLength(source_ref) - sourceOffset; 4555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer source_base = (char *) 4655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _env->GetPrimitiveArrayCritical(source_ref, (jboolean *)0); 4755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer source = source_base + sourceOffset; 4855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer 4955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer glGetShaderSource( 5055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer (GLuint)shader, 5155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer (GLsizei)bufsize, 5255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer (GLsizei *)length, 5355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer (char *)source 5455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer ); 5555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer 5655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshoferexit: 5755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer if (source_base) { 5855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _env->ReleasePrimitiveArrayCritical(source_ref, source_base, 5955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _exception ? JNI_ABORT: 0); 6055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer } 6155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer if (length_base) { 6255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _env->ReleasePrimitiveArrayCritical(length_ref, length_base, 6355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer _exception ? JNI_ABORT: 0); 6455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer } 6555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer if (_exception) { 6655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer jniThrowException(_env, _exceptionType, _exceptionMessage); 6755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer } 6855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer} 6955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer 7055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer/* void glGetShaderSource ( GLuint shader, GLsizei bufsize, GLsizei *length, char *source ) */ 7155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshoferstatic void 7255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshoferandroid_glGetShaderSource__IILjava_nio_IntBuffer_2B 7355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer (JNIEnv *_env, jobject _this, jint shader, jint bufsize, jobject length_buf, jbyte source) { 7455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer jarray _array = (jarray) 0; 7555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer jint _bufferOffset = (jint) 0; 7655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer jint _remaining; 7755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer GLsizei *length = (GLsizei *) 0; 7855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer 7955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer length = (GLsizei *)getPointer(_env, length_buf, &_array, &_remaining, &_bufferOffset); 8055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer if (length == NULL) { 8155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer char * _lengthBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0); 8255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer length = (GLsizei *) (_lengthBase + _bufferOffset); 8355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer } 8455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer glGetShaderSource( 8555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer (GLuint)shader, 8655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer (GLsizei)bufsize, 8755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer (GLsizei *)length, 88d8f096114da14f9793d4cca6022ca41b70ab9daaAshok Bhat reinterpret_cast<char *>(source) 8955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer ); 9055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer if (_array) { 9155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer releasePointer(_env, _array, length, JNI_TRUE); 9255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer } 9355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer} 9455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer 9555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer/* void glGetShaderSource ( GLuint shader, GLsizei bufsize, GLsizei *length, char *source ) */ 9655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshoferstatic jstring android_glGetShaderSource(JNIEnv *_env, jobject, jint shader) { 9755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer GLint shaderLen = 0; 9855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer glGetShaderiv((GLuint)shader, GL_SHADER_SOURCE_LENGTH, &shaderLen); 9955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer if (!shaderLen) { 10055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer return _env->NewStringUTF(""); 10155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer } 10255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer char* buf = (char*) malloc(shaderLen); 10355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer if (buf == NULL) { 10455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer jniThrowException(_env, "java/lang/IllegalArgumentException", "out of memory"); 10555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer return NULL; 10655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer } 10755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer glGetShaderSource(shader, shaderLen, NULL, buf); 10855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer jstring result = _env->NewStringUTF(buf); 10955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer free(buf); 11055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer return result; 11155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer} 112