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