diff options
author | Mathias Agopian <mathias@google.com> | 2010-02-01 18:24:52 -0800 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2010-02-02 20:19:54 -0800 |
commit | d1f73a2fcae6481edf07763ca06c4f381ebe13c2 (patch) | |
tree | 50b5c2cfeeffcd03b0e664a8977b355ef53b9035 /opengl/libagl | |
parent | 2d65817f17d0bfabac3849892c8a0f959b8dadc1 (diff) | |
download | frameworks_base-d1f73a2fcae6481edf07763ca06c4f381ebe13c2.zip frameworks_base-d1f73a2fcae6481edf07763ca06c4f381ebe13c2.tar.gz frameworks_base-d1f73a2fcae6481edf07763ca06c4f381ebe13c2.tar.bz2 |
implement [2396050] Add ETC1 texture support to AGL
Diffstat (limited to 'opengl/libagl')
-rw-r--r-- | opengl/libagl/Android.mk | 2 | ||||
-rw-r--r-- | opengl/libagl/state.cpp | 8 | ||||
-rw-r--r-- | opengl/libagl/texture.cpp | 36 |
3 files changed, 40 insertions, 6 deletions
diff --git a/opengl/libagl/Android.mk b/opengl/libagl/Android.mk index c2e9f31..6cb146c 100644 --- a/opengl/libagl/Android.mk +++ b/opengl/libagl/Android.mk @@ -29,7 +29,7 @@ LOCAL_CFLAGS += -DLOG_TAG=\"libagl\" LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES LOCAL_CFLAGS += -fvisibility=hidden -LOCAL_SHARED_LIBRARIES := libcutils libhardware libutils libpixelflinger +LOCAL_SHARED_LIBRARIES := libcutils libhardware libutils libpixelflinger libETC1 LOCAL_LDLIBS := -lpthread -ldl ifeq ($(TARGET_ARCH),arm) diff --git a/opengl/libagl/state.cpp b/opengl/libagl/state.cpp index 0f1f27d..1224a96 100644 --- a/opengl/libagl/state.cpp +++ b/opengl/libagl/state.cpp @@ -51,6 +51,9 @@ static char const * const gExtensionsString = // "GL_OES_point_size_array " // TODO // "GL_OES_point_sprite " // TODO "GL_OES_EGL_image " // OK +#ifdef GL_OES_compressed_ETC1_RGB8_texture + "GL_OES_compressed_ETC1_RGB8_texture " // OK +#endif "GL_ARB_texture_compression " // OK "GL_ARB_texture_non_power_of_two " // OK "GL_ANDROID_user_clip_plane " // OK @@ -386,6 +389,7 @@ const GLubyte* glGetString(GLenum string) void glGetIntegerv(GLenum pname, GLint *params) { + int i; ogles_context_t* c = ogles_context_t::get(); switch (pname) { case GL_ALIASED_POINT_SIZE_RANGE: @@ -431,6 +435,10 @@ void glGetIntegerv(GLenum pname, GLint *params) params[ 7] = GL_PALETTE8_R5_G6_B5_OES; params[ 8] = GL_PALETTE8_RGBA4_OES; params[ 9] = GL_PALETTE8_RGB5_A1_OES; + i = 10; +#ifdef GL_OES_compressed_ETC1_RGB8_texture + params[i++] = GL_ETC1_RGB8_OES; +#endif break; case GL_DEPTH_BITS: params[0] = c->rasterizer.state.buffers.depth.format ? 0 : 16; diff --git a/opengl/libagl/texture.cpp b/opengl/libagl/texture.cpp index fae89b9..73b1db4 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; |