1864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian/*
2864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian * Copyright (C) 2006 The Android Open Source Project
3864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian *
4864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
5864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian * you may not use this file except in compliance with the License.
6864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian * You may obtain a copy of the License at
7864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian *
8864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
9864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian *
10864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian * Unless required by applicable law or agreed to in writing, software
11864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
12864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian * See the License for the specific language governing permissions and
14864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian * limitations under the License.
15864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian */
16864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
17864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian#ifndef ANDROID_OPENGLES_CONTEXT_H
18864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian#define ANDROID_OPENGLES_CONTEXT_H
19864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
20864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian#include <stdint.h>
21864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian#include <stddef.h>
22864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian#include <sys/types.h>
23864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian#include <pthread.h>
246071da7ef84c60645572654504813d492b8b21d5Elliott Hughes#ifdef __ANDROID__
25864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian#include <bionic_tls.h>
26864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian#endif
27864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
28864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian#include <private/pixelflinger/ggl_context.h>
29c044ae5dfc62031924c2f4c0ecc87b0da72a6b3fDan Stoza
30c044ae5dfc62031924c2f4c0ecc87b0da72a6b3fDan Stoza#include <system/window.h>
31864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
32864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian#include <GLES/gl.h>
33864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian#include <GLES/glext.h>
34864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
35864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopiannamespace android {
36864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
37864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
38864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianconst unsigned int OGLES_NUM_COMPRESSED_TEXTURE_FORMATS = 10
39864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian#ifdef GL_OES_compressed_ETC1_RGB8_texture
40864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        + 1
41864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian#endif
42864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        ;
43864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
44864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianclass EGLTextureObject;
45864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianclass EGLSurfaceManager;
46864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianclass EGLBufferObjectManager;
47864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
48864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopiannamespace gl {
49864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
50864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct ogles_context_t;
51864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct matrixx_t;
52864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct transform_t;
53864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct buffer_t;
54864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
55864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianogles_context_t* getGlContext();
56864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
57864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopiantemplate<typename T>
58864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstatic inline void swap(T& a, T& b) {
59864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    T t(a); a = b; b = t;
60864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian}
61864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopiantemplate<typename T>
62864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianinline T max(T a, T b) {
63864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    return a<b ? b : a;
64864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian}
65864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopiantemplate<typename T>
66864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianinline T max(T a, T b, T c) {
67864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    return max(a, max(b, c));
68864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian}
69864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopiantemplate<typename T>
70864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianinline T min(T a, T b) {
71864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    return a<b ? a : b;
72864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian}
73864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopiantemplate<typename T>
74864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianinline T min(T a, T b, T c) {
75864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    return min(a, min(b, c));
76864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian}
77864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopiantemplate<typename T>
78864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianinline T min(T a, T b, T c, T d) {
79864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    return min(min(a,b), min(c,d));
80864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian}
81864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
82864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// ----------------------------------------------------------------------------
83864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// vertices
84864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// ----------------------------------------------------------------------------
85864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
86864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct vec3_t {
87864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    union {
88864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        struct { GLfixed x, y, z; };
89864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        struct { GLfixed r, g, b; };
90864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        struct { GLfixed S, T, R; };
91864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        GLfixed v[3];
92864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    };
93864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
94864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
95864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct vec4_t {
96864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    union {
97864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        struct { GLfixed x, y, z, w; };
98864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        struct { GLfixed r, g, b, a; };
99864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        struct { GLfixed S, T, R, Q; };
100864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        GLfixed v[4];
101864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    };
102864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
103864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
104864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct vertex_t {
105864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    enum {
106864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        // these constant matter for our clipping
107864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        CLIP_L          = 0x0001,   // clipping flags
108864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        CLIP_R          = 0x0002,
109864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        CLIP_B          = 0x0004,
110864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        CLIP_T          = 0x0008,
111864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        CLIP_N          = 0x0010,
112864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        CLIP_F          = 0x0020,
113864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
114864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        EYE             = 0x0040,
115864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        RESERVED        = 0x0080,
116864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
117864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        USER_CLIP_0     = 0x0100,   // user clipping flags
118864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        USER_CLIP_1     = 0x0200,
119864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        USER_CLIP_2     = 0x0400,
120864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        USER_CLIP_3     = 0x0800,
121864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        USER_CLIP_4     = 0x1000,
122864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        USER_CLIP_5     = 0x2000,
123864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
124864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        LIT             = 0x4000,   // lighting has been applied
125864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        TT              = 0x8000,   // texture coords transformed
126864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
127864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        FRUSTUM_CLIP_ALL= 0x003F,
128864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        USER_CLIP_ALL   = 0x3F00,
129864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        CLIP_ALL        = 0x3F3F,
130864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    };
131864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
132864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    // the fields below are arranged to minimize d-cache usage
133864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    // we group together, by cache-line, the fields most likely to be used
134864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
135864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    union {
136864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t          obj;
137864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t          eye;
138864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    };
139864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t          clip;
140864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
141864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint32_t        flags;
142864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    size_t          index;  // cache tag, and vertex index
143864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLfixed         fog;
144864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint8_t         locked;
145864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint8_t         mru;
146864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint8_t         reserved[2];
147864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t          window;
148864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
149864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t          color;
150864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t          texture[GGL_TEXTURE_UNIT_COUNT];
151444839b842798497cfa326204285a4f2ca2362afColin Cross#ifdef __LP64__
152444839b842798497cfa326204285a4f2ca2362afColin Cross    uint32_t        reserved1[2];
153444839b842798497cfa326204285a4f2ca2362afColin Cross#else
154864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint32_t        reserved1[4];
155444839b842798497cfa326204285a4f2ca2362afColin Cross#endif
156864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
157864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    inline void clear() {
158864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        flags = index = locked = mru = 0;
159864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    }
160864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
161864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
162864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct point_size_t {
163864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GGLcoord    size;
164864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLboolean   smooth;
165864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
166864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
167864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct line_width_t {
168864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GGLcoord    width;
169864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLboolean   smooth;
170864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
171864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
172864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct polygon_offset_t {
173864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLfixed     factor;
174864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLfixed     units;
175864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLboolean   enable;
176864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
177864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
178864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// ----------------------------------------------------------------------------
179864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// arrays
180864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// ----------------------------------------------------------------------------
181864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
182864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct array_t {
183864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    typedef void (*fetcher_t)(ogles_context_t*, GLfixed*, const GLvoid*);
184864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    fetcher_t       fetch;
185864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLvoid const*   physical_pointer;
186864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLint           size;
187864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLsizei         stride;
188864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLvoid const*   pointer;
189864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    buffer_t const* bo;
190864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint16_t        type;
191864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLboolean       enable;
192864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLboolean       pad;
193864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLsizei         bounds;
194864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void init(GLint, GLenum, GLsizei, const GLvoid *, const buffer_t*, GLsizei);
195864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    inline void resolve();
196864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    inline const GLubyte* element(GLint i) const {
197864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        return (const GLubyte*)physical_pointer + i * stride;
198864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    }
199864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
200864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
201864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct array_machine_t {
202864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    array_t         vertex;
203864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    array_t         normal;
204864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    array_t         color;
205864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    array_t         texture[GGL_TEXTURE_UNIT_COUNT];
206864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint8_t         activeTexture;
207864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint8_t         tmu;
208864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint16_t        cull;
209864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint32_t        flags;
210864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLenum          indicesType;
211864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    buffer_t const* array_buffer;
212864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    buffer_t const* element_array_buffer;
213864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
214864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void (*compileElements)(ogles_context_t*, vertex_t*, GLint, GLsizei);
215864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void (*compileElement)(ogles_context_t*, vertex_t*, GLint);
216864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
217864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void (*mvp_transform)(transform_t const*, vec4_t*, vec4_t const*);
218864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void (*mv_transform)(transform_t const*, vec4_t*, vec4_t const*);
219864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void (*tex_transform[2])(transform_t const*, vec4_t*, vec4_t const*);
220864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void (*perspective)(ogles_context_t*c, vertex_t* v);
221864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void (*clipVertex)(ogles_context_t* c, vertex_t* nv,
222864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian            GGLfixed t, const vertex_t* s, const vertex_t* p);
223864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void (*clipEye)(ogles_context_t* c, vertex_t* nv,
224864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian            GGLfixed t, const vertex_t* s, const vertex_t* p);
225864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
226864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
227864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct vertex_cache_t {
228864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    enum {
229864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        // must be at least 4
230864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        // 3 vertice for triangles
231864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        // or 2 + 2 for indexed triangles w/ cache contention
232864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        VERTEX_BUFFER_SIZE  = 8,
233864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        // must be a power of two and at least 3
234864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        VERTEX_CACHE_SIZE   = 64,   // 8 KB
235864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
236864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        INDEX_BITS      = 16,
237864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        INDEX_MASK      = ((1LU<<INDEX_BITS)-1),
238864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        INDEX_SEQ       = 1LU<<INDEX_BITS,
239864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    };
240864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vertex_t*       vBuffer;
241864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vertex_t*       vCache;
242864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint32_t        sequence;
243864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void*           base;
244864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint32_t        total;
245864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint32_t        misses;
246864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    int64_t         startTime;
247864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void init();
248864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void uninit();
249864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void clear();
250864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void dump_stats(GLenum mode);
251864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
252864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
253864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// ----------------------------------------------------------------------------
254864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// fog
255864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// ----------------------------------------------------------------------------
256864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
257864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct fog_t {
258864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLfixed     density;
259864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLfixed     start;
260864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLfixed     end;
261864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLfixed     invEndMinusStart;
262864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLenum      mode;
263864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLfixed     (*fog)(ogles_context_t* c, GLfixed z);
264864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
265864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
266864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// ----------------------------------------------------------------------------
267864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// user clip planes
268864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// ----------------------------------------------------------------------------
269864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
270864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianconst unsigned int OGLES_MAX_CLIP_PLANES = 6;
271864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
272864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct clip_plane_t {
273864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t      equation;
274864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
275864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
276864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct user_clip_planes_t {
277864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    clip_plane_t    plane[OGLES_MAX_CLIP_PLANES];
278864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint32_t        enable;
279864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
280864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
281864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// ----------------------------------------------------------------------------
282864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// lighting
283864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// ----------------------------------------------------------------------------
284864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
285864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianconst unsigned int OGLES_MAX_LIGHTS = 8;
286864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
287864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct light_t {
288864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t      ambient;
289864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t      diffuse;
290864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t      specular;
291864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t      implicitAmbient;
292864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t      implicitDiffuse;
293864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t      implicitSpecular;
294864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t      position;       // position in eye space
295864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t      objPosition;
296864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t      normalizedObjPosition;
297864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t      spotDir;
298864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t      normalizedSpotDir;
299864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLfixed     spotExp;
300864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLfixed     spotCutoff;
301864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLfixed     spotCutoffCosine;
302864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLfixed     attenuation[3];
303864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLfixed     rConstAttenuation;
304864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLboolean   enable;
305864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
306864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
307864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct material_t {
308864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t      ambient;
309864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t      diffuse;
310864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t      specular;
311864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t      emission;
312864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLfixed     shininess;
313864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
314864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
315864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct light_model_t {
316864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t      ambient;
317864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLboolean   twoSide;
318864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
319864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
320864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct color_material_t {
321864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLenum      face;
322864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLenum      mode;
323864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLboolean   enable;
324864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
325864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
326864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct lighting_t {
327864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    light_t             lights[OGLES_MAX_LIGHTS];
328864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    material_t          front;
329864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    light_model_t       lightModel;
330864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    color_material_t    colorMaterial;
331864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t              implicitSceneEmissionAndAmbient;
332864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t              objViewer;
333864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint32_t            enabledLights;
334864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLboolean           enable;
335864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLenum              shadeModel;
336864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    typedef void (*light_fct_t)(ogles_context_t*, vertex_t*);
337864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void (*lightVertex)(ogles_context_t* c, vertex_t* v);
338864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void (*lightTriangle)(ogles_context_t* c,
339864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian            vertex_t* v0, vertex_t* v1, vertex_t* v2);
340864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
341864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
342864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct culling_t {
343864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLenum      cullFace;
344864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLenum      frontFace;
345864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLboolean   enable;
346864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
347864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
348864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// ----------------------------------------------------------------------------
349864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// textures
350864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// ----------------------------------------------------------------------------
351864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
352864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct texture_unit_t {
353864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLuint              name;
354864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    EGLTextureObject*   texture;
355864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint8_t             dirty;
356864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
357864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
358864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct texture_state_t
359864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian{
360864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    texture_unit_t      tmu[GGL_TEXTURE_UNIT_COUNT];
361864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    int                 active;     // active tmu
362864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    EGLTextureObject*   defaultTexture;
363864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GGLContext*         ggl;
364864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint8_t             packAlignment;
365864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint8_t             unpackAlignment;
366864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
367864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
368864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// ----------------------------------------------------------------------------
369864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// transformation and matrices
370864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// ----------------------------------------------------------------------------
371864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
372864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct matrixf_t;
373864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
374864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct matrixx_t {
375864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLfixed m[16];
376864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void load(const matrixf_t& rhs);
377864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
378864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
379864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct matrix_stack_t;
380864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
381864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
382864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct matrixf_t {
383864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void loadIdentity();
384864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void load(const matrixf_t& rhs);
385864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
386864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    inline GLfloat* editElements() { return m; }
387864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    inline GLfloat const* elements() const { return m; }
388864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
389864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void set(const GLfixed* rhs);
390864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void set(const GLfloat* rhs);
391864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
392864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    static void multiply(matrixf_t& r,
393864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian            const matrixf_t& lhs, const matrixf_t& rhs);
394864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
395864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void dump(const char* what);
396864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
397864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianprivate:
398864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    friend struct matrix_stack_t;
399864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLfloat     m[16];
400864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void load(const GLfixed* rhs);
401864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void load(const GLfloat* rhs);
402864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void multiply(const matrixf_t& rhs);
403864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void translate(GLfloat x, GLfloat y, GLfloat z);
404864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void scale(GLfloat x, GLfloat y, GLfloat z);
405864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void rotate(GLfloat a, GLfloat x, GLfloat y, GLfloat z);
406864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
407864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
408864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianenum {
409864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    OP_IDENTITY         = 0x00,
410864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    OP_TRANSLATE        = 0x01,
411864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    OP_UNIFORM_SCALE    = 0x02,
412864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    OP_SCALE            = 0x05,
413864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    OP_ROTATE           = 0x08,
414864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    OP_SKEW             = 0x10,
415864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    OP_ALL              = 0x1F
416864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
417864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
418864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct transform_t {
419864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    enum {
420864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        FLAGS_2D_PROJECTION = 0x1
421864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    };
422864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    matrixx_t       matrix;
423864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint32_t        flags;
424864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint32_t        ops;
425864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
426864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    union {
427864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        struct {
428864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian            void (*point2)(transform_t const* t, vec4_t*, vec4_t const*);
429864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian            void (*point3)(transform_t const* t, vec4_t*, vec4_t const*);
430864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian            void (*point4)(transform_t const* t, vec4_t*, vec4_t const*);
431864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        };
432864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        void (*pointv[3])(transform_t const* t, vec4_t*, vec4_t const*);
433864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    };
434864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
435864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void loadIdentity();
436864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void picker();
437864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void dump(const char* what);
438864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
439864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
440864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct mvui_transform_t : public transform_t
441864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian{
442864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void picker();
443864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
444864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
445864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct matrix_stack_t {
446864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    enum {
447864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        DO_PICKER           = 0x1,
448864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        DO_FLOAT_TO_FIXED   = 0x2
449864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    };
450864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    transform_t     transform;
451864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint8_t         maxDepth;
452864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint8_t         depth;
453864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint8_t         dirty;
454864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint8_t         reserved;
455864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    matrixf_t       *stack;
456864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint8_t         *ops;
457864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void init(int depth);
458864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void uninit();
459864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void loadIdentity();
460864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void load(const GLfixed* rhs);
461864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void load(const GLfloat* rhs);
462864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void multiply(const matrixf_t& rhs);
463864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void translate(GLfloat x, GLfloat y, GLfloat z);
464864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void scale(GLfloat x, GLfloat y, GLfloat z);
465864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void rotate(GLfloat a, GLfloat x, GLfloat y, GLfloat z);
466864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLint push();
467864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLint pop();
468864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void validate();
469864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    matrixf_t& top() { return stack[depth]; }
470864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    const matrixf_t& top() const { return stack[depth]; }
471864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint32_t top_ops() const { return ops[depth]; }
472864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    inline bool isRigidBody() const {
473864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        return !(ops[depth] & ~(OP_TRANSLATE|OP_UNIFORM_SCALE|OP_ROTATE));
474864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    }
475864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
476864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
477864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct vp_transform_t {
478864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    transform_t     transform;
479864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    matrixf_t       matrix;
480864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLfloat         zNear;
481864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLfloat         zFar;
482864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void loadIdentity();
483864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
484864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
485864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct transform_state_t {
486864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    enum {
487864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        MODELVIEW           = 0x01,
488864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        PROJECTION          = 0x02,
489864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        VIEWPORT            = 0x04,
490864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        TEXTURE             = 0x08,
491864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        MVUI                = 0x10,
492864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        MVIT                = 0x20,
493864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        MVP                 = 0x40,
494864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    };
495864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    matrix_stack_t      *current;
496864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    matrix_stack_t      modelview;
497864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    matrix_stack_t      projection;
498864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    matrix_stack_t      texture[GGL_TEXTURE_UNIT_COUNT];
499864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
500864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    // modelview * projection
501864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    transform_t         mvp     __attribute__((aligned(32)));
502864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    // viewport transformation
503864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vp_transform_t      vpt     __attribute__((aligned(32)));
504864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    // same for 4-D vertices
505864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    transform_t         mvp4;
506864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    // full modelview inverse transpose
507864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    transform_t         mvit4;
508864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    // upper 3x3 of mv-inverse-transpose (for normals)
509864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    mvui_transform_t    mvui;
510864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
511864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLenum              matrixMode;
512864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLenum              rescaleNormals;
513864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint32_t            dirty;
514864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void invalidate();
515864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void update_mvp();
516864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void update_mvit();
517864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void update_mvui();
518864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
519864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
520864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct viewport_t {
521864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLint       x;
522864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLint       y;
523864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLsizei     w;
524864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLsizei     h;
525864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    struct {
526864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        GLint       x;
527864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        GLint       y;
528864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    } surfaceport;
529864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    struct {
530864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        GLint       x;
531864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        GLint       y;
532864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        GLsizei     w;
533864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        GLsizei     h;
534864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    } scissor;
535864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
536864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
537864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// ----------------------------------------------------------------------------
538864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// Lerping
539864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// ----------------------------------------------------------------------------
540864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
541864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct compute_iterators_t
542864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian{
543864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void initTriangle(
544864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian            vertex_t const* v0,
545864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian            vertex_t const* v1,
546864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian            vertex_t const* v2);
547864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
548864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void initLine(
549864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian            vertex_t const* v0,
550864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian            vertex_t const* v1);
551864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
552864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    inline void initLerp(vertex_t const* v0, uint32_t enables);
553864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
554864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    int iteratorsScale(int32_t it[3],
555864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian            int32_t c0, int32_t c1, int32_t c2) const;
556864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
557864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void iterators1616(GGLfixed it[3],
558864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian            GGLfixed c0, GGLfixed c1, GGLfixed c2) const;
559864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
560864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void iterators0032(int32_t it[3],
561864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian            int32_t c0, int32_t c1, int32_t c2) const;
562864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
563864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void iterators0032(int64_t it[3],
564864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian            int32_t c0, int32_t c1, int32_t c2) const;
565864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
566864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GGLcoord area() const { return m_area; }
567864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
568864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianprivate:
569864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    // don't change order of members here -- used by iterators.S
570864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GGLcoord m_dx01, m_dy10, m_dx20, m_dy02;
571864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GGLcoord m_x0, m_y0;
572864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GGLcoord m_area;
573864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint8_t m_scale;
574864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint8_t m_area_scale;
575864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint8_t m_reserved[2];
576864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
577864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
578864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
579864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// ----------------------------------------------------------------------------
580864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// state
581864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian// ----------------------------------------------------------------------------
582864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
5836071da7ef84c60645572654504813d492b8b21d5Elliott Hughes#ifdef __ANDROID__
584864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    // We have a dedicated TLS slot in bionic
585864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    inline void setGlThreadSpecific(ogles_context_t *value) {
586444839b842798497cfa326204285a4f2ca2362afColin Cross        __get_tls()[TLS_SLOT_OPENGL] = value;
587864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    }
588864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    inline ogles_context_t* getGlThreadSpecific() {
589444839b842798497cfa326204285a4f2ca2362afColin Cross        return static_cast<ogles_context_t*>(__get_tls()[TLS_SLOT_OPENGL]);
590864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    }
591864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian#else
592864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    extern pthread_key_t gGLKey;
593864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    inline void setGlThreadSpecific(ogles_context_t *value) {
594864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        pthread_setspecific(gGLKey, value);
595864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    }
596864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    inline ogles_context_t* getGlThreadSpecific() {
597864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        return static_cast<ogles_context_t*>(pthread_getspecific(gGLKey));
598864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    }
599864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian#endif
600864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
601864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
602864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct prims_t {
603864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    typedef ogles_context_t* GL;
604864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void (*renderPoint)(GL, vertex_t*);
605864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void (*renderLine)(GL, vertex_t*, vertex_t*);
606864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    void (*renderTriangle)(GL, vertex_t*, vertex_t*, vertex_t*);
607864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
608864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
609864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopianstruct ogles_context_t {
610864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    context_t               rasterizer;
611864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    array_machine_t         arrays         __attribute__((aligned(32)));
612864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    texture_state_t         textures;
613864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    transform_state_t       transforms;
614864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vertex_cache_t          vc;
615864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    prims_t                 prims;
616864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    culling_t               cull;
617864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    lighting_t              lighting;
618864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    user_clip_planes_t      clipPlanes;
619c044ae5dfc62031924c2f4c0ecc87b0da72a6b3fDan Stoza    compute_iterators_t     lerp           __attribute__((aligned(32)));
620864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vertex_t                current;
621864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec4_t                  currentColorClamped;
622864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    vec3_t                  currentNormal;
623864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    viewport_t              viewport;
624864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    point_size_t            point;
625864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    line_width_t            line;
626864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    polygon_offset_t        polygonOffset;
627864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    fog_t                   fog;
628864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint32_t                perspective : 1;
629864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    uint32_t                transformTextures : 1;
630864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    EGLSurfaceManager*      surfaceManager;
631864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    EGLBufferObjectManager* bufferObjectManager;
632864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
633864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    GLenum                  error;
634864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
635864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    static inline ogles_context_t* get() {
636864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian        return getGlThreadSpecific();
637864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian    }
638864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
639864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian};
640864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
641864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian}; // namespace gl
642864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian}; // namespace android
643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android::gl;
645864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
646864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian#endif // ANDROID_OPENGLES_CONTEXT_H
647864d2afbb3b8ffa17b408660624b384b518ef752Mathias Agopian
648