1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 2427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich** Copyright 2009, The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 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 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 89875750593aae7c2a62f33c620809d49162393ebElliott Hughes** http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 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 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// This source file is automatically generated 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 199875750593aae7c2a62f33c620809d49162393ebElliott Hughes#include "jni.h" 209875750593aae7c2a62f33c620809d49162393ebElliott Hughes#include "JNIHelp.h" 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/misc.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <assert.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 26593f203ba3df251b238409bb3fcc66b0a90b856dJack Palevich#include <GLES/glext.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 28d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias Agopian/* special calls implemented in Android's GLES wrapper used to more 29d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias Agopian * efficiently bound-check passed arrays */ 30d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias Agopianextern "C" { 31d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias AgopianGL_API void GL_APIENTRY glColorPointerBounds(GLint size, GLenum type, GLsizei stride, 32d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias Agopian const GLvoid *ptr, GLsizei count); 33d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias AgopianGL_API void GL_APIENTRY glNormalPointerBounds(GLenum type, GLsizei stride, 34d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias Agopian const GLvoid *pointer, GLsizei count); 35d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias AgopianGL_API void GL_APIENTRY glTexCoordPointerBounds(GLint size, GLenum type, 36d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias Agopian GLsizei stride, const GLvoid *pointer, GLsizei count); 37d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias AgopianGL_API void GL_APIENTRY glVertexPointerBounds(GLint size, GLenum type, 38d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias Agopian GLsizei stride, const GLvoid *pointer, GLsizei count); 39d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias Agopian} 40d373c6348a91595dd4c0b83ad256dbf30870fa5dMathias Agopian 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int initialized = 0; 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jclass nioAccessClass; 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jclass bufferClass; 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jmethodID getBasePointerID; 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jmethodID getBaseArrayID; 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jmethodID getBaseArrayOffsetID; 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jfieldID positionID; 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jfieldID limitID; 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jfieldID elementSizeShiftID; 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* Cache method IDs each time the class is loaded. */ 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 54427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevichstatic void 559875750593aae7c2a62f33c620809d49162393ebElliott HughesnativeClassInit(JNIEnv *_env, jclass glImplClass) 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jclass nioAccessClassLocal = _env->FindClass("java/nio/NIOAccess"); 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nioAccessClass = (jclass) _env->NewGlobalRef(nioAccessClassLocal); 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jclass bufferClassLocal = _env->FindClass("java/nio/Buffer"); 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bufferClass = (jclass) _env->NewGlobalRef(bufferClassLocal); 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getBasePointerID = _env->GetStaticMethodID(nioAccessClass, 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "getBasePointer", "(Ljava/nio/Buffer;)J"); 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getBaseArrayID = _env->GetStaticMethodID(nioAccessClass, 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "getBaseArray", "(Ljava/nio/Buffer;)Ljava/lang/Object;"); 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getBaseArrayOffsetID = _env->GetStaticMethodID(nioAccessClass, 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "getBaseArrayOffset", "(Ljava/nio/Buffer;)I"); 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project positionID = _env->GetFieldID(bufferClass, "position", "I"); 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project limitID = _env->GetFieldID(bufferClass, "limit", "I"); 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project elementSizeShiftID = 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project _env->GetFieldID(bufferClass, "_elementSizeShift", "I"); 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void * 77e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas TafertshofergetPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining, jint *offset) 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jint position; 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jint limit; 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jint elementSizeShift; 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jlong pointer; 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project position = _env->GetIntField(buffer, positionID); 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project limit = _env->GetIntField(buffer, limitID); 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID); 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *remaining = (limit - position) << elementSizeShift; 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pointer = _env->CallStaticLongMethod(nioAccessClass, 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getBasePointerID, buffer); 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pointer != 0L) { 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *array = NULL; 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (void *) (jint) pointer; 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 949875750593aae7c2a62f33c620809d49162393ebElliott Hughes 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *array = (jarray) _env->CallStaticObjectMethod(nioAccessClass, 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getBaseArrayID, buffer); 97e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer *offset = _env->CallStaticIntMethod(nioAccessClass, 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getBaseArrayOffsetID, buffer); 999875750593aae7c2a62f33c620809d49162393ebElliott Hughes 100e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer return NULL; 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectreleasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit) 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project _env->ReleasePrimitiveArrayCritical(array, data, 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project commit ? 0 : JNI_ABORT); 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1106eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevichstatic void * 1116eedc8d3b598163f797a2f75d05fdc20809a4364Jack PalevichgetDirectBufferPointer(JNIEnv *_env, jobject buffer) { 1126eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich char* buf = (char*) _env->GetDirectBufferAddress(buffer); 1136eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich if (buf) { 1146eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich jint position = _env->GetIntField(buffer, positionID); 1156eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich jint elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID); 1166eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich buf += position << elementSizeShift; 1176eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich } else { 1189875750593aae7c2a62f33c620809d49162393ebElliott Hughes jniThrowException(_env, "java/lang/IllegalArgumentException", 1199875750593aae7c2a62f33c620809d49162393ebElliott Hughes "Must use a native order direct Buffer"); 1206eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich } 1216eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich return (void*) buf; 1226eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich} 1236eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich 124593f203ba3df251b238409bb3fcc66b0a90b856dJack Palevichstatic int 125593f203ba3df251b238409bb3fcc66b0a90b856dJack PalevichgetNumCompressedTextureFormats() { 126593f203ba3df251b238409bb3fcc66b0a90b856dJack Palevich int numCompressedTextureFormats = 0; 127593f203ba3df251b238409bb3fcc66b0a90b856dJack Palevich glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numCompressedTextureFormats); 128593f203ba3df251b238409bb3fcc66b0a90b856dJack Palevich return numCompressedTextureFormats; 129593f203ba3df251b238409bb3fcc66b0a90b856dJack Palevich} 130593f203ba3df251b238409bb3fcc66b0a90b856dJack Palevich 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// -------------------------------------------------------------------------- 132