19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_OPENGLES_CONTEXT_H
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_OPENGLES_CONTEXT_H
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stddef.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <pthread.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_ANDROID_OS
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <bionic_tls.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <private/pixelflinger/ggl_context.h>
291473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#include <hardware/copybit.h>
30350d651706d8f484d9aeb539d491526f822fa84aMathias Agopian#include <hardware/gralloc.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <GLES/gl.h>
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <GLES/glext.h>
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3536d0184e089831b74de6005f01da9e7b26679bb9Mathias Agopianstruct android_native_buffer_t;
3636d0184e089831b74de6005f01da9e7b26679bb9Mathias Agopian
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst unsigned int OGLES_NUM_COMPRESSED_TEXTURE_FORMATS = 10;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass EGLTextureObject;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass EGLSurfaceManager;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass EGLBufferObjectManager;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace gl {
461473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct ogles_context_t;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct matrixx_t;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct transform_t;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct buffer_t;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectogles_context_t* getGlContext();
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename T>
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline void swap(T& a, T& b) {
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    T t(a); a = b; b = t;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename T>
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline T max(T a, T b) {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return a<b ? b : a;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename T>
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline T max(T a, T b, T c) {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return max(a, max(b, c));
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename T>
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline T min(T a, T b) {
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return a<b ? a : b;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename T>
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline T min(T a, T b, T c) {
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return min(a, min(b, c));
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename T>
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline T min(T a, T b, T c, T d) {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return min(min(a,b), min(c,d));
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// vertices
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct vec3_t {
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    union {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        struct { GLfixed x, y, z; };
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        struct { GLfixed r, g, b; };
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        struct { GLfixed S, T, R; };
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLfixed v[3];
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct vec4_t {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    union {
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        struct { GLfixed x, y, z, w; };
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        struct { GLfixed r, g, b, a; };
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        struct { GLfixed S, T, R, Q; };
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLfixed v[4];
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct vertex_t {
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
1031473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        // these constant matter for our clipping
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CLIP_L          = 0x0001,   // clipping flags
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CLIP_R          = 0x0002,
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CLIP_B          = 0x0004,
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CLIP_T          = 0x0008,
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CLIP_N          = 0x0010,
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CLIP_F          = 0x0020,
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EYE             = 0x0040,
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        RESERVED        = 0x0080,
1131473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        USER_CLIP_0     = 0x0100,   // user clipping flags
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        USER_CLIP_1     = 0x0200,
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        USER_CLIP_2     = 0x0400,
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        USER_CLIP_3     = 0x0800,
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        USER_CLIP_4     = 0x1000,
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        USER_CLIP_5     = 0x2000,
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LIT             = 0x4000,   // lighting has been applied
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TT              = 0x8000,   // texture coords transformed
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FRUSTUM_CLIP_ALL= 0x003F,
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        USER_CLIP_ALL   = 0x3F00,
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CLIP_ALL        = 0x3F3F,
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // the fields below are arranged to minimize d-cache usage
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // we group together, by cache-line, the fields most likely to be used
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    union {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t          obj;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t          eye;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t          clip;
1371473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t        flags;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t          index;  // cache tag, and vertex index
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed         fog;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t         locked;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t         mru;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t         reserved[2];
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t          window;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t          color;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t          texture[GGL_TEXTURE_UNIT_COUNT];
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t        reserved1[4];
1491473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    inline void clear() {
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        flags = index = locked = mru = 0;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct point_size_t {
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLcoord    size;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLboolean   smooth;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct line_width_t {
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLcoord    width;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLboolean   smooth;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct polygon_offset_t {
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed     factor;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed     units;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLboolean   enable;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// arrays
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct array_t {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    typedef void (*fetcher_t)(ogles_context_t*, GLfixed*, const GLvoid*);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fetcher_t       fetch;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLvoid const*   physical_pointer;
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint           size;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLsizei         stride;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLvoid const*   pointer;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_t const* bo;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint16_t        type;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLboolean       enable;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLboolean       pad;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLsizei         bounds;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void init(GLint, GLenum, GLsizei, const GLvoid *, const buffer_t*, GLsizei);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    inline void resolve();
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    inline const GLubyte* element(GLint i) const {
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (const GLubyte*)physical_pointer + i * stride;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct array_machine_t {
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    array_t         vertex;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    array_t         normal;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    array_t         color;
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    array_t         texture[GGL_TEXTURE_UNIT_COUNT];
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t         activeTexture;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t         tmu;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint16_t        cull;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t        flags;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLenum          indicesType;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_t const* array_buffer;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_t const* element_array_buffer;
2061473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void (*compileElements)(ogles_context_t*, vertex_t*, GLint, GLsizei);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void (*compileElement)(ogles_context_t*, vertex_t*, GLint);
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void (*mvp_transform)(transform_t const*, vec4_t*, vec4_t const*);
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void (*mv_transform)(transform_t const*, vec4_t*, vec4_t const*);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void (*tex_transform[2])(transform_t const*, vec4_t*, vec4_t const*);
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void (*perspective)(ogles_context_t*c, vertex_t* v);
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void (*clipVertex)(ogles_context_t* c, vertex_t* nv,
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            GGLfixed t, const vertex_t* s, const vertex_t* p);
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void (*clipEye)(ogles_context_t* c, vertex_t* nv,
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            GGLfixed t, const vertex_t* s, const vertex_t* p);
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct vertex_cache_t {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // must be at least 4
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // 3 vertice for triangles
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // or 2 + 2 for indexed triangles w/ cache contention
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        VERTEX_BUFFER_SIZE  = 8,
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // must be a power of two and at least 3
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        VERTEX_CACHE_SIZE   = 64,   // 8 KB
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        INDEX_BITS      = 16,
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        INDEX_MASK      = ((1LU<<INDEX_BITS)-1),
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        INDEX_SEQ       = 1LU<<INDEX_BITS,
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vertex_t*       vBuffer;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vertex_t*       vCache;
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t        sequence;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void*           base;
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t        total;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t        misses;
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int64_t         startTime;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void init();
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void uninit();
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void clear();
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dump_stats(GLenum mode);
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// fog
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct fog_t {
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed     density;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed     start;
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed     end;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed     invEndMinusStart;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLenum      mode;
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed     (*fog)(ogles_context_t* c, GLfixed z);
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// user clip planes
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst unsigned int OGLES_MAX_CLIP_PLANES = 6;
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct clip_plane_t {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t      equation;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct user_clip_planes_t {
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    clip_plane_t    plane[OGLES_MAX_CLIP_PLANES];
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t        enable;
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// lighting
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst unsigned int OGLES_MAX_LIGHTS = 8;
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct light_t {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t      ambient;
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t      diffuse;
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t      specular;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t      implicitAmbient;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t      implicitDiffuse;
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t      implicitSpecular;
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t      position;       // position in eye space
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t      objPosition;
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t      normalizedObjPosition;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t      spotDir;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t      normalizedSpotDir;
292c0dea964913268bd64009e657635e617f3e0c21cMartin Storsjo    vec4_t      objViewer;
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed     spotExp;
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed     spotCutoff;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed     spotCutoffCosine;
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed     attenuation[3];
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed     rConstAttenuation;
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLboolean   enable;
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct material_t {
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t      ambient;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t      diffuse;
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t      specular;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t      emission;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed     shininess;
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct light_model_t {
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t      ambient;
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLboolean   twoSide;
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct color_material_t {
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLenum      face;
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLenum      mode;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLboolean   enable;
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct lighting_t {
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    light_t             lights[OGLES_MAX_LIGHTS];
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    material_t          front;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    light_model_t       lightModel;
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    color_material_t    colorMaterial;
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t            enabledLights;
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLboolean           enable;
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t              implicitSceneEmissionAndAmbient;
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLenum              shadeModel;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    typedef void (*light_fct_t)(ogles_context_t*, vertex_t*);
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void (*lightVertex)(ogles_context_t* c, vertex_t* v);
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void (*lightTriangle)(ogles_context_t* c,
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            vertex_t* v0, vertex_t* v1, vertex_t* v2);
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct culling_t {
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLenum      cullFace;
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLenum      frontFace;
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLboolean   enable;
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// textures
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct texture_unit_t {
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLuint              name;
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLTextureObject*   texture;
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t             dirty;
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct texture_state_t
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    texture_unit_t      tmu[GGL_TEXTURE_UNIT_COUNT];
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int                 active;     // active tmu
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLTextureObject*   defaultTexture;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLContext*         ggl;
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t             packAlignment;
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t             unpackAlignment;
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// transformation and matrices
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct matrixf_t;
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct matrixx_t {
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed m[16];
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void load(const matrixf_t& rhs);
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct matrix_stack_t;
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct matrixf_t {
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void loadIdentity();
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void load(const matrixf_t& rhs);
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    inline GLfloat* editElements() { return m; }
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    inline GLfloat const* elements() const { return m; }
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void set(const GLfixed* rhs);
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void set(const GLfloat* rhs);
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void multiply(matrixf_t& r,
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const matrixf_t& lhs, const matrixf_t& rhs);
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dump(const char* what);
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    friend struct matrix_stack_t;
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfloat     m[16];
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void load(const GLfixed* rhs);
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void load(const GLfloat* rhs);
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void multiply(const matrixf_t& rhs);
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void translate(GLfloat x, GLfloat y, GLfloat z);
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void scale(GLfloat x, GLfloat y, GLfloat z);
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void rotate(GLfloat a, GLfloat x, GLfloat y, GLfloat z);
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum {
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    OP_IDENTITY         = 0x00,
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    OP_TRANSLATE        = 0x01,
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    OP_UNIFORM_SCALE    = 0x02,
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    OP_SCALE            = 0x05,
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    OP_ROTATE           = 0x08,
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    OP_SKEW             = 0x10,
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    OP_ALL              = 0x1F
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct transform_t {
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FLAGS_2D_PROJECTION = 0x1
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    matrixx_t       matrix;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t        flags;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t        ops;
4181473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    union {
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        struct {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void (*point2)(transform_t const* t, vec4_t*, vec4_t const*);
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void (*point3)(transform_t const* t, vec4_t*, vec4_t const*);
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void (*point4)(transform_t const* t, vec4_t*, vec4_t const*);
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void (*pointv[3])(transform_t const* t, vec4_t*, vec4_t const*);
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void loadIdentity();
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void picker();
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dump(const char* what);
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct mvui_transform_t : public transform_t
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void picker();
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct matrix_stack_t {
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DO_PICKER           = 0x1,
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DO_FLOAT_TO_FIXED   = 0x2
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    transform_t     transform;
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t         maxDepth;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t         depth;
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t         dirty;
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t         reserved;
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    matrixf_t       *stack;
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t         *ops;
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void init(int depth);
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void uninit();
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void loadIdentity();
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void load(const GLfixed* rhs);
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void load(const GLfloat* rhs);
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void multiply(const matrixf_t& rhs);
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void translate(GLfloat x, GLfloat y, GLfloat z);
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void scale(GLfloat x, GLfloat y, GLfloat z);
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void rotate(GLfloat a, GLfloat x, GLfloat y, GLfloat z);
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint push();
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint pop();
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void validate();
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    matrixf_t& top() { return stack[depth]; }
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const matrixf_t& top() const { return stack[depth]; }
464aaf4b6b3315fc546396a4b82c8c5cab0c2d2cb85Mathias Agopian    uint32_t top_ops() const { return ops[depth]; }
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    inline bool isRigidBody() const {
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return !(ops[depth] & ~(OP_TRANSLATE|OP_UNIFORM_SCALE|OP_ROTATE));
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct vp_transform_t {
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    transform_t     transform;
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    matrixf_t       matrix;
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfloat         zNear;
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfloat         zFar;
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void loadIdentity();
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct transform_state_t {
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MODELVIEW           = 0x01,
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROJECTION          = 0x02,
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        VIEWPORT            = 0x04,
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TEXTURE             = 0x08,
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MVUI                = 0x10,
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MVIT                = 0x20,
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MVP                 = 0x40,
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    matrix_stack_t      *current;
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    matrix_stack_t      modelview;
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    matrix_stack_t      projection;
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    matrix_stack_t      texture[GGL_TEXTURE_UNIT_COUNT];
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // modelview * projection
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    transform_t         mvp     __attribute__((aligned(32)));
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // viewport transformation
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vp_transform_t      vpt     __attribute__((aligned(32)));
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // same for 4-D vertices
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    transform_t         mvp4;
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // full modelview inverse transpose
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    transform_t         mvit4;
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // upper 3x3 of mv-inverse-transpose (for normals)
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mvui_transform_t    mvui;
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLenum              matrixMode;
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLenum              rescaleNormals;
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t            dirty;
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void invalidate();
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void update_mvp();
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void update_mvit();
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void update_mvui();
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct viewport_t {
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint       x;
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint       y;
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLsizei     w;
5171473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    GLsizei     h;
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct {
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLint       x;
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLint       y;
5211473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    } surfaceport;
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct {
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLint       x;
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLint       y;
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLsizei     w;
5261473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        GLsizei     h;
5271473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    } scissor;
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Lerping
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct compute_iterators_t
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void initTriangle(
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            vertex_t const* v0,
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            vertex_t const* v1,
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            vertex_t const* v2);
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void initLine(
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            vertex_t const* v0,
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            vertex_t const* v1);
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    inline void initLerp(vertex_t const* v0, uint32_t enables);
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int iteratorsScale(int32_t it[3],
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int32_t c0, int32_t c1, int32_t c2) const;
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void iterators1616(GGLfixed it[3],
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            GGLfixed c0, GGLfixed c1, GGLfixed c2) const;
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void iterators0032(int32_t it[3],
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int32_t c0, int32_t c1, int32_t c2) const;
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void iterators0032(int64_t it[3],
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int32_t c0, int32_t c1, int32_t c2) const;
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLcoord area() const { return m_area; }
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // don't change order of members here -- used by iterators.S
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLcoord m_dx01, m_dy10, m_dx20, m_dy02;
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLcoord m_x0, m_y0;
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLcoord m_area;
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t m_scale;
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t m_area_scale;
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t m_reserved[2];
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// state
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_ANDROID_OS
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // We have a dedicated TLS slot in bionic
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    inline void setGlThreadSpecific(ogles_context_t *value) {
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ((uint32_t *)__get_tls())[TLS_SLOT_OPENGL] = (uint32_t)value;
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    inline ogles_context_t* getGlThreadSpecific() {
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (ogles_context_t *)(((unsigned *)__get_tls())[TLS_SLOT_OPENGL]);
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    extern pthread_key_t gGLKey;
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    inline void setGlThreadSpecific(ogles_context_t *value) {
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pthread_setspecific(gGLKey, value);
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    inline ogles_context_t* getGlThreadSpecific() {
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return static_cast<ogles_context_t*>(pthread_getspecific(gGLKey));
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct prims_t {
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    typedef ogles_context_t* GL;
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void (*renderPoint)(GL, vertex_t*);
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void (*renderLine)(GL, vertex_t*, vertex_t*);
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void (*renderTriangle)(GL, vertex_t*, vertex_t*, vertex_t*);
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6021473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianstruct copybits_context_t {
6031473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    // A handle to the blit engine, if it exists, else NULL.
6041473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    copybit_device_t*       blitEngine;
6051473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    int32_t                 minScale;
6061473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    int32_t                 maxScale;
60736d0184e089831b74de6005f01da9e7b26679bb9Mathias Agopian    android_native_buffer_t* drawSurfaceBuffer;
6081473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian};
6091473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct ogles_context_t {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    context_t               rasterizer;
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    array_machine_t         arrays         __attribute__((aligned(32)));
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    texture_state_t         textures;
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    transform_state_t       transforms;
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vertex_cache_t          vc;
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    prims_t                 prims;
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    culling_t               cull;
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    lighting_t              lighting;
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    user_clip_planes_t      clipPlanes;
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    compute_iterators_t     lerp;           __attribute__((aligned(32)));
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vertex_t                current;
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t                  currentColorClamped;
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec3_t                  currentNormal;
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    viewport_t              viewport;
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    point_size_t            point;
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    line_width_t            line;
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    polygon_offset_t        polygonOffset;
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fog_t                   fog;
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t                perspective : 1;
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t                transformTextures : 1;
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLSurfaceManager*      surfaceManager;
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLBufferObjectManager* bufferObjectManager;
6331473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
6341473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    // copybits is only used if LIBAGL_USE_GRALLOC_COPYBITS is
6351473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    // defined, but it is always present because ogles_context_t is a public
6361473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    // struct that is used by clients of libagl. We want the size and offsets
6371473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    // to stay the same, whether or not LIBAGL_USE_GRALLOC_COPYBITS is defined.
6381473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
6391473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    copybits_context_t      copybits;
6401473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLenum                  error;
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static inline ogles_context_t* get() {
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getGlThreadSpecific();
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace gl
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_OPENGLES_CONTEXT_H
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
654