diff options
author | 2010-02-01 18:24:52 -0800 | |
---|---|---|
committer | 2010-02-02 20:19:54 -0800 | |
commit | 18b915a1026dfe9d273ee3fd2139b7feed22008c (patch) | |
tree | 456f1eb01eafbfe98c6f071b35c2442dac57c2cc /opengl/libagl/texture.cpp | |
parent | b787383ba5208f1d86f90a8cdb762502c1f8829f (diff) |
implement [2396050] Add ETC1 texture support to AGL
Diffstat (limited to 'opengl/libagl/texture.cpp')
-rw-r--r-- | opengl/libagl/texture.cpp | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/opengl/libagl/texture.cpp b/opengl/libagl/texture.cpp index fae89b9b4a..73b1db4e88 100644 --- a/opengl/libagl/texture.cpp +++ b/opengl/libagl/texture.cpp @@ -24,6 +24,7 @@ #include "TextureObjectManager.h" #include <private/ui/android_natives_priv.h> +#include <ETC1/etc1.h> #ifdef LIBAGL_USE_GRALLOC_COPYBITS #include "copybit.h" @@ -1081,11 +1082,6 @@ void glCompressedTexImage2D( ogles_error(c, GL_INVALID_ENUM); return; } - if ((internalformat < GL_PALETTE4_RGB8_OES || - internalformat > GL_PALETTE8_RGB5_A1_OES)) { - ogles_error(c, GL_INVALID_ENUM); - return; - } if (width<0 || height<0 || border!=0) { ogles_error(c, GL_INVALID_VALUE); return; @@ -1121,6 +1117,12 @@ void glCompressedTexImage2D( format = GL_RGBA; type = GL_UNSIGNED_SHORT_5_5_5_1; break; +#ifdef GL_OES_compressed_ETC1_RGB8_texture + case GL_ETC1_RGB8_OES: + format = GL_RGB; + type = GL_UNSIGNED_BYTE; + break; +#endif default: ogles_error(c, GL_INVALID_ENUM); return; @@ -1133,6 +1135,30 @@ void glCompressedTexImage2D( int32_t size; GGLSurface* surface; + +#ifdef GL_OES_compressed_ETC1_RGB8_texture + if (internalformat == GL_ETC1_RGB8_OES) { + GLsizei compressedSize = etc1_get_encoded_data_size(width, height); + if (compressedSize > imageSize) { + ogles_error(c, GL_INVALID_VALUE); + return; + } + int error = createTextureSurface(c, &surface, &size, + level, format, type, width, height); + if (error) { + ogles_error(c, error); + return; + } + if (etc1_decode_image( + (const etc1_byte*)data, + (etc1_byte*)surface->data, + width, height, 3, surface->stride) != 0) { + ogles_error(c, GL_INVALID_OPERATION); + } + return; + } +#endif + // all mipmap levels are specified at once. const int numLevels = level<0 ? -level : 1; |