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