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