texture.cpp revision 18b915a1026dfe9d273ee3fd2139b7feed22008c
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
2658a79f47457e9cae2f6880653b581fe3170b0b1fMathias Agopian#include <private/ui/android_natives_priv.h>
2718b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian#include <ETC1/etc1.h>
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
29076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
30076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include "copybit.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
1060926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianvoid ogles_validate_texture(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
1200926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian/*
1210926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian * If the active textures are EGLImage, they need to be locked before
122cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich * they can be used.
123cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich *
1240926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian * FIXME: code below is far from being optimal
125cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich *
1260926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian */
1270926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
1280926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianvoid ogles_lock_textures(ogles_context_t* c)
1290926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
1300926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; i++) {
1310926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian        if (c->rasterizer.state.texture[i].enable) {
1320926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian            texture_unit_t& u(c->textures.tmu[i]);
1330926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian            android_native_buffer_t* native_buffer = u.texture->buffer;
1340926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian            if (native_buffer) {
1350926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian                c->rasterizer.procs.activeTexture(c, i);
1360926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian                hw_module_t const* pModule;
1370926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian                if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule))
1380926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian                    continue;
1390926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
1400926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian                gralloc_module_t const* module =
1410926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian                    reinterpret_cast<gralloc_module_t const*>(pModule);
14221c59d0070fe24a8e04e52ce04d511a924a9932fMathias Agopian
143e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                void* vaddr;
14421c59d0070fe24a8e04e52ce04d511a924a9932fMathias Agopian                int err = module->lock(module, native_buffer->handle,
1450926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian                        GRALLOC_USAGE_SW_READ_OFTEN,
1460926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian                        0, 0, native_buffer->width, native_buffer->height,
147e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                        &vaddr);
1480926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
149e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                u.texture->setImageBits(vaddr);
1500926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian                c->rasterizer.procs.bindTexture(c, &(u.texture->surface));
1510926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian            }
1520926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian        }
1530926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    }
1540926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
1550926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
1560926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianvoid ogles_unlock_textures(ogles_context_t* c)
1570926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
1580926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; i++) {
1590926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian        if (c->rasterizer.state.texture[i].enable) {
1600926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian            texture_unit_t& u(c->textures.tmu[i]);
1610926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian            android_native_buffer_t* native_buffer = u.texture->buffer;
1620926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian            if (native_buffer) {
1630926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian                c->rasterizer.procs.activeTexture(c, i);
1640926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian                hw_module_t const* pModule;
1650926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian                if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule))
1660926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian                    continue;
1670926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
1680926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian                gralloc_module_t const* module =
1690926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian                    reinterpret_cast<gralloc_module_t const*>(pModule);
17021c59d0070fe24a8e04e52ce04d511a924a9932fMathias Agopian
17121c59d0070fe24a8e04e52ce04d511a924a9932fMathias Agopian                module->unlock(module, native_buffer->handle);
1720926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian                u.texture->setImageBits(NULL);
1730926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian                c->rasterizer.procs.bindTexture(c, &(u.texture->surface));
1740926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian            }
1750926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian        }
1760926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    }
1770926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    c->rasterizer.procs.activeTexture(c, c->textures.active);
1780926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
1790926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark Format conversion
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic uint32_t gl2format_table[6][4] = {
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // BYTE, 565, 4444, 5551
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { GGL_PIXEL_FORMAT_A_8,
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      0, 0, 0 },                        // GL_ALPHA
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { GGL_PIXEL_FORMAT_RGB_888,
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      GGL_PIXEL_FORMAT_RGB_565,
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      0, 0 },                           // GL_RGB
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { GGL_PIXEL_FORMAT_RGBA_8888,
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      0,
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      GGL_PIXEL_FORMAT_RGBA_4444,
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      GGL_PIXEL_FORMAT_RGBA_5551 },     // GL_RGBA
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { GGL_PIXEL_FORMAT_L_8,
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      0, 0, 0 },                        // GL_LUMINANCE
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { GGL_PIXEL_FORMAT_LA_88,
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      0, 0, 0 },                        // GL_LUMINANCE_ALPHA
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int32_t convertGLPixelFormat(GLint format, GLenum type)
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t fi = -1;
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t ti = -1;
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (format) {
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_ALPHA:              fi = 0;     break;
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_RGB:                fi = 1;     break;
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_RGBA:               fi = 2;     break;
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_LUMINANCE:          fi = 3;     break;
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_LUMINANCE_ALPHA:    fi = 4;     break;
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (type) {
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_UNSIGNED_BYTE:          ti = 0; break;
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_UNSIGNED_SHORT_5_6_5:   ti = 1; break;
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_UNSIGNED_SHORT_4_4_4_4: ti = 2; break;
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_UNSIGNED_SHORT_5_5_5_1: ti = 3; break;
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (fi==-1 || ti==-1)
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return 0;
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return gl2format_table[fi][ti];
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLenum validFormatType(ogles_context_t* c, GLenum format, GLenum type)
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLenum error = 0;
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (format<GL_ALPHA || format>GL_LUMINANCE_ALPHA) {
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        error = GL_INVALID_ENUM;
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (type != GL_UNSIGNED_BYTE && type != GL_UNSIGNED_SHORT_4_4_4_4 &&
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type != GL_UNSIGNED_SHORT_5_5_5_1 && type != GL_UNSIGNED_SHORT_5_6_5) {
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        error = GL_INVALID_ENUM;
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (type == GL_UNSIGNED_SHORT_5_6_5 && format != GL_RGB) {
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        error = GL_INVALID_OPERATION;
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((type == GL_UNSIGNED_SHORT_4_4_4_4 ||
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         type == GL_UNSIGNED_SHORT_5_5_5_1)  && format != GL_RGBA) {
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        error = GL_INVALID_OPERATION;
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (error) {
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, error);
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return error;
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGGLContext* getRasterizer(ogles_context_t* c)
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLContext* ggl = c->textures.ggl;
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(!ggl)) {
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // this is quite heavy the first time...
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gglInit(&ggl);
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!ggl) {
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return 0;
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GGLfixed colors[4] = { 0, 0, 0, 0x10000 };
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->textures.ggl = ggl;
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ggl->activeTexture(ggl, 0);
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ggl->enable(ggl, GGL_TEXTURE_2D);
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ggl->texEnvi(ggl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE);
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ggl->disable(ggl, GGL_DITHER);
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ggl->shadeModel(ggl, GGL_FLAT);
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ggl->color4xv(ggl, colors);
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ggl;
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint copyPixels(
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_context_t* c,
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GGLSurface& dst,
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLint xoffset, GLint yoffset,
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GGLSurface& src,
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLint x, GLint y, GLsizei w, GLsizei h)
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((dst.format == src.format) &&
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        (dst.stride == src.stride) &&
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        (dst.width == src.width) &&
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        (dst.height == src.height) &&
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        (dst.stride > 0) &&
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ((x|y) == 0) &&
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ((xoffset|yoffset) == 0))
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // this is a common case...
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GGLFormat& pixelFormat(c->rasterizer.formats[src.format]);
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const size_t size = src.height * src.stride * pixelFormat.size;
292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        memcpy(dst.data, src.data, size);
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return 0;
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // use pixel-flinger to handle all the conversions
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLContext* ggl = getRasterizer(c);
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!ggl) {
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // the only reason this would fail is because we ran out of memory
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return GL_OUT_OF_MEMORY;
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ggl->colorBuffer(ggl, &dst);
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ggl->bindTexture(ggl, &src);
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ggl->texCoord2i(ggl, x-xoffset, y-yoffset);
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ggl->recti(ggl, xoffset, yoffset, xoffset+w, yoffset+h);
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectsp<EGLTextureObject> getAndBindActiveTextureObject(ogles_context_t* c)
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    sp<EGLTextureObject> tex;
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int active = c->textures.active;
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GLuint name = c->textures.tmu[active].name;
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // free the reference to the previously bound object
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    texture_unit_t& u(c->textures.tmu[active]);
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (u.texture)
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        u.texture->decStrong(c);
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (name == 0) {
325076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        // 0 is our local texture object, not shared with anyone.
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // But it affects all bound TMUs immediately.
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // (we need to invalidate all units bound to this texture object)
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        tex = c->textures.defaultTexture;
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; i++) {
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (c->textures.tmu[i].texture == tex.get())
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                invalidate_texture(c, i);
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // get a new texture object for that name
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        tex = c->surfaceManager->replaceTexture(name);
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // bind this texture to the current active texture unit
339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // and add a reference to this texture object
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    u.texture = tex.get();
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    u.texture->incStrong(c);
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    u.name = name;
343076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    invalidate_texture(c, active);
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return tex;
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid bindTextureTmu(
348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c, int tmu, GLuint texture, const sp<EGLTextureObject>& tex)
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (tex.get() == c->textures.tmu[tmu].texture)
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
352076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // free the reference to the previously bound object
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    texture_unit_t& u(c->textures.tmu[tmu]);
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (u.texture)
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        u.texture->decStrong(c);
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // bind this texture to the current active texture unit
359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // and add a reference to this texture object
360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    u.texture = tex.get();
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    u.texture->incStrong(c);
362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    u.name = texture;
363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    invalidate_texture(c, tmu);
364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint createTextureSurface(ogles_context_t* c,
367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GGLSurface** outSurface, int32_t* outSize, GLint level,
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum format, GLenum type, GLsizei width, GLsizei height,
369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum compressedFormat = 0)
370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // find out which texture is bound to the current unit
372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int active = c->textures.active;
373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GLuint name = c->textures.tmu[active].name;
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // convert the pixelformat to one we can handle
376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t formatIdx = convertGLPixelFormat(format, type);
377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (formatIdx == 0) { // we don't know what to do with this
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return GL_INVALID_OPERATION;
379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
380076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // figure out the size we need as well as the stride
382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GGLFormat& pixelFormat(c->rasterizer.formats[formatIdx]);
383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t align = c->textures.unpackAlignment-1;
384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t bpr = ((width * pixelFormat.size) + align) & ~align;
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const size_t size = bpr * height;
386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t stride = bpr / pixelFormat.size;
387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (level > 0) {
389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int active = c->textures.active;
390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLTextureObject* tex = c->textures.tmu[active].texture;
391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        status_t err = tex->reallocate(level,
392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                width, height, stride, formatIdx, compressedFormat, bpr);
393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (err != NO_ERROR)
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return GL_OUT_OF_MEMORY;
395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GGLSurface& surface = tex->editMip(level);
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *outSurface = &surface;
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *outSize = size;
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return 0;
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    sp<EGLTextureObject> tex = getAndBindActiveTextureObject(c);
402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t err = tex->reallocate(level,
403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            width, height, stride, formatIdx, compressedFormat, bpr);
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (err != NO_ERROR)
405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return GL_OUT_OF_MEMORY;
406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tex->internalformat = format;
408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *outSurface = &tex->surface;
409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *outSize = size;
410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
413cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevichstatic size_t dataSizePalette4(int numLevels, int width, int height, int format)
414cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich{
415cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    int indexBits = 8;
416cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    int entrySize = 0;
417cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    switch (format) {
418cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    case GL_PALETTE4_RGB8_OES:
419cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich        indexBits = 4;
420cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich        /* FALLTHROUGH */
421cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    case GL_PALETTE8_RGB8_OES:
422cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich        entrySize = 3;
423cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich        break;
424cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich
425cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    case GL_PALETTE4_RGBA8_OES:
426cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich        indexBits = 4;
427cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich        /* FALLTHROUGH */
428cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    case GL_PALETTE8_RGBA8_OES:
429cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich        entrySize = 4;
430cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich        break;
431cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich
432cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    case GL_PALETTE4_R5_G6_B5_OES:
433cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    case GL_PALETTE4_RGBA4_OES:
434cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    case GL_PALETTE4_RGB5_A1_OES:
435cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich        indexBits = 4;
436cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich        /* FALLTHROUGH */
437cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    case GL_PALETTE8_R5_G6_B5_OES:
438cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    case GL_PALETTE8_RGBA4_OES:
439cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    case GL_PALETTE8_RGB5_A1_OES:
440cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich        entrySize = 2;
441cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich        break;
442cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    }
443cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich
444cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    size_t size = (1 << indexBits) * entrySize; // palette size
445cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich
446cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    for (int i=0 ; i< numLevels ; i++) {
447cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich        int w = (width  >> i) ? : 1;
448cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich        int h = (height >> i) ? : 1;
449cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich        int levelSize = h * ((w * indexBits) / 8) ? : 1;
450cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich        size += levelSize;
451cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    }
452cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich
453cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    return size;
454cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich}
455cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich
456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void decodePalette4(const GLvoid *data, int level, int width, int height,
457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                           void *surface, int stride, int format)
458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int indexBits = 8;
461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int entrySize = 0;
462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (format) {
463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_RGB8_OES:
464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        indexBits = 4;
465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        /* FALLTHROUGH */
466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_RGB8_OES:
467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        entrySize = 3;
468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_RGBA8_OES:
471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        indexBits = 4;
472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        /* FALLTHROUGH */
473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_RGBA8_OES:
474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        entrySize = 4;
475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_R5_G6_B5_OES:
478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_RGBA4_OES:
479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_RGB5_A1_OES:
480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        indexBits = 4;
481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        /* FALLTHROUGH */
482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_R5_G6_B5_OES:
483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_RGBA4_OES:
484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_RGB5_A1_OES:
485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        entrySize = 2;
486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int paletteSize = (1 << indexBits) * entrySize;
490cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich
491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint8_t const* pixels = (uint8_t *)data + paletteSize;
492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (int i=0 ; i<level ; i++) {
493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int w = (width  >> i) ? : 1;
494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int h = (height >> i) ? : 1;
495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixels += h * ((w * indexBits) / 8);
496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    width  = (width  >> level) ? : 1;
498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    height = (height >> level) ? : 1;
499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (entrySize == 2) {
501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint8_t const* const palette = (uint8_t*)data;
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int y=0 ; y<height ; y++) {
503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            uint8_t* p = (uint8_t*)surface + y*stride*2;
504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (indexBits == 8) {
505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                for (int x=0 ; x<width ; x++) {
506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int index = 2 * (*pixels++);
507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 0];
508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 1];
509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                for (int x=0 ; x<width ; x+=2) {
512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int v = *pixels++;
513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int index = 2 * (v >> 4);
514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 0];
515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 1];
516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (x+1 < width) {
517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        index = 2 * (v & 0xF);
518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *p++ = palette[index + 0];
519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *p++ = palette[index + 1];
520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else if (entrySize == 3) {
525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint8_t const* const palette = (uint8_t*)data;
526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int y=0 ; y<height ; y++) {
527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            uint8_t* p = (uint8_t*)surface + y*stride*3;
528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (indexBits == 8) {
529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                for (int x=0 ; x<width ; x++) {
530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int index = 3 * (*pixels++);
531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 0];
532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 1];
533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 2];
534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                for (int x=0 ; x<width ; x+=2) {
537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int v = *pixels++;
538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int index = 3 * (v >> 4);
539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 0];
540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 1];
541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 2];
542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (x+1 < width) {
543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        index = 3 * (v & 0xF);
544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *p++ = palette[index + 0];
545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *p++ = palette[index + 1];
546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *p++ = palette[index + 2];
547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else if (entrySize == 4) {
552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint8_t const* const palette = (uint8_t*)data;
553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int y=0 ; y<height ; y++) {
554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            uint8_t* p = (uint8_t*)surface + y*stride*4;
555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (indexBits == 8) {
556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                for (int x=0 ; x<width ; x++) {
557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int index = 4 * (*pixels++);
558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 0];
559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 1];
560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 2];
561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 3];
562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                for (int x=0 ; x<width ; x+=2) {
565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int v = *pixels++;
566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int index = 4 * (v >> 4);
567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 0];
568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 1];
569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 2];
570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *p++ = palette[index + 3];
571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (x+1 < width) {
572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        index = 4 * (v & 0xF);
573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *p++ = palette[index + 0];
574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *p++ = palette[index + 1];
575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *p++ = palette[index + 2];
576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *p++ = palette[index + 3];
577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
58745351bcae55fea67d5560c8a68887394eff9eda8Mathias Agopianvoid set_depth_and_fog(ogles_context_t* c, GGLfixed z)
588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t enables = c->rasterizer.state.enables;
590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // we need to compute Zw
591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t iterators[3];
592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    iterators[1] = iterators[2] = 0;
593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLfixed Zw;
594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLfixed n = gglFloatToFixed(c->transforms.vpt.zNear);
595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLfixed f = gglFloatToFixed(c->transforms.vpt.zFar);
59645351bcae55fea67d5560c8a68887394eff9eda8Mathias Agopian    if (z<=0)               Zw = n;
59745351bcae55fea67d5560c8a68887394eff9eda8Mathias Agopian    else if (z>=0x10000)    Zw = f;
598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    else            Zw = gglMulAddx(z, (f-n), n);
599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (enables & GGL_ENABLE_FOG) {
600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // set up fog if needed...
601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        iterators[0] = c->fog.fog(c, Zw);
602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.fogGrad3xv(c, iterators);
603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (enables & GGL_ENABLE_DEPTH_TEST) {
605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // set up z-test if needed...
606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t z = (Zw & ~(Zw>>31));
607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (z >= 0x10000)
608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            z = 0xFFFF;
609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        iterators[0] = (z << 16) | z;
610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.zGrad3xv(c, iterators);
611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark Generate mimaps
618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectextern status_t buildAPyramid(ogles_context_t* c, EGLTextureObject* tex);
621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid generateMipmap(ogles_context_t* c, GLint level)
623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (level == 0) {
625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int active = c->textures.active;
626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLTextureObject* tex = c->textures.tmu[active].texture;
627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (tex->generate_mipmap) {
628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (buildAPyramid(c, tex) != NO_ERROR) {
629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_error(c, GL_OUT_OF_MEMORY);
630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return;
631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void texParameterx(
638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLenum pname, GLfixed param, ogles_context_t* c)
639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (target != GL_TEXTURE_2D) {
641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
644076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
645076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLTextureObject* textureObject = c->textures.tmu[c->textures.active].texture;
646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (pname) {
647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_TEXTURE_WRAP_S:
648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((param == GL_REPEAT) ||
649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (param == GL_CLAMP_TO_EDGE)) {
650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            textureObject->wraps = param;
651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            goto invalid_enum;
653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_TEXTURE_WRAP_T:
656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((param == GL_REPEAT) ||
657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (param == GL_CLAMP_TO_EDGE)) {
658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            textureObject->wrapt = param;
659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            goto invalid_enum;
661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_TEXTURE_MIN_FILTER:
664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((param == GL_NEAREST) ||
665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (param == GL_LINEAR) ||
666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (param == GL_NEAREST_MIPMAP_NEAREST) ||
667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (param == GL_LINEAR_MIPMAP_NEAREST) ||
668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (param == GL_NEAREST_MIPMAP_LINEAR) ||
669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (param == GL_LINEAR_MIPMAP_LINEAR)) {
670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            textureObject->min_filter = param;
671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            goto invalid_enum;
673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_TEXTURE_MAG_FILTER:
676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((param == GL_NEAREST) ||
677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (param == GL_LINEAR)) {
678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            textureObject->mag_filter = param;
679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            goto invalid_enum;
681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_GENERATE_MIPMAP:
684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        textureObject->generate_mipmap = param;
685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinvalid_enum:
688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    invalidate_texture(c, c->textures.active);
692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
695076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
696076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic void drawTexxOESImp(GLfixed x, GLfixed y, GLfixed z, GLfixed w, GLfixed h,
697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_context_t* c)
698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
6990926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    ogles_lock_textures(c);
700cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich
701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GGLSurface& cbSurface = c->rasterizer.state.buffers.color.s;
702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    y = gglIntToFixed(cbSurface.height) - (y + h);
703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    w >>= FIXED_BITS;
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    h >>= FIXED_BITS;
705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // set up all texture units
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; i++) {
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!c->rasterizer.state.texture[i].enable)
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            continue;
710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t texcoords[8];
712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texture_unit_t& u(c->textures.tmu[i]);
713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // validate this tmu (bind, wrap, filter)
715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        validate_tmu(c, i);
716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // we CLAMP here, which works with premultiplied (s,t)
717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.texParameteri(c,
718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_TEXTURE_2D, GGL_TEXTURE_WRAP_S, GGL_CLAMP);
719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.texParameteri(c,
720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_TEXTURE_2D, GGL_TEXTURE_WRAP_T, GGL_CLAMP);
721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        u.dirty = 0xFF; // XXX: should be more subtle
722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
723076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLTextureObject* textureObject = u.texture;
724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLint Ucr = textureObject->crop_rect[0] << 16;
725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLint Vcr = textureObject->crop_rect[1] << 16;
726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLint Wcr = textureObject->crop_rect[2] << 16;
727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLint Hcr = textureObject->crop_rect[3] << 16;
728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // computes texture coordinates (pre-multiplied)
730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t dsdx = Wcr / w;   // dsdx =  ((Wcr/w)/Wt)*Wt
731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t dtdy =-Hcr / h;   // dtdy = -((Hcr/h)/Ht)*Ht
732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t s0   = Ucr       - gglMulx(dsdx, x); // s0 = Ucr - x * dsdx
733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t t0   = (Vcr+Hcr) - gglMulx(dtdy, y); // t0 = (Vcr+Hcr) - y*dtdy
734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texcoords[0] = s0;
735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texcoords[1] = dsdx;
736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texcoords[2] = 0;
737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texcoords[3] = t0;
738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texcoords[4] = 0;
739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texcoords[5] = dtdy;
740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texcoords[6] = 0;
741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texcoords[7] = 0;
742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.texCoordGradScale8xv(c, i, texcoords);
743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t enables = c->rasterizer.state.enables;
746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(enables & (GGL_ENABLE_DEPTH_TEST|GGL_ENABLE_FOG)))
747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        set_depth_and_fog(c, z);
748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.activeTexture(c, c->textures.active);
750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.color4xv(c, c->currentColorClamped.v);
751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.disable(c, GGL_W_LERP);
752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.disable(c, GGL_AA);
753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.shadeModel(c, GL_FLAT);
754076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    c->rasterizer.procs.recti(c,
755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFixedToIntRound(x),
756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFixedToIntRound(y),
757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFixedToIntRound(x)+w,
758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFixedToIntRound(y)+h);
7590926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
7600926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    ogles_unlock_textures(c);
761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
763076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic void drawTexxOES(GLfixed x, GLfixed y, GLfixed z, GLfixed w, GLfixed h,
764076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ogles_context_t* c)
765076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
766076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
767076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (drawTexiOESWithCopybit(gglFixedToIntRound(x),
768076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            gglFixedToIntRound(y), gglFixedToIntRound(z),
769076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            gglFixedToIntRound(w), gglFixedToIntRound(h), c)) {
770076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return;
771076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
772076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#else
773076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // quickly reject empty rects
774076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if ((w|h) <= 0)
775076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return;
776076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif
777076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    drawTexxOESImp(x, y, z, w, h, c);
778076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
779076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawTexiOES(GLint x, GLint y, GLint z, GLint w, GLint h, ogles_context_t* c)
781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // All coordinates are integer, so if we have only one
783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // texture unit active and no scaling is required
784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // THEN, we can use our special 1:1 mapping
785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // which is a lot faster.
786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_likely(c->rasterizer.state.enabled_tmu == 1)) {
788076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
789076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        if (drawTexiOESWithCopybit(x, y, z, w, h, c)) {
790076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            return;
791076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        }
792076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif
793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int tmu = 0;
794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        texture_unit_t& u(c->textures.tmu[tmu]);
795076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLTextureObject* textureObject = u.texture;
796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLint Wcr = textureObject->crop_rect[2];
797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLint Hcr = textureObject->crop_rect[3];
798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((w == Wcr) && (h == -Hcr)) {
800076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifndef LIBAGL_USE_GRALLOC_COPYBITS
801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if ((w|h) <= 0) return; // quickly reject empty rects
802076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif
803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (u.dirty) {
805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->rasterizer.procs.activeTexture(c, tmu);
806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->rasterizer.procs.bindTexture(c, &(u.texture->surface));
807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->rasterizer.procs.texParameteri(c, GGL_TEXTURE_2D,
808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        GGL_TEXTURE_MIN_FILTER, u.texture->min_filter);
809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->rasterizer.procs.texParameteri(c, GGL_TEXTURE_2D,
810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        GGL_TEXTURE_MAG_FILTER, u.texture->mag_filter);
811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.texGeni(c, GGL_S,
813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE);
814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.texGeni(c, GGL_T,
815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE);
816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            u.dirty = 0xFF; // XXX: should be more subtle
817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.activeTexture(c, c->textures.active);
818076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GGLSurface& cbSurface = c->rasterizer.state.buffers.color.s;
820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            y = cbSurface.height - (y + h);
821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLint Ucr = textureObject->crop_rect[0];
822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLint Vcr = textureObject->crop_rect[1];
823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLint s0  = Ucr - x;
824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLint t0  = (Vcr + Hcr) - y;
825076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLuint tw = textureObject->surface.width;
827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLuint th = textureObject->surface.height;
828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if ((uint32_t(s0+x+w) > tw) || (uint32_t(t0+y+h) > th)) {
829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // The GL spec is unclear about what should happen
830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // in this case, so we just use the slow case, which
831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // at least won't crash
832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                goto slow_case;
833076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            }
834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
8350926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian            ogles_lock_textures(c);
8360926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.texCoord2i(c, s0, t0);
838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const uint32_t enables = c->rasterizer.state.enables;
839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (ggl_unlikely(enables & (GGL_ENABLE_DEPTH_TEST|GGL_ENABLE_FOG)))
84045351bcae55fea67d5560c8a68887394eff9eda8Mathias Agopian                set_depth_and_fog(c, gglIntToFixed(z));
841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.color4xv(c, c->currentColorClamped.v);
843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.disable(c, GGL_W_LERP);
844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.disable(c, GGL_AA);
845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.shadeModel(c, GL_FLAT);
846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->rasterizer.procs.recti(c, x, y, x+w, y+h);
847cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich
8480926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian            ogles_unlock_textures(c);
8490926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectslow_case:
855076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    drawTexxOESImp(
856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglIntToFixed(x), gglIntToFixed(y), gglIntToFixed(z),
857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglIntToFixed(w), gglIntToFixed(h),
858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c);
859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark Texture API
871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glActiveTexture(GLenum texture)
874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (uint32_t(texture-GL_TEXTURE0) > uint32_t(GGL_TEXTURE_UNIT_COUNT)) {
877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->textures.active = texture - GL_TEXTURE0;
881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.activeTexture(c, c->textures.active);
882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glBindTexture(GLenum target, GLuint texture)
885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (target != GL_TEXTURE_2D) {
888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Bind or create a texture
893076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sp<EGLTextureObject> tex;
894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (texture == 0) {
895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // 0 is our local texture object
896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        tex = c->textures.defaultTexture;
897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        tex = c->surfaceManager->texture(texture);
899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (ggl_unlikely(tex == 0)) {
900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            tex = c->surfaceManager->createTexture(texture);
901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (tex == 0) {
902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_error(c, GL_OUT_OF_MEMORY);
903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return;
904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bindTextureTmu(c, c->textures.active, texture, tex);
908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glGenTextures(GLsizei n, GLuint *textures)
911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (n<0) {
914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // generate unique (shared) texture names
918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->surfaceManager->getToken(n, textures);
919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDeleteTextures(GLsizei n, const GLuint *textures)
922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (n<0) {
925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If deleting a bound texture, bind this unit to 0
930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (int t=0 ; t<GGL_TEXTURE_UNIT_COUNT ; t++) {
931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->textures.tmu[t].name == 0)
932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            continue;
933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i=0 ; i<n ; i++) {
934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (textures[i] && (textures[i] == c->textures.tmu[t].name)) {
935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // bind this tmu to texture 0
936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                sp<EGLTextureObject> tex(c->textures.defaultTexture);
937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                bindTextureTmu(c, t, 0, tex);
938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->surfaceManager->deleteTextures(n, textures);
942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->surfaceManager->recycleTokens(n, textures);
943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glMultiTexCoord4f(
946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (uint32_t(target-GL_TEXTURE0) > uint32_t(GGL_TEXTURE_UNIT_COUNT)) {
950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int tmu = target-GL_TEXTURE0;
954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.texture[tmu].S = gglFloatToFixed(s);
955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.texture[tmu].T = gglFloatToFixed(t);
956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.texture[tmu].R = gglFloatToFixed(r);
957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.texture[tmu].Q = gglFloatToFixed(q);
958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glMultiTexCoord4x(
961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (uint32_t(target-GL_TEXTURE0) > uint32_t(GGL_TEXTURE_UNIT_COUNT)) {
965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int tmu = target-GL_TEXTURE0;
969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.texture[tmu].S = s;
970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.texture[tmu].T = t;
971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.texture[tmu].R = r;
972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.texture[tmu].Q = q;
973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glPixelStorei(GLenum pname, GLint param)
976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((pname != GL_PACK_ALIGNMENT) && (pname != GL_UNPACK_ALIGNMENT)) {
979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
981076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((param<=0 || param>8) || (param & (param-1))) {
983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pname == GL_PACK_ALIGNMENT)
987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->textures.packAlignment = param;
988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pname == GL_UNPACK_ALIGNMENT)
989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->textures.unpackAlignment = param;
990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexEnvf(GLenum target, GLenum pname, GLfloat param)
993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.texEnvi(c, target, pname, GLint(param));
996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexEnvfv(
999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLenum pname, const GLfloat *params)
1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pname == GL_TEXTURE_ENV_MODE) {
1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.texEnvi(c, target, pname, GLint(*params));
1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pname == GL_TEXTURE_ENV_COLOR) {
1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GGLfixed fixed[4];
1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i=0 ; i<4 ; i++)
1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            fixed[i] = gglFloatToFixed(params[i]);
1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->rasterizer.procs.texEnvxv(c, target, pname, fixed);
1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_error(c, GL_INVALID_ENUM);
1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexEnvx(GLenum target, GLenum pname, GLfixed param)
1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.texEnvi(c, target, pname, param);
1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexEnvxv(
1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLenum pname, const GLfixed *params)
1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.texEnvxv(c, target, pname, params);
1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexParameteriv(
1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLenum pname, const GLint* params)
1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (target != GGL_TEXTURE_2D) {
1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLTextureObject* textureObject = c->textures.tmu[c->textures.active].texture;
1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (pname) {
1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_TEXTURE_CROP_RECT_OES:
1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        memcpy(textureObject->crop_rect, params, 4*sizeof(GLint));
1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
1044b12f99b31528a9ab9aa8f5c9fcfb57ad4c8b0517Mathias Agopian        texParameterx(target, pname, GLfixed(params[0]), c);
1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexParameterf(
1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLenum pname, GLfloat param)
1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    texParameterx(target, pname, GLfixed(param), c);
1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexParameterx(
1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLenum pname, GLfixed param)
1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    texParameterx(target, pname, param, c);
1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1063b12f99b31528a9ab9aa8f5c9fcfb57ad4c8b0517Mathias Agopianvoid glTexParameteri(
1064b12f99b31528a9ab9aa8f5c9fcfb57ad4c8b0517Mathias Agopian        GLenum target, GLenum pname, GLint param)
1065b12f99b31528a9ab9aa8f5c9fcfb57ad4c8b0517Mathias Agopian{
1066b12f99b31528a9ab9aa8f5c9fcfb57ad4c8b0517Mathias Agopian    ogles_context_t* c = ogles_context_t::get();
1067b12f99b31528a9ab9aa8f5c9fcfb57ad4c8b0517Mathias Agopian    texParameterx(target, pname, GLfixed(param), c);
1068b12f99b31528a9ab9aa8f5c9fcfb57ad4c8b0517Mathias Agopian}
1069b12f99b31528a9ab9aa8f5c9fcfb57ad4c8b0517Mathias Agopian
1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glCompressedTexImage2D(
1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLint level, GLenum internalformat,
1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLsizei width, GLsizei height, GLint border,
1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLsizei imageSize, const GLvoid *data)
1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (target != GL_TEXTURE_2D) {
1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (width<0 || height<0 || border!=0) {
1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1089edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // "uncompress" the texture since pixelflinger doesn't support
1091076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // any compressed texture format natively.
1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLenum format;
1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLenum type;
1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (internalformat) {
1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_RGB8_OES:
1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_RGB8_OES:
1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        format      = GL_RGB;
1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type        = GL_UNSIGNED_BYTE;
1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_RGBA8_OES:
1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_RGBA8_OES:
1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        format      = GL_RGBA;
1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type        = GL_UNSIGNED_BYTE;
1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_R5_G6_B5_OES:
1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_R5_G6_B5_OES:
1107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        format      = GL_RGB;
1108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type        = GL_UNSIGNED_SHORT_5_6_5;
1109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_RGBA4_OES:
1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_RGBA4_OES:
1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        format      = GL_RGBA;
1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type        = GL_UNSIGNED_SHORT_4_4_4_4;
1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE8_RGB5_A1_OES:
1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_PALETTE4_RGB5_A1_OES:
1117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        format      = GL_RGBA;
1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type        = GL_UNSIGNED_SHORT_5_5_5_1;
1119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
112018b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian#ifdef GL_OES_compressed_ETC1_RGB8_texture
112118b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian    case GL_ETC1_RGB8_OES:
112218b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian        format      = GL_RGB;
112318b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian        type        = GL_UNSIGNED_BYTE;
112418b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian        break;
112518b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian#endif
1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!data || !width || !height) {
1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // unclear if this is an error or not...
1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t size;
1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface* surface;
113818b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian
113918b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian#ifdef GL_OES_compressed_ETC1_RGB8_texture
114018b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian    if (internalformat == GL_ETC1_RGB8_OES) {
114118b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian        GLsizei compressedSize = etc1_get_encoded_data_size(width, height);
114218b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian        if (compressedSize > imageSize) {
114318b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian            ogles_error(c, GL_INVALID_VALUE);
114418b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian            return;
114518b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian        }
114618b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian        int error = createTextureSurface(c, &surface, &size,
114718b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian                level, format, type, width, height);
114818b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian        if (error) {
114918b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian            ogles_error(c, error);
115018b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian            return;
115118b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian        }
115218b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian        if (etc1_decode_image(
115318b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian                (const etc1_byte*)data,
115418b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian                (etc1_byte*)surface->data,
115518b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian                width, height, 3, surface->stride) != 0) {
115618b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian            ogles_error(c, GL_INVALID_OPERATION);
115718b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian        }
115818b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian        return;
115918b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian    }
116018b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian#endif
116118b915a1026dfe9d273ee3fd2139b7feed22008cMathias Agopian
1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // all mipmap levels are specified at once.
1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int numLevels = level<0 ? -level : 1;
1164cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich
1165cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    if (dataSizePalette4(numLevels, width, height, format) > imageSize) {
1166cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich        ogles_error(c, GL_INVALID_VALUE);
1167cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich        return;
1168cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich    }
1169cfa316b9e759ca0e9ee80fd275f441666532f9b1Jack Palevich
1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (int i=0 ; i<numLevels ; i++) {
1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int lod_w = (width  >> i) ? : 1;
1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int lod_h = (height >> i) ? : 1;
1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int error = createTextureSurface(c, &surface, &size,
1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                i, format, type, lod_w, lod_h);
1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (error) {
1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ogles_error(c, error);
1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        decodePalette4(data, i, width, height,
1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                surface->data, surface->stride, internalformat);
1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexImage2D(
1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLint level, GLint internalformat,
1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLsizei width, GLsizei height, GLint border,
1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum format, GLenum type, const GLvoid *pixels)
1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1191076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (target != GL_TEXTURE_2D) {
1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (width<0 || height<0 || border!=0 || level < 0) {
1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1199076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (format != (GLenum)internalformat) {
1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_OPERATION);
1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (validFormatType(c, format, type)) {
1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t size = 0;
1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface* surface = 0;
1209076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int error = createTextureSurface(c, &surface, &size,
1210076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            level, format, type, width, height);
1211076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (error) {
1212076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ogles_error(c, error);
1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixels) {
1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t formatIdx = convertGLPixelFormat(format, type);
1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GGLFormat& pixelFormat(c->rasterizer.formats[formatIdx]);
1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t align = c->textures.unpackAlignment-1;
1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t bpr = ((width * pixelFormat.size) + align) & ~align;
1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const size_t size = bpr * height;
1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t stride = bpr / pixelFormat.size;
1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GGLSurface userSurface;
1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        userSurface.version = sizeof(userSurface);
1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        userSurface.width  = width;
1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        userSurface.height = height;
1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        userSurface.stride = stride;
1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        userSurface.format = formatIdx;
1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        userSurface.compressedFormat = 0;
1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        userSurface.data = (GLubyte*)pixels;
1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1233076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        int err = copyPixels(c, *surface, 0, 0, userSurface, 0, 0, width, height);
1234076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        if (err) {
1235076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            ogles_error(c, err);
1236076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            return;
1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1238076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        generateMipmap(c, level);
1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glCompressedTexSubImage2D(
1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLint level, GLint xoffset,
1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLint yoffset, GLsizei width, GLsizei height,
1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum format, GLsizei imageSize,
1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLvoid *data)
1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_error(c, GL_INVALID_ENUM);
1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexSubImage2D(
1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLint level, GLint xoffset,
1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLint yoffset, GLsizei width, GLsizei height,
1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum format, GLenum type, const GLvoid *pixels)
1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (target != GL_TEXTURE_2D) {
1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (xoffset<0 || yoffset<0 || width<0 || height<0 || level<0) {
1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (validFormatType(c, format, type)) {
1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // find out which texture is bound to the current unit
1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int active = c->textures.active;
1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLTextureObject* tex = c->textures.tmu[active].texture;
1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GGLSurface& surface(tex->mip(level));
1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!tex->internalformat || tex->direct) {
1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_OPERATION);
1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1281d13e46158afd6ff23178f015285535e5bf00dd2cMathias Agopian
1282d13e46158afd6ff23178f015285535e5bf00dd2cMathias Agopian    if (format != tex->internalformat) {
1283d13e46158afd6ff23178f015285535e5bf00dd2cMathias Agopian        ogles_error(c, GL_INVALID_OPERATION);
1284d13e46158afd6ff23178f015285535e5bf00dd2cMathias Agopian        return;
1285d13e46158afd6ff23178f015285535e5bf00dd2cMathias Agopian    }
1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((xoffset + width  > GLsizei(surface.width)) ||
1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        (yoffset + height > GLsizei(surface.height))) {
1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!width || !height) {
1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return; // okay, but no-op.
1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // figure out the size we need as well as the stride
1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t formatIdx = convertGLPixelFormat(format, type);
1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (formatIdx == 0) { // we don't know what to do with this
1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_OPERATION);
1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GGLFormat& pixelFormat(c->rasterizer.formats[formatIdx]);
1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t align = c->textures.unpackAlignment-1;
1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t bpr = ((width * pixelFormat.size) + align) & ~align;
1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const size_t size = bpr * height;
1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t stride = bpr / pixelFormat.size;
1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface userSurface;
1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.version = sizeof(userSurface);
1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.width  = width;
1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.height = height;
1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.stride = stride;
1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.format = formatIdx;
1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.compressedFormat = 0;
1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.data = (GLubyte*)pixels;
1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int err = copyPixels(c,
1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            surface, xoffset, yoffset,
1318076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            userSurface, 0, 0, width, height);
1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (err) {
1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, err);
1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    generateMipmap(c, level);
1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // since we only changed the content of the texture, we don't need
1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // to call bindTexture on the main rasterizer.
1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glCopyTexImage2D(
1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLint level, GLenum internalformat,
1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLint x, GLint y, GLsizei width, GLsizei height,
1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLint border)
1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (target != GL_TEXTURE_2D) {
1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (internalformat<GL_ALPHA || internalformat>GL_LUMINANCE_ALPHA) {
1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (width<0 || height<0 || border!=0 || level<0) {
1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLenum format = 0;
1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLenum type = GL_UNSIGNED_BYTE;
1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GGLSurface& cbSurface = c->rasterizer.state.buffers.color.s;
1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int cbFormatIdx = cbSurface.format;
1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (cbFormatIdx) {
1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_RGB_565:
1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type = GL_UNSIGNED_SHORT_5_6_5;
1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_RGBA_5551:
1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type = GL_UNSIGNED_SHORT_5_5_5_1;
1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_RGBA_4444:
1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type = GL_UNSIGNED_SHORT_4_4_4_4;
1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (internalformat) {
1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_ALPHA:
1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_LUMINANCE_ALPHA:
1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_LUMINANCE:
1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        type = GL_UNSIGNED_BYTE;
1371076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        break;
1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // figure out the format to use for the new texture
1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (cbFormatIdx) {
1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_RGBA_8888:
1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_A_8:
1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_RGBA_5551:
1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_RGBA_4444:
1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        format = internalformat;
1381076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        break;
1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_RGBX_8888:
1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_RGB_888:
1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_RGB_565:
1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GGL_PIXEL_FORMAT_L_8:
1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        switch (internalformat) {
1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GL_LUMINANCE:
1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GL_RGB:
1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            format = internalformat;
1390076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            break;
1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (format == 0) {
1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // invalid combination
1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // create the new texture...
1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t size;
1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface* surface;
1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int error = createTextureSurface(c, &surface, &size,
1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            level, format, type, width, height);
1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (error) {
1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, error);
1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1410076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // The bottom row is stored first in textures
1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface txSurface(*surface);
1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    txSurface.stride = -txSurface.stride;
1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // (x,y) is the lower-left corner of colorBuffer
1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    y = cbSurface.height - (y + height);
1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1418fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian    /* The GLES spec says:
1419fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian     * If any of the pixels within the specified rectangle are outside
1420fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian     * the framebuffer associated with the current rendering context,
1421fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian     * then the values obtained for those pixels are undefined.
1422fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian     */
1423fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian    if (x+width > GLint(cbSurface.width))
1424fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian        width = cbSurface.width - x;
1425fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian
1426fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian    if (y+height > GLint(cbSurface.height))
1427fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian        height = cbSurface.height - y;
1428fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian
1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int err = copyPixels(c,
1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            txSurface, 0, 0,
1431fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian            cbSurface, x, y, width, height);
1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (err) {
1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, err);
1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    generateMipmap(c, level);
1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glCopyTexSubImage2D(
1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum target, GLint level, GLint xoffset, GLint yoffset,
1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLint x, GLint y, GLsizei width, GLsizei height)
1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (target != GL_TEXTURE_2D) {
1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (xoffset<0 || yoffset<0 || width<0 || height<0 || level<0) {
1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!width || !height) {
1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return; // okay, but no-op.
1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // find out which texture is bound to the current unit
1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int active = c->textures.active;
1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLTextureObject* tex = c->textures.tmu[active].texture;
1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GGLSurface& surface(tex->mip(level));
1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!tex->internalformat) {
1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_OPERATION);
1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((xoffset + width  > GLsizei(surface.width)) ||
1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        (yoffset + height > GLsizei(surface.height))) {
1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // The bottom row is stored first in textures
1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface txSurface(surface);
1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    txSurface.stride = -txSurface.stride;
1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // (x,y) is the lower-left corner of colorBuffer
1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GGLSurface& cbSurface = c->rasterizer.state.buffers.color.s;
1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    y = cbSurface.height - (y + height);
1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1479fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian    /* The GLES spec says:
1480fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian     * If any of the pixels within the specified rectangle are outside
1481fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian     * the framebuffer associated with the current rendering context,
1482fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian     * then the values obtained for those pixels are undefined.
1483fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian     */
1484fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian    if (x+width > GLint(cbSurface.width))
1485fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian        width = cbSurface.width - x;
1486fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian
1487fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian    if (y+height > GLint(cbSurface.height))
1488fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian        height = cbSurface.height - y;
1489fda42f318a2f6508ed87e51a02bd588db2ddb464Mathias Agopian
1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int err = copyPixels(c,
1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            surface, xoffset, yoffset,
1492076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            cbSurface, x, y, width, height);
1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (err) {
1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, err);
1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    generateMipmap(c, level);
1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glReadPixels(
1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLint x, GLint y, GLsizei width, GLsizei height,
1503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum format, GLenum type, GLvoid *pixels)
1504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((format != GL_RGBA) && (format != GL_RGB)) {
1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((type != GL_UNSIGNED_BYTE) && (type != GL_UNSIGNED_SHORT_5_6_5)) {
1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (width<0 || height<0) {
1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (x<0 || x<0) {
1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t formatIdx = GGL_PIXEL_FORMAT_NONE;
1524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((format == GL_RGBA) && (type == GL_UNSIGNED_BYTE)) {
1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        formatIdx = GGL_PIXEL_FORMAT_RGBA_8888;
1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else if ((format == GL_RGB) && (type == GL_UNSIGNED_SHORT_5_6_5)) {
1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        formatIdx = GGL_PIXEL_FORMAT_RGB_565;
1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_OPERATION);
1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GGLSurface& readSurface = c->rasterizer.state.buffers.read.s;
1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((x+width > GLint(readSurface.width)) ||
1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (y+height > GLint(readSurface.height))) {
1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GGLFormat& pixelFormat(c->rasterizer.formats[formatIdx]);
1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t align = c->textures.packAlignment-1;
1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t bpr = ((width * pixelFormat.size) + align) & ~align;
1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t stride = bpr / pixelFormat.size;
1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface userSurface;
1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.version = sizeof(userSurface);
1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.width  = width;
1548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.height = height;
1549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.stride = -stride; // bottom row is transfered first
1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.format = formatIdx;
1551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.compressedFormat = 0;
1552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    userSurface.data = (GLubyte*)pixels;
1553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // use pixel-flinger to handle all the conversions
1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLContext* ggl = getRasterizer(c);
1556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!ggl) {
1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // the only reason this would fail is because we ran out of memory
1558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_OUT_OF_MEMORY);
1559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1562076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    ggl->colorBuffer(ggl, &userSurface);  // destination is user buffer
1563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ggl->bindTexture(ggl, &readSurface);  // source is read-buffer
1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ggl->texCoord2i(ggl, x, readSurface.height - (y + height));
1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ggl->recti(ggl, 0, 0, width, height);
1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark DrawTexture Extension
1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawTexsvOES(const GLshort* coords) {
1575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawTexiOES(coords[0], coords[1], coords[2], coords[3], coords[4], c);
1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawTexivOES(const GLint* coords) {
1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawTexiOES(coords[0], coords[1], coords[2], coords[3], coords[4], c);
1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawTexsOES(GLshort x , GLshort y, GLshort z, GLshort w, GLshort h) {
1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawTexiOES(x, y, z, w, h, c);
1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawTexiOES(GLint x, GLint y, GLint z, GLint w, GLint h) {
1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawTexiOES(x, y, z, w, h, c);
1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawTexfvOES(const GLfloat* coords) {
1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawTexxOES(
1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFloatToFixed(coords[0]),
1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFloatToFixed(coords[1]),
1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFloatToFixed(coords[2]),
1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFloatToFixed(coords[3]),
1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFloatToFixed(coords[4]),
1599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c);
1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawTexxvOES(const GLfixed* coords) {
1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawTexxOES(coords[0], coords[1], coords[2], coords[3], coords[4], c);
1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawTexfOES(GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h){
1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawTexxOES(
1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFloatToFixed(x), gglFloatToFixed(y), gglFloatToFixed(z),
1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFloatToFixed(w), gglFloatToFixed(h),
1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c);
1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawTexxOES(GLfixed x, GLfixed y, GLfixed z, GLfixed w, GLfixed h) {
1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawTexxOES(x, y, z, w, h, c);
1615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1616076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1617076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ----------------------------------------------------------------------------
1618076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#if 0
1619076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#pragma mark -
1620076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#pragma mark EGL Image Extension
1621076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif
1622076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1623076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
1624076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
1625076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    ogles_context_t* c = ogles_context_t::get();
1626076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (target != GL_TEXTURE_2D) {
1627076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ogles_error(c, GL_INVALID_ENUM);
1628076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return;
1629076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1630076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1631076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)image;
1632076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) {
1633076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ogles_error(c, GL_INVALID_VALUE);
1634076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return;
1635076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1636076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t)) {
1637076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ogles_error(c, GL_INVALID_VALUE);
1638076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return;
1639076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1640076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1641076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // bind it to the texture unit
1642076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sp<EGLTextureObject> tex = getAndBindActiveTextureObject(c);
16430926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    tex->setImage(native_buffer);
1644076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1645076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
16460a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian    tex->try_copybit = false;
1647f13901eaa98241b52062a3ae3b016badce3dee0cMathias Agopian    if (c->copybits.blitEngine != NULL) {
16480a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian        tex->try_copybit = true;
1649076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1650076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS
1651076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
1652076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1653076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
1654076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
1655076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
1656