1560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich**
2560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich** Copyright 2009, The Android Open Source Project
3560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich**
424ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** Licensed under the Apache License, Version 2.0 (the "License");
524ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** you may not use this file except in compliance with the License.
624ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** You may obtain a copy of the License at
7560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich**
824ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes**     http://www.apache.org/licenses/LICENSE-2.0
9560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich**
1024ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** Unless required by applicable law or agreed to in writing, software
1124ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** distributed under the License is distributed on an "AS IS" BASIS,
1224ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1324ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** See the License for the specific language governing permissions and
14560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich** limitations under the License.
15560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich*/
16560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
17560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich// This source file is automatically generated
18560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
1924ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes#include "jni.h"
2024ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes#include "JNIHelp.h"
21560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich#include <android_runtime/AndroidRuntime.h>
22560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich#include <utils/misc.h>
23560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
24560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich#include <assert.h>
25560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich#include <GLES2/gl2.h>
26560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich#include <GLES2/gl2ext.h>
27560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
28560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevichstatic int initialized = 0;
29560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
30560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevichstatic jclass nioAccessClass;
31560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevichstatic jclass bufferClass;
32560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevichstatic jmethodID getBasePointerID;
33560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevichstatic jmethodID getBaseArrayID;
34560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevichstatic jmethodID getBaseArrayOffsetID;
35560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevichstatic jfieldID positionID;
36560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevichstatic jfieldID limitID;
37560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevichstatic jfieldID elementSizeShiftID;
38560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
39560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich/* Cache method IDs each time the class is loaded. */
40560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
41560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevichstatic void
4224ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott HughesnativeClassInit(JNIEnv *_env, jclass glImplClass)
43560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich{
44560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    jclass nioAccessClassLocal = _env->FindClass("java/nio/NIOAccess");
45560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    nioAccessClass = (jclass) _env->NewGlobalRef(nioAccessClassLocal);
46560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
47560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    jclass bufferClassLocal = _env->FindClass("java/nio/Buffer");
48560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    bufferClass = (jclass) _env->NewGlobalRef(bufferClassLocal);
49560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
50560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    getBasePointerID = _env->GetStaticMethodID(nioAccessClass,
51560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich            "getBasePointer", "(Ljava/nio/Buffer;)J");
52560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    getBaseArrayID = _env->GetStaticMethodID(nioAccessClass,
53560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich            "getBaseArray", "(Ljava/nio/Buffer;)Ljava/lang/Object;");
54560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    getBaseArrayOffsetID = _env->GetStaticMethodID(nioAccessClass,
55560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich            "getBaseArrayOffset", "(Ljava/nio/Buffer;)I");
56560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
57560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    positionID = _env->GetFieldID(bufferClass, "position", "I");
58560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    limitID = _env->GetFieldID(bufferClass, "limit", "I");
59560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    elementSizeShiftID =
60560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich        _env->GetFieldID(bufferClass, "_elementSizeShift", "I");
61560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich}
62560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
63560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
64560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevichstatic void *
65560814f6b11abe83ff0c4ed18cac015c276b3181Jack PalevichgetPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining)
66560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich{
67560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    jint position;
68560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    jint limit;
69560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    jint elementSizeShift;
70560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    jlong pointer;
71560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    jint offset;
72560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    void *data;
73560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
74560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    position = _env->GetIntField(buffer, positionID);
75560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    limit = _env->GetIntField(buffer, limitID);
76560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID);
77560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    *remaining = (limit - position) << elementSizeShift;
78560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    pointer = _env->CallStaticLongMethod(nioAccessClass,
79560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich            getBasePointerID, buffer);
80560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    if (pointer != 0L) {
81560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich        *array = NULL;
82560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich        return (void *) (jint) pointer;
83560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    }
8424ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes
85560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    *array = (jarray) _env->CallStaticObjectMethod(nioAccessClass,
86560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich            getBaseArrayID, buffer);
87560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    offset = _env->CallStaticIntMethod(nioAccessClass,
88560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich            getBaseArrayOffsetID, buffer);
89560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    data = _env->GetPrimitiveArrayCritical(*array, (jboolean *) 0);
9024ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes
91560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    return (void *) ((char *) data + offset);
92560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich}
93560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
94560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
95560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevichstatic void
96560814f6b11abe83ff0c4ed18cac015c276b3181Jack PalevichreleasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit)
97560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich{
98560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    _env->ReleasePrimitiveArrayCritical(array, data,
99560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich					   commit ? 0 : JNI_ABORT);
100560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich}
101560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
102560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevichstatic void *
103560814f6b11abe83ff0c4ed18cac015c276b3181Jack PalevichgetDirectBufferPointer(JNIEnv *_env, jobject buffer) {
104560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    char* buf = (char*) _env->GetDirectBufferAddress(buffer);
105560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    if (buf) {
106560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich        jint position = _env->GetIntField(buffer, positionID);
107560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich        jint elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID);
108560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich        buf += position << elementSizeShift;
109560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    } else {
11024ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes        jniThrowException(_env, "java/lang/IllegalArgumentException",
11124ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes                          "Must use a native order direct Buffer");
112560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    }
113560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    return (void*) buf;
114560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich}
115560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
116560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevichstatic int
117560814f6b11abe83ff0c4ed18cac015c276b3181Jack PalevichgetNumCompressedTextureFormats() {
118560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    int numCompressedTextureFormats = 0;
119560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numCompressedTextureFormats);
120560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    return numCompressedTextureFormats;
121560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich}
122560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
123560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevichstatic void glVertexAttribPointerBounds(GLuint indx, GLint size, GLenum type,
124560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich        GLboolean normalized, GLsizei stride, const GLvoid *pointer, GLsizei count) {
125560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    glVertexAttribPointer(indx, size, type, normalized, stride, pointer);
126560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich}
127560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
128560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich// --------------------------------------------------------------------------
129