150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich** 250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich** Copyright 2009, The Android Open Source Project 350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich** 49875750593aae7c2a62f33c620809d49162393ebElliott Hughes** Licensed under the Apache License, Version 2.0 (the "License"); 59875750593aae7c2a62f33c620809d49162393ebElliott Hughes** you may not use this file except in compliance with the License. 69875750593aae7c2a62f33c620809d49162393ebElliott Hughes** You may obtain a copy of the License at 750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich** 89875750593aae7c2a62f33c620809d49162393ebElliott Hughes** http://www.apache.org/licenses/LICENSE-2.0 950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich** 109875750593aae7c2a62f33c620809d49162393ebElliott Hughes** Unless required by applicable law or agreed to in writing, software 119875750593aae7c2a62f33c620809d49162393ebElliott Hughes** distributed under the License is distributed on an "AS IS" BASIS, 129875750593aae7c2a62f33c620809d49162393ebElliott Hughes** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139875750593aae7c2a62f33c620809d49162393ebElliott Hughes** See the License for the specific language governing permissions and 1450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich** limitations under the License. 1550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich*/ 1650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 1750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich// This source file is automatically generated 1850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 199875750593aae7c2a62f33c620809d49162393ebElliott Hughes#include "jni.h" 209875750593aae7c2a62f33c620809d49162393ebElliott Hughes#include "JNIHelp.h" 2150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich#include <android_runtime/AndroidRuntime.h> 2250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich#include <utils/misc.h> 2350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 2450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich#include <assert.h> 2550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich#include <GLES2/gl2.h> 2650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich#include <GLES2/gl2ext.h> 2750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 2850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevichstatic int initialized = 0; 2950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 3050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevichstatic jclass nioAccessClass; 3150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevichstatic jclass bufferClass; 3250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevichstatic jmethodID getBasePointerID; 3350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevichstatic jmethodID getBaseArrayID; 3450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevichstatic jmethodID getBaseArrayOffsetID; 3550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevichstatic jfieldID positionID; 3650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevichstatic jfieldID limitID; 3750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevichstatic jfieldID elementSizeShiftID; 3850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 3950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich/* Cache method IDs each time the class is loaded. */ 4050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 4150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevichstatic void 429875750593aae7c2a62f33c620809d49162393ebElliott HughesnativeClassInit(JNIEnv *_env, jclass glImplClass) 4350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich{ 4450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich jclass nioAccessClassLocal = _env->FindClass("java/nio/NIOAccess"); 4550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich nioAccessClass = (jclass) _env->NewGlobalRef(nioAccessClassLocal); 4650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 4750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich jclass bufferClassLocal = _env->FindClass("java/nio/Buffer"); 4850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich bufferClass = (jclass) _env->NewGlobalRef(bufferClassLocal); 4950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 5050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich getBasePointerID = _env->GetStaticMethodID(nioAccessClass, 5150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich "getBasePointer", "(Ljava/nio/Buffer;)J"); 5250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich getBaseArrayID = _env->GetStaticMethodID(nioAccessClass, 5350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich "getBaseArray", "(Ljava/nio/Buffer;)Ljava/lang/Object;"); 5450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich getBaseArrayOffsetID = _env->GetStaticMethodID(nioAccessClass, 5550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich "getBaseArrayOffset", "(Ljava/nio/Buffer;)I"); 5650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 5750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich positionID = _env->GetFieldID(bufferClass, "position", "I"); 5850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich limitID = _env->GetFieldID(bufferClass, "limit", "I"); 5950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich elementSizeShiftID = 6050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich _env->GetFieldID(bufferClass, "_elementSizeShift", "I"); 6150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich} 6250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 6350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 6450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevichstatic void * 65e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas TafertshofergetPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining, jint *offset) 6650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich{ 6750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich jint position; 6850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich jint limit; 6950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich jint elementSizeShift; 7050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich jlong pointer; 7150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 7250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich position = _env->GetIntField(buffer, positionID); 7350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich limit = _env->GetIntField(buffer, limitID); 7450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID); 7550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich *remaining = (limit - position) << elementSizeShift; 7650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich pointer = _env->CallStaticLongMethod(nioAccessClass, 7750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich getBasePointerID, buffer); 7850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich if (pointer != 0L) { 7950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich *array = NULL; 8050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich return (void *) (jint) pointer; 8150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 829875750593aae7c2a62f33c620809d49162393ebElliott Hughes 8350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich *array = (jarray) _env->CallStaticObjectMethod(nioAccessClass, 8450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich getBaseArrayID, buffer); 85e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer *offset = _env->CallStaticIntMethod(nioAccessClass, 8650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich getBaseArrayOffsetID, buffer); 879875750593aae7c2a62f33c620809d49162393ebElliott Hughes 88e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer return NULL; 8950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich} 9050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 9150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 9250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevichstatic void 9350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack PalevichreleasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit) 9450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich{ 9550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich _env->ReleasePrimitiveArrayCritical(array, data, 9650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich commit ? 0 : JNI_ABORT); 9750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich} 9850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 9950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevichstatic void * 10050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack PalevichgetDirectBufferPointer(JNIEnv *_env, jobject buffer) { 10150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich char* buf = (char*) _env->GetDirectBufferAddress(buffer); 10250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich if (buf) { 10350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich jint position = _env->GetIntField(buffer, positionID); 10450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich jint elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID); 10550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich buf += position << elementSizeShift; 10650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } else { 1079875750593aae7c2a62f33c620809d49162393ebElliott Hughes jniThrowException(_env, "java/lang/IllegalArgumentException", 1089875750593aae7c2a62f33c620809d49162393ebElliott Hughes "Must use a native order direct Buffer"); 10950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 11050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich return (void*) buf; 11150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich} 11250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 11350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevichstatic int 11450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack PalevichgetNumCompressedTextureFormats() { 11550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich int numCompressedTextureFormats = 0; 11650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numCompressedTextureFormats); 11750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich return numCompressedTextureFormats; 11850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich} 11950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 12050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevichstatic void glVertexAttribPointerBounds(GLuint indx, GLint size, GLenum type, 12150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich GLboolean normalized, GLsizei stride, const GLvoid *pointer, GLsizei count) { 12250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich glVertexAttribPointer(indx, size, type, normalized, stride, pointer); 12350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich} 12450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 12550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich// -------------------------------------------------------------------------- 126