texture.cpp revision 076b1cc3a9b90aa5b381a1ed268ca0b548444c9b
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* libs/opengles/texture.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 <stdio.h>
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
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 "texture.h"
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "TextureObjectManager.h"
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
26076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/android_natives.h>
27076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
29076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include "copybit.h"
30076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include "gralloc_priv.h"
31076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS
32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void bindTextureTmu(
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c, int tmu, GLuint texture, const sp<EGLTextureObject>& tex);
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid generateMipmap(ogles_context_t* c, GLint level);
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark Init
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_init_texture(ogles_context_t* c)
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->textures.packAlignment   = 4;
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->textures.unpackAlignment = 4;
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // each context has a default named (0) texture (not shared)
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->textures.defaultTexture = new EGLTextureObject();
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->textures.defaultTexture->incStrong(c);
58076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // bind the default texture to each texture unit
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (int i=0; i<GGL_TEXTURE_UNIT_COUNT ; i++) {
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        bindTextureTmu(c, i, 0, c->textures.defaultTexture);
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        memset(c->current.texture[i].v, 0, sizeof(vec4_t));
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->current.texture[i].Q = 0x10000;
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_uninit_texture(ogles_context_t* c)
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (c->textures.ggl)
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gglUninit(c->textures.ggl);
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->textures.defaultTexture->decStrong(c);
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (int i=0; i<GGL_TEXTURE_UNIT_COUNT ; i++) {
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->textures.tmu[i].texture)
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->textures.tmu[i].texture->decStrong(c);
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid validate_tmu(ogles_context_t* c, int i)
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    texture_unit_t& u(c->textures.tmu[i]);
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (u.dirty) {
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        u.dirty = 0;
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.activeTexture(c, i);
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.bindTexture(c, &(u.texture->surface));
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.texGeni(c, GGL_S,
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_TEXTURE_GEN_MODE, GGL_AUTOMATIC);
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.texGeni(c, GGL_T,
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_TEXTURE_GEN_MODE, GGL_AUTOMATIC);
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.texParameteri(c, GGL_TEXTURE_2D,
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_TEXTURE_WRAP_S, u.texture->wraps);
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.texParameteri(c, GGL_TEXTURE_2D,
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_TEXTURE_WRAP_T, u.texture->wrapt);
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.texParameteri(c, GGL_TEXTURE_2D,
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_TEXTURE_MIN_FILTER, u.texture->min_filter);
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.texParameteri(c, GGL_TEXTURE_2D,
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_TEXTURE_MAG_FILTER, u.texture->mag_filter);
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // disable this texture unit if it's not complete
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!u.texture->isComplete()) {
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.disable(c, GGL_TEXTURE_2D);
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_validate_texture_impl(ogles_context_t* c)
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; i++) {
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->rasterizer.state.texture[i].enable)
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            validate_tmu(c, i);
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.activeTexture(c, c->textures.active);
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid invalidate_texture(ogles_context_t* c, int tmu, uint8_t flags = 0xFF) {
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->textures.tmu[tmu].dirty = flags;
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark Format conversion
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic uint32_t gl2format_table[6][4] = {
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // BYTE, 565, 4444, 5551
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { GGL_PIXEL_FORMAT_A_8,
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      0, 0, 0 },                        // GL_ALPHA
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { GGL_PIXEL_FORMAT_RGB_888,
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      GGL_PIXEL_FORMAT_RGB_565,
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      0, 0 },                           // GL_RGB
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { GGL_PIXEL_FORMAT_RGBA_8888,
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      0,
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      GGL_PIXEL_FORMAT_RGBA_4444,
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      GGL_PIXEL_FORMAT_RGBA_5551 },     // GL_RGBA
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { GGL_PIXEL_FORMAT_L_8,
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      0, 0, 0 },                        // GL_LUMINANCE
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { GGL_PIXEL_FORMAT_LA_88,
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      0, 0, 0 },                        // GL_LUMINANCE_ALPHA
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int32_t convertGLPixelFormat(GLint format, GLenum type)
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t fi = -1;
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t ti = -1;
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (format) {
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_ALPHA:              fi = 0;     break;
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_RGB:                fi = 1;     break;
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_RGBA:               fi = 2;     break;
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_LUMINANCE:          fi = 3;     break;
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_LUMINANCE_ALPHA:    fi = 4;     break;
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (type) {
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_UNSIGNED_BYTE:          ti = 0; break;
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_UNSIGNED_SHORT_5_6_5:   ti = 1; break;
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_UNSIGNED_SHORT_4_4_4_4: ti = 2; break;
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_UNSIGNED_SHORT_5_5_5_1: ti = 3; break;
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (fi==-1 || ti==-1)
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return 0;
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return gl2format_table[fi][ti];
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLenum validFormatType(ogles_context_t* c, GLenum format, GLenum type)
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLenum error = 0;
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (format<GL_ALPHA || format>GL_LUMINANCE_ALPHA) {
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        error = GL_INVALID_ENUM;
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (type != GL_UNSIGNED_BYTE && type != GL_UNSIGNED_SHORT_4_4_4_4 &&
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type != GL_UNSIGNED_SHORT_5_5_5_1 && type != GL_UNSIGNED_SHORT_5_6_5) {
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        error = GL_INVALID_ENUM;
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (type == GL_UNSIGNED_SHORT_5_6_5 && format != GL_RGB) {
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        error = GL_INVALID_OPERATION;
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((type == GL_UNSIGNED_SHORT_4_4_4_4 ||
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         type == GL_UNSIGNED_SHORT_5_5_5_1)  && format != GL_RGBA) {
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        error = GL_INVALID_OPERATION;
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (error) {
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, error);
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return error;
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGGLContext* getRasterizer(ogles_context_t* c)
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLContext* ggl = c->textures.ggl;
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(!ggl)) {
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // this is quite heavy the first time...
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gglInit(&ggl);
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!ggl) {
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return 0;
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GGLfixed colors[4] = { 0, 0, 0, 0x10000 };
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->textures.ggl = ggl;
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ggl->activeTexture(ggl, 0);
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ggl->enable(ggl, GGL_TEXTURE_2D);
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ggl->texEnvi(ggl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE);
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ggl->disable(ggl, GGL_DITHER);
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ggl->shadeModel(ggl, GGL_FLAT);
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ggl->color4xv(ggl, colors);
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ggl;
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint copyPixels(
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_context_t* c,
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GGLSurface& dst,
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLint xoffset, GLint yoffset,
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GGLSurface& src,
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLint x, GLint y, GLsizei w, GLsizei h)
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((dst.format == src.format) &&
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        (dst.stride == src.stride) &&
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        (dst.width == src.width) &&
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        (dst.height == src.height) &&
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        (dst.stride > 0) &&
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ((x|y) == 0) &&
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ((xoffset|yoffset) == 0))
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // this is a common case...
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GGLFormat& pixelFormat(c->rasterizer.formats[src.format]);
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const size_t size = src.height * src.stride * pixelFormat.size;
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        memcpy(dst.data, src.data, size);
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return 0;
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // use pixel-flinger to handle all the conversions
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLContext* ggl = getRasterizer(c);
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!ggl) {
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // the only reason this would fail is because we ran out of memory
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return GL_OUT_OF_MEMORY;
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ggl->colorBuffer(ggl, &dst);
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ggl->bindTexture(ggl, &src);
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ggl->texCoord2i(ggl, x-xoffset, y-yoffset);
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ggl->recti(ggl, xoffset, yoffset, xoffset+w, yoffset+h);
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectsp<EGLTextureObject> getAndBindActiveTextureObject(ogles_context_t* c)
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    sp<EGLTextureObject> tex;
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int active = c->textures.active;
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GLuint name = c->textures.tmu[active].name;
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // free the reference to the previously bound object
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    texture_unit_t& u(c->textures.tmu[active]);
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (u.texture)
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        u.texture->decStrong(c);
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (name == 0) {
265076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        // 0 is our local texture object, not shared with anyone.
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // But it affects all bound TMUs immediately.
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // (we need to invalidate all units bound to this texture object)
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        tex = c->textures.defaultTexture;
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; i++) {
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (c->textures.tmu[i].texture == tex.get())
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                invalidate_texture(c, i);
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // get a new texture object for that name
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        tex = c->surfaceManager->replaceTexture(name);
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // bind this texture to the current active texture unit
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // and add a reference to this texture object
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    u.texture = tex.get();
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    u.texture->incStrong(c);
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    u.name = name;
283076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    invalidate_texture(c, active);
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return tex;
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid bindTextureTmu(
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c, int tmu, GLuint texture, const sp<EGLTextureObject>& tex)
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (tex.get() == c->textures.tmu[tmu].texture)
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
292076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // free the reference to the previously bound object
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    texture_unit_t& u(c->textures.tmu[tmu]);
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (u.texture)
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        u.texture->decStrong(c);
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // bind this texture to the current active texture unit
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // and add a reference to this texture object
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    u.texture = tex.get();
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    u.texture->incStrong(c);
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    u.name = texture;
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    invalidate_texture(c, tmu);
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint createTextureSurface(ogles_context_t* c,
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GGLSurface** outSurface, int32_t* outSize, GLint level,
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum format, GLenum type, GLsizei width, GLsizei height,
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum compressedFormat = 0)
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // find out which texture is bound to the current unit
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int active = c->textures.active;
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GLuint name = c->textures.tmu[active].name;
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // convert the pixelformat to one we can handle
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t formatIdx = convertGLPixelFormat(format, type);
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (formatIdx == 0) { // we don't know what to do with this
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return GL_INVALID_OPERATION;
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
320076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // figure out the size we need as well as the stride
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GGLFormat& pixelFormat(c->rasterizer.formats[formatIdx]);
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t align = c->textures.unpackAlignment-1;
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t bpr = ((width * pixelFormat.size) + align) & ~align;
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const size_t size = bpr * height;
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t stride = bpr / pixelFormat.size;
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (level > 0) {
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int active = c->textures.active;
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLTextureObject* tex = c->textures.tmu[active].texture;
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        status_t err = tex->reallocate(level,
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                width, height, stride, formatIdx, compressedFormat, bpr);
333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (err != NO_ERROR)
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return GL_OUT_OF_MEMORY;
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GGLSurface& surface = tex->editMip(level);
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *outSurface = &surface;
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *outSize = size;
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return 0;
339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    sp<EGLTextureObject> tex = getAndBindActiveTextureObject(c);
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t err = tex->reallocate(level,
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            width, height, stride, formatIdx, compressedFormat, bpr);
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (err != NO_ERROR)
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return GL_OUT_OF_MEMORY;
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tex->internalformat = format;
348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *outSurface = &tex->surface;
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *outSize = size;
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void decodePalette4(const GLvoid *data, int level, int width, int height,
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                           void *surface, int stride, int format)
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int indexBits = 8;
358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int entrySize = 0;
359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (format) {
360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_RGB8_OES:
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        indexBits = 4;
362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        /* FALLTHROUGH */
363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_RGB8_OES:
364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        entrySize = 3;
365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_RGBA8_OES:
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        indexBits = 4;
369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        /* FALLTHROUGH */
370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_RGBA8_OES:
371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        entrySize = 4;
372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_R5_G6_B5_OES:
375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_RGBA4_OES:
376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_RGB5_A1_OES:
377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        indexBits = 4;
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        /* FALLTHROUGH */
379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_R5_G6_B5_OES:
380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_RGBA4_OES:
381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_RGB5_A1_OES:
382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        entrySize = 2;
383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int paletteSize = (1 << indexBits) * entrySize;
387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint8_t const* pixels = (uint8_t *)data + paletteSize;
388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (int i=0 ; i<level ; i++) {
389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int w = (width  >> i) ? : 1;
390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int h = (height >> i) ? : 1;
391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixels += h * ((w * indexBits) / 8);
392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    width  = (width  >> level) ? : 1;
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    height = (height >> level) ? : 1;
395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (entrySize == 2) {
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint8_t const* const palette = (uint8_t*)data;
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int y=0 ; y<height ; y++) {
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            uint8_t* p = (uint8_t*)surface + y*stride*2;
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (indexBits == 8) {
401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                for (int x=0 ; x<width ; x++) {
402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int index = 2 * (*pixels++);
403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 0];
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 1];
405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                for (int x=0 ; x<width ; x+=2) {
408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int v = *pixels++;
409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int index = 2 * (v >> 4);
410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 0];
411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 1];
412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (x+1 < width) {
413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        index = 2 * (v & 0xF);
414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *p++ = palette[index + 0];
415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *p++ = palette[index + 1];
416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else if (entrySize == 3) {
421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint8_t const* const palette = (uint8_t*)data;
422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int y=0 ; y<height ; y++) {
423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            uint8_t* p = (uint8_t*)surface + y*stride*3;
424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (indexBits == 8) {
425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                for (int x=0 ; x<width ; x++) {
426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int index = 3 * (*pixels++);
427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 0];
428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 1];
429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 2];
430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                for (int x=0 ; x<width ; x+=2) {
433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int v = *pixels++;
434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int index = 3 * (v >> 4);
435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 0];
436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 1];
437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 2];
438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (x+1 < width) {
439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        index = 3 * (v & 0xF);
440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *p++ = palette[index + 0];
441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *p++ = palette[index + 1];
442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *p++ = palette[index + 2];
443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else if (entrySize == 4) {
448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint8_t const* const palette = (uint8_t*)data;
449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int y=0 ; y<height ; y++) {
450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            uint8_t* p = (uint8_t*)surface + y*stride*4;
451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (indexBits == 8) {
452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                for (int x=0 ; x<width ; x++) {
453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int index = 4 * (*pixels++);
454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 0];
455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 1];
456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 2];
457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 3];
458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                for (int x=0 ; x<width ; x+=2) {
461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int v = *pixels++;
462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int index = 4 * (v >> 4);
463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 0];
464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 1];
465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 2];
466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 3];
467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (x+1 < width) {
468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        index = 4 * (v & 0xF);
469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *p++ = palette[index + 0];
470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *p++ = palette[index + 1];
471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *p++ = palette[index + 2];
472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *p++ = palette[index + 3];
473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid set_depth_and_fog(ogles_context_t* c, GLint z)
484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t enables = c->rasterizer.state.enables;
486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // we need to compute Zw
487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t iterators[3];
488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    iterators[1] = iterators[2] = 0;
489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLfixed Zw;
490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLfixed n = gglFloatToFixed(c->transforms.vpt.zNear);
491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLfixed f = gglFloatToFixed(c->transforms.vpt.zFar);
492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (z<=0)       Zw = n;
493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    else if (z>=1)  Zw = f;
494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    else            Zw = gglMulAddx(z, (f-n), n);
495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (enables & GGL_ENABLE_FOG) {
496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // set up fog if needed...
497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        iterators[0] = c->fog.fog(c, Zw);
498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.fogGrad3xv(c, iterators);
499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (enables & GGL_ENABLE_DEPTH_TEST) {
501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // set up z-test if needed...
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t z = (Zw & ~(Zw>>31));
503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (z >= 0x10000)
504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            z = 0xFFFF;
505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        iterators[0] = (z << 16) | z;
506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.zGrad3xv(c, iterators);
507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark Generate mimaps
514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectextern status_t buildAPyramid(ogles_context_t* c, EGLTextureObject* tex);
517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid generateMipmap(ogles_context_t* c, GLint level)
519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (level == 0) {
521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int active = c->textures.active;
522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLTextureObject* tex = c->textures.tmu[active].texture;
523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (tex->generate_mipmap) {
524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (buildAPyramid(c, tex) != NO_ERROR) {
525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_error(c, GL_OUT_OF_MEMORY);
526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return;
527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void texParameterx(
534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLenum pname, GLfixed param, ogles_context_t* c)
535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (target != GL_TEXTURE_2D) {
537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
540076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
541076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLTextureObject* textureObject = c->textures.tmu[c->textures.active].texture;
542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (pname) {
543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_TEXTURE_WRAP_S:
544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((param == GL_REPEAT) ||
545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (param == GL_CLAMP_TO_EDGE)) {
546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            textureObject->wraps = param;
547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            goto invalid_enum;
549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_TEXTURE_WRAP_T:
552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((param == GL_REPEAT) ||
553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (param == GL_CLAMP_TO_EDGE)) {
554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            textureObject->wrapt = param;
555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            goto invalid_enum;
557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_TEXTURE_MIN_FILTER:
560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((param == GL_NEAREST) ||
561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (param == GL_LINEAR) ||
562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (param == GL_NEAREST_MIPMAP_NEAREST) ||
563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (param == GL_LINEAR_MIPMAP_NEAREST) ||
564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (param == GL_NEAREST_MIPMAP_LINEAR) ||
565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (param == GL_LINEAR_MIPMAP_LINEAR)) {
566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            textureObject->min_filter = param;
567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            goto invalid_enum;
569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_TEXTURE_MAG_FILTER:
572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((param == GL_NEAREST) ||
573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (param == GL_LINEAR)) {
574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            textureObject->mag_filter = param;
575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            goto invalid_enum;
577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_GENERATE_MIPMAP:
580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        textureObject->generate_mipmap = param;
581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinvalid_enum:
584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    invalidate_texture(c, c->textures.active);
588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
591076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
592076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic void drawTexxOESImp(GLfixed x, GLfixed y, GLfixed z, GLfixed w, GLfixed h,
593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_context_t* c)
594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GGLSurface& cbSurface = c->rasterizer.state.buffers.color.s;
596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    y = gglIntToFixed(cbSurface.height) - (y + h);
597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    w >>= FIXED_BITS;
598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    h >>= FIXED_BITS;
599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // set up all texture units
601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; i++) {
602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!c->rasterizer.state.texture[i].enable)
603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            continue;
604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t texcoords[8];
606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texture_unit_t& u(c->textures.tmu[i]);
607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // validate this tmu (bind, wrap, filter)
609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        validate_tmu(c, i);
610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // we CLAMP here, which works with premultiplied (s,t)
611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.texParameteri(c,
612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_TEXTURE_2D, GGL_TEXTURE_WRAP_S, GGL_CLAMP);
613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.texParameteri(c,
614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_TEXTURE_2D, GGL_TEXTURE_WRAP_T, GGL_CLAMP);
615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        u.dirty = 0xFF; // XXX: should be more subtle
616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
617076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLTextureObject* textureObject = u.texture;
618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLint Ucr = textureObject->crop_rect[0] << 16;
619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLint Vcr = textureObject->crop_rect[1] << 16;
620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLint Wcr = textureObject->crop_rect[2] << 16;
621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLint Hcr = textureObject->crop_rect[3] << 16;
622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // computes texture coordinates (pre-multiplied)
624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t dsdx = Wcr / w;   // dsdx =  ((Wcr/w)/Wt)*Wt
625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t dtdy =-Hcr / h;   // dtdy = -((Hcr/h)/Ht)*Ht
626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t s0   = Ucr       - gglMulx(dsdx, x); // s0 = Ucr - x * dsdx
627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t t0   = (Vcr+Hcr) - gglMulx(dtdy, y); // t0 = (Vcr+Hcr) - y*dtdy
628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texcoords[0] = s0;
629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texcoords[1] = dsdx;
630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texcoords[2] = 0;
631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texcoords[3] = t0;
632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texcoords[4] = 0;
633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texcoords[5] = dtdy;
634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texcoords[6] = 0;
635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texcoords[7] = 0;
636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.texCoordGradScale8xv(c, i, texcoords);
637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t enables = c->rasterizer.state.enables;
640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(enables & (GGL_ENABLE_DEPTH_TEST|GGL_ENABLE_FOG)))
641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        set_depth_and_fog(c, z);
642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.activeTexture(c, c->textures.active);
644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.color4xv(c, c->currentColorClamped.v);
645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.disable(c, GGL_W_LERP);
646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.disable(c, GGL_AA);
647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.shadeModel(c, GL_FLAT);
648076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    c->rasterizer.procs.recti(c,
649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFixedToIntRound(x),
650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFixedToIntRound(y),
651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFixedToIntRound(x)+w,
652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFixedToIntRound(y)+h);
653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
655076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic void drawTexxOES(GLfixed x, GLfixed y, GLfixed z, GLfixed w, GLfixed h,
656076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ogles_context_t* c)
657076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
658076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
659076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (drawTexiOESWithCopybit(gglFixedToIntRound(x),
660076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            gglFixedToIntRound(y), gglFixedToIntRound(z),
661076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            gglFixedToIntRound(w), gglFixedToIntRound(h), c)) {
662076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return;
663076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
664076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#else
665076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // quickly reject empty rects
666076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if ((w|h) <= 0)
667076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return;
668076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif
669076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    drawTexxOESImp(x, y, z, w, h, c);
670076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
671076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawTexiOES(GLint x, GLint y, GLint z, GLint w, GLint h, ogles_context_t* c)
673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // All coordinates are integer, so if we have only one
675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // texture unit active and no scaling is required
676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // THEN, we can use our special 1:1 mapping
677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // which is a lot faster.
678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_likely(c->rasterizer.state.enabled_tmu == 1)) {
680076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
681076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        if (drawTexiOESWithCopybit(x, y, z, w, h, c)) {
682076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            return;
683076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        }
684076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif
685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int tmu = 0;
686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texture_unit_t& u(c->textures.tmu[tmu]);
687076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLTextureObject* textureObject = u.texture;
688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLint Wcr = textureObject->crop_rect[2];
689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLint Hcr = textureObject->crop_rect[3];
690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((w == Wcr) && (h == -Hcr)) {
692076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifndef LIBAGL_USE_GRALLOC_COPYBITS
693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if ((w|h) <= 0) return; // quickly reject empty rects
694076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif
695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (u.dirty) {
697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->rasterizer.procs.activeTexture(c, tmu);
698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->rasterizer.procs.bindTexture(c, &(u.texture->surface));
699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->rasterizer.procs.texParameteri(c, GGL_TEXTURE_2D,
700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        GGL_TEXTURE_MIN_FILTER, u.texture->min_filter);
701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->rasterizer.procs.texParameteri(c, GGL_TEXTURE_2D,
702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        GGL_TEXTURE_MAG_FILTER, u.texture->mag_filter);
703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.texGeni(c, GGL_S,
705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE);
706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.texGeni(c, GGL_T,
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE);
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            u.dirty = 0xFF; // XXX: should be more subtle
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.activeTexture(c, c->textures.active);
710076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GGLSurface& cbSurface = c->rasterizer.state.buffers.color.s;
712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            y = cbSurface.height - (y + h);
713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLint Ucr = textureObject->crop_rect[0];
714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLint Vcr = textureObject->crop_rect[1];
715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLint s0  = Ucr - x;
716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLint t0  = (Vcr + Hcr) - y;
717076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLuint tw = textureObject->surface.width;
719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLuint th = textureObject->surface.height;
720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if ((uint32_t(s0+x+w) > tw) || (uint32_t(t0+y+h) > th)) {
721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // The GL spec is unclear about what should happen
722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // in this case, so we just use the slow case, which
723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // at least won't crash
724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                goto slow_case;
725076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            }
726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.texCoord2i(c, s0, t0);
728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const uint32_t enables = c->rasterizer.state.enables;
729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (ggl_unlikely(enables & (GGL_ENABLE_DEPTH_TEST|GGL_ENABLE_FOG)))
730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                set_depth_and_fog(c, z);
731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.color4xv(c, c->currentColorClamped.v);
733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.disable(c, GGL_W_LERP);
734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.disable(c, GGL_AA);
735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.shadeModel(c, GL_FLAT);
736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.recti(c, x, y, x+w, y+h);
737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectslow_case:
742076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    drawTexxOESImp(
743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglIntToFixed(x), gglIntToFixed(y), gglIntToFixed(z),
744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglIntToFixed(w), gglIntToFixed(h),
745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c);
746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark Texture API
758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glActiveTexture(GLenum texture)
761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (uint32_t(texture-GL_TEXTURE0) > uint32_t(GGL_TEXTURE_UNIT_COUNT)) {
764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->textures.active = texture - GL_TEXTURE0;
768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.activeTexture(c, c->textures.active);
769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glBindTexture(GLenum target, GLuint texture)
772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (target != GL_TEXTURE_2D) {
775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Bind or create a texture
780076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sp<EGLTextureObject> tex;
781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (texture == 0) {
782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // 0 is our local texture object
783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        tex = c->textures.defaultTexture;
784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        tex = c->surfaceManager->texture(texture);
786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (ggl_unlikely(tex == 0)) {
787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            tex = c->surfaceManager->createTexture(texture);
788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (tex == 0) {
789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_error(c, GL_OUT_OF_MEMORY);
790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return;
791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bindTextureTmu(c, c->textures.active, texture, tex);
795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glGenTextures(GLsizei n, GLuint *textures)
798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (n<0) {
801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // generate unique (shared) texture names
805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->surfaceManager->getToken(n, textures);
806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDeleteTextures(GLsizei n, const GLuint *textures)
809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (n<0) {
812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If deleting a bound texture, bind this unit to 0
817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (int t=0 ; t<GGL_TEXTURE_UNIT_COUNT ; t++) {
818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->textures.tmu[t].name == 0)
819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            continue;
820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i=0 ; i<n ; i++) {
821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (textures[i] && (textures[i] == c->textures.tmu[t].name)) {
822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // bind this tmu to texture 0
823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                sp<EGLTextureObject> tex(c->textures.defaultTexture);
824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                bindTextureTmu(c, t, 0, tex);
825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->surfaceManager->deleteTextures(n, textures);
829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->surfaceManager->recycleTokens(n, textures);
830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glMultiTexCoord4f(
833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (uint32_t(target-GL_TEXTURE0) > uint32_t(GGL_TEXTURE_UNIT_COUNT)) {
837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int tmu = target-GL_TEXTURE0;
841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.texture[tmu].S = gglFloatToFixed(s);
842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.texture[tmu].T = gglFloatToFixed(t);
843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.texture[tmu].R = gglFloatToFixed(r);
844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.texture[tmu].Q = gglFloatToFixed(q);
845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glMultiTexCoord4x(
848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (uint32_t(target-GL_TEXTURE0) > uint32_t(GGL_TEXTURE_UNIT_COUNT)) {
852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int tmu = target-GL_TEXTURE0;
856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.texture[tmu].S = s;
857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.texture[tmu].T = t;
858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.texture[tmu].R = r;
859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.texture[tmu].Q = q;
860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glPixelStorei(GLenum pname, GLint param)
863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((pname != GL_PACK_ALIGNMENT) && (pname != GL_UNPACK_ALIGNMENT)) {
866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
868076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((param<=0 || param>8) || (param & (param-1))) {
870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pname == GL_PACK_ALIGNMENT)
874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->textures.packAlignment = param;
875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pname == GL_UNPACK_ALIGNMENT)
876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->textures.unpackAlignment = param;
877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexEnvf(GLenum target, GLenum pname, GLfloat param)
880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.texEnvi(c, target, pname, GLint(param));
883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexEnvfv(
886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLenum pname, const GLfloat *params)
887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pname == GL_TEXTURE_ENV_MODE) {
890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.texEnvi(c, target, pname, GLint(*params));
891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pname == GL_TEXTURE_ENV_COLOR) {
894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GGLfixed fixed[4];
895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i=0 ; i<4 ; i++)
896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            fixed[i] = gglFloatToFixed(params[i]);
897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.texEnvxv(c, target, pname, fixed);
898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_error(c, GL_INVALID_ENUM);
901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexEnvx(GLenum target, GLenum pname, GLfixed param)
904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.texEnvi(c, target, pname, param);
907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexEnvxv(
910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLenum pname, const GLfixed *params)
911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.texEnvxv(c, target, pname, params);
914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexParameteriv(
917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLenum pname, const GLint* params)
918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (target != GGL_TEXTURE_2D) {
921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLTextureObject* textureObject = c->textures.tmu[c->textures.active].texture;
926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (pname) {
927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_TEXTURE_CROP_RECT_OES:
928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        memcpy(textureObject->crop_rect, params, 4*sizeof(GLint));
929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexParameterf(
937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLenum pname, GLfloat param)
938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    texParameterx(target, pname, GLfixed(param), c);
941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexParameterx(
944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLenum pname, GLfixed param)
945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    texParameterx(target, pname, param, c);
948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glCompressedTexImage2D(
956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLint level, GLenum internalformat,
957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLsizei width, GLsizei height, GLint border,
958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLsizei imageSize, const GLvoid *data)
959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (target != GL_TEXTURE_2D) {
962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((internalformat < GL_PALETTE4_RGB8_OES ||
966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         internalformat > GL_PALETTE8_RGB5_A1_OES)) {
967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (width<0 || height<0 || border!=0) {
971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // "uncompress" the texture since pixelflinger doesn't support
976076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // any compressed texture format natively.
977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLenum format;
978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLenum type;
979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (internalformat) {
980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_RGB8_OES:
981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_RGB8_OES:
982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        format      = GL_RGB;
983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type        = GL_UNSIGNED_BYTE;
984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_RGBA8_OES:
986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_RGBA8_OES:
987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        format      = GL_RGBA;
988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type        = GL_UNSIGNED_BYTE;
989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_R5_G6_B5_OES:
991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_R5_G6_B5_OES:
992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        format      = GL_RGB;
993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type        = GL_UNSIGNED_SHORT_5_6_5;
994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_RGBA4_OES:
996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_RGBA4_OES:
997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        format      = GL_RGBA;
998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type        = GL_UNSIGNED_SHORT_4_4_4_4;
999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_RGB5_A1_OES:
1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_RGB5_A1_OES:
1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        format      = GL_RGBA;
1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type        = GL_UNSIGNED_SHORT_5_5_5_1;
1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!data || !width || !height) {
1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // unclear if this is an error or not...
1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t size;
1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface* surface;
1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // all mipmap levels are specified at once.
1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int numLevels = level<0 ? -level : 1;
1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (int i=0 ; i<numLevels ; i++) {
1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int lod_w = (width  >> i) ? : 1;
1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int lod_h = (height >> i) ? : 1;
1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int error = createTextureSurface(c, &surface, &size,
1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                i, format, type, lod_w, lod_h);
1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (error) {
1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ogles_error(c, error);
1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        decodePalette4(data, i, width, height,
1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                surface->data, surface->stride, internalformat);
1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexImage2D(
1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLint level, GLint internalformat,
1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLsizei width, GLsizei height, GLint border,
1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum format, GLenum type, const GLvoid *pixels)
1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1040076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (target != GL_TEXTURE_2D) {
1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (width<0 || height<0 || border!=0 || level < 0) {
1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1048076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (format != (GLenum)internalformat) {
1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_OPERATION);
1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (validFormatType(c, format, type)) {
1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t size = 0;
1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface* surface = 0;
1058076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int error = createTextureSurface(c, &surface, &size,
1059076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            level, format, type, width, height);
1060076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (error) {
1061076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ogles_error(c, error);
1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixels) {
1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t formatIdx = convertGLPixelFormat(format, type);
1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GGLFormat& pixelFormat(c->rasterizer.formats[formatIdx]);
1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t align = c->textures.unpackAlignment-1;
1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t bpr = ((width * pixelFormat.size) + align) & ~align;
1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const size_t size = bpr * height;
1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t stride = bpr / pixelFormat.size;
1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GGLSurface userSurface;
1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        userSurface.version = sizeof(userSurface);
1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        userSurface.width  = width;
1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        userSurface.height = height;
1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        userSurface.stride = stride;
1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        userSurface.format = formatIdx;
1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        userSurface.compressedFormat = 0;
1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        userSurface.data = (GLubyte*)pixels;
1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1082076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        int err = copyPixels(c, *surface, 0, 0, userSurface, 0, 0, width, height);
1083076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        if (err) {
1084076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            ogles_error(c, err);
1085076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            return;
1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1087076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        generateMipmap(c, level);
1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1089edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glCompressedTexSubImage2D(
1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLint level, GLint xoffset,
1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLint yoffset, GLsizei width, GLsizei height,
1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum format, GLsizei imageSize,
1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLvoid *data)
1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_error(c, GL_INVALID_ENUM);
1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexSubImage2D(
1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLint level, GLint xoffset,
1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLint yoffset, GLsizei width, GLsizei height,
1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum format, GLenum type, const GLvoid *pixels)
1107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (target != GL_TEXTURE_2D) {
1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (xoffset<0 || yoffset<0 || width<0 || height<0 || level<0) {
1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (validFormatType(c, format, type)) {
1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // find out which texture is bound to the current unit
1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int active = c->textures.active;
1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLTextureObject* tex = c->textures.tmu[active].texture;
1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GGLSurface& surface(tex->mip(level));
1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!tex->internalformat || tex->direct) {
1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_OPERATION);
1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((xoffset + width  > GLsizei(surface.width)) ||
1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        (yoffset + height > GLsizei(surface.height))) {
1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!width || !height) {
1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return; // okay, but no-op.
1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // figure out the size we need as well as the stride
1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t formatIdx = convertGLPixelFormat(format, type);
1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (formatIdx == 0) { // we don't know what to do with this
1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_OPERATION);
1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GGLFormat& pixelFormat(c->rasterizer.formats[formatIdx]);
1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t align = c->textures.unpackAlignment-1;
1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t bpr = ((width * pixelFormat.size) + align) & ~align;
1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const size_t size = bpr * height;
1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t stride = bpr / pixelFormat.size;
1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface userSurface;
1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.version = sizeof(userSurface);
1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.width  = width;
1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.height = height;
1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.stride = stride;
1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.format = formatIdx;
1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.compressedFormat = 0;
1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.data = (GLubyte*)pixels;
1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int err = copyPixels(c,
1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            surface, xoffset, yoffset,
1162076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            userSurface, 0, 0, width, height);
1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (err) {
1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, err);
1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    generateMipmap(c, level);
1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // since we only changed the content of the texture, we don't need
1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // to call bindTexture on the main rasterizer.
1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glCopyTexImage2D(
1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLint level, GLenum internalformat,
1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLint x, GLint y, GLsizei width, GLsizei height,
1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLint border)
1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (target != GL_TEXTURE_2D) {
1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (internalformat<GL_ALPHA || internalformat>GL_LUMINANCE_ALPHA) {
1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (width<0 || height<0 || border!=0 || level<0) {
1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLenum format = 0;
1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLenum type = GL_UNSIGNED_BYTE;
1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GGLSurface& cbSurface = c->rasterizer.state.buffers.color.s;
1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int cbFormatIdx = cbSurface.format;
1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (cbFormatIdx) {
1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_RGB_565:
1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type = GL_UNSIGNED_SHORT_5_6_5;
1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_RGBA_5551:
1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type = GL_UNSIGNED_SHORT_5_5_5_1;
1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_RGBA_4444:
1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type = GL_UNSIGNED_SHORT_4_4_4_4;
1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (internalformat) {
1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_ALPHA:
1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_LUMINANCE_ALPHA:
1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_LUMINANCE:
1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type = GL_UNSIGNED_BYTE;
1215076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        break;
1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // figure out the format to use for the new texture
1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (cbFormatIdx) {
1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_RGBA_8888:
1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_A_8:
1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_RGBA_5551:
1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_RGBA_4444:
1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        format = internalformat;
1225076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        break;
1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_RGBX_8888:
1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_RGB_888:
1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_RGB_565:
1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_L_8:
1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        switch (internalformat) {
1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GL_LUMINANCE:
1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GL_RGB:
1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            format = internalformat;
1234076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            break;
1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (format == 0) {
1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // invalid combination
1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // create the new texture...
1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t size;
1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface* surface;
1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int error = createTextureSurface(c, &surface, &size,
1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            level, format, type, width, height);
1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (error) {
1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, error);
1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1254076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // The bottom row is stored first in textures
1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface txSurface(*surface);
1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    txSurface.stride = -txSurface.stride;
1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // (x,y) is the lower-left corner of colorBuffer
1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    y = cbSurface.height - (y + height);
1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int err = copyPixels(c,
1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            txSurface, 0, 0,
1264076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            cbSurface, x, y, cbSurface.width, cbSurface.height);
1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (err) {
1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, err);
1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    generateMipmap(c, level);
1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glCopyTexSubImage2D(
1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLint level, GLint xoffset, GLint yoffset,
1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLint x, GLint y, GLsizei width, GLsizei height)
1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (target != GL_TEXTURE_2D) {
1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (xoffset<0 || yoffset<0 || width<0 || height<0 || level<0) {
1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!width || !height) {
1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return; // okay, but no-op.
1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // find out which texture is bound to the current unit
1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int active = c->textures.active;
1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLTextureObject* tex = c->textures.tmu[active].texture;
1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GGLSurface& surface(tex->mip(level));
1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!tex->internalformat) {
1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_OPERATION);
1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((xoffset + width  > GLsizei(surface.width)) ||
1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        (yoffset + height > GLsizei(surface.height))) {
1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // The bottom row is stored first in textures
1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface txSurface(surface);
1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    txSurface.stride = -txSurface.stride;
1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // (x,y) is the lower-left corner of colorBuffer
1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GGLSurface& cbSurface = c->rasterizer.state.buffers.color.s;
1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    y = cbSurface.height - (y + height);
1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int err = copyPixels(c,
1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            surface, xoffset, yoffset,
1314076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            cbSurface, x, y, width, height);
1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (err) {
1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, err);
1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    generateMipmap(c, level);
1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glReadPixels(
1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLint x, GLint y, GLsizei width, GLsizei height,
1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum format, GLenum type, GLvoid *pixels)
1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((format != GL_RGBA) && (format != GL_RGB)) {
1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((type != GL_UNSIGNED_BYTE) && (type != GL_UNSIGNED_SHORT_5_6_5)) {
1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (width<0 || height<0) {
1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (x<0 || x<0) {
1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t formatIdx = GGL_PIXEL_FORMAT_NONE;
1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((format == GL_RGBA) && (type == GL_UNSIGNED_BYTE)) {
1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        formatIdx = GGL_PIXEL_FORMAT_RGBA_8888;
1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else if ((format == GL_RGB) && (type == GL_UNSIGNED_SHORT_5_6_5)) {
1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        formatIdx = GGL_PIXEL_FORMAT_RGB_565;
1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_OPERATION);
1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GGLSurface& readSurface = c->rasterizer.state.buffers.read.s;
1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((x+width > GLint(readSurface.width)) ||
1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (y+height > GLint(readSurface.height))) {
1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GGLFormat& pixelFormat(c->rasterizer.formats[formatIdx]);
1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t align = c->textures.packAlignment-1;
1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t bpr = ((width * pixelFormat.size) + align) & ~align;
1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t stride = bpr / pixelFormat.size;
1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface userSurface;
1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.version = sizeof(userSurface);
1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.width  = width;
1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.height = height;
1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.stride = -stride; // bottom row is transfered first
1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.format = formatIdx;
1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.compressedFormat = 0;
1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.data = (GLubyte*)pixels;
1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // use pixel-flinger to handle all the conversions
1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLContext* ggl = getRasterizer(c);
1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!ggl) {
1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // the only reason this would fail is because we ran out of memory
1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_OUT_OF_MEMORY);
1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1384076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    ggl->colorBuffer(ggl, &userSurface);  // destination is user buffer
1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ggl->bindTexture(ggl, &readSurface);  // source is read-buffer
1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ggl->texCoord2i(ggl, x, readSurface.height - (y + height));
1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ggl->recti(ggl, 0, 0, width, height);
1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark DrawTexture Extension
1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawTexsvOES(const GLshort* coords) {
1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawTexiOES(coords[0], coords[1], coords[2], coords[3], coords[4], c);
1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawTexivOES(const GLint* coords) {
1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawTexiOES(coords[0], coords[1], coords[2], coords[3], coords[4], c);
1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawTexsOES(GLshort x , GLshort y, GLshort z, GLshort w, GLshort h) {
1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawTexiOES(x, y, z, w, h, c);
1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawTexiOES(GLint x, GLint y, GLint z, GLint w, GLint h) {
1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawTexiOES(x, y, z, w, h, c);
1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawTexfvOES(const GLfloat* coords) {
1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawTexxOES(
1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFloatToFixed(coords[0]),
1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFloatToFixed(coords[1]),
1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFloatToFixed(coords[2]),
1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFloatToFixed(coords[3]),
1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFloatToFixed(coords[4]),
1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c);
1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawTexxvOES(const GLfixed* coords) {
1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawTexxOES(coords[0], coords[1], coords[2], coords[3], coords[4], c);
1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawTexfOES(GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h){
1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawTexxOES(
1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFloatToFixed(x), gglFloatToFixed(y), gglFloatToFixed(z),
1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFloatToFixed(w), gglFloatToFixed(h),
1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c);
1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawTexxOES(GLfixed x, GLfixed y, GLfixed z, GLfixed w, GLfixed h) {
1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawTexxOES(x, y, z, w, h, c);
1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1438076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1439076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ----------------------------------------------------------------------------
1440076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#if 0
1441076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#pragma mark -
1442076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#pragma mark EGL Image Extension
1443076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif
1444076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1445076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
1446076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
1447076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    ogles_context_t* c = ogles_context_t::get();
1448076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (target != GL_TEXTURE_2D) {
1449076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ogles_error(c, GL_INVALID_ENUM);
1450076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return;
1451076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1452076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1453076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)image;
1454076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) {
1455076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ogles_error(c, GL_INVALID_VALUE);
1456076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return;
1457076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1458076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t)) {
1459076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ogles_error(c, GL_INVALID_VALUE);
1460076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return;
1461076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1462076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1463076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->bits == NULL) {
1464076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        // this buffer cannot be used with this implementation
1465076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ogles_error(c, GL_INVALID_VALUE);
1466076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return;
1467076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1468076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1469076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    GGLSurface sur;
1470076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sur.version = sizeof(GGLSurface);
1471076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sur.width = native_buffer->width;
1472076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sur.height= native_buffer->height;
1473076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sur.stride= native_buffer->stride;
1474076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sur.format= native_buffer->format;
1475076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sur.data  = (GGLubyte*)native_buffer->bits;
1476076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1477076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // bind it to the texture unit
1478076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sp<EGLTextureObject> tex = getAndBindActiveTextureObject(c);
1479076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    tex->setSurface(&sur);
1480076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1481076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    /*
1482076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     * Here an implementation can retrieve the buffer_handle_t of this buffer
1483076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     * which gives it access to an arbitrary-defined kernel resource
1484076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     * (or anything else for that matter).
1485076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     * There needs to be an intimate knowledge between GLES and buffer_handle_t,
1486076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     * so make sure to validate the handle before using it.
1487076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     * Typically, buffer_handle_t comes from the gralloc HAL which is provided
1488076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     * by the implementor of GLES.
1489076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     *
1490076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     */
1491076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
1492076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    tex->copybits_fd = -1;
1493076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer_handle_t handle;
1494076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->getHandle(native_buffer, &handle) == 0) {
1495076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        private_handle_t* hand;
1496076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        if ((hand = private_handle_t::dynamicCast(handle)) != NULL) {
1497076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            if (hand->usesPhysicallyContiguousMemory()) {
1498076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                tex->copybits_fd = hand->fd;
1499076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            }
1500076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        }
1501076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1502076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS
1503076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
1504076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1505076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
1506076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
1507076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
1508