19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* libs/opengles/texture.cpp
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2006, The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
51473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian** Licensed under the Apache License, Version 2.0 (the "License");
61473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian** you may not use this file except in compliance with the License.
71473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
91473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian**     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
111473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian** Unless required by applicable law or agreed to in writing, software
121473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian** distributed under the License is distributed on an "AS IS" BASIS,
131473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian** See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h>
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "context.h"
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "fp.h"
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "state.h"
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "texture.h"
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "TextureObjectManager.h"
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26b51e18d59b6f8e44a5d3516fc3359c54fa913331Mathias Agopian#include <private/ui/android_natives_priv.h>
271473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
291473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#include "copybit.h"
301473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS
311473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void bindTextureTmu(
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c, int tmu, GLuint texture, const sp<EGLTextureObject>& tex);
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic __attribute__((noinline))
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid generateMipmap(ogles_context_t* c, GLint level);
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark -
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark Init
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid ogles_init_texture(ogles_context_t* c)
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->textures.packAlignment   = 4;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->textures.unpackAlignment = 4;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // each context has a default named (0) texture (not shared)
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->textures.defaultTexture = new EGLTextureObject();
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->textures.defaultTexture->incStrong(c);
571473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // bind the default texture to each texture unit
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (int i=0; i<GGL_TEXTURE_UNIT_COUNT ; i++) {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bindTextureTmu(c, i, 0, c->textures.defaultTexture);
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        memset(c->current.texture[i].v, 0, sizeof(vec4_t));
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->current.texture[i].Q = 0x10000;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid ogles_uninit_texture(ogles_context_t* c)
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c->textures.ggl)
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        gglUninit(c->textures.ggl);
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->textures.defaultTexture->decStrong(c);
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (int i=0; i<GGL_TEXTURE_UNIT_COUNT ; i++) {
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c->textures.tmu[i].texture)
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->textures.tmu[i].texture->decStrong(c);
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic __attribute__((noinline))
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid validate_tmu(ogles_context_t* c, int i)
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    texture_unit_t& u(c->textures.tmu[i]);
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (u.dirty) {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        u.dirty = 0;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->rasterizer.procs.activeTexture(c, i);
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->rasterizer.procs.bindTexture(c, &(u.texture->surface));
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->rasterizer.procs.texGeni(c, GGL_S,
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GGL_TEXTURE_GEN_MODE, GGL_AUTOMATIC);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->rasterizer.procs.texGeni(c, GGL_T,
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GGL_TEXTURE_GEN_MODE, GGL_AUTOMATIC);
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->rasterizer.procs.texParameteri(c, GGL_TEXTURE_2D,
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GGL_TEXTURE_WRAP_S, u.texture->wraps);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->rasterizer.procs.texParameteri(c, GGL_TEXTURE_2D,
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GGL_TEXTURE_WRAP_T, u.texture->wrapt);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->rasterizer.procs.texParameteri(c, GGL_TEXTURE_2D,
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GGL_TEXTURE_MIN_FILTER, u.texture->min_filter);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->rasterizer.procs.texParameteri(c, GGL_TEXTURE_2D,
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GGL_TEXTURE_MAG_FILTER, u.texture->mag_filter);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // disable this texture unit if it's not complete
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!u.texture->isComplete()) {
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->rasterizer.procs.disable(c, GGL_TEXTURE_2D);
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
105dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopianvoid ogles_validate_texture(ogles_context_t* c)
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; i++) {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c->rasterizer.state.texture[i].enable)
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            validate_tmu(c, i);
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->rasterizer.procs.activeTexture(c, c->textures.active);
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid invalidate_texture(ogles_context_t* c, int tmu, uint8_t flags = 0xFF) {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->textures.tmu[tmu].dirty = flags;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
119dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian/*
120dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian * If the active textures are EGLImage, they need to be locked before
121fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich * they can be used.
122fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich *
123dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian * FIXME: code below is far from being optimal
124fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich *
125dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian */
126dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
127dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopianvoid ogles_lock_textures(ogles_context_t* c)
128dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian{
129dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; i++) {
130dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian        if (c->rasterizer.state.texture[i].enable) {
131dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian            texture_unit_t& u(c->textures.tmu[i]);
132dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian            android_native_buffer_t* native_buffer = u.texture->buffer;
133dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian            if (native_buffer) {
134dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian                c->rasterizer.procs.activeTexture(c, i);
135dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian                hw_module_t const* pModule;
136dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian                if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule))
137dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian                    continue;
138dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
139dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian                gralloc_module_t const* module =
140dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian                    reinterpret_cast<gralloc_module_t const*>(pModule);
141e633f9339a2556771c79c784b0b23a9aade30485Mathias Agopian
142430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                void* vaddr;
143e633f9339a2556771c79c784b0b23a9aade30485Mathias Agopian                int err = module->lock(module, native_buffer->handle,
144dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian                        GRALLOC_USAGE_SW_READ_OFTEN,
145dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian                        0, 0, native_buffer->width, native_buffer->height,
146430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                        &vaddr);
147dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
148430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                u.texture->setImageBits(vaddr);
149dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian                c->rasterizer.procs.bindTexture(c, &(u.texture->surface));
150dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian            }
151dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian        }
152dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    }
153dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian}
154dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
155dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopianvoid ogles_unlock_textures(ogles_context_t* c)
156dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian{
157dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; i++) {
158dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian        if (c->rasterizer.state.texture[i].enable) {
159dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian            texture_unit_t& u(c->textures.tmu[i]);
160dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian            android_native_buffer_t* native_buffer = u.texture->buffer;
161dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian            if (native_buffer) {
162dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian                c->rasterizer.procs.activeTexture(c, i);
163dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian                hw_module_t const* pModule;
164dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian                if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule))
165dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian                    continue;
166dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
167dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian                gralloc_module_t const* module =
168dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian                    reinterpret_cast<gralloc_module_t const*>(pModule);
169e633f9339a2556771c79c784b0b23a9aade30485Mathias Agopian
170e633f9339a2556771c79c784b0b23a9aade30485Mathias Agopian                module->unlock(module, native_buffer->handle);
171dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian                u.texture->setImageBits(NULL);
172dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian                c->rasterizer.procs.bindTexture(c, &(u.texture->surface));
173dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian            }
174dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian        }
175dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    }
176dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    c->rasterizer.procs.activeTexture(c, c->textures.active);
177dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian}
178dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark -
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark Format conversion
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic uint32_t gl2format_table[6][4] = {
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // BYTE, 565, 4444, 5551
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { GGL_PIXEL_FORMAT_A_8,
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      0, 0, 0 },                        // GL_ALPHA
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { GGL_PIXEL_FORMAT_RGB_888,
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      GGL_PIXEL_FORMAT_RGB_565,
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      0, 0 },                           // GL_RGB
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { GGL_PIXEL_FORMAT_RGBA_8888,
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      0,
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      GGL_PIXEL_FORMAT_RGBA_4444,
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      GGL_PIXEL_FORMAT_RGBA_5551 },     // GL_RGBA
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { GGL_PIXEL_FORMAT_L_8,
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      0, 0, 0 },                        // GL_LUMINANCE
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { GGL_PIXEL_FORMAT_LA_88,
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      0, 0, 0 },                        // GL_LUMINANCE_ALPHA
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t convertGLPixelFormat(GLint format, GLenum type)
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t fi = -1;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t ti = -1;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (format) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_ALPHA:              fi = 0;     break;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_RGB:                fi = 1;     break;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_RGBA:               fi = 2;     break;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_LUMINANCE:          fi = 3;     break;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_LUMINANCE_ALPHA:    fi = 4;     break;
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (type) {
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_UNSIGNED_BYTE:          ti = 0; break;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_UNSIGNED_SHORT_5_6_5:   ti = 1; break;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_UNSIGNED_SHORT_4_4_4_4: ti = 2; break;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_UNSIGNED_SHORT_5_5_5_1: ti = 3; break;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fi==-1 || ti==-1)
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return gl2format_table[fi][ti];
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic GLenum validFormatType(ogles_context_t* c, GLenum format, GLenum type)
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLenum error = 0;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (format<GL_ALPHA || format>GL_LUMINANCE_ALPHA) {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        error = GL_INVALID_ENUM;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (type != GL_UNSIGNED_BYTE && type != GL_UNSIGNED_SHORT_4_4_4_4 &&
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type != GL_UNSIGNED_SHORT_5_5_5_1 && type != GL_UNSIGNED_SHORT_5_6_5) {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        error = GL_INVALID_ENUM;
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (type == GL_UNSIGNED_SHORT_5_6_5 && format != GL_RGB) {
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        error = GL_INVALID_OPERATION;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((type == GL_UNSIGNED_SHORT_4_4_4_4 ||
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         type == GL_UNSIGNED_SHORT_5_5_5_1)  && format != GL_RGBA) {
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        error = GL_INVALID_OPERATION;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (error) {
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, error);
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return error;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGGLContext* getRasterizer(ogles_context_t* c)
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLContext* ggl = c->textures.ggl;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_unlikely(!ggl)) {
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is quite heavy the first time...
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        gglInit(&ggl);
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!ggl) {
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GGLfixed colors[4] = { 0, 0, 0, 0x10000 };
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->textures.ggl = ggl;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ggl->activeTexture(ggl, 0);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ggl->enable(ggl, GGL_TEXTURE_2D);
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ggl->texEnvi(ggl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE);
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ggl->disable(ggl, GGL_DITHER);
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ggl->shadeModel(ggl, GGL_FLAT);
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ggl->color4xv(ggl, colors);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return ggl;
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic __attribute__((noinline))
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint copyPixels(
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_context_t* c,
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const GGLSurface& dst,
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLint xoffset, GLint yoffset,
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const GGLSurface& src,
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLint x, GLint y, GLsizei w, GLsizei h)
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((dst.format == src.format) &&
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (dst.stride == src.stride) &&
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (dst.width == src.width) &&
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (dst.height == src.height) &&
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (dst.stride > 0) &&
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ((x|y) == 0) &&
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ((xoffset|yoffset) == 0))
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is a common case...
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const GGLFormat& pixelFormat(c->rasterizer.formats[src.format]);
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const size_t size = src.height * src.stride * pixelFormat.size;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        memcpy(dst.data, src.data, size);
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // use pixel-flinger to handle all the conversions
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLContext* ggl = getRasterizer(c);
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!ggl) {
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the only reason this would fail is because we ran out of memory
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return GL_OUT_OF_MEMORY;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ggl->colorBuffer(ggl, &dst);
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ggl->bindTexture(ggl, &src);
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ggl->texCoord2i(ggl, x-xoffset, y-yoffset);
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ggl->recti(ggl, xoffset, yoffset, xoffset+w, yoffset+h);
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic __attribute__((noinline))
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<EGLTextureObject> getAndBindActiveTextureObject(ogles_context_t* c)
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<EGLTextureObject> tex;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int active = c->textures.active;
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const GLuint name = c->textures.tmu[active].name;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // free the reference to the previously bound object
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    texture_unit_t& u(c->textures.tmu[active]);
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (u.texture)
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        u.texture->decStrong(c);
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (name == 0) {
3241473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        // 0 is our local texture object, not shared with anyone.
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // But it affects all bound TMUs immediately.
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // (we need to invalidate all units bound to this texture object)
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tex = c->textures.defaultTexture;
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; i++) {
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c->textures.tmu[i].texture == tex.get())
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                invalidate_texture(c, i);
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // get a new texture object for that name
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tex = c->surfaceManager->replaceTexture(name);
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // bind this texture to the current active texture unit
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // and add a reference to this texture object
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    u.texture = tex.get();
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    u.texture->incStrong(c);
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    u.name = name;
3421473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    invalidate_texture(c, active);
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return tex;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid bindTextureTmu(
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c, int tmu, GLuint texture, const sp<EGLTextureObject>& tex)
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (tex.get() == c->textures.tmu[tmu].texture)
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
3511473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // free the reference to the previously bound object
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    texture_unit_t& u(c->textures.tmu[tmu]);
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (u.texture)
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        u.texture->decStrong(c);
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // bind this texture to the current active texture unit
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // and add a reference to this texture object
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    u.texture = tex.get();
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    u.texture->incStrong(c);
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    u.name = texture;
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    invalidate_texture(c, tmu);
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint createTextureSurface(ogles_context_t* c,
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GGLSurface** outSurface, int32_t* outSize, GLint level,
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum format, GLenum type, GLsizei width, GLsizei height,
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum compressedFormat = 0)
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // find out which texture is bound to the current unit
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int active = c->textures.active;
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const GLuint name = c->textures.tmu[active].name;
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // convert the pixelformat to one we can handle
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int32_t formatIdx = convertGLPixelFormat(format, type);
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (formatIdx == 0) { // we don't know what to do with this
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return GL_INVALID_OPERATION;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3791473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // figure out the size we need as well as the stride
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const GGLFormat& pixelFormat(c->rasterizer.formats[formatIdx]);
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int32_t align = c->textures.unpackAlignment-1;
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int32_t bpr = ((width * pixelFormat.size) + align) & ~align;
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t size = bpr * height;
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int32_t stride = bpr / pixelFormat.size;
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (level > 0) {
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const int active = c->textures.active;
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLTextureObject* tex = c->textures.tmu[active].texture;
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t err = tex->reallocate(level,
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                width, height, stride, formatIdx, compressedFormat, bpr);
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (err != NO_ERROR)
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return GL_OUT_OF_MEMORY;
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GGLSurface& surface = tex->editMip(level);
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *outSurface = &surface;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *outSize = size;
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<EGLTextureObject> tex = getAndBindActiveTextureObject(c);
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t err = tex->reallocate(level,
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            width, height, stride, formatIdx, compressedFormat, bpr);
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err != NO_ERROR)
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return GL_OUT_OF_MEMORY;
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    tex->internalformat = format;
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    *outSurface = &tex->surface;
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    *outSize = size;
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
412fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevichstatic size_t dataSizePalette4(int numLevels, int width, int height, int format)
413fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich{
414fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    int indexBits = 8;
415fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    int entrySize = 0;
416fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    switch (format) {
417fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    case GL_PALETTE4_RGB8_OES:
418fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich        indexBits = 4;
419fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich        /* FALLTHROUGH */
420fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    case GL_PALETTE8_RGB8_OES:
421fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich        entrySize = 3;
422fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich        break;
423fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich
424fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    case GL_PALETTE4_RGBA8_OES:
425fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich        indexBits = 4;
426fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich        /* FALLTHROUGH */
427fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    case GL_PALETTE8_RGBA8_OES:
428fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich        entrySize = 4;
429fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich        break;
430fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich
431fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    case GL_PALETTE4_R5_G6_B5_OES:
432fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    case GL_PALETTE4_RGBA4_OES:
433fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    case GL_PALETTE4_RGB5_A1_OES:
434fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich        indexBits = 4;
435fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich        /* FALLTHROUGH */
436fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    case GL_PALETTE8_R5_G6_B5_OES:
437fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    case GL_PALETTE8_RGBA4_OES:
438fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    case GL_PALETTE8_RGB5_A1_OES:
439fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich        entrySize = 2;
440fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich        break;
441fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    }
442fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich
443fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    size_t size = (1 << indexBits) * entrySize; // palette size
444fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich
445fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    for (int i=0 ; i< numLevels ; i++) {
446fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich        int w = (width  >> i) ? : 1;
447fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich        int h = (height >> i) ? : 1;
448fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich        int levelSize = h * ((w * indexBits) / 8) ? : 1;
449fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich        size += levelSize;
450fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    }
451fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich
452fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    return size;
453fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich}
454fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void decodePalette4(const GLvoid *data, int level, int width, int height,
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           void *surface, int stride, int format)
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int indexBits = 8;
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int entrySize = 0;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (format) {
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE4_RGB8_OES:
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        indexBits = 4;
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* FALLTHROUGH */
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE8_RGB8_OES:
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        entrySize = 3;
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE4_RGBA8_OES:
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        indexBits = 4;
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* FALLTHROUGH */
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE8_RGBA8_OES:
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        entrySize = 4;
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE4_R5_G6_B5_OES:
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE4_RGBA4_OES:
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE4_RGB5_A1_OES:
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        indexBits = 4;
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* FALLTHROUGH */
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE8_R5_G6_B5_OES:
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE8_RGBA4_OES:
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE8_RGB5_A1_OES:
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        entrySize = 2;
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int paletteSize = (1 << indexBits) * entrySize;
489fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t const* pixels = (uint8_t *)data + paletteSize;
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (int i=0 ; i<level ; i++) {
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int w = (width  >> i) ? : 1;
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int h = (height >> i) ? : 1;
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pixels += h * ((w * indexBits) / 8);
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    width  = (width  >> level) ? : 1;
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    height = (height >> level) ? : 1;
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (entrySize == 2) {
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint8_t const* const palette = (uint8_t*)data;
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int y=0 ; y<height ; y++) {
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint8_t* p = (uint8_t*)surface + y*stride*2;
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (indexBits == 8) {
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int x=0 ; x<width ; x++) {
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int index = 2 * (*pixels++);
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p++ = palette[index + 0];
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p++ = palette[index + 1];
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int x=0 ; x<width ; x+=2) {
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int v = *pixels++;
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int index = 2 * (v >> 4);
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p++ = palette[index + 0];
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p++ = palette[index + 1];
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (x+1 < width) {
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        index = 2 * (v & 0xF);
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        *p++ = palette[index + 0];
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        *p++ = palette[index + 1];
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (entrySize == 3) {
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint8_t const* const palette = (uint8_t*)data;
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int y=0 ; y<height ; y++) {
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint8_t* p = (uint8_t*)surface + y*stride*3;
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (indexBits == 8) {
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int x=0 ; x<width ; x++) {
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int index = 3 * (*pixels++);
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p++ = palette[index + 0];
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p++ = palette[index + 1];
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p++ = palette[index + 2];
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int x=0 ; x<width ; x+=2) {
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int v = *pixels++;
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int index = 3 * (v >> 4);
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p++ = palette[index + 0];
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p++ = palette[index + 1];
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p++ = palette[index + 2];
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (x+1 < width) {
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        index = 3 * (v & 0xF);
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        *p++ = palette[index + 0];
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        *p++ = palette[index + 1];
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        *p++ = palette[index + 2];
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (entrySize == 4) {
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint8_t const* const palette = (uint8_t*)data;
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int y=0 ; y<height ; y++) {
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint8_t* p = (uint8_t*)surface + y*stride*4;
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (indexBits == 8) {
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int x=0 ; x<width ; x++) {
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int index = 4 * (*pixels++);
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p++ = palette[index + 0];
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p++ = palette[index + 1];
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p++ = palette[index + 2];
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p++ = palette[index + 3];
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int x=0 ; x<width ; x+=2) {
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int v = *pixels++;
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int index = 4 * (v >> 4);
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p++ = palette[index + 0];
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p++ = palette[index + 1];
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p++ = palette[index + 2];
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p++ = palette[index + 3];
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (x+1 < width) {
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        index = 4 * (v & 0xF);
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        *p++ = palette[index + 0];
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        *p++ = palette[index + 1];
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        *p++ = palette[index + 2];
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        *p++ = palette[index + 3];
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic __attribute__((noinline))
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid set_depth_and_fog(ogles_context_t* c, GLint z)
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const uint32_t enables = c->rasterizer.state.enables;
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // we need to compute Zw
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t iterators[3];
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    iterators[1] = iterators[2] = 0;
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLfixed Zw;
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLfixed n = gglFloatToFixed(c->transforms.vpt.zNear);
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLfixed f = gglFloatToFixed(c->transforms.vpt.zFar);
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (z<=0)       Zw = n;
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else if (z>=1)  Zw = f;
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else            Zw = gglMulAddx(z, (f-n), n);
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (enables & GGL_ENABLE_FOG) {
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // set up fog if needed...
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        iterators[0] = c->fog.fog(c, Zw);
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->rasterizer.procs.fogGrad3xv(c, iterators);
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (enables & GGL_ENABLE_DEPTH_TEST) {
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // set up z-test if needed...
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t z = (Zw & ~(Zw>>31));
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (z >= 0x10000)
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            z = 0xFFFF;
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        iterators[0] = (z << 16) | z;
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->rasterizer.procs.zGrad3xv(c, iterators);
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark -
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark Generate mimaps
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern status_t buildAPyramid(ogles_context_t* c, EGLTextureObject* tex);
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid generateMipmap(ogles_context_t* c, GLint level)
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (level == 0) {
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const int active = c->textures.active;
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLTextureObject* tex = c->textures.tmu[active].texture;
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (tex->generate_mipmap) {
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (buildAPyramid(c, tex) != NO_ERROR) {
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ogles_error(c, GL_OUT_OF_MEMORY);
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void texParameterx(
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum target, GLenum pname, GLfixed param, ogles_context_t* c)
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (target != GL_TEXTURE_2D) {
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6431473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
6441473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    EGLTextureObject* textureObject = c->textures.tmu[c->textures.active].texture;
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (pname) {
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_TEXTURE_WRAP_S:
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((param == GL_REPEAT) ||
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (param == GL_CLAMP_TO_EDGE)) {
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            textureObject->wraps = param;
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto invalid_enum;
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_TEXTURE_WRAP_T:
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((param == GL_REPEAT) ||
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (param == GL_CLAMP_TO_EDGE)) {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            textureObject->wrapt = param;
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto invalid_enum;
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_TEXTURE_MIN_FILTER:
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((param == GL_NEAREST) ||
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (param == GL_LINEAR) ||
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (param == GL_NEAREST_MIPMAP_NEAREST) ||
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (param == GL_LINEAR_MIPMAP_NEAREST) ||
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (param == GL_NEAREST_MIPMAP_LINEAR) ||
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (param == GL_LINEAR_MIPMAP_LINEAR)) {
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            textureObject->min_filter = param;
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto invalid_enum;
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_TEXTURE_MAG_FILTER:
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((param == GL_NEAREST) ||
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (param == GL_LINEAR)) {
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            textureObject->mag_filter = param;
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto invalid_enum;
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_GENERATE_MIPMAP:
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        textureObject->generate_mipmap = param;
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinvalid_enum:
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    invalidate_texture(c, c->textures.active);
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6941473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
6951473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianstatic void drawTexxOESImp(GLfixed x, GLfixed y, GLfixed z, GLfixed w, GLfixed h,
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_context_t* c)
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
698dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    ogles_lock_textures(c);
699fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const GGLSurface& cbSurface = c->rasterizer.state.buffers.color.s;
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    y = gglIntToFixed(cbSurface.height) - (y + h);
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    w >>= FIXED_BITS;
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    h >>= FIXED_BITS;
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // set up all texture units
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; i++) {
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!c->rasterizer.state.texture[i].enable)
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            continue;
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t texcoords[8];
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        texture_unit_t& u(c->textures.tmu[i]);
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // validate this tmu (bind, wrap, filter)
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validate_tmu(c, i);
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // we CLAMP here, which works with premultiplied (s,t)
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->rasterizer.procs.texParameteri(c,
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GGL_TEXTURE_2D, GGL_TEXTURE_WRAP_S, GGL_CLAMP);
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->rasterizer.procs.texParameteri(c,
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GGL_TEXTURE_2D, GGL_TEXTURE_WRAP_T, GGL_CLAMP);
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        u.dirty = 0xFF; // XXX: should be more subtle
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7221473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        EGLTextureObject* textureObject = u.texture;
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const GLint Ucr = textureObject->crop_rect[0] << 16;
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const GLint Vcr = textureObject->crop_rect[1] << 16;
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const GLint Wcr = textureObject->crop_rect[2] << 16;
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const GLint Hcr = textureObject->crop_rect[3] << 16;
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // computes texture coordinates (pre-multiplied)
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t dsdx = Wcr / w;   // dsdx =  ((Wcr/w)/Wt)*Wt
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t dtdy =-Hcr / h;   // dtdy = -((Hcr/h)/Ht)*Ht
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t s0   = Ucr       - gglMulx(dsdx, x); // s0 = Ucr - x * dsdx
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t t0   = (Vcr+Hcr) - gglMulx(dtdy, y); // t0 = (Vcr+Hcr) - y*dtdy
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        texcoords[0] = s0;
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        texcoords[1] = dsdx;
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        texcoords[2] = 0;
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        texcoords[3] = t0;
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        texcoords[4] = 0;
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        texcoords[5] = dtdy;
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        texcoords[6] = 0;
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        texcoords[7] = 0;
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->rasterizer.procs.texCoordGradScale8xv(c, i, texcoords);
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const uint32_t enables = c->rasterizer.state.enables;
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_unlikely(enables & (GGL_ENABLE_DEPTH_TEST|GGL_ENABLE_FOG)))
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        set_depth_and_fog(c, z);
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->rasterizer.procs.activeTexture(c, c->textures.active);
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->rasterizer.procs.color4xv(c, c->currentColorClamped.v);
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->rasterizer.procs.disable(c, GGL_W_LERP);
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->rasterizer.procs.disable(c, GGL_AA);
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->rasterizer.procs.shadeModel(c, GL_FLAT);
7531473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    c->rasterizer.procs.recti(c,
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gglFixedToIntRound(x),
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gglFixedToIntRound(y),
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gglFixedToIntRound(x)+w,
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gglFixedToIntRound(y)+h);
758dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
759dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    ogles_unlock_textures(c);
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7621473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianstatic void drawTexxOES(GLfixed x, GLfixed y, GLfixed z, GLfixed w, GLfixed h,
7631473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        ogles_context_t* c)
7641473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{
7651473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
7661473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (drawTexiOESWithCopybit(gglFixedToIntRound(x),
7671473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            gglFixedToIntRound(y), gglFixedToIntRound(z),
7681473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            gglFixedToIntRound(w), gglFixedToIntRound(h), c)) {
7691473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return;
7701473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
7711473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#else
7721473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    // quickly reject empty rects
7731473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if ((w|h) <= 0)
7741473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return;
7751473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#endif
7761473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    drawTexxOESImp(x, y, z, w, h, c);
7771473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}
7781473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void drawTexiOES(GLint x, GLint y, GLint z, GLint w, GLint h, ogles_context_t* c)
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // All coordinates are integer, so if we have only one
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // texture unit active and no scaling is required
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // THEN, we can use our special 1:1 mapping
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // which is a lot faster.
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_likely(c->rasterizer.state.enabled_tmu == 1)) {
7871473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
7881473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        if (drawTexiOESWithCopybit(x, y, z, w, h, c)) {
7891473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            return;
7901473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        }
7911473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#endif
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const int tmu = 0;
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        texture_unit_t& u(c->textures.tmu[tmu]);
7941473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        EGLTextureObject* textureObject = u.texture;
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const GLint Wcr = textureObject->crop_rect[2];
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const GLint Hcr = textureObject->crop_rect[3];
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((w == Wcr) && (h == -Hcr)) {
7991473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#ifndef LIBAGL_USE_GRALLOC_COPYBITS
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((w|h) <= 0) return; // quickly reject empty rects
8011473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#endif
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.dirty) {
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                c->rasterizer.procs.activeTexture(c, tmu);
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                c->rasterizer.procs.bindTexture(c, &(u.texture->surface));
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                c->rasterizer.procs.texParameteri(c, GGL_TEXTURE_2D,
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        GGL_TEXTURE_MIN_FILTER, u.texture->min_filter);
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                c->rasterizer.procs.texParameteri(c, GGL_TEXTURE_2D,
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        GGL_TEXTURE_MAG_FILTER, u.texture->mag_filter);
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->rasterizer.procs.texGeni(c, GGL_S,
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE);
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->rasterizer.procs.texGeni(c, GGL_T,
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE);
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.dirty = 0xFF; // XXX: should be more subtle
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->rasterizer.procs.activeTexture(c, c->textures.active);
8171473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const GGLSurface& cbSurface = c->rasterizer.state.buffers.color.s;
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            y = cbSurface.height - (y + h);
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const GLint Ucr = textureObject->crop_rect[0];
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const GLint Vcr = textureObject->crop_rect[1];
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const GLint s0  = Ucr - x;
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const GLint t0  = (Vcr + Hcr) - y;
8241473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const GLuint tw = textureObject->surface.width;
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const GLuint th = textureObject->surface.height;
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((uint32_t(s0+x+w) > tw) || (uint32_t(t0+y+h) > th)) {
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The GL spec is unclear about what should happen
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // in this case, so we just use the slow case, which
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // at least won't crash
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                goto slow_case;
8321473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            }
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
834dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian            ogles_lock_textures(c);
835dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->rasterizer.procs.texCoord2i(c, s0, t0);
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const uint32_t enables = c->rasterizer.state.enables;
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ggl_unlikely(enables & (GGL_ENABLE_DEPTH_TEST|GGL_ENABLE_FOG)))
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                set_depth_and_fog(c, z);
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->rasterizer.procs.color4xv(c, c->currentColorClamped.v);
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->rasterizer.procs.disable(c, GGL_W_LERP);
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->rasterizer.procs.disable(c, GGL_AA);
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->rasterizer.procs.shadeModel(c, GL_FLAT);
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->rasterizer.procs.recti(c, x, y, x+w, y+h);
846fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich
847dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian            ogles_unlock_textures(c);
848dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectslow_case:
8541473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    drawTexxOESImp(
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gglIntToFixed(x), gglIntToFixed(y), gglIntToFixed(z),
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gglIntToFixed(w), gglIntToFixed(h),
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c);
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android;
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark -
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark Texture API
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glActiveTexture(GLenum texture)
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (uint32_t(texture-GL_TEXTURE0) > uint32_t(GGL_TEXTURE_UNIT_COUNT)) {
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->textures.active = texture - GL_TEXTURE0;
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->rasterizer.procs.activeTexture(c, c->textures.active);
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glBindTexture(GLenum target, GLuint texture)
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (target != GL_TEXTURE_2D) {
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Bind or create a texture
8921473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    sp<EGLTextureObject> tex;
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (texture == 0) {
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // 0 is our local texture object
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tex = c->textures.defaultTexture;
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tex = c->surfaceManager->texture(texture);
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ggl_unlikely(tex == 0)) {
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            tex = c->surfaceManager->createTexture(texture);
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tex == 0) {
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ogles_error(c, GL_OUT_OF_MEMORY);
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bindTextureTmu(c, c->textures.active, texture, tex);
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glGenTextures(GLsizei n, GLuint *textures)
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (n<0) {
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // generate unique (shared) texture names
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->surfaceManager->getToken(n, textures);
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glDeleteTextures(GLsizei n, const GLuint *textures)
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (n<0) {
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // If deleting a bound texture, bind this unit to 0
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (int t=0 ; t<GGL_TEXTURE_UNIT_COUNT ; t++) {
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c->textures.tmu[t].name == 0)
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            continue;
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0 ; i<n ; i++) {
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (textures[i] && (textures[i] == c->textures.tmu[t].name)) {
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // bind this tmu to texture 0
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sp<EGLTextureObject> tex(c->textures.defaultTexture);
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bindTextureTmu(c, t, 0, tex);
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->surfaceManager->deleteTextures(n, textures);
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->surfaceManager->recycleTokens(n, textures);
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glMultiTexCoord4f(
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (uint32_t(target-GL_TEXTURE0) > uint32_t(GGL_TEXTURE_UNIT_COUNT)) {
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int tmu = target-GL_TEXTURE0;
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->current.texture[tmu].S = gglFloatToFixed(s);
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->current.texture[tmu].T = gglFloatToFixed(t);
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->current.texture[tmu].R = gglFloatToFixed(r);
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->current.texture[tmu].Q = gglFloatToFixed(q);
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glMultiTexCoord4x(
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (uint32_t(target-GL_TEXTURE0) > uint32_t(GGL_TEXTURE_UNIT_COUNT)) {
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int tmu = target-GL_TEXTURE0;
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->current.texture[tmu].S = s;
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->current.texture[tmu].T = t;
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->current.texture[tmu].R = r;
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->current.texture[tmu].Q = q;
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glPixelStorei(GLenum pname, GLint param)
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((pname != GL_PACK_ALIGNMENT) && (pname != GL_UNPACK_ALIGNMENT)) {
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
9801473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((param<=0 || param>8) || (param & (param-1))) {
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pname == GL_PACK_ALIGNMENT)
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->textures.packAlignment = param;
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pname == GL_UNPACK_ALIGNMENT)
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->textures.unpackAlignment = param;
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glTexEnvf(GLenum target, GLenum pname, GLfloat param)
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->rasterizer.procs.texEnvi(c, target, pname, GLint(param));
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glTexEnvfv(
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum target, GLenum pname, const GLfloat *params)
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pname == GL_TEXTURE_ENV_MODE) {
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->rasterizer.procs.texEnvi(c, target, pname, GLint(*params));
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pname == GL_TEXTURE_ENV_COLOR) {
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GGLfixed fixed[4];
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0 ; i<4 ; i++)
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fixed[i] = gglFloatToFixed(params[i]);
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->rasterizer.procs.texEnvxv(c, target, pname, fixed);
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_error(c, GL_INVALID_ENUM);
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glTexEnvx(GLenum target, GLenum pname, GLfixed param)
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->rasterizer.procs.texEnvi(c, target, pname, param);
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glTexEnvxv(
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum target, GLenum pname, const GLfixed *params)
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->rasterizer.procs.texEnvxv(c, target, pname, params);
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glTexParameteriv(
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum target, GLenum pname, const GLint* params)
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (target != GGL_TEXTURE_2D) {
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLTextureObject* textureObject = c->textures.tmu[c->textures.active].texture;
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (pname) {
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_TEXTURE_CROP_RECT_OES:
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        memcpy(textureObject->crop_rect, params, 4*sizeof(GLint));
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
1043aaf4b6b3315fc546396a4b82c8c5cab0c2d2cb85Mathias Agopian        texParameterx(target, pname, GLfixed(params[0]), c);
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glTexParameterf(
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum target, GLenum pname, GLfloat param)
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    texParameterx(target, pname, GLfixed(param), c);
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glTexParameterx(
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum target, GLenum pname, GLfixed param)
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    texParameterx(target, pname, param, c);
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1062aaf4b6b3315fc546396a4b82c8c5cab0c2d2cb85Mathias Agopianvoid glTexParameteri(
1063aaf4b6b3315fc546396a4b82c8c5cab0c2d2cb85Mathias Agopian        GLenum target, GLenum pname, GLint param)
1064aaf4b6b3315fc546396a4b82c8c5cab0c2d2cb85Mathias Agopian{
1065aaf4b6b3315fc546396a4b82c8c5cab0c2d2cb85Mathias Agopian    ogles_context_t* c = ogles_context_t::get();
1066aaf4b6b3315fc546396a4b82c8c5cab0c2d2cb85Mathias Agopian    texParameterx(target, pname, GLfixed(param), c);
1067aaf4b6b3315fc546396a4b82c8c5cab0c2d2cb85Mathias Agopian}
1068aaf4b6b3315fc546396a4b82c8c5cab0c2d2cb85Mathias Agopian
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark -
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glCompressedTexImage2D(
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum target, GLint level, GLenum internalformat,
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLsizei width, GLsizei height, GLint border,
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLsizei imageSize, const GLvoid *data)
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (target != GL_TEXTURE_2D) {
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((internalformat < GL_PALETTE4_RGB8_OES ||
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         internalformat > GL_PALETTE8_RGB5_A1_OES)) {
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (width<0 || height<0 || border!=0) {
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // "uncompress" the texture since pixelflinger doesn't support
10951473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    // any compressed texture format natively.
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLenum format;
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLenum type;
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (internalformat) {
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE8_RGB8_OES:
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE4_RGB8_OES:
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        format      = GL_RGB;
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type        = GL_UNSIGNED_BYTE;
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE8_RGBA8_OES:
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE4_RGBA8_OES:
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        format      = GL_RGBA;
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type        = GL_UNSIGNED_BYTE;
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE8_R5_G6_B5_OES:
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE4_R5_G6_B5_OES:
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        format      = GL_RGB;
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type        = GL_UNSIGNED_SHORT_5_6_5;
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE8_RGBA4_OES:
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE4_RGBA4_OES:
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        format      = GL_RGBA;
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type        = GL_UNSIGNED_SHORT_4_4_4_4;
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE8_RGB5_A1_OES:
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_PALETTE4_RGB5_A1_OES:
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        format      = GL_RGBA;
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type        = GL_UNSIGNED_SHORT_5_5_5_1;
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!data || !width || !height) {
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // unclear if this is an error or not...
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t size;
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface* surface;
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // all mipmap levels are specified at once.
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int numLevels = level<0 ? -level : 1;
1138fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich
1139fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    if (dataSizePalette4(numLevels, width, height, format) > imageSize) {
1140fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich        ogles_error(c, GL_INVALID_VALUE);
1141fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich        return;
1142fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich    }
1143fb5ea2e579057739120d5a8663857bdf623b9ba6Jack Palevich
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (int i=0 ; i<numLevels ; i++) {
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int lod_w = (width  >> i) ? : 1;
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int lod_h = (height >> i) ? : 1;
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int error = createTextureSurface(c, &surface, &size,
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i, format, type, lod_w, lod_h);
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (error) {
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ogles_error(c, error);
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        decodePalette4(data, i, width, height,
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                surface->data, surface->stride, internalformat);
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glTexImage2D(
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum target, GLint level, GLint internalformat,
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLsizei width, GLsizei height, GLint border,
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum format, GLenum type, const GLvoid *pixels)
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
11651473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (target != GL_TEXTURE_2D) {
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (width<0 || height<0 || border!=0 || level < 0) {
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11731473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (format != (GLenum)internalformat) {
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_OPERATION);
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (validFormatType(c, format, type)) {
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t size = 0;
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface* surface = 0;
11831473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    int error = createTextureSurface(c, &surface, &size,
11841473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            level, format, type, width, height);
11851473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (error) {
11861473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        ogles_error(c, error);
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pixels) {
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const int32_t formatIdx = convertGLPixelFormat(format, type);
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const GGLFormat& pixelFormat(c->rasterizer.formats[formatIdx]);
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const int32_t align = c->textures.unpackAlignment-1;
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const int32_t bpr = ((width * pixelFormat.size) + align) & ~align;
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const size_t size = bpr * height;
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const int32_t stride = bpr / pixelFormat.size;
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GGLSurface userSurface;
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        userSurface.version = sizeof(userSurface);
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        userSurface.width  = width;
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        userSurface.height = height;
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        userSurface.stride = stride;
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        userSurface.format = formatIdx;
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        userSurface.compressedFormat = 0;
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        userSurface.data = (GLubyte*)pixels;
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12071473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        int err = copyPixels(c, *surface, 0, 0, userSurface, 0, 0, width, height);
12081473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        if (err) {
12091473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            ogles_error(c, err);
12101473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            return;
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12121473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        generateMipmap(c, level);
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glCompressedTexSubImage2D(
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum target, GLint level, GLint xoffset,
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLint yoffset, GLsizei width, GLsizei height,
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum format, GLsizei imageSize,
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const GLvoid *data)
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_error(c, GL_INVALID_ENUM);
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glTexSubImage2D(
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum target, GLint level, GLint xoffset,
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLint yoffset, GLsizei width, GLsizei height,
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum format, GLenum type, const GLvoid *pixels)
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (target != GL_TEXTURE_2D) {
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (xoffset<0 || yoffset<0 || width<0 || height<0 || level<0) {
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (validFormatType(c, format, type)) {
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // find out which texture is bound to the current unit
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int active = c->textures.active;
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLTextureObject* tex = c->textures.tmu[active].texture;
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const GGLSurface& surface(tex->mip(level));
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!tex->internalformat || tex->direct) {
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_OPERATION);
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
125578811906c3a8a99a155543eda73f51914143277aMathias Agopian
125678811906c3a8a99a155543eda73f51914143277aMathias Agopian    if (format != tex->internalformat) {
125778811906c3a8a99a155543eda73f51914143277aMathias Agopian        ogles_error(c, GL_INVALID_OPERATION);
125878811906c3a8a99a155543eda73f51914143277aMathias Agopian        return;
125978811906c3a8a99a155543eda73f51914143277aMathias Agopian    }
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((xoffset + width  > GLsizei(surface.width)) ||
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (yoffset + height > GLsizei(surface.height))) {
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!width || !height) {
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return; // okay, but no-op.
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // figure out the size we need as well as the stride
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int32_t formatIdx = convertGLPixelFormat(format, type);
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (formatIdx == 0) { // we don't know what to do with this
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_OPERATION);
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const GGLFormat& pixelFormat(c->rasterizer.formats[formatIdx]);
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int32_t align = c->textures.unpackAlignment-1;
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int32_t bpr = ((width * pixelFormat.size) + align) & ~align;
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t size = bpr * height;
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int32_t stride = bpr / pixelFormat.size;
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface userSurface;
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    userSurface.version = sizeof(userSurface);
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    userSurface.width  = width;
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    userSurface.height = height;
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    userSurface.stride = stride;
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    userSurface.format = formatIdx;
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    userSurface.compressedFormat = 0;
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    userSurface.data = (GLubyte*)pixels;
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int err = copyPixels(c,
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            surface, xoffset, yoffset,
12921473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            userSurface, 0, 0, width, height);
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err) {
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, err);
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    generateMipmap(c, level);
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // since we only changed the content of the texture, we don't need
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // to call bindTexture on the main rasterizer.
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glCopyTexImage2D(
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum target, GLint level, GLenum internalformat,
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLint x, GLint y, GLsizei width, GLsizei height,
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLint border)
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (target != GL_TEXTURE_2D) {
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (internalformat<GL_ALPHA || internalformat>GL_LUMINANCE_ALPHA) {
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (width<0 || height<0 || border!=0 || level<0) {
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLenum format = 0;
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLenum type = GL_UNSIGNED_BYTE;
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const GGLSurface& cbSurface = c->rasterizer.state.buffers.color.s;
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int cbFormatIdx = cbSurface.format;
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (cbFormatIdx) {
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GGL_PIXEL_FORMAT_RGB_565:
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type = GL_UNSIGNED_SHORT_5_6_5;
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GGL_PIXEL_FORMAT_RGBA_5551:
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type = GL_UNSIGNED_SHORT_5_5_5_1;
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GGL_PIXEL_FORMAT_RGBA_4444:
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type = GL_UNSIGNED_SHORT_4_4_4_4;
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (internalformat) {
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_ALPHA:
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_LUMINANCE_ALPHA:
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_LUMINANCE:
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type = GL_UNSIGNED_BYTE;
13451473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        break;
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // figure out the format to use for the new texture
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (cbFormatIdx) {
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GGL_PIXEL_FORMAT_RGBA_8888:
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GGL_PIXEL_FORMAT_A_8:
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GGL_PIXEL_FORMAT_RGBA_5551:
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GGL_PIXEL_FORMAT_RGBA_4444:
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        format = internalformat;
13551473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        break;
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GGL_PIXEL_FORMAT_RGBX_8888:
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GGL_PIXEL_FORMAT_RGB_888:
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GGL_PIXEL_FORMAT_RGB_565:
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GGL_PIXEL_FORMAT_L_8:
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (internalformat) {
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GL_LUMINANCE:
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GL_RGB:
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            format = internalformat;
13641473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            break;
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (format == 0) {
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // invalid combination
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // create the new texture...
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t size;
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface* surface;
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int error = createTextureSurface(c, &surface, &size,
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            level, format, type, width, height);
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (error) {
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, error);
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13841473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // The bottom row is stored first in textures
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface txSurface(*surface);
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    txSurface.stride = -txSurface.stride;
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // (x,y) is the lower-left corner of colorBuffer
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    y = cbSurface.height - (y + height);
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int err = copyPixels(c,
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            txSurface, 0, 0,
13941473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            cbSurface, x, y, cbSurface.width, cbSurface.height);
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err) {
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, err);
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    generateMipmap(c, level);
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glCopyTexSubImage2D(
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum target, GLint level, GLint xoffset, GLint yoffset,
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLint x, GLint y, GLsizei width, GLsizei height)
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (target != GL_TEXTURE_2D) {
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (xoffset<0 || yoffset<0 || width<0 || height<0 || level<0) {
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!width || !height) {
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return; // okay, but no-op.
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // find out which texture is bound to the current unit
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int active = c->textures.active;
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLTextureObject* tex = c->textures.tmu[active].texture;
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const GGLSurface& surface(tex->mip(level));
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!tex->internalformat) {
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_OPERATION);
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((xoffset + width  > GLsizei(surface.width)) ||
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (yoffset + height > GLsizei(surface.height))) {
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // The bottom row is stored first in textures
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface txSurface(surface);
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    txSurface.stride = -txSurface.stride;
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // (x,y) is the lower-left corner of colorBuffer
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const GGLSurface& cbSurface = c->rasterizer.state.buffers.color.s;
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    y = cbSurface.height - (y + height);
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int err = copyPixels(c,
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            surface, xoffset, yoffset,
14441473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            cbSurface, x, y, width, height);
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err) {
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, err);
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    generateMipmap(c, level);
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glReadPixels(
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLint x, GLint y, GLsizei width, GLsizei height,
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLenum format, GLenum type, GLvoid *pixels)
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((format != GL_RGBA) && (format != GL_RGB)) {
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((type != GL_UNSIGNED_BYTE) && (type != GL_UNSIGNED_SHORT_5_6_5)) {
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (width<0 || height<0) {
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (x<0 || x<0) {
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t formatIdx = GGL_PIXEL_FORMAT_NONE;
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((format == GL_RGBA) && (type == GL_UNSIGNED_BYTE)) {
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        formatIdx = GGL_PIXEL_FORMAT_RGBA_8888;
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if ((format == GL_RGB) && (type == GL_UNSIGNED_SHORT_5_6_5)) {
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        formatIdx = GGL_PIXEL_FORMAT_RGB_565;
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_OPERATION);
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const GGLSurface& readSurface = c->rasterizer.state.buffers.read.s;
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((x+width > GLint(readSurface.width)) ||
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (y+height > GLint(readSurface.height))) {
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const GGLFormat& pixelFormat(c->rasterizer.formats[formatIdx]);
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int32_t align = c->textures.packAlignment-1;
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int32_t bpr = ((width * pixelFormat.size) + align) & ~align;
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int32_t stride = bpr / pixelFormat.size;
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface userSurface;
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    userSurface.version = sizeof(userSurface);
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    userSurface.width  = width;
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    userSurface.height = height;
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    userSurface.stride = -stride; // bottom row is transfered first
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    userSurface.format = formatIdx;
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    userSurface.compressedFormat = 0;
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    userSurface.data = (GLubyte*)pixels;
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // use pixel-flinger to handle all the conversions
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLContext* ggl = getRasterizer(c);
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!ggl) {
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the only reason this would fail is because we ran out of memory
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_OUT_OF_MEMORY);
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15141473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    ggl->colorBuffer(ggl, &userSurface);  // destination is user buffer
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ggl->bindTexture(ggl, &readSurface);  // source is read-buffer
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ggl->texCoord2i(ggl, x, readSurface.height - (y + height));
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ggl->recti(ggl, 0, 0, width, height);
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark -
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark DrawTexture Extension
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glDrawTexsvOES(const GLshort* coords) {
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    drawTexiOES(coords[0], coords[1], coords[2], coords[3], coords[4], c);
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glDrawTexivOES(const GLint* coords) {
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    drawTexiOES(coords[0], coords[1], coords[2], coords[3], coords[4], c);
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glDrawTexsOES(GLshort x , GLshort y, GLshort z, GLshort w, GLshort h) {
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    drawTexiOES(x, y, z, w, h, c);
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glDrawTexiOES(GLint x, GLint y, GLint z, GLint w, GLint h) {
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    drawTexiOES(x, y, z, w, h, c);
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glDrawTexfvOES(const GLfloat* coords) {
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    drawTexxOES(
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gglFloatToFixed(coords[0]),
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gglFloatToFixed(coords[1]),
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gglFloatToFixed(coords[2]),
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gglFloatToFixed(coords[3]),
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gglFloatToFixed(coords[4]),
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c);
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glDrawTexxvOES(const GLfixed* coords) {
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    drawTexxOES(coords[0], coords[1], coords[2], coords[3], coords[4], c);
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glDrawTexfOES(GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h){
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    drawTexxOES(
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gglFloatToFixed(x), gglFloatToFixed(y), gglFloatToFixed(z),
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gglFloatToFixed(w), gglFloatToFixed(h),
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c);
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glDrawTexxOES(GLfixed x, GLfixed y, GLfixed z, GLfixed w, GLfixed h) {
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    drawTexxOES(x, y, z, w, h, c);
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15681473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
15691473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian// ----------------------------------------------------------------------------
15701473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#if 0
15711473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#pragma mark -
15721473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#pragma mark EGL Image Extension
15731473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#endif
15741473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
15751473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianvoid glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
15761473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{
15771473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    ogles_context_t* c = ogles_context_t::get();
15781473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (target != GL_TEXTURE_2D) {
15791473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        ogles_error(c, GL_INVALID_ENUM);
15801473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return;
15811473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
15821473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
15831473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)image;
15841473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) {
15851473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        ogles_error(c, GL_INVALID_VALUE);
15861473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return;
15871473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
15881473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t)) {
15891473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        ogles_error(c, GL_INVALID_VALUE);
15901473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return;
15911473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
15921473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
15931473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    // bind it to the texture unit
15941473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    sp<EGLTextureObject> tex = getAndBindActiveTextureObject(c);
1595dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    tex->setImage(native_buffer);
15961473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
15971473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
1598350d651706d8f484d9aeb539d491526f822fa84aMathias Agopian    tex->try_copybit = false;
1599a2fb72e08f41a67bbed534eb1035ba5bfc2df0e1Mathias Agopian    if (c->copybits.blitEngine != NULL) {
1600350d651706d8f484d9aeb539d491526f822fa84aMathias Agopian        tex->try_copybit = true;
16011473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
16021473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS
16031473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}
16041473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
16051473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianvoid glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
16061473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{
16071473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}
1608