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