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