1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* libs/opengles/state.cpp
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2006, The Android Open Source Project
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
5076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Licensed under the Apache License, Version 2.0 (the "License");
6076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** you may not use this file except in compliance with the License.
7076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** You may obtain a copy of the License at
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
9076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian**     http://www.apache.org/licenses/LICENSE-2.0
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
11076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Unless required by applicable law or agreed to in writing, software
12076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** distributed under the License is distributed on an "AS IS" BASIS,
13076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** See the License for the specific language governing permissions and
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License.
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h"
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "fp.h"
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h"
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "array.h"
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h"
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "vertex.h"
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "light.h"
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h"
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "BufferObjectManager.h"
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "TextureObjectManager.h"
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString     = "Android";
36141550bc18f670f7e7ec65fc25363da3dd35d52eMathias Agopianstatic char const * const gRendererString   = "Android PixelFlinger 1.4";
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVersionString    = "OpenGL ES-CM 1.0";
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gExtensionsString =
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    "GL_OES_byte_coordinates "              // OK
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    "GL_OES_fixed_point "                   // OK
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    "GL_OES_single_precision "              // OK
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    "GL_OES_read_format "                   // OK
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    "GL_OES_compressed_paletted_texture "   // OK
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    "GL_OES_draw_texture "                  // OK
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    "GL_OES_matrix_get "                    // OK
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    "GL_OES_query_matrix "                  // OK
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //        "GL_OES_point_size_array "              // TODO
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //        "GL_OES_point_sprite "                  // TODO
49076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    "GL_OES_EGL_image "                     // OK
5083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    "GL_OES_EGL_sync "                      // OK
5118b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian#ifdef GL_OES_compressed_ETC1_RGB8_texture
5218b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian    "GL_OES_compressed_ETC1_RGB8_texture "  // OK
5318b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian#endif
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    "GL_ARB_texture_compression "           // OK
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    "GL_ARB_texture_non_power_of_two "      // OK
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    "GL_ANDROID_user_clip_plane "           // OK
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    "GL_ANDROID_vertex_buffer_object "      // OK
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    "GL_ANDROID_generate_mipmap "           // OK
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ;
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectogles_context_t *ogles_init(size_t extra)
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void* const base = malloc(extra + sizeof(ogles_context_t) + 32);
69076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (!base) return 0;
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t *c =
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (ogles_context_t *)((ptrdiff_t(base) + extra + 31) & ~0x1FL);
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    memset(c, 0, sizeof(ogles_context_t));
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ggl_init_context(&(c->rasterizer));
75076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // XXX: this should be passed as an argument
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    sp<EGLSurfaceManager> smgr(new EGLSurfaceManager());
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->surfaceManager = smgr.get();
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->surfaceManager->incStrong(c);
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    sp<EGLBufferObjectManager> bomgr(new EGLBufferObjectManager());
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->bufferObjectManager = bomgr.get();
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->bufferObjectManager->incStrong(c);
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_init_array(c);
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_init_matrix(c);
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_init_vertex(c);
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_init_light(c);
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_init_texture(c);
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.base = base;
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->point.size = TRI_ONE;
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->line.width = TRI_ONE;
94076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // in OpenGL, writing to the depth buffer is enabled by default.
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.depthMask(c, 1);
97076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // OpenGL enables dithering by default
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.enable(c, GL_DITHER);
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return c;
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_uninit(ogles_context_t* c)
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_uninit_array(c);
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_uninit_matrix(c);
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_uninit_vertex(c);
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_uninit_light(c);
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_uninit_texture(c);
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->surfaceManager->decStrong(c);
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->bufferObjectManager->decStrong(c);
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ggl_uninit_context(&(c->rasterizer));
114076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    free(c->rasterizer.base);
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid _ogles_error(ogles_context_t* c, GLenum error)
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (c->error == GL_NO_ERROR)
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->error = error;
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic bool stencilop_valid(GLenum op) {
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (op) {
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_KEEP:
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_ZERO:
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_REPLACE:
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_INCR:
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_DECR:
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_INVERT:
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return true;
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return false;
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void enable_disable(ogles_context_t* c, GLenum cap, int enabled)
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((cap >= GL_LIGHT0) && (cap<GL_LIGHT0+OGLES_MAX_LIGHTS)) {
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->lighting.lights[cap-GL_LIGHT0].enable = enabled;
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->lighting.enabledLights &= ~(1<<(cap-GL_LIGHT0));
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->lighting.enabledLights |= (enabled<<(cap-GL_LIGHT0));
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (cap) {
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_POINT_SMOOTH:
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->point.smooth = enabled;
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_LINE_SMOOTH:
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->line.smooth = enabled;
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_POLYGON_OFFSET_FILL:
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->polygonOffset.enable = enabled;
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_CULL_FACE:
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->cull.enable = enabled;
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_LIGHTING:
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->lighting.enable = enabled;
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_COLOR_MATERIAL:
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->lighting.colorMaterial.enable = enabled;
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_NORMALIZE:
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_RESCALE_NORMAL:
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->transforms.rescaleNormals = enabled ? cap : 0;
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // XXX: invalidate mvit
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_CLIP_PLANE0:
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_CLIP_PLANE1:
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_CLIP_PLANE2:
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_CLIP_PLANE3:
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_CLIP_PLANE4:
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_CLIP_PLANE5:
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->clipPlanes.enable &= ~(1<<(cap-GL_CLIP_PLANE0));
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->clipPlanes.enable |= (enabled<<(cap-GL_CLIP_PLANE0));
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_invalidate_perspective(c);
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_FOG:
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_DEPTH_TEST:
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_invalidate_perspective(c);
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // fall-through...
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_BLEND:
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_SCISSOR_TEST:
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_ALPHA_TEST:
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_COLOR_LOGIC_OP:
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_DITHER:
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_STENCIL_TEST:
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_TEXTURE_2D:
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // these need to fall through into the rasterizer
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.enableDisable(c, cap, enabled);
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1953a0cae8e5f3881cb1bcb02ab7fa4cbacf5b55525Mathias Agopian    case GL_TEXTURE_EXTERNAL_OES:
1963a0cae8e5f3881cb1bcb02ab7fa4cbacf5b55525Mathias Agopian        c->rasterizer.procs.enableDisable(c, GL_TEXTURE_2D, enabled);
1973a0cae8e5f3881cb1bcb02ab7fa4cbacf5b55525Mathias Agopian        break;
198076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_MULTISAMPLE:
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_SAMPLE_ALPHA_TO_COVERAGE:
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_SAMPLE_ALPHA_TO_ONE:
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_SAMPLE_COVERAGE:
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // not supported in this implementation
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These ones are super-easy, we're not supporting those features!
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glSampleCoverage(GLclampf value, GLboolean invert) {
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glSampleCoveragex(GLclampx value, GLboolean invert) {
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glStencilFunc(GLenum func, GLint ref, GLuint mask) {
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (func < GL_NEVER || func > GL_ALWAYS) {
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // from OpenGL|ES 1.0 sepcification:
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If there is no stencil buffer, no stencil modification can occur
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // and it is as if the stencil test always passes.
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glStencilOp(GLenum fail, GLenum zfail, GLenum zpass) {
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((stencilop_valid(fail) &
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         stencilop_valid(zfail) &
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         stencilop_valid(zpass)) == 0) {
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glAlphaFunc(GLenum func, GLclampf ref)
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glAlphaFuncx(func, gglFloatToFixed(ref));
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glCullFace(GLenum mode)
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (mode) {
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_FRONT:
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_BACK:
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_FRONT_AND_BACK:
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->cull.cullFace = mode;
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glFrontFace(GLenum mode)
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (mode) {
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_CW:
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_CCW:
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->cull.frontFace = mode;
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glHint(GLenum target, GLenum mode)
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (target) {
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_FOG_HINT:
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_GENERATE_MIPMAP_HINT:
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_LINE_SMOOTH_HINT:
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_POINT_SMOOTH_HINT:
291076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        c->rasterizer.procs.enableDisable(c,
292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_POINT_SMOOTH_NICE, mode==GL_NICEST);
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PERSPECTIVE_CORRECTION_HINT:
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->perspective = (mode == GL_NICEST) ? 1 : 0;
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glEnable(GLenum cap) {
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enable_disable(c, cap, 1);
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDisable(GLenum cap) {
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enable_disable(c, cap, 0);
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glFinish()
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ // nothing to do for our software implementation
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glFlush()
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ // nothing to do for our software implementation
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLenum glGetError()
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // From OpenGL|ES 1.0 specification:
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If more than one flag has recorded an error, glGetError returns
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // and clears an arbitrary error flag value. Thus, glGetError should
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always be called in a loop, until it returns GL_NO_ERROR,
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // if all error flags are to be reset.
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (c->error) {
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLenum ret(c->error);
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->error = 0;
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return ret;
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
333076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (c->rasterizer.error) {
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLenum ret(c->rasterizer.error);
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.error = 0;
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return ret;
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return GL_NO_ERROR;
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst GLubyte* glGetString(GLenum string)
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (string) {
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_VENDOR:     return (const GLubyte*)gVendorString;
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_RENDERER:   return (const GLubyte*)gRendererString;
348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_VERSION:    return (const GLubyte*)gVersionString;
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_EXTENSIONS: return (const GLubyte*)gExtensionsString;
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_error(c, GL_INVALID_ENUM);
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glGetIntegerv(GLenum pname, GLint *params)
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
35818b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian    int i;
359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (pname) {
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_ALIASED_POINT_SIZE_RANGE:
362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = 0;
363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[1] = GGL_MAX_ALIASED_POINT_SIZE;
364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_ALIASED_LINE_WIDTH_RANGE:
366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = 0;
367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[1] = GGL_MAX_ALIASED_POINT_SIZE;
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_ALPHA_BITS: {
370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int index = c->rasterizer.state.buffers.color.format;
371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GGLFormat const * formats = gglGetPixelFormatTable();
372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = formats[index].ah - formats[index].al;
373076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        break;
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_RED_BITS: {
376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int index = c->rasterizer.state.buffers.color.format;
377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GGLFormat const * formats = gglGetPixelFormatTable();
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = formats[index].rh - formats[index].rl;
379076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        break;
380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_GREEN_BITS: {
382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int index = c->rasterizer.state.buffers.color.format;
383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GGLFormat const * formats = gglGetPixelFormatTable();
384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = formats[index].gh - formats[index].gl;
385076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        break;
386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_BLUE_BITS: {
388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int index = c->rasterizer.state.buffers.color.format;
389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GGLFormat const * formats = gglGetPixelFormatTable();
390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = formats[index].bh - formats[index].bl;
391076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        break;
392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_COMPRESSED_TEXTURE_FORMATS:
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[ 0] = GL_PALETTE4_RGB8_OES;
395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[ 1] = GL_PALETTE4_RGBA8_OES;
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[ 2] = GL_PALETTE4_R5_G6_B5_OES;
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[ 3] = GL_PALETTE4_RGBA4_OES;
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[ 4] = GL_PALETTE4_RGB5_A1_OES;
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[ 5] = GL_PALETTE8_RGB8_OES;
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[ 6] = GL_PALETTE8_RGBA8_OES;
401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[ 7] = GL_PALETTE8_R5_G6_B5_OES;
402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[ 8] = GL_PALETTE8_RGBA4_OES;
403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[ 9] = GL_PALETTE8_RGB5_A1_OES;
40418b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian        i = 10;
40518b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian#ifdef GL_OES_compressed_ETC1_RGB8_texture
40618b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian        params[i++] = GL_ETC1_RGB8_OES;
40718b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian#endif
408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_DEPTH_BITS:
410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = c->rasterizer.state.buffers.depth.format ? 0 : 16;
411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = GL_RGB;
414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = GL_UNSIGNED_SHORT_5_6_5;
417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_MAX_LIGHTS:
419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = OGLES_MAX_LIGHTS;
420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_MAX_CLIP_PLANES:
422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = OGLES_MAX_CLIP_PLANES;
423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_MAX_MODELVIEW_STACK_DEPTH:
425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = OGLES_MODELVIEW_STACK_DEPTH;
426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_MAX_PROJECTION_STACK_DEPTH:
428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = OGLES_PROJECTION_STACK_DEPTH;
429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_MAX_TEXTURE_STACK_DEPTH:
431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = OGLES_TEXTURE_STACK_DEPTH;
432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_MAX_TEXTURE_SIZE:
434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = GGL_MAX_TEXTURE_SIZE;
435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_MAX_TEXTURE_UNITS:
437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = GGL_TEXTURE_UNIT_COUNT;
438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_MAX_VIEWPORT_DIMS:
440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = GGL_MAX_VIEWPORT_DIMS;
441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[1] = GGL_MAX_VIEWPORT_DIMS;
442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = OGLES_NUM_COMPRESSED_TEXTURE_FORMATS;
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_SMOOTH_LINE_WIDTH_RANGE:
447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = 0;
448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[1] = GGL_MAX_SMOOTH_LINE_WIDTH;
449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_SMOOTH_POINT_SIZE_RANGE:
451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = 0;
452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[1] = GGL_MAX_SMOOTH_POINT_SIZE;
453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_STENCIL_BITS:
455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = 0;
456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_SUBPIXEL_BITS:
458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        params[0] = GGL_SUBPIXEL_BITS;
459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES:
462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        memcpy( params,
463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->transforms.modelview.top().elements(),
464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                16*sizeof(GLint));
465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES:
467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        memcpy( params,
468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->transforms.projection.top().elements(),
469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                16*sizeof(GLint));
470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES:
472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        memcpy( params,
473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->transforms.texture[c->textures.active].top().elements(),
474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                16*sizeof(GLint));
475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glPointSize(GLfloat size)
486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (size <= 0) {
489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->point.size = TRI_FROM_FIXED(gglFloatToFixed(size));
493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glPointSizex(GLfixed size)
496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (size <= 0) {
499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->point.size = TRI_FROM_FIXED(size);
503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glLineWidth(GLfloat width)
508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (width <= 0) {
511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->line.width = TRI_FROM_FIXED(gglFloatToFixed(width));
515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glLineWidthx(GLfixed width)
518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (width <= 0) {
521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->line.width = TRI_FROM_FIXED(width);
525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glColorMask(GLboolean r, GLboolean g, GLboolean b, GLboolean a) {
530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.colorMask(c, r, g, b, a);
532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDepthMask(GLboolean flag) {
535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.depthMask(c, flag);
537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glStencilMask(GLuint mask) {
540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.stencilMask(c, mask);
542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDepthFunc(GLenum func) {
545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.depthFunc(c, func);
547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glLogicOp(GLenum opcode) {
550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.logicOp(c, opcode);
552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glAlphaFuncx(GLenum func, GLclampx ref) {
555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.alphaFuncx(c, func, ref);
557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glBlendFunc(GLenum sfactor, GLenum dfactor) {
560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.blendFunc(c, sfactor, dfactor);
562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glClear(GLbitfield mask) {
565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.clear(c, mask);
567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glClearColorx(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha) {
570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.clearColorx(c, red, green, blue, alpha);
572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glClearColor(GLclampf r, GLclampf g, GLclampf b, GLclampf a)
575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.clearColorx(c,
578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    gglFloatToFixed(r),
579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    gglFloatToFixed(g),
580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    gglFloatToFixed(b),
581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    gglFloatToFixed(a));
582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glClearDepthx(GLclampx depth) {
585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.clearDepthx(c, depth);
587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glClearDepthf(GLclampf depth)
590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.clearDepthx(c, gglFloatToFixed(depth));
593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glClearStencil(GLint s) {
596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.clearStencil(c, s);
598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
599