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